From cc2a191d845cf7cbe657fa34456c57e7d6b3315b Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 6 Jun 2020 07:34:03 -0700 Subject: [PATCH 01/17] fixed a small typo in a comment --- docs/js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/js/main.js b/docs/js/main.js index 8658fb6..29d0f51 100644 --- a/docs/js/main.js +++ b/docs/js/main.js @@ -70,7 +70,7 @@ function readInLASFromASSETS(){ }); } -//// function for "Load into browser memeory" button +//// function for "Load into browser memory" button function readInFilesFunction(){ //// removes all status spans for uploads removeInnerHTML("upload-file-info"); From 4cd00e6c05f4744b529a867383e4b5da03676a1c Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 6 Jun 2020 08:40:53 -0700 Subject: [PATCH 02/17] trying to get wellio viz as package connected to panel. --- package-lock.json | 2 +- panel_test_app/00-01-11-082-23W4-0.LAS | 919 +++++++++++++++++++++++++ panel_test_app/app.py | 18 + 3 files changed, 938 insertions(+), 1 deletion(-) create mode 100644 panel_test_app/00-01-11-082-23W4-0.LAS create mode 100644 panel_test_app/app.py diff --git a/package-lock.json b/package-lock.json index a15c676..304d9b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wellioviz", - "version": "0.0.25", + "version": "0.0.28", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/panel_test_app/00-01-11-082-23W4-0.LAS b/panel_test_app/00-01-11-082-23W4-0.LAS new file mode 100644 index 0000000..fe958e1 --- /dev/null +++ b/panel_test_app/00-01-11-082-23W4-0.LAS @@ -0,0 +1,919 @@ +~VERSION INFORMATION + VERS. 2.0: CWLS LOG ASCII STANDARD -VERSION 2.0 + WRAP. NO: ONE LINE PER DEPTH STEP +~WELL INFORMATION BLOCK +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ------------------- ------------------------------- +# Generated from Intellog Unique Number CW_82_90/WELL/185 +WELL. 01-11-082-23W4 : Well_name - WELL +LOC . 00/01-11-082-23W4/0 : Location - LOCATION +UWI . 00/01-11-082-23W4/0 : Uwi - UNIQUE WELL ID +ENTR. JAYE : Entered - ENTERED BY +SRVC. SCHLUMBERGER : Scn - SERVICE COMPANY +DATE. 31 JAN. 86 : Date - LOG DATE +STRT.M 225 : top_depth - START DEPTH +STOP.M 442 : bot_depth - STOP DEPTH +STEP.M 0.25 : increment - STEP LENGTH + NULL. -999.2500:NULL Value +~CURVE INFORMATION BLOCK +#MNEM UNIT ERCB CURVE CODE CURVE DESCRIPTION +#----------- ------------------ ---------------------------------- +DEPT.M 00 001 00 00 : DEPTH - DEPTH +GR .API 00 310 00 00 : GR - GAMMA RAY +CALI.MM 00 280 01 00 : CAL - CALIPER +NPHI.V/V 00 330 00 00 : PHIN - NEUTRON POROSITY (SANDSTONE) +DPHI.V/V 00 890 00 00 : PHID - DENSITY POROSITY (SANDSTONE) +ILD .OHMM 00 120 00 00 : RESD - DEEP RESISTIVITY (DIL) +~PARAMETER INFORMATION +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ----------- ------------------------------ +GL .M 611.1 : gl - GROUND LEVEL ELEVATION +EREF.M 614.7 : kb - ELEVATION OF DEPTH REFERENCE +DATM.M 611.1 : datum - DATUM ELEVATION +TDD .M 443 : tdd - TOTAL DEPTH DRILLER +RUN . ONE : Run - RUN NUMBER +ENG . BRADSHAW : Engineer - RECORDING ENGINEER +WIT . KOSS : Witness - WITNESSED BY +BASE. SLAVE LAKE : Branch - HOME BASE OF LOGGING UNIT +MUD . GEL CHEM : Mud_type - MUD TYPE +MATR. SANDSTONE : Logunit - NEUTRON MATRIX +TMAX.C 22 : BHT - MAXIMUM RECORDED TEMPERATURE +BHTD.M 443 : BHTDEP - MAXIMUM RECORDED TEMPERATURE +RMT .C 22 : MDTP - TEMPERATURE OF MUD +MUDD.KG/M 0 : MWT - MUD DENSITY +NEUT. 1 : NEUTRON - NEUTRON TYPE +RESI. 0 : RESIST - RESISTIVITY TYPE +RM .OHMM 6.75 : RM - RESISTIVITY OF MUD +RMC .OHMM 5.483 : RMC - RESISTIVITY OF MUD CAKE +RMF .OHMM 6.16 : RMF - RESISTIVITY OF MUD FILTRATE +SUFT.C 4 : SUFT - SURFACE TEMPERATURE +~A DEPTH GR CAL PHIN PHID RESD + 225.000 76.341 272.906 0.000 0.305 3.269 + 225.250 78.050 274.819 0.497 0.301 3.124 + 225.500 83.001 279.018 0.563 0.318 2.986 + 225.750 80.224 280.416 0.570 0.326 2.881 + 226.000 80.567 276.520 0.596 0.314 2.897 + 226.250 81.220 277.600 0.611 0.310 2.935 + 226.500 80.873 279.208 0.614 0.296 3.018 + 226.750 80.774 279.249 0.605 0.294 3.104 + 227.000 80.989 280.136 0.582 0.296 3.121 + 227.250 80.897 281.532 0.560 0.301 3.167 + 227.500 80.797 281.782 0.569 0.305 3.173 + 227.750 80.821 281.219 0.584 0.307 3.178 + 228.000 80.225 279.487 0.580 0.297 3.220 + 228.250 82.878 277.244 0.555 0.279 3.268 + 228.500 85.141 276.666 0.541 0.271 3.323 + 228.750 87.851 275.680 0.530 0.273 3.380 + 229.000 86.070 276.983 0.528 0.266 3.456 + 229.250 86.788 276.713 0.546 0.270 3.508 + 229.500 85.068 274.880 0.563 0.278 3.534 + 229.750 83.287 272.961 0.578 0.287 3.580 + 230.000 82.192 271.973 0.569 0.296 3.647 + 230.250 85.588 268.791 0.546 0.300 3.716 + 230.500 92.220 265.096 0.527 0.269 3.764 + 230.750 92.996 253.099 0.530 0.233 3.864 + 231.000 92.401 249.514 0.537 0.231 3.944 + 231.250 93.052 248.931 0.528 0.244 4.095 + 231.500 92.581 248.347 0.509 0.256 4.251 + 231.750 86.375 247.575 0.508 0.255 4.496 + 232.000 76.745 248.341 0.496 0.255 5.042 + 232.250 67.736 248.911 0.478 0.246 6.060 + 232.500 64.461 248.430 0.473 0.247 7.325 + 232.750 56.387 247.760 0.476 0.259 9.582 + 233.000 47.566 246.659 0.469 0.283 12.747 + 233.250 44.852 245.870 0.441 0.317 15.938 + 233.500 46.314 244.471 0.458 0.334 20.536 + 233.750 45.283 244.307 0.472 0.339 27.838 + 234.000 41.633 243.839 0.461 0.337 33.968 + 234.250 41.036 243.465 0.430 0.331 35.730 + 234.500 44.742 244.027 0.441 0.329 36.470 + 234.750 47.760 244.382 0.449 0.329 36.947 + 235.000 46.667 244.225 0.444 0.335 38.790 + 235.250 46.571 243.544 0.494 0.337 41.033 + 235.500 48.093 243.480 0.500 0.327 44.478 + 235.750 47.873 243.534 0.477 0.329 45.145 + 236.000 48.523 244.098 0.483 0.337 44.969 + 236.250 50.482 244.866 0.508 0.347 43.548 + 236.500 50.635 245.743 0.560 0.351 40.694 + 236.750 49.544 246.835 0.497 0.366 39.705 + 237.000 48.385 247.709 0.475 0.381 39.623 + 237.250 46.293 247.753 0.484 0.372 41.757 + 237.500 51.431 247.180 0.466 0.370 46.209 + 237.750 46.974 246.703 0.457 0.360 52.796 + 238.000 42.452 246.026 0.476 0.350 60.434 + 238.250 42.479 244.409 0.511 0.343 66.500 + 238.500 49.050 243.003 0.515 0.352 69.036 + 238.750 45.839 243.777 0.515 0.335 69.415 + 239.000 43.376 244.335 0.518 0.325 68.881 + 239.250 44.896 244.916 0.504 0.344 67.590 + 239.500 50.345 244.853 0.470 0.359 66.823 + 239.750 49.873 245.310 0.445 0.363 66.062 + 240.000 48.720 245.775 0.429 0.360 64.094 + 240.250 46.378 245.932 0.442 0.361 65.057 + 240.500 41.547 245.966 0.478 0.363 70.123 + 240.750 41.200 245.703 0.500 0.350 76.296 + 241.000 45.651 245.544 0.499 0.330 80.558 + 241.250 46.052 246.010 0.488 0.317 82.226 + 241.500 46.518 246.055 0.487 0.324 85.523 + 241.750 48.663 246.307 0.459 0.346 89.116 + 242.000 51.496 247.072 0.452 0.356 87.774 + 242.250 49.404 248.274 0.462 0.363 85.803 + 242.500 47.251 248.726 0.480 0.365 89.409 + 242.750 46.468 248.563 0.476 0.364 96.554 + 243.000 44.505 247.687 0.466 0.362 100.991 + 243.250 43.783 246.993 0.470 0.365 102.891 + 243.500 44.686 246.522 0.490 0.367 105.418 + 243.750 45.270 246.467 0.514 0.362 107.804 + 244.000 45.863 246.308 0.529 0.351 111.074 + 244.250 47.760 246.347 0.524 0.350 111.478 + 244.500 47.972 247.538 0.507 0.352 109.385 + 244.750 49.370 249.982 0.490 0.354 106.128 + 245.000 47.032 251.477 0.473 0.355 100.863 + 245.250 45.126 252.867 0.472 0.357 93.896 + 245.500 46.961 250.941 0.471 0.355 87.577 + 245.750 50.107 248.711 0.461 0.353 79.862 + 246.000 49.883 249.067 0.466 0.353 72.826 + 246.250 43.056 249.067 0.501 0.344 67.289 + 246.500 41.277 251.055 0.509 0.332 64.796 + 246.750 44.669 251.383 0.520 0.336 64.665 + 247.000 43.888 252.781 0.535 0.349 65.142 + 247.250 42.917 254.484 0.545 0.361 65.377 + 247.500 39.831 256.617 0.523 0.365 66.355 + 247.750 38.050 257.697 0.493 0.359 67.731 + 248.000 40.757 259.622 0.476 0.358 70.445 + 248.250 40.037 261.440 0.482 0.361 74.940 + 248.500 39.195 262.413 0.498 0.370 80.928 + 248.750 39.097 262.139 0.501 0.372 85.127 + 249.000 38.128 262.602 0.481 0.371 89.206 + 249.250 38.096 263.824 0.471 0.363 91.396 + 249.500 40.053 263.837 0.488 0.361 91.554 + 249.750 40.079 263.368 0.487 0.363 89.329 + 250.000 38.989 263.306 0.466 0.360 85.056 + 250.250 40.637 262.520 0.443 0.353 81.141 + 250.500 40.537 262.357 0.463 0.341 76.972 + 250.750 39.443 260.019 0.473 0.328 71.790 + 251.000 38.910 258.610 0.470 0.325 67.972 + 251.250 39.876 257.307 0.468 0.340 66.697 + 251.500 42.643 257.770 0.492 0.357 68.851 + 251.750 44.415 258.232 0.494 0.367 80.912 + 252.000 43.447 257.961 0.479 0.355 90.214 + 252.250 45.968 256.457 0.465 0.346 78.344 + 252.500 43.625 255.358 0.458 0.343 47.342 + 252.750 49.949 253.121 0.470 0.344 28.662 + 253.000 48.978 250.881 0.479 0.343 21.297 + 253.250 42.650 250.200 0.429 0.338 16.094 + 253.500 37.069 251.910 0.311 0.318 14.403 + 253.750 33.108 253.410 0.318 0.249 13.060 + 254.000 41.052 252.723 0.429 0.250 11.754 + 254.250 55.101 249.342 0.489 0.261 9.576 + 254.500 67.528 249.806 0.476 0.283 7.360 + 254.750 77.154 254.941 0.437 0.289 6.075 + 255.000 76.059 253.848 0.447 0.280 5.286 + 255.250 76.586 251.294 0.443 0.273 5.080 + 255.500 73.934 253.312 0.423 0.273 5.264 + 255.750 71.845 250.980 0.416 0.280 5.760 + 256.000 68.382 247.901 0.450 0.287 6.422 + 256.250 63.611 244.628 0.476 0.290 7.647 + 256.500 59.963 243.539 0.508 0.305 9.965 + 256.750 56.750 242.954 0.513 0.351 12.023 + 257.000 53.848 242.896 0.485 0.360 13.107 + 257.250 55.685 243.364 0.427 0.336 13.917 + 257.500 55.648 243.609 0.411 0.330 15.781 + 257.750 53.746 244.075 0.424 0.335 17.962 + 258.000 53.958 244.328 0.446 0.334 19.803 + 258.250 52.306 243.755 0.446 0.342 20.636 + 258.500 51.148 243.695 0.473 0.348 21.381 + 258.750 51.487 243.951 0.489 0.344 21.702 + 259.000 53.387 244.198 0.495 0.345 21.215 + 259.250 53.475 243.830 0.488 0.347 20.506 + 259.500 52.443 242.116 0.484 0.351 19.971 + 259.750 52.159 240.809 0.495 0.352 19.123 + 260.000 52.999 239.927 0.476 0.351 18.589 + 260.250 55.081 239.757 0.461 0.350 17.699 + 260.500 55.361 238.349 0.457 0.350 17.076 + 260.750 54.203 241.614 0.465 0.347 16.290 + 261.000 53.546 243.531 0.461 0.342 15.511 + 261.250 50.270 245.136 0.441 0.341 14.797 + 261.500 49.114 246.115 0.438 0.344 14.410 + 261.750 52.322 246.175 0.459 0.351 14.462 + 262.000 52.471 246.008 0.477 0.355 14.569 + 262.250 54.005 245.321 0.464 0.352 14.135 + 262.500 54.647 245.799 0.452 0.346 13.159 + 262.750 53.117 246.257 0.455 0.335 12.624 + 263.000 52.708 246.194 0.448 0.323 12.294 + 263.250 54.667 245.923 0.448 0.319 12.178 + 263.500 55.070 245.659 0.452 0.336 12.062 + 263.750 55.222 246.017 0.462 0.351 12.197 + 264.000 54.939 246.494 0.478 0.359 12.520 + 264.250 54.092 246.638 0.487 0.362 13.046 + 264.500 53.560 246.777 0.480 0.366 13.217 + 264.750 55.338 247.347 0.465 0.358 13.567 + 265.000 57.854 248.137 0.468 0.353 13.979 + 265.250 60.562 248.071 0.481 0.359 14.376 + 265.500 60.654 247.690 0.464 0.360 14.482 + 265.750 57.001 247.114 0.448 0.355 14.183 + 266.000 56.281 247.053 0.463 0.357 14.128 + 266.250 54.127 247.514 0.478 0.360 14.020 + 266.500 54.094 247.774 0.488 0.362 14.230 + 266.750 51.130 248.344 0.437 0.358 14.470 + 267.000 43.368 248.596 0.243 0.281 15.744 + 267.250 36.917 249.157 0.181 0.082 19.283 + 267.500 36.071 249.314 0.182 0.032 27.760 + 267.750 38.965 248.729 0.188 0.043 37.068 + 268.000 40.674 247.638 0.202 0.059 38.123 + 268.250 40.390 247.589 0.204 0.068 37.196 + 268.500 40.854 247.727 0.212 0.074 35.618 + 268.750 43.128 248.607 0.241 0.086 32.663 + 269.000 44.089 248.855 0.336 0.172 28.365 + 269.250 44.927 247.033 0.412 0.294 25.006 + 269.500 45.142 244.283 0.451 0.344 20.681 + 269.750 46.540 243.493 0.479 0.347 18.095 + 270.000 49.248 243.435 0.450 0.343 17.230 + 270.250 47.343 243.173 0.423 0.346 17.066 + 270.500 42.201 243.426 0.422 0.351 17.062 + 270.750 39.734 243.788 0.442 0.355 17.028 + 271.000 40.077 244.242 0.448 0.359 17.154 + 271.250 42.034 246.055 0.454 0.360 17.346 + 271.500 43.431 246.106 0.468 0.362 17.441 + 271.750 42.649 245.955 0.473 0.363 17.735 + 272.000 40.810 245.985 0.468 0.364 17.666 + 272.250 40.464 246.446 0.460 0.359 17.663 + 272.500 42.798 246.505 0.450 0.358 17.660 + 272.750 43.013 246.435 0.460 0.361 17.624 + 273.000 43.349 246.486 0.466 0.363 17.622 + 273.250 46.061 246.629 0.460 0.361 17.752 + 273.500 48.020 246.577 0.460 0.358 17.681 + 273.750 48.918 246.415 0.464 0.359 17.350 + 274.000 47.325 246.768 0.462 0.359 16.993 + 274.250 46.169 247.236 0.479 0.359 16.831 + 274.500 46.883 247.598 0.477 0.361 16.797 + 274.750 49.218 247.739 0.482 0.356 16.668 + 275.000 50.302 247.687 0.486 0.351 16.823 + 275.250 48.837 247.415 0.465 0.352 17.497 + 275.500 49.238 246.529 0.474 0.352 18.301 + 275.750 48.330 246.579 0.458 0.354 18.856 + 276.000 46.363 247.145 0.446 0.365 19.067 + 276.250 44.585 247.607 0.470 0.369 19.245 + 276.500 45.116 247.962 0.464 0.370 19.278 + 276.750 47.941 249.053 0.471 0.373 19.347 + 277.000 49.091 249.825 0.462 0.375 19.344 + 277.250 46.191 250.177 0.452 0.376 19.341 + 277.500 45.844 250.221 0.437 0.376 19.410 + 277.750 44.065 250.163 0.431 0.372 19.591 + 278.000 42.846 249.808 0.440 0.365 19.698 + 278.250 41.939 249.027 0.466 0.336 20.069 + 278.500 39.786 248.754 0.480 0.328 20.523 + 278.750 39.380 248.377 0.484 0.357 20.870 + 279.000 40.905 247.387 0.463 0.375 21.143 + 279.250 42.364 246.291 0.444 0.369 21.379 + 279.500 42.327 244.891 0.445 0.367 21.375 + 279.750 41.797 242.123 0.459 0.365 21.332 + 280.000 40.453 239.780 0.458 0.366 21.409 + 280.250 39.735 245.538 0.468 0.368 21.486 + 280.500 41.316 249.328 0.478 0.372 21.522 + 280.750 43.403 249.892 0.480 0.371 21.520 + 281.000 43.119 247.548 0.479 0.375 21.637 + 281.250 42.525 244.904 0.467 0.367 21.634 + 281.500 44.731 243.177 0.450 0.357 21.630 + 281.750 46.255 241.142 0.452 0.352 21.628 + 282.000 48.030 239.846 0.444 0.351 21.583 + 282.250 49.052 240.510 0.434 0.352 21.579 + 282.500 47.086 241.491 0.428 0.360 21.496 + 282.750 44.001 243.409 0.463 0.370 21.492 + 283.000 41.594 245.114 0.506 0.375 21.570 + 283.250 40.066 244.337 0.483 0.370 21.566 + 283.500 39.656 242.925 0.460 0.359 21.482 + 283.750 40.931 242.661 0.417 0.359 21.318 + 284.000 41.085 243.126 0.417 0.371 21.194 + 284.250 40.924 244.204 0.422 0.374 21.310 + 284.500 40.828 244.773 0.445 0.371 21.267 + 284.750 38.676 244.721 0.439 0.370 21.303 + 285.000 38.204 245.068 0.432 0.379 21.140 + 285.250 39.602 244.802 0.462 0.382 21.058 + 285.500 41.062 244.856 0.467 0.383 20.976 + 285.750 43.022 244.898 0.457 0.381 20.737 + 286.000 43.672 244.952 0.445 0.379 20.502 + 286.250 41.085 244.372 0.444 0.370 20.154 + 286.500 38.929 243.479 0.481 0.357 20.380 + 286.750 40.706 243.003 0.501 0.348 20.530 + 287.000 41.789 241.805 0.458 0.345 20.488 + 287.250 40.136 239.982 0.437 0.378 20.447 + 287.500 40.100 238.159 0.465 0.379 20.252 + 287.750 40.440 236.336 0.482 0.381 20.059 + 288.000 41.406 235.340 0.484 0.379 19.944 + 288.250 41.244 237.161 0.494 0.380 19.680 + 288.500 43.763 240.212 0.500 0.383 19.530 + 288.750 44.414 243.687 0.487 0.378 19.271 + 289.000 40.703 245.914 0.437 0.371 18.981 + 289.250 41.855 247.522 0.422 0.365 18.836 + 289.500 44.061 250.994 0.436 0.374 18.692 + 289.750 40.167 256.958 0.462 0.388 18.584 + 290.000 37.761 275.805 0.483 0.395 18.372 + 290.250 37.293 291.324 0.520 0.396 18.130 + 290.500 38.380 301.759 0.533 0.392 17.589 + 290.750 40.899 311.778 0.504 0.387 17.227 + 291.000 41.610 313.898 0.521 0.384 16.872 + 291.250 39.648 317.062 0.549 0.385 16.649 + 291.500 39.734 318.561 0.533 0.389 16.460 + 291.750 43.627 309.364 0.488 0.399 16.426 + 292.000 47.269 296.224 0.467 0.400 16.641 + 292.250 47.733 284.012 0.480 0.400 16.795 + 292.500 46.390 248.432 0.496 0.421 16.793 + 292.750 45.733 236.636 0.494 0.402 16.539 + 293.000 48.004 235.336 0.487 0.386 16.382 + 293.250 49.714 236.417 0.510 0.383 16.075 + 293.500 49.369 236.465 0.528 0.386 15.714 + 293.750 46.840 236.306 0.515 0.385 15.332 + 294.000 46.558 239.880 0.507 0.380 15.101 + 294.250 47.275 244.600 0.495 0.374 14.929 + 294.500 49.728 245.581 0.486 0.355 14.485 + 294.750 48.448 246.156 0.456 0.330 13.975 + 295.000 47.480 246.607 0.436 0.365 13.406 + 295.250 46.944 247.382 0.425 0.381 13.430 + 295.500 47.724 247.956 0.433 0.381 13.759 + 295.750 46.128 247.994 0.463 0.380 14.098 + 296.000 47.403 247.529 0.474 0.378 14.362 + 296.250 47.309 247.361 0.469 0.372 14.360 + 296.500 46.834 246.893 0.466 0.363 13.880 + 296.750 49.604 247.458 0.463 0.351 13.167 + 297.000 53.746 247.395 0.460 0.350 12.514 + 297.250 59.194 247.337 0.453 0.347 11.628 + 297.500 59.471 247.071 0.458 0.346 10.805 + 297.750 59.002 246.705 0.454 0.349 9.964 + 298.000 60.277 245.721 0.470 0.348 9.190 + 298.250 61.548 244.722 0.478 0.345 8.443 + 298.500 62.388 243.206 0.474 0.342 7.714 + 298.750 62.230 241.279 0.526 0.331 7.359 + 299.000 61.134 239.872 0.525 0.317 7.399 + 299.250 61.164 241.791 0.492 0.318 7.871 + 299.500 62.123 242.775 0.513 0.329 8.942 + 299.750 62.155 241.780 0.522 0.338 10.198 + 300.000 58.379 242.964 0.445 0.316 11.477 + 300.250 49.058 244.988 0.268 0.269 12.117 + 300.500 46.159 246.172 0.260 0.107 11.980 + 300.750 57.775 247.680 0.417 0.194 10.945 + 301.000 70.516 248.343 0.459 0.247 9.888 + 301.250 70.545 248.918 0.494 0.276 8.025 + 301.500 68.827 249.270 0.515 0.275 7.223 + 301.750 69.233 249.936 0.515 0.273 6.890 + 302.000 72.311 250.295 0.501 0.267 6.954 + 302.250 74.772 250.865 0.490 0.266 7.032 + 302.500 76.045 251.755 0.497 0.266 6.797 + 302.750 79.065 251.579 0.479 0.265 6.423 + 303.000 81.333 250.481 0.488 0.271 6.532 + 303.250 71.452 248.144 0.515 0.291 7.120 + 303.500 59.888 246.219 0.530 0.313 8.478 + 303.750 49.883 244.491 0.493 0.334 9.926 + 304.000 45.050 242.157 0.483 0.349 11.753 + 304.250 47.076 241.779 0.488 0.350 13.428 + 304.500 50.716 241.939 0.500 0.344 14.285 + 304.750 48.188 241.156 0.498 0.338 14.941 + 305.000 49.399 240.264 0.467 0.332 15.366 + 305.250 49.865 238.753 0.461 0.330 15.625 + 305.500 48.832 237.444 0.496 0.339 15.447 + 305.750 48.048 235.409 0.527 0.348 15.129 + 306.000 47.708 233.066 0.501 0.349 15.127 + 306.250 49.725 232.388 0.477 0.341 15.382 + 306.500 50.191 235.030 0.466 0.339 16.487 + 306.750 47.973 238.715 0.449 0.347 18.244 + 307.000 45.321 242.400 0.435 0.345 20.265 + 307.250 43.918 245.140 0.437 0.337 22.133 + 307.500 46.065 245.502 0.467 0.342 23.064 + 307.750 46.840 242.222 0.485 0.354 23.409 + 308.000 46.368 241.960 0.499 0.363 22.164 + 308.250 45.836 242.623 0.516 0.365 19.212 + 308.500 45.923 245.059 0.524 0.358 16.936 + 308.750 47.510 246.560 0.531 0.347 15.561 + 309.000 51.278 246.503 0.500 0.332 14.514 + 309.250 53.423 246.250 0.486 0.315 13.923 + 309.500 50.835 246.703 0.436 0.285 13.817 + 309.750 47.435 247.367 0.242 0.245 14.452 + 310.000 43.164 248.659 0.192 0.088 15.088 + 310.250 40.636 249.432 0.194 -0.009 15.871 + 310.500 40.849 247.511 0.256 -0.042 16.260 + 310.750 47.109 244.853 0.315 0.154 16.350 + 311.000 53.806 240.745 0.455 0.236 16.286 + 311.250 53.709 238.510 0.451 0.310 15.683 + 311.500 53.300 236.789 0.451 0.333 14.491 + 311.750 58.687 235.694 0.462 0.339 13.668 + 312.000 59.773 235.849 0.487 0.345 13.261 + 312.250 56.811 236.102 0.500 0.339 13.159 + 312.500 55.468 236.769 0.508 0.337 13.133 + 312.750 54.437 238.576 0.488 0.344 13.057 + 313.000 56.021 241.743 0.475 0.344 13.031 + 313.250 57.607 245.526 0.463 0.343 13.029 + 313.500 57.386 246.204 0.470 0.344 13.002 + 313.750 55.857 245.739 0.498 0.345 13.000 + 314.000 54.575 245.457 0.505 0.343 13.071 + 314.250 54.853 244.261 0.467 0.340 13.020 + 314.500 55.006 242.223 0.476 0.341 13.166 + 314.750 57.588 240.931 0.494 0.344 13.413 + 315.000 57.865 240.868 0.485 0.344 13.361 + 315.250 57.144 240.612 0.472 0.339 12.963 + 315.500 58.108 240.546 0.460 0.339 12.767 + 315.750 56.578 240.591 0.463 0.340 12.789 + 316.000 57.727 240.224 0.491 0.341 12.812 + 316.250 57.567 239.015 0.491 0.335 12.930 + 316.500 56.410 240.204 0.474 0.332 12.953 + 316.750 55.316 238.696 0.473 0.336 12.951 + 317.000 55.159 238.848 0.489 0.336 12.827 + 317.250 58.113 239.825 0.480 0.342 12.801 + 317.500 61.695 239.976 0.487 0.351 12.727 + 317.750 62.158 238.884 0.501 0.348 12.630 + 318.000 60.254 238.721 0.521 0.347 12.534 + 318.250 60.843 238.662 0.529 0.343 12.344 + 318.500 61.059 238.705 0.498 0.340 12.181 + 318.750 60.713 238.342 0.480 0.340 11.997 + 319.000 62.609 237.455 0.468 0.341 11.772 + 319.250 63.633 236.675 0.470 0.349 11.683 + 319.500 63.288 236.297 0.481 0.354 11.528 + 319.750 65.122 235.510 0.475 0.355 11.312 + 320.000 65.712 235.037 0.465 0.360 11.141 + 320.250 62.810 234.879 0.471 0.351 10.912 + 320.500 60.532 231.807 0.500 0.343 10.707 + 320.750 62.493 233.308 0.517 0.339 10.545 + 321.000 61.895 237.716 0.531 0.343 10.425 + 321.250 59.245 238.080 0.511 0.353 10.326 + 321.500 56.966 238.544 0.510 0.354 10.286 + 321.750 57.930 238.482 0.506 0.353 10.439 + 322.000 59.265 237.694 0.496 0.353 10.478 + 322.250 58.795 237.220 0.492 0.355 10.694 + 322.500 59.882 235.506 0.502 0.356 10.875 + 322.750 60.283 234.721 0.508 0.355 10.792 + 323.000 64.548 234.877 0.515 0.354 10.142 + 323.250 72.615 235.965 0.531 0.349 9.283 + 323.500 80.058 237.771 0.509 0.308 8.292 + 323.750 79.403 240.302 0.486 0.283 6.961 + 324.000 79.366 245.957 0.476 0.273 6.742 + 324.250 79.456 251.308 0.485 0.276 6.615 + 324.500 81.729 254.370 0.498 0.276 6.727 + 324.750 80.449 255.444 0.481 0.272 6.892 + 325.000 80.479 255.077 0.483 0.261 7.035 + 325.250 80.253 254.294 0.508 0.261 6.994 + 325.500 80.343 253.612 0.522 0.259 6.773 + 325.750 79.252 252.720 0.523 0.252 6.329 + 326.000 72.547 250.178 0.532 0.243 5.948 + 326.250 68.400 247.415 0.528 0.239 5.516 + 326.500 70.608 242.166 0.499 0.240 4.799 + 326.750 80.793 238.053 0.498 0.251 4.014 + 327.000 87.117 236.964 0.499 0.262 3.633 + 327.250 76.985 238.773 0.502 0.266 3.694 + 327.500 73.836 241.104 0.486 0.250 3.990 + 327.750 68.566 243.436 0.467 0.226 4.432 + 328.000 69.966 245.252 0.478 0.196 5.025 + 328.250 72.486 246.849 0.505 0.201 6.075 + 328.500 68.900 248.351 0.505 0.269 7.274 + 328.750 64.130 248.917 0.508 0.295 8.694 + 329.000 58.985 248.449 0.494 0.303 10.314 + 329.250 56.645 247.035 0.465 0.292 11.392 + 329.500 60.536 245.939 0.454 0.281 12.005 + 329.750 71.530 245.464 0.462 0.257 12.026 + 330.000 76.919 245.513 0.468 0.237 11.196 + 330.250 78.754 244.942 0.457 0.220 9.053 + 330.500 78.844 244.257 0.454 0.218 8.571 + 330.750 76.627 244.196 0.459 0.265 8.634 + 331.000 74.411 243.832 0.464 0.266 8.846 + 331.250 74.876 243.459 0.472 0.264 9.149 + 331.500 73.407 242.988 0.475 0.268 9.321 + 331.750 73.684 242.616 0.479 0.268 9.320 + 332.000 76.082 242.763 0.489 0.261 9.179 + 332.250 78.477 243.852 0.496 0.251 9.092 + 332.500 79.564 244.624 0.482 0.250 8.904 + 332.750 77.846 243.948 0.467 0.249 8.754 + 333.000 78.435 242.537 0.462 0.245 8.573 + 333.250 81.516 241.853 0.464 0.243 8.428 + 333.500 82.791 242.214 0.472 0.244 8.364 + 333.750 81.509 242.474 0.475 0.252 8.394 + 334.000 79.418 242.519 0.470 0.255 8.520 + 334.250 78.075 242.356 0.477 0.255 8.566 + 334.500 80.224 243.123 0.483 0.257 8.728 + 334.750 79.876 246.294 0.479 0.258 8.825 + 335.000 78.097 248.412 0.469 0.258 8.974 + 335.250 75.445 250.331 0.462 0.253 9.177 + 335.500 73.727 249.956 0.454 0.246 9.350 + 335.750 73.007 247.510 0.439 0.245 9.454 + 336.000 73.035 244.961 0.424 0.255 9.417 + 336.250 77.738 244.383 0.444 0.263 9.276 + 336.500 78.138 245.474 0.457 0.260 9.016 + 336.750 73.741 247.488 0.448 0.254 8.797 + 337.000 67.164 249.199 0.440 0.254 8.730 + 337.250 59.902 247.893 0.433 0.307 8.712 + 337.500 57.810 245.240 0.459 0.306 8.793 + 337.750 59.270 243.840 0.484 0.270 9.128 + 338.000 58.802 243.361 0.474 0.258 9.584 + 338.250 60.324 242.677 0.459 0.273 9.949 + 338.500 62.221 242.002 0.444 0.288 10.387 + 338.750 61.252 241.005 0.448 0.257 10.602 + 339.000 59.723 239.701 0.464 0.247 10.944 + 339.250 58.751 237.980 0.476 0.282 11.088 + 339.500 58.783 238.443 0.466 0.302 11.211 + 339.750 59.243 241.507 0.458 0.293 11.316 + 340.000 60.269 241.340 0.473 0.285 10.999 + 340.250 62.789 239.106 0.472 0.283 10.473 + 340.500 66.122 238.843 0.462 0.273 10.219 + 340.750 62.908 239.617 0.448 0.268 10.198 + 341.000 59.569 240.486 0.438 0.298 10.177 + 341.250 61.157 241.468 0.454 0.304 10.214 + 341.500 63.303 241.824 0.471 0.275 10.328 + 341.750 64.767 242.914 0.432 0.238 10.522 + 342.000 64.356 243.788 0.430 0.202 10.761 + 342.250 63.949 243.624 0.443 0.198 10.963 + 342.500 65.157 243.155 0.439 0.213 10.737 + 342.750 72.228 242.999 0.453 0.230 10.185 + 343.000 76.992 242.523 0.497 0.270 9.047 + 343.250 73.779 242.368 0.520 0.278 8.234 + 343.500 69.445 242.409 0.446 0.263 7.752 + 343.750 68.475 242.658 0.377 0.178 7.607 + 344.000 70.310 242.503 0.352 0.121 7.677 + 344.250 74.762 241.821 0.369 0.205 8.625 + 344.500 76.537 240.103 0.474 0.250 9.490 + 344.750 73.574 238.592 0.474 0.270 10.172 + 345.000 72.664 238.015 0.459 0.259 10.018 + 345.250 73.129 237.540 0.459 0.237 8.882 + 345.500 73.094 237.797 0.520 0.248 7.904 + 345.750 70.193 237.944 0.528 0.316 7.442 + 346.000 68.662 238.196 0.505 0.329 7.247 + 346.250 68.316 239.069 0.489 0.332 7.638 + 346.500 67.098 240.571 0.501 0.326 8.612 + 346.750 69.556 242.798 0.519 0.319 9.693 + 347.000 70.333 245.128 0.500 0.315 10.526 + 347.250 70.859 247.359 0.485 0.312 11.093 + 347.500 71.448 248.234 0.484 0.307 10.703 + 347.750 68.361 248.176 0.486 0.294 7.804 + 348.000 65.582 247.496 0.489 0.257 7.170 + 348.250 61.995 247.442 0.491 0.227 6.892 + 348.500 63.397 248.007 0.480 0.245 6.762 + 348.750 66.226 248.155 0.476 0.265 6.673 + 349.000 67.003 248.413 0.487 0.268 6.622 + 349.250 68.338 248.978 0.510 0.260 6.621 + 349.500 70.797 249.126 0.505 0.261 6.632 + 349.750 73.379 249.065 0.476 0.267 6.669 + 350.000 75.091 248.807 0.486 0.270 6.794 + 350.250 74.618 248.430 0.482 0.269 6.844 + 350.500 74.897 248.687 0.467 0.265 6.843 + 350.750 74.985 248.942 0.485 0.260 6.842 + 351.000 74.826 248.880 0.523 0.244 6.880 + 351.250 76.101 248.831 0.517 0.233 6.943 + 351.500 78.125 248.878 0.485 0.228 7.021 + 351.750 76.969 249.022 0.469 0.215 7.113 + 352.000 75.311 249.696 0.470 0.195 7.112 + 352.250 77.334 250.150 0.482 0.193 7.084 + 352.500 79.979 249.990 0.463 0.239 7.096 + 352.750 79.136 249.309 0.449 0.234 7.162 + 353.000 80.533 249.366 0.450 0.223 7.014 + 353.250 82.555 249.922 0.469 0.234 7.106 + 353.500 82.395 250.392 0.461 0.255 7.105 + 353.750 82.861 250.639 0.473 0.259 7.117 + 354.000 80.958 250.788 0.465 0.255 7.050 + 354.250 80.798 251.355 0.455 0.255 6.969 + 354.500 81.323 251.294 0.450 0.254 6.981 + 354.750 81.041 250.926 0.449 0.241 7.046 + 355.000 81.565 248.583 0.445 0.233 7.246 + 355.250 81.843 245.617 0.449 0.224 7.438 + 355.500 80.251 239.639 0.457 0.224 7.854 + 355.750 76.663 240.519 0.466 0.238 8.230 + 356.000 72.891 244.622 0.465 0.289 8.921 + 356.250 69.802 246.427 0.460 0.300 9.227 + 356.500 68.833 247.094 0.467 0.299 8.918 + 356.750 67.552 246.938 0.491 0.286 8.381 + 357.000 62.158 246.567 0.480 0.282 8.223 + 357.250 59.446 245.886 0.459 0.272 8.731 + 357.500 59.723 245.208 0.439 0.255 9.219 + 357.750 58.317 245.147 0.420 0.237 10.318 + 358.000 57.224 245.305 0.432 0.212 11.700 + 358.250 56.690 245.765 0.425 0.186 14.010 + 358.500 57.592 245.812 0.414 0.178 15.947 + 358.750 58.301 245.858 0.420 0.222 18.118 + 359.000 61.946 245.793 0.511 0.317 16.521 + 359.250 61.661 245.745 0.535 0.320 15.094 + 359.500 63.495 245.481 0.486 0.307 14.318 + 359.750 67.573 245.109 0.442 0.291 13.659 + 360.000 70.781 243.595 0.459 0.288 12.884 + 360.250 67.380 241.662 0.482 0.286 12.017 + 360.500 67.471 242.124 0.499 0.279 11.250 + 360.750 71.672 243.105 0.494 0.270 10.732 + 361.000 72.199 243.672 0.473 0.264 10.257 + 361.250 67.429 243.930 0.448 0.257 10.027 + 361.500 68.703 244.078 0.467 0.255 9.821 + 361.750 72.968 244.538 0.488 0.254 9.727 + 362.000 77.671 244.998 0.478 0.252 9.653 + 362.250 74.584 245.893 0.459 0.251 9.633 + 362.500 69.438 246.441 0.446 0.252 9.632 + 362.750 68.219 246.800 0.438 0.252 9.757 + 363.000 69.559 247.159 0.474 0.258 9.885 + 363.250 72.824 247.618 0.502 0.260 9.977 + 363.500 77.214 248.806 0.497 0.257 10.088 + 363.750 80.421 249.269 0.482 0.256 10.125 + 364.000 78.205 247.450 0.471 0.256 9.604 + 364.250 79.105 241.888 0.493 0.250 9.025 + 364.500 78.949 242.451 0.485 0.242 9.007 + 364.750 78.723 245.829 0.462 0.235 8.989 + 365.000 77.382 247.844 0.446 0.230 8.970 + 365.250 75.291 249.133 0.456 0.228 8.885 + 365.500 74.134 249.598 0.464 0.219 8.784 + 365.750 75.969 249.852 0.450 0.218 8.717 + 366.000 81.418 250.103 0.458 0.229 8.505 + 366.250 86.498 249.944 0.447 0.239 8.345 + 366.500 87.330 249.991 0.444 0.244 8.112 + 366.750 87.552 250.241 0.474 0.246 7.709 + 367.000 88.135 250.399 0.485 0.246 7.466 + 367.250 86.731 250.441 0.467 0.243 7.149 + 367.500 83.953 250.171 0.451 0.241 7.055 + 367.750 80.864 249.910 0.462 0.242 7.040 + 368.000 78.460 249.024 0.454 0.240 7.336 + 368.250 68.209 248.240 0.446 0.242 7.893 + 368.500 66.742 247.972 0.470 0.257 8.636 + 368.750 70.825 248.744 0.465 0.267 9.593 + 369.000 73.586 248.893 0.452 0.274 10.736 + 369.250 74.055 249.253 0.425 0.282 12.243 + 369.500 69.471 249.613 0.410 0.280 14.497 + 369.750 66.442 249.761 0.399 0.250 15.833 + 370.000 62.607 248.980 0.368 0.167 16.375 + 370.250 59.582 247.876 0.341 0.123 16.526 + 370.500 58.362 247.202 0.313 0.111 16.648 + 370.750 60.699 247.036 0.360 0.124 16.961 + 371.000 64.214 247.296 0.367 0.134 17.411 + 371.250 62.808 247.758 0.342 0.108 17.973 + 371.500 61.404 248.321 0.326 0.058 18.208 + 371.750 64.051 248.993 0.377 0.073 17.501 + 372.000 72.239 249.764 0.406 0.129 15.810 + 372.250 75.819 250.846 0.409 0.183 14.282 + 372.500 73.539 251.200 0.383 0.188 13.753 + 372.750 74.255 250.323 0.378 0.186 13.244 + 373.000 76.275 249.637 0.418 0.169 12.898 + 373.250 75.618 249.063 0.426 0.202 12.680 + 373.500 69.230 247.753 0.406 0.203 12.488 + 373.750 68.756 245.201 0.373 0.161 12.771 + 374.000 70.847 241.612 0.383 0.136 14.293 + 374.250 72.737 238.854 0.454 0.182 15.639 + 374.500 75.820 237.243 0.454 0.246 15.784 + 374.750 76.844 237.596 0.441 0.224 15.605 + 375.000 74.067 240.663 0.421 0.205 15.169 + 375.250 72.599 243.615 0.379 0.184 14.884 + 375.500 74.687 246.879 0.370 0.163 14.743 + 375.750 78.950 249.316 0.423 0.122 14.851 + 376.000 83.717 249.877 0.452 0.201 14.766 + 376.250 83.991 248.680 0.443 0.202 14.272 + 376.500 83.456 244.990 0.442 0.203 13.337 + 376.750 83.609 244.417 0.436 0.210 12.795 + 377.000 84.759 243.936 0.423 0.209 12.205 + 377.250 86.157 244.402 0.434 0.208 11.622 + 377.500 86.312 245.179 0.450 0.211 11.045 + 377.750 82.974 246.054 0.436 0.212 11.189 + 378.000 79.572 247.658 0.418 0.204 11.357 + 378.250 79.792 248.851 0.423 0.181 12.219 + 378.500 81.624 249.517 0.446 0.161 13.320 + 378.750 81.026 250.597 0.451 0.187 13.802 + 379.000 81.871 251.687 0.444 0.205 13.567 + 379.250 82.769 252.347 0.447 0.207 12.211 + 379.500 81.795 252.712 0.482 0.202 11.583 + 379.750 81.327 252.757 0.474 0.194 11.323 + 380.000 83.098 251.454 0.461 0.190 11.110 + 380.250 84.687 249.322 0.435 0.175 11.026 + 380.500 85.647 249.056 0.417 0.158 11.003 + 380.750 86.360 249.625 0.428 0.159 11.022 + 381.000 85.765 250.915 0.443 0.174 11.020 + 381.250 84.483 252.001 0.455 0.172 11.080 + 381.500 83.951 252.457 0.450 0.166 11.100 + 381.750 84.040 253.125 0.430 0.190 11.015 + 382.000 85.252 253.482 0.435 0.205 11.013 + 382.250 88.522 254.155 0.450 0.195 11.012 + 382.500 78.763 254.617 0.449 0.176 10.969 + 382.750 77.173 254.970 0.420 0.156 10.864 + 383.000 82.683 254.401 0.417 0.205 10.862 + 383.250 84.269 254.335 0.434 0.215 10.902 + 383.500 83.053 253.769 0.457 0.210 11.023 + 383.750 82.269 252.985 0.438 0.193 11.379 + 384.000 76.564 252.609 0.408 0.173 11.925 + 384.250 75.968 252.346 0.383 0.139 12.662 + 384.500 79.363 252.284 0.386 0.160 12.997 + 384.750 82.878 252.436 0.406 0.200 12.995 + 385.000 91.696 252.899 0.429 0.202 12.235 + 385.250 93.219 252.743 0.417 0.188 11.606 + 385.500 91.374 251.542 0.415 0.181 11.050 + 385.750 91.593 250.750 0.463 0.181 10.782 + 386.000 92.117 249.756 0.463 0.203 10.700 + 386.250 93.704 249.912 0.441 0.212 10.698 + 386.500 93.543 252.344 0.421 0.208 10.697 + 386.750 91.392 253.113 0.411 0.201 10.735 + 387.000 91.358 253.057 0.411 0.196 10.774 + 387.250 92.004 251.237 0.428 0.202 10.833 + 387.500 91.845 247.336 0.473 0.198 11.037 + 387.750 90.757 244.995 0.469 0.184 11.118 + 388.000 90.967 250.757 0.452 0.174 11.137 + 388.250 91.620 253.186 0.452 0.179 11.135 + 388.500 92.830 252.093 0.445 0.184 11.197 + 388.750 93.610 250.579 0.423 0.181 11.237 + 389.000 92.328 248.544 0.417 0.178 11.257 + 389.250 92.104 245.377 0.425 0.191 11.275 + 389.500 92.567 245.004 0.445 0.191 11.253 + 389.750 92.843 246.090 0.452 0.182 11.314 + 390.000 92.501 245.306 0.446 0.171 11.312 + 390.250 90.780 243.286 0.463 0.162 11.289 + 390.500 88.128 247.599 0.462 0.167 11.266 + 390.750 88.970 249.397 0.461 0.194 11.244 + 391.000 91.362 254.629 0.443 0.198 11.244 + 391.250 92.265 257.584 0.414 0.175 11.030 + 391.500 90.549 254.202 0.403 0.149 10.885 + 391.750 92.943 251.339 0.406 0.137 10.228 + 392.000 97.891 251.513 0.421 0.189 9.887 + 392.250 99.294 251.965 0.407 0.204 8.949 + 392.500 97.454 252.317 0.407 0.193 8.748 + 392.750 97.418 252.053 0.435 0.188 8.648 + 393.000 94.579 252.092 0.432 0.188 8.647 + 393.250 88.933 250.371 0.425 0.176 9.533 + 393.500 84.349 248.864 0.416 0.228 10.994 + 393.750 85.935 244.963 0.419 0.238 13.018 + 394.000 84.346 240.544 0.410 0.241 14.762 + 394.250 83.248 240.290 0.402 0.232 17.186 + 394.500 80.036 240.947 0.378 0.180 20.007 + 394.750 80.067 243.185 0.384 0.162 22.688 + 395.000 78.784 245.103 0.404 0.173 26.413 + 395.250 73.263 246.485 0.392 0.181 30.462 + 395.500 67.371 250.167 0.377 0.167 34.478 + 395.750 64.223 251.157 0.367 0.160 38.805 + 396.000 65.249 251.296 0.356 0.153 42.381 + 396.250 65.525 251.872 0.348 0.135 46.548 + 396.500 63.682 251.909 0.339 0.107 52.290 + 396.750 63.150 252.065 0.305 0.097 55.627 + 397.000 64.490 252.104 0.286 0.092 55.304 + 397.250 65.576 251.426 0.334 0.093 51.776 + 397.500 66.783 251.478 0.406 0.141 45.389 + 397.750 68.126 251.950 0.427 0.184 33.661 + 398.000 68.149 252.299 0.395 0.177 28.206 + 398.250 69.486 252.556 0.380 0.159 26.858 + 398.500 72.504 252.487 0.373 0.138 25.478 + 398.750 75.089 252.220 0.380 0.142 24.350 + 399.000 74.430 252.058 0.399 0.173 23.537 + 399.250 75.270 252.001 0.420 0.219 22.623 + 399.500 77.231 252.257 0.435 0.236 21.785 + 399.750 79.561 252.615 0.445 0.247 21.296 + 400.000 77.162 252.669 0.447 0.256 21.173 + 400.250 75.130 252.706 0.442 0.260 21.248 + 400.500 72.413 252.759 0.436 0.241 21.286 + 400.750 69.140 252.490 0.427 0.226 21.282 + 401.000 70.912 252.118 0.425 0.210 21.279 + 401.250 70.941 251.958 0.437 0.228 21.275 + 401.500 70.718 251.902 0.435 0.225 21.392 + 401.750 67.133 250.810 0.388 0.144 22.250 + 402.000 62.237 247.006 0.347 0.115 25.421 + 402.250 59.777 245.600 0.319 0.082 29.153 + 402.500 58.241 246.069 0.298 0.060 31.779 + 402.750 59.457 246.522 0.306 0.085 32.195 + 403.000 65.090 247.399 0.340 0.135 30.369 + 403.250 71.538 249.326 0.350 0.152 26.522 + 403.500 71.939 250.505 0.353 0.154 25.158 + 403.750 70.791 251.701 0.357 0.151 24.456 + 404.000 71.185 251.117 0.370 0.152 23.772 + 404.250 72.207 251.377 0.410 0.170 22.978 + 404.500 74.420 251.316 0.426 0.196 21.756 + 404.750 77.187 251.574 0.411 0.206 20.407 + 405.000 80.337 252.252 0.407 0.197 18.962 + 405.250 82.485 252.599 0.409 0.193 16.251 + 405.500 83.440 252.951 0.404 0.196 14.904 + 405.750 81.164 253.310 0.420 0.184 14.985 + 406.000 79.262 252.737 0.410 0.178 15.469 + 406.250 78.980 252.267 0.397 0.169 16.119 + 406.500 78.694 251.683 0.397 0.157 16.734 + 406.750 78.720 251.627 0.413 0.152 17.242 + 407.000 78.995 251.679 0.429 0.157 17.865 + 407.250 77.403 250.991 0.392 0.146 18.408 + 407.500 77.430 250.728 0.369 0.127 19.110 + 407.750 78.953 250.878 0.355 0.117 19.506 + 408.000 79.232 251.553 0.355 0.129 19.650 + 408.250 80.442 251.906 0.371 0.148 19.281 + 408.500 83.149 251.845 0.376 0.152 18.637 + 408.750 82.056 251.591 0.367 0.144 18.082 + 409.000 82.520 251.636 0.364 0.142 17.511 + 409.250 82.610 251.779 0.398 0.177 16.957 + 409.500 82.140 252.137 0.416 0.175 16.608 + 409.750 82.229 252.287 0.415 0.174 16.327 + 410.000 80.451 252.957 0.419 0.175 15.114 + 410.250 83.904 253.734 0.434 0.167 14.418 + 410.500 86.800 254.812 0.442 0.155 13.832 + 410.750 90.507 256.940 0.434 0.188 13.345 + 411.000 91.590 256.884 0.433 0.192 13.021 + 411.250 89.188 255.888 0.425 0.161 12.728 + 411.500 88.287 253.549 0.403 0.132 12.584 + 411.750 89.249 253.799 0.379 0.090 12.605 + 412.000 93.262 254.572 0.361 0.103 12.556 + 412.250 96.591 255.765 0.403 0.128 12.483 + 412.500 99.112 256.954 0.411 0.177 12.529 + 412.750 96.522 257.833 0.394 0.169 12.386 + 413.000 97.236 257.773 0.387 0.134 12.154 + 413.250 99.446 255.638 0.398 0.123 11.594 + 413.500 100.345 256.309 0.391 0.171 11.312 + 413.750 99.686 257.082 0.365 0.170 11.163 + 414.000 101.770 255.682 0.377 0.159 10.892 + 414.250 105.225 256.551 0.433 0.156 10.748 + 414.500 105.941 258.470 0.434 0.172 10.666 + 414.750 105.718 259.547 0.422 0.168 10.584 + 415.000 106.556 261.153 0.398 0.172 10.424 + 415.250 106.772 262.343 0.392 0.190 10.384 + 415.500 104.928 271.010 0.448 0.205 10.266 + 415.750 100.472 275.314 0.420 0.182 10.557 + 416.000 83.734 264.349 0.354 0.113 11.661 + 416.250 82.329 254.009 0.326 0.081 13.223 + 416.500 90.145 253.229 0.340 0.085 15.511 + 416.750 98.276 253.478 0.382 0.162 18.434 + 417.000 102.168 253.741 0.395 0.190 19.611 + 417.250 97.522 254.198 0.392 0.197 19.979 + 417.500 95.055 253.203 0.397 0.195 19.752 + 417.750 80.999 251.176 0.400 0.220 19.823 + 418.000 54.168 248.622 0.396 0.244 23.917 + 418.250 44.725 246.381 0.392 0.284 28.694 + 418.500 39.395 242.170 0.393 0.310 45.546 + 418.750 36.180 235.987 0.410 0.315 55.784 + 419.000 34.464 241.020 0.425 0.320 76.189 + 419.250 33.991 246.153 0.422 0.310 80.441 + 419.500 36.699 251.390 0.409 0.300 78.339 + 419.750 45.203 253.208 0.406 0.297 74.455 + 420.000 49.093 253.663 0.411 0.292 67.261 + 420.250 50.991 254.028 0.444 0.286 60.761 + 420.500 51.767 254.280 0.455 0.315 54.172 + 420.750 54.723 252.869 0.440 0.299 45.651 + 421.000 61.356 250.733 0.417 0.281 40.094 + 421.250 69.611 249.021 0.372 0.257 35.082 + 421.500 82.352 247.505 0.334 0.196 26.511 + 421.750 87.177 249.423 0.326 0.156 18.102 + 422.000 87.457 252.168 0.339 0.157 14.747 + 422.250 86.237 254.393 0.360 0.155 13.074 + 422.500 81.344 255.273 0.360 0.162 12.286 + 422.750 78.627 255.429 0.346 0.159 12.101 + 423.000 86.319 254.330 0.327 0.151 11.851 + 423.250 104.855 253.757 0.415 0.154 11.412 + 423.500 111.427 252.449 0.410 0.175 9.193 + 423.750 83.100 250.933 0.394 0.186 8.181 + 424.000 71.474 249.319 0.367 0.190 9.435 + 424.250 65.644 249.365 0.305 0.144 11.534 + 424.500 63.180 249.620 0.282 0.098 16.143 + 424.750 74.299 249.667 0.306 0.095 23.724 + 425.000 92.523 249.712 0.340 0.094 25.909 + 425.250 100.781 250.171 0.364 0.104 25.233 + 425.500 101.742 249.802 0.408 0.136 22.540 + 425.750 103.204 248.186 0.423 0.172 16.874 + 426.000 105.599 248.443 0.418 0.189 12.444 + 426.250 104.630 246.833 0.409 0.211 10.766 + 426.500 65.710 245.422 0.394 0.233 10.784 + 426.750 63.555 244.112 0.388 0.254 13.741 + 427.000 63.461 244.889 0.398 0.258 20.615 + 427.250 65.355 246.599 0.395 0.253 27.788 + 427.500 68.936 247.691 0.387 0.248 34.550 + 427.750 68.401 248.248 0.365 0.234 37.101 + 428.000 63.758 249.334 0.345 0.175 37.657 + 428.250 65.216 249.794 0.321 0.147 36.535 + 428.500 77.457 250.357 0.401 0.164 34.140 + 428.750 84.841 250.934 0.406 0.179 29.096 + 429.000 87.984 251.490 0.419 0.184 23.395 + 429.250 86.331 251.017 0.418 0.194 18.704 + 429.500 81.682 249.296 0.402 0.239 18.772 + 429.750 63.575 246.449 0.402 0.280 23.961 + 430.000 63.291 245.653 0.402 0.305 27.480 + 430.250 69.488 244.871 0.391 0.283 27.891 + 430.500 76.189 245.019 0.385 0.217 26.757 + 430.750 67.799 245.061 0.391 0.218 22.129 + 431.000 58.107 245.635 0.427 0.222 15.367 + 431.250 65.425 245.469 0.460 0.199 11.767 + 431.500 77.294 246.241 0.460 0.206 9.786 + 431.750 83.552 246.702 0.441 0.209 8.435 + 432.000 82.147 247.481 0.439 0.207 7.563 + 432.250 76.939 248.041 0.464 0.178 7.001 + 432.500 72.607 248.296 0.450 0.155 6.831 + 432.750 74.629 248.963 0.414 0.153 7.025 + 433.000 81.016 248.808 0.434 0.162 7.487 + 433.250 84.529 248.643 0.418 0.168 8.162 + 433.500 84.682 248.586 0.406 0.167 8.426 + 433.750 81.599 248.326 0.497 0.224 8.314 + 434.000 79.191 248.685 0.545 0.248 8.097 + 434.250 74.856 248.413 0.588 0.325 7.768 + 434.500 75.448 246.697 0.552 0.314 7.313 + 434.750 80.335 245.284 0.520 0.298 7.163 + 435.000 83.980 246.478 0.526 0.291 7.352 + 435.250 89.487 248.090 0.544 0.270 7.242 + 435.500 95.436 248.438 0.555 0.219 7.013 + 435.750 102.382 248.589 0.527 0.188 6.804 + 436.000 100.788 248.120 0.503 0.172 6.829 + 436.250 95.456 247.536 0.495 0.158 7.075 + 436.500 90.874 248.309 0.485 0.222 7.277 + 436.750 91.088 250.968 0.487 0.237 7.554 + 437.000 94.545 252.249 0.494 0.217 7.711 + 437.250 94.448 247.720 0.512 0.207 7.709 + 437.500 91.357 244.342 0.511 0.196 7.536 + 437.750 83.909 242.624 0.506 0.215 7.592 + 438.000 75.087 241.941 0.497 0.243 8.260 + 438.250 67.388 242.402 0.502 0.251 9.297 + 438.500 63.303 242.867 0.530 0.258 10.905 + 438.750 58.594 243.745 0.518 0.278 11.977 + 439.000 57.377 244.411 0.496 0.293 12.789 + 439.250 57.279 245.508 0.469 0.302 12.957 + 439.500 56.683 245.645 0.464 0.256 13.052 + 439.750 54.094 246.008 0.465 0.171 12.977 + 440.000 52.814 245.434 0.468 0.148 12.877 + 440.250 53.715 244.128 0.468 0.162 12.755 + 440.500 53.868 241.678 0.469 0.167 12.705 + 440.750 45.043 237.265 0.472 0.139 12.513 + 441.000 40.211 232.836 0.476 0.151 12.488 + 441.250 41.796 226.862 0.482 0.205 12.416 + 441.500 44.317 220.986 0.489 0.210 12.461 + 441.750 44.409 215.009 0.496 0.216 12.482 + 442.000 44.248 209.656 0.502 0.235 12.410 diff --git a/panel_test_app/app.py b/panel_test_app/app.py new file mode 100644 index 0000000..e78b305 --- /dev/null +++ b/panel_test_app/app.py @@ -0,0 +1,18 @@ +import panel as pn + + +if __name__ == "__main__": + + # css_files=['https://api.tiles.mapbox.com/mapbox-gl-js/v0.44.1/mapbox-gl.css']) + current_file = __file__.split('/') + docs_files = current_file[:-2] + main_dir = current_file[:-2] + docs_files.append('docs') + docs_path = '/'.join(docs_files) + main_dir = '/'.join(main_dir) + with open(docs_path + '/index.html', 'r', encoding='utf-8') as html_file: + index_html = html_file.read() + pn.extension('d3', js_files={'wellio': main_dir + '/dist/index.js'}) + main_column = pn.Column(width=900) + main_column.append(pn.panel(index_html)) + main_column.show() From 5c1eb8ac17750ef8c46a12831794a462dfaeae0b Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 6 Jun 2020 08:41:54 -0700 Subject: [PATCH 03/17] version update?? not sure where this change happened from lol --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index a15c676..304d9b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wellioviz", - "version": "0.0.25", + "version": "0.0.28", "lockfileVersion": 1, "requires": true, "dependencies": { From 0470d2c836ae6d2179a04541a640aeb066288ec2 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sun, 7 Jun 2020 08:54:16 -0700 Subject: [PATCH 04/17] ready to try a holoviews panel app --- docs/assets/00_01-01-073-05W5_0-1.json | 6556 +- docs/js/bundle.js | 43722 ++-- package-lock.json | 10 + package.json | 1 + panel_test_app/00_01-01-073-05W5_0-1.json | 6555 + panel_test_app/make_a_plot.js | 91 + panel_test_app/well_log_viz/curve_box.js | 160 + panel_test_app/well_log_viz/d3.js | 18428 ++ .../well_log_viz/format_template.js | 76 + .../well_log_viz/single_well_log_display.js | 48 + panel_test_app/well_log_viz/test_log.html | 13 + panel_test_app/well_log_viz/test_log.json | 201992 +++++++++++++++ panel_test_app/well_viz_html.html | 37 + 13 files changed, 256244 insertions(+), 21445 deletions(-) create mode 100644 panel_test_app/00_01-01-073-05W5_0-1.json create mode 100644 panel_test_app/make_a_plot.js create mode 100644 panel_test_app/well_log_viz/curve_box.js create mode 100644 panel_test_app/well_log_viz/d3.js create mode 100644 panel_test_app/well_log_viz/format_template.js create mode 100644 panel_test_app/well_log_viz/single_well_log_display.js create mode 100644 panel_test_app/well_log_viz/test_log.html create mode 100644 panel_test_app/well_log_viz/test_log.json create mode 100644 panel_test_app/well_viz_html.html diff --git a/docs/assets/00_01-01-073-05W5_0-1.json b/docs/assets/00_01-01-073-05W5_0-1.json index dd74690..61d1059 100644 --- a/docs/assets/00_01-01-073-05W5_0-1.json +++ b/docs/assets/00_01-01-073-05W5_0-1.json @@ -1 +1,6555 @@ -{"VERSION INFORMATION":{"WRAP":{"MNEM":"WRAP","UNIT":"","DATA":"NO","DESCRIPTION OF MNEMONIC 1":"ONE LINE PER DEPTH STEP","DESCRIPTION OF MNEMONIC 2":""},"VERS":{"MNEM":"VERS","UNIT":"","DATA":"2.0","DESCRIPTION OF MNEMONIC 1":"CWLS LOG ASCII STANDARD","DESCRIPTION OF MNEMONIC 2":"VERSION 2.0"}},"WELL INFORMATION BLOCK":{"GENERATED":" Generated from Intellog Unique Number CW_73_75/WELL/2722","WELL":{"MNEM":"WELL","UNIT":"","DATA":"CHEVRON MGSU 1 MITSUE 01-01","DESCRIPTION OF MNEMONIC 1":"Well_name","DESCRIPTION OF MNEMONIC 2":"WELL"},"LOC":{"MNEM":"LOC","UNIT":"","DATA":"00/01-01-073-05W5/0","DESCRIPTION OF MNEMONIC 1":"Location","DESCRIPTION OF MNEMONIC 2":"LOCATION"},"UWI":{"MNEM":"UWI","UNIT":"","DATA":"00/01-01-073-05W5/0","DESCRIPTION OF MNEMONIC 1":"Uwi","DESCRIPTION OF MNEMONIC 2":"UNIQUE WELL ID"},"ENTR":{"MNEM":"ENTR","UNIT":"","DATA":"JAYE","DESCRIPTION OF MNEMONIC 1":"Entered","DESCRIPTION OF MNEMONIC 2":"ENTERED BY"},"SRVC":{"MNEM":"SRVC","UNIT":"","DATA":"SCHLUMBERGER","DESCRIPTION OF MNEMONIC 1":"Scn","DESCRIPTION OF MNEMONIC 2":"SERVICE COMPANY"},"DATE":{"MNEM":"DATE","UNIT":"","DATA":"23 DEC 86","DESCRIPTION OF MNEMONIC 1":"Date","DESCRIPTION OF MNEMONIC 2":"LOG DATE"},"STRT":{"MNEM":"STRT","UNIT":"","DATA":"390","DESCRIPTION OF MNEMONIC 1":"top_depth","DESCRIPTION OF MNEMONIC 2":"START DEPTH"},"STOP":{"MNEM":"STOP","UNIT":"","DATA":"650","DESCRIPTION OF MNEMONIC 1":"bot_depth","DESCRIPTION OF MNEMONIC 2":"STOP DEPTH"},"STEP":{"MNEM":"STEP","UNIT":"","DATA":"0.25","DESCRIPTION OF MNEMONIC 1":"increment","DESCRIPTION OF MNEMONIC 2":"STEP LENGTH"},"NULL":{"MNEM":"NULL","UNIT":".","DATA":".2500","DESCRIPTION OF MNEMONIC 1":"NULL Value","DESCRIPTION OF MNEMONIC 2":""}},"CURVE INFORMATION BLOCK":{"DEPT":{"MNEM":"DEPT","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":"","DATA":"00 001 00 00","DESCRIPTION OF MNEMONIC 1":"DEPTH","DESCRIPTION OF MNEMONIC 2":"DEPTH"},"DPHI":{"MNEM":"DPHI","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":"","DATA":"00 890 00 00","DESCRIPTION OF MNEMONIC 1":"PHID","DESCRIPTION OF MNEMONIC 2":"DENSITY POROSITY (SANDSTONE)"},"NPHI":{"MNEM":"NPHI","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":"","DATA":"00 330 00 00","DESCRIPTION OF MNEMONIC 1":"PHIN","DESCRIPTION OF MNEMONIC 2":"NEUTRON POROSITY (SANDSTONE)"},"GR":{"MNEM":"GR","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":"","DATA":"00 310 00 00","DESCRIPTION OF MNEMONIC 1":"GR","DESCRIPTION OF MNEMONIC 2":"GAMMA RAY"},"CALI":{"MNEM":"CALI","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":"","DATA":"00 280 01 00","DESCRIPTION OF MNEMONIC 1":"CAL","DESCRIPTION OF MNEMONIC 2":"CALIPER"},"ILD":{"MNEM":"ILD","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":"","DATA":"00 120 00 00","DESCRIPTION OF MNEMONIC 1":"RESD","DESCRIPTION OF MNEMONIC 2":"DEEP RESISTIVITY (DIL)"}},"PARAMETER INFORMATION":{"GL":{"MNEM":"GL","UNIT":"","DATA":"583.3","DESCRIPTION OF MNEMONIC 1":"gl","DESCRIPTION OF MNEMONIC 2":"GROUND LEVEL ELEVATION"},"EREF":{"MNEM":"EREF","UNIT":"","DATA":"589","DESCRIPTION OF MNEMONIC 1":"kb","DESCRIPTION OF MNEMONIC 2":"ELEVATION OF DEPTH REFERENCE"},"DATM":{"MNEM":"DATM","UNIT":"","DATA":"583.3","DESCRIPTION OF MNEMONIC 1":"datum","DESCRIPTION OF MNEMONIC 2":"DATUM ELEVATION"},"TDD":{"MNEM":"TDD","UNIT":"","DATA":"733.4","DESCRIPTION OF MNEMONIC 1":"tdd","DESCRIPTION OF MNEMONIC 2":"TOTAL DEPTH DRILLER"},"RUN":{"MNEM":"RUN","UNIT":"","DATA":"ONE","DESCRIPTION OF MNEMONIC 1":"Run","DESCRIPTION OF MNEMONIC 2":"RUN NUMBER"},"ENG":{"MNEM":"ENG","UNIT":"","DATA":"SIMMONS","DESCRIPTION OF MNEMONIC 1":"Engineer","DESCRIPTION OF MNEMONIC 2":"RECORDING ENGINEER"},"WIT":{"MNEM":"WIT","UNIT":"","DATA":"SANK","DESCRIPTION OF MNEMONIC 1":"Witness","DESCRIPTION OF MNEMONIC 2":"WITNESSED BY"},"BASE":{"MNEM":"BASE","UNIT":"","DATA":"S.L","DESCRIPTION OF MNEMONIC 1":"Branch","DESCRIPTION OF MNEMONIC 2":"HOME BASE OF LOGGING UNIT"},"MUD":{"MNEM":"MUD","UNIT":"","DATA":"GEL CHEM","DESCRIPTION OF MNEMONIC 1":"Mud_type","DESCRIPTION OF MNEMONIC 2":"MUD TYPE"},"MATR":{"MNEM":"MATR","UNIT":"","DATA":"SANDSTONE","DESCRIPTION OF MNEMONIC 1":"Logunit","DESCRIPTION OF MNEMONIC 2":"NEUTRON MATRIX"},"TMAX":{"MNEM":"TMAX","UNIT":"","DATA":"41","DESCRIPTION OF MNEMONIC 1":"BHT","DESCRIPTION OF MNEMONIC 2":"MAXIMUM RECORDED TEMPERATURE"},"BHTD":{"MNEM":"BHTD","UNIT":"","DATA":"733.8","DESCRIPTION OF MNEMONIC 1":"BHTDEP","DESCRIPTION OF MNEMONIC 2":"MAXIMUM RECORDED TEMPERATURE"},"RMT":{"MNEM":"RMT","UNIT":"","DATA":"17","DESCRIPTION OF MNEMONIC 1":"MDTP","DESCRIPTION OF MNEMONIC 2":"TEMPERATURE OF MUD"},"MUDD":{"MNEM":"MUDD","UNIT":"","DATA":"1100","DESCRIPTION OF MNEMONIC 1":"MWT","DESCRIPTION OF MNEMONIC 2":"MUD DENSITY"},"NEUT":{"MNEM":"NEUT","UNIT":"","DATA":"1","DESCRIPTION OF MNEMONIC 1":"NEUTRON","DESCRIPTION OF MNEMONIC 2":"NEUTRON TYPE"},"RESI":{"MNEM":"RESI","UNIT":"","DATA":"0","DESCRIPTION OF MNEMONIC 1":"RESIST","DESCRIPTION OF MNEMONIC 2":"RESISTIVITY TYPE"},"RM":{"MNEM":"RM","UNIT":"","DATA":"2.62","DESCRIPTION OF MNEMONIC 1":"RM","DESCRIPTION OF MNEMONIC 2":"RESISTIVITY OF MUD"},"RMC":{"MNEM":"RMC","UNIT":"","DATA":"0","DESCRIPTION OF MNEMONIC 1":"RMC","DESCRIPTION OF MNEMONIC 2":"RESISTIVITY OF MUD CAKE"},"RMF":{"MNEM":"RMF","UNIT":"","DATA":"1.02","DESCRIPTION OF MNEMONIC 1":"RMF","DESCRIPTION OF MNEMONIC 2":"RESISTIVITY OF MUD FILTRATE"},"SUFT":{"MNEM":"SUFT","UNIT":"","DATA":"0","DESCRIPTION OF MNEMONIC 1":"SUFT","DESCRIPTION OF MNEMONIC 2":"SURFACE TEMPERATURE"}},"CURVES":{"DEPTH":["390.000","390.250","390.500","390.750","391.000","391.250","391.500","391.750","392.000","392.250","392.500","392.750","393.000","393.250","393.500","393.750","394.000","394.250","394.500","394.750","395.000","395.250","395.500","395.750","396.000","396.250","396.500","396.750","397.000","397.250","397.500","397.750","398.000","398.250","398.500","398.750","399.000","399.250","399.500","399.750","400.000","400.250","400.500","400.750","401.000","401.250","401.500","401.750","402.000","402.250","402.500","402.750","403.000","403.250","403.500","403.750","404.000","404.250","404.500","404.750","405.000","405.250","405.500","405.750","406.000","406.250","406.500","406.750","407.000","407.250","407.500","407.750","408.000","408.250","408.500","408.750","409.000","409.250","409.500","409.750","410.000","410.250","410.500","410.750","411.000","411.250","411.500","411.750","412.000","412.250","412.500","412.750","413.000","413.250","413.500","413.750","414.000","414.250","414.500","414.750","415.000","415.250","415.500","415.750","416.000","416.250","416.500","416.750","417.000","417.250","417.500","417.750","418.000","418.250","418.500","418.750","419.000","419.250","419.500","419.750","420.000","420.250","420.500","420.750","421.000","421.250","421.500","421.750","422.000","422.250","422.500","422.750","423.000","423.250","423.500","423.750","424.000","424.250","424.500","424.750","425.000","425.250","425.500","425.750","426.000","426.250","426.500","426.750","427.000","427.250","427.500","427.750","428.000","428.250","428.500","428.750","429.000","429.250","429.500","429.750","430.000","430.250","430.500","430.750","431.000","431.250","431.500","431.750","432.000","432.250","432.500","432.750","433.000","433.250","433.500","433.750","434.000","434.250","434.500","434.750","435.000","435.250","435.500","435.750","436.000","436.250","436.500","436.750","437.000","437.250","437.500","437.750","438.000","438.250","438.500","438.750","439.000","439.250","439.500","439.750","440.000","440.250","440.500","440.750","441.000","441.250","441.500","441.750","442.000","442.250","442.500","442.750","443.000","443.250","443.500","443.750","444.000","444.250","444.500","444.750","445.000","445.250","445.500","445.750","446.000","446.250","446.500","446.750","447.000","447.250","447.500","447.750","448.000","448.250","448.500","448.750","449.000","449.250","449.500","449.750","450.000","450.250","450.500","450.750","451.000","451.250","451.500","451.750","452.000","452.250","452.500","452.750","453.000","453.250","453.500","453.750","454.000","454.250","454.500","454.750","455.000","455.250","455.500","455.750","456.000","456.250","456.500","456.750","457.000","457.250","457.500","457.750","458.000","458.250","458.500","458.750","459.000","459.250","459.500","459.750","460.000","460.250","460.500","460.750","461.000","461.250","461.500","461.750","462.000","462.250","462.500","462.750","463.000","463.250","463.500","463.750","464.000","464.250","464.500","464.750","465.000","465.250","465.500","465.750","466.000","466.250","466.500","466.750","467.000","467.250","467.500","467.750","468.000","468.250","468.500","468.750","469.000","469.250","469.500","469.750","470.000","470.250","470.500","470.750","471.000","471.250","471.500","471.750","472.000","472.250","472.500","472.750","473.000","473.250","473.500","473.750","474.000","474.250","474.500","474.750","475.000","475.250","475.500","475.750","476.000","476.250","476.500","476.750","477.000","477.250","477.500","477.750","478.000","478.250","478.500","478.750","479.000","479.250","479.500","479.750","480.000","480.250","480.500","480.750","481.000","481.250","481.500","481.750","482.000","482.250","482.500","482.750","483.000","483.250","483.500","483.750","484.000","484.250","484.500","484.750","485.000","485.250","485.500","485.750","486.000","486.250","486.500","486.750","487.000","487.250","487.500","487.750","488.000","488.250","488.500","488.750","489.000","489.250","489.500","489.750","490.000","490.250","490.500","490.750","491.000","491.250","491.500","491.750","492.000","492.250","492.500","492.750","493.000","493.250","493.500","493.750","494.000","494.250","494.500","494.750","495.000","495.250","495.500","495.750","496.000","496.250","496.500","496.750","497.000","497.250","497.500","497.750","498.000","498.250","498.500","498.750","499.000","499.250","499.500","499.750","500.000","500.250","500.500","500.750","501.000","501.250","501.500","501.750","502.000","502.250","502.500","502.750","503.000","503.250","503.500","503.750","504.000","504.250","504.500","504.750","505.000","505.250","505.500","505.750","506.000","506.250","506.500","506.750","507.000","507.250","507.500","507.750","508.000","508.250","508.500","508.750","509.000","509.250","509.500","509.750","510.000","510.250","510.500","510.750","511.000","511.250","511.500","511.750","512.000","512.250","512.500","512.750","513.000","513.250","513.500","513.750","514.000","514.250","514.500","514.750","515.000","515.250","515.500","515.750","516.000","516.250","516.500","516.750","517.000","517.250","517.500","517.750","518.000","518.250","518.500","518.750","519.000","519.250","519.500","519.750","520.000","520.250","520.500","520.750","521.000","521.250","521.500","521.750","522.000","522.250","522.500","522.750","523.000","523.250","523.500","523.750","524.000","524.250","524.500","524.750","525.000","525.250","525.500","525.750","526.000","526.250","526.500","526.750","527.000","527.250","527.500","527.750","528.000","528.250","528.500","528.750","529.000","529.250","529.500","529.750","530.000","530.250","530.500","530.750","531.000","531.250","531.500","531.750","532.000","532.250","532.500","532.750","533.000","533.250","533.500","533.750","534.000","534.250","534.500","534.750","535.000","535.250","535.500","535.750","536.000","536.250","536.500","536.750","537.000","537.250","537.500","537.750","538.000","538.250","538.500","538.750","539.000","539.250","539.500","539.750","540.000","540.250","540.500","540.750","541.000","541.250","541.500","541.750","542.000","542.250","542.500","542.750","543.000","543.250","543.500","543.750","544.000","544.250","544.500","544.750","545.000","545.250","545.500","545.750","546.000","546.250","546.500","546.750","547.000","547.250","547.500","547.750","548.000","548.250","548.500","548.750","549.000","549.250","549.500","549.750","550.000","550.250","550.500","550.750","551.000","551.250","551.500","551.750","552.000","552.250","552.500","552.750","553.000","553.250","553.500","553.750","554.000","554.250","554.500","554.750","555.000","555.250","555.500","555.750","556.000","556.250","556.500","556.750","557.000","557.250","557.500","557.750","558.000","558.250","558.500","558.750","559.000","559.250","559.500","559.750","560.000","560.250","560.500","560.750","561.000","561.250","561.500","561.750","562.000","562.250","562.500","562.750","563.000","563.250","563.500","563.750","564.000","564.250","564.500","564.750","565.000","565.250","565.500","565.750","566.000","566.250","566.500","566.750","567.000","567.250","567.500","567.750","568.000","568.250","568.500","568.750","569.000","569.250","569.500","569.750","570.000","570.250","570.500","570.750","571.000","571.250","571.500","571.750","572.000","572.250","572.500","572.750","573.000","573.250","573.500","573.750","574.000","574.250","574.500","574.750","575.000","575.250","575.500","575.750","576.000","576.250","576.500","576.750","577.000","577.250","577.500","577.750","578.000","578.250","578.500","578.750","579.000","579.250","579.500","579.750","580.000","580.250","580.500","580.750","581.000","581.250","581.500","581.750","582.000","582.250","582.500","582.750","583.000","583.250","583.500","583.750","584.000","584.250","584.500","584.750","585.000","585.250","585.500","585.750","586.000","586.250","586.500","586.750","587.000","587.250","587.500","587.750","588.000","588.250","588.500","588.750","589.000","589.250","589.500","589.750","590.000","590.250","590.500","590.750","591.000","591.250","591.500","591.750","592.000","592.250","592.500","592.750","593.000","593.250","593.500","593.750","594.000","594.250","594.500","594.750","595.000","595.250","595.500","595.750","596.000","596.250","596.500","596.750","597.000","597.250","597.500","597.750","598.000","598.250","598.500","598.750","599.000","599.250","599.500","599.750","600.000","600.250","600.500","600.750","601.000","601.250","601.500","601.750","602.000","602.250","602.500","602.750","603.000","603.250","603.500","603.750","604.000","604.250","604.500","604.750","605.000","605.250","605.500","605.750","606.000","606.250","606.500","606.750","607.000","607.250","607.500","607.750","608.000","608.250","608.500","608.750","609.000","609.250","609.500","609.750","610.000","610.250","610.500","610.750","611.000","611.250","611.500","611.750","612.000","612.250","612.500","612.750","613.000","613.250","613.500","613.750","614.000","614.250","614.500","614.750","615.000","615.250","615.500","615.750","616.000","616.250","616.500","616.750","617.000","617.250","617.500","617.750","618.000","618.250","618.500","618.750","619.000","619.250","619.500","619.750","620.000","620.250","620.500","620.750","621.000","621.250","621.500","621.750","622.000","622.250","622.500","622.750","623.000","623.250","623.500","623.750","624.000","624.250","624.500","624.750","625.000","625.250","625.500","625.750","626.000","626.250","626.500","626.750","627.000","627.250","627.500","627.750","628.000","628.250","628.500","628.750","629.000","629.250","629.500","629.750","630.000","630.250","630.500","630.750","631.000","631.250","631.500","631.750","632.000","632.250","632.500","632.750","633.000","633.250","633.500","633.750","634.000","634.250","634.500","634.750","635.000","635.250","635.500","635.750","636.000","636.250","636.500","636.750","637.000","637.250","637.500","637.750","638.000","638.250","638.500","638.750","639.000","639.250","639.500","639.750","640.000","640.250","640.500","640.750","641.000","641.250","641.500","641.750","642.000","642.250","642.500","642.750","643.000","643.250","643.500","643.750","644.000","644.250","644.500","644.750","645.000","645.250","645.500","645.750","646.000","646.250","646.500","646.750","647.000","647.250","647.500","647.750","648.000","648.250","648.500","648.750","649.000","649.250","649.500","649.750","650.000"],"PHID":["0.199","0.208","0.246","0.266","0.287","0.288","0.241","0.215","0.190","0.219","0.269","0.316","0.299","0.241","0.216","0.293","0.374","0.454","0.508","0.553","0.535","0.507","0.422","0.344","0.332","0.278","0.230","0.208","0.235","0.234","0.227","0.237","0.247","0.250","0.253","0.264","0.282","0.304","0.332","0.501","0.507","0.289","0.252","0.248","0.252","0.252","0.260","0.270","0.255","0.209","0.191","0.103","0.078","0.095","0.186","0.223","0.244","0.268","0.281","0.284","0.283","0.286","0.309","0.364","0.548","0.498","0.413","0.329","0.287","0.283","0.279","0.284","0.302","0.320","0.323","0.293","0.254","0.219","0.215","0.233","0.250","0.279","0.279","0.275","0.292","0.314","0.324","0.315","0.281","0.247","0.316","0.354","0.349","0.325","0.337","0.339","0.324","0.264","0.223","0.223","0.246","0.260","0.230","0.205","0.190","0.263","0.308","0.307","0.285","0.266","0.251","0.220","0.208","0.213","0.208","0.200","0.201","0.214","0.268","0.406","0.517","0.570","0.612","0.645","0.389","0.322","0.297","0.289","0.296","0.303","0.309","0.313","0.313","0.312","0.306","0.294","0.288","0.269","0.242","0.221","0.267","0.292","0.308","0.323","0.341","0.348","0.343","0.340","0.337","0.334","0.335","0.344","0.351","0.345","0.341","0.344","0.352","0.359","0.359","0.347","0.344","0.342","0.334","0.329","0.335","0.339","0.340","0.330","0.336","0.339","0.334","0.331","0.336","0.350","0.349","0.332","0.318","0.281","0.436","0.476","0.476","0.432","0.330","0.297","0.281","0.264","0.243","0.264","0.310","0.328","0.328","0.319","0.302","0.316","0.321","0.322","0.319","0.310","0.294","0.270","0.260","0.314","0.331","0.337","0.344","0.352","0.364","0.351","0.349","0.347","0.334","0.326","0.331","0.349","0.358","0.354","0.344","0.334","0.321","0.311","0.318","0.330","0.339","0.346","0.339","0.315","0.282","0.237","0.095","0.039","0.075","0.183","0.274","0.309","0.341","0.356","0.350","0.342","0.338","0.335","0.331","0.335","0.344","0.333","0.324","0.335","0.358","0.353","0.333","0.334","0.333","0.332","0.341","0.348","0.349","0.341","0.329","0.325","0.324","0.327","0.338","0.349","0.353","0.351","0.339","0.333","0.332","0.342","0.599","0.574","0.533","0.259","0.215","0.224","0.246","0.260","0.265","0.253","0.257","0.276","0.302","0.317","0.313","0.306","0.301","0.300","0.302","0.303","0.305","0.306","0.306","0.306","0.307","0.309","0.312","0.316","0.321","0.322","0.321","0.320","0.319","0.316","0.309","0.300","0.268","0.182","0.081","0.038","0.060","0.118","0.222","0.268","0.298","0.288","0.302","0.326","0.327","0.314","0.296","0.245","0.141","0.061","0.022","0.001","0.008","0.040","0.187","0.253","0.282","0.306","0.309","0.299","0.299","0.302","0.308","0.310","0.313","0.305","0.284","0.262","0.235","0.218","0.222","0.235","0.250","0.259","0.256","0.254","0.256","0.256","0.259","0.269","0.250","0.244","0.251","0.202","0.182","0.181","0.228","0.258","0.280","0.245","0.202","0.215","0.245","0.266","0.274","0.286","0.307","0.312","0.303","0.295","0.298","0.303","0.309","0.307","0.306","0.303","0.291","0.278","0.268","0.275","0.289","0.298","0.307","0.316","0.325","0.323","0.318","0.310","0.303","0.291","0.314","0.319","0.316","0.306","0.294","0.286","0.302","0.307","0.305","0.300","0.288","0.265","0.192","0.141","0.091","0.142","0.206","0.255","0.276","0.262","0.240","0.234","0.257","0.260","0.254","0.250","0.252","0.251","0.250","0.251","0.248","0.252","0.244","0.255","0.251","0.241","0.229","0.220","0.209","0.200","0.205","0.224","0.232","0.239","0.243","0.229","0.215","0.207","0.204","0.197","0.191","0.191","0.218","0.215","0.205","0.218","0.255","0.272","0.283","0.296","0.308","0.315","0.308","0.291","0.274","0.260","0.267","0.263","0.248","0.244","0.236","0.223","0.207","0.196","0.214","0.220","0.212","0.202","0.218","0.242","0.293","0.328","0.334","0.330","0.329","0.331","0.333","0.335","0.340","0.341","0.335","0.329","0.323","0.322","0.325","0.327","0.325","0.316","0.306","0.300","0.301","0.306","0.311","0.313","0.315","0.318","0.317","0.316","0.316","0.317","0.317","0.319","0.320","0.323","0.325","0.326","0.324","0.321","0.320","0.321","0.324","0.326","0.327","0.326","0.329","0.330","0.328","0.333","0.336","0.337","0.335","0.331","0.326","0.324","0.323","0.321","0.321","0.321","0.320","0.325","0.330","0.327","0.321","0.319","0.309","0.265","0.223","0.135","0.141","0.162","0.188","0.221","0.273","0.305","0.293","0.277","0.262","0.247","0.270","0.290","0.304","0.294","0.278","0.262","0.258","0.255","0.218","0.212","0.232","0.258","0.261","0.261","0.247","0.238","0.224","0.211","0.215","0.224","0.221","0.227","0.240","0.233","0.215","0.179","0.188","0.218","0.190","0.132","0.074","0.160","0.199","0.210","0.200","0.201","0.213","0.221","0.222","0.215","0.233","0.232","0.218","0.200","0.183","0.197","0.215","0.225","0.236","0.236","0.247","0.235","0.200","0.199","0.222","0.241","0.264","0.250","0.238","0.225","0.218","0.220","0.219","0.217","0.214","0.212","0.211","0.213","0.217","0.221","0.220","0.219","0.216","0.208","0.199","0.192","0.186","0.190","0.193","0.199","0.213","0.226","0.239","0.251","0.267","0.254","0.247","0.238","0.229","0.218","0.229","0.201","0.175","0.145","0.160","0.184","0.195","0.186","0.190","0.180","0.176","0.183","0.181","0.173","0.169","0.176","0.183","0.191","0.191","0.184","0.177","0.185","0.191","0.188","0.179","0.178","0.195","0.226","0.261","0.234","0.219","0.209","0.206","0.206","0.197","0.176","0.186","0.204","0.230","0.250","0.263","0.253","0.260","0.262","0.249","0.237","0.226","0.217","0.213","0.211","0.205","0.189","0.189","0.191","0.189","0.187","0.187","0.188","0.199","0.207","0.198","0.186","0.200","0.217","0.234","0.235","0.228","0.176","0.093","0.143","0.199","0.224","0.238","0.260","0.289","0.298","0.268","0.248","0.237","0.229","0.217","0.192","0.206","0.230","0.246","0.256","0.257","0.249","0.233","0.213","0.226","0.238","0.245","0.253","0.238","0.208","0.187","0.187","0.206","0.222","0.234","0.214","0.216","0.214","0.167","0.126","0.170","0.212","0.227","0.237","0.227","0.210","0.191","0.173","0.186","0.191","0.187","0.179","0.170","0.156","0.177","0.188","0.196","0.206","0.196","0.181","0.164","0.173","0.159","0.190","0.214","0.210","0.197","0.206","0.213","0.204","0.184","0.159","0.116","0.096","0.120","0.132","0.135","0.162","0.179","0.205","0.192","0.185","0.178","0.166","0.149","0.138","0.150","0.149","0.145","0.132","0.143","0.184","0.177","0.156","0.122","0.124","0.148","0.165","0.136","0.113","0.099","0.085","0.072","0.075","0.087","0.111","0.137","0.188","0.247","0.331","0.370","0.435","0.490","0.580","0.562","0.551","0.587","0.528","0.483","0.563","0.642","0.367","0.180","0.219","0.269","0.310","0.280","0.221","0.187","0.210","0.238","0.256","0.267","0.242","0.214","0.183","0.151","0.255","0.314","0.349","0.358","0.338","0.298","0.280","0.257","0.223","0.129","0.027","0.320","0.342","0.303","0.212","0.156","0.107","0.108","0.119","0.135","0.150","0.137","0.160","0.187","0.174","0.191","0.212","0.204","0.199","0.295","0.388","0.606","0.662","0.492","0.333","0.271","0.199","0.180","0.208","0.224","0.211","0.189","0.168","0.144","0.172","0.290","0.379","0.296","0.217","0.175","0.202","0.225","0.238","0.250","0.240","0.227","0.248","0.267","0.263","0.243","0.222","0.249","0.237","0.196","0.165","0.143","0.139","0.152","0.163","0.134","0.088","0.070","0.120","0.166","0.170","0.159","0.150","0.152","0.169","0.179","0.150","0.154","0.164","0.174","0.181","0.189","0.198","0.203","0.209","0.214","0.193","0.092","0.058","0.031","0.016","0.047","0.094","0.111","0.141","0.170","0.185","0.196","0.209","0.201","0.184","0.198","0.208","0.193","0.169","0.136","0.120","0.268","0.364","0.476","0.385","0.352","0.303","0.276","0.249","0.225","0.196","0.147","0.096","0.172","0.199","0.231","0.264","0.254","0.244","0.230","0.221","0.325","0.490","0.519","0.768","0.734","0.729","0.783","0.703","0.773","0.810","0.461","0.323","0.256","0.241","0.209","0.232","0.235","0.231","0.226","0.222","0.241","0.321","0.435","0.451","0.488","0.315","0.251","0.198","0.185","0.177","0.163","0.152","0.161","0.172","0.183","0.201","0.198","0.206","0.310","0.336","0.332","0.509","0.595","0.340","0.224","0.160","0.004","0.010","0.018","0.021","0.015","0.003","-0.005","-0.005","0.009","0.019","0.014","0.005","-0.011","-0.010","-0.004","0.000","0.007","0.017","0.023","0.028","0.036"],"PHIN":["0.457","0.456","0.452","0.475","0.484","0.474","0.461","0.471","0.448","0.478","0.552","0.458","0.429","0.385","0.329","0.355","0.481","0.536","0.565","0.578","0.573","0.538","0.458","0.444","0.440","0.440","0.435","0.418","0.424","0.477","0.464","0.419","0.430","0.441","0.439","0.426","0.404","0.467","0.487","0.510","0.480","0.442","0.428","0.408","0.435","0.452","0.436","0.426","0.411","0.368","0.304","0.257","0.340","0.380","0.421","0.401","0.402","0.408","0.404","0.394","0.391","0.380","0.466","0.519","0.486","0.432","0.386","0.381","0.390","0.408","0.430","0.432","0.414","0.392","0.369","0.366","0.369","0.370","0.401","0.408","0.397","0.403","0.393","0.361","0.338","0.361","0.375","0.361","0.336","0.343","0.383","0.509","0.500","0.528","0.521","0.413","0.391","0.403","0.374","0.352","0.331","0.314","0.306","0.340","0.354","0.358","0.345","0.350","0.359","0.358","0.361","0.383","0.421","0.435","0.410","0.385","0.365","0.391","0.439","0.514","0.564","0.601","0.648","0.672","0.512","0.436","0.421","0.416","0.436","0.451","0.443","0.435","0.444","0.449","0.421","0.435","0.451","0.454","0.445","0.426","0.451","0.487","0.477","0.449","0.428","0.398","0.431","0.452","0.417","0.405","0.399","0.393","0.404","0.418","0.433","0.452","0.461","0.434","0.421","0.429","0.450","0.453","0.419","0.437","0.415","0.381","0.400","0.419","0.407","0.417","0.426","0.428","0.421","0.412","0.407","0.401","0.402","0.416","0.498","0.546","0.575","0.463","0.435","0.453","0.456","0.455","0.448","0.430","0.406","0.384","0.397","0.402","0.419","0.416","0.425","0.418","0.405","0.395","0.427","0.458","0.463","0.407","0.360","0.381","0.434","0.438","0.417","0.415","0.400","0.369","0.391","0.412","0.428","0.427","0.411","0.397","0.409","0.398","0.391","0.412","0.412","0.393","0.404","0.399","0.401","0.435","0.368","0.317","0.152","0.179","0.268","0.358","0.389","0.380","0.396","0.392","0.389","0.402","0.414","0.393","0.384","0.403","0.410","0.406","0.404","0.408","0.412","0.413","0.407","0.407","0.433","0.453","0.440","0.429","0.437","0.448","0.431","0.401","0.378","0.411","0.421","0.424","0.432","0.443","0.435","0.415","0.400","0.413","0.552","0.622","0.617","0.516","0.434","0.417","0.416","0.448","0.458","0.456","0.446","0.428","0.415","0.398","0.408","0.395","0.397","0.406","0.400","0.387","0.408","0.430","0.438","0.416","0.408","0.421","0.426","0.428","0.435","0.422","0.407","0.416","0.425","0.429","0.445","0.428","0.278","0.210","0.196","0.204","0.237","0.307","0.387","0.400","0.403","0.408","0.415","0.427","0.410","0.394","0.420","0.414","0.365","0.210","0.214","0.197","0.180","0.201","0.289","0.356","0.397","0.419","0.435","0.424","0.426","0.424","0.409","0.417","0.420","0.395","0.418","0.435","0.406","0.400","0.420","0.450","0.424","0.414","0.437","0.467","0.433","0.414","0.401","0.396","0.408","0.421","0.416","0.417","0.425","0.437","0.449","0.431","0.415","0.398","0.403","0.424","0.417","0.399","0.394","0.406","0.395","0.404","0.423","0.468","0.509","0.468","0.449","0.442","0.432","0.431","0.444","0.481","0.479","0.459","0.447","0.428","0.416","0.444","0.444","0.427","0.422","0.451","0.457","0.457","0.447","0.426","0.447","0.456","0.436","0.416","0.400","0.436","0.464","0.443","0.430","0.447","0.374","0.257","0.246","0.306","0.378","0.431","0.434","0.434","0.433","0.437","0.443","0.448","0.442","0.429","0.413","0.396","0.404","0.430","0.450","0.457","0.461","0.463","0.455","0.425","0.402","0.411","0.432","0.404","0.397","0.414","0.428","0.441","0.410","0.410","0.428","0.444","0.455","0.447","0.433","0.431","0.441","0.453","0.460","0.459","0.449","0.443","0.438","0.423","0.415","0.405","0.394","0.376","0.380","0.393","0.400","0.408","0.410","0.417","0.421","0.401","0.387","0.391","0.416","0.434","0.434","0.429","0.440","0.428","0.410","0.402","0.414","0.402","0.413","0.428","0.443","0.418","0.400","0.402","0.428","0.440","0.452","0.461","0.458","0.442","0.425","0.404","0.418","0.403","0.399","0.410","0.418","0.424","0.423","0.402","0.403","0.417","0.426","0.438","0.426","0.410","0.420","0.430","0.434","0.421","0.408","0.435","0.446","0.433","0.448","0.452","0.447","0.439","0.427","0.415","0.421","0.450","0.448","0.431","0.413","0.400","0.403","0.435","0.420","0.413","0.410","0.402","0.393","0.397","0.404","0.407","0.411","0.422","0.438","0.387","0.336","0.270","0.289","0.325","0.424","0.452","0.457","0.441","0.427","0.413","0.408","0.416","0.424","0.441","0.464","0.445","0.425","0.417","0.416","0.417","0.416","0.424","0.446","0.435","0.437","0.434","0.421","0.429","0.422","0.406","0.413","0.409","0.397","0.424","0.459","0.403","0.375","0.352","0.405","0.457","0.271","0.266","0.376","0.405","0.409","0.400","0.398","0.415","0.428","0.439","0.406","0.390","0.396","0.423","0.448","0.429","0.443","0.460","0.427","0.416","0.434","0.447","0.429","0.419","0.406","0.391","0.420","0.411","0.397","0.412","0.434","0.456","0.451","0.430","0.420","0.424","0.442","0.443","0.435","0.448","0.462","0.465","0.443","0.421","0.419","0.431","0.431","0.427","0.438","0.448","0.450","0.431","0.409","0.399","0.385","0.403","0.427","0.449","0.427","0.409","0.397","0.410","0.438","0.296","0.298","0.340","0.392","0.420","0.426","0.434","0.437","0.417","0.394","0.421","0.454","0.444","0.435","0.461","0.481","0.475","0.437","0.397","0.399","0.421","0.441","0.455","0.470","0.452","0.478","0.510","0.494","0.455","0.440","0.451","0.449","0.435","0.428","0.440","0.452","0.448","0.435","0.436","0.450","0.455","0.410","0.387","0.365","0.338","0.340","0.372","0.393","0.407","0.412","0.415","0.411","0.400","0.387","0.379","0.396","0.402","0.410","0.431","0.408","0.394","0.381","0.371","0.382","0.382","0.320","0.278","0.297","0.341","0.394","0.416","0.424","0.431","0.453","0.457","0.428","0.418","0.413","0.390","0.364","0.346","0.374","0.426","0.439","0.429","0.411","0.395","0.382","0.364","0.393","0.388","0.394","0.407","0.438","0.424","0.416","0.409","0.402","0.404","0.401","0.386","0.358","0.312","0.278","0.341","0.371","0.387","0.404","0.394","0.391","0.407","0.392","0.369","0.360","0.349","0.343","0.348","0.375","0.393","0.409","0.401","0.390","0.412","0.406","0.387","0.378","0.385","0.389","0.405","0.394","0.390","0.408","0.401","0.392","0.383","0.357","0.314","0.306","0.330","0.326","0.308","0.312","0.334","0.370","0.353","0.339","0.327","0.356","0.387","0.348","0.330","0.345","0.318","0.301","0.337","0.401","0.432","0.383","0.328","0.310","0.351","0.396","0.371","0.355","0.368","0.344","0.326","0.321","0.328","0.330","0.320","0.314","0.372","0.446","0.466","0.479","0.507","0.548","0.579","0.579","0.548","0.586","0.513","0.487","0.652","0.371","0.353","0.367","0.390","0.400","0.403","0.399","0.372","0.361","0.395","0.409","0.391","0.383","0.372","0.366","0.346","0.323","0.297","0.400","0.441","0.463","0.459","0.439","0.425","0.412","0.392","0.346","0.416","0.443","0.437","0.336","0.349","0.358","0.331","0.345","0.358","0.368","0.365","0.342","0.366","0.365","0.328","0.312","0.312","0.308","0.302","0.285","0.278","0.449","0.550","0.467","0.393","0.348","0.336","0.323","0.317","0.301","0.282","0.252","0.235","0.243","0.286","0.376","0.344","0.322","0.307","0.310","0.320","0.333","0.338","0.321","0.327","0.338","0.347","0.345","0.332","0.312","0.299","0.314","0.329","0.329","0.328","0.333","0.345","0.362","0.299","0.273","0.221","0.228","0.297","0.308","0.291","0.265","0.253","0.278","0.300","0.324","0.338","0.345","0.327","0.307","0.307","0.318","0.315","0.298","0.307","0.317","0.289","0.192","0.154","0.178","0.237","0.272","0.297","0.322","0.361","0.325","0.333","0.325","0.276","0.276","0.307","0.315","0.276","0.276","0.310","0.345","0.367","0.499","0.530","0.467","0.355","0.310","0.289","0.266","0.248","0.237","0.228","0.254","0.287","0.304","0.299","0.292","0.293","0.312","0.311","0.295","0.272","0.323","0.370","0.557","0.549","0.566","0.557","0.536","0.546","0.539","0.576","0.627","0.443","0.286","0.298","0.299","0.295","0.285","0.277","0.272","0.297","0.402","0.433","0.480","0.467","0.545","0.483","0.358","0.305","0.303","0.291","0.281","0.283","0.298","0.295","0.281","0.278","0.300","0.329","0.399","0.390","0.381","0.381","0.535","0.240","0.203","0.152","0.090","0.091","0.097","0.088","0.065","0.055","0.053","0.056","0.062","0.067","0.072","0.074","0.074","0.075","0.079","0.088","0.098","0.111","0.126","0.146","0.166"],"GR":["82.478","86.413","90.229","90.944","88.866","82.638","83.345","88.403","91.038","89.579","84.092","78.479","72.249","69.179","67.349","58.390","54.888","61.614","68.592","60.065","53.025","64.902","81.805","85.120","76.965","71.476","69.652","68.996","69.709","70.504","70.950","68.689","65.494","61.810","62.210","65.527","70.460","72.472","72.876","69.745","64.755","64.783","65.746","67.389","68.414","69.559","68.475","64.971","61.780","58.398","51.237","45.191","45.474","51.519","57.687","63.922","62.958","56.916","54.898","53.010","51.303","52.635","59.803","64.915","73.006","59.894","53.101","47.489","44.979","49.847","58.563","51.026","44.359","44.021","46.097","53.200","59.119","69.196","73.198","73.786","72.827","68.639","56.950","46.131","38.227","33.108","38.535","47.499","56.952","74.906","81.757","87.990","96.765","90.659","88.705","86.381","78.131","78.131","76.861","65.360","53.732","37.332","59.934","69.144","67.499","51.655","37.920","32.929","40.160","49.489","61.672","70.198","82.883","77.207","70.293","66.975","69.053","74.793","81.579","86.821","80.526","74.295","64.963","55.816","59.940","64.005","64.903","67.665","70.483","69.460","69.369","69.588","70.859","69.526","67.323","66.242","66.144","66.113","70.300","73.989","74.826","74.362","72.285","63.882","56.969","55.950","55.295","54.147","54.552","55.701","56.475","58.368","58.833","58.868","59.949","58.801","58.274","58.805","59.578","60.726","60.631","60.105","58.279","53.906","49.970","50.808","54.808","57.193","59.767","62.032","61.815","58.624","57.663","58.375","60.763","63.087","65.102","69.601","73.292","75.055","74.779","74.561","75.708","77.722","80.049","76.175","67.153","60.052","52.393","45.416","43.775","43.805","44.217","45.667","47.372","48.770","49.914","51.807","55.561","60.552","63.123","54.538","48.800","44.122","42.289","49.390","50.107","48.092","46.638","45.550","41.860","42.947","45.082","48.958","49.672","43.878","43.781","46.917","47.942","44.433","44.157","47.286","50.852","46.920","45.340","47.167","50.791","45.802","43.232","42.949","44.849","46.173","48.809","49.460","45.832","42.269","45.215","48.099","46.578","45.248","44.846","45.685","46.086","46.303","46.644","48.352","47.699","47.609","48.760","50.024","51.852","54.242","58.736","54.241","51.606","49.224","47.391","45.065","46.835","49.406","50.865","51.085","51.553","52.383","53.221","51.706","50.682","49.658","55.952","62.062","68.664","75.208","79.208","81.600","82.555","83.643","81.132","74.463","68.481","61.755","56.699","55.987","56.453","56.729","54.343","54.808","56.143","55.987","55.715","56.489","57.514","58.905","63.711","65.605","64.147","61.759","58.195","55.498","57.262","59.526","59.742","57.294","56.457","55.933","52.736","46.752","41.762","38.693","43.807","50.477","54.910","54.011","53.736","54.444","55.289","55.441","55.779","56.368","56.956","56.496","54.358","47.563","45.054","46.261","47.285","47.565","50.079","52.775","56.156","49.118","44.934","46.513","57.333","63.442","62.358","62.201","63.412","63.940","65.148","67.536","69.430","65.180","62.734","66.425","70.794","72.066","74.141","74.111","68.003","65.058","68.997","65.742","62.423","63.513","66.269","73.557","73.959","69.220","65.962","66.612","70.178","72.691","72.288","68.535","63.669","59.110","57.840","56.506","54.925","55.266","56.788","63.018","61.314","56.445","56.913","58.494","57.594","56.758","57.721","60.107","63.610","69.968","64.231","57.812","53.319","53.288","56.853","60.361","60.015","58.437","59.335","61.227","57.662","58.687","63.058","68.172","65.601","59.182","56.982","56.334","55.932","56.579","61.077","71.523","64.114","61.788","64.237","67.249","65.788","58.752","60.085","69.745","65.854","65.086","65.793","67.747","69.698","70.417","70.442","69.797","68.335","65.514","64.614","68.245","70.444","70.165","68.524","66.325","64.494","63.035","64.494","67.134","70.697","71.966","70.698","65.951","68.217","68.746","69.150","70.918","72.186","72.157","72.186","72.589","72.558","71.785","71.013","70.234","69.091","67.077","64.815","63.041","60.597","59.390","58.861","58.395","58.487","59.208","60.593","63.540","65.934","66.088","66.920","69.311","71.389","72.534","73.311","73.535","73.374","71.667","68.600","64.040","58.182","56.600","54.277","53.439","54.772","56.603","55.887","53.439","51.860","52.758","54.089","56.108","57.382","58.157","58.556","58.967","59.176","59.208","58.744","57.476","56.200","55.987","57.566","56.295","51.179","52.141","54.097","55.429","55.834","56.180","56.700","57.849","58.129","57.913","55.089","49.849","51.746","53.015","49.884","48.052","51.060","53.822","55.404","55.374","54.041","52.086","48.955","49.173","51.558","51.280","50.632","51.097","54.292","60.087","59.002","55.747","51.065","51.035","52.120","55.561","55.469","52.154","51.502","53.455","57.085","62.322","65.767","64.743","71.159","72.681","71.038","67.471","59.750","59.537","61.364","61.830","62.051","62.264","61.612","57.180","57.400","58.608","59.879","61.401","62.857","65.251","67.323","69.025","65.336","62.515","61.307","64.066","68.004","69.524","64.845","60.286","61.185","65.310","65.897","61.835","64.907","64.255","61.310","63.637","68.072","62.398","55.114","49.126","61.375","66.924","71.856","71.886","72.231","73.318","74.030","73.995","70.932","68.913","68.511","71.329","74.771","76.415","76.386","76.667","76.201","73.443","69.689","64.701","62.434","66.560","71.053","72.758","68.388","63.025","66.716","70.218","72.117","72.642","72.608","71.337","72.919","76.114","76.703","74.193","72.242","71.713","71.307","74.252","77.697","77.663","78.935","79.091","74.720","74.068","77.015","79.527","83.277","84.178","80.673","78.224","78.255","80.955","80.059","78.166","76.644","72.771","67.219","61.050","55.811","56.461","66.042","74.882","78.387","81.084","81.732","82.138","79.500","76.121","72.928","72.838","74.667","78.107","80.061","81.332","82.170","81.766","79.255","78.854","80.868","81.023","76.591","75.257","78.016","78.234","74.546","75.817","79.136","76.563","74.237","73.523","73.678","75.322","76.533","72.287","67.417","62.614","57.311","55.418","56.317","55.981","54.768","54.739","53.839","53.312","57.128","60.944","62.211","63.548","64.260","64.788","65.687","67.142","72.694","74.089","71.457","69.687","68.417","67.331","65.317","61.625","56.823","56.730","55.706","53.007","50.682","47.923","49.444","54.065","58.375","61.008","57.446","54.192","58.063","58.777","56.769","56.112","56.638","57.106","57.879","56.485","54.967","54.377","55.465","58.843","66.686","61.077","57.695","58.787","60.305","60.705","60.550","60.151","59.683","59.159","57.822","52.584","52.056","57.049","61.854","62.444","60.059","58.043","56.586","54.945","54.352","54.882","56.030","57.303","57.827","56.555","52.556","53.950","55.225","55.998","56.528","56.313","56.530","60.467","64.590","64.620","60.869","59.475","63.667","67.787","72.651","78.081","79.909","80.807","81.709","82.798","83.507","83.040","78.483","75.352","72.472","70.083","67.384","66.609","70.858","74.797","77.557","76.100","74.207","71.760","68.254","68.412","71.480","74.302","76.069","71.263","71.173","72.628","72.969","73.248","75.080","77.902","76.569","71.637","70.619","71.763","74.837","77.592","81.470","83.177","80.166","73.316","70.927","73.006","77.255","80.634","83.703","88.137","91.703","93.408","85.750","77.535","68.823","62.651","63.117","66.003","67.832","78.466","77.323","68.111","65.544","67.243","69.942","71.959","72.737","73.571","74.096","74.690","74.717","75.182","76.022","77.602","81.913","77.727","77.945","78.712","73.907","71.080","69.931","72.686","77.476","81.341","80.874","77.987","76.710","75.867","73.415","69.224","67.328","71.755","76.612","79.795","82.857","85.980","89.351","89.439","88.532","93.824","90.261","86.811","79.159","68.709","57.457","50.667","46.169","41.485","38.907","48.970","63.865","74.980","77.608","60.284","50.150","43.420","36.322","31.017","27.387","28.898","33.136","35.518","30.895","37.921","53.933","61.827","68.914","65.345","55.890","53.003","52.162","50.389","47.379","48.023","50.466","46.773","47.604","49.425","47.655","47.495","50.802","55.722","59.340","62.031","65.399","71.063","69.416","55.066","44.311","35.105","30.668","32.242","37.161","42.642","48.800","55.703","62.048","67.213","72.938","80.584","61.962","56.471","56.189","61.169","68.380","68.777","61.676","56.002","56.212","49.918","42.326","38.258","38.784","42.711","49.239","57.195","58.396","53.530","49.526","44.904","41.213","38.761","37.295","36.826","38.648","44.249","54.993","63.568","68.982","60.582","51.439","45.328","36.183","27.597","29.670","26.782","22.342","21.997","25.369","36.670","50.821","55.184","40.772","30.761","24.031","26.287","29.720","31.297","32.249","34.009","38.989","45.892","53.290","64.653","66.973","62.475","60.019","61.843","65.216","67.406","68.545","60.827","50.073","39.625","37.605","38.814","38.089","37.127","38.514","41.882","46.989","48.010","46.481","43.718","42.875","41.227","39.148","40.596","44.901","43.312","36.769","33.757","34.526","39.695","38.792","36.893","36.735","36.451","36.287","39.349","44.704","45.471","42.831","39.077","38.421","35.038","29.673","29.823","31.520","31.854","30.642","29.116","28.460","27.370","25.415","23.640","26.889","29.639","31.711","33.344","36.037","38.599","41.662","46.210","51.129","58.340","64.622"],"CAL":["238.379","238.331","238.069","238.752","239.724","241.951","244.478","247.116","250.475","254.764","258.019","260.143","256.370","253.120","252.442","253.526","256.377","261.799","272.700","300.036","267.431","355.538","384.114","387.164","256.995","238.548","275.286","260.768","247.176","244.445","245.215","247.332","249.248","248.998","249.046","250.229","252.661","256.950","265.992","275.241","269.713","249.406","235.404","235.040","234.264","234.433","233.854","233.806","237.163","238.969","239.233","240.113","241.102","242.288","245.137","246.315","248.127","249.829","250.297","250.047","250.192","250.757","255.049","264.307","287.399","294.169","259.908","239.288","238.415","239.188","240.284","240.947","241.827","242.502","243.167","243.965","244.312","244.565","244.823","244.979","244.514","244.468","244.421","244.574","244.623","244.467","244.213","245.514","246.793","251.293","257.854","270.101","286.791","323.020","323.895","306.173","272.324","256.668","253.831","254.084","254.554","254.196","252.697","250.369","246.704","244.580","243.391","242.832","242.881","243.347","243.820","244.377","246.089","247.682","251.055","253.059","255.086","256.679","260.035","271.561","303.443","320.241","297.967","275.906","250.737","247.481","246.819","247.897","248.572","249.033","249.292","249.663","249.710","249.872","250.442","250.285","250.645","252.142","252.709","254.731","259.950","263.923","257.877","252.873","250.333","248.009","246.725","246.163","246.123","246.161","246.209","246.151","246.109","246.364","246.619","246.779","247.038","247.292","247.452","248.135","248.481","249.058","249.411","249.379","249.217","249.155","249.221","249.368","249.849","250.200","250.664","250.927","250.768","250.815","250.243","250.713","250.762","260.426","276.189","305.489","325.491","283.581","266.682","262.912","258.322","253.715","249.330","248.136","248.090","248.136","248.600","249.687","250.465","250.723","251.189","251.553","251.910","252.586","253.462","254.244","254.703","254.443","253.163","251.873","250.894","250.326","250.156","250.117","250.054","250.012","249.863","249.503","248.826","248.361","248.110","248.155","248.319","248.356","248.217","248.160","248.102","247.652","247.379","247.127","247.271","247.435","247.906","247.949","247.902","247.645","247.278","247.225","247.383","247.856","248.005","248.474","248.828","249.506","249.462","249.202","248.838","248.579","247.929","247.763","247.500","247.339","247.095","246.928","246.870","247.231","247.593","247.749","247.807","247.453","247.185","246.941","246.683","246.626","246.889","247.465","248.244","248.601","248.963","249.317","249.780","250.031","250.805","259.441","276.438","296.953","285.843","273.187","262.177","257.794","258.985","258.616","256.500","253.963","250.920","247.555","247.095","248.177","247.505","246.644","246.587","246.639","247.096","247.785","248.352","248.815","249.059","249.347","249.284","249.222","248.756","248.290","247.937","247.470","247.309","247.154","246.899","246.858","246.803","246.949","247.210","247.579","247.942","248.088","248.360","248.399","248.459","248.722","249.076","249.332","249.921","250.383","250.833","251.200","251.252","251.299","251.359","251.312","251.257","251.504","251.465","251.300","251.464","252.752","254.873","256.262","258.395","259.373","260.154","260.826","261.178","261.329","261.381","262.056","262.325","262.373","262.428","262.058","261.706","261.563","261.492","261.443","261.503","261.542","261.698","263.004","263.978","264.851","266.047","266.715","267.189","267.544","268.734","270.131","271.313","272.194","269.661","265.579","261.708","257.530","253.849","249.975","250.031","250.389","250.657","250.910","251.063","251.119","250.856","250.598","250.030","249.368","249.207","249.153","249.417","249.878","250.040","250.096","250.037","250.194","250.462","250.720","251.072","252.671","254.084","254.548","254.915","255.055","255.116","255.158","255.211","254.641","254.175","253.620","253.355","253.715","257.279","260.132","261.940","263.028","263.592","263.641","262.867","264.784","267.732","269.842","271.857","273.054","274.245","275.329","276.105","276.462","276.616","276.564","276.409","276.372","276.318","276.166","276.222","276.269","276.721","277.198","277.445","277.916","278.482","278.840","279.418","279.669","279.835","279.789","279.724","279.877","280.658","280.498","279.934","279.887","279.829","279.987","279.834","279.471","277.777","276.478","276.111","275.237","274.464","274.203","274.461","275.130","275.492","275.657","276.432","277.000","277.257","276.594","275.499","272.863","270.023","268.729","267.649","266.769","266.618","266.572","266.199","264.611","263.313","262.227","261.445","260.879","260.726","261.203","262.282","264.193","265.168","266.470","267.447","268.532","268.996","269.047","268.595","268.017","268.179","268.848","270.037","271.434","273.351","274.745","276.028","277.543","278.412","279.598","280.581","280.941","281.621","281.771","281.615","281.675","281.523","281.468","281.013","280.655","280.685","280.535","280.694","280.538","280.587","280.441","280.798","281.259","281.628","281.681","281.834","281.881","282.241","282.815","283.799","284.471","284.832","284.366","283.285","282.301","281.217","280.340","280.086","279.933","279.983","280.239","280.084","279.824","279.460","279.112","278.744","278.693","278.843","278.893","278.852","278.692","278.739","278.794","278.854","278.596","278.649","279.007","279.058","279.725","280.717","281.591","282.259","282.621","282.574","283.141","284.960","286.761","289.288","292.345","293.743","293.063","288.879","286.449","285.365","285.428","285.676","285.935","286.300","286.358","286.307","286.358","286.509","286.557","286.411","286.153","286.203","285.846","285.270","284.501","284.031","284.401","284.966","286.578","287.554","288.740","289.723","290.503","290.969","291.431","291.784","292.047","292.109","292.050","292.102","292.157","292.317","292.673","292.624","292.564","292.209","291.952","291.586","291.229","291.172","291.227","292.414","292.155","292.317","292.883","293.349","293.620","294.183","294.647","295.423","296.297","296.758","296.914","296.662","296.206","295.839","295.367","294.402","293.617","292.949","292.378","291.805","290.622","289.735","288.461","287.567","286.276","285.000","284.422","283.955","283.695","283.652","283.695","283.539","283.592","284.161","285.247","286.857","288.252","290.479","292.792","296.268","297.963","299.563","301.383","303.082","305.207","307.110","309.349","310.635","311.711","313.328","314.510","315.902","318.240","319.951","321.555","322.738","323.293","324.181","324.958","325.731","326.619","327.593","329.296","330.895","332.597","334.521","336.121","338.023","341.692","346.201","349.971","352.807","355.442","355.913","355.029","348.682","343.978","342.072","341.181","340.822","340.882","341.035","341.397","341.768","341.815","341.552","341.193","340.834","340.575","340.411","340.265","340.011","340.674","341.552","341.293","339.897","336.650","335.256","334.072","333.702","333.350","333.499","334.381","335.874","337.474","339.599","341.927","343.634","344.918","346.002","346.573","345.077","341.517","339.707","338.201","336.602","335.733","335.464","335.211","335.169","335.315","335.468","335.724","336.097","336.248","336.303","336.355","336.406","336.661","336.915","337.081","336.716","336.556","336.822","337.185","337.853","338.321","338.885","339.871","340.643","340.698","340.544","340.694","341.065","341.129","341.378","341.432","341.371","340.305","338.579","332.132","327.632","324.992","324.123","323.759","323.288","322.511","321.230","319.928","316.988","315.080","313.792","313.116","312.657","312.908","313.583","314.048","312.962","310.322","306.758","304.640","303.977","303.509","302.219","301.234","300.458","299.686","299.633","299.892","300.777","301.655","302.433","302.992","303.469","303.616","303.767","304.343","304.497","304.443","304.599","305.180","305.631","305.786","305.633","305.273","304.918","304.561","304.187","304.048","304.195","304.551","305.338","306.108","307.714","309.106","310.496","312.202","313.907","316.962","320.526","327.501","339.748","359.538","381.813","411.838","412.407","357.163","371.168","373.707","347.914","352.618","388.540","385.384","361.253","330.503","343.271","344.671","340.378","331.645","327.355","331.022","337.799","341.151","344.210","340.119","330.975","322.179","317.361","317.815","328.493","343.715","331.577","323.455","321.650","320.140","317.599","314.541","310.658","306.775","302.476","320.695","317.122","309.112","304.296","300.002","297.875","296.791","297.548","298.723","298.870","299.841","302.257","302.506","286.953","273.467","266.490","263.849","263.066","267.544","284.313","328.035","328.387","309.015","289.539","268.619","288.383","276.036","264.517","255.365","246.936","246.989","247.646","247.167","246.485","245.816","245.640","245.373","244.999","244.222","243.958","243.892","243.932","244.907","245.779","245.719","245.135","244.343","243.563","242.675","242.197","242.761","243.114","243.151","242.986","242.921","243.381","243.629","244.605","244.742","244.783","245.031","244.670","244.187","243.818","243.964","244.932","246.733","250.697","251.045","248.820","248.346","248.075","247.298","246.615","245.839","245.466","245.192","244.918","244.548","244.081","244.634","245.711","246.158","246.207","246.039","245.363","245.088","244.208","243.418","242.528","242.266","242.405","242.859","242.605","242.441","242.684","243.037","243.070","242.817","242.844","242.590","242.619","242.562","242.187","242.017","241.867","241.792","241.633","241.676","241.725","242.379","242.834","243.075","243.127","243.468","243.823","244.284","244.940","246.429","251.733","287.916","337.009","355.640","336.988","386.493","349.360","309.955","311.236","356.301","311.529","291.122","285.489","287.290","288.671","289.647","290.405","291.373","292.346","294.351","296.252","297.737","300.266","301.748","302.510","301.109","300.423","300.780","300.821","300.761","300.495","300.950","301.398","301.028","300.345","299.975","300.945","302.742","308.678","313.676","318.156","323.667","322.469","297.419","280.114","269.312","261.816","259.588","259.529","259.575","259.714","259.446","259.277","258.502","258.226","258.369","258.517","259.086","259.426","260.405","261.784","263.173","264.141","264.697","265.467","266.024","266.581"],"RESD":["2.923","2.925","2.917","2.898","2.890","2.844","2.748","2.725","2.748","2.845","2.939","3.088","3.338","3.580","3.870","4.097","3.848","3.267","2.853","2.630","2.502","2.431","2.429","2.490","2.687","2.807","2.972","3.129","3.276","3.310","3.395","3.548","3.763","4.113","4.436","4.706","4.702","4.558","4.179","3.903","3.693","3.554","3.531","3.581","3.707","3.787","3.950","4.334","4.964","5.590","5.997","6.092","6.132","6.069","5.711","5.062","4.503","4.238","4.140","4.206","4.306","4.253","4.171","4.044","3.936","3.881","3.834","3.845","3.906","3.895","3.885","3.902","3.965","4.167","4.503","4.996","5.380","5.600","5.585","5.275","4.973","4.662","4.226","3.924","3.645","3.501","3.524","3.731","3.965","4.090","4.101","3.991","3.728","3.423","3.357","3.759","4.155","4.786","5.299","5.825","6.178","6.196","5.864","5.579","4.991","4.375","3.987","3.731","3.511","3.587","3.841","4.136","4.429","4.653","4.844","5.006","5.106","4.804","4.330","3.514","2.906","2.699","2.858","3.183","3.484","4.237","4.675","4.174","3.921","4.082","4.265","4.416","4.454","4.407","4.314","4.206","4.071","3.991","3.798","3.662","3.511","3.475","3.485","3.601","3.841","4.246","4.512","4.619","4.675","4.670","4.649","4.627","4.623","4.601","4.597","4.576","4.554","4.541","4.546","4.558","4.563","4.567","4.580","4.601","4.648","4.715","4.755","4.785","4.817","4.848","4.891","4.905","4.908","4.913","4.881","4.849","4.808","4.584","4.139","3.655","3.138","3.118","3.407","3.745","4.116","4.741","5.019","5.024","5.086","5.129","5.144","5.177","5.231","5.305","5.330","5.304","5.279","5.197","5.048","4.867","4.755","4.723","4.799","4.894","5.038","5.148","5.172","5.217","5.250","5.275","5.280","5.266","5.270","5.295","5.319","5.354","5.340","5.335","5.350","5.365","5.379","5.364","5.319","5.294","5.309","5.445","5.754","6.184","6.759","7.387","8.212","8.792","8.573","7.627","6.835","5.879","5.289","5.052","4.936","4.922","4.917","4.894","4.872","4.877","4.881","4.923","4.944","4.923","4.908","4.867","4.873","4.867","4.863","4.849","4.845","4.830","4.817","4.803","4.808","4.830","4.854","4.831","4.836","4.858","4.872","4.978","5.076","5.186","5.250","5.207","5.001","4.688","4.563","4.499","4.420","4.375","4.346","4.358","4.379","4.366","4.370","4.391","4.420","4.350","4.313","4.230","4.210","4.206","4.163","4.082","3.980","3.902","3.841","3.816","3.820","3.816","3.841","3.896","3.973","4.044","4.124","4.183","4.211","4.254","4.289","4.367","4.478","4.679","4.935","5.579","6.132","6.579","6.784","6.230","5.819","5.435","5.028","4.592","4.139","4.006","4.225","4.867","5.379","6.024","7.004","8.158","9.290","11.361","14.668","12.131","9.717","7.237","6.041","5.090","4.428","4.066","3.812","3.696","3.686","3.731","3.805","3.902","4.009","4.222","4.321","4.366","4.403","4.448","4.486","4.524","4.528","4.533","4.563","4.567","4.605","4.610","4.640","4.679","4.727","4.688","4.597","4.449","4.354","4.383","4.436","4.550","4.545","4.358","4.109","3.961","3.891","3.837","3.841","3.925","4.002","4.113","4.178","4.253","4.314","4.309","4.233","4.174","4.109","4.036","3.920","3.815","3.713","3.634","3.544","3.514","3.452","3.379","3.332","3.268","3.222","3.206","3.167","3.182","3.191","3.212","3.227","3.285","3.363","3.507","3.798","4.143","4.537","4.803","5.211","5.506","5.615","5.215","4.444","4.043","3.920","3.830","3.776","3.766","3.805","3.851","3.898","3.961","3.987","4.021","4.047","4.081","4.132","4.182","4.233","4.285","4.354","4.473","4.683","4.996","4.736","4.383","4.281","4.214","4.186","4.159","4.155","4.166","4.178","4.206","4.186","4.159","4.132","4.082","4.002","3.852","3.748","3.682","3.624","3.580","3.524","3.501","3.517","3.567","3.728","3.895","4.100","4.245","4.265","4.253","4.234","4.229","4.233","4.190","4.139","4.104","4.024","3.917","3.819","3.682","3.543","3.385","3.168","3.077","2.983","2.898","2.831","2.766","2.742","2.745","2.773","2.849","2.983","3.118","3.209","3.366","3.484","3.614","3.755","3.909","4.047","4.135","4.147","4.144","4.116","4.112","4.062","4.013","3.920","3.808","3.638","3.501","3.413","3.378","3.394","3.494","3.638","3.752","3.672","3.662","3.631","3.621","3.610","3.614","3.631","3.675","3.727","3.780","3.833","3.895","3.935","3.969","3.979","4.036","4.116","4.190","4.202","4.112","3.920","3.669","3.465","3.297","3.173","3.194","3.338","3.560","3.995","4.499","5.057","5.138","4.745","4.358","3.972","3.675","3.530","3.527","3.611","3.655","3.699","3.766","3.833","4.006","4.170","4.399","4.554","4.592","4.511","4.399","4.297","4.293","4.428","4.618","4.881","5.061","5.230","5.335","5.420","5.455","5.369","5.274","5.182","5.177","5.269","5.496","5.884","6.444","6.758","6.958","6.809","6.383","5.863","5.506","5.250","5.090","4.991","4.940","4.890","4.867","4.871","4.839","4.780","4.662","4.596","4.465","4.370","4.309","4.265","4.214","4.186","4.166","4.170","4.262","4.338","4.398","4.470","4.490","4.520","4.567","4.666","4.741","4.816","4.857","4.880","4.858","4.844","4.858","4.835","4.804","4.763","4.740","4.719","4.715","4.684","4.661","4.623","4.593","4.554","4.498","4.420","4.390","4.370","4.325","4.313","4.366","4.486","4.750","5.105","5.621","6.063","6.103","5.563","5.119","4.889","4.740","4.545","4.342","4.123","3.858","3.617","3.449","3.319","3.297","3.319","3.404","3.557","3.788","4.047","4.221","4.085","3.816","3.511","3.291","2.994","2.866","3.022","3.328","3.651","3.946","4.234","4.341","4.370","4.466","4.545","4.644","4.807","5.033","5.329","5.579","6.007","6.467","6.783","6.726","6.462","5.923","5.429","4.921","4.640","4.465","4.346","4.285","4.241","4.222","4.241","4.206","4.147","4.120","4.241","4.601","5.029","5.354","5.797","6.431","7.042","7.541","7.477","6.867","6.167","5.579","4.889","4.374","4.092","3.881","3.805","3.873","4.024","4.398","4.898","5.235","5.419","5.355","5.279","5.118","4.781","4.432","4.178","4.066","4.002","3.998","3.994","4.006","4.070","4.237","4.322","4.383","4.419","4.482","4.613","4.794","4.973","5.109","5.279","5.444","5.584","5.579","5.523","5.465","5.379","5.354","5.420","5.600","5.786","5.945","6.040","6.046","5.995","5.802","5.543","5.314","4.963","4.723","4.701","4.884","5.171","5.364","5.378","5.235","4.945","4.723","4.562","4.498","4.596","4.931","5.379","5.857","6.330","6.752","7.297","7.740","7.909","7.698","7.216","6.714","6.413","6.383","6.413","6.552","6.759","6.970","7.229","7.456","7.533","7.484","7.547","7.784","8.074","8.204","8.210","8.096","7.806","7.442","7.394","7.401","7.619","7.990","8.318","8.420","8.165","7.625","6.608","5.444","4.085","3.117","2.474","1.927","1.727","1.622","1.549","1.616","1.721","1.863","2.063","2.444","2.944","3.641","4.265","5.071","5.764","6.046","6.132","6.103","5.985","5.912","5.840","5.857","6.006","6.348","6.679","7.157","7.500","7.185","6.618","5.191","3.937","3.708","3.843","4.141","4.729","5.261","5.842","6.134","6.111","6.021","5.965","6.044","6.453","6.851","7.060","6.776","6.218","5.979","6.092","6.529","7.498","7.990","9.279","10.898","11.922","11.464","8.678","6.948","5.450","4.563","5.020","5.885","7.269","9.114","11.863","13.932","15.674","17.051","17.020","14.685","12.981","11.200","8.967","7.780","7.008","6.126","5.405","4.681","4.154","3.748","3.504","3.332","3.174","3.024","2.974","2.974","3.030","3.169","3.487","3.716","4.042","4.471","5.078","5.565","6.226","6.913","7.634","8.653","9.290","9.000","8.384","7.737","7.220","6.515","6.103","5.858","5.804","5.902","6.208","6.604","6.972","7.091","6.921","6.544","6.459","6.820","7.308","8.424","9.638","10.583","11.427","11.535","9.841","7.938","6.391","5.204","4.465","4.128","3.889","3.760","3.789","3.941","4.091","4.335","4.603","4.933","5.179","5.437","5.581","5.357","4.665","4.086","3.598","3.140","2.791","2.684","2.797","3.182","3.435","3.668","3.872","3.759","3.501","3.411","3.515","3.676","3.824","3.999","4.238","4.491","4.671","4.760","4.932","5.130","5.237","5.247","5.045","4.771","4.345","4.101","4.003","3.981","4.033","4.298","4.598","5.077","5.523","6.260","7.016","7.893","8.913","10.606","12.226","10.372","7.970","6.889","6.205","5.726","5.558","5.548","5.528","5.426","5.198","5.073","5.017","4.924","4.852","4.852","4.916","6.280","7.487","8.777","10.004","11.255","12.381","13.418","14.380","15.154","15.791","16.271","16.517","16.799","16.957","17.182","17.474","17.574","17.608","17.478","17.220","16.934","16.559","15.834","14.449","12.236","10.576"]}} \ No newline at end of file +{ + "VERSION INFORMATION": { + "WRAP": { + "MNEM": "WRAP", + "UNIT": "", + "DATA": "NO", + "DESCRIPTION OF MNEMONIC 1": "ONE LINE PER DEPTH STEP", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "VERS": { + "MNEM": "VERS", + "UNIT": "", + "DATA": "2.0", + "DESCRIPTION OF MNEMONIC 1": "CWLS LOG ASCII STANDARD", + "DESCRIPTION OF MNEMONIC 2": "VERSION 2.0" + } + }, + "WELL INFORMATION BLOCK": { + "GENERATED": " Generated from Intellog Unique Number CW_73_75/WELL/2722", + "WELL": { + "MNEM": "WELL", + "UNIT": "", + "DATA": "CHEVRON MGSU 1 MITSUE 01-01", + "DESCRIPTION OF MNEMONIC 1": "Well_name", + "DESCRIPTION OF MNEMONIC 2": "WELL" + }, + "LOC": { + "MNEM": "LOC", + "UNIT": "", + "DATA": "00/01-01-073-05W5/0", + "DESCRIPTION OF MNEMONIC 1": "Location", + "DESCRIPTION OF MNEMONIC 2": "LOCATION" + }, + "UWI": { + "MNEM": "UWI", + "UNIT": "", + "DATA": "00/01-01-073-05W5/0", + "DESCRIPTION OF MNEMONIC 1": "Uwi", + "DESCRIPTION OF MNEMONIC 2": "UNIQUE WELL ID" + }, + "ENTR": { + "MNEM": "ENTR", + "UNIT": "", + "DATA": "JAYE", + "DESCRIPTION OF MNEMONIC 1": "Entered", + "DESCRIPTION OF MNEMONIC 2": "ENTERED BY" + }, + "SRVC": { + "MNEM": "SRVC", + "UNIT": "", + "DATA": "SCHLUMBERGER", + "DESCRIPTION OF MNEMONIC 1": "Scn", + "DESCRIPTION OF MNEMONIC 2": "SERVICE COMPANY" + }, + "DATE": { + "MNEM": "DATE", + "UNIT": "", + "DATA": "23 DEC 86", + "DESCRIPTION OF MNEMONIC 1": "Date", + "DESCRIPTION OF MNEMONIC 2": "LOG DATE" + }, + "STRT": { + "MNEM": "STRT", + "UNIT": "", + "DATA": "390", + "DESCRIPTION OF MNEMONIC 1": "top_depth", + "DESCRIPTION OF MNEMONIC 2": "START DEPTH" + }, + "STOP": { + "MNEM": "STOP", + "UNIT": "", + "DATA": "650", + "DESCRIPTION OF MNEMONIC 1": "bot_depth", + "DESCRIPTION OF MNEMONIC 2": "STOP DEPTH" + }, + "STEP": { + "MNEM": "STEP", + "UNIT": "", + "DATA": "0.25", + "DESCRIPTION OF MNEMONIC 1": "increment", + "DESCRIPTION OF MNEMONIC 2": "STEP LENGTH" + }, + "NULL": { + "MNEM": "NULL", + "UNIT": ".", + "DATA": ".2500", + "DESCRIPTION OF MNEMONIC 1": "NULL Value", + "DESCRIPTION OF MNEMONIC 2": "" + } + }, + "CURVE INFORMATION BLOCK": { + "DEPT": { + "MNEM": "DEPT", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 001 00 00", + "DESCRIPTION OF MNEMONIC 1": "DEPTH", + "DESCRIPTION OF MNEMONIC 2": "DEPTH" + }, + "DPHI": { + "MNEM": "DPHI", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 890 00 00", + "DESCRIPTION OF MNEMONIC 1": "PHID", + "DESCRIPTION OF MNEMONIC 2": "DENSITY POROSITY (SANDSTONE)" + }, + "NPHI": { + "MNEM": "NPHI", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 330 00 00", + "DESCRIPTION OF MNEMONIC 1": "PHIN", + "DESCRIPTION OF MNEMONIC 2": "NEUTRON POROSITY (SANDSTONE)" + }, + "GR": { + "MNEM": "GR", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 310 00 00", + "DESCRIPTION OF MNEMONIC 1": "GR", + "DESCRIPTION OF MNEMONIC 2": "GAMMA RAY" + }, + "CALI": { + "MNEM": "CALI", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 280 01 00", + "DESCRIPTION OF MNEMONIC 1": "CAL", + "DESCRIPTION OF MNEMONIC 2": "CALIPER" + }, + "ILD": { + "MNEM": "ILD", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 120 00 00", + "DESCRIPTION OF MNEMONIC 1": "RESD", + "DESCRIPTION OF MNEMONIC 2": "DEEP RESISTIVITY (DIL)" + } + }, + "PARAMETER INFORMATION": { + "GL": { + "MNEM": "GL", + "UNIT": "", + "DATA": "583.3", + "DESCRIPTION OF MNEMONIC 1": "gl", + "DESCRIPTION OF MNEMONIC 2": "GROUND LEVEL ELEVATION" + }, + "EREF": { + "MNEM": "EREF", + "UNIT": "", + "DATA": "589", + "DESCRIPTION OF MNEMONIC 1": "kb", + "DESCRIPTION OF MNEMONIC 2": "ELEVATION OF DEPTH REFERENCE" + }, + "DATM": { + "MNEM": "DATM", + "UNIT": "", + "DATA": "583.3", + "DESCRIPTION OF MNEMONIC 1": "datum", + "DESCRIPTION OF MNEMONIC 2": "DATUM ELEVATION" + }, + "TDD": { + "MNEM": "TDD", + "UNIT": "", + "DATA": "733.4", + "DESCRIPTION OF MNEMONIC 1": "tdd", + "DESCRIPTION OF MNEMONIC 2": "TOTAL DEPTH DRILLER" + }, + "RUN": { + "MNEM": "RUN", + "UNIT": "", + "DATA": "ONE", + "DESCRIPTION OF MNEMONIC 1": "Run", + "DESCRIPTION OF MNEMONIC 2": "RUN NUMBER" + }, + "ENG": { + "MNEM": "ENG", + "UNIT": "", + "DATA": "SIMMONS", + "DESCRIPTION OF MNEMONIC 1": "Engineer", + "DESCRIPTION OF MNEMONIC 2": "RECORDING ENGINEER" + }, + "WIT": { + "MNEM": "WIT", + "UNIT": "", + "DATA": "SANK", + "DESCRIPTION OF MNEMONIC 1": "Witness", + "DESCRIPTION OF MNEMONIC 2": "WITNESSED BY" + }, + "BASE": { + "MNEM": "BASE", + "UNIT": "", + "DATA": "S.L", + "DESCRIPTION OF MNEMONIC 1": "Branch", + "DESCRIPTION OF MNEMONIC 2": "HOME BASE OF LOGGING UNIT" + }, + "MUD": { + "MNEM": "MUD", + "UNIT": "", + "DATA": "GEL CHEM", + "DESCRIPTION OF MNEMONIC 1": "Mud_type", + "DESCRIPTION OF MNEMONIC 2": "MUD TYPE" + }, + "MATR": { + "MNEM": "MATR", + "UNIT": "", + "DATA": "SANDSTONE", + "DESCRIPTION OF MNEMONIC 1": "Logunit", + "DESCRIPTION OF MNEMONIC 2": "NEUTRON MATRIX" + }, + "TMAX": { + "MNEM": "TMAX", + "UNIT": "", + "DATA": "41", + "DESCRIPTION OF MNEMONIC 1": "BHT", + "DESCRIPTION OF MNEMONIC 2": "MAXIMUM RECORDED TEMPERATURE" + }, + "BHTD": { + "MNEM": "BHTD", + "UNIT": "", + "DATA": "733.8", + "DESCRIPTION OF MNEMONIC 1": "BHTDEP", + "DESCRIPTION OF MNEMONIC 2": "MAXIMUM RECORDED TEMPERATURE" + }, + "RMT": { + "MNEM": "RMT", + "UNIT": "", + "DATA": "17", + "DESCRIPTION OF MNEMONIC 1": "MDTP", + "DESCRIPTION OF MNEMONIC 2": "TEMPERATURE OF MUD" + }, + "MUDD": { + "MNEM": "MUDD", + "UNIT": "", + "DATA": "1100", + "DESCRIPTION OF MNEMONIC 1": "MWT", + "DESCRIPTION OF MNEMONIC 2": "MUD DENSITY" + }, + "NEUT": { + "MNEM": "NEUT", + "UNIT": "", + "DATA": "1", + "DESCRIPTION OF MNEMONIC 1": "NEUTRON", + "DESCRIPTION OF MNEMONIC 2": "NEUTRON TYPE" + }, + "RESI": { + "MNEM": "RESI", + "UNIT": "", + "DATA": "0", + "DESCRIPTION OF MNEMONIC 1": "RESIST", + "DESCRIPTION OF MNEMONIC 2": "RESISTIVITY TYPE" + }, + "RM": { + "MNEM": "RM", + "UNIT": "", + "DATA": "2.62", + "DESCRIPTION OF MNEMONIC 1": "RM", + "DESCRIPTION OF MNEMONIC 2": "RESISTIVITY OF MUD" + }, + "RMC": { + "MNEM": "RMC", + "UNIT": "", + "DATA": "0", + "DESCRIPTION OF MNEMONIC 1": "RMC", + "DESCRIPTION OF MNEMONIC 2": "RESISTIVITY OF MUD CAKE" + }, + "RMF": { + "MNEM": "RMF", + "UNIT": "", + "DATA": "1.02", + "DESCRIPTION OF MNEMONIC 1": "RMF", + "DESCRIPTION OF MNEMONIC 2": "RESISTIVITY OF MUD FILTRATE" + }, + "SUFT": { + "MNEM": "SUFT", + "UNIT": "", + "DATA": "0", + "DESCRIPTION OF MNEMONIC 1": "SUFT", + "DESCRIPTION OF MNEMONIC 2": "SURFACE TEMPERATURE" + } + }, + "CURVES": { + "DEPTH": [ + "390.000", + "390.250", + "390.500", + "390.750", + "391.000", + "391.250", + "391.500", + "391.750", + "392.000", + "392.250", + "392.500", + "392.750", + "393.000", + "393.250", + "393.500", + "393.750", + "394.000", + "394.250", + "394.500", + "394.750", + "395.000", + "395.250", + "395.500", + "395.750", + "396.000", + "396.250", + "396.500", + "396.750", + "397.000", + "397.250", + "397.500", + "397.750", + "398.000", + "398.250", + "398.500", + "398.750", + "399.000", + "399.250", + "399.500", + "399.750", + "400.000", + "400.250", + "400.500", + "400.750", + "401.000", + "401.250", + "401.500", + "401.750", + "402.000", + "402.250", + "402.500", + "402.750", + "403.000", + "403.250", + "403.500", + "403.750", + "404.000", + "404.250", + "404.500", + "404.750", + "405.000", + "405.250", + "405.500", + "405.750", + "406.000", + "406.250", + "406.500", + "406.750", + "407.000", + "407.250", + "407.500", + "407.750", + "408.000", + "408.250", + "408.500", + "408.750", + "409.000", + "409.250", + "409.500", + "409.750", + "410.000", + "410.250", + "410.500", + "410.750", + "411.000", + "411.250", + "411.500", + "411.750", + "412.000", + "412.250", + "412.500", + "412.750", + "413.000", + "413.250", + "413.500", + "413.750", + "414.000", + "414.250", + "414.500", + "414.750", + "415.000", + "415.250", + "415.500", + "415.750", + "416.000", + "416.250", + "416.500", + "416.750", + "417.000", + "417.250", + "417.500", + "417.750", + "418.000", + "418.250", + "418.500", + "418.750", + "419.000", + "419.250", + "419.500", + "419.750", + "420.000", + "420.250", + "420.500", + "420.750", + "421.000", + "421.250", + "421.500", + "421.750", + "422.000", + "422.250", + "422.500", + "422.750", + "423.000", + "423.250", + "423.500", + "423.750", + "424.000", + "424.250", + "424.500", + "424.750", + "425.000", + "425.250", + "425.500", + "425.750", + "426.000", + "426.250", + "426.500", + "426.750", + "427.000", + "427.250", + "427.500", + "427.750", + "428.000", + "428.250", + "428.500", + "428.750", + "429.000", + "429.250", + "429.500", + "429.750", + "430.000", + "430.250", + "430.500", + "430.750", + "431.000", + "431.250", + "431.500", + "431.750", + "432.000", + "432.250", + "432.500", + "432.750", + "433.000", + "433.250", + "433.500", + "433.750", + "434.000", + "434.250", + "434.500", + "434.750", + "435.000", + "435.250", + "435.500", + "435.750", + "436.000", + "436.250", + "436.500", + "436.750", + "437.000", + "437.250", + "437.500", + "437.750", + "438.000", + "438.250", + "438.500", + "438.750", + "439.000", + "439.250", + "439.500", + "439.750", + "440.000", + "440.250", + "440.500", + "440.750", + "441.000", + "441.250", + "441.500", + "441.750", + "442.000", + "442.250", + "442.500", + "442.750", + "443.000", + "443.250", + "443.500", + "443.750", + "444.000", + "444.250", + "444.500", + "444.750", + "445.000", + "445.250", + "445.500", + "445.750", + "446.000", + "446.250", + "446.500", + "446.750", + "447.000", + "447.250", + "447.500", + "447.750", + "448.000", + "448.250", + "448.500", + "448.750", + "449.000", + "449.250", + "449.500", + "449.750", + "450.000", + "450.250", + "450.500", + "450.750", + "451.000", + "451.250", + "451.500", + "451.750", + "452.000", + "452.250", + "452.500", + "452.750", + "453.000", + "453.250", + "453.500", + "453.750", + "454.000", + "454.250", + "454.500", + "454.750", + "455.000", + "455.250", + "455.500", + "455.750", + "456.000", + "456.250", + "456.500", + "456.750", + "457.000", + "457.250", + "457.500", + "457.750", + "458.000", + "458.250", + "458.500", + "458.750", + "459.000", + "459.250", + "459.500", + "459.750", + "460.000", + "460.250", + "460.500", + "460.750", + "461.000", + "461.250", + "461.500", + "461.750", + "462.000", + "462.250", + "462.500", + "462.750", + "463.000", + "463.250", + "463.500", + "463.750", + "464.000", + "464.250", + "464.500", + "464.750", + "465.000", + "465.250", + "465.500", + "465.750", + "466.000", + "466.250", + "466.500", + "466.750", + "467.000", + "467.250", + "467.500", + "467.750", + "468.000", + "468.250", + "468.500", + "468.750", + "469.000", + "469.250", + "469.500", + "469.750", + "470.000", + "470.250", + "470.500", + "470.750", + "471.000", + "471.250", + "471.500", + "471.750", + "472.000", + "472.250", + "472.500", + "472.750", + "473.000", + "473.250", + "473.500", + "473.750", + "474.000", + "474.250", + "474.500", + "474.750", + "475.000", + "475.250", + "475.500", + "475.750", + "476.000", + "476.250", + "476.500", + "476.750", + "477.000", + "477.250", + "477.500", + "477.750", + "478.000", + "478.250", + "478.500", + "478.750", + "479.000", + "479.250", + "479.500", + "479.750", + "480.000", + "480.250", + "480.500", + "480.750", + "481.000", + "481.250", + "481.500", + "481.750", + "482.000", + "482.250", + "482.500", + "482.750", + "483.000", + "483.250", + "483.500", + "483.750", + "484.000", + "484.250", + "484.500", + "484.750", + "485.000", + "485.250", + "485.500", + "485.750", + "486.000", + "486.250", + "486.500", + "486.750", + "487.000", + "487.250", + "487.500", + "487.750", + "488.000", + "488.250", + "488.500", + "488.750", + "489.000", + "489.250", + "489.500", + "489.750", + "490.000", + "490.250", + "490.500", + "490.750", + "491.000", + "491.250", + "491.500", + "491.750", + "492.000", + "492.250", + "492.500", + "492.750", + "493.000", + "493.250", + "493.500", + "493.750", + "494.000", + "494.250", + "494.500", + "494.750", + "495.000", + "495.250", + "495.500", + "495.750", + "496.000", + "496.250", + "496.500", + "496.750", + "497.000", + "497.250", + "497.500", + "497.750", + "498.000", + "498.250", + "498.500", + "498.750", + "499.000", + "499.250", + "499.500", + "499.750", + "500.000", + "500.250", + "500.500", + "500.750", + "501.000", + "501.250", + "501.500", + "501.750", + "502.000", + "502.250", + "502.500", + "502.750", + "503.000", + "503.250", + "503.500", + "503.750", + "504.000", + "504.250", + "504.500", + "504.750", + "505.000", + "505.250", + "505.500", + "505.750", + "506.000", + "506.250", + "506.500", + "506.750", + "507.000", + "507.250", + "507.500", + "507.750", + "508.000", + "508.250", + "508.500", + "508.750", + "509.000", + "509.250", + "509.500", + "509.750", + "510.000", + "510.250", + "510.500", + "510.750", + "511.000", + "511.250", + "511.500", + "511.750", + "512.000", + "512.250", + "512.500", + "512.750", + "513.000", + "513.250", + "513.500", + "513.750", + "514.000", + "514.250", + "514.500", + "514.750", + "515.000", + "515.250", + "515.500", + "515.750", + "516.000", + "516.250", + "516.500", + "516.750", + "517.000", + "517.250", + "517.500", + "517.750", + "518.000", + "518.250", + "518.500", + "518.750", + "519.000", + "519.250", + "519.500", + "519.750", + "520.000", + "520.250", + "520.500", + "520.750", + "521.000", + "521.250", + "521.500", + "521.750", + "522.000", + "522.250", + "522.500", + "522.750", + "523.000", + "523.250", + "523.500", + "523.750", + "524.000", + "524.250", + "524.500", + "524.750", + "525.000", + "525.250", + "525.500", + "525.750", + "526.000", + "526.250", + "526.500", + "526.750", + "527.000", + "527.250", + "527.500", + "527.750", + "528.000", + "528.250", + "528.500", + "528.750", + "529.000", + "529.250", + "529.500", + "529.750", + "530.000", + "530.250", + "530.500", + "530.750", + "531.000", + "531.250", + "531.500", + "531.750", + "532.000", + "532.250", + "532.500", + "532.750", + "533.000", + "533.250", + "533.500", + "533.750", + "534.000", + "534.250", + "534.500", + "534.750", + "535.000", + "535.250", + "535.500", + "535.750", + "536.000", + "536.250", + "536.500", + "536.750", + "537.000", + "537.250", + "537.500", + "537.750", + "538.000", + "538.250", + "538.500", + "538.750", + "539.000", + "539.250", + "539.500", + "539.750", + "540.000", + "540.250", + "540.500", + "540.750", + "541.000", + "541.250", + "541.500", + "541.750", + "542.000", + "542.250", + "542.500", + "542.750", + "543.000", + "543.250", + "543.500", + "543.750", + "544.000", + "544.250", + "544.500", + "544.750", + "545.000", + "545.250", + "545.500", + "545.750", + "546.000", + "546.250", + "546.500", + "546.750", + "547.000", + "547.250", + "547.500", + "547.750", + "548.000", + "548.250", + "548.500", + "548.750", + "549.000", + "549.250", + "549.500", + "549.750", + "550.000", + "550.250", + "550.500", + "550.750", + "551.000", + "551.250", + "551.500", + "551.750", + "552.000", + "552.250", + "552.500", + "552.750", + "553.000", + "553.250", + "553.500", + "553.750", + "554.000", + "554.250", + "554.500", + "554.750", + "555.000", + "555.250", + "555.500", + "555.750", + "556.000", + "556.250", + "556.500", + "556.750", + "557.000", + "557.250", + "557.500", + "557.750", + "558.000", + "558.250", + "558.500", + "558.750", + "559.000", + "559.250", + "559.500", + "559.750", + "560.000", + "560.250", + "560.500", + "560.750", + "561.000", + "561.250", + "561.500", + "561.750", + "562.000", + "562.250", + "562.500", + "562.750", + "563.000", + "563.250", + "563.500", + "563.750", + "564.000", + "564.250", + "564.500", + "564.750", + "565.000", + "565.250", + "565.500", + "565.750", + "566.000", + "566.250", + "566.500", + "566.750", + "567.000", + "567.250", + "567.500", + "567.750", + "568.000", + "568.250", + "568.500", + "568.750", + "569.000", + "569.250", + "569.500", + "569.750", + "570.000", + "570.250", + "570.500", + "570.750", + "571.000", + "571.250", + "571.500", + "571.750", + "572.000", + "572.250", + "572.500", + "572.750", + "573.000", + "573.250", + "573.500", + "573.750", + "574.000", + "574.250", + "574.500", + "574.750", + "575.000", + "575.250", + "575.500", + "575.750", + "576.000", + "576.250", + "576.500", + "576.750", + "577.000", + "577.250", + "577.500", + "577.750", + "578.000", + "578.250", + "578.500", + "578.750", + "579.000", + "579.250", + "579.500", + "579.750", + "580.000", + "580.250", + "580.500", + "580.750", + "581.000", + "581.250", + "581.500", + "581.750", + "582.000", + "582.250", + "582.500", + "582.750", + "583.000", + "583.250", + "583.500", + "583.750", + "584.000", + "584.250", + "584.500", + "584.750", + "585.000", + "585.250", + "585.500", + "585.750", + "586.000", + "586.250", + "586.500", + "586.750", + "587.000", + "587.250", + "587.500", + "587.750", + "588.000", + "588.250", + "588.500", + "588.750", + "589.000", + "589.250", + "589.500", + "589.750", + "590.000", + "590.250", + "590.500", + "590.750", + "591.000", + "591.250", + "591.500", + "591.750", + "592.000", + "592.250", + "592.500", + "592.750", + "593.000", + "593.250", + "593.500", + "593.750", + "594.000", + "594.250", + "594.500", + "594.750", + "595.000", + "595.250", + "595.500", + "595.750", + "596.000", + "596.250", + "596.500", + "596.750", + "597.000", + "597.250", + "597.500", + "597.750", + "598.000", + "598.250", + "598.500", + "598.750", + "599.000", + "599.250", + "599.500", + "599.750", + "600.000", + "600.250", + "600.500", + "600.750", + "601.000", + "601.250", + "601.500", + "601.750", + "602.000", + "602.250", + "602.500", + "602.750", + "603.000", + "603.250", + "603.500", + "603.750", + "604.000", + "604.250", + "604.500", + "604.750", + "605.000", + "605.250", + "605.500", + "605.750", + "606.000", + "606.250", + "606.500", + "606.750", + "607.000", + "607.250", + "607.500", + "607.750", + "608.000", + "608.250", + "608.500", + "608.750", + "609.000", + "609.250", + "609.500", + "609.750", + "610.000", + "610.250", + "610.500", + "610.750", + "611.000", + "611.250", + "611.500", + "611.750", + "612.000", + "612.250", + "612.500", + "612.750", + "613.000", + "613.250", + "613.500", + "613.750", + "614.000", + "614.250", + "614.500", + "614.750", + "615.000", + "615.250", + "615.500", + "615.750", + "616.000", + "616.250", + "616.500", + "616.750", + "617.000", + "617.250", + "617.500", + "617.750", + "618.000", + "618.250", + "618.500", + "618.750", + "619.000", + "619.250", + "619.500", + "619.750", + "620.000", + "620.250", + "620.500", + "620.750", + "621.000", + "621.250", + "621.500", + "621.750", + "622.000", + "622.250", + "622.500", + "622.750", + "623.000", + "623.250", + "623.500", + "623.750", + "624.000", + "624.250", + "624.500", + "624.750", + "625.000", + "625.250", + "625.500", + "625.750", + "626.000", + "626.250", + "626.500", + "626.750", + "627.000", + "627.250", + "627.500", + "627.750", + "628.000", + "628.250", + "628.500", + "628.750", + "629.000", + "629.250", + "629.500", + "629.750", + "630.000", + "630.250", + "630.500", + "630.750", + "631.000", + "631.250", + "631.500", + "631.750", + "632.000", + "632.250", + "632.500", + "632.750", + "633.000", + "633.250", + "633.500", + "633.750", + "634.000", + "634.250", + "634.500", + "634.750", + "635.000", + "635.250", + "635.500", + "635.750", + "636.000", + "636.250", + "636.500", + "636.750", + "637.000", + "637.250", + "637.500", + "637.750", + "638.000", + "638.250", + "638.500", + "638.750", + "639.000", + "639.250", + "639.500", + "639.750", + "640.000", + "640.250", + "640.500", + "640.750", + "641.000", + "641.250", + "641.500", + "641.750", + "642.000", + "642.250", + "642.500", + "642.750", + "643.000", + "643.250", + "643.500", + "643.750", + "644.000", + "644.250", + "644.500", + "644.750", + "645.000", + "645.250", + "645.500", + "645.750", + "646.000", + "646.250", + "646.500", + "646.750", + "647.000", + "647.250", + "647.500", + "647.750", + "648.000", + "648.250", + "648.500", + "648.750", + "649.000", + "649.250", + "649.500", + "649.750", + "650.000" + ], + "PHID": [ + "0.199", + "0.208", + "0.246", + "0.266", + "0.287", + "0.288", + "0.241", + "0.215", + "0.190", + "0.219", + "0.269", + "0.316", + "0.299", + "0.241", + "0.216", + "0.293", + "0.374", + "0.454", + "0.508", + "0.553", + "0.535", + "0.507", + "0.422", + "0.344", + "0.332", + "0.278", + "0.230", + "0.208", + "0.235", + "0.234", + "0.227", + "0.237", + "0.247", + "0.250", + "0.253", + "0.264", + "0.282", + "0.304", + "0.332", + "0.501", + "0.507", + "0.289", + "0.252", + "0.248", + "0.252", + "0.252", + "0.260", + "0.270", + "0.255", + "0.209", + "0.191", + "0.103", + "0.078", + "0.095", + "0.186", + "0.223", + "0.244", + "0.268", + "0.281", + "0.284", + "0.283", + "0.286", + "0.309", + "0.364", + "0.548", + "0.498", + "0.413", + "0.329", + "0.287", + "0.283", + "0.279", + "0.284", + "0.302", + "0.320", + "0.323", + "0.293", + "0.254", + "0.219", + "0.215", + "0.233", + "0.250", + "0.279", + "0.279", + "0.275", + "0.292", + "0.314", + "0.324", + "0.315", + "0.281", + "0.247", + "0.316", + "0.354", + "0.349", + "0.325", + "0.337", + "0.339", + "0.324", + "0.264", + "0.223", + "0.223", + "0.246", + "0.260", + "0.230", + "0.205", + "0.190", + "0.263", + "0.308", + "0.307", + "0.285", + "0.266", + "0.251", + "0.220", + "0.208", + "0.213", + "0.208", + "0.200", + "0.201", + "0.214", + "0.268", + "0.406", + "0.517", + "0.570", + "0.612", + "0.645", + "0.389", + "0.322", + "0.297", + "0.289", + "0.296", + "0.303", + "0.309", + "0.313", + "0.313", + "0.312", + "0.306", + "0.294", + "0.288", + "0.269", + "0.242", + "0.221", + "0.267", + "0.292", + "0.308", + "0.323", + "0.341", + "0.348", + "0.343", + "0.340", + "0.337", + "0.334", + "0.335", + "0.344", + "0.351", + "0.345", + "0.341", + "0.344", + "0.352", + "0.359", + "0.359", + "0.347", + "0.344", + "0.342", + "0.334", + "0.329", + "0.335", + "0.339", + "0.340", + "0.330", + "0.336", + "0.339", + "0.334", + "0.331", + "0.336", + "0.350", + "0.349", + "0.332", + "0.318", + "0.281", + "0.436", + "0.476", + "0.476", + "0.432", + "0.330", + "0.297", + "0.281", + "0.264", + "0.243", + "0.264", + "0.310", + "0.328", + "0.328", + "0.319", + "0.302", + "0.316", + "0.321", + "0.322", + "0.319", + "0.310", + "0.294", + "0.270", + "0.260", + "0.314", + "0.331", + "0.337", + "0.344", + "0.352", + "0.364", + "0.351", + "0.349", + "0.347", + "0.334", + "0.326", + "0.331", + "0.349", + "0.358", + "0.354", + "0.344", + "0.334", + "0.321", + "0.311", + "0.318", + "0.330", + "0.339", + "0.346", + "0.339", + "0.315", + "0.282", + "0.237", + "0.095", + "0.039", + "0.075", + "0.183", + "0.274", + "0.309", + "0.341", + "0.356", + "0.350", + "0.342", + "0.338", + "0.335", + "0.331", + "0.335", + "0.344", + "0.333", + "0.324", + "0.335", + "0.358", + "0.353", + "0.333", + "0.334", + "0.333", + "0.332", + "0.341", + "0.348", + "0.349", + "0.341", + "0.329", + "0.325", + "0.324", + "0.327", + "0.338", + "0.349", + "0.353", + "0.351", + "0.339", + "0.333", + "0.332", + "0.342", + "0.599", + "0.574", + "0.533", + "0.259", + "0.215", + "0.224", + "0.246", + "0.260", + "0.265", + "0.253", + "0.257", + "0.276", + "0.302", + "0.317", + "0.313", + "0.306", + "0.301", + "0.300", + "0.302", + "0.303", + "0.305", + "0.306", + "0.306", + "0.306", + "0.307", + "0.309", + "0.312", + "0.316", + "0.321", + "0.322", + "0.321", + "0.320", + "0.319", + "0.316", + "0.309", + "0.300", + "0.268", + "0.182", + "0.081", + "0.038", + "0.060", + "0.118", + "0.222", + "0.268", + "0.298", + "0.288", + "0.302", + "0.326", + "0.327", + "0.314", + "0.296", + "0.245", + "0.141", + "0.061", + "0.022", + "0.001", + "0.008", + "0.040", + "0.187", + "0.253", + "0.282", + "0.306", + "0.309", + "0.299", + "0.299", + "0.302", + "0.308", + "0.310", + "0.313", + "0.305", + "0.284", + "0.262", + "0.235", + "0.218", + "0.222", + "0.235", + "0.250", + "0.259", + "0.256", + "0.254", + "0.256", + "0.256", + "0.259", + "0.269", + "0.250", + "0.244", + "0.251", + "0.202", + "0.182", + "0.181", + "0.228", + "0.258", + "0.280", + "0.245", + "0.202", + "0.215", + "0.245", + "0.266", + "0.274", + "0.286", + "0.307", + "0.312", + "0.303", + "0.295", + "0.298", + "0.303", + "0.309", + "0.307", + "0.306", + "0.303", + "0.291", + "0.278", + "0.268", + "0.275", + "0.289", + "0.298", + "0.307", + "0.316", + "0.325", + "0.323", + "0.318", + "0.310", + "0.303", + "0.291", + "0.314", + "0.319", + "0.316", + "0.306", + "0.294", + "0.286", + "0.302", + "0.307", + "0.305", + "0.300", + "0.288", + "0.265", + "0.192", + "0.141", + "0.091", + "0.142", + "0.206", + "0.255", + "0.276", + "0.262", + "0.240", + "0.234", + "0.257", + "0.260", + "0.254", + "0.250", + "0.252", + "0.251", + "0.250", + "0.251", + "0.248", + "0.252", + "0.244", + "0.255", + "0.251", + "0.241", + "0.229", + "0.220", + "0.209", + "0.200", + "0.205", + "0.224", + "0.232", + "0.239", + "0.243", + "0.229", + "0.215", + "0.207", + "0.204", + "0.197", + "0.191", + "0.191", + "0.218", + "0.215", + "0.205", + "0.218", + "0.255", + "0.272", + "0.283", + "0.296", + "0.308", + "0.315", + "0.308", + "0.291", + "0.274", + "0.260", + "0.267", + "0.263", + "0.248", + "0.244", + "0.236", + "0.223", + "0.207", + "0.196", + "0.214", + "0.220", + "0.212", + "0.202", + "0.218", + "0.242", + "0.293", + "0.328", + "0.334", + "0.330", + "0.329", + "0.331", + "0.333", + "0.335", + "0.340", + "0.341", + "0.335", + "0.329", + "0.323", + "0.322", + "0.325", + "0.327", + "0.325", + "0.316", + "0.306", + "0.300", + "0.301", + "0.306", + "0.311", + "0.313", + "0.315", + "0.318", + "0.317", + "0.316", + "0.316", + "0.317", + "0.317", + "0.319", + "0.320", + "0.323", + "0.325", + "0.326", + "0.324", + "0.321", + "0.320", + "0.321", + "0.324", + "0.326", + "0.327", + "0.326", + "0.329", + "0.330", + "0.328", + "0.333", + "0.336", + "0.337", + "0.335", + "0.331", + "0.326", + "0.324", + "0.323", + "0.321", + "0.321", + "0.321", + "0.320", + "0.325", + "0.330", + "0.327", + "0.321", + "0.319", + "0.309", + "0.265", + "0.223", + "0.135", + "0.141", + "0.162", + "0.188", + "0.221", + "0.273", + "0.305", + "0.293", + "0.277", + "0.262", + "0.247", + "0.270", + "0.290", + "0.304", + "0.294", + "0.278", + "0.262", + "0.258", + "0.255", + "0.218", + "0.212", + "0.232", + "0.258", + "0.261", + "0.261", + "0.247", + "0.238", + "0.224", + "0.211", + "0.215", + "0.224", + "0.221", + "0.227", + "0.240", + "0.233", + "0.215", + "0.179", + "0.188", + "0.218", + "0.190", + "0.132", + "0.074", + "0.160", + "0.199", + "0.210", + "0.200", + "0.201", + "0.213", + "0.221", + "0.222", + "0.215", + "0.233", + "0.232", + "0.218", + "0.200", + "0.183", + "0.197", + "0.215", + "0.225", + "0.236", + "0.236", + "0.247", + "0.235", + "0.200", + "0.199", + "0.222", + "0.241", + "0.264", + "0.250", + "0.238", + "0.225", + "0.218", + "0.220", + "0.219", + "0.217", + "0.214", + "0.212", + "0.211", + "0.213", + "0.217", + "0.221", + "0.220", + "0.219", + "0.216", + "0.208", + "0.199", + "0.192", + "0.186", + "0.190", + "0.193", + "0.199", + "0.213", + "0.226", + "0.239", + "0.251", + "0.267", + "0.254", + "0.247", + "0.238", + "0.229", + "0.218", + "0.229", + "0.201", + "0.175", + "0.145", + "0.160", + "0.184", + "0.195", + "0.186", + "0.190", + "0.180", + "0.176", + "0.183", + "0.181", + "0.173", + "0.169", + "0.176", + "0.183", + "0.191", + "0.191", + "0.184", + "0.177", + "0.185", + "0.191", + "0.188", + "0.179", + "0.178", + "0.195", + "0.226", + "0.261", + "0.234", + "0.219", + "0.209", + "0.206", + "0.206", + "0.197", + "0.176", + "0.186", + "0.204", + "0.230", + "0.250", + "0.263", + "0.253", + "0.260", + "0.262", + "0.249", + "0.237", + "0.226", + "0.217", + "0.213", + "0.211", + "0.205", + "0.189", + "0.189", + "0.191", + "0.189", + "0.187", + "0.187", + "0.188", + "0.199", + "0.207", + "0.198", + "0.186", + "0.200", + "0.217", + "0.234", + "0.235", + "0.228", + "0.176", + "0.093", + "0.143", + "0.199", + "0.224", + "0.238", + "0.260", + "0.289", + "0.298", + "0.268", + "0.248", + "0.237", + "0.229", + "0.217", + "0.192", + "0.206", + "0.230", + "0.246", + "0.256", + "0.257", + "0.249", + "0.233", + "0.213", + "0.226", + "0.238", + "0.245", + "0.253", + "0.238", + "0.208", + "0.187", + "0.187", + "0.206", + "0.222", + "0.234", + "0.214", + "0.216", + "0.214", + "0.167", + "0.126", + "0.170", + "0.212", + "0.227", + "0.237", + "0.227", + "0.210", + "0.191", + "0.173", + "0.186", + "0.191", + "0.187", + "0.179", + "0.170", + "0.156", + "0.177", + "0.188", + "0.196", + "0.206", + "0.196", + "0.181", + "0.164", + "0.173", + "0.159", + "0.190", + "0.214", + "0.210", + "0.197", + "0.206", + "0.213", + "0.204", + "0.184", + "0.159", + "0.116", + "0.096", + "0.120", + "0.132", + "0.135", + "0.162", + "0.179", + "0.205", + "0.192", + "0.185", + "0.178", + "0.166", + "0.149", + "0.138", + "0.150", + "0.149", + "0.145", + "0.132", + "0.143", + "0.184", + "0.177", + "0.156", + "0.122", + "0.124", + "0.148", + "0.165", + "0.136", + "0.113", + "0.099", + "0.085", + "0.072", + "0.075", + "0.087", + "0.111", + "0.137", + "0.188", + "0.247", + "0.331", + "0.370", + "0.435", + "0.490", + "0.580", + "0.562", + "0.551", + "0.587", + "0.528", + "0.483", + "0.563", + "0.642", + "0.367", + "0.180", + "0.219", + "0.269", + "0.310", + "0.280", + "0.221", + "0.187", + "0.210", + "0.238", + "0.256", + "0.267", + "0.242", + "0.214", + "0.183", + "0.151", + "0.255", + "0.314", + "0.349", + "0.358", + "0.338", + "0.298", + "0.280", + "0.257", + "0.223", + "0.129", + "0.027", + "0.320", + "0.342", + "0.303", + "0.212", + "0.156", + "0.107", + "0.108", + "0.119", + "0.135", + "0.150", + "0.137", + "0.160", + "0.187", + "0.174", + "0.191", + "0.212", + "0.204", + "0.199", + "0.295", + "0.388", + "0.606", + "0.662", + "0.492", + "0.333", + "0.271", + "0.199", + "0.180", + "0.208", + "0.224", + "0.211", + "0.189", + "0.168", + "0.144", + "0.172", + "0.290", + "0.379", + "0.296", + "0.217", + "0.175", + "0.202", + "0.225", + "0.238", + "0.250", + "0.240", + "0.227", + "0.248", + "0.267", + "0.263", + "0.243", + "0.222", + "0.249", + "0.237", + "0.196", + "0.165", + "0.143", + "0.139", + "0.152", + "0.163", + "0.134", + "0.088", + "0.070", + "0.120", + "0.166", + "0.170", + "0.159", + "0.150", + "0.152", + "0.169", + "0.179", + "0.150", + "0.154", + "0.164", + "0.174", + "0.181", + "0.189", + "0.198", + "0.203", + "0.209", + "0.214", + "0.193", + "0.092", + "0.058", + "0.031", + "0.016", + "0.047", + "0.094", + "0.111", + "0.141", + "0.170", + "0.185", + "0.196", + "0.209", + "0.201", + "0.184", + "0.198", + "0.208", + "0.193", + "0.169", + "0.136", + "0.120", + "0.268", + "0.364", + "0.476", + "0.385", + "0.352", + "0.303", + "0.276", + "0.249", + "0.225", + "0.196", + "0.147", + "0.096", + "0.172", + "0.199", + "0.231", + "0.264", + "0.254", + "0.244", + "0.230", + "0.221", + "0.325", + "0.490", + "0.519", + "0.768", + "0.734", + "0.729", + "0.783", + "0.703", + "0.773", + "0.810", + "0.461", + "0.323", + "0.256", + "0.241", + "0.209", + "0.232", + "0.235", + "0.231", + "0.226", + "0.222", + "0.241", + "0.321", + "0.435", + "0.451", + "0.488", + "0.315", + "0.251", + "0.198", + "0.185", + "0.177", + "0.163", + "0.152", + "0.161", + "0.172", + "0.183", + "0.201", + "0.198", + "0.206", + "0.310", + "0.336", + "0.332", + "0.509", + "0.595", + "0.340", + "0.224", + "0.160", + "0.004", + "0.010", + "0.018", + "0.021", + "0.015", + "0.003", + "-0.005", + "-0.005", + "0.009", + "0.019", + "0.014", + "0.005", + "-0.011", + "-0.010", + "-0.004", + "0.000", + "0.007", + "0.017", + "0.023", + "0.028", + "0.036" + ], + "PHIN": [ + "0.457", + "0.456", + "0.452", + "0.475", + "0.484", + "0.474", + "0.461", + "0.471", + "0.448", + "0.478", + "0.552", + "0.458", + "0.429", + "0.385", + "0.329", + "0.355", + "0.481", + "0.536", + "0.565", + "0.578", + "0.573", + "0.538", + "0.458", + "0.444", + "0.440", + "0.440", + "0.435", + "0.418", + "0.424", + "0.477", + "0.464", + "0.419", + "0.430", + "0.441", + "0.439", + "0.426", + "0.404", + "0.467", + "0.487", + "0.510", + "0.480", + "0.442", + "0.428", + "0.408", + "0.435", + "0.452", + "0.436", + "0.426", + "0.411", + "0.368", + "0.304", + "0.257", + "0.340", + "0.380", + "0.421", + "0.401", + "0.402", + "0.408", + "0.404", + "0.394", + "0.391", + "0.380", + "0.466", + "0.519", + "0.486", + "0.432", + "0.386", + "0.381", + "0.390", + "0.408", + "0.430", + "0.432", + "0.414", + "0.392", + "0.369", + "0.366", + "0.369", + "0.370", + "0.401", + "0.408", + "0.397", + "0.403", + "0.393", + "0.361", + "0.338", + "0.361", + "0.375", + "0.361", + "0.336", + "0.343", + "0.383", + "0.509", + "0.500", + "0.528", + "0.521", + "0.413", + "0.391", + "0.403", + "0.374", + "0.352", + "0.331", + "0.314", + "0.306", + "0.340", + "0.354", + "0.358", + "0.345", + "0.350", + "0.359", + "0.358", + "0.361", + "0.383", + "0.421", + "0.435", + "0.410", + "0.385", + "0.365", + "0.391", + "0.439", + "0.514", + "0.564", + "0.601", + "0.648", + "0.672", + "0.512", + "0.436", + "0.421", + "0.416", + "0.436", + "0.451", + "0.443", + "0.435", + "0.444", + "0.449", + "0.421", + "0.435", + "0.451", + "0.454", + "0.445", + "0.426", + "0.451", + "0.487", + "0.477", + "0.449", + "0.428", + "0.398", + "0.431", + "0.452", + "0.417", + "0.405", + "0.399", + "0.393", + "0.404", + "0.418", + "0.433", + "0.452", + "0.461", + "0.434", + "0.421", + "0.429", + "0.450", + "0.453", + "0.419", + "0.437", + "0.415", + "0.381", + "0.400", + "0.419", + "0.407", + "0.417", + "0.426", + "0.428", + "0.421", + "0.412", + "0.407", + "0.401", + "0.402", + "0.416", + "0.498", + "0.546", + "0.575", + "0.463", + "0.435", + "0.453", + "0.456", + "0.455", + "0.448", + "0.430", + "0.406", + "0.384", + "0.397", + "0.402", + "0.419", + "0.416", + "0.425", + "0.418", + "0.405", + "0.395", + "0.427", + "0.458", + "0.463", + "0.407", + "0.360", + "0.381", + "0.434", + "0.438", + "0.417", + "0.415", + "0.400", + "0.369", + "0.391", + "0.412", + "0.428", + "0.427", + "0.411", + "0.397", + "0.409", + "0.398", + "0.391", + "0.412", + "0.412", + "0.393", + "0.404", + "0.399", + "0.401", + "0.435", + "0.368", + "0.317", + "0.152", + "0.179", + "0.268", + "0.358", + "0.389", + "0.380", + "0.396", + "0.392", + "0.389", + "0.402", + "0.414", + "0.393", + "0.384", + "0.403", + "0.410", + "0.406", + "0.404", + "0.408", + "0.412", + "0.413", + "0.407", + "0.407", + "0.433", + "0.453", + "0.440", + "0.429", + "0.437", + "0.448", + "0.431", + "0.401", + "0.378", + "0.411", + "0.421", + "0.424", + "0.432", + "0.443", + "0.435", + "0.415", + "0.400", + "0.413", + "0.552", + "0.622", + "0.617", + "0.516", + "0.434", + "0.417", + "0.416", + "0.448", + "0.458", + "0.456", + "0.446", + "0.428", + "0.415", + "0.398", + "0.408", + "0.395", + "0.397", + "0.406", + "0.400", + "0.387", + "0.408", + "0.430", + "0.438", + "0.416", + "0.408", + "0.421", + "0.426", + "0.428", + "0.435", + "0.422", + "0.407", + "0.416", + "0.425", + "0.429", + "0.445", + "0.428", + "0.278", + "0.210", + "0.196", + "0.204", + "0.237", + "0.307", + "0.387", + "0.400", + "0.403", + "0.408", + "0.415", + "0.427", + "0.410", + "0.394", + "0.420", + "0.414", + "0.365", + "0.210", + "0.214", + "0.197", + "0.180", + "0.201", + "0.289", + "0.356", + "0.397", + "0.419", + "0.435", + "0.424", + "0.426", + "0.424", + "0.409", + "0.417", + "0.420", + "0.395", + "0.418", + "0.435", + "0.406", + "0.400", + "0.420", + "0.450", + "0.424", + "0.414", + "0.437", + "0.467", + "0.433", + "0.414", + "0.401", + "0.396", + "0.408", + "0.421", + "0.416", + "0.417", + "0.425", + "0.437", + "0.449", + "0.431", + "0.415", + "0.398", + "0.403", + "0.424", + "0.417", + "0.399", + "0.394", + "0.406", + "0.395", + "0.404", + "0.423", + "0.468", + "0.509", + "0.468", + "0.449", + "0.442", + "0.432", + "0.431", + "0.444", + "0.481", + "0.479", + "0.459", + "0.447", + "0.428", + "0.416", + "0.444", + "0.444", + "0.427", + "0.422", + "0.451", + "0.457", + "0.457", + "0.447", + "0.426", + "0.447", + "0.456", + "0.436", + "0.416", + "0.400", + "0.436", + "0.464", + "0.443", + "0.430", + "0.447", + "0.374", + "0.257", + "0.246", + "0.306", + "0.378", + "0.431", + "0.434", + "0.434", + "0.433", + "0.437", + "0.443", + "0.448", + "0.442", + "0.429", + "0.413", + "0.396", + "0.404", + "0.430", + "0.450", + "0.457", + "0.461", + "0.463", + "0.455", + "0.425", + "0.402", + "0.411", + "0.432", + "0.404", + "0.397", + "0.414", + "0.428", + "0.441", + "0.410", + "0.410", + "0.428", + "0.444", + "0.455", + "0.447", + "0.433", + "0.431", + "0.441", + "0.453", + "0.460", + "0.459", + "0.449", + "0.443", + "0.438", + "0.423", + "0.415", + "0.405", + "0.394", + "0.376", + "0.380", + "0.393", + "0.400", + "0.408", + "0.410", + "0.417", + "0.421", + "0.401", + "0.387", + "0.391", + "0.416", + "0.434", + "0.434", + "0.429", + "0.440", + "0.428", + "0.410", + "0.402", + "0.414", + "0.402", + "0.413", + "0.428", + "0.443", + "0.418", + "0.400", + "0.402", + "0.428", + "0.440", + "0.452", + "0.461", + "0.458", + "0.442", + "0.425", + "0.404", + "0.418", + "0.403", + "0.399", + "0.410", + "0.418", + "0.424", + "0.423", + "0.402", + "0.403", + "0.417", + "0.426", + "0.438", + "0.426", + "0.410", + "0.420", + "0.430", + "0.434", + "0.421", + "0.408", + "0.435", + "0.446", + "0.433", + "0.448", + "0.452", + "0.447", + "0.439", + "0.427", + "0.415", + "0.421", + "0.450", + "0.448", + "0.431", + "0.413", + "0.400", + "0.403", + "0.435", + "0.420", + "0.413", + "0.410", + "0.402", + "0.393", + "0.397", + "0.404", + "0.407", + "0.411", + "0.422", + "0.438", + "0.387", + "0.336", + "0.270", + "0.289", + "0.325", + "0.424", + "0.452", + "0.457", + "0.441", + "0.427", + "0.413", + "0.408", + "0.416", + "0.424", + "0.441", + "0.464", + "0.445", + "0.425", + "0.417", + "0.416", + "0.417", + "0.416", + "0.424", + "0.446", + "0.435", + "0.437", + "0.434", + "0.421", + "0.429", + "0.422", + "0.406", + "0.413", + "0.409", + "0.397", + "0.424", + "0.459", + "0.403", + "0.375", + "0.352", + "0.405", + "0.457", + "0.271", + "0.266", + "0.376", + "0.405", + "0.409", + "0.400", + "0.398", + "0.415", + "0.428", + "0.439", + "0.406", + "0.390", + "0.396", + "0.423", + "0.448", + "0.429", + "0.443", + "0.460", + "0.427", + "0.416", + "0.434", + "0.447", + "0.429", + "0.419", + "0.406", + "0.391", + "0.420", + "0.411", + "0.397", + "0.412", + "0.434", + "0.456", + "0.451", + "0.430", + "0.420", + "0.424", + "0.442", + "0.443", + "0.435", + "0.448", + "0.462", + "0.465", + "0.443", + "0.421", + "0.419", + "0.431", + "0.431", + "0.427", + "0.438", + "0.448", + "0.450", + "0.431", + "0.409", + "0.399", + "0.385", + "0.403", + "0.427", + "0.449", + "0.427", + "0.409", + "0.397", + "0.410", + "0.438", + "0.296", + "0.298", + "0.340", + "0.392", + "0.420", + "0.426", + "0.434", + "0.437", + "0.417", + "0.394", + "0.421", + "0.454", + "0.444", + "0.435", + "0.461", + "0.481", + "0.475", + "0.437", + "0.397", + "0.399", + "0.421", + "0.441", + "0.455", + "0.470", + "0.452", + "0.478", + "0.510", + "0.494", + "0.455", + "0.440", + "0.451", + "0.449", + "0.435", + "0.428", + "0.440", + "0.452", + "0.448", + "0.435", + "0.436", + "0.450", + "0.455", + "0.410", + "0.387", + "0.365", + "0.338", + "0.340", + "0.372", + "0.393", + "0.407", + "0.412", + "0.415", + "0.411", + "0.400", + "0.387", + "0.379", + "0.396", + "0.402", + "0.410", + "0.431", + "0.408", + "0.394", + "0.381", + "0.371", + "0.382", + "0.382", + "0.320", + "0.278", + "0.297", + "0.341", + "0.394", + "0.416", + "0.424", + "0.431", + "0.453", + "0.457", + "0.428", + "0.418", + "0.413", + "0.390", + "0.364", + "0.346", + "0.374", + "0.426", + "0.439", + "0.429", + "0.411", + "0.395", + "0.382", + "0.364", + "0.393", + "0.388", + "0.394", + "0.407", + "0.438", + "0.424", + "0.416", + "0.409", + "0.402", + "0.404", + "0.401", + "0.386", + "0.358", + "0.312", + "0.278", + "0.341", + "0.371", + "0.387", + "0.404", + "0.394", + "0.391", + "0.407", + "0.392", + "0.369", + "0.360", + "0.349", + "0.343", + "0.348", + "0.375", + "0.393", + "0.409", + "0.401", + "0.390", + "0.412", + "0.406", + "0.387", + "0.378", + "0.385", + "0.389", + "0.405", + "0.394", + "0.390", + "0.408", + "0.401", + "0.392", + "0.383", + "0.357", + "0.314", + "0.306", + "0.330", + "0.326", + "0.308", + "0.312", + "0.334", + "0.370", + "0.353", + "0.339", + "0.327", + "0.356", + "0.387", + "0.348", + "0.330", + "0.345", + "0.318", + "0.301", + "0.337", + "0.401", + "0.432", + "0.383", + "0.328", + "0.310", + "0.351", + "0.396", + "0.371", + "0.355", + "0.368", + "0.344", + "0.326", + "0.321", + "0.328", + "0.330", + "0.320", + "0.314", + "0.372", + "0.446", + "0.466", + "0.479", + "0.507", + "0.548", + "0.579", + "0.579", + "0.548", + "0.586", + "0.513", + "0.487", + "0.652", + "0.371", + "0.353", + "0.367", + "0.390", + "0.400", + "0.403", + "0.399", + "0.372", + "0.361", + "0.395", + "0.409", + "0.391", + "0.383", + "0.372", + "0.366", + "0.346", + "0.323", + "0.297", + "0.400", + "0.441", + "0.463", + "0.459", + "0.439", + "0.425", + "0.412", + "0.392", + "0.346", + "0.416", + "0.443", + "0.437", + "0.336", + "0.349", + "0.358", + "0.331", + "0.345", + "0.358", + "0.368", + "0.365", + "0.342", + "0.366", + "0.365", + "0.328", + "0.312", + "0.312", + "0.308", + "0.302", + "0.285", + "0.278", + "0.449", + "0.550", + "0.467", + "0.393", + "0.348", + "0.336", + "0.323", + "0.317", + "0.301", + "0.282", + "0.252", + "0.235", + "0.243", + "0.286", + "0.376", + "0.344", + "0.322", + "0.307", + "0.310", + "0.320", + "0.333", + "0.338", + "0.321", + "0.327", + "0.338", + "0.347", + "0.345", + "0.332", + "0.312", + "0.299", + "0.314", + "0.329", + "0.329", + "0.328", + "0.333", + "0.345", + "0.362", + "0.299", + "0.273", + "0.221", + "0.228", + "0.297", + "0.308", + "0.291", + "0.265", + "0.253", + "0.278", + "0.300", + "0.324", + "0.338", + "0.345", + "0.327", + "0.307", + "0.307", + "0.318", + "0.315", + "0.298", + "0.307", + "0.317", + "0.289", + "0.192", + "0.154", + "0.178", + "0.237", + "0.272", + "0.297", + "0.322", + "0.361", + "0.325", + "0.333", + "0.325", + "0.276", + "0.276", + "0.307", + "0.315", + "0.276", + "0.276", + "0.310", + "0.345", + "0.367", + "0.499", + "0.530", + "0.467", + "0.355", + "0.310", + "0.289", + "0.266", + "0.248", + "0.237", + "0.228", + "0.254", + "0.287", + "0.304", + "0.299", + "0.292", + "0.293", + "0.312", + "0.311", + "0.295", + "0.272", + "0.323", + "0.370", + "0.557", + "0.549", + "0.566", + "0.557", + "0.536", + "0.546", + "0.539", + "0.576", + "0.627", + "0.443", + "0.286", + "0.298", + "0.299", + "0.295", + "0.285", + "0.277", + "0.272", + "0.297", + "0.402", + "0.433", + "0.480", + "0.467", + "0.545", + "0.483", + "0.358", + "0.305", + "0.303", + "0.291", + "0.281", + "0.283", + "0.298", + "0.295", + "0.281", + "0.278", + "0.300", + "0.329", + "0.399", + "0.390", + "0.381", + "0.381", + "0.535", + "0.240", + "0.203", + "0.152", + "0.090", + "0.091", + "0.097", + "0.088", + "0.065", + "0.055", + "0.053", + "0.056", + "0.062", + "0.067", + "0.072", + "0.074", + "0.074", + "0.075", + "0.079", + "0.088", + "0.098", + "0.111", + "0.126", + "0.146", + "0.166" + ], + "GR": [ + "82.478", + "86.413", + "90.229", + "90.944", + "88.866", + "82.638", + "83.345", + "88.403", + "91.038", + "89.579", + "84.092", + "78.479", + "72.249", + "69.179", + "67.349", + "58.390", + "54.888", + "61.614", + "68.592", + "60.065", + "53.025", + "64.902", + "81.805", + "85.120", + "76.965", + "71.476", + "69.652", + "68.996", + "69.709", + "70.504", + "70.950", + "68.689", + "65.494", + "61.810", + "62.210", + "65.527", + "70.460", + "72.472", + "72.876", + "69.745", + "64.755", + "64.783", + "65.746", + "67.389", + "68.414", + "69.559", + "68.475", + "64.971", + "61.780", + "58.398", + "51.237", + "45.191", + "45.474", + "51.519", + "57.687", + "63.922", + "62.958", + "56.916", + "54.898", + "53.010", + "51.303", + "52.635", + "59.803", + "64.915", + "73.006", + "59.894", + "53.101", + "47.489", + "44.979", + "49.847", + "58.563", + "51.026", + "44.359", + "44.021", + "46.097", + "53.200", + "59.119", + "69.196", + "73.198", + "73.786", + "72.827", + "68.639", + "56.950", + "46.131", + "38.227", + "33.108", + "38.535", + "47.499", + "56.952", + "74.906", + "81.757", + "87.990", + "96.765", + "90.659", + "88.705", + "86.381", + "78.131", + "78.131", + "76.861", + "65.360", + "53.732", + "37.332", + "59.934", + "69.144", + "67.499", + "51.655", + "37.920", + "32.929", + "40.160", + "49.489", + "61.672", + "70.198", + "82.883", + "77.207", + "70.293", + "66.975", + "69.053", + "74.793", + "81.579", + "86.821", + "80.526", + "74.295", + "64.963", + "55.816", + "59.940", + "64.005", + "64.903", + "67.665", + "70.483", + "69.460", + "69.369", + "69.588", + "70.859", + "69.526", + "67.323", + "66.242", + "66.144", + "66.113", + "70.300", + "73.989", + "74.826", + "74.362", + "72.285", + "63.882", + "56.969", + "55.950", + "55.295", + "54.147", + "54.552", + "55.701", + "56.475", + "58.368", + "58.833", + "58.868", + "59.949", + "58.801", + "58.274", + "58.805", + "59.578", + "60.726", + "60.631", + "60.105", + "58.279", + "53.906", + "49.970", + "50.808", + "54.808", + "57.193", + "59.767", + "62.032", + "61.815", + "58.624", + "57.663", + "58.375", + "60.763", + "63.087", + "65.102", + "69.601", + "73.292", + "75.055", + "74.779", + "74.561", + "75.708", + "77.722", + "80.049", + "76.175", + "67.153", + "60.052", + "52.393", + "45.416", + "43.775", + "43.805", + "44.217", + "45.667", + "47.372", + "48.770", + "49.914", + "51.807", + "55.561", + "60.552", + "63.123", + "54.538", + "48.800", + "44.122", + "42.289", + "49.390", + "50.107", + "48.092", + "46.638", + "45.550", + "41.860", + "42.947", + "45.082", + "48.958", + "49.672", + "43.878", + "43.781", + "46.917", + "47.942", + "44.433", + "44.157", + "47.286", + "50.852", + "46.920", + "45.340", + "47.167", + "50.791", + "45.802", + "43.232", + "42.949", + "44.849", + "46.173", + "48.809", + "49.460", + "45.832", + "42.269", + "45.215", + "48.099", + "46.578", + "45.248", + "44.846", + "45.685", + "46.086", + "46.303", + "46.644", + "48.352", + "47.699", + "47.609", + "48.760", + "50.024", + "51.852", + "54.242", + "58.736", + "54.241", + "51.606", + "49.224", + "47.391", + "45.065", + "46.835", + "49.406", + "50.865", + "51.085", + "51.553", + "52.383", + "53.221", + "51.706", + "50.682", + "49.658", + "55.952", + "62.062", + "68.664", + "75.208", + "79.208", + "81.600", + "82.555", + "83.643", + "81.132", + "74.463", + "68.481", + "61.755", + "56.699", + "55.987", + "56.453", + "56.729", + "54.343", + "54.808", + "56.143", + "55.987", + "55.715", + "56.489", + "57.514", + "58.905", + "63.711", + "65.605", + "64.147", + "61.759", + "58.195", + "55.498", + "57.262", + "59.526", + "59.742", + "57.294", + "56.457", + "55.933", + "52.736", + "46.752", + "41.762", + "38.693", + "43.807", + "50.477", + "54.910", + "54.011", + "53.736", + "54.444", + "55.289", + "55.441", + "55.779", + "56.368", + "56.956", + "56.496", + "54.358", + "47.563", + "45.054", + "46.261", + "47.285", + "47.565", + "50.079", + "52.775", + "56.156", + "49.118", + "44.934", + "46.513", + "57.333", + "63.442", + "62.358", + "62.201", + "63.412", + "63.940", + "65.148", + "67.536", + "69.430", + "65.180", + "62.734", + "66.425", + "70.794", + "72.066", + "74.141", + "74.111", + "68.003", + "65.058", + "68.997", + "65.742", + "62.423", + "63.513", + "66.269", + "73.557", + "73.959", + "69.220", + "65.962", + "66.612", + "70.178", + "72.691", + "72.288", + "68.535", + "63.669", + "59.110", + "57.840", + "56.506", + "54.925", + "55.266", + "56.788", + "63.018", + "61.314", + "56.445", + "56.913", + "58.494", + "57.594", + "56.758", + "57.721", + "60.107", + "63.610", + "69.968", + "64.231", + "57.812", + "53.319", + "53.288", + "56.853", + "60.361", + "60.015", + "58.437", + "59.335", + "61.227", + "57.662", + "58.687", + "63.058", + "68.172", + "65.601", + "59.182", + "56.982", + "56.334", + "55.932", + "56.579", + "61.077", + "71.523", + "64.114", + "61.788", + "64.237", + "67.249", + "65.788", + "58.752", + "60.085", + "69.745", + "65.854", + "65.086", + "65.793", + "67.747", + "69.698", + "70.417", + "70.442", + "69.797", + "68.335", + "65.514", + "64.614", + "68.245", + "70.444", + "70.165", + "68.524", + "66.325", + "64.494", + "63.035", + "64.494", + "67.134", + "70.697", + "71.966", + "70.698", + "65.951", + "68.217", + "68.746", + "69.150", + "70.918", + "72.186", + "72.157", + "72.186", + "72.589", + "72.558", + "71.785", + "71.013", + "70.234", + "69.091", + "67.077", + "64.815", + "63.041", + "60.597", + "59.390", + "58.861", + "58.395", + "58.487", + "59.208", + "60.593", + "63.540", + "65.934", + "66.088", + "66.920", + "69.311", + "71.389", + "72.534", + "73.311", + "73.535", + "73.374", + "71.667", + "68.600", + "64.040", + "58.182", + "56.600", + "54.277", + "53.439", + "54.772", + "56.603", + "55.887", + "53.439", + "51.860", + "52.758", + "54.089", + "56.108", + "57.382", + "58.157", + "58.556", + "58.967", + "59.176", + "59.208", + "58.744", + "57.476", + "56.200", + "55.987", + "57.566", + "56.295", + "51.179", + "52.141", + "54.097", + "55.429", + "55.834", + "56.180", + "56.700", + "57.849", + "58.129", + "57.913", + "55.089", + "49.849", + "51.746", + "53.015", + "49.884", + "48.052", + "51.060", + "53.822", + "55.404", + "55.374", + "54.041", + "52.086", + "48.955", + "49.173", + "51.558", + "51.280", + "50.632", + "51.097", + "54.292", + "60.087", + "59.002", + "55.747", + "51.065", + "51.035", + "52.120", + "55.561", + "55.469", + "52.154", + "51.502", + "53.455", + "57.085", + "62.322", + "65.767", + "64.743", + "71.159", + "72.681", + "71.038", + "67.471", + "59.750", + "59.537", + "61.364", + "61.830", + "62.051", + "62.264", + "61.612", + "57.180", + "57.400", + "58.608", + "59.879", + "61.401", + "62.857", + "65.251", + "67.323", + "69.025", + "65.336", + "62.515", + "61.307", + "64.066", + "68.004", + "69.524", + "64.845", + "60.286", + "61.185", + "65.310", + "65.897", + "61.835", + "64.907", + "64.255", + "61.310", + "63.637", + "68.072", + "62.398", + "55.114", + "49.126", + "61.375", + "66.924", + "71.856", + "71.886", + "72.231", + "73.318", + "74.030", + "73.995", + "70.932", + "68.913", + "68.511", + "71.329", + "74.771", + "76.415", + "76.386", + "76.667", + "76.201", + "73.443", + "69.689", + "64.701", + "62.434", + "66.560", + "71.053", + "72.758", + "68.388", + "63.025", + "66.716", + "70.218", + "72.117", + "72.642", + "72.608", + "71.337", + "72.919", + "76.114", + "76.703", + "74.193", + "72.242", + "71.713", + "71.307", + "74.252", + "77.697", + "77.663", + "78.935", + "79.091", + "74.720", + "74.068", + "77.015", + "79.527", + "83.277", + "84.178", + "80.673", + "78.224", + "78.255", + "80.955", + "80.059", + "78.166", + "76.644", + "72.771", + "67.219", + "61.050", + "55.811", + "56.461", + "66.042", + "74.882", + "78.387", + "81.084", + "81.732", + "82.138", + "79.500", + "76.121", + "72.928", + "72.838", + "74.667", + "78.107", + "80.061", + "81.332", + "82.170", + "81.766", + "79.255", + "78.854", + "80.868", + "81.023", + "76.591", + "75.257", + "78.016", + "78.234", + "74.546", + "75.817", + "79.136", + "76.563", + "74.237", + "73.523", + "73.678", + "75.322", + "76.533", + "72.287", + "67.417", + "62.614", + "57.311", + "55.418", + "56.317", + "55.981", + "54.768", + "54.739", + "53.839", + "53.312", + "57.128", + "60.944", + "62.211", + "63.548", + "64.260", + "64.788", + "65.687", + "67.142", + "72.694", + "74.089", + "71.457", + "69.687", + "68.417", + "67.331", + "65.317", + "61.625", + "56.823", + "56.730", + "55.706", + "53.007", + "50.682", + "47.923", + "49.444", + "54.065", + "58.375", + "61.008", + "57.446", + "54.192", + "58.063", + "58.777", + "56.769", + "56.112", + "56.638", + "57.106", + "57.879", + "56.485", + "54.967", + "54.377", + "55.465", + "58.843", + "66.686", + "61.077", + "57.695", + "58.787", + "60.305", + "60.705", + "60.550", + "60.151", + "59.683", + "59.159", + "57.822", + "52.584", + "52.056", + "57.049", + "61.854", + "62.444", + "60.059", + "58.043", + "56.586", + "54.945", + "54.352", + "54.882", + "56.030", + "57.303", + "57.827", + "56.555", + "52.556", + "53.950", + "55.225", + "55.998", + "56.528", + "56.313", + "56.530", + "60.467", + "64.590", + "64.620", + "60.869", + "59.475", + "63.667", + "67.787", + "72.651", + "78.081", + "79.909", + "80.807", + "81.709", + "82.798", + "83.507", + "83.040", + "78.483", + "75.352", + "72.472", + "70.083", + "67.384", + "66.609", + "70.858", + "74.797", + "77.557", + "76.100", + "74.207", + "71.760", + "68.254", + "68.412", + "71.480", + "74.302", + "76.069", + "71.263", + "71.173", + "72.628", + "72.969", + "73.248", + "75.080", + "77.902", + "76.569", + "71.637", + "70.619", + "71.763", + "74.837", + "77.592", + "81.470", + "83.177", + "80.166", + "73.316", + "70.927", + "73.006", + "77.255", + "80.634", + "83.703", + "88.137", + "91.703", + "93.408", + "85.750", + "77.535", + "68.823", + "62.651", + "63.117", + "66.003", + "67.832", + "78.466", + "77.323", + "68.111", + "65.544", + "67.243", + "69.942", + "71.959", + "72.737", + "73.571", + "74.096", + "74.690", + "74.717", + "75.182", + "76.022", + "77.602", + "81.913", + "77.727", + "77.945", + "78.712", + "73.907", + "71.080", + "69.931", + "72.686", + "77.476", + "81.341", + "80.874", + "77.987", + "76.710", + "75.867", + "73.415", + "69.224", + "67.328", + "71.755", + "76.612", + "79.795", + "82.857", + "85.980", + "89.351", + "89.439", + "88.532", + "93.824", + "90.261", + "86.811", + "79.159", + "68.709", + "57.457", + "50.667", + "46.169", + "41.485", + "38.907", + "48.970", + "63.865", + "74.980", + "77.608", + "60.284", + "50.150", + "43.420", + "36.322", + "31.017", + "27.387", + "28.898", + "33.136", + "35.518", + "30.895", + "37.921", + "53.933", + "61.827", + "68.914", + "65.345", + "55.890", + "53.003", + "52.162", + "50.389", + "47.379", + "48.023", + "50.466", + "46.773", + "47.604", + "49.425", + "47.655", + "47.495", + "50.802", + "55.722", + "59.340", + "62.031", + "65.399", + "71.063", + "69.416", + "55.066", + "44.311", + "35.105", + "30.668", + "32.242", + "37.161", + "42.642", + "48.800", + "55.703", + "62.048", + "67.213", + "72.938", + "80.584", + "61.962", + "56.471", + "56.189", + "61.169", + "68.380", + "68.777", + "61.676", + "56.002", + "56.212", + "49.918", + "42.326", + "38.258", + "38.784", + "42.711", + "49.239", + "57.195", + "58.396", + "53.530", + "49.526", + "44.904", + "41.213", + "38.761", + "37.295", + "36.826", + "38.648", + "44.249", + "54.993", + "63.568", + "68.982", + "60.582", + "51.439", + "45.328", + "36.183", + "27.597", + "29.670", + "26.782", + "22.342", + "21.997", + "25.369", + "36.670", + "50.821", + "55.184", + "40.772", + "30.761", + "24.031", + "26.287", + "29.720", + "31.297", + "32.249", + "34.009", + "38.989", + "45.892", + "53.290", + "64.653", + "66.973", + "62.475", + "60.019", + "61.843", + "65.216", + "67.406", + "68.545", + "60.827", + "50.073", + "39.625", + "37.605", + "38.814", + "38.089", + "37.127", + "38.514", + "41.882", + "46.989", + "48.010", + "46.481", + "43.718", + "42.875", + "41.227", + "39.148", + "40.596", + "44.901", + "43.312", + "36.769", + "33.757", + "34.526", + "39.695", + "38.792", + "36.893", + "36.735", + "36.451", + "36.287", + "39.349", + "44.704", + "45.471", + "42.831", + "39.077", + "38.421", + "35.038", + "29.673", + "29.823", + "31.520", + "31.854", + "30.642", + "29.116", + "28.460", + "27.370", + "25.415", + "23.640", + "26.889", + "29.639", + "31.711", + "33.344", + "36.037", + "38.599", + "41.662", + "46.210", + "51.129", + "58.340", + "64.622" + ], + "CAL": [ + "238.379", + "238.331", + "238.069", + "238.752", + "239.724", + "241.951", + "244.478", + "247.116", + "250.475", + "254.764", + "258.019", + "260.143", + "256.370", + "253.120", + "252.442", + "253.526", + "256.377", + "261.799", + "272.700", + "300.036", + "267.431", + "355.538", + "384.114", + "387.164", + "256.995", + "238.548", + "275.286", + "260.768", + "247.176", + "244.445", + "245.215", + "247.332", + "249.248", + "248.998", + "249.046", + "250.229", + "252.661", + "256.950", + "265.992", + "275.241", + "269.713", + "249.406", + "235.404", + "235.040", + "234.264", + "234.433", + "233.854", + "233.806", + "237.163", + "238.969", + "239.233", + "240.113", + "241.102", + "242.288", + "245.137", + "246.315", + "248.127", + "249.829", + "250.297", + "250.047", + "250.192", + "250.757", + "255.049", + "264.307", + "287.399", + "294.169", + "259.908", + "239.288", + "238.415", + "239.188", + "240.284", + "240.947", + "241.827", + "242.502", + "243.167", + "243.965", + "244.312", + "244.565", + "244.823", + "244.979", + "244.514", + "244.468", + "244.421", + "244.574", + "244.623", + "244.467", + "244.213", + "245.514", + "246.793", + "251.293", + "257.854", + "270.101", + "286.791", + "323.020", + "323.895", + "306.173", + "272.324", + "256.668", + "253.831", + "254.084", + "254.554", + "254.196", + "252.697", + "250.369", + "246.704", + "244.580", + "243.391", + "242.832", + "242.881", + "243.347", + "243.820", + "244.377", + "246.089", + "247.682", + "251.055", + "253.059", + "255.086", + "256.679", + "260.035", + "271.561", + "303.443", + "320.241", + "297.967", + "275.906", + "250.737", + "247.481", + "246.819", + "247.897", + "248.572", + "249.033", + "249.292", + "249.663", + "249.710", + "249.872", + "250.442", + "250.285", + "250.645", + "252.142", + "252.709", + "254.731", + "259.950", + "263.923", + "257.877", + "252.873", + "250.333", + "248.009", + "246.725", + "246.163", + "246.123", + "246.161", + "246.209", + "246.151", + "246.109", + "246.364", + "246.619", + "246.779", + "247.038", + "247.292", + "247.452", + "248.135", + "248.481", + "249.058", + "249.411", + "249.379", + "249.217", + "249.155", + "249.221", + "249.368", + "249.849", + "250.200", + "250.664", + "250.927", + "250.768", + "250.815", + "250.243", + "250.713", + "250.762", + "260.426", + "276.189", + "305.489", + "325.491", + "283.581", + "266.682", + "262.912", + "258.322", + "253.715", + "249.330", + "248.136", + "248.090", + "248.136", + "248.600", + "249.687", + "250.465", + "250.723", + "251.189", + "251.553", + "251.910", + "252.586", + "253.462", + "254.244", + "254.703", + "254.443", + "253.163", + "251.873", + "250.894", + "250.326", + "250.156", + "250.117", + "250.054", + "250.012", + "249.863", + "249.503", + "248.826", + "248.361", + "248.110", + "248.155", + "248.319", + "248.356", + "248.217", + "248.160", + "248.102", + "247.652", + "247.379", + "247.127", + "247.271", + "247.435", + "247.906", + "247.949", + "247.902", + "247.645", + "247.278", + "247.225", + "247.383", + "247.856", + "248.005", + "248.474", + "248.828", + "249.506", + "249.462", + "249.202", + "248.838", + "248.579", + "247.929", + "247.763", + "247.500", + "247.339", + "247.095", + "246.928", + "246.870", + "247.231", + "247.593", + "247.749", + "247.807", + "247.453", + "247.185", + "246.941", + "246.683", + "246.626", + "246.889", + "247.465", + "248.244", + "248.601", + "248.963", + "249.317", + "249.780", + "250.031", + "250.805", + "259.441", + "276.438", + "296.953", + "285.843", + "273.187", + "262.177", + "257.794", + "258.985", + "258.616", + "256.500", + "253.963", + "250.920", + "247.555", + "247.095", + "248.177", + "247.505", + "246.644", + "246.587", + "246.639", + "247.096", + "247.785", + "248.352", + "248.815", + "249.059", + "249.347", + "249.284", + "249.222", + "248.756", + "248.290", + "247.937", + "247.470", + "247.309", + "247.154", + "246.899", + "246.858", + "246.803", + "246.949", + "247.210", + "247.579", + "247.942", + "248.088", + "248.360", + "248.399", + "248.459", + "248.722", + "249.076", + "249.332", + "249.921", + "250.383", + "250.833", + "251.200", + "251.252", + "251.299", + "251.359", + "251.312", + "251.257", + "251.504", + "251.465", + "251.300", + "251.464", + "252.752", + "254.873", + "256.262", + "258.395", + "259.373", + "260.154", + "260.826", + "261.178", + "261.329", + "261.381", + "262.056", + "262.325", + "262.373", + "262.428", + "262.058", + "261.706", + "261.563", + "261.492", + "261.443", + "261.503", + "261.542", + "261.698", + "263.004", + "263.978", + "264.851", + "266.047", + "266.715", + "267.189", + "267.544", + "268.734", + "270.131", + "271.313", + "272.194", + "269.661", + "265.579", + "261.708", + "257.530", + "253.849", + "249.975", + "250.031", + "250.389", + "250.657", + "250.910", + "251.063", + "251.119", + "250.856", + "250.598", + "250.030", + "249.368", + "249.207", + "249.153", + "249.417", + "249.878", + "250.040", + "250.096", + "250.037", + "250.194", + "250.462", + "250.720", + "251.072", + "252.671", + "254.084", + "254.548", + "254.915", + "255.055", + "255.116", + "255.158", + "255.211", + "254.641", + "254.175", + "253.620", + "253.355", + "253.715", + "257.279", + "260.132", + "261.940", + "263.028", + "263.592", + "263.641", + "262.867", + "264.784", + "267.732", + "269.842", + "271.857", + "273.054", + "274.245", + "275.329", + "276.105", + "276.462", + "276.616", + "276.564", + "276.409", + "276.372", + "276.318", + "276.166", + "276.222", + "276.269", + "276.721", + "277.198", + "277.445", + "277.916", + "278.482", + "278.840", + "279.418", + "279.669", + "279.835", + "279.789", + "279.724", + "279.877", + "280.658", + "280.498", + "279.934", + "279.887", + "279.829", + "279.987", + "279.834", + "279.471", + "277.777", + "276.478", + "276.111", + "275.237", + "274.464", + "274.203", + "274.461", + "275.130", + "275.492", + "275.657", + "276.432", + "277.000", + "277.257", + "276.594", + "275.499", + "272.863", + "270.023", + "268.729", + "267.649", + "266.769", + "266.618", + "266.572", + "266.199", + "264.611", + "263.313", + "262.227", + "261.445", + "260.879", + "260.726", + "261.203", + "262.282", + "264.193", + "265.168", + "266.470", + "267.447", + "268.532", + "268.996", + "269.047", + "268.595", + "268.017", + "268.179", + "268.848", + "270.037", + "271.434", + "273.351", + "274.745", + "276.028", + "277.543", + "278.412", + "279.598", + "280.581", + "280.941", + "281.621", + "281.771", + "281.615", + "281.675", + "281.523", + "281.468", + "281.013", + "280.655", + "280.685", + "280.535", + "280.694", + "280.538", + "280.587", + "280.441", + "280.798", + "281.259", + "281.628", + "281.681", + "281.834", + "281.881", + "282.241", + "282.815", + "283.799", + "284.471", + "284.832", + "284.366", + "283.285", + "282.301", + "281.217", + "280.340", + "280.086", + "279.933", + "279.983", + "280.239", + "280.084", + "279.824", + "279.460", + "279.112", + "278.744", + "278.693", + "278.843", + "278.893", + "278.852", + "278.692", + "278.739", + "278.794", + "278.854", + "278.596", + "278.649", + "279.007", + "279.058", + "279.725", + "280.717", + "281.591", + "282.259", + "282.621", + "282.574", + "283.141", + "284.960", + "286.761", + "289.288", + "292.345", + "293.743", + "293.063", + "288.879", + "286.449", + "285.365", + "285.428", + "285.676", + "285.935", + "286.300", + "286.358", + "286.307", + "286.358", + "286.509", + "286.557", + "286.411", + "286.153", + "286.203", + "285.846", + "285.270", + "284.501", + "284.031", + "284.401", + "284.966", + "286.578", + "287.554", + "288.740", + "289.723", + "290.503", + "290.969", + "291.431", + "291.784", + "292.047", + "292.109", + "292.050", + "292.102", + "292.157", + "292.317", + "292.673", + "292.624", + "292.564", + "292.209", + "291.952", + "291.586", + "291.229", + "291.172", + "291.227", + "292.414", + "292.155", + "292.317", + "292.883", + "293.349", + "293.620", + "294.183", + "294.647", + "295.423", + "296.297", + "296.758", + "296.914", + "296.662", + "296.206", + "295.839", + "295.367", + "294.402", + "293.617", + "292.949", + "292.378", + "291.805", + "290.622", + "289.735", + "288.461", + "287.567", + "286.276", + "285.000", + "284.422", + "283.955", + "283.695", + "283.652", + "283.695", + "283.539", + "283.592", + "284.161", + "285.247", + "286.857", + "288.252", + "290.479", + "292.792", + "296.268", + "297.963", + "299.563", + "301.383", + "303.082", + "305.207", + "307.110", + "309.349", + "310.635", + "311.711", + "313.328", + "314.510", + "315.902", + "318.240", + "319.951", + "321.555", + "322.738", + "323.293", + "324.181", + "324.958", + "325.731", + "326.619", + "327.593", + "329.296", + "330.895", + "332.597", + "334.521", + "336.121", + "338.023", + "341.692", + "346.201", + "349.971", + "352.807", + "355.442", + "355.913", + "355.029", + "348.682", + "343.978", + "342.072", + "341.181", + "340.822", + "340.882", + "341.035", + "341.397", + "341.768", + "341.815", + "341.552", + "341.193", + "340.834", + "340.575", + "340.411", + "340.265", + "340.011", + "340.674", + "341.552", + "341.293", + "339.897", + "336.650", + "335.256", + "334.072", + "333.702", + "333.350", + "333.499", + "334.381", + "335.874", + "337.474", + "339.599", + "341.927", + "343.634", + "344.918", + "346.002", + "346.573", + "345.077", + "341.517", + "339.707", + "338.201", + "336.602", + "335.733", + "335.464", + "335.211", + "335.169", + "335.315", + "335.468", + "335.724", + "336.097", + "336.248", + "336.303", + "336.355", + "336.406", + "336.661", + "336.915", + "337.081", + "336.716", + "336.556", + "336.822", + "337.185", + "337.853", + "338.321", + "338.885", + "339.871", + "340.643", + "340.698", + "340.544", + "340.694", + "341.065", + "341.129", + "341.378", + "341.432", + "341.371", + "340.305", + "338.579", + "332.132", + "327.632", + "324.992", + "324.123", + "323.759", + "323.288", + "322.511", + "321.230", + "319.928", + "316.988", + "315.080", + "313.792", + "313.116", + "312.657", + "312.908", + "313.583", + "314.048", + "312.962", + "310.322", + "306.758", + "304.640", + "303.977", + "303.509", + "302.219", + "301.234", + "300.458", + "299.686", + "299.633", + "299.892", + "300.777", + "301.655", + "302.433", + "302.992", + "303.469", + "303.616", + "303.767", + "304.343", + "304.497", + "304.443", + "304.599", + "305.180", + "305.631", + "305.786", + "305.633", + "305.273", + "304.918", + "304.561", + "304.187", + "304.048", + "304.195", + "304.551", + "305.338", + "306.108", + "307.714", + "309.106", + "310.496", + "312.202", + "313.907", + "316.962", + "320.526", + "327.501", + "339.748", + "359.538", + "381.813", + "411.838", + "412.407", + "357.163", + "371.168", + "373.707", + "347.914", + "352.618", + "388.540", + "385.384", + "361.253", + "330.503", + "343.271", + "344.671", + "340.378", + "331.645", + "327.355", + "331.022", + "337.799", + "341.151", + "344.210", + "340.119", + "330.975", + "322.179", + "317.361", + "317.815", + "328.493", + "343.715", + "331.577", + "323.455", + "321.650", + "320.140", + "317.599", + "314.541", + "310.658", + "306.775", + "302.476", + "320.695", + "317.122", + "309.112", + "304.296", + "300.002", + "297.875", + "296.791", + "297.548", + "298.723", + "298.870", + "299.841", + "302.257", + "302.506", + "286.953", + "273.467", + "266.490", + "263.849", + "263.066", + "267.544", + "284.313", + "328.035", + "328.387", + "309.015", + "289.539", + "268.619", + "288.383", + "276.036", + "264.517", + "255.365", + "246.936", + "246.989", + "247.646", + "247.167", + "246.485", + "245.816", + "245.640", + "245.373", + "244.999", + "244.222", + "243.958", + "243.892", + "243.932", + "244.907", + "245.779", + "245.719", + "245.135", + "244.343", + "243.563", + "242.675", + "242.197", + "242.761", + "243.114", + "243.151", + "242.986", + "242.921", + "243.381", + "243.629", + "244.605", + "244.742", + "244.783", + "245.031", + "244.670", + "244.187", + "243.818", + "243.964", + "244.932", + "246.733", + "250.697", + "251.045", + "248.820", + "248.346", + "248.075", + "247.298", + "246.615", + "245.839", + "245.466", + "245.192", + "244.918", + "244.548", + "244.081", + "244.634", + "245.711", + "246.158", + "246.207", + "246.039", + "245.363", + "245.088", + "244.208", + "243.418", + "242.528", + "242.266", + "242.405", + "242.859", + "242.605", + "242.441", + "242.684", + "243.037", + "243.070", + "242.817", + "242.844", + "242.590", + "242.619", + "242.562", + "242.187", + "242.017", + "241.867", + "241.792", + "241.633", + "241.676", + "241.725", + "242.379", + "242.834", + "243.075", + "243.127", + "243.468", + "243.823", + "244.284", + "244.940", + "246.429", + "251.733", + "287.916", + "337.009", + "355.640", + "336.988", + "386.493", + "349.360", + "309.955", + "311.236", + "356.301", + "311.529", + "291.122", + "285.489", + "287.290", + "288.671", + "289.647", + "290.405", + "291.373", + "292.346", + "294.351", + "296.252", + "297.737", + "300.266", + "301.748", + "302.510", + "301.109", + "300.423", + "300.780", + "300.821", + "300.761", + "300.495", + "300.950", + "301.398", + "301.028", + "300.345", + "299.975", + "300.945", + "302.742", + "308.678", + "313.676", + "318.156", + "323.667", + "322.469", + "297.419", + "280.114", + "269.312", + "261.816", + "259.588", + "259.529", + "259.575", + "259.714", + "259.446", + "259.277", + "258.502", + "258.226", + "258.369", + "258.517", + "259.086", + "259.426", + "260.405", + "261.784", + "263.173", + "264.141", + "264.697", + "265.467", + "266.024", + "266.581" + ], + "RESD": [ + "2.923", + "2.925", + "2.917", + "2.898", + "2.890", + "2.844", + "2.748", + "2.725", + "2.748", + "2.845", + "2.939", + "3.088", + "3.338", + "3.580", + "3.870", + "4.097", + "3.848", + "3.267", + "2.853", + "2.630", + "2.502", + "2.431", + "2.429", + "2.490", + "2.687", + "2.807", + "2.972", + "3.129", + "3.276", + "3.310", + "3.395", + "3.548", + "3.763", + "4.113", + "4.436", + "4.706", + "4.702", + "4.558", + "4.179", + "3.903", + "3.693", + "3.554", + "3.531", + "3.581", + "3.707", + "3.787", + "3.950", + "4.334", + "4.964", + "5.590", + "5.997", + "6.092", + "6.132", + "6.069", + "5.711", + "5.062", + "4.503", + "4.238", + "4.140", + "4.206", + "4.306", + "4.253", + "4.171", + "4.044", + "3.936", + "3.881", + "3.834", + "3.845", + "3.906", + "3.895", + "3.885", + "3.902", + "3.965", + "4.167", + "4.503", + "4.996", + "5.380", + "5.600", + "5.585", + "5.275", + "4.973", + "4.662", + "4.226", + "3.924", + "3.645", + "3.501", + "3.524", + "3.731", + "3.965", + "4.090", + "4.101", + "3.991", + "3.728", + "3.423", + "3.357", + "3.759", + "4.155", + "4.786", + "5.299", + "5.825", + "6.178", + "6.196", + "5.864", + "5.579", + "4.991", + "4.375", + "3.987", + "3.731", + "3.511", + "3.587", + "3.841", + "4.136", + "4.429", + "4.653", + "4.844", + "5.006", + "5.106", + "4.804", + "4.330", + "3.514", + "2.906", + "2.699", + "2.858", + "3.183", + "3.484", + "4.237", + "4.675", + "4.174", + "3.921", + "4.082", + "4.265", + "4.416", + "4.454", + "4.407", + "4.314", + "4.206", + "4.071", + "3.991", + "3.798", + "3.662", + "3.511", + "3.475", + "3.485", + "3.601", + "3.841", + "4.246", + "4.512", + "4.619", + "4.675", + "4.670", + "4.649", + "4.627", + "4.623", + "4.601", + "4.597", + "4.576", + "4.554", + "4.541", + "4.546", + "4.558", + "4.563", + "4.567", + "4.580", + "4.601", + "4.648", + "4.715", + "4.755", + "4.785", + "4.817", + "4.848", + "4.891", + "4.905", + "4.908", + "4.913", + "4.881", + "4.849", + "4.808", + "4.584", + "4.139", + "3.655", + "3.138", + "3.118", + "3.407", + "3.745", + "4.116", + "4.741", + "5.019", + "5.024", + "5.086", + "5.129", + "5.144", + "5.177", + "5.231", + "5.305", + "5.330", + "5.304", + "5.279", + "5.197", + "5.048", + "4.867", + "4.755", + "4.723", + "4.799", + "4.894", + "5.038", + "5.148", + "5.172", + "5.217", + "5.250", + "5.275", + "5.280", + "5.266", + "5.270", + "5.295", + "5.319", + "5.354", + "5.340", + "5.335", + "5.350", + "5.365", + "5.379", + "5.364", + "5.319", + "5.294", + "5.309", + "5.445", + "5.754", + "6.184", + "6.759", + "7.387", + "8.212", + "8.792", + "8.573", + "7.627", + "6.835", + "5.879", + "5.289", + "5.052", + "4.936", + "4.922", + "4.917", + "4.894", + "4.872", + "4.877", + "4.881", + "4.923", + "4.944", + "4.923", + "4.908", + "4.867", + "4.873", + "4.867", + "4.863", + "4.849", + "4.845", + "4.830", + "4.817", + "4.803", + "4.808", + "4.830", + "4.854", + "4.831", + "4.836", + "4.858", + "4.872", + "4.978", + "5.076", + "5.186", + "5.250", + "5.207", + "5.001", + "4.688", + "4.563", + "4.499", + "4.420", + "4.375", + "4.346", + "4.358", + "4.379", + "4.366", + "4.370", + "4.391", + "4.420", + "4.350", + "4.313", + "4.230", + "4.210", + "4.206", + "4.163", + "4.082", + "3.980", + "3.902", + "3.841", + "3.816", + "3.820", + "3.816", + "3.841", + "3.896", + "3.973", + "4.044", + "4.124", + "4.183", + "4.211", + "4.254", + "4.289", + "4.367", + "4.478", + "4.679", + "4.935", + "5.579", + "6.132", + "6.579", + "6.784", + "6.230", + "5.819", + "5.435", + "5.028", + "4.592", + "4.139", + "4.006", + "4.225", + "4.867", + "5.379", + "6.024", + "7.004", + "8.158", + "9.290", + "11.361", + "14.668", + "12.131", + "9.717", + "7.237", + "6.041", + "5.090", + "4.428", + "4.066", + "3.812", + "3.696", + "3.686", + "3.731", + "3.805", + "3.902", + "4.009", + "4.222", + "4.321", + "4.366", + "4.403", + "4.448", + "4.486", + "4.524", + "4.528", + "4.533", + "4.563", + "4.567", + "4.605", + "4.610", + "4.640", + "4.679", + "4.727", + "4.688", + "4.597", + "4.449", + "4.354", + "4.383", + "4.436", + "4.550", + "4.545", + "4.358", + "4.109", + "3.961", + "3.891", + "3.837", + "3.841", + "3.925", + "4.002", + "4.113", + "4.178", + "4.253", + "4.314", + "4.309", + "4.233", + "4.174", + "4.109", + "4.036", + "3.920", + "3.815", + "3.713", + "3.634", + "3.544", + "3.514", + "3.452", + "3.379", + "3.332", + "3.268", + "3.222", + "3.206", + "3.167", + "3.182", + "3.191", + "3.212", + "3.227", + "3.285", + "3.363", + "3.507", + "3.798", + "4.143", + "4.537", + "4.803", + "5.211", + "5.506", + "5.615", + "5.215", + "4.444", + "4.043", + "3.920", + "3.830", + "3.776", + "3.766", + "3.805", + "3.851", + "3.898", + "3.961", + "3.987", + "4.021", + "4.047", + "4.081", + "4.132", + "4.182", + "4.233", + "4.285", + "4.354", + "4.473", + "4.683", + "4.996", + "4.736", + "4.383", + "4.281", + "4.214", + "4.186", + "4.159", + "4.155", + "4.166", + "4.178", + "4.206", + "4.186", + "4.159", + "4.132", + "4.082", + "4.002", + "3.852", + "3.748", + "3.682", + "3.624", + "3.580", + "3.524", + "3.501", + "3.517", + "3.567", + "3.728", + "3.895", + "4.100", + "4.245", + "4.265", + "4.253", + "4.234", + "4.229", + "4.233", + "4.190", + "4.139", + "4.104", + "4.024", + "3.917", + "3.819", + "3.682", + "3.543", + "3.385", + "3.168", + "3.077", + "2.983", + "2.898", + "2.831", + "2.766", + "2.742", + "2.745", + "2.773", + "2.849", + "2.983", + "3.118", + "3.209", + "3.366", + "3.484", + "3.614", + "3.755", + "3.909", + "4.047", + "4.135", + "4.147", + "4.144", + "4.116", + "4.112", + "4.062", + "4.013", + "3.920", + "3.808", + "3.638", + "3.501", + "3.413", + "3.378", + "3.394", + "3.494", + "3.638", + "3.752", + "3.672", + "3.662", + "3.631", + "3.621", + "3.610", + "3.614", + "3.631", + "3.675", + "3.727", + "3.780", + "3.833", + "3.895", + "3.935", + "3.969", + "3.979", + "4.036", + "4.116", + "4.190", + "4.202", + "4.112", + "3.920", + "3.669", + "3.465", + "3.297", + "3.173", + "3.194", + "3.338", + "3.560", + "3.995", + "4.499", + "5.057", + "5.138", + "4.745", + "4.358", + "3.972", + "3.675", + "3.530", + "3.527", + "3.611", + "3.655", + "3.699", + "3.766", + "3.833", + "4.006", + "4.170", + "4.399", + "4.554", + "4.592", + "4.511", + "4.399", + "4.297", + "4.293", + "4.428", + "4.618", + "4.881", + "5.061", + "5.230", + "5.335", + "5.420", + "5.455", + "5.369", + "5.274", + "5.182", + "5.177", + "5.269", + "5.496", + "5.884", + "6.444", + "6.758", + "6.958", + "6.809", + "6.383", + "5.863", + "5.506", + "5.250", + "5.090", + "4.991", + "4.940", + "4.890", + "4.867", + "4.871", + "4.839", + "4.780", + "4.662", + "4.596", + "4.465", + "4.370", + "4.309", + "4.265", + "4.214", + "4.186", + "4.166", + "4.170", + "4.262", + "4.338", + "4.398", + "4.470", + "4.490", + "4.520", + "4.567", + "4.666", + "4.741", + "4.816", + "4.857", + "4.880", + "4.858", + "4.844", + "4.858", + "4.835", + "4.804", + "4.763", + "4.740", + "4.719", + "4.715", + "4.684", + "4.661", + "4.623", + "4.593", + "4.554", + "4.498", + "4.420", + "4.390", + "4.370", + "4.325", + "4.313", + "4.366", + "4.486", + "4.750", + "5.105", + "5.621", + "6.063", + "6.103", + "5.563", + "5.119", + "4.889", + "4.740", + "4.545", + "4.342", + "4.123", + "3.858", + "3.617", + "3.449", + "3.319", + "3.297", + "3.319", + "3.404", + "3.557", + "3.788", + "4.047", + "4.221", + "4.085", + "3.816", + "3.511", + "3.291", + "2.994", + "2.866", + "3.022", + "3.328", + "3.651", + "3.946", + "4.234", + "4.341", + "4.370", + "4.466", + "4.545", + "4.644", + "4.807", + "5.033", + "5.329", + "5.579", + "6.007", + "6.467", + "6.783", + "6.726", + "6.462", + "5.923", + "5.429", + "4.921", + "4.640", + "4.465", + "4.346", + "4.285", + "4.241", + "4.222", + "4.241", + "4.206", + "4.147", + "4.120", + "4.241", + "4.601", + "5.029", + "5.354", + "5.797", + "6.431", + "7.042", + "7.541", + "7.477", + "6.867", + "6.167", + "5.579", + "4.889", + "4.374", + "4.092", + "3.881", + "3.805", + "3.873", + "4.024", + "4.398", + "4.898", + "5.235", + "5.419", + "5.355", + "5.279", + "5.118", + "4.781", + "4.432", + "4.178", + "4.066", + "4.002", + "3.998", + "3.994", + "4.006", + "4.070", + "4.237", + "4.322", + "4.383", + "4.419", + "4.482", + "4.613", + "4.794", + "4.973", + "5.109", + "5.279", + "5.444", + "5.584", + "5.579", + "5.523", + "5.465", + "5.379", + "5.354", + "5.420", + "5.600", + "5.786", + "5.945", + "6.040", + "6.046", + "5.995", + "5.802", + "5.543", + "5.314", + "4.963", + "4.723", + "4.701", + "4.884", + "5.171", + "5.364", + "5.378", + "5.235", + "4.945", + "4.723", + "4.562", + "4.498", + "4.596", + "4.931", + "5.379", + "5.857", + "6.330", + "6.752", + "7.297", + "7.740", + "7.909", + "7.698", + "7.216", + "6.714", + "6.413", + "6.383", + "6.413", + "6.552", + "6.759", + "6.970", + "7.229", + "7.456", + "7.533", + "7.484", + "7.547", + "7.784", + "8.074", + "8.204", + "8.210", + "8.096", + "7.806", + "7.442", + "7.394", + "7.401", + "7.619", + "7.990", + "8.318", + "8.420", + "8.165", + "7.625", + "6.608", + "5.444", + "4.085", + "3.117", + "2.474", + "1.927", + "1.727", + "1.622", + "1.549", + "1.616", + "1.721", + "1.863", + "2.063", + "2.444", + "2.944", + "3.641", + "4.265", + "5.071", + "5.764", + "6.046", + "6.132", + "6.103", + "5.985", + "5.912", + "5.840", + "5.857", + "6.006", + "6.348", + "6.679", + "7.157", + "7.500", + "7.185", + "6.618", + "5.191", + "3.937", + "3.708", + "3.843", + "4.141", + "4.729", + "5.261", + "5.842", + "6.134", + "6.111", + "6.021", + "5.965", + "6.044", + "6.453", + "6.851", + "7.060", + "6.776", + "6.218", + "5.979", + "6.092", + "6.529", + "7.498", + "7.990", + "9.279", + "10.898", + "11.922", + "11.464", + "8.678", + "6.948", + "5.450", + "4.563", + "5.020", + "5.885", + "7.269", + "9.114", + "11.863", + "13.932", + "15.674", + "17.051", + "17.020", + "14.685", + "12.981", + "11.200", + "8.967", + "7.780", + "7.008", + "6.126", + "5.405", + "4.681", + "4.154", + "3.748", + "3.504", + "3.332", + "3.174", + "3.024", + "2.974", + "2.974", + "3.030", + "3.169", + "3.487", + "3.716", + "4.042", + "4.471", + "5.078", + "5.565", + "6.226", + "6.913", + "7.634", + "8.653", + "9.290", + "9.000", + "8.384", + "7.737", + "7.220", + "6.515", + "6.103", + "5.858", + "5.804", + "5.902", + "6.208", + "6.604", + "6.972", + "7.091", + "6.921", + "6.544", + "6.459", + "6.820", + "7.308", + "8.424", + "9.638", + "10.583", + "11.427", + "11.535", + "9.841", + "7.938", + "6.391", + "5.204", + "4.465", + "4.128", + "3.889", + "3.760", + "3.789", + "3.941", + "4.091", + "4.335", + "4.603", + "4.933", + "5.179", + "5.437", + "5.581", + "5.357", + "4.665", + "4.086", + "3.598", + "3.140", + "2.791", + "2.684", + "2.797", + "3.182", + "3.435", + "3.668", + "3.872", + "3.759", + "3.501", + "3.411", + "3.515", + "3.676", + "3.824", + "3.999", + "4.238", + "4.491", + "4.671", + "4.760", + "4.932", + "5.130", + "5.237", + "5.247", + "5.045", + "4.771", + "4.345", + "4.101", + "4.003", + "3.981", + "4.033", + "4.298", + "4.598", + "5.077", + "5.523", + "6.260", + "7.016", + "7.893", + "8.913", + "10.606", + "12.226", + "10.372", + "7.970", + "6.889", + "6.205", + "5.726", + "5.558", + "5.548", + "5.528", + "5.426", + "5.198", + "5.073", + "5.017", + "4.924", + "4.852", + "4.852", + "4.916", + "6.280", + "7.487", + "8.777", + "10.004", + "11.255", + "12.381", + "13.418", + "14.380", + "15.154", + "15.791", + "16.271", + "16.517", + "16.799", + "16.957", + "17.182", + "17.474", + "17.574", + "17.608", + "17.478", + "17.220", + "16.934", + "16.559", + "15.834", + "14.449", + "12.236", + "10.576" + ] + } +} \ No newline at end of file diff --git a/docs/js/bundle.js b/docs/js/bundle.js index a25be8f..b378032 100644 --- a/docs/js/bundle.js +++ b/docs/js/bundle.js @@ -1,194 +1,238 @@ -(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; // v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],3:[function(require,module,exports){ -(function (global){ -!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.commonJsModule=e():"undefined"!=typeof global?global.commonJsModule=e():"undefined"!=typeof self&&(self.commonJsModule=e());}(function(){var define,module,exports;module={exports:(exports={})}; + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() { + } + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + + process.listeners = function (name) { + return [] + } + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { + return '/' + }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function () { + return 0; + }; + + }, {}], + 3: [function (require, module, exports) { + (function (global) { + !function (e) { + "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.commonJsModule = e() : "undefined" != typeof global ? global.commonJsModule = e() : "undefined" != typeof self && (self.commonJsModule = e()); + }(function () { + var define, module, exports; + module = {exports: (exports = {})}; // Copyright 2019 Justin Gosses @@ -203,1451 +247,1538 @@ process.umask = function() { return 0; }; // See the License for the specific language governing permissions and // limitations under the License. - // /////////////////////////////// - // /** - // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, - // * particularly those already converted to JSON, using the d3.js visualization library." - // * - // * It is designed with a single central function curveBox, that returns SVGs. - // * A variety of helper functions take in differently formatted JSONs of information about the well - // * log curves to plot and how to plot them. - // * - // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. - // * - // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a - // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. - // * - // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, - // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. - // */ - -module.exports = { -/** - * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" - * @returns {obj} It returns the wellio.js object and all its functions as a module. - */ -wellio:require("wellio"), - -/** - * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" - * @returns {obj} It returns the d3.js object and all its functions as a module. - */ - d3:require("d3"), - -/** - * A function that directs users to the docs if they need help. - * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. - */ -help:function(){ - return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; -}, - - - /** - * A function that returns a short description of what the wellioviz library is all about. - * @returns {string} Returns a string that defines wellioviz. - */ - define_wellioviz: function(){ - return "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library."; - }, - /////////////////////////////// - -/** - * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. - * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. - * This is used to help construct the JSON object that is given to the curveBox plotting function. - * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. - * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" - */ -curveBoxTemplateExamples: function (string_of_either__help_example_definitions_mandatories){ - let request_string = string_of_either__help_example_definitions_mandatories; - if(request_string=="help"){ - return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; - } - if(request_string=="example"){ - return [{ - "curve_box":{ - "show_well_name":"yes", /// not built yet - "show_depth_type":"no", /// not built yet - "show_curve_units":"yes", /// not built yet - "curve_box_depth_min":-999, /// not built yet - "curve_box_depth_max":-999, /// not built yet - "take_out_null_or_visualize":"no", /// not built yet - "show_title":"no", - "width": 260, - "height": 500, - "height_multiplier_components":2, - "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, - "title": {"text": "", "title_font_size": "10px"}, /// not built yet - "div_id": "well_holder_3", /// Should be skip-able // default=random str? What happens if div doesn't exist? - "order_of_component":["curves","rectanges","lines"], /// not built yet - "lines_connected_across_curveboxes":"no", /// not built yet - "header_sep_svg_or_not":"yes", - "svg_header_height":"4em", - "gridlines":"yes", - "gridlines_color":"#D3D3D3", - "gridlines_stroke_width":0.20, - "grouped_or_independent_x_scales":"independent", - //// variables for how to draw mouseover of hover box - "mouseover_yes_or_no":"yes", //// "yes" or "no" - "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" - "mouseover_curvename":"default", //// default is first curve - "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black -}, - "components":[{ - "curves":[ - { "data_type":"curve", - "curve_names":["RHOB"], - "curve_colors":["black"], - "curve_stroke_dasharray":["solid"], - "stroke_linecap":["butt"], - "stroke_width":[1], - "fill":[ - {"curve_name":"RHOB","fill":"yes","fill_direction":"left","cutoffs":[0.21,2.23,2.24],"fill_colors":["gray","beige","white"],"curve2":""} - ], - "curve_units":["g/cm3"], - "depth_limits":[{"min":"autocalculate","max":"autocalculate"}], - "curve_limits":[{"curve_name":"","min":-10000000,"max":3}], - "data":[{"depth":1598.3,"RHOB":2.2322},{"depth":1598.4,"RHOB":2.0513},{"depth":1598.5,"RHOB":2.2548},{"depth":1598.6,"RHOB":2.9445},{"depth":1598.7,"RHOB":2.2223},{"depth":1598.8,"RHOB":2.447},{"depth":1598.9,"RHOB":2.598},{"depth":1599,"RHOB":2.8088},{"depth":1599.1,"RHOB":2.2248},{"depth":1599.2,"RHOB":2.2399},{"depth":1599.3,"RHOB":2.251},{"depth":1599.4,"RHOB":2.255},{"depth":1599.5,"RHOB":2.2526},{"depth":1599.6,"RHOB":2.2322},{"depth":1599.7,"RHOB":2.2513},{"depth":1599.8,"RHOB":2.2548},{"depth":1599.9,"RHOB":2.2445},{"depth":1600,"RHOB":2.2223},{"depth":1600.1,"RHOB":2.2047},{"depth":1600.2,"RHOB":2.198}], /// not built yet - "depth_curve_name":"DEPT",/// not built yet - ////// - "data_id":["placeholder_data_id",], /// not built yet - "well_names":[""], /// not built yet - "scale_linear_log_or_yours":["linear"], - "line_color": ["red"], /// not built yet - "max_depth": "autocalculate", /// not built yet - "min_depth": "autocalculate", /// not built yet - "depth_type_string":[""], - "depth_units_string":[""], - "null_value": [""], /// not built yet - } - ], - "lines":[ - { - "data_type":"line", /// not built yet - "label":"example", /// not built yet - "depth":-999, /// not built yet - "color":"red", /// not built yet - "stroke_width":"3px", /// not built yet - "stroke_style":"solid", /// not built yet - "transparency":1.0, /// not built yet - "stroke_linecap":"butt" - } - ], - "rectangles":[ - { - "data_type":"rectangle", - "depth_top":0, - "x_starting_upper_left_corner":0, - "width":100, - "height":100, - "stroke_width":"2px", - "stroke_linecap":"butt", - "fill":"red", - "opacity":0.5, - "label":"Core Example", // not built into plotting template yet - "label_orientation":"horizontal", // not built into plotting template yet - "lable_position":"right" // not built into plotting template yet - } - ] - }] -}]; - } - else if(request_string=="defintions"){ - return [{ - "curve_box":{ - "show_well_name":"yes or no. If '' is no", // not built yet - "show_depth_type":"yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No - "show_curve_units":"yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No - "curve_box_depth_min":"Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet - "curve_box_depth_max":"Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet - "take_out_null_or_visualize":"yes or no. If '' is no", // not built yet - "show_title":"yes or no. If '' is no", // not built yet - "width": "number, if blank default is 250", - "height": "number, if blank default is 500", - "height_multiplier_components":"An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.", - "margin": " should be an object like {\"top\": 10, \"right\": 10, \"bottom\": 30, \"left\": 60} if missing will default to these values", - "title": "object like:{\"text\": \"\", \"title_font_size\": \"10px\"} if default, an empty string, \"\" will skill", - "div_id": "should be a string that equals a div id like: 'well_holder' Do not include the #", ///What happens if div doesn't exist? - "order_of_component":"Should be an array of strings that correlate to component types like:[\"curves\",\"rectangles\",\"lines\"]", // not built yet - "lines_connected_across_curveboxes":"yes or no. If '' is no", // not built yet - "header_sep_svg_or_not":"yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", - "svg_header_height":"Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.", - "gridlines":"yes or no as strings. Default is 'yes'", - "gridlines_color":"Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", - "gridlines_stroke_width":"thickness of the line. Default is 0.20", - "grouped_or_independent_x_scales":"independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", - //// variables for how to draw mouseover of hover box - "mouseover_yes_or_no":"yes", //// "yes" or "no" - "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" - "mouseover_curvename":"default", //// default is first curve - "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black -}, - "components":[{ - "curves":[ - { "data_type":"requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.", // not built yet - "curve_names":"array of strings representing curve_names like: ['GR','RESD']", - "curve_colors":"array of strings representing colors using common names or rgb style like:[\"black\",\"rgb(205,0,0,1)\"]", - "curve_stroke_dasharray":"A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", - "stroke_width":"The width of the curve line. Example is '2px'. ", - "stroke_linecap":"Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", - "fill": "an array of objects one for each curve like: [{\"curve_name\":\"RHOB\",\"fill\":\"yes\",\"fill_direction\":\"left\",\"cutoffs\":[0.21,2.23,2.24],\"fill_colors\":[\"gray\",\"beige\",\"white\"],\"curve2\":\"\"}]", - "curve_units":"an array of strings that are curve units like: [\"g/cm2\",\"API\",\"\"] must equal length other curve fields", - "depth_limits":"An array of objects that contains the min and max depth for each curve like: [{\"min\":\"autocalculate\",\"max\":\"autocalculate\"}]", - "curve_limits":"An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{\"curve_name\":\"GR\",\"min\":0,\"max\":100},{\"curve_name\":\"PDF\",\"min\":0,\"max\":100}]", - "data":"Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{\"UWI\":\"111aa\",\"DEPTH\":4140.5,\"GR\":0},{\"UWI\":\"111aa\",\"DEPTH\":4141,\"GR\":0}] for the entire depth of the well being showin the curve_box", - "depth_curve_name":"A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", - ////// - "data_id":["array of strings whose length must equal curve_units, curve_names, etc."], // not built yet - "well_names":"An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.", // not built yet /// - "scale_linear_log_or_yours": "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", - - ////// Plotting things but need to be next to curve data or will be too confusing. - "line_color": "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", - "max_depth": "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", - "min_depth": "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", - "depth_type_string":"All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", - "depth_units_string":"units of depth, examples are meters,m., cm., feet, etc.", - "null_value": "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']" - } - ], - "lines":[ - { - "data_type":"must be string, will be ignored if not \"line\", \"curve\", or \"rectangle\"", - "label":"The label for horiztonal line in string form", - "depth":"number for the depth at which the line is placed", - "color":"string for the color of the line in common color name or RGB format. If '' then black will be used.", - "stroke_width":"A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", - "stroke_style":"Should be string, if not or doesnt exist will be treated as \"solid\"", - "stroke_width":"The width of the line. Example is '2px'. ", - "stroke_linecap":"Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", - "transparency":"Should be float between 0.0 and 1.0. Otherwise default is 1.0." - } - ], - "rectangles":[ - { - "data_type":"rectangle", - "depth_top":"A number for the depth of the upper left corner of the rectangle", // - "x_starting_upper_left_corner":"A number for the x axis value of the upper left corner of the rectangle", - "width":"Width of rectangle as number", - "height":"Height of rectangle as number", - "stroke_width":"The width of the line. Example is '2px'. ", - "stroke_linecap":"Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", - "fill":"String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", - "opacity":"Float between 0 and 1 that represents the opacity of the fill, default is 0.5", - "label":"String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet - "label_orientation":"A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet - "lable_position":"Exceptable strings are top, center, right, left, bottom. Default right." // not built into plotting template yet - } - ] - }] -}]; - } - else if(request_string=="mandatories"){ - return [ - "This is not yet populated!!!!" - ]; - } -}, - - /** - * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. - * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. - * It is used next by funtion ____ and ___. - * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. - */ - getFakeIncomingSparseDataExample: function () { - input_sparse_style = [{ - "single_curve_box_or_cross_section":"single", - "cross_section_title":"", - "width": 1040, /// not skippable, check if number // default if blank or missing =250 or autocalculate? - "height": 500, /// not skippable, check if number // default if blank or missing=500 - //////////////////////////// - "curve_boxes":[{ - "curve_box":{ - "show_well_name":"yes", // not built yet /// Should be skip-able /// default=No - "show_depth_type":"no", // not built yet /// Should be skip-able /// default=No - "show_curve_units":"yes", // not built yet /// Should be skip-able /// default=No - "curve_box_depth_min":-999, // not built yet /// Should be skip-able /// default=skip func if string or -999 - "curve_box_depth_max":-999, // not built yet /// Should be skip-able /// default=skip func if string or -999 - "take_out_null_or_visualize":"no", // not built yet /// Should be skip-able /// default=No - "show_title":"no", // not built into plotting template yet /// Should be skip-able /// default=No - "width": 260, /// not skippable, check if number // default if blank or missing =250 - "height": 500, /// not skippable, check if number // default if blank or missing=500 - "height_multiplier_components":3, // default if missing is 0.95 - "margin": {"top": 50, "right": 10, "bottom": 30, "left": 60}, /// not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. - "title": {"text": "", "title_font_size": "10px"}, /// Should be skip-able // default=skip - "div_id": "well_holder4", /// Should be skip-able // default=random str? What happens if div doesn't exist? - "order_of_component":["curves","rectangles","lines"], // not built yet, default is curve, then line, then rectangle - "lines_connected_across_curve_boxes":"no", // not built yet, default is skip function - "header_sep_svg_or_not":"yes", - "svg_header_height":"4em", - "gridlines":"yes", - "gridlines_color":"#D3D3D3", - "gridlines_stroke_width":0.20, - "grouped_or_independent_x_scales":"independent", - //// variables for how to draw mouseover of hover box - "mouseover_yes_or_no":"yes", //// "yes" or "no" - "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" - "mouseover_curvename":"default", //// default is first curve - "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black - - }, - "components":[{ - "curves":[ - { - "data_type":"curve", // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. - "data_id":"placeholder_data_id", // not built yet /// can be anything, just used for tracking & is optional - "well_name": "", // not built yet /// Ideally string. Will skip function if "" - "curve_type": "RHOB", // should be string. name of curve - "curve_values": [ - 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], /// Should be array. If not array, return error message? - "step": 0.1, /// Should be number. If not array, return error message? - "units": "g/cc", /// should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. - "scale_linear_log_or_yours": "linear", - ////// Plotting things but need to be next to curve data or will be too confusing. - "line_color": "rgb(205,0,0,1)", /// Test for string, if string use. If not string "black" - "curve_stroke_dasharray":"5,5", - "stroke_linecap":"butt", - "stroke_width":0.5, - "fill":{"curve_name":"RHOB","fill":"yes","fill_direction":"left","cutoffs":[0.21,2.23,2.24],"fill_colors":["gray","beige","white"],"curve2":""}, - "data_ID":"", - "max_depth": "1607.3", /// should be number, if not number or doens't exit then "autocalculate" - "min_depth": "1598.3", /// should be number, if not number or doens't exit then "autocalculate" - "depth_type_string":"TVDSS", /// should be string, if not or doesn't exist, then skip func - "depth_units_string":"md", - "depth_curve_name":"DEPTH", /// should be string, ideally all depth curve names are the same - "null_value": "", // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. - "x_max": 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" - "x_min": 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" - } - ], - "lines":[ - { - "data_type":"line", /// must be string, will be ignored if not "line", "curve", or "rectangle". - "label":"top 1", /// Ideally a string. - "depth":1601.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! - "color":"blue", /// should be string, if not or doesn't exist use "black" - "stroke_width":"3px", /// should be string, if not or doesn't exist use "1px" - "stroke_linecap":"butt", - "stroke_style":"solid", /// should be string, if not or doesn't exist use "solid" - "transparency":1.0 /// should be number between 0 and 1, if not or doesn't exist use 1. - }, - { - "data_type":"line", /// must be string, will be ignored if not "line", "curve", or "rectangle". - "label":"top 2", /// Ideally a string. - "depth":1602.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! - "color":"orange", /// should be string, if not or doesn't exist use "black" - "stroke_width":"5px", /// should be string, if not or doesn't exist use "1px" - "stroke_linecap":"butt", - "stroke_style":"solid", /// should be string, if not or doesn't exist use "solid" - "transparency":0.5 /// should be number between 0 and 1, if not or doesn't exist use 1. - } - ], - "rectangles":[ - { - "data_type":"rectangle", - "depth_top":1601, - "x_starting_upper_left_corner":0, - "width":100, - "height":100, - "stroke_width":"2px", - "stroke_linecap":"butt", - "fill":"red", - "opacity":0.5, - "label":"Core Example", // not built into plotting template yet - "label_orientation":"horizontal", // not built into plotting template yet - "lable_position":"right" // not built into plotting template yet - } - ] - }] - }] - }]; - return input_sparse_style; -} - , - - /////////////////////////////// - //// Functions for getting data from LAS files and reformatting to a wellio.js style JSON. - /////////////////////////////// - - /** - * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, - * array of curves names, and a string for UWI - * and returns the data array of objects that D3.js likes for data used in plotting. - * @param {object} well_log_json a full wellio style JSON - * @param {array} CurveNames array of curve names as strings - * @param {string} UWI a string the represents the well name - * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. - */ - convertWellJSONToObj:function (well_log_json,CurveNames,UWI,depth_curve_name){ - let depth = well_log_json["CURVES"][depth_curve_name]; - let curve_data = []; - for(let eachCr in CurveNames){ - curve_data.push(well_log_json["CURVES"][CurveNames[eachCr]]); - } - let array_of_obj = []; - if (depth.length === well_log_json["CURVES"][CurveNames[0]].length){ - for (let eachPt = 0; eachPt < depth.length; eachPt++) { - let obj = {}; - obj["UWI"] = UWI; - for (let i = 0; i < CurveNames.length; i++){ - obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); - } - array_of_obj.push(obj); - } - } - else{ - console.log("depth didn't match curve length"); - array_of_obj.push("depth didn't match curve length"); - } - return array_of_obj; -}, - - - /////////////////////////////// - //// Functions for getting basic information out of wellio.js style JSON for plotting - /////////////////////////////// - - /////// this require wellio! - // fileToJSON:function (afile){ - // return module.exports.wellio.las2json(afile) - // }, - ///////// - // turnFilesIntoTextIntoWellioJSON:function (files_array){ - // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js - // let logs_in_json = [] - // for (let i = 0; i < files_array.length; i++) { - // logs_in_json.push(module.exports.fileToJSON(files_array[i])) - // } - // return logs_in_json - // }, - - - /** - * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, - * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. - * the data array of objects that D3.js likes for data used in plotting. - * @param {object} jsonWell a full wellio style JSON - * @param {string} depth_curve_name String for the depth curve name - * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} - */ - fromJSONofWEllGetThingsForPlotting: function(jsonWell,depth_curve_name){ - curve_names = Object.keys(jsonWell["CURVES"]); - uwi = jsonWell["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; - depth_curve_name = depth_curve_name; - well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell,curve_names,uwi,depth_curve_name); - return {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi}; - }, - - - - - - /////////////////////////////// - //// Functions for reformatting data other than wellio.js style JSON - /////////////////////////////// - - - /** - * createDepthArray is a function that takes in a min float, max float, and step float value. - * and returns an array or depth values from the min to the max value going by the step value each step. - * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. - * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. - * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. - * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. - * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] - */ - createDepthArray: function (min,max,step){ - //// Returns an array of depth values from min to max, including both, with each being different by step value - //// ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) - let depth = []; - min = parseFloat(min); - max = parseFloat(max); - step = parseFloat(step); - let number_of_points = ((max-min)/step) +1; - let temp_depth = min; - for (let i = 0; i < number_of_points; i++) { - temp_depth = (min+(i*step)).toFixed(7); - depth.push(parseFloat(temp_depth)); - } - return depth;}, - - -/** - * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. -* THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! -*/ -takeInArraysAndGetObjectOfCurveDataForPlotting: function (arraysOfCurvesAndNames,CurveName, DepthName){ - //// would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") - // [{"depth":[],"curveData":[]}] - // [{"depth":[],"curveData":[]}] - let curveObj = []; - // make sure the curve data arrays are the same lenght, if not add null values - - // put them into object - let lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; - for (let i = 0; i < lengthOfCurve0; i++) { - let newObj = {[DepthName]:0,"RHOB":0}; - newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; - newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; - curveObj.push(newObj); - } - return curveObj; -}, - - -/** - * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, - * array of curves names, and a string for UWI - * and returns the data array of objects that D3.js likes for data used in plotting. - * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. - * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. - * @param {string} UWI A string for the well log UWI ID - * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data - * @returns {array} An array of objects properly formatted for next step ___. - */ -convertWellJSONToObjV2: function (depth, curve_data, UWI, CurveNames) { - depth = depth[0]; - array_of_obj = []; - for (eachPt in depth) { - obj = {}; - obj["UWI"] = UWI; - for (i in CurveNames) { - obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); - obj["DEPTH"] = parseFloat(depth[eachPt]); - } - array_of_obj.push(obj); - } - return array_of_obj; -}, - - - /////////////////////////////// - //// Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. - /////////////////////////////// - -/** - * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. - * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. - * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. - */ -putIncomingSparseJsonIntoPlottingTemplate: function (incoming_sparse,template){ - if (incoming_sparse[0]["single_curve_box_or_cross_section"] == "multiple"){ - console.log("THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE "); - return "THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE"; - } - else{ - let curve_box_obj = incoming_sparse[0]["curve_boxes"][0]; - let curve_box_overall = incoming_sparse[0]["curve_boxes"][0]["curve_box"]; - let curve_box_components = incoming_sparse[0]["curve_boxes"][0]["components"]; - template[0]["curve_box"] = curve_box_overall; - template[0]["components"][0]["lines"] = curve_box_components[0]["lines"]; - template[0]["components"][0]["rectangles"] = curve_box_components[0]["rectangles"]; - - ///// Establish template with empty arrays except for value that are shared for all curves - ///// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX - template[0]["components"][0]["curves"][0]["data_type"] = "curve"; - template[0]["components"][0]["curves"][0]["depth_type_string"]= curve_box_components[0]["curves"][0]["depth_type_string"]; - template[0]["components"][0]["curves"][0]["depth_units_string"]= curve_box_components[0]["curves"][0]["depth_units_string"]; - template[0]["components"][0]["curves"][0]["depth_curve_name"] = curve_box_components[0]["curves"][0]["depth_curve_name"]; - ///// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. - template[0]["components"][0]["curves"][0]["curve_names"] = []; - template[0]["components"][0]["curves"][0]["curve_colors"] = []; - template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"] = []; - template[0]["components"][0]["curves"][0]["stroke_width"] = []; - template[0]["components"][0]["curves"][0]["stroke_linecap"] = []; - template[0]["components"][0]["curves"][0]["fill"] = []; - template[0]["components"][0]["curves"][0]["data_id"] = []; - template[0]["components"][0]["curves"][0]["well_names"] = []; - template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"] = []; - template[0]["components"][0]["curves"][0]["line_color"] = []; - template[0]["components"][0]["curves"][0]["max_depth"] = []; - template[0]["components"][0]["curves"][0]["min_depth"] = []; - template[0]["components"][0]["curves"][0]["null_value"] = []; - - template[0]["components"][0]["curves"][0]["data"] = []; - - ///// For each curve object in incoming data: - let array_individual_curves_and_depth_objects = []; - let all_depths_list = []; - let all_depths_set = []; - - for (let i = 0; i < curve_box_components[0]["curves"].length; i++) { - - let curve = curve_box_components[0]["curves"][i]; - template[0]["components"][0]["curves"][0]["curve_names"].push(curve["curve_type"]); - template[0]["components"][0]["curves"][0]["curve_colors"].push(curve["line_color"]); - template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"].push(curve["curve_stroke_dasharray"]); - template[0]["components"][0]["curves"][0]["stroke_width"].push(curve["stroke_width"]); - template[0]["components"][0]["curves"][0]["stroke_linecap"].push(curve["stroke_linecap"]); - template[0]["components"][0]["curves"][0]["fill"].push(curve["fill"]); - template[0]["components"][0]["curves"][0]["data_id"].push(curve["data_id"]); - template[0]["components"][0]["curves"][0]["well_names"].push(curve["well_name"]); - template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"].push(curve["scale_linear_log_or_yours"]); - template[0]["components"][0]["curves"][0]["line_color"].push(curve["line_color"]); - template[0]["components"][0]["curves"][0]["max_depth"].push(curve["max_depth"]); - template[0]["components"][0]["curves"][0]["min_depth"].push(curve["min_depth"]); - template[0]["components"][0]["curves"][0]["null_value"].push(curve["null_value"]); - //// - let depth_array = module.exports.createDepthArray(curve["min_depth"],curve["max_depth"],curve["step"]); - let curve_array = curve["curve_values"]; - let curve_name = curve["curve_type"]; - let depth_curve_name = curve["depth_curve_name"]; - //// the function below is off...someting undefined - let obj_starter = [{[depth_curve_name]:depth_array,[curve_name]:curve_array}]; - - let reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter,curve_name,depth_curve_name); - //// - array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); - //// - - all_depths_list = all_depths_list.concat(depth_array); - } - - /// Get array of unique depth values from all curves by calling set on an array of depth values - all_depths_set = [...new Set(all_depths_list)]; - - let objects_helper = {}; - - for (let j = 0; j < all_depths_set.length; j++) { - /// create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] - objects_helper[all_depths_set[j]] = {[template[0]["components"][0]["curves"][0]["depth_curve_name"]]:all_depths_set[j]}; - } - - //// now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} - //// for each curve {"depth":value,"curve_name":value} in each curve array of objects... - /////// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object - for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { - let this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; - for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { - let this_obj = this_depth_plus_curve_obj[l]; - - let curve_name = curve_box_components[0]["curves"][k]["curve_type"]; - let depth_name = curve_box_components[0]["curves"][k]["depth_curve_name"]; - - /// add curve value as key/value pair to right object based on depth key - - objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; - - } - } - - /// get rid of depth key and just have the objects..put in array if not returned as array - //// return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] - let data = Object.keys(objects_helper).map(function(key){return objects_helper[key];}); - - let depth_name = template[0]["components"][0]["curves"][0]["depth_curve_name"]; - data = data.sort(function(a, b) { - return parseFloat(a.depth_name) - parseFloat(b.depth_name); -}); - // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) - function sortFloat(a,b) { return a - b; } - function sortNumber(a, b) { - return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); -} - template[0]["components"][0]["curves"][0]["data"] = data.sort(sortNumber); - return template; - - } -}, - - - /////////////////////////////// - //// Functions that take Wellio.js style JSON and handle everything from transformation to plotting - /////////////////////////////// - -/** - * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! - * @param {*} logs_in_json - * @param {*} div_id - * @param {*} example_template - * @param {*} curve_name - * @param {*} curve_color - * @param {*} curve_unit - * @param {*} fill - * @param {*} depth_name - * @param {*} width - * @param {*} height - */ -putArrayOfLogsIntoSection: function (logs_in_json,div_id,example_template,curve_name,curve_color,curve_unit,fill,depth_name, width, height){ - const noSVG =module.exports.d3.select("#"+div_id).selectAll("svg").remove(); - // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) - let new_templates = []; - for (let i = 0; i < logs_in_json.length; i++) { - let three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i],depth_name); - let new_data =three_things2["well_log_curves_reformatted_for_d3"]; - let example_template_n = JSON.parse(JSON.stringify(example_template)); - example_template_n[0]["components"][0]["curves"][0]["data"] = new_data; - example_template_n[0]["components"][0]["curves"][0]["well_names"] = [three_things2["uwi"]]; - example_template_n[0]["components"][0]["curves"][0]["curve_names"] = [curve_name]; - example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = [curve_color]; - example_template_n[0]["components"][0]["curves"][0]["curve_units"] = [curve_unit]; - example_template_n[0]["components"][0]["curves"][0]["fill"] = [fill]; - example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_name; - let svg_holder =module.exports.d3.select("#"+div_id).append("div"); - svg_holder.style("vertical-align","middle") - .attr("id",div_id+"svg_holder"+i) - .style("display","inline-block"); - example_template_n[0]["curve_box"]["div_id"] = div_id+"svg_holder"+i; - example_template_n[0]["curve_box"]["width"] = width; - example_template_n[0]["curve_box"]["height"] = height; - new_templates.push(example_template_n); - module.exports.curveBox(example_template_n); - } - return new_templates; -}, - -/** - * minimumDataIntoTemplateFunc - * @param - */ -minimumDataIntoTemplateFunc: function (example_template,data,well_names,curve_names,curve_colors,curve_units,fill,div_id,width,height,depth_curve_name){ - //// remember that all curve components should be an array, even if one item! - let example_template_n = JSON.parse(JSON.stringify(example_template)); - example_template_n[0]["components"][0]["curves"][0]["data"] = data; - example_template_n[0]["components"][0]["curves"][0]["well_names"] = well_names; - example_template_n[0]["components"][0]["curves"][0]["curve_names"] = curve_names; - example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = curve_colors; - example_template_n[0]["components"][0]["curves"][0]["curve_units"] = curve_units; - example_template_n[0]["components"][0]["curves"][0]["fill"] = fill; - example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_curve_name; - example_template_n[0]["curve_box"]["div_id"] = div_id; - example_template_n[0]["curve_box"]["width"] = width; - example_template_n[0]["curve_box"]["height"] = height; - return example_template_n; -}, - - - - /////////////////////////////// - //// Actual plotting functions after all the necessary information is compiled in necessary format - /////////////////////////////// - - /** - * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. - * @param {object} well_curve_config_template - * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. - */ - curveBox:function (template_for_plotting){ - let d3 = module.exports.d3; - - ////////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// - //// These parts of the function establish variables from the config JSON in shorter variable names - //// If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined - // default values might be defined here for cases where they are accidentally not defined - - let template_overall = template_for_plotting[0]["curve_box"]; - let template_components = template_for_plotting[0]["components"]; - let template_curves = template_components[0]["curves"][0]; - let template_lines = template_components[0]["lines"]; - let template_rectangles = template_components[0]["rectangles"]; - let title = ""; - //// Determine if title exists for the curve_box. - if(template_overall["show_title"] != "yes"){let title = "";} - else{title=template_overall["title"]["text"];} - /// Parameters that define shape & size of overall curve box - let width = template_overall["width"]; - let height_multiplier_components = 0.95; - if (template_overall["height_multiplier_components"]){ - height_multiplier_components = template_overall["height_multiplier_components"]; - } - let height = template_overall["height"]*height_multiplier_components; - let height_components = template_overall["height"]; - let margin = template_overall["margin"]; - let header_sep_svg_or_not = template_overall["header_sep_svg_or_not"]; - let svg_header_height = template_overall["svg_header_height"]; - let gridlines = template_overall["gridlines"]; - let gridlines_color = template_overall["gridlines_color"]; - let gridlines_stroke_width = template_overall["gridlines_stroke_width"]; - //// variables for how to draw mouseover of hover box - let mouseover_yes_or_no = template_overall["mouseover_yes_or_no"]; - let mouseover_depth_or_depth_and_curve = template_overall["mouseover_depth_or_depth_and_curve"]; - let mouseover_curvename = template_overall["mouseover_curvename"]; //// default is first curve - let mouseover_color_or_default_which_is_curve_color = template_overall["mouseover_color_or_default_which_is_curve_color"]; - - let secondary_depth_exist = "no"; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW - - //// Data is in d3.js form. An array of objects consisting of single level key:value pairs - let data = template_curves["data"]; - //// Variables related to curves, these should all be arrays with one or more values! - let curve_names = template_curves["curve_names"]; - let curve_colors = template_curves["curve_colors"]; - let curve_stroke_dasharray = template_curves["curve_stroke_dasharray"]; - let curve_name = curve_names[0]; - let curve_color = curve_colors[0]; - let curve_units = template_curves["curve_units"]; - let scale_linear_log_or_yours = template_curves["scale_linear_log_or_yours"]; - if(template_curves["curve_units"]){curve_units = template_curves["curve_units"];} - else{curve_units = "";} - - //////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON - let flag_for_single_scale_or_independent_scales = template_overall["grouped_or_independent_x_scales"]; - let grouped_or_independent_x_scale = template_overall["grouped_or_independent_x_scales"]; - - - //// The depth_curve_name needs to be the same for all curves plotted! - let depth_curve_name = ""; - if (template_curves["depth_curve_name"].length > 1 && typeof(template_curves["depth_curve_name"]) == "object" && template_curves["depth_curve_name"][0] !== template_curves["depth_curve_name"][1] - ){ - depth_curve_name = "depth_curve_name is not the same in two or more curves"; - } - else{ - depth_curve_name = template_curves["depth_curve_name"]; - } - let depth_type_string = ""; - if( - template_curves["depth_type_string"].length > 1 && typeof(template_curves["depth_type_string"]) == "object" && template_curves["depth_type_string"][0] != template_curves["depth_type_string"][1] - ){ - depth_type_string = "depth type string is not the same in two or more curves"; - } - else if (template_curves["depth_type_string"][0] == ""){depth_type_string = "";} - else if (template_curves["depth_type_string"]){depth_type_string = "- "+template_curves["depth_type_string"];} - let depth_units_string = ""; - if(template_curves["depth_units_string"] && template_curves["depth_units_string"][0] !== ""){ - depth_units_string = "- " + template_curves["depth_units_string"]; - } - - ///// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// - let div_id = template_overall["div_id"]; - if(template_overall["div_id"]){div_id = template_overall["div_id"];} - else{return "there_was_no_div_id_in_the_template";} - - d3.select("#"+div_id).selectAll("*").remove(); - - ///////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + // /////////////////////////////// + // /** + // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, + // * particularly those already converted to JSON, using the d3.js visualization library." + // * + // * It is designed with a single central function curveBox, that returns SVGs. + // * A variety of helper functions take in differently formatted JSONs of information about the well + // * log curves to plot and how to plot them. + // * + // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. + // * + // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a + // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. + // * + // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, + // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. + // */ + + module.exports = { + /** + * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" + * @returns {obj} It returns the wellio.js object and all its functions as a module. + */ + wellio: require("wellio"), + + /** + * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" + * @returns {obj} It returns the d3.js object and all its functions as a module. + */ + d3: require("d3"), + + /** + * A function that directs users to the docs if they need help. + * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. + */ + help: function () { + return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; + }, + + + /** + * A function that returns a short description of what the wellioviz library is all about. + * @returns {string} Returns a string that defines wellioviz. + */ + define_wellioviz: function () { + return "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library."; + }, + /////////////////////////////// + + /** + * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. + * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. + * This is used to help construct the JSON object that is given to the curveBox plotting function. + * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. + * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" + */ + curveBoxTemplateExamples: function (string_of_either__help_example_definitions_mandatories) { + let request_string = string_of_either__help_example_definitions_mandatories; + if (request_string == "help") { + return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; + } + if (request_string == "example") { + return [{ + "curve_box": { + "show_well_name": "yes", /// not built yet + "show_depth_type": "no", /// not built yet + "show_curve_units": "yes", /// not built yet + "curve_box_depth_min": -999, /// not built yet + "curve_box_depth_max": -999, /// not built yet + "take_out_null_or_visualize": "no", /// not built yet + "show_title": "no", + "width": 260, + "height": 500, + "height_multiplier_components": 2, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "well_holder_3", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectanges", "lines"], /// not built yet + "lines_connected_across_curveboxes": "no", /// not built yet + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "curve", + "curve_names": ["RHOB"], + "curve_colors": ["black"], + "curve_stroke_dasharray": ["solid"], + "stroke_linecap": ["butt"], + "stroke_width": [1], + "fill": [ + { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + } + ], + "curve_units": ["g/cm3"], + "depth_limits": [{"min": "autocalculate", "max": "autocalculate"}], + "curve_limits": [{"curve_name": "", "min": -10000000, "max": 3}], + "data": [{"depth": 1598.3, "RHOB": 2.2322}, { + "depth": 1598.4, + "RHOB": 2.0513 + }, {"depth": 1598.5, "RHOB": 2.2548}, { + "depth": 1598.6, + "RHOB": 2.9445 + }, {"depth": 1598.7, "RHOB": 2.2223}, { + "depth": 1598.8, + "RHOB": 2.447 + }, {"depth": 1598.9, "RHOB": 2.598}, { + "depth": 1599, + "RHOB": 2.8088 + }, {"depth": 1599.1, "RHOB": 2.2248}, { + "depth": 1599.2, + "RHOB": 2.2399 + }, {"depth": 1599.3, "RHOB": 2.251}, { + "depth": 1599.4, + "RHOB": 2.255 + }, {"depth": 1599.5, "RHOB": 2.2526}, { + "depth": 1599.6, + "RHOB": 2.2322 + }, {"depth": 1599.7, "RHOB": 2.2513}, { + "depth": 1599.8, + "RHOB": 2.2548 + }, {"depth": 1599.9, "RHOB": 2.2445}, { + "depth": 1600, + "RHOB": 2.2223 + }, {"depth": 1600.1, "RHOB": 2.2047}, {"depth": 1600.2, "RHOB": 2.198}], /// not built yet + "depth_curve_name": "DEPT",/// not built yet + ////// + "data_id": ["placeholder_data_id",], /// not built yet + "well_names": [""], /// not built yet + "scale_linear_log_or_yours": ["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string": [""], + "depth_units_string": [""], + "null_value": [""], /// not built yet + } + ], + "lines": [ + { + "data_type": "line", /// not built yet + "label": "example", /// not built yet + "depth": -999, /// not built yet + "color": "red", /// not built yet + "stroke_width": "3px", /// not built yet + "stroke_style": "solid", /// not built yet + "transparency": 1.0, /// not built yet + "stroke_linecap": "butt" + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 0, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "defintions") { + return [{ + "curve_box": { + "show_well_name": "yes or no. If '' is no", // not built yet + "show_depth_type": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "curve_box_depth_max": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "take_out_null_or_visualize": "yes or no. If '' is no", // not built yet + "show_title": "yes or no. If '' is no", // not built yet + "width": "number, if blank default is 250", + "height": "number, if blank default is 500", + "height_multiplier_components": "An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.", + "margin": " should be an object like {\"top\": 10, \"right\": 10, \"bottom\": 30, \"left\": 60} if missing will default to these values", + "title": "object like:{\"text\": \"\", \"title_font_size\": \"10px\"} if default, an empty string, \"\" will skill", + "div_id": "should be a string that equals a div id like: 'well_holder' Do not include the #", ///What happens if div doesn't exist? + "order_of_component": "Should be an array of strings that correlate to component types like:[\"curves\",\"rectangles\",\"lines\"]", // not built yet + "lines_connected_across_curveboxes": "yes or no. If '' is no", // not built yet + "header_sep_svg_or_not": "yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", + "svg_header_height": "Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.", + "gridlines": "yes or no as strings. Default is 'yes'", + "gridlines_color": "Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", + "gridlines_stroke_width": "thickness of the line. Default is 0.20", + "grouped_or_independent_x_scales": "independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.", // not built yet + "curve_names": "array of strings representing curve_names like: ['GR','RESD']", + "curve_colors": "array of strings representing colors using common names or rgb style like:[\"black\",\"rgb(205,0,0,1)\"]", + "curve_stroke_dasharray": "A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", + "stroke_width": "The width of the curve line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "an array of objects one for each curve like: [{\"curve_name\":\"RHOB\",\"fill\":\"yes\",\"fill_direction\":\"left\",\"cutoffs\":[0.21,2.23,2.24],\"fill_colors\":[\"gray\",\"beige\",\"white\"],\"curve2\":\"\"}]", + "curve_units": "an array of strings that are curve units like: [\"g/cm2\",\"API\",\"\"] must equal length other curve fields", + "depth_limits": "An array of objects that contains the min and max depth for each curve like: [{\"min\":\"autocalculate\",\"max\":\"autocalculate\"}]", + "curve_limits": "An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{\"curve_name\":\"GR\",\"min\":0,\"max\":100},{\"curve_name\":\"PDF\",\"min\":0,\"max\":100}]", + "data": "Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{\"UWI\":\"111aa\",\"DEPTH\":4140.5,\"GR\":0},{\"UWI\":\"111aa\",\"DEPTH\":4141,\"GR\":0}] for the entire depth of the well being showin the curve_box", + "depth_curve_name": "A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", + ////// + "data_id": ["array of strings whose length must equal curve_units, curve_names, etc."], // not built yet + "well_names": "An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.", // not built yet /// + "scale_linear_log_or_yours": "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", + + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", + "max_depth": "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", + "min_depth": "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", + "depth_type_string": "All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", + "depth_units_string": "units of depth, examples are meters,m., cm., feet, etc.", + "null_value": "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']" + } + ], + "lines": [ + { + "data_type": "must be string, will be ignored if not \"line\", \"curve\", or \"rectangle\"", + "label": "The label for horiztonal line in string form", + "depth": "number for the depth at which the line is placed", + "color": "string for the color of the line in common color name or RGB format. If '' then black will be used.", + "stroke_width": "A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", + "stroke_style": "Should be string, if not or doesnt exist will be treated as \"solid\"", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "transparency": "Should be float between 0.0 and 1.0. Otherwise default is 1.0." + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": "A number for the depth of the upper left corner of the rectangle", // + "x_starting_upper_left_corner": "A number for the x axis value of the upper left corner of the rectangle", + "width": "Width of rectangle as number", + "height": "Height of rectangle as number", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", + "opacity": "Float between 0 and 1 that represents the opacity of the fill, default is 0.5", + "label": "String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet + "label_orientation": "A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet + "lable_position": "Exceptable strings are top, center, right, left, bottom. Default right." // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "mandatories") { + return [ + "This is not yet populated!!!!" + ]; + } + }, + + /** + * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. + * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. + * It is used next by funtion ____ and ___. + * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. + */ + getFakeIncomingSparseDataExample: function () { + input_sparse_style = [{ + "single_curve_box_or_cross_section": "single", + "cross_section_title": "", + "width": 1040, /// not skippable, check if number // default if blank or missing =250 or autocalculate? + "height": 500, /// not skippable, check if number // default if blank or missing=500 + //////////////////////////// + "curve_boxes": [{ + "curve_box": { + "show_well_name": "yes", // not built yet /// Should be skip-able /// default=No + "show_depth_type": "no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "curve_box_depth_max": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "take_out_null_or_visualize": "no", // not built yet /// Should be skip-able /// default=No + "show_title": "no", // not built into plotting template yet /// Should be skip-able /// default=No + "width": 260, /// not skippable, check if number // default if blank or missing =250 + "height": 500, /// not skippable, check if number // default if blank or missing=500 + "height_multiplier_components": 3, // default if missing is 0.95 + "margin": {"top": 50, "right": 10, "bottom": 30, "left": 60}, /// not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. + "title": {"text": "", "title_font_size": "10px"}, /// Should be skip-able // default=skip + "div_id": "well_holder4", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectangles", "lines"], // not built yet, default is curve, then line, then rectangle + "lines_connected_across_curve_boxes": "no", // not built yet, default is skip function + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + + }, + "components": [{ + "curves": [ + { + "data_type": "curve", // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. + "data_id": "placeholder_data_id", // not built yet /// can be anything, just used for tracking & is optional + "well_name": "", // not built yet /// Ideally string. Will skip function if "" + "curve_type": "RHOB", // should be string. name of curve + "curve_values": [ + 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], /// Should be array. If not array, return error message? + "step": 0.1, /// Should be number. If not array, return error message? + "units": "g/cc", /// should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. + "scale_linear_log_or_yours": "linear", + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "rgb(205,0,0,1)", /// Test for string, if string use. If not string "black" + "curve_stroke_dasharray": "5,5", + "stroke_linecap": "butt", + "stroke_width": 0.5, + "fill": { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + }, + "data_ID": "", + "max_depth": "1607.3", /// should be number, if not number or doens't exit then "autocalculate" + "min_depth": "1598.3", /// should be number, if not number or doens't exit then "autocalculate" + "depth_type_string": "TVDSS", /// should be string, if not or doesn't exist, then skip func + "depth_units_string": "md", + "depth_curve_name": "DEPTH", /// should be string, ideally all depth curve names are the same + "null_value": "", // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. + "x_max": 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + "x_min": 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + } + ], + "lines": [ + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 1", /// Ideally a string. + "depth": 1601.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "blue", /// should be string, if not or doesn't exist use "black" + "stroke_width": "3px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 1.0 /// should be number between 0 and 1, if not or doesn't exist use 1. + }, + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 2", /// Ideally a string. + "depth": 1602.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "orange", /// should be string, if not or doesn't exist use "black" + "stroke_width": "5px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 0.5 /// should be number between 0 and 1, if not or doesn't exist use 1. + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 1601, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }] + }]; + return input_sparse_style; + } + , + + /////////////////////////////// + //// Functions for getting data from LAS files and reformatting to a wellio.js style JSON. + /////////////////////////////// + + /** + * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {object} well_log_json a full wellio style JSON + * @param {array} CurveNames array of curve names as strings + * @param {string} UWI a string the represents the well name + * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. + */ + convertWellJSONToObj: function (well_log_json, CurveNames, UWI, depth_curve_name) { + let depth = well_log_json["CURVES"][depth_curve_name]; + let curve_data = []; + for (let eachCr in CurveNames) { + curve_data.push(well_log_json["CURVES"][CurveNames[eachCr]]); + } + let array_of_obj = []; + if (depth.length === well_log_json["CURVES"][CurveNames[0]].length) { + for (let eachPt = 0; eachPt < depth.length; eachPt++) { + let obj = {}; + obj["UWI"] = UWI; + for (let i = 0; i < CurveNames.length; i++) { + obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); + } + array_of_obj.push(obj); + } + } else { + console.log("depth didn't match curve length"); + array_of_obj.push("depth didn't match curve length"); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions for getting basic information out of wellio.js style JSON for plotting + /////////////////////////////// + + /////// this require wellio! + // fileToJSON:function (afile){ + // return module.exports.wellio.las2json(afile) + // }, + ///////// + // turnFilesIntoTextIntoWellioJSON:function (files_array){ + // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + // let logs_in_json = [] + // for (let i = 0; i < files_array.length; i++) { + // logs_in_json.push(module.exports.fileToJSON(files_array[i])) + // } + // return logs_in_json + // }, + + + /** + * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, + * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. + * the data array of objects that D3.js likes for data used in plotting. + * @param {object} jsonWell a full wellio style JSON + * @param {string} depth_curve_name String for the depth curve name + * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} + */ + fromJSONofWEllGetThingsForPlotting: function (jsonWell, depth_curve_name) { + curve_names = Object.keys(jsonWell["CURVES"]); + uwi = jsonWell["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + depth_curve_name = depth_curve_name; + well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell, curve_names, uwi, depth_curve_name); + return { + "well_log_curves_reformatted_for_d3": well_log_curves_reformatted_for_d3, + "curve_names": curve_names, + "uwi": uwi + }; + }, + + + /////////////////////////////// + //// Functions for reformatting data other than wellio.js style JSON + /////////////////////////////// + + + /** + * createDepthArray is a function that takes in a min float, max float, and step float value. + * and returns an array or depth values from the min to the max value going by the step value each step. + * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. + * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. + * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. + * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. + * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] + */ + createDepthArray: function (min, max, step) { + //// Returns an array of depth values from min to max, including both, with each being different by step value + //// ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) + let depth = []; + min = parseFloat(min); + max = parseFloat(max); + step = parseFloat(step); + let number_of_points = ((max - min) / step) + 1; + let temp_depth = min; + for (let i = 0; i < number_of_points; i++) { + temp_depth = (min + (i * step)).toFixed(7); + depth.push(parseFloat(temp_depth)); + } + return depth; + }, + + + /** + * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. + * THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! + */ + takeInArraysAndGetObjectOfCurveDataForPlotting: function (arraysOfCurvesAndNames, CurveName, DepthName) { + //// would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") + // [{"depth":[],"curveData":[]}] + // [{"depth":[],"curveData":[]}] + let curveObj = []; + // make sure the curve data arrays are the same lenght, if not add null values + + // put them into object + let lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; + for (let i = 0; i < lengthOfCurve0; i++) { + let newObj = {[DepthName]: 0, "RHOB": 0}; + newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; + newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; + curveObj.push(newObj); + } + return curveObj; + }, + + + /** + * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. + * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. + * @param {string} UWI A string for the well log UWI ID + * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data + * @returns {array} An array of objects properly formatted for next step ___. + */ + convertWellJSONToObjV2: function (depth, curve_data, UWI, CurveNames) { + depth = depth[0]; + array_of_obj = []; + for (eachPt in depth) { + obj = {}; + obj["UWI"] = UWI; + for (i in CurveNames) { + obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); + obj["DEPTH"] = parseFloat(depth[eachPt]); + } + array_of_obj.push(obj); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. + /////////////////////////////// + + /** + * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. + * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. + * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. + */ + putIncomingSparseJsonIntoPlottingTemplate: function (incoming_sparse, template) { + if (incoming_sparse[0]["single_curve_box_or_cross_section"] == "multiple") { + console.log("THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE "); + return "THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE"; + } else { + let curve_box_obj = incoming_sparse[0]["curve_boxes"][0]; + let curve_box_overall = incoming_sparse[0]["curve_boxes"][0]["curve_box"]; + let curve_box_components = incoming_sparse[0]["curve_boxes"][0]["components"]; + template[0]["curve_box"] = curve_box_overall; + template[0]["components"][0]["lines"] = curve_box_components[0]["lines"]; + template[0]["components"][0]["rectangles"] = curve_box_components[0]["rectangles"]; + + ///// Establish template with empty arrays except for value that are shared for all curves + ///// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX + template[0]["components"][0]["curves"][0]["data_type"] = "curve"; + template[0]["components"][0]["curves"][0]["depth_type_string"] = curve_box_components[0]["curves"][0]["depth_type_string"]; + template[0]["components"][0]["curves"][0]["depth_units_string"] = curve_box_components[0]["curves"][0]["depth_units_string"]; + template[0]["components"][0]["curves"][0]["depth_curve_name"] = curve_box_components[0]["curves"][0]["depth_curve_name"]; + ///// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. + template[0]["components"][0]["curves"][0]["curve_names"] = []; + template[0]["components"][0]["curves"][0]["curve_colors"] = []; + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"] = []; + template[0]["components"][0]["curves"][0]["stroke_width"] = []; + template[0]["components"][0]["curves"][0]["stroke_linecap"] = []; + template[0]["components"][0]["curves"][0]["fill"] = []; + template[0]["components"][0]["curves"][0]["data_id"] = []; + template[0]["components"][0]["curves"][0]["well_names"] = []; + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"] = []; + template[0]["components"][0]["curves"][0]["line_color"] = []; + template[0]["components"][0]["curves"][0]["max_depth"] = []; + template[0]["components"][0]["curves"][0]["min_depth"] = []; + template[0]["components"][0]["curves"][0]["null_value"] = []; + + template[0]["components"][0]["curves"][0]["data"] = []; + + ///// For each curve object in incoming data: + let array_individual_curves_and_depth_objects = []; + let all_depths_list = []; + let all_depths_set = []; + + for (let i = 0; i < curve_box_components[0]["curves"].length; i++) { + + let curve = curve_box_components[0]["curves"][i]; + template[0]["components"][0]["curves"][0]["curve_names"].push(curve["curve_type"]); + template[0]["components"][0]["curves"][0]["curve_colors"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"].push(curve["curve_stroke_dasharray"]); + template[0]["components"][0]["curves"][0]["stroke_width"].push(curve["stroke_width"]); + template[0]["components"][0]["curves"][0]["stroke_linecap"].push(curve["stroke_linecap"]); + template[0]["components"][0]["curves"][0]["fill"].push(curve["fill"]); + template[0]["components"][0]["curves"][0]["data_id"].push(curve["data_id"]); + template[0]["components"][0]["curves"][0]["well_names"].push(curve["well_name"]); + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"].push(curve["scale_linear_log_or_yours"]); + template[0]["components"][0]["curves"][0]["line_color"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["max_depth"].push(curve["max_depth"]); + template[0]["components"][0]["curves"][0]["min_depth"].push(curve["min_depth"]); + template[0]["components"][0]["curves"][0]["null_value"].push(curve["null_value"]); + //// + let depth_array = module.exports.createDepthArray(curve["min_depth"], curve["max_depth"], curve["step"]); + let curve_array = curve["curve_values"]; + let curve_name = curve["curve_type"]; + let depth_curve_name = curve["depth_curve_name"]; + //// the function below is off...someting undefined + let obj_starter = [{[depth_curve_name]: depth_array, [curve_name]: curve_array}]; + + let reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter, curve_name, depth_curve_name); + //// + array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); + //// + + all_depths_list = all_depths_list.concat(depth_array); + } + + /// Get array of unique depth values from all curves by calling set on an array of depth values + all_depths_set = [...new Set(all_depths_list)]; + + let objects_helper = {}; + + for (let j = 0; j < all_depths_set.length; j++) { + /// create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] + objects_helper[all_depths_set[j]] = {[template[0]["components"][0]["curves"][0]["depth_curve_name"]]: all_depths_set[j]}; + } + + //// now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} + //// for each curve {"depth":value,"curve_name":value} in each curve array of objects... + /////// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object + for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { + let this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; + for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { + let this_obj = this_depth_plus_curve_obj[l]; + + let curve_name = curve_box_components[0]["curves"][k]["curve_type"]; + let depth_name = curve_box_components[0]["curves"][k]["depth_curve_name"]; + + /// add curve value as key/value pair to right object based on depth key + + objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; + + } + } + + /// get rid of depth key and just have the objects..put in array if not returned as array + //// return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] + let data = Object.keys(objects_helper).map(function (key) { + return objects_helper[key]; + }); + + let depth_name = template[0]["components"][0]["curves"][0]["depth_curve_name"]; + data = data.sort(function (a, b) { + return parseFloat(a.depth_name) - parseFloat(b.depth_name); + }); + + // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) + function sortFloat(a, b) { + return a - b; + } + + function sortNumber(a, b) { + return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); + } + + template[0]["components"][0]["curves"][0]["data"] = data.sort(sortNumber); + return template; + + } + }, + + + /////////////////////////////// + //// Functions that take Wellio.js style JSON and handle everything from transformation to plotting + /////////////////////////////// + + /** + * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! + * @param {*} logs_in_json + * @param {*} div_id + * @param {*} example_template + * @param {*} curve_name + * @param {*} curve_color + * @param {*} curve_unit + * @param {*} fill + * @param {*} depth_name + * @param {*} width + * @param {*} height + */ + putArrayOfLogsIntoSection: function (logs_in_json, div_id, example_template, curve_name, curve_color, curve_unit, fill, depth_name, width, height) { + const noSVG = module.exports.d3.select("#" + div_id).selectAll("svg").remove(); + // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) + let new_templates = []; + for (let i = 0; i < logs_in_json.length; i++) { + let three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i], depth_name); + let new_data = three_things2["well_log_curves_reformatted_for_d3"]; + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = new_data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = [three_things2["uwi"]]; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = [curve_name]; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = [curve_color]; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = [curve_unit]; + example_template_n[0]["components"][0]["curves"][0]["fill"] = [fill]; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_name; + let svg_holder = module.exports.d3.select("#" + div_id).append("div"); + svg_holder.style("vertical-align", "middle") + .attr("id", div_id + "svg_holder" + i) + .style("display", "inline-block"); + example_template_n[0]["curve_box"]["div_id"] = div_id + "svg_holder" + i; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + new_templates.push(example_template_n); + module.exports.curveBox(example_template_n); + } + return new_templates; + }, + + /** + * minimumDataIntoTemplateFunc + * @param + */ + minimumDataIntoTemplateFunc: function (example_template, data, well_names, curve_names, curve_colors, curve_units, fill, div_id, width, height, depth_curve_name) { + //// remember that all curve components should be an array, even if one item! + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = well_names; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = curve_names; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = curve_colors; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = curve_units; + example_template_n[0]["components"][0]["curves"][0]["fill"] = fill; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_curve_name; + example_template_n[0]["curve_box"]["div_id"] = div_id; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + return example_template_n; + }, + + + /////////////////////////////// + //// Actual plotting functions after all the necessary information is compiled in necessary format + /////////////////////////////// + + /** + * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. + * @param {object} well_curve_config_template + * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. + */ + curveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + + ////////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// + //// These parts of the function establish variables from the config JSON in shorter variable names + //// If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined + // default values might be defined here for cases where they are accidentally not defined + + let template_overall = template_for_plotting[0]["curve_box"]; + let template_components = template_for_plotting[0]["components"]; + let template_curves = template_components[0]["curves"][0]; + let template_lines = template_components[0]["lines"]; + let template_rectangles = template_components[0]["rectangles"]; + let title = ""; + //// Determine if title exists for the curve_box. + if (template_overall["show_title"] != "yes") { + let title = ""; + } else { + title = template_overall["title"]["text"]; + } + /// Parameters that define shape & size of overall curve box + let width = template_overall["width"]; + let height_multiplier_components = 0.95; + if (template_overall["height_multiplier_components"]) { + height_multiplier_components = template_overall["height_multiplier_components"]; + } + let height = template_overall["height"] * height_multiplier_components; + let height_components = template_overall["height"]; + let margin = template_overall["margin"]; + let header_sep_svg_or_not = template_overall["header_sep_svg_or_not"]; + let svg_header_height = template_overall["svg_header_height"]; + let gridlines = template_overall["gridlines"]; + let gridlines_color = template_overall["gridlines_color"]; + let gridlines_stroke_width = template_overall["gridlines_stroke_width"]; + //// variables for how to draw mouseover of hover box + let mouseover_yes_or_no = template_overall["mouseover_yes_or_no"]; + let mouseover_depth_or_depth_and_curve = template_overall["mouseover_depth_or_depth_and_curve"]; + let mouseover_curvename = template_overall["mouseover_curvename"]; //// default is first curve + let mouseover_color_or_default_which_is_curve_color = template_overall["mouseover_color_or_default_which_is_curve_color"]; + + let secondary_depth_exist = "no"; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW + + //// Data is in d3.js form. An array of objects consisting of single level key:value pairs + let data = template_curves["data"]; + //// Variables related to curves, these should all be arrays with one or more values! + let curve_names = template_curves["curve_names"]; + let curve_colors = template_curves["curve_colors"]; + let curve_stroke_dasharray = template_curves["curve_stroke_dasharray"]; + let curve_name = curve_names[0]; + let curve_color = curve_colors[0]; + let curve_units = template_curves["curve_units"]; + let scale_linear_log_or_yours = template_curves["scale_linear_log_or_yours"]; + if (template_curves["curve_units"]) { + curve_units = template_curves["curve_units"]; + } else { + curve_units = ""; + } + + //////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON + let flag_for_single_scale_or_independent_scales = template_overall["grouped_or_independent_x_scales"]; + let grouped_or_independent_x_scale = template_overall["grouped_or_independent_x_scales"]; + + + //// The depth_curve_name needs to be the same for all curves plotted! + let depth_curve_name = ""; + if (template_curves["depth_curve_name"].length > 1 && typeof (template_curves["depth_curve_name"]) == "object" && template_curves["depth_curve_name"][0] !== template_curves["depth_curve_name"][1] + ) { + depth_curve_name = "depth_curve_name is not the same in two or more curves"; + } else { + depth_curve_name = template_curves["depth_curve_name"]; + } + let depth_type_string = ""; + if ( + template_curves["depth_type_string"].length > 1 && typeof (template_curves["depth_type_string"]) == "object" && template_curves["depth_type_string"][0] != template_curves["depth_type_string"][1] + ) { + depth_type_string = "depth type string is not the same in two or more curves"; + } else if (template_curves["depth_type_string"][0] == "") { + depth_type_string = ""; + } else if (template_curves["depth_type_string"]) { + depth_type_string = "- " + template_curves["depth_type_string"]; + } + let depth_units_string = ""; + if (template_curves["depth_units_string"] && template_curves["depth_units_string"][0] !== "") { + depth_units_string = "- " + template_curves["depth_units_string"]; + } + + ///// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// + let div_id = template_overall["div_id"]; + if (template_overall["div_id"]) { + div_id = template_overall["div_id"]; + } else { + return "there_was_no_div_id_in_the_template"; + } + + d3.select("#" + div_id).selectAll("*").remove(); + + ///////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// // //// Calculate depth min and max if depth min and/or max is not given explicitly in the template - let depth_min; - let depth_max; - if(!template_curves["depth_limits"] || template_curves["depth_limits"][0]["min"] == "autocalculate") - {depth_min = d3.min(data, function(d) { return +d[depth_curve_name];});} - else - {depth_min = template_curves["depth_limits"][0]["min"];} - //// max depth - if(!template_curves["depth_limits"] || template_curves["depth_limits"][0]["max"] == "autocalculate") - {depth_max = d3.max(data, function(d) { return +d[depth_curve_name];});} - else - {depth_max = template_curves["depth_limits"][0]["max"];} - - - // [depth_max,depth_min] - //// Apply depth min and max to incoming well log data - //// To save time, we'll first check if the first object in the array had as depth that is smaller than min - //// and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. - - if(data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max){} - else{data = data.filter(function(objects){ - return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; -});} - - // let depth_min = -1000000 - // let depth_max = 1000000 - - if(template_curves["min_depth"][0] == "autocalculate" || template_curves["min_depth"] == "autocalculate"){ - depth_min = data[0][depth_curve_name]; - } - else{depth_min = template_curves["min_depth"];} - if(template_curves["max_depth"][0] == "autocalculate" || template_curves["max_depth"] == "autocalculate"){ - depth_max = data[data.length-1][depth_curve_name]; - } - else{depth_max = template_curves["max_depth"];} - - // let depth_min = template_curves["min_depth"][0] - // let depth_max = template_curves["max_depth"][0] - - ///////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// - - ////////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// - let svg = ""; - let svg_holder = ""; - let svg_header = ""; - if (header_sep_svg_or_not == "yes"){ - - svg_holder = d3.select("#"+div_id).append("div") - .attr("class","svg_holder") - .style("overflow-x","auto"); - - svg_header = d3.select("#"+div_id+" div.svg_holder").append("svg"); - svg_header.attr("class","header"); - svg_header.attr("width",width) - .attr("height",svg_header_height); ///// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! - svg_header.append("g"); - svg_header.style("display","block"); - - let depth_string_on_top = ""; - if(depth_type_string == ""){ - depth_string_on_top = depth_curve_name; - } - else{depth_string_on_top = depth_type_string.replace("- ","");} - - svg_header.append("text") - .attr("x", (margin.left)/2) - .attr("y", "1em") - .attr("text-anchor", "middle") - .style("font-size", "10px") - .style("text-decoration", "underline") - .text(depth_curve_name); - if(depth_type_string != ""){ - let depth_type_string_x_pos = 0; - let depth_type_string_x_pos_anch = "start"; - if(secondary_depth_exist == "no"){ - depth_type_string_x_pos = margin.left/2; - depth_type_string_x_pos_anch = "middle"; - } - svg_header.append("text") - .attr("x", depth_type_string_x_pos) - .attr("y", "3em") - .attr("text-anchor", depth_type_string_x_pos_anch) - .style("font-size", "8px") - .style("text-decoration", "underline") - .text(depth_string_on_top); - } - - //svg_header.append("text") - // .attr("x", margin.left) - // .attr("y", "4em") - // .attr("text-anchor", "end") - // .style("font-size", "6px") - // .style("text-decoration", "underline") - // .text("2nd TVD"); - - ///////// change this!!!!! - if(title !== "Elephants"){ - let distance_from_top = -15; - svg_header.append("text") // - .attr("x", (margin.left/3+(width/2))) - .attr("y", 0 + (- distance_from_top)) - .attr("text-anchor", "middle") - .style("font-size", template_overall["title"]["title_font_size"]) - .text(title); - } - - const curveBox_main_div = d3.select("#"+div_id).append("div"); - curveBox_main_div - .attr("height",height_components+"px") - .attr("class","component_outter") - .style("display","flex") - .style("position","relative") - .style("box-sizing","border-box"); - - const curveBox_sub_div = d3.select("#"+div_id+" div.component_outter").append("div"); - curveBox_sub_div - .attr("class","component_inner") - .style("overflow-y","auto") - .style("position","absolute") - .style("max-height",height_components+"px"); - - svg = d3.select("#"+div_id+" div.component_outter div.component_inner").append("svg"); - } - - else{ - svg = d3.select("#"+div_id).append("svg"); - } - - ////////////// Calculate Axis & Scales =>////////////// - //// Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. - //// For zero curves, need to look into rectange and lines for x scales maybe? - //// Need to handle scales in linear, log, or arbitary user-provided scale. - //// Also, need x function for gridlines! so....? - - ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// - let mins = []; - let maxes = []; - for (let i = 0; i < curve_names.length; i++) { - let min_this = d3.min(data, function(d) { return +d[curve_names[i]];}); - let max_this = d3.max(data, function(d) { return +d[curve_names[i]];}); - mins.push(min_this); - maxes.push(max_this); - } - let min_all_curves = d3.min(mins); - let max_all_curves = d3.max(maxes); - - if (curve_names.length == 0){ - //// THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! - min_all_curves = 0; - max_all_curves = 100; - } - ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// - let x_func; - let x; - let xAxis_header; - let xAxis; - if (flag_for_single_scale_or_independent_scales = "single"){ - for (let i = 0; i < curve_names.length; i++) { - let min_this = d3.min(data, function(d) { return +d[curve_names[i]];}); - let max_this = d3.max(data, function(d) { return +d[curve_names[i]];}); - mins.push(min_this); - maxes.push(max_this); - } - min_all_curves = d3.min(mins); - max_all_curves = d3.max(maxes); - x = d3.scaleLinear().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]); - if(scale_linear_log_or_yours == "log"){ - x = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]); - } - else if(scale_linear_log_or_yours == "linear"){} - else if(typeof(scale_linear_log_or_yours) !== "string"){ - x = scale_linear_log_or_yours["yours"]; - } - xAxis_header = g => g.attr("transform", "translate(0,45)").call(d3.axisBottom(x).ticks((width-margin.left-margin.right)/25).tickSizeOuter(0)); - - - } - - //////////////////// define y scale, aka the one for the depth //////////////////// - let y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom,margin.top]); - //let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) - let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); - let yAxis2 = g => g.attr("transform", `translate(${margin.left-35},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); - - - ////////////// Building curvebox parts that aren't header. First define size & title =>////////////// - svg.attr("class","components"); - svg.attr("width",width) - .attr("height",height); - svg.style("margin","0 auto"); - svg.style("overflow","scroll"); - - if (header_sep_svg_or_not == "no"){ - let xAxis = xAxis_header; - svg.append("g") - .call(xAxis) - .append("text") - .text("test svg"); - } - - let y_axis_text = depth_curve_name+" "+depth_units_string+" "+depth_type_string; - svg.append("g") - .call(yAxis) - .append("text") - .attr("transform", "rotate(-90)") - .attr("dy", ".75em") - .attr("y", 0 - (margin.left*0.6)) - .attr("x",((height)/-2)+margin.top) - .style("text-anchor", "end") - .text(y_axis_text) - .style("fill","#2b2929"); - - //// - // svg.append("g") - // .call(yAxis2) - // .append("text") - // .attr("transform", "rotate(-90)") - // .attr("dy", ".75em") - // .attr("y", -35) - // .attr("x",((height)/-2)+margin.top) - // .style("text-anchor", "end") - // .text(y_axis_text+"THIS IS THE SECOND ONE") - // .style("fill","#2b2929") - //// - - //svg.append("g") - //// Code that assumes multiple curves are plotted in same curvebox - let distance_from_top = -15; - if(title !== ""){ - svg.append("text") // - .attr("x", (margin.left/3+(width/2))) - .attr("y", 0 + (- distance_from_top)) - .attr("text-anchor", "middle") - .style("font-size", template_overall["title"]["title_font_size"]) - .text(title); - } - - if(gridlines == "yes"){ - var gridlines_obj = d3.axisTop() - .ticks((width-margin.left-margin.right)/25) - .tickFormat("") - .tickSize(-height+margin.top+10) - .scale(x); - svg.append("g") - .attr("class", "grid") - .call(gridlines_obj) - .style("stroke",gridlines_color) - .style("stroke-width",gridlines_stroke_width); - } - - -// //// This will help save the x axis function for first curve if there are more than one curve + let depth_min; + let depth_max; + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["min"] == "autocalculate") { + depth_min = d3.min(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_min = template_curves["depth_limits"][0]["min"]; + } + //// max depth + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["max"] == "autocalculate") { + depth_max = d3.max(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_max = template_curves["depth_limits"][0]["max"]; + } + + + // [depth_max,depth_min] + //// Apply depth min and max to incoming well log data + //// To save time, we'll first check if the first object in the array had as depth that is smaller than min + //// and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. + + if (data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max) { + } else { + data = data.filter(function (objects) { + return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; + }); + } + + // let depth_min = -1000000 + // let depth_max = 1000000 + + if (template_curves["min_depth"][0] == "autocalculate" || template_curves["min_depth"] == "autocalculate") { + depth_min = data[0][depth_curve_name]; + } else { + depth_min = template_curves["min_depth"]; + } + if (template_curves["max_depth"][0] == "autocalculate" || template_curves["max_depth"] == "autocalculate") { + depth_max = data[data.length - 1][depth_curve_name]; + } else { + depth_max = template_curves["max_depth"]; + } + + // let depth_min = template_curves["min_depth"][0] + // let depth_max = template_curves["max_depth"][0] + + ///////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + + ////////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// + let svg = ""; + let svg_holder = ""; + let svg_header = ""; + if (header_sep_svg_or_not == "yes") { + + svg_holder = d3.select("#" + div_id).append("div") + .attr("class", "svg_holder") + .style("overflow-x", "auto"); + + svg_header = d3.select("#" + div_id + " div.svg_holder").append("svg"); + svg_header.attr("class", "header"); + svg_header.attr("width", width) + .attr("height", svg_header_height); ///// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! + svg_header.append("g"); + svg_header.style("display", "block"); + + let depth_string_on_top = ""; + if (depth_type_string == "") { + depth_string_on_top = depth_curve_name; + } else { + depth_string_on_top = depth_type_string.replace("- ", ""); + } + + svg_header.append("text") + .attr("x", (margin.left) / 2) + .attr("y", "1em") + .attr("text-anchor", "middle") + .style("font-size", "10px") + .style("text-decoration", "underline") + .text(depth_curve_name); + if (depth_type_string != "") { + let depth_type_string_x_pos = 0; + let depth_type_string_x_pos_anch = "start"; + if (secondary_depth_exist == "no") { + depth_type_string_x_pos = margin.left / 2; + depth_type_string_x_pos_anch = "middle"; + } + svg_header.append("text") + .attr("x", depth_type_string_x_pos) + .attr("y", "3em") + .attr("text-anchor", depth_type_string_x_pos_anch) + .style("font-size", "8px") + .style("text-decoration", "underline") + .text(depth_string_on_top); + } + + //svg_header.append("text") + // .attr("x", margin.left) + // .attr("y", "4em") + // .attr("text-anchor", "end") + // .style("font-size", "6px") + // .style("text-decoration", "underline") + // .text("2nd TVD"); + + ///////// change this!!!!! + if (title !== "Elephants") { + let distance_from_top = -15; + svg_header.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + const curveBox_main_div = d3.select("#" + div_id).append("div"); + curveBox_main_div + .attr("height", height_components + "px") + .attr("class", "component_outter") + .style("display", "flex") + .style("position", "relative") + .style("box-sizing", "border-box"); + + const curveBox_sub_div = d3.select("#" + div_id + " div.component_outter").append("div"); + curveBox_sub_div + .attr("class", "component_inner") + .style("overflow-y", "auto") + .style("position", "absolute") + .style("max-height", height_components + "px"); + + svg = d3.select("#" + div_id + " div.component_outter div.component_inner").append("svg"); + } else { + svg = d3.select("#" + div_id).append("svg"); + } + + ////////////// Calculate Axis & Scales =>////////////// + //// Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. + //// For zero curves, need to look into rectange and lines for x scales maybe? + //// Need to handle scales in linear, log, or arbitary user-provided scale. + //// Also, need x function for gridlines! so....? + + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let mins = []; + let maxes = []; + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + let min_all_curves = d3.min(mins); + let max_all_curves = d3.max(maxes); + + if (curve_names.length == 0) { + //// THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! + min_all_curves = 0; + max_all_curves = 100; + } + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let x_func; + let x; + let xAxis_header; + let xAxis; + if (flag_for_single_scale_or_independent_scales = "single") { + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + min_all_curves = d3.min(mins); + max_all_curves = d3.max(maxes); + x = d3.scaleLinear().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + xAxis_header = g => g.attr("transform", "translate(0,45)").call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + + + } + + //////////////////// define y scale, aka the one for the depth //////////////////// + let y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom, margin.top]); + //let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + let yAxis2 = g => g.attr("transform", `translate(${margin.left - 35},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + + + ////////////// Building curvebox parts that aren't header. First define size & title =>////////////// + svg.attr("class", "components"); + svg.attr("width", width) + .attr("height", height); + svg.style("margin", "0 auto"); + svg.style("overflow", "scroll"); + + if (header_sep_svg_or_not == "no") { + let xAxis = xAxis_header; + svg.append("g") + .call(xAxis) + .append("text") + .text("test svg"); + } + + let y_axis_text = depth_curve_name + " " + depth_units_string + " " + depth_type_string; + svg.append("g") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("dy", ".75em") + .attr("y", 0 - (margin.left * 0.6)) + .attr("x", ((height) / -2) + margin.top) + .style("text-anchor", "end") + .text(y_axis_text) + .style("fill", "#2b2929"); + + //// + // svg.append("g") + // .call(yAxis2) + // .append("text") + // .attr("transform", "rotate(-90)") + // .attr("dy", ".75em") + // .attr("y", -35) + // .attr("x",((height)/-2)+margin.top) + // .style("text-anchor", "end") + // .text(y_axis_text+"THIS IS THE SECOND ONE") + // .style("fill","#2b2929") + //// + + //svg.append("g") + //// Code that assumes multiple curves are plotted in same curvebox + let distance_from_top = -15; + if (title !== "") { + svg.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + if (gridlines == "yes") { + var gridlines_obj = d3.axisTop() + .ticks((width - margin.left - margin.right) / 25) + .tickFormat("") + .tickSize(-height + margin.top + 10) + .scale(x); + svg.append("g") + .attr("class", "grid") + .call(gridlines_obj) + .style("stroke", gridlines_color) + .style("stroke-width", gridlines_stroke_width); + } + + +// //// This will help save the x axis function for first curve if there are more than one curve // /// and they are at different scales. We need this in order to use the 'between' method of fill! -// let x_for_k_is_0 -// //// This will help save the x axis function for second curve if there are more than one curve +// let x_for_k_is_0 +// //// This will help save the x axis function for second curve if there are more than one curve // /// and they are at different scales. We need this in order to use the 'between' method of fill! // let x_for_k_is_1 -// //// This will help save the x axis function for third curve if there are more than one curve +// //// This will help save the x axis function for third curve if there are more than one curve // /// and they are at different scales. We need this in order to use the 'between' method of fill! // let x_for_k_is_2 -// //// This will help save the x axis function for fourth curve if there are more than one curve +// //// This will help save the x axis function for fourth curve if there are more than one curve // /// and they are at different scales. We need this in order to use the 'between' method of fill! // let x_for_k_is_3 - - let x_functions_for_each_curvename = {}; //// populate with {"curvename":curvename,"x_func":func} - - ////////////// Building curves within curvebox =>////////////// - for (let k = 0; k < curve_names.length; k++) { - //// code that creates a line for each Curve in order provided and applies - //// the color in the color array in order provided - - let curveUnit = ""; - if (curve_units[k]){curveUnit = curve_units[k];} - let min = mins[k]; - let max = maxes[k]; - - let header_text_line = min.toFixed(1)+" - "+curve_names[k]+" "+curveUnit+" - "+max.toFixed(1); - let min_this = d3.min(data, function(d) { return +d[curve_names[k]];}); - let max_this = d3.max(data, function(d) { return +d[curve_names[k]];}); - let x = d3.scaleLinear().domain([min_this,max_this]).nice().range([margin.left, width - margin.right]); - if(scale_linear_log_or_yours == "log"){ - x = d3.scaleLog().domain([min_this,max_this]).nice().range([margin.left, width - margin.right]); - } - else if(scale_linear_log_or_yours == "linear"){} - else if(typeof(scale_linear_log_or_yours) !== "string"){ - x = scale_linear_log_or_yours["yours"]; - } - if(k==0){ - x_func == x; - } - //// This creates an object to hold multiple x axis scale functions - //// that will be used if 'between' style fill is selected. - x_functions_for_each_curvename[curve_names[k]] = x; - - ////////////// Header text, two way depending on =>////////////// - if (header_sep_svg_or_not == "yes"){ - let distance_from_top = (1+(k*2.7)).toString()+"em"; - svg_header.append("text") - .attr("x", (margin.left+width)/2) - .attr("y", 0 + distance_from_top) - .attr("text-anchor", "middle") - .style("font-size", "11px") - .style("text-decoration", "underline") - .style("fill",curve_colors[k]) - .text(header_text_line); - let translate_string = "translate(0,"+(45-(30*k)).toString()+")"; - xAxis_header = g => g.attr("transform", translate_string).call(d3.axisBottom(x).ticks((width-margin.left-margin.right)/25).tickSizeOuter(0)); - svg_header.append("g") - .call(xAxis_header) - .append("text"); - - } - let another_line = d3.line().x(d => x(d[curve_names[k]])).y(d => y(d[depth_curve_name])); - ////////////// Appends a curve line but doesn't include fill yet =>////////////// - svg.append("path") - .datum(data) - .attr("fill", "none") - .attr("stroke", curve_colors[k]) - .attr("stroke-width", template_curves["stroke_width"][k]) - .attr("stroke-linecap", template_curves["stroke_linecap"][k]) - .attr("stroke-dasharray",curve_stroke_dasharray[k]) - .attr("d", another_line); - } - - - ////////////// define the area filled under the curve =>////////////// - - for (let i = 0; i < template_curves["fill"].length; i++) { - //let i = k - if (template_curves["fill"][i]["fill"] == "yes"){ - let number_colors = template_curves["fill"][i]["fill_colors"].length; - let curve_name1 = template_curves["fill"][i]["curve_name"]; - let threshold = -99999999; - let fill_color = "gray"; - for (let j = 0; j < number_colors; j++) { - let area1 = d3.area(); - if (number_colors != 0){ - threshold = template_curves["fill"][i]["cutoffs"][j]; - fill_color = template_curves["fill"][i]["fill_colors"][j]; - } - if(template_curves["fill"][i]["fill_direction"] == "left"){ - let start_from_left = template_overall["margin"]["left"]; - area1 - .x1(d => x(d[curve_name1])) - .x0(d => start_from_left) - .defined(d => ((d[curve_name1])>threshold)) - .y(d => y(d[depth_curve_name])); - } - if(template_curves["fill"][i]["fill_direction"] == "right"){ - let start_from_right = template_overall["margin"]["right"]; - let start_from_left = template_overall["margin"]["left"]; - area1 - .x1(d => width-start_from_right) - .defined(d => ((d[curve_name1])>threshold)) - .x0(d => x(d[curve_name1])) - .y(d => y(d[depth_curve_name])); - } - if(template_curves["fill"][i]["fill_direction"] == "between"){ - let between_2_curve = template_curves["fill"][i]["curve2"]; - //// for through x_functions_for_each_curvename object and find the key that - //// matches between_2_curve which should be a curvename - //// get the x function for the second curve and the curve that is curvenames[k] - let second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; - let first_curve_x_func = x_functions_for_each_curvename[curve_name1]; - area1 - .x1(d => first_curve_x_func(d[curve_name1])) - .x0(d => second_curve_x_func(d[between_2_curve])) - // .defined(d => ((d[curve_name1])<=d[between_2_curve])) - .y(d => y(d[depth_curve_name])); - } - svg.append("path") - .datum(data) - .attr("class", "area") - .attr("d", area1) - .attr("stroke", "none") - .attr("fill",fill_color) - .attr("fill-opacity",0.8); - } - } - } - - //////////////// TOOLTIP Part 1 /////////////////// - if(mouseover_yes_or_no == "no"){ - console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); - } - else{ - //// statements to make sure the mouseover_curvename is a present curve and if not use first curve - if(mouseover_curvename == "default"){mouseover_curvename = curve_names[0];} - else if (curve_names.includes(mouseover_curvename)){mouseover_curvename = mouseover_curvename;} - else{mouseover_curvename = curve_names[0];} - - //// statement to handle color of curve text and circle on hover - let curve_on_mouseover_color = curve_colors[0]; - if(mouseover_color_or_default_which_is_curve_color != "default"){ - curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; - } - - //// appends start of mouseover rectange used for showing hover content - var focus = svg.append("g") - .style("display", "none"); - - var bisectDate = d3.bisector(function(d) { return d[depth_curve_name]; }).left; // ** - - //// function called to change hover style & contents when mouseover rectangle appended to svg svg - function mousemove() { - var y0 = y.invert(d3.mouse(this)[1]), - i = bisectDate(data, y0, 1), - d0 = data[i - 1], - d1 = data[i], - d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; - - //// fixed value along y axis - let fixed_x_value = width*0.8; - - //// depth value - focus.select("text.y2") - .attr("transform", - // "translate(" + x(d[mouseover_curvename]) + "," + - "translate(" + fixed_x_value + "," + - y(d[depth_curve_name]) + ")") - .text(d[depth_curve_name]); - - //// curve value - focus.select("text.y4") - .attr("transform", - "translate(" + fixed_x_value + "," + - y(d[depth_curve_name]) + ")") - .text(d[curve_names[0]]); - - focus.select(".x") - .attr("transform", - "translate(" + x(d[mouseover_curvename]) + "," + 0+ - ")") - .attr("y2", height); - //// circle y class part 2 - focus.select(".y") - .attr("transform", - "translate(" + x(d[mouseover_curvename]) + "," + - y(d[depth_curve_name]) + ")") - .text(d[mouseover_curvename]); - focus.select(".yl") - .attr("transform", - "translate(" + 0 + "," + - y(d[depth_curve_name]) + ")") - .text(d[mouseover_curvename]); - } - // append the x line - focus.append("line") - .attr("class", "x") - .style("stroke", "blue") - .style("stroke-dasharray", "3,3") - .style("opacity", 0.5) - .attr("y1", 0) - .attr("y2", width); - - // append the y line - focus.append("line") - .attr("class", "yl") - .style("stroke", "blue") - .style("stroke-dasharray", "3,3") - .style("opacity", 0.5) - .attr("x1", 0) - .attr("x2", height); - - // append the circle at the intersection - focus.append("circle") - .attr("class", "y") - .style("fill", "none") - .style("stroke", curve_on_mouseover_color) - .attr("r", 3); - - //// depth value on hover - if(mouseover_depth_or_depth_and_curve == "depth" || mouseover_depth_or_depth_and_curve == "depth_and_curve"){ - focus.append("text") - .attr("class", "y2") - .attr("dx", 6) - .attr("dy", "-.3em") - .style("font-size","0.55em"); - } - - //// curve value on hover - if(mouseover_depth_or_depth_and_curve == "curve" || mouseover_depth_or_depth_and_curve == "depth_and_curve"){ - focus.append("text") - .attr("class", "y4") - .attr("dx", 1) - .attr("dy", "0.5em") - .style("font-size","0.55em") - .style("fill", "black") - .style("stroke", curve_on_mouseover_color) - .style("stroke-width", "0.5px"); - } - - // append the rectangle to capture mouse // ********** - svg.append("rect") // ********** - .attr("width", width) // ********** - .attr("height", height) // ********** - .style("fill", "none") // ********** - .style("pointer-events", "all") // ********** - .on("mouseover", function() { focus.style("display", null); }) - .on("mouseout", function() { focus.style("display", "none"); }) - .on("mousemove", mousemove); // ********** - } - - ////////////// Horizontal Lines AKA tops =>////////////// - try { - for (let i = 0; i < template_lines.length; i++) { - let this_line = template_lines[i]; - svg.append("line") - .attr("x1", 0+margin.left) - .attr("y1", y(this_line["depth"])) - .attr("x2", width*0.75) - .attr("y2", y(this_line["depth"])) - .style("stroke-width", this_line["stroke_width"]) - .style("stroke", this_line["color"]) - .style("stroke-dasharray", this_line["stroke-dasharray"]) - .style("stroke-linecap", this_line["stroke_linecap"]) - .style("fill", "none"); - - svg.append("text") - .attr("x", width*0.75) - .attr("y", y(this_line["depth"])) - .attr("text-anchor", "start") - .style("font-size", "12px") - .text(this_line["label"]); - } - } - catch (err){ - console.log("could not do lines for tops in curveBox function, error: ",err); - } - - ////////////// Rectangles for things like cores & sample locations =>////////////// - try { - for (let i = 0; i < template_rectangles.length; i++) { - let this_rectangle = template_rectangles[i]; - svg.append("rect") - .attr("x", 50+margin.left) - .attr("y", y(this_rectangle.depth_top)) - .attr("width", this_rectangle.width) - .attr("height",this_rectangle.height) - .style("stroke-width", this_rectangle.stroke_width) - .style("stroke-linecap", this_rectangle.stroke_linecap) - .style("stroke", "purple") - .style("fill", this_rectangle.fill) - .style("opacity", this_rectangle.opacity); - - svg.append("text") - .attr("x", width*0.75) - .attr("y", y(this_rectangle.depth_top)) - .attr("text-anchor", "start") - .style("font-size", "12px") - .text(this_rectangle.label); - } - } - catch (err){ - console.log("could not do rectangle in curveBox function for some reason. error= ",err); - } - - ////////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// - svg_holder.node(); - svg_header.node(); - return svg.node(); - }, - - - ////////// - /** - * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. - * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to - * @param {object} templates An array of CurveBox input templates - * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! - */ - multipleLogPlot:function(div_id,templates,show_all=true){ - let d3 = module.exports.d3; - let noDIV = d3.select("#"+div_id).selectAll("div").remove(); - let noSVG = d3.select("#"+div_id).selectAll("svg").remove(); - let new_templates = []; - for (let i = 0; i < templates.length; i++) { - let curvebox_holder = d3.select("#"+div_id).append("div"); - curvebox_holder.style("vertical-align","middle") - .attr("id",div_id+"curvebox_holder"+i); - //// to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! - if(show_all){ - curvebox_holder.style("display","inline-block"); - } - else{ - curvebox_holder.style("display","none"); - } - templates[i][0]["curve_box"]["div_id"] = div_id+"curvebox_holder"+i; - new_templates.push(templates[i]); - let template = templates[i]; - let check = module.exports.curveBox(template); - } - return new_templates; - }, - /** - * This function is used to plot a single curveboxe in the div listed in the plotting templates div_id key. - * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. - * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. - * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. - */ - makeThisCurveBox:function(template_for_plotting){ - let d3 = module.exports.d3; - let div_id = template_for_plotting[0]["curve_box"]["div_id"]; - const noSVG = d3.select("#"+div_id).selectAll("svg").remove(); - let curve_box_return = module.exports.curveBox(template_for_plotting); - return curve_box_return; - }, - /** - * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. - * In certain environments, this may not work for security reasons. - * @param {string} svgEl An SVG element returned from the curveBox function. - * @param {string} name The name of the file to be downloaded. - */ - saveSvg:function(svgEl, name) { - svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); - var svgData = svgEl.outerHTML; - var preface = "\r\n"; - var svgBlob = new Blob([preface, svgData], {type:"image/svg+xml;charset=utf-8"}); - var svgUrl = URL.createObjectURL(svgBlob); - var downloadLink = document.createElement("a"); - downloadLink.href = svgUrl; - downloadLink.download = name; - document.body.appendChild(downloadLink); - downloadLink.click(); - document.body.removeChild(downloadLink); - } -}; - -return module.exports;}); - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"d3":39,"wellio":40}],4:[function(require,module,exports){ + + let x_functions_for_each_curvename = {}; //// populate with {"curvename":curvename,"x_func":func} + + ////////////// Building curves within curvebox =>////////////// + for (let k = 0; k < curve_names.length; k++) { + //// code that creates a line for each Curve in order provided and applies + //// the color in the color array in order provided + + let curveUnit = ""; + if (curve_units[k]) { + curveUnit = curve_units[k]; + } + let min = mins[k]; + let max = maxes[k]; + + let header_text_line = min.toFixed(1) + " - " + curve_names[k] + " " + curveUnit + " - " + max.toFixed(1); + let min_this = d3.min(data, function (d) { + return +d[curve_names[k]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[k]]; + }); + let x = d3.scaleLinear().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + if (k == 0) { + x_func == x; + } + //// This creates an object to hold multiple x axis scale functions + //// that will be used if 'between' style fill is selected. + x_functions_for_each_curvename[curve_names[k]] = x; + + ////////////// Header text, two way depending on =>////////////// + if (header_sep_svg_or_not == "yes") { + let distance_from_top = (1 + (k * 2.7)).toString() + "em"; + svg_header.append("text") + .attr("x", (margin.left + width) / 2) + .attr("y", 0 + distance_from_top) + .attr("text-anchor", "middle") + .style("font-size", "11px") + .style("text-decoration", "underline") + .style("fill", curve_colors[k]) + .text(header_text_line); + let translate_string = "translate(0," + (45 - (30 * k)).toString() + ")"; + xAxis_header = g => g.attr("transform", translate_string).call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + svg_header.append("g") + .call(xAxis_header) + .append("text"); + + } + let another_line = d3.line().x(d => x(d[curve_names[k]])).y(d => y(d[depth_curve_name])); + ////////////// Appends a curve line but doesn't include fill yet =>////////////// + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curve_colors[k]) + .attr("stroke-width", template_curves["stroke_width"][k]) + .attr("stroke-linecap", template_curves["stroke_linecap"][k]) + .attr("stroke-dasharray", curve_stroke_dasharray[k]) + .attr("d", another_line); + } + + + ////////////// define the area filled under the curve =>////////////// + + for (let i = 0; i < template_curves["fill"].length; i++) { + //let i = k + if (template_curves["fill"][i]["fill"] == "yes") { + let number_colors = template_curves["fill"][i]["fill_colors"].length; + let curve_name1 = template_curves["fill"][i]["curve_name"]; + let threshold = -99999999; + let fill_color = "gray"; + for (let j = 0; j < number_colors; j++) { + let area1 = d3.area(); + if (number_colors != 0) { + threshold = template_curves["fill"][i]["cutoffs"][j]; + fill_color = template_curves["fill"][i]["fill_colors"][j]; + } + if (template_curves["fill"][i]["fill_direction"] == "left") { + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => x(d[curve_name1])) + .x0(d => start_from_left) + .defined(d => ((d[curve_name1]) > threshold)) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "right") { + let start_from_right = template_overall["margin"]["right"]; + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => width - start_from_right) + .defined(d => ((d[curve_name1]) > threshold)) + .x0(d => x(d[curve_name1])) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "between") { + let between_2_curve = template_curves["fill"][i]["curve2"]; + //// for through x_functions_for_each_curvename object and find the key that + //// matches between_2_curve which should be a curvename + //// get the x function for the second curve and the curve that is curvenames[k] + let second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; + let first_curve_x_func = x_functions_for_each_curvename[curve_name1]; + area1 + .x1(d => first_curve_x_func(d[curve_name1])) + .x0(d => second_curve_x_func(d[between_2_curve])) + // .defined(d => ((d[curve_name1])<=d[between_2_curve])) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill", fill_color) + .attr("fill-opacity", 0.8); + } + } + } + + //////////////// TOOLTIP Part 1 /////////////////// + if (mouseover_yes_or_no == "no") { + console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); + } else { + //// statements to make sure the mouseover_curvename is a present curve and if not use first curve + if (mouseover_curvename == "default") { + mouseover_curvename = curve_names[0]; + } else if (curve_names.includes(mouseover_curvename)) { + mouseover_curvename = mouseover_curvename; + } else { + mouseover_curvename = curve_names[0]; + } + + //// statement to handle color of curve text and circle on hover + let curve_on_mouseover_color = curve_colors[0]; + if (mouseover_color_or_default_which_is_curve_color != "default") { + curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; + } + + //// appends start of mouseover rectange used for showing hover content + var focus = svg.append("g") + .style("display", "none"); + + var bisectDate = d3.bisector(function (d) { + return d[depth_curve_name]; + }).left; // ** + + //// function called to change hover style & contents when mouseover rectangle appended to svg svg + function mousemove() { + var y0 = y.invert(d3.mouse(this)[1]), + i = bisectDate(data, y0, 1), + d0 = data[i - 1], + d1 = data[i], + d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; + + //// fixed value along y axis + let fixed_x_value = width * 0.8; + + //// depth value + focus.select("text.y2") + .attr("transform", + // "translate(" + x(d[mouseover_curvename]) + "," + + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[depth_curve_name]); + + //// curve value + focus.select("text.y4") + .attr("transform", + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[curve_names[0]]); + + focus.select(".x") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + 0 + + ")") + .attr("y2", height); + //// circle y class part 2 + focus.select(".y") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + focus.select(".yl") + .attr("transform", + "translate(" + 0 + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + } + + // append the x line + focus.append("line") + .attr("class", "x") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("y1", 0) + .attr("y2", width); + + // append the y line + focus.append("line") + .attr("class", "yl") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("x1", 0) + .attr("x2", height); + + // append the circle at the intersection + focus.append("circle") + .attr("class", "y") + .style("fill", "none") + .style("stroke", curve_on_mouseover_color) + .attr("r", 3); + + //// depth value on hover + if (mouseover_depth_or_depth_and_curve == "depth" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y2") + .attr("dx", 6) + .attr("dy", "-.3em") + .style("font-size", "0.55em"); + } + + //// curve value on hover + if (mouseover_depth_or_depth_and_curve == "curve" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y4") + .attr("dx", 1) + .attr("dy", "0.5em") + .style("font-size", "0.55em") + .style("fill", "black") + .style("stroke", curve_on_mouseover_color) + .style("stroke-width", "0.5px"); + } + + // append the rectangle to capture mouse // ********** + svg.append("rect") // ********** + .attr("width", width) // ********** + .attr("height", height) // ********** + .style("fill", "none") // ********** + .style("pointer-events", "all") // ********** + .on("mouseover", function () { + focus.style("display", null); + }) + .on("mouseout", function () { + focus.style("display", "none"); + }) + .on("mousemove", mousemove); // ********** + } + + ////////////// Horizontal Lines AKA tops =>////////////// + try { + for (let i = 0; i < template_lines.length; i++) { + let this_line = template_lines[i]; + svg.append("line") + .attr("x1", 0 + margin.left) + .attr("y1", y(this_line["depth"])) + .attr("x2", width * 0.75) + .attr("y2", y(this_line["depth"])) + .style("stroke-width", this_line["stroke_width"]) + .style("stroke", this_line["color"]) + .style("stroke-dasharray", this_line["stroke-dasharray"]) + .style("stroke-linecap", this_line["stroke_linecap"]) + .style("fill", "none"); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_line["depth"])) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_line["label"]); + } + } catch (err) { + console.log("could not do lines for tops in curveBox function, error: ", err); + } + + ////////////// Rectangles for things like cores & sample locations =>////////////// + try { + for (let i = 0; i < template_rectangles.length; i++) { + let this_rectangle = template_rectangles[i]; + svg.append("rect") + .attr("x", 50 + margin.left) + .attr("y", y(this_rectangle.depth_top)) + .attr("width", this_rectangle.width) + .attr("height", this_rectangle.height) + .style("stroke-width", this_rectangle.stroke_width) + .style("stroke-linecap", this_rectangle.stroke_linecap) + .style("stroke", "purple") + .style("fill", this_rectangle.fill) + .style("opacity", this_rectangle.opacity); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_rectangle.depth_top)) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_rectangle.label); + } + } catch (err) { + console.log("could not do rectangle in curveBox function for some reason. error= ", err); + } + + ////////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// + svg_holder.node(); + svg_header.node(); + return svg.node(); + }, + + + ////////// + /** + * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. + * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to + * @param {object} templates An array of CurveBox input templates + * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! + */ + multipleLogPlot: function (div_id, templates, show_all = true) { + let d3 = module.exports.d3; + let noDIV = d3.select("#" + div_id).selectAll("div").remove(); + let noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let new_templates = []; + for (let i = 0; i < templates.length; i++) { + let curvebox_holder = d3.select("#" + div_id).append("div"); + curvebox_holder.style("vertical-align", "middle") + .attr("id", div_id + "curvebox_holder" + i); + //// to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! + if (show_all) { + curvebox_holder.style("display", "inline-block"); + } else { + curvebox_holder.style("display", "none"); + } + templates[i][0]["curve_box"]["div_id"] = div_id + "curvebox_holder" + i; + new_templates.push(templates[i]); + let template = templates[i]; + let check = module.exports.curveBox(template); + } + return new_templates; + }, + /** + * This function is used to plot a single curvebox in the div listed in the plotting templates div_id key. + * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. + * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. + * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. + */ + makeThisCurveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + let div_id = template_for_plotting[0]["curve_box"]["div_id"]; + const noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let curve_box_return = module.exports.curveBox(template_for_plotting); + return curve_box_return; + }, + /** + * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. + * In certain environments, this may not work for security reasons. + * @param {string} svgEl An SVG element returned from the curveBox function. + * @param {string} name The name of the file to be downloaded. + */ + saveSvg: function (svgEl, name) { + svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + var svgData = svgEl.outerHTML; + var preface = "\r\n"; + var svgBlob = new Blob([preface, svgData], {type: "image/svg+xml;charset=utf-8"}); + var svgUrl = URL.createObjectURL(svgBlob); + var downloadLink = document.createElement("a"); + downloadLink.href = svgUrl; + downloadLink.download = name; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + }; + + return module.exports; + }); + + }).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + }, {"d3": 39, "wellio": 40}], + 4: [function (require, module, exports) { // well_curve_config_template = [ // {"multipleLines":"yes","curveNames":["GR"], // "curveColors":["black","pink"], @@ -1662,7 +1793,6 @@ return module.exports;}); // "depth_curve_name":"DEPTH"}] - // function makePlot(single_curve,div,height,width,domain_x,domain_y,curve_name){ // // "#log_plot_div" // var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() @@ -1698,149 +1828,159 @@ return module.exports;}); // wellioviz.fromJSONofWEllGetThingsForPlotting(well_log_json,"DEPTH") // } -function reformatJSONforPlotting(temp_json,curve,div){ - // generic_template = [ - // {"multipleLines":"yes", - // "curveNames":[curve], - // "curveColors":["black","pink"], - // "fill":[ - // {"curveName":curve,"fill":"yes","fillDirection":"left","cutoffs":[0,65,75,89],"fillColors":["lightgreen","green","red","pink"],"curve2":""}, - // {"curveName":"PHID","fill":"yes","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} - // ], - // "data":"data_goes_here_once_formatted", - // "width":250, - // "height":600, - // "margin":({top: 20, right: 3, bottom: 30, left: 30}), - // "depth_curve_name":"DEPT", - // "divID":div - // }] - - generic_template = [ - { - "curve_box":{ - "show_well_name":"yes", /// not built yet - "show_depth_type":"yes", /// not built yet - "show_curve_units":"yes", /// not built yet - "curve_box_depth_min":-999, /// not built yet - "curve_box_depth_max":9990000, /// not built yet - "take_out_null_or_visualize":"no", /// not built yet - "show_title":"yes", - "width": 260, - "height": 400, - "height_multiplier_components":1, - "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, - "title": {"text": "", "title_font_size": "10px"}, /// not built yet - "div_id": "log_plot_div", /// Should be skip-able // default=random str? What happens if div doesn't exist? - "order_of_component":["curves","rectanges","lines"], /// not built yet - "lines_connected_across_curveboxes":"no", /// not built yet - "header_sep_svg_or_not":"yes", - "svg_header_height":"4em", - "gridlines":"yes", - "gridlines_color":'#D3D3D3', - "gridlines_stroke_width":0.20, - "grouped_or_independent_x_scales":"independent", - //// variables for how to draw mouseover of hover box - "mouseover_yes_or_no":"yes", //// "yes" or "no" - "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" - "mouseover_curvename":"default", //// default is first curve - "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black - }, - "components":[{ - "curves":[ - { "data_type":"curve", - "curve_names":[curve], - "curve_colors":["#0375D8"], - "curve_stroke_dasharray":["solid"], - "stroke_linecap":["butt"], - "stroke_width":[1], - "fill":[ - {"curve_name":curve,"fill":"yes","fill_direction":"left","cutoffs":[0,5,999],"fill_colors":["gray","beige","white"],"curve2":""} - ], - "curve_units":[""], - "depth_limits":[{"min":"autocalculate","max":"autocalculate"}], - "curve_limits":[{"curve_name":"","min":-10000000,"max":3}], - "data":"not here yet",/// not built yet - "depth_curve_name":"DEPT",/// not built yet - ////// - "data_id":["placeholder_data_id",], /// not built yet - "well_names":[""], /// not built yet - "scale_linear_log_or_yours":["linear"], - "line_color": ["red"], /// not built yet - "max_depth": "autocalculate", /// not built yet - "min_depth": "autocalculate", /// not built yet - "depth_type_string":[""], - "depth_units_string":[""], - "null_value": [""], /// not built yet - } - ], - "lines":[ - { - "data_type":"line", /// not built yet - "label":"example", /// not built yet - "depth":-999, /// not built yet - "color":"red", /// not built yet - "stroke_width":"3px", /// not built yet - "stroke_style":"solid", /// not built yet - "transparency":1.0, /// not built yet - "stroke_linecap":"butt" - } - ], - "rectangles":[ - { - "data_type":"rectangle", - "depth_top":0, - "x_starting_upper_left_corner":0, - "width":100, - "height":100, - "stroke_width":"2px", - "stroke_linecap":"butt", - "fill":"red", - "opacity":0.5, - "label":"Core Example", // not built into plotting template yet - "label_orientation":"horizontal", // not built into plotting template yet - "lable_position":"right" // not built into plotting template yet - } - ] - }] - }] - /////////// - console.log("depth curve name used", generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) - wellDataForPlotting = wellioviz.fromJSONofWEllGetThingsForPlotting(temp_json,generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) - curveDataFormatted = wellDataForPlotting["well_log_curves_reformatted_for_d3"] - curve_names = wellDataForPlotting["curve_names"] - uwi = wellDataForPlotting["uwi"] - console.log("curveDataFormatted in function draw_curve() ",curveDataFormatted) - //console.log("curveName in template generic_template['curveNames']:",generic_template[0]["curveNames"]) - ////////// - console.log("generic_template",generic_template) - generic_template[0]["components"][0]["curves"][0]["data"] = curveDataFormatted - new_generic_template = generic_template - return new_generic_template -} - -function draw_curve(curve,div){ - if(!div){div = "log_plot_div"} - if(!curve){ - curve = "GR"; - console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) - } - console.log("curve = ",curve) - ///var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] - ///makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) - var newDiv = document.createElement("div"); - disposible_log_div = "log_plot_div_sub" - newDiv.id = disposible_log_div - var currentDiv = document.getElementById("log_plot_div"); - currentDiv.append(newDiv) - - ///////// - console.log("generic_template:",reformatJSONforPlotting(temp_json)) - new_generic_template = reformatJSONforPlotting(temp_json) - height = new_generic_template[0]["curve_box"]["height"] - currentDiv.style.height = height+50+"px"; - result = wellioviz.multipleLogPlot(disposible_log_div,[reformatJSONforPlotting(temp_json,curve,disposible_log_div)]) - console.log("curve plot should be present now... the template supplied is:",result) -} + function reformatJSONforPlotting(temp_json, curve, div) { + // generic_template = [ + // {"multipleLines":"yes", + // "curveNames":[curve], + // "curveColors":["black","pink"], + // "fill":[ + // {"curveName":curve,"fill":"yes","fillDirection":"left","cutoffs":[0,65,75,89],"fillColors":["lightgreen","green","red","pink"],"curve2":""}, + // {"curveName":"PHID","fill":"yes","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} + // ], + // "data":"data_goes_here_once_formatted", + // "width":250, + // "height":600, + // "margin":({top: 20, right: 3, bottom: 30, left: 30}), + // "depth_curve_name":"DEPT", + // "divID":div + // }] + + generic_template = [ + { + "curve_box": { + "show_well_name": "yes", /// not built yet + "show_depth_type": "yes", /// not built yet + "show_curve_units": "yes", /// not built yet + "curve_box_depth_min": -999, /// not built yet + "curve_box_depth_max": 9990000, /// not built yet + "take_out_null_or_visualize": "no", /// not built yet + "show_title": "yes", + "width": 260, + "height": 400, + "height_multiplier_components": 1, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "log_plot_div", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectanges", "lines"], /// not built yet + "lines_connected_across_curveboxes": "no", /// not built yet + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": '#D3D3D3', + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "curve", + "curve_names": [curve], + "curve_colors": ["#0375D8"], + "curve_stroke_dasharray": ["solid"], + "stroke_linecap": ["butt"], + "stroke_width": [1], + "fill": [ + { + "curve_name": curve, + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0, 5, 999], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + } + ], + "curve_units": [""], + "depth_limits": [{"min": "autocalculate", "max": "autocalculate"}], + "curve_limits": [{"curve_name": "", "min": -10000000, "max": 3}], + "data": "not here yet",/// not built yet + "depth_curve_name": "DEPT",/// not built yet + ////// + "data_id": ["placeholder_data_id",], /// not built yet + "well_names": [""], /// not built yet + "scale_linear_log_or_yours": ["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string": [""], + "depth_units_string": [""], + "null_value": [""], /// not built yet + } + ], + "lines": [ + { + "data_type": "line", /// not built yet + "label": "example", /// not built yet + "depth": -999, /// not built yet + "color": "red", /// not built yet + "stroke_width": "3px", /// not built yet + "stroke_style": "solid", /// not built yet + "transparency": 1.0, /// not built yet + "stroke_linecap": "butt" + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 0, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }] + /////////// + console.log("depth curve name used", generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) + wellDataForPlotting = wellioviz.fromJSONofWEllGetThingsForPlotting(temp_json, generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) + curveDataFormatted = wellDataForPlotting["well_log_curves_reformatted_for_d3"] + curve_names = wellDataForPlotting["curve_names"] + uwi = wellDataForPlotting["uwi"] + console.log("curveDataFormatted in function draw_curve() ", curveDataFormatted) + //console.log("curveName in template generic_template['curveNames']:",generic_template[0]["curveNames"]) + ////////// + console.log("generic_template", generic_template) + generic_template[0]["components"][0]["curves"][0]["data"] = curveDataFormatted + new_generic_template = generic_template + return new_generic_template + } + + function draw_curve(curve, div) { + if (!div) { + div = "log_plot_div" + } + if (!curve) { + curve = "GR"; + console.log("temp_json['CURVES'][curve] = ", temp_json["CURVES"]["GR"]) + } + console.log("curve = ", curve) + ///var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] + ///makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) + var newDiv = document.createElement("div"); + disposible_log_div = "log_plot_div_sub" + newDiv.id = disposible_log_div + var currentDiv = document.getElementById("log_plot_div"); + currentDiv.append(newDiv) + + ///////// + console.log("generic_template:", reformatJSONforPlotting(temp_json)) + new_generic_template = reformatJSONforPlotting(temp_json) + height = new_generic_template[0]["curve_box"]["height"] + currentDiv.style.height = height + 50 + "px"; + result = wellioviz.multipleLogPlot(disposible_log_div, [reformatJSONforPlotting(temp_json, curve, disposible_log_div)]) + console.log("curve plot should be present now... the template supplied is:", result) + } // function draw_curve_from_data(curve,div,curve_name){ // // if(!div){div = "#log_plot_div"} @@ -1863,20177 +2003,20871 @@ function draw_curve(curve,div){ // var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] // makePlot(curve,div,600,250,domain_x,[0,curve.length],curve_name) // } -},{}],5:[function(require,module,exports){ -wellio = require('wellio'); + }, {}], + 5: [function (require, module, exports) { + wellio = require('wellio'); -las2json = wellio.las2json; + las2json = wellio.las2json; -wellioviz = require("../../dist/index.js") -},{"../../dist/index.js":3,"wellio":40}],6:[function(require,module,exports){ -/////////////////////// global objects placeholders //////////////////////// + wellioviz = require("../../dist/index.js") + }, {"../../dist/index.js": 3, "wellio": 40}], + 6: [function (require, module, exports) { +/////////////////////// global objects placeholders //////////////////////// //// ... maybe not good programming practice but quick to do for simple demo. //// var all_files is a holder for the las files uploaded into the browser -var all_files = [""]; + var all_files = [""]; //// var temp_json is the single well las file converted to json object format -var temp_json = {}; + var temp_json = {}; -//////////////////////// HELPER FUNCTIONS //////////////////////// +//////////////////////// HELPER FUNCTIONS //////////////////////// // Check for the various File API support. -if (window.File && window.FileReader && window.FileList && window.Blob) { - // Great success! All the File APIs are supported. -} else { - alert('The File APIs are not fully supported in this browser.'); -} + if (window.File && window.FileReader && window.FileList && window.Blob) { + // Great success! All the File APIs are supported. + } else { + alert('The File APIs are not fully supported in this browser.'); + } //// Function that checks if a temp_json exists. If it does, it allows divs that manipulate that JSON to show -function checkForJSONThenCollapse(divID){ - console.log("divID",divID) - console.log("check check") - console.log(temp_json) - if (!temp_json['WELL INFORMATION BLOCK']){"button did nothing because well JSON doesn't exist"} - else{ - //// Check if loading part is shown, if so collapse it first. - if(document.getElementById("wellupload").classList.contains("show")){ - $("#wellupload").collapse("toggle") - } - $('.collapse').collapse("hide") - //// toggle only the one clicked! - $(divID).collapse("toggle") - } -} - - - -//// helper function that removes the text depiction of the las file. -function removeTextLAS(){ - fileContentsDiv = document.getElementById("fileContents"); - while (fileContentsDiv.hasChildNodes()) { - fileContentsDiv.removeChild(fileContentsDiv.lastChild); - } -} - -//// helper function that removes the children of the given DOM element. -function remove_DOM_children(div_name){ - if(!div_name){ - div_name = 'log_plot_div' - } - fileContentsDiv = document.getElementById(div_name); - while (fileContentsDiv.hasChildNodes()) { - fileContentsDiv.removeChild(fileContentsDiv.lastChild); - } -} + function checkForJSONThenCollapse(divID) { + console.log("divID", divID) + console.log("check check") + console.log(temp_json) + if (!temp_json['WELL INFORMATION BLOCK']) { + "button did nothing because well JSON doesn't exist" + } else { + //// Check if loading part is shown, if so collapse it first. + if (document.getElementById("wellupload").classList.contains("show")) { + $("#wellupload").collapse("toggle") + } + $('.collapse').collapse("hide") + //// toggle only the one clicked! + $(divID).collapse("toggle") + } + } + + +//// helper function that removes the text depiction of the las file. + function removeTextLAS() { + fileContentsDiv = document.getElementById("fileContents"); + while (fileContentsDiv.hasChildNodes()) { + fileContentsDiv.removeChild(fileContentsDiv.lastChild); + } + } + +//// helper function that removes the children of the given DOM element. + function remove_DOM_children(div_name) { + if (!div_name) { + div_name = 'log_plot_div' + } + fileContentsDiv = document.getElementById(div_name); + while (fileContentsDiv.hasChildNodes()) { + fileContentsDiv.removeChild(fileContentsDiv.lastChild); + } + } //// helper function that removes the inner html of the given DOM element, like the "test" from

test

-function removeInnerHTML(div_id){ - document.getElementById(div_id).innerHTML = "" -} + function removeInnerHTML(div_id) { + document.getElementById(div_id).innerHTML = "" + } //// helper function that take a string and a substring of that string and replaces the substring with "" or nothing if it finds the substring. -function removeSubStr(string,substring){ - return string.replace(substring,"") -} - -//////////////////////// LOADING FUNCTIONS //////////////////////// + function removeSubStr(string, substring) { + return string.replace(substring, "") + } +//////////////////////// LOADING FUNCTIONS //////////////////////// //// Reads in an example LAS files from webpage assets instead of local computer -function readInLASFromASSETS(){ - //all_files = ["./assets/00-01-01-073-05W5-0.LAS"]; - //// removes all status spans for uploads - removeInnerHTML("upload-file-info"); - removeInnerHTML("upload-success"); - $.ajax({ - url : "./assets/00-01-01-073-05W5-0.LAS", - dataType: "text", - success : function (data) { - all_files = [data,""] - document.getElementById("upload-success").innerHTML = "upload success"; - console.log("successfully loaded .draw_curve_from_data/assets/00-01-01-073-05W5-0.LAS") - }, - error : function (XMLHttpRequest, textStatus, errorThrown) { - document.getElementById("upload-success").innerHTML = "upload failure"; - console.log("error in function readInLASFromASSETS() : ",textStatus, errorThrown) - } - }); -} + function readInLASFromASSETS() { + //all_files = ["./assets/00-01-01-073-05W5-0.LAS"]; + //// removes all status spans for uploads + removeInnerHTML("upload-file-info"); + removeInnerHTML("upload-success"); + $.ajax({ + url: "./assets/00-01-01-073-05W5-0.LAS", + dataType: "text", + success: function (data) { + all_files = [data, ""] + document.getElementById("upload-success").innerHTML = "upload success"; + console.log("successfully loaded .draw_curve_from_data/assets/00-01-01-073-05W5-0.LAS") + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + document.getElementById("upload-success").innerHTML = "upload failure"; + console.log("error in function readInLASFromASSETS() : ", textStatus, errorThrown) + } + }); + } //// function for "Load into browser memeory" button -function readInFilesFunction(){ - //// removes all status spans for uploads - removeInnerHTML("upload-file-info"); - removeInnerHTML("upload-success"); - var files = document.getElementById("files").files; - if (files && files.length !== 0) { - all_files = [] - for (var i = 0, file; file = files[i]; i++) { - var reader = new FileReader(); - reader.readAsText(file, "UTF-8"); - reader.onload = function (evt) { - all_files.push(evt.target.result); - } - reader.onerror = function (evt) { - document.getElementById("fileContents").innerHTML = "error reading file"; - } - } - uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = "upload success"; - } - else{ - uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = " "+"upload failure"; - } - //console.log("all_files = ",all_files) -} - - - -function changeMenuBarButtonColorOnConvert(){ - //// CHANGE buttons from gray to blue in top row - var listButtons = document.getElementsByClassName("afterconvert") - console.log("list",list) - var i; - for (i = 0; i < listButtons.length; i++) { - // button.style.backgroundColor = "blue"; - console.log("button",listButtons[i]) - listButtons[i].classList.add("btn-primary") - } -} + function readInFilesFunction() { + //// removes all status spans for uploads + removeInnerHTML("upload-file-info"); + removeInnerHTML("upload-success"); + var files = document.getElementById("files").files; + if (files && files.length !== 0) { + all_files = [] + for (var i = 0, file; file = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + all_files.push(evt.target.result); + } + reader.onerror = function (evt) { + document.getElementById("fileContents").innerHTML = "error reading file"; + } + } + uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = "upload success"; + } else { + uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = " " + "upload failure"; + } + //console.log("all_files = ",all_files) + } -//// Function that calls several other functions involved with converting a new well from las to json + + function changeMenuBarButtonColorOnConvert() { + //// CHANGE buttons from gray to blue in top row + var listButtons = document.getElementsByClassName("afterconvert") + console.log("list", list) + var i; + for (i = 0; i < listButtons.length; i++) { + // button.style.backgroundColor = "blue"; + console.log("button", listButtons[i]) + listButtons[i].classList.add("btn-primary") + } + } + +//// Function that calls several other functions involved with converting a new well from las to json //// updating the global variables as needed, and changing some new DOM elements to reflect the new well data. //// It calls the las2json(onelas) function found in wellio.js JavaScript file. -function convert_and_startHelpers(){ - //// removes the buttons for the well curves from the previous well if they exist - remove_DOM_children("curveButtons_holder") - //// calls the function that takes a single LAS text file representing a single well and returns an object variable in JSON format for that well. - var single_well_json = las2json(all_files[0]); - // console.log('single_well_json = ',single_well_json) - //// replaces the global variable temp_json with the new well json var single_well_json - temp_json = single_well_json - //// function that looks at temp_json object, finds what curves are present in that well, and makes buttons to draw them using g3.js - addCurveOptionButtons() - //// adds inner html to p for the UWI name of the well in questino that was just loaded and converted - console.log("temp_json['WELL INFORMATION BLOCK'] =", JSON.stringify(temp_json["WELL INFORMATION BLOCK"])) - document.getElementById("which_well").innerHTML = "UWI = "+temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; - changeMenuBarButtonColorOnConvert() -} - - -//////////////////////// DISPLAY FUNCTIONS //////////////////////// + function convert_and_startHelpers() { + //// removes the buttons for the well curves from the previous well if they exist + remove_DOM_children("curveButtons_holder") + //// calls the function that takes a single LAS text file representing a single well and returns an object variable in JSON format for that well. + var single_well_json = las2json(all_files[0]); + // console.log('single_well_json = ',single_well_json) + //// replaces the global variable temp_json with the new well json var single_well_json + temp_json = single_well_json + //// function that looks at temp_json object, finds what curves are present in that well, and makes buttons to draw them using g3.js + addCurveOptionButtons() + //// adds inner html to p for the UWI name of the well in questino that was just loaded and converted + console.log("temp_json['WELL INFORMATION BLOCK'] =", JSON.stringify(temp_json["WELL INFORMATION BLOCK"])) + document.getElementById("which_well").innerHTML = "UWI = " + temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + changeMenuBarButtonColorOnConvert() + } + + +//////////////////////// DISPLAY FUNCTIONS //////////////////////// //// This takes the well files uploaded as las files, treats all of them as text files and prints ALL OF THEM to the DOM. //// this is different than the json conversion, which at this points only converts and keeps the first well! -function displayFileFunction(){ - var upload_success_span_txt = document.getElementById("upload-success").innerHTML - //// goes into this part of loop if wepbage las is used - if(upload_success_span_txt === "upload success"){ - fileContentsDiv = document.getElementById("fileContents") - var para = document.createElement("P") - var t = document.createTextNode(all_files[0]); - para.appendChild(t); - fileContentsDiv.appendChild(para); - } - //// goes here if las from user's local computer is used - else{ - var files = document.getElementById("files").files - if (files) { - for (var i = 0, file; file = files[i]; i++) { - var reader = new FileReader(); - reader.readAsText(file, "UTF-8"); - reader.onload = function (evt) { - fileContentsDiv = document.getElementById("fileContents") - var para = document.createElement("P") - var t = document.createTextNode(evt.target.result); // Create a text node - para.appendChild(t); - fileContentsDiv.appendChild(para); - } - reader.onerror = function (evt) { - document.getElementById("fileContents").innerHTML = "error reading file"; + function displayFileFunction() { + var upload_success_span_txt = document.getElementById("upload-success").innerHTML + //// goes into this part of loop if wepbage las is used + if (upload_success_span_txt === "upload success") { + fileContentsDiv = document.getElementById("fileContents") + var para = document.createElement("P") + var t = document.createTextNode(all_files[0]); + para.appendChild(t); + fileContentsDiv.appendChild(para); + } + //// goes here if las from user's local computer is used + else { + var files = document.getElementById("files").files + if (files) { + for (var i = 0, file; file = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + fileContentsDiv = document.getElementById("fileContents") + var para = document.createElement("P") + var t = document.createTextNode(evt.target.result); // Create a text node + para.appendChild(t); + fileContentsDiv.appendChild(para); + } + reader.onerror = function (evt) { + document.getElementById("fileContents").innerHTML = "error reading file"; + } + } + } + } } - } - } - } -} - //// function that leverages vkbeuatify library to pretty print the stringified wellio json then puts it into a DOM element so it can be seen by the user -function print_well(){ - document.getElementById("well_json_prettyprint").innerHTML = vkbeautify.json(JSON.stringify(temp_json),1); - console.log('JSON.stringify(temp_json) = ',vkbeautify.json(JSON.stringify(temp_json),4)) -} + function print_well() { + document.getElementById("well_json_prettyprint").innerHTML = vkbeautify.json(JSON.stringify(temp_json), 1); + console.log('JSON.stringify(temp_json) = ', vkbeautify.json(JSON.stringify(temp_json), 4)) + } -//// function called by convert_and_startHelpers() that looks at the global temp_json object +//// function called by convert_and_startHelpers() that looks at the global temp_json object //// and finds the curve names and adds them as buttons that when clicked draws those curves using g3.js. //// It calls addSingleCurveButton(div_id,curve_name) for each curve. -function addCurveOptionButtons(){ - /// curveButtons_holder - var div_id = "curveButtons_holder" - var curves_available = Object.keys(temp_json["CURVES"]) - console.log("curves_available = ",curves_available) - for(each_curve in curves_available){ - addSingleCurveButton(div_id,curves_available[each_curve]) - } -} + function addCurveOptionButtons() { + /// curveButtons_holder + var div_id = "curveButtons_holder" + var curves_available = Object.keys(temp_json["CURVES"]) + console.log("curves_available = ", curves_available) + for (each_curve in curves_available) { + addSingleCurveButton(div_id, curves_available[each_curve]) + } + } //// function called by addCurveOptionButtons() adds Curves buttons that when clicked draws a curve plot using g3.js. -function addSingleCurveButton(div_id,curve_name){ - var node = document.createElement("button"); - node.setAttribute('onclick','draw_curve("'+String(curve_name)+'")') // Create a
  • node - var textnode = document.createTextNode(curve_name); // Create a text node - node.appendChild(textnode); // Append the text to
  • - document.getElementById(div_id).appendChild(node); -} + function addSingleCurveButton(div_id, curve_name) { + var node = document.createElement("button"); + node.setAttribute('onclick', 'draw_curve("' + String(curve_name) + '")') // Create a
  • node + var textnode = document.createTextNode(curve_name); // Create a text node + node.appendChild(textnode); // Append the text to
  • + document.getElementById(div_id).appendChild(node); + } //// function that creates a hidden link that is clicked programatically that uses HTML5 to download the file at that link //// the two arguments are the UWI string of the global temp_json object, and a stringified version of the entire wellio json object. //// It calls the download() function found in wellio.js JavaScript file. -function download_test(){ - //console.log("download_test() ","in") - download(temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"]+".json", JSON.stringify(temp_json)); -} + function download_test() { + //console.log("download_test() ","in") + download(temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + ".json", JSON.stringify(temp_json)); + } -//// Function that takes a filename string and a string (you might have to stringify a json object) +//// Function that takes a filename string and a string (you might have to stringify a json object) //// and writes into an actual JSON file to be downloaded into your browsers specified download folder. -function download (filename, text) { - var element = document.createElement('a') - element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)) - element.setAttribute('download', filename) - element.style.display = 'none' - document.body.appendChild(element) - element.click() - document.body.removeChild(element) - } - -},{}],7:[function(require,module,exports){ -/** -* vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. -* -* Version - 0.99.00.beta -* Copyright (c) 2012 Vadim Kiryukhin -* vkiryukhin @ gmail.com -* http://www.eslinstructor.net/vkbeautify/ -* -* MIT license: -* http://www.opensource.org/licenses/mit-license.php -* -* Pretty print -* -* vkbeautify.xml(text [,indent_pattern]); -* vkbeautify.json(text [,indent_pattern]); -* vkbeautify.css(text [,indent_pattern]); -* vkbeautify.sql(text [,indent_pattern]); -* -* @text - String; text to beatufy; -* @indent_pattern - Integer | String; -* Integer: number of white spaces; -* String: character string to visualize indentation ( can also be a set of white spaces ) -* Minify -* -* vkbeautify.xmlmin(text [,preserve_comments]); -* vkbeautify.jsonmin(text); -* vkbeautify.cssmin(text [,preserve_comments]); -* vkbeautify.sqlmin(text); -* -* @text - String; text to minify; -* @preserve_comments - Bool; [optional]; -* Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. ) -* -* Examples: -* vkbeautify.xml(text); // pretty print XML -* vkbeautify.json(text, 4 ); // pretty print JSON -* vkbeautify.css(text, '. . . .'); // pretty print CSS -* vkbeautify.sql(text, '----'); // pretty print SQL -* -* vkbeautify.xmlmin(text, true);// minify XML, preserve comments -* vkbeautify.jsonmin(text);// minify JSON -* vkbeautify.cssmin(text);// minify CSS, remove comments ( default ) -* vkbeautify.sqlmin(text);// minify SQL -* -*/ - -(function() { - - function createShiftArr(step) { - - var space = ' '; - - if ( isNaN(parseInt(step)) ) { // argument is string - space = step; - } else { // argument is integer - switch(step) { - case 1: space = ' '; break; - case 2: space = ' '; break; - case 3: space = ' '; break; - case 4: space = ' '; break; - case 5: space = ' '; break; - case 6: space = ' '; break; - case 7: space = ' '; break; - case 8: space = ' '; break; - case 9: space = ' '; break; - case 10: space = ' '; break; - case 11: space = ' '; break; - case 12: space = ' '; break; - } + function download(filename, text) { + var element = document.createElement('a') + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)) + element.setAttribute('download', filename) + element.style.display = 'none' + document.body.appendChild(element) + element.click() + document.body.removeChild(element) } - - var shift = ['\n']; // array of shifts - for(ix=0;ix<100;ix++){ - shift.push(shift[ix]+space); - } - return shift; - } - - function vkbeautify(){ - this.step = '\t'; // 4 spaces - this.shift = createShiftArr(this.step); - }; - - vkbeautify.prototype.xml = function(text,step) { - - var ar = text.replace(/>\s{0,}<") - .replace(/ or -1) { - str += shift[deep]+ar[ix]; - inComment = true; - // end comment or // - if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1 || ar[ix].search(/!DOCTYPE/) > -1 ) { - inComment = false; - } - } else - // end comment or // - if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1) { - str += ar[ix]; - inComment = false; - } else - // // - if( /^<\w/.exec(ar[ix-1]) && /^<\/\w/.exec(ar[ix]) && - /^<[\w:\-\.\,]+/.exec(ar[ix-1]) == /^<\/[\w:\-\.\,]+/.exec(ar[ix])[0].replace('/','')) { - str += ar[ix]; - if(!inComment) deep--; - } else - // // - if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) == -1 && ar[ix].search(/\/>/) == -1 ) { - str = !inComment ? str += shift[deep++]+ar[ix] : str += ar[ix]; - } else - // ... // - if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) > -1) { - str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/<\//) > -1) { - str = !inComment ? str += shift[--deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/\/>/) > -1 ) { - str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/<\?/) > -1) { - str += shift[deep]+ar[ix]; - } else - // xmlns // - if( ar[ix].search(/xmlns\:/) > -1 || ar[ix].search(/xmlns\=/) > -1) { - str += shift[deep]+ar[ix]; - } - - else { - str += ar[ix]; + + }, {}], + 7: [function (require, module, exports) { + /** + * vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. + * + * Version - 0.99.00.beta + * Copyright (c) 2012 Vadim Kiryukhin + * vkiryukhin @ gmail.com + * http://www.eslinstructor.net/vkbeautify/ + * + * MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Pretty print + * + * vkbeautify.xml(text [,indent_pattern]); + * vkbeautify.json(text [,indent_pattern]); + * vkbeautify.css(text [,indent_pattern]); + * vkbeautify.sql(text [,indent_pattern]); + * + * @text - String; text to beatufy; + * @indent_pattern - Integer | String; + * Integer: number of white spaces; + * String: character string to visualize indentation ( can also be a set of white spaces ) + * Minify + * + * vkbeautify.xmlmin(text [,preserve_comments]); + * vkbeautify.jsonmin(text); + * vkbeautify.cssmin(text [,preserve_comments]); + * vkbeautify.sqlmin(text); + * + * @text - String; text to minify; + * @preserve_comments - Bool; [optional]; + * Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. ) + * + * Examples: + * vkbeautify.xml(text); // pretty print XML + * vkbeautify.json(text, 4 ); // pretty print JSON + * vkbeautify.css(text, '. . . .'); // pretty print CSS + * vkbeautify.sql(text, '----'); // pretty print SQL + * + * vkbeautify.xmlmin(text, true);// minify XML, preserve comments + * vkbeautify.jsonmin(text);// minify JSON + * vkbeautify.cssmin(text);// minify CSS, remove comments ( default ) + * vkbeautify.sqlmin(text);// minify SQL + * + */ + + (function () { + + function createShiftArr(step) { + + var space = ' '; + + if (isNaN(parseInt(step))) { // argument is string + space = step; + } else { // argument is integer + switch (step) { + case 1: + space = ' '; + break; + case 2: + space = ' '; + break; + case 3: + space = ' '; + break; + case 4: + space = ' '; + break; + case 5: + space = ' '; + break; + case 6: + space = ' '; + break; + case 7: + space = ' '; + break; + case 8: + space = ' '; + break; + case 9: + space = ' '; + break; + case 10: + space = ' '; + break; + case 11: + space = ' '; + break; + case 12: + space = ' '; + break; + } } - } - - return (str[0] == '\n') ? str.slice(1) : str; - } - - vkbeautify.prototype.json = function(text,step) { - - var step = step ? step : this.step; - - if (typeof JSON === 'undefined' ) return text; - - if ( typeof text === "string" ) return JSON.stringify(JSON.parse(text), null, step); - if ( typeof text === "object" ) return JSON.stringify(text, null, step); - - return text; // text is not string nor object - } - - vkbeautify.prototype.css = function(text, step) { - - var ar = text.replace(/\s{1,}/g,' ') - .replace(/\{/g,"{~::~") - .replace(/\}/g,"~::~}~::~") - .replace(/\;/g,";~::~") - .replace(/\/\*/g,"~::~/*") - .replace(/\*\//g,"*/~::~") - .replace(/~::~\s{0,}~::~/g,"~::~") - .split('~::~'), - len = ar.length, - deep = 0, - str = '', - ix = 0, - shift = step ? createShiftArr(step) : this.shift; - - for(ix=0;ix\s{0,}<") + .replace(//g,"") - .replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns'); - return str.replace(/>\s{0,}<"); - } - - vkbeautify.prototype.jsonmin = function(text) { - - if (typeof JSON === 'undefined' ) return text; - - return JSON.stringify(JSON.parse(text), null, 0); - - } - - vkbeautify.prototype.cssmin = function(text, preserveComments) { - - var str = preserveComments ? text - : text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"") ; - - return str.replace(/\s{1,}/g,' ') - .replace(/\{\s{1,}/g,"{") - .replace(/\}\s{1,}/g,"}") - .replace(/\;\s{1,}/g,";") - .replace(/\/\*\s{1,}/g,"/*") - .replace(/\*\/\s{1,}/g,"*/"); - } - - vkbeautify.prototype.sqlmin = function(text) { - return text.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")"); - } - - window.vkbeautify = new vkbeautify(); - - })(); -},{}],8:[function(require,module,exports){ -// https://d3js.org/d3-array/ v1.2.4 Copyright 2018 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(factory((global.d3 = global.d3 || {}))); -}(this, (function (exports) { 'use strict'; - -function ascending(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -} - -function bisector(compare) { - if (compare.length === 1) compare = ascendingComparator(compare); - return { - left: function(a, x, lo, hi) { - if (lo == null) lo = 0; - if (hi == null) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) < 0) lo = mid + 1; - else hi = mid; - } - return lo; - }, - right: function(a, x, lo, hi) { - if (lo == null) lo = 0; - if (hi == null) hi = a.length; - while (lo < hi) { - var mid = lo + hi >>> 1; - if (compare(a[mid], x) > 0) hi = mid; - else lo = mid + 1; - } - return lo; - } - }; -} - -function ascendingComparator(f) { - return function(d, x) { - return ascending(f(d), x); - }; -} - -var ascendingBisect = bisector(ascending); -var bisectRight = ascendingBisect.right; -var bisectLeft = ascendingBisect.left; - -function pairs(array, f) { - if (f == null) f = pair; - var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); - while (i < n) pairs[i] = f(p, p = array[++i]); - return pairs; -} - -function pair(a, b) { - return [a, b]; -} - -function cross(values0, values1, reduce) { - var n0 = values0.length, - n1 = values1.length, - values = new Array(n0 * n1), - i0, - i1, - i, - value0; - - if (reduce == null) reduce = pair; - - for (i0 = i = 0; i0 < n0; ++i0) { - for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { - values[i] = reduce(value0, values1[i1]); - } - } - - return values; -} - -function descending(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -} - -function number(x) { - return x === null ? NaN : +x; -} - -function variance(values, valueof) { - var n = values.length, - m = 0, - i = -1, - mean = 0, - value, - delta, - sum = 0; - - if (valueof == null) { - while (++i < n) { - if (!isNaN(value = number(values[i]))) { - delta = value - mean; - mean += delta / ++m; - sum += delta * (value - mean); - } - } - } - - else { - while (++i < n) { - if (!isNaN(value = number(valueof(values[i], i, values)))) { - delta = value - mean; - mean += delta / ++m; - sum += delta * (value - mean); - } - } - } - - if (m > 1) return sum / (m - 1); -} - -function deviation(array, f) { - var v = variance(array, f); - return v ? Math.sqrt(v) : v; -} - -function extent(values, valueof) { - var n = values.length, - i = -1, - value, - min, - max; - - if (valueof == null) { - while (++i < n) { // Find the first comparable value. - if ((value = values[i]) != null && value >= value) { - min = max = value; - while (++i < n) { // Compare the remaining values. - if ((value = values[i]) != null) { - if (min > value) min = value; - if (max < value) max = value; - } - } - } - } - } - - else { - while (++i < n) { // Find the first comparable value. - if ((value = valueof(values[i], i, values)) != null && value >= value) { - min = max = value; - while (++i < n) { // Compare the remaining values. - if ((value = valueof(values[i], i, values)) != null) { - if (min > value) min = value; - if (max < value) max = value; - } - } - } - } - } - - return [min, max]; -} - -var array = Array.prototype; - -var slice = array.slice; -var map = array.map; - -function constant(x) { - return function() { - return x; - }; -} - -function identity(x) { - return x; -} - -function range(start, stop, step) { - start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; - - var i = -1, - n = Math.max(0, Math.ceil((stop - start) / step)) | 0, - range = new Array(n); - - while (++i < n) { - range[i] = start + i * step; - } - - return range; -} - -var e10 = Math.sqrt(50), - e5 = Math.sqrt(10), - e2 = Math.sqrt(2); - -function ticks(start, stop, count) { - var reverse, - i = -1, - n, - ticks, - step; - - stop = +stop, start = +start, count = +count; - if (start === stop && count > 0) return [start]; - if (reverse = stop < start) n = start, start = stop, stop = n; - if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; - - if (step > 0) { - start = Math.ceil(start / step); - stop = Math.floor(stop / step); - ticks = new Array(n = Math.ceil(stop - start + 1)); - while (++i < n) ticks[i] = (start + i) * step; - } else { - start = Math.floor(start * step); - stop = Math.ceil(stop * step); - ticks = new Array(n = Math.ceil(start - stop + 1)); - while (++i < n) ticks[i] = (start - i) / step; - } - - if (reverse) ticks.reverse(); - - return ticks; -} - -function tickIncrement(start, stop, count) { - var step = (stop - start) / Math.max(0, count), - power = Math.floor(Math.log(step) / Math.LN10), - error = step / Math.pow(10, power); - return power >= 0 - ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) - : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); -} - -function tickStep(start, stop, count) { - var step0 = Math.abs(stop - start) / Math.max(0, count), - step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), - error = step0 / step1; - if (error >= e10) step1 *= 10; - else if (error >= e5) step1 *= 5; - else if (error >= e2) step1 *= 2; - return stop < start ? -step1 : step1; -} - -function sturges(values) { - return Math.ceil(Math.log(values.length) / Math.LN2) + 1; -} - -function histogram() { - var value = identity, - domain = extent, - threshold = sturges; - - function histogram(data) { - var i, - n = data.length, - x, - values = new Array(n); - - for (i = 0; i < n; ++i) { - values[i] = value(data[i], i, data); - } - var xz = domain(values), - x0 = xz[0], - x1 = xz[1], - tz = threshold(values, x0, x1); + vkbeautify.prototype.json = function (text, step) { - // Convert number of thresholds into uniform thresholds. - if (!Array.isArray(tz)) { - tz = tickStep(x0, x1, tz); - tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive - } + var step = step ? step : this.step; - // Remove any thresholds outside the domain. - var m = tz.length; - while (tz[0] <= x0) tz.shift(), --m; - while (tz[m - 1] > x1) tz.pop(), --m; + if (typeof JSON === 'undefined') return text; - var bins = new Array(m + 1), - bin; + if (typeof text === "string") return JSON.stringify(JSON.parse(text), null, step); + if (typeof text === "object") return JSON.stringify(text, null, step); - // Initialize bins. - for (i = 0; i <= m; ++i) { - bin = bins[i] = []; - bin.x0 = i > 0 ? tz[i - 1] : x0; - bin.x1 = i < m ? tz[i] : x1; - } + return text; // text is not string nor object + } - // Assign data to bins by value, ignoring any outside the domain. - for (i = 0; i < n; ++i) { - x = values[i]; - if (x0 <= x && x <= x1) { - bins[bisectRight(tz, x, 0, m)].push(data[i]); - } - } + vkbeautify.prototype.css = function (text, step) { + + var ar = text.replace(/\s{1,}/g, ' ') + .replace(/\{/g, "{~::~") + .replace(/\}/g, "~::~}~::~") + .replace(/\;/g, ";~::~") + .replace(/\/\*/g, "~::~/*") + .replace(/\*\//g, "*/~::~") + .replace(/~::~\s{0,}~::~/g, "~::~") + .split('~::~'), + len = ar.length, + deep = 0, + str = '', + ix = 0, + shift = step ? createShiftArr(step) : this.shift; + + for (ix = 0; ix < len; ix++) { + + if (/\{/.exec(ar[ix])) { + str += shift[deep++] + ar[ix]; + } else if (/\}/.exec(ar[ix])) { + str += shift[--deep] + ar[ix]; + } else if (/\*\\/.exec(ar[ix])) { + str += shift[deep] + ar[ix]; + } else { + str += shift[deep] + ar[ix]; + } + } + return str.replace(/^\n{1,}/, ''); + } - return bins; - } - - histogram.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; - }; - - histogram.domain = function(_) { - return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; - }; - - histogram.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; - }; - - return histogram; -} - -function quantile(values, p, valueof) { - if (valueof == null) valueof = number; - if (!(n = values.length)) return; - if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); - if (p >= 1) return +valueof(values[n - 1], n - 1, values); - var n, - i = (n - 1) * p, - i0 = Math.floor(i), - value0 = +valueof(values[i0], i0, values), - value1 = +valueof(values[i0 + 1], i0 + 1, values); - return value0 + (value1 - value0) * (i - i0); -} - -function freedmanDiaconis(values, min, max) { - values = map.call(values, number).sort(ascending); - return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3))); -} - -function scott(values, min, max) { - return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); -} - -function max(values, valueof) { - var n = values.length, - i = -1, - value, - max; - - if (valueof == null) { - while (++i < n) { // Find the first comparable value. - if ((value = values[i]) != null && value >= value) { - max = value; - while (++i < n) { // Compare the remaining values. - if ((value = values[i]) != null && value > max) { - max = value; - } - } - } - } - } - - else { - while (++i < n) { // Find the first comparable value. - if ((value = valueof(values[i], i, values)) != null && value >= value) { - max = value; - while (++i < n) { // Compare the remaining values. - if ((value = valueof(values[i], i, values)) != null && value > max) { - max = value; - } - } - } - } - } - - return max; -} - -function mean(values, valueof) { - var n = values.length, - m = n, - i = -1, - value, - sum = 0; - - if (valueof == null) { - while (++i < n) { - if (!isNaN(value = number(values[i]))) sum += value; - else --m; - } - } + //---------------------------------------------------------------------------- - else { - while (++i < n) { - if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; - else --m; - } - } - - if (m) return sum / m; -} - -function median(values, valueof) { - var n = values.length, - i = -1, - value, - numbers = []; - - if (valueof == null) { - while (++i < n) { - if (!isNaN(value = number(values[i]))) { - numbers.push(value); - } - } - } + function isSubquery(str, parenthesisLevel) { + return parenthesisLevel - (str.replace(/\(/g, '').length - str.replace(/\)/g, '').length) + } - else { - while (++i < n) { - if (!isNaN(value = number(valueof(values[i], i, values)))) { - numbers.push(value); - } - } - } - - return quantile(numbers.sort(ascending), 0.5); -} - -function merge(arrays) { - var n = arrays.length, - m, - i = -1, - j = 0, - merged, - array; - - while (++i < n) j += arrays[i].length; - merged = new Array(j); - - while (--n >= 0) { - array = arrays[n]; - m = array.length; - while (--m >= 0) { - merged[--j] = array[m]; - } - } - - return merged; -} - -function min(values, valueof) { - var n = values.length, - i = -1, - value, - min; - - if (valueof == null) { - while (++i < n) { // Find the first comparable value. - if ((value = values[i]) != null && value >= value) { - min = value; - while (++i < n) { // Compare the remaining values. - if ((value = values[i]) != null && min > value) { - min = value; - } - } - } - } - } - - else { - while (++i < n) { // Find the first comparable value. - if ((value = valueof(values[i], i, values)) != null && value >= value) { - min = value; - while (++i < n) { // Compare the remaining values. - if ((value = valueof(values[i], i, values)) != null && min > value) { - min = value; - } - } - } - } - } - - return min; -} - -function permute(array, indexes) { - var i = indexes.length, permutes = new Array(i); - while (i--) permutes[i] = array[indexes[i]]; - return permutes; -} - -function scan(values, compare) { - if (!(n = values.length)) return; - var n, - i = 0, - j = 0, - xi, - xj = values[j]; - - if (compare == null) compare = ascending; - - while (++i < n) { - if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { - xj = xi, j = i; - } - } - - if (compare(xj, xj) === 0) return j; -} - -function shuffle(array, i0, i1) { - var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), - t, - i; - - while (m) { - i = Math.random() * m-- | 0; - t = array[m + i0]; - array[m + i0] = array[i + i0]; - array[i + i0] = t; - } - - return array; -} - -function sum(values, valueof) { - var n = values.length, - i = -1, - value, - sum = 0; - - if (valueof == null) { - while (++i < n) { - if (value = +values[i]) sum += value; // Note: zero and null are equivalent. - } - } + function split_sql(str, tab) { - else { - while (++i < n) { - if (value = +valueof(values[i], i, values)) sum += value; - } - } + return str.replace(/\s{1,}/g, " ") - return sum; -} + .replace(/ AND /ig, "~::~" + tab + tab + "AND ") + .replace(/ BETWEEN /ig, "~::~" + tab + "BETWEEN ") + .replace(/ CASE /ig, "~::~" + tab + "CASE ") + .replace(/ ELSE /ig, "~::~" + tab + "ELSE ") + .replace(/ END /ig, "~::~" + tab + "END ") + .replace(/ FROM /ig, "~::~FROM ") + .replace(/ GROUP\s{1,}BY/ig, "~::~GROUP BY ") + .replace(/ HAVING /ig, "~::~HAVING ") + //.replace(/ SET /ig," SET~::~") + .replace(/ IN /ig, " IN ") -function transpose(matrix) { - if (!(n = matrix.length)) return []; - for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { - for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { - row[j] = matrix[j][i]; - } - } - return transpose; -} - -function length(d) { - return d.length; -} - -function zip() { - return transpose(arguments); -} - -exports.bisect = bisectRight; -exports.bisectRight = bisectRight; -exports.bisectLeft = bisectLeft; -exports.ascending = ascending; -exports.bisector = bisector; -exports.cross = cross; -exports.descending = descending; -exports.deviation = deviation; -exports.extent = extent; -exports.histogram = histogram; -exports.thresholdFreedmanDiaconis = freedmanDiaconis; -exports.thresholdScott = scott; -exports.thresholdSturges = sturges; -exports.max = max; -exports.mean = mean; -exports.median = median; -exports.merge = merge; -exports.min = min; -exports.pairs = pairs; -exports.permute = permute; -exports.quantile = quantile; -exports.range = range; -exports.scan = scan; -exports.shuffle = shuffle; -exports.sum = sum; -exports.ticks = ticks; -exports.tickIncrement = tickIncrement; -exports.tickStep = tickStep; -exports.transpose = transpose; -exports.variance = variance; -exports.zip = zip; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -},{}],9:[function(require,module,exports){ -// https://d3js.org/d3-axis/ v1.0.12 Copyright 2018 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(factory((global.d3 = global.d3 || {}))); -}(this, (function (exports) { 'use strict'; - -var slice = Array.prototype.slice; - -function identity(x) { - return x; -} - -var top = 1, - right = 2, - bottom = 3, - left = 4, - epsilon = 1e-6; - -function translateX(x) { - return "translate(" + (x + 0.5) + ",0)"; -} - -function translateY(y) { - return "translate(0," + (y + 0.5) + ")"; -} - -function number(scale) { - return function(d) { - return +scale(d); - }; -} - -function center(scale) { - var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. - if (scale.round()) offset = Math.round(offset); - return function(d) { - return +scale(d) + offset; - }; -} - -function entering() { - return !this.__axis; -} - -function axis(orient, scale) { - var tickArguments = [], - tickValues = null, - tickFormat = null, - tickSizeInner = 6, - tickSizeOuter = 6, - tickPadding = 3, - k = orient === top || orient === left ? -1 : 1, - x = orient === left || orient === right ? "x" : "y", - transform = orient === top || orient === bottom ? translateX : translateY; - - function axis(context) { - var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, - format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat, - spacing = Math.max(tickSizeInner, 0) + tickPadding, - range = scale.range(), - range0 = +range[0] + 0.5, - range1 = +range[range.length - 1] + 0.5, - position = (scale.bandwidth ? center : number)(scale.copy()), - selection = context.selection ? context.selection() : context, - path = selection.selectAll(".domain").data([null]), - tick = selection.selectAll(".tick").data(values, scale).order(), - tickExit = tick.exit(), - tickEnter = tick.enter().append("g").attr("class", "tick"), - line = tick.select("line"), - text = tick.select("text"); - - path = path.merge(path.enter().insert("path", ".tick") - .attr("class", "domain") - .attr("stroke", "currentColor")); - - tick = tick.merge(tickEnter); - - line = line.merge(tickEnter.append("line") - .attr("stroke", "currentColor") - .attr(x + "2", k * tickSizeInner)); - - text = text.merge(tickEnter.append("text") - .attr("fill", "currentColor") - .attr(x, k * spacing) - .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); - - if (context !== selection) { - path = path.transition(context); - tick = tick.transition(context); - line = line.transition(context); - text = text.transition(context); - - tickExit = tickExit.transition(context) - .attr("opacity", epsilon) - .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); }); - - tickEnter - .attr("opacity", epsilon) - .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); }); - } + .replace(/ JOIN /ig, "~::~JOIN ") + .replace(/ CROSS~::~{1,}JOIN /ig, "~::~CROSS JOIN ") + .replace(/ INNER~::~{1,}JOIN /ig, "~::~INNER JOIN ") + .replace(/ LEFT~::~{1,}JOIN /ig, "~::~LEFT JOIN ") + .replace(/ RIGHT~::~{1,}JOIN /ig, "~::~RIGHT JOIN ") - tickExit.remove(); + .replace(/ ON /ig, "~::~" + tab + "ON ") + .replace(/ OR /ig, "~::~" + tab + tab + "OR ") + .replace(/ ORDER\s{1,}BY/ig, "~::~ORDER BY ") + .replace(/ OVER /ig, "~::~" + tab + "OVER ") - path - .attr("d", orient === left || orient == right - ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) - : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1)); + .replace(/\(\s{0,}SELECT /ig, "~::~(SELECT ") + .replace(/\)\s{0,}SELECT /ig, ")~::~SELECT ") - tick - .attr("opacity", 1) - .attr("transform", function(d) { return transform(position(d)); }); + .replace(/ THEN /ig, " THEN~::~" + tab + "") + .replace(/ UNION /ig, "~::~UNION~::~") + .replace(/ USING /ig, "~::~USING ") + .replace(/ WHEN /ig, "~::~" + tab + "WHEN ") + .replace(/ WHERE /ig, "~::~WHERE ") + .replace(/ WITH /ig, "~::~WITH ") - line - .attr(x + "2", k * tickSizeInner); + //.replace(/\,\s{0,}\(/ig,",~::~( ") + //.replace(/\,/ig,",~::~"+tab+tab+"") - text - .attr(x, k * spacing) - .text(format); + .replace(/ ALL /ig, " ALL ") + .replace(/ AS /ig, " AS ") + .replace(/ ASC /ig, " ASC ") + .replace(/ DESC /ig, " DESC ") + .replace(/ DISTINCT /ig, " DISTINCT ") + .replace(/ EXISTS /ig, " EXISTS ") + .replace(/ NOT /ig, " NOT ") + .replace(/ NULL /ig, " NULL ") + .replace(/ LIKE /ig, " LIKE ") + .replace(/\s{0,}SELECT /ig, "SELECT ") + .replace(/\s{0,}UPDATE /ig, "UPDATE ") + .replace(/ SET /ig, " SET ") + + .replace(/~::~{1,}/g, "~::~") + .split('~::~'); + } - selection.filter(entering) - .attr("fill", "none") - .attr("font-size", 10) - .attr("font-family", "sans-serif") - .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + vkbeautify.prototype.sql = function (text, step) { + + var ar_by_quote = text.replace(/\s{1,}/g, " ") + .replace(/\'/ig, "~::~\'") + .split('~::~'), + len = ar_by_quote.length, + ar = [], + deep = 0, + tab = this.step,//+this.step, + inComment = true, + inQuote = false, + parenthesisLevel = 0, + str = '', + ix = 0, + shift = step ? createShiftArr(step) : this.shift; + ; + + for (ix = 0; ix < len; ix++) { + if (ix % 2) { + ar = ar.concat(ar_by_quote[ix]); + } else { + ar = ar.concat(split_sql(ar_by_quote[ix], tab)); + } + } - selection - .each(function() { this.__axis = position; }); - } + len = ar.length; + for (ix = 0; ix < len; ix++) { - axis.scale = function(_) { - return arguments.length ? (scale = _, axis) : scale; - }; + parenthesisLevel = isSubquery(ar[ix], parenthesisLevel); - axis.ticks = function() { - return tickArguments = slice.call(arguments), axis; - }; + if (/\s{0,}\s{0,}SELECT\s{0,}/.exec(ar[ix])) { + ar[ix] = ar[ix].replace(/\,/g, ",\n" + tab + tab + "") + } - axis.tickArguments = function(_) { - return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice(); - }; + if (/\s{0,}\s{0,}SET\s{0,}/.exec(ar[ix])) { + ar[ix] = ar[ix].replace(/\,/g, ",\n" + tab + tab + "") + } - axis.tickValues = function(_) { - return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice(); - }; + if (/\s{0,}\(\s{0,}SELECT\s{0,}/.exec(ar[ix])) { + deep++; + str += shift[deep] + ar[ix]; + } else if (/\'/.exec(ar[ix])) { + if (parenthesisLevel < 1 && deep) { + deep--; + } + str += ar[ix]; + } else { + str += shift[deep] + ar[ix]; + if (parenthesisLevel < 1 && deep) { + deep--; + } + } + var junk = 0; + } - axis.tickFormat = function(_) { - return arguments.length ? (tickFormat = _, axis) : tickFormat; - }; + str = str.replace(/^\n{1,}/, '').replace(/\n{1,}/g, "\n"); + return str; + } - axis.tickSize = function(_) { - return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; - }; - axis.tickSizeInner = function(_) { - return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; - }; + vkbeautify.prototype.xmlmin = function (text, preserveComments) { - axis.tickSizeOuter = function(_) { - return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; - }; + var str = preserveComments ? text + : text.replace(/\/g, "") + .replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns'); + return str.replace(/>\s{0,}<"); + } - axis.tickPadding = function(_) { - return arguments.length ? (tickPadding = +_, axis) : tickPadding; - }; + vkbeautify.prototype.jsonmin = function (text) { - return axis; -} + if (typeof JSON === 'undefined') return text; -function axisTop(scale) { - return axis(top, scale); -} + return JSON.stringify(JSON.parse(text), null, 0); -function axisRight(scale) { - return axis(right, scale); -} + } -function axisBottom(scale) { - return axis(bottom, scale); -} + vkbeautify.prototype.cssmin = function (text, preserveComments) { -function axisLeft(scale) { - return axis(left, scale); -} + var str = preserveComments ? text + : text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g, ""); -exports.axisTop = axisTop; -exports.axisRight = axisRight; -exports.axisBottom = axisBottom; -exports.axisLeft = axisLeft; + return str.replace(/\s{1,}/g, ' ') + .replace(/\{\s{1,}/g, "{") + .replace(/\}\s{1,}/g, "}") + .replace(/\;\s{1,}/g, ";") + .replace(/\/\*\s{1,}/g, "/*") + .replace(/\*\/\s{1,}/g, "*/"); + } -Object.defineProperty(exports, '__esModule', { value: true }); + vkbeautify.prototype.sqlmin = function (text) { + return text.replace(/\s{1,}/g, " ").replace(/\s{1,}\(/, "(").replace(/\s{1,}\)/, ")"); + } -}))); + window.vkbeautify = new vkbeautify(); -},{}],10:[function(require,module,exports){ -// https://d3js.org/d3-brush/ v1.1.5 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); -}(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { 'use strict'; - -function constant(x) { - return function() { - return x; - }; -} - -function BrushEvent(target, type, selection) { - this.target = target; - this.type = type; - this.selection = selection; -} - -function nopropagation() { - d3Selection.event.stopImmediatePropagation(); -} - -function noevent() { - d3Selection.event.preventDefault(); - d3Selection.event.stopImmediatePropagation(); -} - -var MODE_DRAG = {name: "drag"}, - MODE_SPACE = {name: "space"}, - MODE_HANDLE = {name: "handle"}, - MODE_CENTER = {name: "center"}; - -function number1(e) { - return [+e[0], +e[1]]; -} - -function number2(e) { - return [number1(e[0]), number1(e[1])]; -} - -function toucher(identifier) { - return function(target) { - return d3Selection.touch(target, d3Selection.event.touches, identifier); - }; -} - -var X = { - name: "x", - handles: ["w", "e"].map(type), - input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; }, - output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } -}; - -var Y = { - name: "y", - handles: ["n", "s"].map(type), - input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; }, - output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } -}; - -var XY = { - name: "xy", - handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), - input: function(xy) { return xy == null ? null : number2(xy); }, - output: function(xy) { return xy; } -}; - -var cursors = { - overlay: "crosshair", - selection: "move", - n: "ns-resize", - e: "ew-resize", - s: "ns-resize", - w: "ew-resize", - nw: "nwse-resize", - ne: "nesw-resize", - se: "nwse-resize", - sw: "nesw-resize" -}; - -var flipX = { - e: "w", - w: "e", - nw: "ne", - ne: "nw", - se: "sw", - sw: "se" -}; - -var flipY = { - n: "s", - s: "n", - nw: "sw", - ne: "se", - se: "ne", - sw: "nw" -}; - -var signsX = { - overlay: +1, - selection: +1, - n: null, - e: +1, - s: null, - w: -1, - nw: -1, - ne: +1, - se: +1, - sw: -1 -}; - -var signsY = { - overlay: +1, - selection: +1, - n: -1, - e: null, - s: +1, - w: null, - nw: -1, - ne: -1, - se: +1, - sw: +1 -}; - -function type(t) { - return {type: t}; -} + })(); + }, {}], + 8: [function (require, module, exports) { +// https://d3js.org/d3-array/ v1.2.4 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } -// Ignore right-click, since that should open the context menu. -function defaultFilter() { - return !d3Selection.event.ctrlKey && !d3Selection.event.button; -} - -function defaultExtent() { - var svg = this.ownerSVGElement || this; - if (svg.hasAttribute("viewBox")) { - svg = svg.viewBox.baseVal; - return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; - } - return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; -} - -function defaultTouchable() { - return navigator.maxTouchPoints || ("ontouchstart" in this); -} + function bisector(compare) { + if (compare.length === 1) compare = ascendingComparator(compare); + return { + left: function (a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + }, + right: function (a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + }; + } -// Like d3.local, but with the name “__brush” rather than auto-generated. -function local(node) { - while (!node.__brush) if (!(node = node.parentNode)) return; - return node.__brush; -} - -function empty(extent) { - return extent[0][0] === extent[1][0] - || extent[0][1] === extent[1][1]; -} - -function brushSelection(node) { - var state = node.__brush; - return state ? state.dim.output(state.selection) : null; -} - -function brushX() { - return brush$1(X); -} - -function brushY() { - return brush$1(Y); -} - -function brush() { - return brush$1(XY); -} - -function brush$1(dim) { - var extent = defaultExtent, - filter = defaultFilter, - touchable = defaultTouchable, - keys = true, - listeners = d3Dispatch.dispatch("start", "brush", "end"), - handleSize = 6, - touchending; - - function brush(group) { - var overlay = group - .property("__brush", initialize) - .selectAll(".overlay") - .data([type("overlay")]); - - overlay.enter().append("rect") - .attr("class", "overlay") - .attr("pointer-events", "all") - .attr("cursor", cursors.overlay) - .merge(overlay) - .each(function() { - var extent = local(this).extent; - d3Selection.select(this) - .attr("x", extent[0][0]) - .attr("y", extent[0][1]) - .attr("width", extent[1][0] - extent[0][0]) - .attr("height", extent[1][1] - extent[0][1]); - }); + function ascendingComparator(f) { + return function (d, x) { + return ascending(f(d), x); + }; + } - group.selectAll(".selection") - .data([type("selection")]) - .enter().append("rect") - .attr("class", "selection") - .attr("cursor", cursors.selection) - .attr("fill", "#777") - .attr("fill-opacity", 0.3) - .attr("stroke", "#fff") - .attr("shape-rendering", "crispEdges"); - - var handle = group.selectAll(".handle") - .data(dim.handles, function(d) { return d.type; }); - - handle.exit().remove(); - - handle.enter().append("rect") - .attr("class", function(d) { return "handle handle--" + d.type; }) - .attr("cursor", function(d) { return cursors[d.type]; }); - - group - .each(redraw) - .attr("fill", "none") - .attr("pointer-events", "all") - .on("mousedown.brush", started) - .filter(touchable) - .on("touchstart.brush", started) - .on("touchmove.brush", touchmoved) - .on("touchend.brush touchcancel.brush", touchended) - .style("touch-action", "none") - .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); - } - - brush.move = function(group, selection) { - if (group.selection) { - group - .on("start.brush", function() { emitter(this, arguments).beforestart().start(); }) - .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); }) - .tween("brush", function() { - var that = this, - state = that.__brush, - emit = emitter(that, arguments), - selection0 = state.selection, - selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), - i = d3Interpolate.interpolate(selection0, selection1); - - function tween(t) { - state.selection = t === 1 && selection1 === null ? null : i(t); - redraw.call(that); - emit.brush(); - } - - return selection0 !== null && selection1 !== null ? tween : tween(1); - }); - } else { - group - .each(function() { - var that = this, - args = arguments, - state = that.__brush, - selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), - emit = emitter(that, args).beforestart(); - - d3Transition.interrupt(that); - state.selection = selection1 === null ? null : selection1; - redraw.call(that); - emit.start().brush().end(); - }); - } - }; - - brush.clear = function(group) { - brush.move(group, null); - }; - - function redraw() { - var group = d3Selection.select(this), - selection = local(this).selection; - - if (selection) { - group.selectAll(".selection") - .style("display", null) - .attr("x", selection[0][0]) - .attr("y", selection[0][1]) - .attr("width", selection[1][0] - selection[0][0]) - .attr("height", selection[1][1] - selection[0][1]); - - group.selectAll(".handle") - .style("display", null) - .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; }) - .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; }) - .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; }) - .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; }); - } + var ascendingBisect = bisector(ascending); + var bisectRight = ascendingBisect.right; + var bisectLeft = ascendingBisect.left; - else { - group.selectAll(".selection,.handle") - .style("display", "none") - .attr("x", null) - .attr("y", null) - .attr("width", null) - .attr("height", null); - } - } - - function emitter(that, args, clean) { - return (!clean && that.__brush.emitter) || new Emitter(that, args); - } - - function Emitter(that, args) { - this.that = that; - this.args = args; - this.state = that.__brush; - this.active = 0; - } - - Emitter.prototype = { - beforestart: function() { - if (++this.active === 1) this.state.emitter = this, this.starting = true; - return this; - }, - start: function() { - if (this.starting) this.starting = false, this.emit("start"); - else this.emit("brush"); - return this; - }, - brush: function() { - this.emit("brush"); - return this; - }, - end: function() { - if (--this.active === 0) delete this.state.emitter, this.emit("end"); - return this; - }, - emit: function(type) { - d3Selection.customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); - } - }; - - function started() { - if (touchending && !d3Selection.event.touches) return; - if (!filter.apply(this, arguments)) return; - - var that = this, - type = d3Selection.event.target.__data__.type, - mode = (keys && d3Selection.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && d3Selection.event.altKey ? MODE_CENTER : MODE_HANDLE), - signX = dim === Y ? null : signsX[type], - signY = dim === X ? null : signsY[type], - state = local(that), - extent = state.extent, - selection = state.selection, - W = extent[0][0], w0, w1, - N = extent[0][1], n0, n1, - E = extent[1][0], e0, e1, - S = extent[1][1], s0, s1, - dx = 0, - dy = 0, - moving, - shifting = signX && signY && keys && d3Selection.event.shiftKey, - lockX, - lockY, - pointer = d3Selection.event.touches ? toucher(d3Selection.event.changedTouches[0].identifier) : d3Selection.mouse, - point0 = pointer(that), - point = point0, - emit = emitter(that, arguments, true).beforestart(); - - if (type === "overlay") { - if (selection) moving = true; - state.selection = selection = [ - [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], - [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] - ]; - } else { - w0 = selection[0][0]; - n0 = selection[0][1]; - e0 = selection[1][0]; - s0 = selection[1][1]; - } + function pairs(array, f) { + if (f == null) f = pair; + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = f(p, p = array[++i]); + return pairs; + } - w1 = w0; - n1 = n0; - e1 = e0; - s1 = s0; - - var group = d3Selection.select(that) - .attr("pointer-events", "none"); - - var overlay = group.selectAll(".overlay") - .attr("cursor", cursors[type]); - - if (d3Selection.event.touches) { - emit.moved = moved; - emit.ended = ended; - } else { - var view = d3Selection.select(d3Selection.event.view) - .on("mousemove.brush", moved, true) - .on("mouseup.brush", ended, true); - if (keys) view - .on("keydown.brush", keydowned, true) - .on("keyup.brush", keyupped, true); - - d3Drag.dragDisable(d3Selection.event.view); - } + function pair(a, b) { + return [a, b]; + } - nopropagation(); - d3Transition.interrupt(that); - redraw.call(that); - emit.start(); - - function moved() { - var point1 = pointer(that); - if (shifting && !lockX && !lockY) { - if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; - else lockX = true; - } - point = point1; - moving = true; - noevent(); - move(); - } + function cross(values0, values1, reduce) { + var n0 = values0.length, + n1 = values1.length, + values = new Array(n0 * n1), + i0, + i1, + i, + value0; - function move() { - var t; + if (reduce == null) reduce = pair; - dx = point[0] - point0[0]; - dy = point[1] - point0[1]; + for (i0 = i = 0; i0 < n0; ++i0) { + for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { + values[i] = reduce(value0, values1[i1]); + } + } - switch (mode) { - case MODE_SPACE: - case MODE_DRAG: { - if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; - if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; - break; - } - case MODE_HANDLE: { - if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; - else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; - if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; - else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; - break; - } - case MODE_CENTER: { - if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); - if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); - break; - } - } - - if (e1 < w1) { - signX *= -1; - t = w0, w0 = e0, e0 = t; - t = w1, w1 = e1, e1 = t; - if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); - } - - if (s1 < n1) { - signY *= -1; - t = n0, n0 = s0, s0 = t; - t = n1, n1 = s1, s1 = t; - if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); - } - - if (state.selection) selection = state.selection; // May be set by brush.move! - if (lockX) w1 = selection[0][0], e1 = selection[1][0]; - if (lockY) n1 = selection[0][1], s1 = selection[1][1]; - - if (selection[0][0] !== w1 - || selection[0][1] !== n1 - || selection[1][0] !== e1 - || selection[1][1] !== s1) { - state.selection = [[w1, n1], [e1, s1]]; - redraw.call(that); - emit.brush(); - } - } + return values; + } - function ended() { - nopropagation(); - if (d3Selection.event.touches) { - if (d3Selection.event.touches.length) return; - if (touchending) clearTimeout(touchending); - touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! - } else { - d3Drag.dragEnable(d3Selection.event.view, moving); - view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); - } - group.attr("pointer-events", "all"); - overlay.attr("cursor", cursors.overlay); - if (state.selection) selection = state.selection; // May be set by brush.move (on start)! - if (empty(selection)) state.selection = null, redraw.call(that); - emit.end(); - } + function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } - function keydowned() { - switch (d3Selection.event.keyCode) { - case 16: { // SHIFT - shifting = signX && signY; - break; - } - case 18: { // ALT - if (mode === MODE_HANDLE) { - if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; - if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; - mode = MODE_CENTER; - move(); - } - break; - } - case 32: { // SPACE; takes priority over ALT - if (mode === MODE_HANDLE || mode === MODE_CENTER) { - if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; - if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; - mode = MODE_SPACE; - overlay.attr("cursor", cursors.selection); - move(); - } - break; - } - default: return; - } - noevent(); - } + function number(x) { + return x === null ? NaN : +x; + } - function keyupped() { - switch (d3Selection.event.keyCode) { - case 16: { // SHIFT - if (shifting) { - lockX = lockY = shifting = false; - move(); - } - break; - } - case 18: { // ALT - if (mode === MODE_CENTER) { - if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; - if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; - mode = MODE_HANDLE; - move(); - } - break; - } - case 32: { // SPACE - if (mode === MODE_SPACE) { - if (d3Selection.event.altKey) { - if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; - if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; - mode = MODE_CENTER; - } else { - if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; - if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; - mode = MODE_HANDLE; - } - overlay.attr("cursor", cursors[type]); - move(); - } - break; - } - default: return; - } - noevent(); - } - } + function variance(values, valueof) { + var n = values.length, + m = 0, + i = -1, + mean = 0, + value, + delta, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } - function touchmoved() { - emitter(this, arguments).moved(); - } + if (m > 1) return sum / (m - 1); + } - function touchended() { - emitter(this, arguments).ended(); - } + function deviation(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; + } - function initialize() { - var state = this.__brush || {selection: null}; - state.extent = number2(extent.apply(this, arguments)); - state.dim = dim; - return state; - } + function extent(values, valueof) { + var n = values.length, + i = -1, + value, + min, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } - brush.extent = function(_) { - return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent; - }; + return [min, max]; + } - brush.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; - }; + var array = Array.prototype; - brush.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable; - }; + var slice = array.slice; + var map = array.map; - brush.handleSize = function(_) { - return arguments.length ? (handleSize = +_, brush) : handleSize; - }; + function constant(x) { + return function () { + return x; + }; + } - brush.keyModifiers = function(_) { - return arguments.length ? (keys = !!_, brush) : keys; - }; + function identity(x) { + return x; + } - brush.on = function() { - var value = listeners.on.apply(listeners, arguments); - return value === listeners ? brush : value; - }; + function range(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; - return brush; -} + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); -exports.brush = brush; -exports.brushSelection = brushSelection; -exports.brushX = brushX; -exports.brushY = brushY; + while (++i < n) { + range[i] = start + i * step; + } -Object.defineProperty(exports, '__esModule', { value: true }); + return range; + } -})); + var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + + function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + start = Math.floor(start * step); + stop = Math.ceil(stop * step); + ticks = new Array(n = Math.ceil(start - stop + 1)); + while (++i < n) ticks[i] = (start - i) / step; + } -},{"d3-dispatch":15,"d3-drag":16,"d3-interpolate":24,"d3-selection":31,"d3-transition":36}],11:[function(require,module,exports){ -// https://d3js.org/d3-chord/ v1.0.6 Copyright 2018 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-path')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-path'], factory) : -(factory((global.d3 = global.d3 || {}),global.d3,global.d3)); -}(this, (function (exports,d3Array,d3Path) { 'use strict'; - -var cos = Math.cos; -var sin = Math.sin; -var pi = Math.PI; -var halfPi = pi / 2; -var tau = pi * 2; -var max = Math.max; - -function compareValue(compare) { - return function(a, b) { - return compare( - a.source.value + a.target.value, - b.source.value + b.target.value - ); - }; -} - -function chord() { - var padAngle = 0, - sortGroups = null, - sortSubgroups = null, - sortChords = null; - - function chord(matrix) { - var n = matrix.length, - groupSums = [], - groupIndex = d3Array.range(n), - subgroupIndex = [], - chords = [], - groups = chords.groups = new Array(n), - subgroups = new Array(n * n), - k, - x, - x0, - dx, - i, - j; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3Array.range(n)); - k += x; - } + if (reverse) ticks.reverse(); - // Sort groups… - if (sortGroups) groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - - // Sort subgroups… - if (sortSubgroups) subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified? - // TODO Allow padding to be specified as percentage? - k = max(0, tau - padAngle * n) / k; - dx = k ? padAngle : tau / n; - - // Compute the start and end angle for each group and subgroup. - // Note: Opera has a bug reordering object literal properties! - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[di][j], - v = matrix[di][dj], - a0 = x, - a1 = x += v * k; - subgroups[dj * n + di] = { - index: di, - subindex: dj, - startAngle: a0, - endAngle: a1, - value: v - }; - } - groups[di] = { - index: di, - startAngle: x0, - endAngle: x, - value: groupSums[di] - }; - x += dx; - } + return ticks; + } - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[j * n + i], - target = subgroups[i * n + j]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } + function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); + } - return sortChords ? chords.sort(sortChords) : chords; - } - - chord.padAngle = function(_) { - return arguments.length ? (padAngle = max(0, _), chord) : padAngle; - }; - - chord.sortGroups = function(_) { - return arguments.length ? (sortGroups = _, chord) : sortGroups; - }; - - chord.sortSubgroups = function(_) { - return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; - }; - - chord.sortChords = function(_) { - return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; - }; - - return chord; -} - -var slice = Array.prototype.slice; - -function constant(x) { - return function() { - return x; - }; -} - -function defaultSource(d) { - return d.source; -} - -function defaultTarget(d) { - return d.target; -} - -function defaultRadius(d) { - return d.radius; -} - -function defaultStartAngle(d) { - return d.startAngle; -} - -function defaultEndAngle(d) { - return d.endAngle; -} - -function ribbon() { - var source = defaultSource, - target = defaultTarget, - radius = defaultRadius, - startAngle = defaultStartAngle, - endAngle = defaultEndAngle, - context = null; - - function ribbon() { - var buffer, - argv = slice.call(arguments), - s = source.apply(this, argv), - t = target.apply(this, argv), - sr = +radius.apply(this, (argv[0] = s, argv)), - sa0 = startAngle.apply(this, argv) - halfPi, - sa1 = endAngle.apply(this, argv) - halfPi, - sx0 = sr * cos(sa0), - sy0 = sr * sin(sa0), - tr = +radius.apply(this, (argv[0] = t, argv)), - ta0 = startAngle.apply(this, argv) - halfPi, - ta1 = endAngle.apply(this, argv) - halfPi; - - if (!context) context = buffer = d3Path.path(); - - context.moveTo(sx0, sy0); - context.arc(0, 0, sr, sa0, sa1); - if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? - context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); - context.arc(0, 0, tr, ta0, ta1); - } - context.quadraticCurveTo(0, 0, sx0, sy0); - context.closePath(); + function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; + } - if (buffer) return context = null, buffer + "" || null; - } + function sturges(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; + } - ribbon.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), ribbon) : radius; - }; + function histogram() { + var value = identity, + domain = extent, + threshold = sturges; - ribbon.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; - }; + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); - ribbon.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; - }; + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } - ribbon.source = function(_) { - return arguments.length ? (source = _, ribbon) : source; - }; + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); - ribbon.target = function(_) { - return arguments.length ? (target = _, ribbon) : target; - }; + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + tz = tickStep(x0, x1, tz); + tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive + } - ribbon.context = function(_) { - return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; - }; + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; - return ribbon; -} + var bins = new Array(m + 1), + bin; -exports.chord = chord; -exports.ribbon = ribbon; + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } -Object.defineProperty(exports, '__esModule', { value: true }); + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } -}))); + return bins; + } -},{"d3-array":8,"d3-path":25}],12:[function(require,module,exports){ -// https://d3js.org/d3-collection/ v1.0.7 Copyright 2018 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(factory((global.d3 = global.d3 || {}))); -}(this, (function (exports) { 'use strict'; - -var prefix = "$"; - -function Map() {} - -Map.prototype = map.prototype = { - constructor: Map, - has: function(key) { - return (prefix + key) in this; - }, - get: function(key) { - return this[prefix + key]; - }, - set: function(key, value) { - this[prefix + key] = value; - return this; - }, - remove: function(key) { - var property = prefix + key; - return property in this && delete this[property]; - }, - clear: function() { - for (var property in this) if (property[0] === prefix) delete this[property]; - }, - keys: function() { - var keys = []; - for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); - return keys; - }, - values: function() { - var values = []; - for (var property in this) if (property[0] === prefix) values.push(this[property]); - return values; - }, - entries: function() { - var entries = []; - for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); - return entries; - }, - size: function() { - var size = 0; - for (var property in this) if (property[0] === prefix) ++size; - return size; - }, - empty: function() { - for (var property in this) if (property[0] === prefix) return false; - return true; - }, - each: function(f) { - for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); - } -}; - -function map(object, f) { - var map = new Map; - - // Copy constructor. - if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); - - // Index array by numeric index or specified key function. - else if (Array.isArray(object)) { - var i = -1, - n = object.length, - o; - - if (f == null) while (++i < n) map.set(i, object[i]); - else while (++i < n) map.set(f(o = object[i], i, object), o); - } - - // Convert object to map. - else if (object) for (var key in object) map.set(key, object[key]); - - return map; -} - -function nest() { - var keys = [], - sortKeys = [], - sortValues, - rollup, - nest; - - function apply(array, depth, createResult, setResult) { - if (depth >= keys.length) { - if (sortValues != null) array.sort(sortValues); - return rollup != null ? rollup(array) : array; - } + histogram.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - value, - valuesByKey = map(), - values, - result = createResult(); - - while (++i < n) { - if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { - values.push(value); - } else { - valuesByKey.set(keyValue, [value]); - } - } + histogram.domain = function (_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; - valuesByKey.each(function(values, key) { - setResult(result, key, apply(values, depth, createResult, setResult)); - }); - - return result; - } - - function entries(map$$1, depth) { - if (++depth > keys.length) return map$$1; - var array, sortKey = sortKeys[depth - 1]; - if (rollup != null && depth >= keys.length) array = map$$1.entries(); - else array = [], map$$1.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); - return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; - } - - return nest = { - object: function(array) { return apply(array, 0, createObject, setObject); }, - map: function(array) { return apply(array, 0, createMap, setMap); }, - entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, - key: function(d) { keys.push(d); return nest; }, - sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, - sortValues: function(order) { sortValues = order; return nest; }, - rollup: function(f) { rollup = f; return nest; } - }; -} - -function createObject() { - return {}; -} - -function setObject(object, key, value) { - object[key] = value; -} - -function createMap() { - return map(); -} - -function setMap(map$$1, key, value) { - map$$1.set(key, value); -} - -function Set() {} - -var proto = map.prototype; - -Set.prototype = set.prototype = { - constructor: Set, - has: proto.has, - add: function(value) { - value += ""; - this[prefix + value] = value; - return this; - }, - remove: proto.remove, - clear: proto.clear, - values: proto.keys, - size: proto.size, - empty: proto.empty, - each: proto.each -}; - -function set(object, f) { - var set = new Set; - - // Copy constructor. - if (object instanceof Set) object.each(function(value) { set.add(value); }); - - // Otherwise, assume it’s an array. - else if (object) { - var i = -1, n = object.length; - if (f == null) while (++i < n) set.add(object[i]); - else while (++i < n) set.add(f(object[i], i, object)); - } - - return set; -} - -function keys(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -} - -function values(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -} - -function entries(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -} - -exports.nest = nest; -exports.set = set; -exports.map = map; -exports.keys = keys; -exports.values = values; -exports.entries = entries; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -},{}],13:[function(require,module,exports){ -// https://d3js.org/d3-color/ v1.4.0 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -function define(constructor, factory, prototype) { - constructor.prototype = factory.prototype = prototype; - prototype.constructor = constructor; -} - -function extend(parent, definition) { - var prototype = Object.create(parent.prototype); - for (var key in definition) prototype[key] = definition[key]; - return prototype; -} - -function Color() {} - -var darker = 0.7; -var brighter = 1 / darker; - -var reI = "\\s*([+-]?\\d+)\\s*", - reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", - reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", - reHex = /^#([0-9a-f]{3,8})$/, - reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), - reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), - reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), - reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), - reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), - reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); - -var named = { - aliceblue: 0xf0f8ff, - antiquewhite: 0xfaebd7, - aqua: 0x00ffff, - aquamarine: 0x7fffd4, - azure: 0xf0ffff, - beige: 0xf5f5dc, - bisque: 0xffe4c4, - black: 0x000000, - blanchedalmond: 0xffebcd, - blue: 0x0000ff, - blueviolet: 0x8a2be2, - brown: 0xa52a2a, - burlywood: 0xdeb887, - cadetblue: 0x5f9ea0, - chartreuse: 0x7fff00, - chocolate: 0xd2691e, - coral: 0xff7f50, - cornflowerblue: 0x6495ed, - cornsilk: 0xfff8dc, - crimson: 0xdc143c, - cyan: 0x00ffff, - darkblue: 0x00008b, - darkcyan: 0x008b8b, - darkgoldenrod: 0xb8860b, - darkgray: 0xa9a9a9, - darkgreen: 0x006400, - darkgrey: 0xa9a9a9, - darkkhaki: 0xbdb76b, - darkmagenta: 0x8b008b, - darkolivegreen: 0x556b2f, - darkorange: 0xff8c00, - darkorchid: 0x9932cc, - darkred: 0x8b0000, - darksalmon: 0xe9967a, - darkseagreen: 0x8fbc8f, - darkslateblue: 0x483d8b, - darkslategray: 0x2f4f4f, - darkslategrey: 0x2f4f4f, - darkturquoise: 0x00ced1, - darkviolet: 0x9400d3, - deeppink: 0xff1493, - deepskyblue: 0x00bfff, - dimgray: 0x696969, - dimgrey: 0x696969, - dodgerblue: 0x1e90ff, - firebrick: 0xb22222, - floralwhite: 0xfffaf0, - forestgreen: 0x228b22, - fuchsia: 0xff00ff, - gainsboro: 0xdcdcdc, - ghostwhite: 0xf8f8ff, - gold: 0xffd700, - goldenrod: 0xdaa520, - gray: 0x808080, - green: 0x008000, - greenyellow: 0xadff2f, - grey: 0x808080, - honeydew: 0xf0fff0, - hotpink: 0xff69b4, - indianred: 0xcd5c5c, - indigo: 0x4b0082, - ivory: 0xfffff0, - khaki: 0xf0e68c, - lavender: 0xe6e6fa, - lavenderblush: 0xfff0f5, - lawngreen: 0x7cfc00, - lemonchiffon: 0xfffacd, - lightblue: 0xadd8e6, - lightcoral: 0xf08080, - lightcyan: 0xe0ffff, - lightgoldenrodyellow: 0xfafad2, - lightgray: 0xd3d3d3, - lightgreen: 0x90ee90, - lightgrey: 0xd3d3d3, - lightpink: 0xffb6c1, - lightsalmon: 0xffa07a, - lightseagreen: 0x20b2aa, - lightskyblue: 0x87cefa, - lightslategray: 0x778899, - lightslategrey: 0x778899, - lightsteelblue: 0xb0c4de, - lightyellow: 0xffffe0, - lime: 0x00ff00, - limegreen: 0x32cd32, - linen: 0xfaf0e6, - magenta: 0xff00ff, - maroon: 0x800000, - mediumaquamarine: 0x66cdaa, - mediumblue: 0x0000cd, - mediumorchid: 0xba55d3, - mediumpurple: 0x9370db, - mediumseagreen: 0x3cb371, - mediumslateblue: 0x7b68ee, - mediumspringgreen: 0x00fa9a, - mediumturquoise: 0x48d1cc, - mediumvioletred: 0xc71585, - midnightblue: 0x191970, - mintcream: 0xf5fffa, - mistyrose: 0xffe4e1, - moccasin: 0xffe4b5, - navajowhite: 0xffdead, - navy: 0x000080, - oldlace: 0xfdf5e6, - olive: 0x808000, - olivedrab: 0x6b8e23, - orange: 0xffa500, - orangered: 0xff4500, - orchid: 0xda70d6, - palegoldenrod: 0xeee8aa, - palegreen: 0x98fb98, - paleturquoise: 0xafeeee, - palevioletred: 0xdb7093, - papayawhip: 0xffefd5, - peachpuff: 0xffdab9, - peru: 0xcd853f, - pink: 0xffc0cb, - plum: 0xdda0dd, - powderblue: 0xb0e0e6, - purple: 0x800080, - rebeccapurple: 0x663399, - red: 0xff0000, - rosybrown: 0xbc8f8f, - royalblue: 0x4169e1, - saddlebrown: 0x8b4513, - salmon: 0xfa8072, - sandybrown: 0xf4a460, - seagreen: 0x2e8b57, - seashell: 0xfff5ee, - sienna: 0xa0522d, - silver: 0xc0c0c0, - skyblue: 0x87ceeb, - slateblue: 0x6a5acd, - slategray: 0x708090, - slategrey: 0x708090, - snow: 0xfffafa, - springgreen: 0x00ff7f, - steelblue: 0x4682b4, - tan: 0xd2b48c, - teal: 0x008080, - thistle: 0xd8bfd8, - tomato: 0xff6347, - turquoise: 0x40e0d0, - violet: 0xee82ee, - wheat: 0xf5deb3, - white: 0xffffff, - whitesmoke: 0xf5f5f5, - yellow: 0xffff00, - yellowgreen: 0x9acd32 -}; - -define(Color, color, { - copy: function(channels) { - return Object.assign(new this.constructor, this, channels); - }, - displayable: function() { - return this.rgb().displayable(); - }, - hex: color_formatHex, // Deprecated! Use color.formatHex. - formatHex: color_formatHex, - formatHsl: color_formatHsl, - formatRgb: color_formatRgb, - toString: color_formatRgb -}); - -function color_formatHex() { - return this.rgb().formatHex(); -} - -function color_formatHsl() { - return hslConvert(this).formatHsl(); -} - -function color_formatRgb() { - return this.rgb().formatRgb(); -} - -function color(format) { - var m, l; - format = (format + "").trim().toLowerCase(); - return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 - : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 - : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 - : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 - : null) // invalid hex - : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) - : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) - : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) - : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) - : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) - : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) - : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins - : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) - : null; -} - -function rgbn(n) { - return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); -} - -function rgba(r, g, b, a) { - if (a <= 0) r = g = b = NaN; - return new Rgb(r, g, b, a); -} - -function rgbConvert(o) { - if (!(o instanceof Color)) o = color(o); - if (!o) return new Rgb; - o = o.rgb(); - return new Rgb(o.r, o.g, o.b, o.opacity); -} - -function rgb(r, g, b, opacity) { - return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); -} - -function Rgb(r, g, b, opacity) { - this.r = +r; - this.g = +g; - this.b = +b; - this.opacity = +opacity; -} - -define(Rgb, rgb, extend(Color, { - brighter: function(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); - }, - darker: function(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); - }, - rgb: function() { - return this; - }, - displayable: function() { - return (-0.5 <= this.r && this.r < 255.5) - && (-0.5 <= this.g && this.g < 255.5) - && (-0.5 <= this.b && this.b < 255.5) - && (0 <= this.opacity && this.opacity <= 1); - }, - hex: rgb_formatHex, // Deprecated! Use color.formatHex. - formatHex: rgb_formatHex, - formatRgb: rgb_formatRgb, - toString: rgb_formatRgb -})); - -function rgb_formatHex() { - return "#" + hex(this.r) + hex(this.g) + hex(this.b); -} - -function rgb_formatRgb() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "rgb(" : "rgba(") - + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.b) || 0)) - + (a === 1 ? ")" : ", " + a + ")"); -} - -function hex(value) { - value = Math.max(0, Math.min(255, Math.round(value) || 0)); - return (value < 16 ? "0" : "") + value.toString(16); -} - -function hsla(h, s, l, a) { - if (a <= 0) h = s = l = NaN; - else if (l <= 0 || l >= 1) h = s = NaN; - else if (s <= 0) h = NaN; - return new Hsl(h, s, l, a); -} - -function hslConvert(o) { - if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); - if (!(o instanceof Color)) o = color(o); - if (!o) return new Hsl; - if (o instanceof Hsl) return o; - o = o.rgb(); - var r = o.r / 255, - g = o.g / 255, - b = o.b / 255, - min = Math.min(r, g, b), - max = Math.max(r, g, b), - h = NaN, - s = max - min, - l = (max + min) / 2; - if (s) { - if (r === max) h = (g - b) / s + (g < b) * 6; - else if (g === max) h = (b - r) / s + 2; - else h = (r - g) / s + 4; - s /= l < 0.5 ? max + min : 2 - max - min; - h *= 60; - } else { - s = l > 0 && l < 1 ? 0 : h; - } - return new Hsl(h, s, l, o.opacity); -} - -function hsl(h, s, l, opacity) { - return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); -} - -function Hsl(h, s, l, opacity) { - this.h = +h; - this.s = +s; - this.l = +l; - this.opacity = +opacity; -} - -define(Hsl, hsl, extend(Color, { - brighter: function(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Hsl(this.h, this.s, this.l * k, this.opacity); - }, - darker: function(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Hsl(this.h, this.s, this.l * k, this.opacity); - }, - rgb: function() { - var h = this.h % 360 + (this.h < 0) * 360, - s = isNaN(h) || isNaN(this.s) ? 0 : this.s, - l = this.l, - m2 = l + (l < 0.5 ? l : 1 - l) * s, - m1 = 2 * l - m2; - return new Rgb( - hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), - hsl2rgb(h, m1, m2), - hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), - this.opacity - ); - }, - displayable: function() { - return (0 <= this.s && this.s <= 1 || isNaN(this.s)) - && (0 <= this.l && this.l <= 1) - && (0 <= this.opacity && this.opacity <= 1); - }, - formatHsl: function() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "hsl(" : "hsla(") - + (this.h || 0) + ", " - + (this.s || 0) * 100 + "%, " - + (this.l || 0) * 100 + "%" - + (a === 1 ? ")" : ", " + a + ")"); - } -})); - -/* From FvD 13.37, CSS Color Module Level 3 */ -function hsl2rgb(h, m1, m2) { - return (h < 60 ? m1 + (m2 - m1) * h / 60 - : h < 180 ? m2 - : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 - : m1) * 255; -} - -var deg2rad = Math.PI / 180; -var rad2deg = 180 / Math.PI; + histogram.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; -// https://observablehq.com/@mbostock/lab-and-rgb -var K = 18, - Xn = 0.96422, - Yn = 1, - Zn = 0.82521, - t0 = 4 / 29, - t1 = 6 / 29, - t2 = 3 * t1 * t1, - t3 = t1 * t1 * t1; - -function labConvert(o) { - if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); - if (o instanceof Hcl) return hcl2lab(o); - if (!(o instanceof Rgb)) o = rgbConvert(o); - var r = rgb2lrgb(o.r), - g = rgb2lrgb(o.g), - b = rgb2lrgb(o.b), - y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; - if (r === g && g === b) x = z = y; else { - x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); - z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); - } - return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); -} - -function gray(l, opacity) { - return new Lab(l, 0, 0, opacity == null ? 1 : opacity); -} - -function lab(l, a, b, opacity) { - return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); -} - -function Lab(l, a, b, opacity) { - this.l = +l; - this.a = +a; - this.b = +b; - this.opacity = +opacity; -} - -define(Lab, lab, extend(Color, { - brighter: function(k) { - return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); - }, - darker: function(k) { - return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); - }, - rgb: function() { - var y = (this.l + 16) / 116, - x = isNaN(this.a) ? y : y + this.a / 500, - z = isNaN(this.b) ? y : y - this.b / 200; - x = Xn * lab2xyz(x); - y = Yn * lab2xyz(y); - z = Zn * lab2xyz(z); - return new Rgb( - lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), - lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), - lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), - this.opacity - ); - } -})); - -function xyz2lab(t) { - return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; -} - -function lab2xyz(t) { - return t > t1 ? t * t * t : t2 * (t - t0); -} - -function lrgb2rgb(x) { - return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); -} - -function rgb2lrgb(x) { - return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); -} - -function hclConvert(o) { - if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); - if (!(o instanceof Lab)) o = labConvert(o); - if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); - var h = Math.atan2(o.b, o.a) * rad2deg; - return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); -} - -function lch(l, c, h, opacity) { - return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); -} - -function hcl(h, c, l, opacity) { - return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); -} - -function Hcl(h, c, l, opacity) { - this.h = +h; - this.c = +c; - this.l = +l; - this.opacity = +opacity; -} - -function hcl2lab(o) { - if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); - var h = o.h * deg2rad; - return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); -} - -define(Hcl, hcl, extend(Color, { - brighter: function(k) { - return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); - }, - darker: function(k) { - return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); - }, - rgb: function() { - return hcl2lab(this).rgb(); - } -})); - -var A = -0.14861, - B = +1.78277, - C = -0.29227, - D = -0.90649, - E = +1.97294, - ED = E * D, - EB = E * B, - BC_DA = B * C - D * A; - -function cubehelixConvert(o) { - if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); - if (!(o instanceof Rgb)) o = rgbConvert(o); - var r = o.r / 255, - g = o.g / 255, - b = o.b / 255, - l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), - bl = b - l, - k = (E * (g - l) - C * bl) / D, - s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 - h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; - return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); -} - -function cubehelix(h, s, l, opacity) { - return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); -} - -function Cubehelix(h, s, l, opacity) { - this.h = +h; - this.s = +s; - this.l = +l; - this.opacity = +opacity; -} - -define(Cubehelix, cubehelix, extend(Color, { - brighter: function(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Cubehelix(this.h, this.s, this.l * k, this.opacity); - }, - darker: function(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Cubehelix(this.h, this.s, this.l * k, this.opacity); - }, - rgb: function() { - var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, - l = +this.l, - a = isNaN(this.s) ? 0 : this.s * l * (1 - l), - cosh = Math.cos(h), - sinh = Math.sin(h); - return new Rgb( - 255 * (l + a * (A * cosh + B * sinh)), - 255 * (l + a * (C * cosh + D * sinh)), - 255 * (l + a * (E * cosh)), - this.opacity - ); - } -})); - -exports.color = color; -exports.cubehelix = cubehelix; -exports.gray = gray; -exports.hcl = hcl; -exports.hsl = hsl; -exports.lab = lab; -exports.lch = lch; -exports.rgb = rgb; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],14:[function(require,module,exports){ -// https://d3js.org/d3-contour/ v1.3.2 Copyright 2018 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : -(factory((global.d3 = global.d3 || {}),global.d3)); -}(this, (function (exports,d3Array) { 'use strict'; - -var array = Array.prototype; - -var slice = array.slice; - -function ascending(a, b) { - return a - b; -} - -function area(ring) { - var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; - while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; - return area; -} - -function constant(x) { - return function() { - return x; - }; -} - -function contains(ring, hole) { - var i = -1, n = hole.length, c; - while (++i < n) if (c = ringContains(ring, hole[i])) return c; - return 0; -} - -function ringContains(ring, point) { - var x = point[0], y = point[1], contains = -1; - for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { - var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; - if (segmentContains(pi, pj, point)) return 0; - if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; - } - return contains; -} - -function segmentContains(a, b, c) { - var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); -} - -function collinear(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); -} - -function within(p, q, r) { - return p <= q && q <= r || r <= q && q <= p; -} - -function noop() {} - -var cases = [ - [], - [[[1.0, 1.5], [0.5, 1.0]]], - [[[1.5, 1.0], [1.0, 1.5]]], - [[[1.5, 1.0], [0.5, 1.0]]], - [[[1.0, 0.5], [1.5, 1.0]]], - [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], - [[[1.0, 0.5], [1.0, 1.5]]], - [[[1.0, 0.5], [0.5, 1.0]]], - [[[0.5, 1.0], [1.0, 0.5]]], - [[[1.0, 1.5], [1.0, 0.5]]], - [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], - [[[1.5, 1.0], [1.0, 0.5]]], - [[[0.5, 1.0], [1.5, 1.0]]], - [[[1.0, 1.5], [1.5, 1.0]]], - [[[0.5, 1.0], [1.0, 1.5]]], - [] -]; - -function contours() { - var dx = 1, - dy = 1, - threshold = d3Array.thresholdSturges, - smooth = smoothLinear; - - function contours(values) { - var tz = threshold(values); - - // Convert number of thresholds into uniform thresholds. - if (!Array.isArray(tz)) { - var domain = d3Array.extent(values), start = domain[0], stop = domain[1]; - tz = d3Array.tickStep(start, stop, tz); - tz = d3Array.range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); - } else { - tz = tz.slice().sort(ascending); - } + return histogram; + } - return tz.map(function(value) { - return contour(values, value); - }); - } - - // Accumulate, smooth contour rings, assign holes to exterior rings. - // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js - function contour(values, value) { - var polygons = [], - holes = []; - - isorings(values, value, function(ring) { - smooth(ring, values, value); - if (area(ring) > 0) polygons.push([ring]); - else holes.push(ring); - }); - - holes.forEach(function(hole) { - for (var i = 0, n = polygons.length, polygon; i < n; ++i) { - if (contains((polygon = polygons[i])[0], hole) !== -1) { - polygon.push(hole); - return; - } - } - }); - - return { - type: "MultiPolygon", - value: value, - coordinates: polygons - }; - } - - // Marching squares with isolines stitched into rings. - // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js - function isorings(values, value, callback) { - var fragmentByStart = new Array, - fragmentByEnd = new Array, - x, y, t0, t1, t2, t3; - - // Special case for the first row (y = -1, t2 = t3 = 0). - x = y = -1; - t1 = values[0] >= value; - cases[t1 << 1].forEach(stitch); - while (++x < dx - 1) { - t0 = t1, t1 = values[x + 1] >= value; - cases[t0 | t1 << 1].forEach(stitch); - } - cases[t1 << 0].forEach(stitch); - - // General case for the intermediate rows. - while (++y < dy - 1) { - x = -1; - t1 = values[y * dx + dx] >= value; - t2 = values[y * dx] >= value; - cases[t1 << 1 | t2 << 2].forEach(stitch); - while (++x < dx - 1) { - t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; - t3 = t2, t2 = values[y * dx + x + 1] >= value; - cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); - } - cases[t1 | t2 << 3].forEach(stitch); - } + function quantile(values, p, valueof) { + if (valueof == null) valueof = number; + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); + } - // Special case for the last row (y = dy - 1, t0 = t1 = 0). - x = -1; - t2 = values[y * dx] >= value; - cases[t2 << 2].forEach(stitch); - while (++x < dx - 1) { - t3 = t2, t2 = values[y * dx + x + 1] >= value; - cases[t2 << 2 | t3 << 3].forEach(stitch); - } - cases[t2 << 3].forEach(stitch); - - function stitch(line) { - var start = [line[0][0] + x, line[0][1] + y], - end = [line[1][0] + x, line[1][1] + y], - startIndex = index(start), - endIndex = index(end), - f, g; - if (f = fragmentByEnd[startIndex]) { - if (g = fragmentByStart[endIndex]) { - delete fragmentByEnd[f.end]; - delete fragmentByStart[g.start]; - if (f === g) { - f.ring.push(end); - callback(f.ring); - } else { - fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; - } - } else { - delete fragmentByEnd[f.end]; - f.ring.push(end); - fragmentByEnd[f.end = endIndex] = f; - } - } else if (f = fragmentByStart[endIndex]) { - if (g = fragmentByEnd[startIndex]) { - delete fragmentByStart[f.start]; - delete fragmentByEnd[g.end]; - if (f === g) { - f.ring.push(end); - callback(f.ring); - } else { - fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; - } - } else { - delete fragmentByStart[f.start]; - f.ring.unshift(start); - fragmentByStart[f.start = startIndex] = f; - } - } else { - fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; - } - } - } - - function index(point) { - return point[0] * 2 + point[1] * (dx + 1) * 4; - } - - function smoothLinear(ring, values, value) { - ring.forEach(function(point) { - var x = point[0], - y = point[1], - xt = x | 0, - yt = y | 0, - v0, - v1 = values[yt * dx + xt]; - if (x > 0 && x < dx && xt === x) { - v0 = values[yt * dx + xt - 1]; - point[0] = x + (value - v0) / (v1 - v0) - 0.5; - } - if (y > 0 && y < dy && yt === y) { - v0 = values[(yt - 1) * dx + xt]; - point[1] = y + (value - v0) / (v1 - v0) - 0.5; - } - }); - } - - contours.contour = contour; - - contours.size = function(_) { - if (!arguments.length) return [dx, dy]; - var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); - if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size"); - return dx = _0, dy = _1, contours; - }; - - contours.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold; - }; - - contours.smooth = function(_) { - return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear; - }; - - return contours; -} + function freedmanDiaconis(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3))); + } -// TODO Optimize edge cases. -// TODO Optimize index calculation. -// TODO Optimize arguments. -function blurX(source, target, r) { - var n = source.width, - m = source.height, - w = (r << 1) + 1; - for (var j = 0; j < m; ++j) { - for (var i = 0, sr = 0; i < n + r; ++i) { - if (i < n) { - sr += source.data[i + j * n]; - } - if (i >= r) { - if (i >= w) { - sr -= source.data[i - w + j * n]; - } - target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); - } - } - } -} + function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); + } -// TODO Optimize edge cases. -// TODO Optimize index calculation. -// TODO Optimize arguments. -function blurY(source, target, r) { - var n = source.width, - m = source.height, - w = (r << 1) + 1; - for (var i = 0; i < n; ++i) { - for (var j = 0, sr = 0; j < m + r; ++j) { - if (j < m) { - sr += source.data[i + j * n]; - } - if (j >= r) { - if (j >= w) { - sr -= source.data[i + (j - w) * n]; - } - target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); - } - } - } -} - -function defaultX(d) { - return d[0]; -} - -function defaultY(d) { - return d[1]; -} - -function defaultWeight() { - return 1; -} - -function density() { - var x = defaultX, - y = defaultY, - weight = defaultWeight, - dx = 960, - dy = 500, - r = 20, // blur radius - k = 2, // log2(grid cell size) - o = r * 3, // grid offset, to pad for blur - n = (dx + o * 2) >> k, // grid width - m = (dy + o * 2) >> k, // grid height - threshold = constant(20); - - function density(data) { - var values0 = new Float32Array(n * m), - values1 = new Float32Array(n * m); - - data.forEach(function(d, i, data) { - var xi = (+x(d, i, data) + o) >> k, - yi = (+y(d, i, data) + o) >> k, - wi = +weight(d, i, data); - if (xi >= 0 && xi < n && yi >= 0 && yi < m) { - values0[xi + yi * n] += wi; - } - }); - - // TODO Optimize. - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); - - var tz = threshold(values0); - - // Convert number of thresholds into uniform thresholds. - if (!Array.isArray(tz)) { - var stop = d3Array.max(values0); - tz = d3Array.tickStep(0, stop, tz); - tz = d3Array.range(0, Math.floor(stop / tz) * tz, tz); - tz.shift(); - } + function max(values, valueof) { + var n = values.length, + i = -1, + value, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && value > max) { + max = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && value > max) { + max = value; + } + } + } + } + } - return contours() - .thresholds(tz) - .size([n, m]) - (values0) - .map(transform); - } - - function transform(geometry) { - geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. - geometry.coordinates.forEach(transformPolygon); - return geometry; - } - - function transformPolygon(coordinates) { - coordinates.forEach(transformRing); - } - - function transformRing(coordinates) { - coordinates.forEach(transformPoint); - } - - // TODO Optimize. - function transformPoint(coordinates) { - coordinates[0] = coordinates[0] * Math.pow(2, k) - o; - coordinates[1] = coordinates[1] * Math.pow(2, k) - o; - } - - function resize() { - o = r * 3; - n = (dx + o * 2) >> k; - m = (dy + o * 2) >> k; - return density; - } - - density.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), density) : x; - }; - - density.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), density) : y; - }; - - density.weight = function(_) { - return arguments.length ? (weight = typeof _ === "function" ? _ : constant(+_), density) : weight; - }; - - density.size = function(_) { - if (!arguments.length) return [dx, dy]; - var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); - if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size"); - return dx = _0, dy = _1, resize(); - }; - - density.cellSize = function(_) { - if (!arguments.length) return 1 << k; - if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); - return k = Math.floor(Math.log(_) / Math.LN2), resize(); - }; - - density.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold; - }; - - density.bandwidth = function(_) { - if (!arguments.length) return Math.sqrt(r * (r + 1)); - if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); - return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); - }; - - return density; -} - -exports.contours = contours; -exports.contourDensity = density; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -},{"d3-array":8}],15:[function(require,module,exports){ -// https://d3js.org/d3-dispatch/ v1.0.6 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -var noop = {value: function() {}}; - -function dispatch() { - for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { - if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); - _[t] = []; - } - return new Dispatch(_); -} - -function Dispatch(_) { - this._ = _; -} - -function parseTypenames(typenames, types) { - return typenames.trim().split(/^|\s+/).map(function(t) { - var name = "", i = t.indexOf("."); - if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); - if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); - return {type: t, name: name}; - }); -} - -Dispatch.prototype = dispatch.prototype = { - constructor: Dispatch, - on: function(typename, callback) { - var _ = this._, - T = parseTypenames(typename + "", _), - t, - i = -1, - n = T.length; - - // If no callback was specified, return the callback of the given type and name. - if (arguments.length < 2) { - while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; - return; - } + return max; + } - // If a type was specified, set the callback for the given type and name. - // Otherwise, if a null callback was specified, remove callbacks of the given name. - if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); - while (++i < n) { - if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); - else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); - } + function mean(values, valueof) { + var n = values.length, + m = n, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) sum += value; + else --m; + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; + else --m; + } + } - return this; - }, - copy: function() { - var copy = {}, _ = this._; - for (var t in _) copy[t] = _[t].slice(); - return new Dispatch(copy); - }, - call: function(type, that) { - if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; - if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); - for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); - }, - apply: function(type, that, args) { - if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); - for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); - } -}; - -function get(type, name) { - for (var i = 0, n = type.length, c; i < n; ++i) { - if ((c = type[i]).name === name) { - return c.value; - } - } -} - -function set(type, name, callback) { - for (var i = 0, n = type.length; i < n; ++i) { - if (type[i].name === name) { - type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); - break; - } - } - if (callback != null) type.push({name: name, value: callback}); - return type; -} + if (m) return sum / m; + } -exports.dispatch = dispatch; + function median(values, valueof) { + var n = values.length, + i = -1, + value, + numbers = []; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + numbers.push(value); + } + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + numbers.push(value); + } + } + } -Object.defineProperty(exports, '__esModule', { value: true }); + return quantile(numbers.sort(ascending), 0.5); + } -})); + function merge(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } -},{}],16:[function(require,module,exports){ -// https://d3js.org/d3-drag/ v1.2.5 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-selection')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-selection'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); -}(this, function (exports, d3Dispatch, d3Selection) { 'use strict'; - -function nopropagation() { - d3Selection.event.stopImmediatePropagation(); -} - -function noevent() { - d3Selection.event.preventDefault(); - d3Selection.event.stopImmediatePropagation(); -} - -function nodrag(view) { - var root = view.document.documentElement, - selection = d3Selection.select(view).on("dragstart.drag", noevent, true); - if ("onselectstart" in root) { - selection.on("selectstart.drag", noevent, true); - } else { - root.__noselect = root.style.MozUserSelect; - root.style.MozUserSelect = "none"; - } -} - -function yesdrag(view, noclick) { - var root = view.document.documentElement, - selection = d3Selection.select(view).on("dragstart.drag", null); - if (noclick) { - selection.on("click.drag", noevent, true); - setTimeout(function() { selection.on("click.drag", null); }, 0); - } - if ("onselectstart" in root) { - selection.on("selectstart.drag", null); - } else { - root.style.MozUserSelect = root.__noselect; - delete root.__noselect; - } -} - -function constant(x) { - return function() { - return x; - }; -} - -function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { - this.target = target; - this.type = type; - this.subject = subject; - this.identifier = id; - this.active = active; - this.x = x; - this.y = y; - this.dx = dx; - this.dy = dy; - this._ = dispatch; -} - -DragEvent.prototype.on = function() { - var value = this._.on.apply(this._, arguments); - return value === this._ ? this : value; -}; + return merged; + } -// Ignore right-click, since that should open the context menu. -function defaultFilter() { - return !d3Selection.event.ctrlKey && !d3Selection.event.button; -} - -function defaultContainer() { - return this.parentNode; -} - -function defaultSubject(d) { - return d == null ? {x: d3Selection.event.x, y: d3Selection.event.y} : d; -} - -function defaultTouchable() { - return navigator.maxTouchPoints || ("ontouchstart" in this); -} - -function drag() { - var filter = defaultFilter, - container = defaultContainer, - subject = defaultSubject, - touchable = defaultTouchable, - gestures = {}, - listeners = d3Dispatch.dispatch("start", "drag", "end"), - active = 0, - mousedownx, - mousedowny, - mousemoving, - touchending, - clickDistance2 = 0; - - function drag(selection) { - selection - .on("mousedown.drag", mousedowned) - .filter(touchable) - .on("touchstart.drag", touchstarted) - .on("touchmove.drag", touchmoved) - .on("touchend.drag touchcancel.drag", touchended) - .style("touch-action", "none") - .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); - } - - function mousedowned() { - if (touchending || !filter.apply(this, arguments)) return; - var gesture = beforestart("mouse", container.apply(this, arguments), d3Selection.mouse, this, arguments); - if (!gesture) return; - d3Selection.select(d3Selection.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); - nodrag(d3Selection.event.view); - nopropagation(); - mousemoving = false; - mousedownx = d3Selection.event.clientX; - mousedowny = d3Selection.event.clientY; - gesture("start"); - } - - function mousemoved() { - noevent(); - if (!mousemoving) { - var dx = d3Selection.event.clientX - mousedownx, dy = d3Selection.event.clientY - mousedowny; - mousemoving = dx * dx + dy * dy > clickDistance2; - } - gestures.mouse("drag"); - } - - function mouseupped() { - d3Selection.select(d3Selection.event.view).on("mousemove.drag mouseup.drag", null); - yesdrag(d3Selection.event.view, mousemoving); - noevent(); - gestures.mouse("end"); - } - - function touchstarted() { - if (!filter.apply(this, arguments)) return; - var touches = d3Selection.event.changedTouches, - c = container.apply(this, arguments), - n = touches.length, i, gesture; - - for (i = 0; i < n; ++i) { - if (gesture = beforestart(touches[i].identifier, c, d3Selection.touch, this, arguments)) { - nopropagation(); - gesture("start"); - } - } - } + function min(values, valueof) { + var n = values.length, + i = -1, + value, + min; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && min > value) { + min = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && min > value) { + min = value; + } + } + } + } + } - function touchmoved() { - var touches = d3Selection.event.changedTouches, - n = touches.length, i, gesture; + return min; + } - for (i = 0; i < n; ++i) { - if (gesture = gestures[touches[i].identifier]) { - noevent(); - gesture("drag"); - } - } - } - - function touchended() { - var touches = d3Selection.event.changedTouches, - n = touches.length, i, gesture; - - if (touchending) clearTimeout(touchending); - touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! - for (i = 0; i < n; ++i) { - if (gesture = gestures[touches[i].identifier]) { - nopropagation(); - gesture("end"); - } - } - } - - function beforestart(id, container, point, that, args) { - var p = point(container, id), s, dx, dy, - sublisteners = listeners.copy(); - - if (!d3Selection.customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() { - if ((d3Selection.event.subject = s = subject.apply(that, args)) == null) return false; - dx = s.x - p[0] || 0; - dy = s.y - p[1] || 0; - return true; - })) return; - - return function gesture(type) { - var p0 = p, n; - switch (type) { - case "start": gestures[id] = gesture, n = active++; break; - case "end": delete gestures[id], --active; // nobreak - case "drag": p = point(container, id), n = active; break; - } - d3Selection.customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); - }; - } - - drag.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), drag) : filter; - }; - - drag.container = function(_) { - return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; - }; - - drag.subject = function(_) { - return arguments.length ? (subject = typeof _ === "function" ? _ : constant(_), drag) : subject; - }; - - drag.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), drag) : touchable; - }; - - drag.on = function() { - var value = listeners.on.apply(listeners, arguments); - return value === listeners ? drag : value; - }; - - drag.clickDistance = function(_) { - return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); - }; - - return drag; -} - -exports.drag = drag; -exports.dragDisable = nodrag; -exports.dragEnable = yesdrag; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{"d3-dispatch":15,"d3-selection":31}],17:[function(require,module,exports){ -// https://d3js.org/d3-dsv/ v1.2.0 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -var EOL = {}, - EOF = {}, - QUOTE = 34, - NEWLINE = 10, - RETURN = 13; - -function objectConverter(columns) { - return new Function("d", "return {" + columns.map(function(name, i) { - return JSON.stringify(name) + ": d[" + i + "] || \"\""; - }).join(",") + "}"); -} - -function customConverter(columns, f) { - var object = objectConverter(columns); - return function(row, i) { - return f(object(row), i, columns); - }; -} + function permute(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + } -// Compute unique columns in order of discovery. -function inferColumns(rows) { - var columnSet = Object.create(null), - columns = []; - - rows.forEach(function(row) { - for (var column in row) { - if (!(column in columnSet)) { - columns.push(columnSet[column] = column); - } - } - }); - - return columns; -} - -function pad(value, width) { - var s = value + "", length = s.length; - return length < width ? new Array(width - length + 1).join(0) + s : s; -} - -function formatYear(year) { - return year < 0 ? "-" + pad(-year, 6) - : year > 9999 ? "+" + pad(year, 6) - : pad(year, 4); -} - -function formatDate(date) { - var hours = date.getUTCHours(), - minutes = date.getUTCMinutes(), - seconds = date.getUTCSeconds(), - milliseconds = date.getUTCMilliseconds(); - return isNaN(date) ? "Invalid Date" - : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) - + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" - : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" - : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" - : ""); -} - -function dsv(delimiter) { - var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), - DELIMITER = delimiter.charCodeAt(0); - - function parse(text, f) { - var convert, columns, rows = parseRows(text, function(row, i) { - if (convert) return convert(row, i - 1); - columns = row, convert = f ? customConverter(row, f) : objectConverter(row); - }); - rows.columns = columns || []; - return rows; - } - - function parseRows(text, f) { - var rows = [], // output rows - N = text.length, - I = 0, // current character index - n = 0, // current line number - t, // current token - eof = N <= 0, // current token followed by EOF? - eol = false; // current token followed by EOL? - - // Strip the trailing newline. - if (text.charCodeAt(N - 1) === NEWLINE) --N; - if (text.charCodeAt(N - 1) === RETURN) --N; - - function token() { - if (eof) return EOF; - if (eol) return eol = false, EOL; - - // Unescape quotes. - var i, j = I, c; - if (text.charCodeAt(j) === QUOTE) { - while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); - if ((i = I) >= N) eof = true; - else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; - else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } - return text.slice(j + 1, i - 1).replace(/""/g, "\""); - } - - // Find next delimiter or newline. - while (I < N) { - if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; - else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } - else if (c !== DELIMITER) continue; - return text.slice(j, i); - } - - // Return last token before EOF. - return eof = true, text.slice(j, N); - } + function scan(values, compare) { + if (!(n = values.length)) return; + var n, + i = 0, + j = 0, + xi, + xj = values[j]; - while ((t = token()) !== EOF) { - var row = []; - while (t !== EOL && t !== EOF) row.push(t), t = token(); - if (f && (row = f(row, n++)) == null) continue; - rows.push(row); - } + if (compare == null) compare = ascending; - return rows; - } - - function preformatBody(rows, columns) { - return rows.map(function(row) { - return columns.map(function(column) { - return formatValue(row[column]); - }).join(delimiter); - }); - } - - function format(rows, columns) { - if (columns == null) columns = inferColumns(rows); - return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); - } - - function formatBody(rows, columns) { - if (columns == null) columns = inferColumns(rows); - return preformatBody(rows, columns).join("\n"); - } - - function formatRows(rows) { - return rows.map(formatRow).join("\n"); - } - - function formatRow(row) { - return row.map(formatValue).join(delimiter); - } - - function formatValue(value) { - return value == null ? "" - : value instanceof Date ? formatDate(value) - : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" - : value; - } - - return { - parse: parse, - parseRows: parseRows, - format: format, - formatBody: formatBody, - formatRows: formatRows, - formatRow: formatRow, - formatValue: formatValue - }; -} - -var csv = dsv(","); - -var csvParse = csv.parse; -var csvParseRows = csv.parseRows; -var csvFormat = csv.format; -var csvFormatBody = csv.formatBody; -var csvFormatRows = csv.formatRows; -var csvFormatRow = csv.formatRow; -var csvFormatValue = csv.formatValue; - -var tsv = dsv("\t"); - -var tsvParse = tsv.parse; -var tsvParseRows = tsv.parseRows; -var tsvFormat = tsv.format; -var tsvFormatBody = tsv.formatBody; -var tsvFormatRows = tsv.formatRows; -var tsvFormatRow = tsv.formatRow; -var tsvFormatValue = tsv.formatValue; - -function autoType(object) { - for (var key in object) { - var value = object[key].trim(), number, m; - if (!value) value = null; - else if (value === "true") value = true; - else if (value === "false") value = false; - else if (value === "NaN") value = NaN; - else if (!isNaN(number = +value)) value = number; - else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { - if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); - value = new Date(value); - } - else continue; - object[key] = value; - } - return object; -} + while (++i < n) { + if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { + xj = xi, j = i; + } + } -// https://github.com/d3/d3-dsv/issues/45 -var fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); - -exports.autoType = autoType; -exports.csvFormat = csvFormat; -exports.csvFormatBody = csvFormatBody; -exports.csvFormatRow = csvFormatRow; -exports.csvFormatRows = csvFormatRows; -exports.csvFormatValue = csvFormatValue; -exports.csvParse = csvParse; -exports.csvParseRows = csvParseRows; -exports.dsvFormat = dsv; -exports.tsvFormat = tsvFormat; -exports.tsvFormatBody = tsvFormatBody; -exports.tsvFormatRow = tsvFormatRow; -exports.tsvFormatRows = tsvFormatRows; -exports.tsvFormatValue = tsvFormatValue; -exports.tsvParse = tsvParse; -exports.tsvParseRows = tsvParseRows; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],18:[function(require,module,exports){ -// https://d3js.org/d3-ease/ v1.0.6 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; + if (compare(xj, xj) === 0) return j; + } -function linear(t) { - return +t; -} + function shuffle(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; -function quadIn(t) { - return t * t; -} + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } -function quadOut(t) { - return t * (2 - t); -} + return array; + } -function quadInOut(t) { - return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; -} + function sum(values, valueof) { + var n = values.length, + i = -1, + value, + sum = 0; -function cubicIn(t) { - return t * t * t; -} + if (valueof == null) { + while (++i < n) { + if (value = +values[i]) sum += value; // Note: zero and null are equivalent. + } + } else { + while (++i < n) { + if (value = +valueof(values[i], i, values)) sum += value; + } + } -function cubicOut(t) { - return --t * t * t + 1; -} + return sum; + } -function cubicInOut(t) { - return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; -} + function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; + } -var exponent = 3; + function length(d) { + return d.length; + } -var polyIn = (function custom(e) { - e = +e; + function zip() { + return transpose(arguments); + } - function polyIn(t) { - return Math.pow(t, e); - } + exports.bisect = bisectRight; + exports.bisectRight = bisectRight; + exports.bisectLeft = bisectLeft; + exports.ascending = ascending; + exports.bisector = bisector; + exports.cross = cross; + exports.descending = descending; + exports.deviation = deviation; + exports.extent = extent; + exports.histogram = histogram; + exports.thresholdFreedmanDiaconis = freedmanDiaconis; + exports.thresholdScott = scott; + exports.thresholdSturges = sturges; + exports.max = max; + exports.mean = mean; + exports.median = median; + exports.merge = merge; + exports.min = min; + exports.pairs = pairs; + exports.permute = permute; + exports.quantile = quantile; + exports.range = range; + exports.scan = scan; + exports.shuffle = shuffle; + exports.sum = sum; + exports.ticks = ticks; + exports.tickIncrement = tickIncrement; + exports.tickStep = tickStep; + exports.transpose = transpose; + exports.variance = variance; + exports.zip = zip; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 9: [function (require, module, exports) { +// https://d3js.org/d3-axis/ v1.0.12 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; - polyIn.exponent = custom; + var slice = Array.prototype.slice; - return polyIn; -})(exponent); + function identity(x) { + return x; + } -var polyOut = (function custom(e) { - e = +e; + var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; - function polyOut(t) { - return 1 - Math.pow(1 - t, e); - } + function translateX(x) { + return "translate(" + (x + 0.5) + ",0)"; + } - polyOut.exponent = custom; + function translateY(y) { + return "translate(0," + (y + 0.5) + ")"; + } - return polyOut; -})(exponent); + function number(scale) { + return function (d) { + return +scale(d); + }; + } -var polyInOut = (function custom(e) { - e = +e; + function center(scale) { + var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. + if (scale.round()) offset = Math.round(offset); + return function (d) { + return +scale(d) + offset; + }; + } - function polyInOut(t) { - return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; - } + function entering() { + return !this.__axis; + } - polyInOut.exponent = custom; + function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + 0.5, + range1 = +range[range.length - 1] + 0.5, + position = (scale.bandwidth ? center : number)(scale.copy()), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function (d) { + return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); + }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function (d) { + var p = this.parentNode.__axis; + return transform(p && isFinite(p = p(d)) ? p : position(d)); + }); + } - return polyInOut; -})(exponent); + tickExit.remove(); -var pi = Math.PI, - halfPi = pi / 2; + path + .attr("d", orient === left || orient == right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1)); -function sinIn(t) { - return 1 - Math.cos(t * halfPi); -} + tick + .attr("opacity", 1) + .attr("transform", function (d) { + return transform(position(d)); + }); -function sinOut(t) { - return Math.sin(t * halfPi); -} + line + .attr(x + "2", k * tickSizeInner); -function sinInOut(t) { - return (1 - Math.cos(pi * t)) / 2; -} + text + .attr(x, k * spacing) + .text(format); -function expIn(t) { - return Math.pow(2, 10 * t - 10); -} + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); -function expOut(t) { - return 1 - Math.pow(2, -10 * t); -} + selection + .each(function () { + this.__axis = position; + }); + } -function expInOut(t) { - return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; -} + axis.scale = function (_) { + return arguments.length ? (scale = _, axis) : scale; + }; -function circleIn(t) { - return 1 - Math.sqrt(1 - t * t); -} + axis.ticks = function () { + return tickArguments = slice.call(arguments), axis; + }; -function circleOut(t) { - return Math.sqrt(1 - --t * t); -} + axis.tickArguments = function (_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice(); + }; -function circleInOut(t) { - return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; -} + axis.tickValues = function (_) { + return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice(); + }; -var b1 = 4 / 11, - b2 = 6 / 11, - b3 = 8 / 11, - b4 = 3 / 4, - b5 = 9 / 11, - b6 = 10 / 11, - b7 = 15 / 16, - b8 = 21 / 22, - b9 = 63 / 64, - b0 = 1 / b1 / b1; + axis.tickFormat = function (_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; -function bounceIn(t) { - return 1 - bounceOut(1 - t); -} + axis.tickSize = function (_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; -function bounceOut(t) { - return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; -} + axis.tickSizeInner = function (_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; -function bounceInOut(t) { - return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; -} + axis.tickSizeOuter = function (_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; -var overshoot = 1.70158; + axis.tickPadding = function (_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; -var backIn = (function custom(s) { - s = +s; + return axis; + } - function backIn(t) { - return t * t * ((s + 1) * t - s); - } + function axisTop(scale) { + return axis(top, scale); + } - backIn.overshoot = custom; + function axisRight(scale) { + return axis(right, scale); + } - return backIn; -})(overshoot); - -var backOut = (function custom(s) { - s = +s; - - function backOut(t) { - return --t * t * ((s + 1) * t + s) + 1; - } - - backOut.overshoot = custom; - - return backOut; -})(overshoot); - -var backInOut = (function custom(s) { - s = +s; - - function backInOut(t) { - return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; - } - - backInOut.overshoot = custom; - - return backInOut; -})(overshoot); - -var tau = 2 * Math.PI, - amplitude = 1, - period = 0.3; - -var elasticIn = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); - - function elasticIn(t) { - return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); - } - - elasticIn.amplitude = function(a) { return custom(a, p * tau); }; - elasticIn.period = function(p) { return custom(a, p); }; - - return elasticIn; -})(amplitude, period); - -var elasticOut = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); - - function elasticOut(t) { - return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); - } - - elasticOut.amplitude = function(a) { return custom(a, p * tau); }; - elasticOut.period = function(p) { return custom(a, p); }; - - return elasticOut; -})(amplitude, period); - -var elasticInOut = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); - - function elasticInOut(t) { - return ((t = t * 2 - 1) < 0 - ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) - : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; - } - - elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; - elasticInOut.period = function(p) { return custom(a, p); }; - - return elasticInOut; -})(amplitude, period); - -exports.easeBack = backInOut; -exports.easeBackIn = backIn; -exports.easeBackInOut = backInOut; -exports.easeBackOut = backOut; -exports.easeBounce = bounceOut; -exports.easeBounceIn = bounceIn; -exports.easeBounceInOut = bounceInOut; -exports.easeBounceOut = bounceOut; -exports.easeCircle = circleInOut; -exports.easeCircleIn = circleIn; -exports.easeCircleInOut = circleInOut; -exports.easeCircleOut = circleOut; -exports.easeCubic = cubicInOut; -exports.easeCubicIn = cubicIn; -exports.easeCubicInOut = cubicInOut; -exports.easeCubicOut = cubicOut; -exports.easeElastic = elasticOut; -exports.easeElasticIn = elasticIn; -exports.easeElasticInOut = elasticInOut; -exports.easeElasticOut = elasticOut; -exports.easeExp = expInOut; -exports.easeExpIn = expIn; -exports.easeExpInOut = expInOut; -exports.easeExpOut = expOut; -exports.easeLinear = linear; -exports.easePoly = polyInOut; -exports.easePolyIn = polyIn; -exports.easePolyInOut = polyInOut; -exports.easePolyOut = polyOut; -exports.easeQuad = quadInOut; -exports.easeQuadIn = quadIn; -exports.easeQuadInOut = quadInOut; -exports.easeQuadOut = quadOut; -exports.easeSin = sinInOut; -exports.easeSinIn = sinIn; -exports.easeSinInOut = sinInOut; -exports.easeSinOut = sinOut; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],19:[function(require,module,exports){ -// https://d3js.org/d3-fetch/ v1.1.2 Copyright 2018 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dsv')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-dsv'], factory) : -(factory((global.d3 = global.d3 || {}),global.d3)); -}(this, (function (exports,d3Dsv) { 'use strict'; - -function responseBlob(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.blob(); -} - -function blob(input, init) { - return fetch(input, init).then(responseBlob); -} - -function responseArrayBuffer(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.arrayBuffer(); -} - -function buffer(input, init) { - return fetch(input, init).then(responseArrayBuffer); -} - -function responseText(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.text(); -} - -function text(input, init) { - return fetch(input, init).then(responseText); -} - -function dsvParse(parse) { - return function(input, init, row) { - if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; - return text(input, init).then(function(response) { - return parse(response, row); - }); - }; -} - -function dsv(delimiter, input, init, row) { - if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; - var format = d3Dsv.dsvFormat(delimiter); - return text(input, init).then(function(response) { - return format.parse(response, row); - }); -} - -var csv = dsvParse(d3Dsv.csvParse); -var tsv = dsvParse(d3Dsv.tsvParse); - -function image(input, init) { - return new Promise(function(resolve, reject) { - var image = new Image; - for (var key in init) image[key] = init[key]; - image.onerror = reject; - image.onload = function() { resolve(image); }; - image.src = input; - }); -} - -function responseJson(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.json(); -} - -function json(input, init) { - return fetch(input, init).then(responseJson); -} - -function parser(type) { - return function(input, init) { - return text(input, init).then(function(text$$1) { - return (new DOMParser).parseFromString(text$$1, type); - }); - }; -} - -var xml = parser("application/xml"); - -var html = parser("text/html"); - -var svg = parser("image/svg+xml"); - -exports.blob = blob; -exports.buffer = buffer; -exports.dsv = dsv; -exports.csv = csv; -exports.tsv = tsv; -exports.image = image; -exports.json = json; -exports.text = text; -exports.xml = xml; -exports.html = html; -exports.svg = svg; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -},{"d3-dsv":17}],20:[function(require,module,exports){ -// https://d3js.org/d3-force/ v1.2.1 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-quadtree'), require('d3-collection'), require('d3-dispatch'), require('d3-timer')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-quadtree', 'd3-collection', 'd3-dispatch', 'd3-timer'], factory) : -(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3)); -}(this, (function (exports,d3Quadtree,d3Collection,d3Dispatch,d3Timer) { 'use strict'; - -function center(x, y) { - var nodes; - - if (x == null) x = 0; - if (y == null) y = 0; - - function force() { - var i, - n = nodes.length, - node, - sx = 0, - sy = 0; - - for (i = 0; i < n; ++i) { - node = nodes[i], sx += node.x, sy += node.y; - } + function axisBottom(scale) { + return axis(bottom, scale); + } - for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { - node = nodes[i], node.x -= sx, node.y -= sy; - } - } - - force.initialize = function(_) { - nodes = _; - }; - - force.x = function(_) { - return arguments.length ? (x = +_, force) : x; - }; - - force.y = function(_) { - return arguments.length ? (y = +_, force) : y; - }; - - return force; -} - -function constant(x) { - return function() { - return x; - }; -} - -function jiggle() { - return (Math.random() - 0.5) * 1e-6; -} - -function x(d) { - return d.x + d.vx; -} - -function y(d) { - return d.y + d.vy; -} - -function collide(radius) { - var nodes, - radii, - strength = 1, - iterations = 1; - - if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius); - - function force() { - var i, n = nodes.length, - tree, - node, - xi, - yi, - ri, - ri2; - - for (var k = 0; k < iterations; ++k) { - tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare); - for (i = 0; i < n; ++i) { - node = nodes[i]; - ri = radii[node.index], ri2 = ri * ri; - xi = node.x + node.vx; - yi = node.y + node.vy; - tree.visit(apply); - } - } + function axisLeft(scale) { + return axis(left, scale); + } - function apply(quad, x0, y0, x1, y1) { - var data = quad.data, rj = quad.r, r = ri + rj; - if (data) { - if (data.index > node.index) { - var x = xi - data.x - data.vx, - y = yi - data.y - data.vy, - l = x * x + y * y; - if (l < r * r) { - if (x === 0) x = jiggle(), l += x * x; - if (y === 0) y = jiggle(), l += y * y; - l = (r - (l = Math.sqrt(l))) / l * strength; - node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); - node.vy += (y *= l) * r; - data.vx -= x * (r = 1 - r); - data.vy -= y * r; - } - } - return; - } - return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; - } - } - - function prepare(quad) { - if (quad.data) return quad.r = radii[quad.data.index]; - for (var i = quad.r = 0; i < 4; ++i) { - if (quad[i] && quad[i].r > quad.r) { - quad.r = quad[i].r; - } - } - } - - function initialize() { - if (!nodes) return; - var i, n = nodes.length, node; - radii = new Array(n); - for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); - } - - force.initialize = function(_) { - nodes = _; - initialize(); - }; - - force.iterations = function(_) { - return arguments.length ? (iterations = +_, force) : iterations; - }; - - force.strength = function(_) { - return arguments.length ? (strength = +_, force) : strength; - }; - - force.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; - }; - - return force; -} - -function index(d) { - return d.index; -} - -function find(nodeById, nodeId) { - var node = nodeById.get(nodeId); - if (!node) throw new Error("missing: " + nodeId); - return node; -} - -function link(links) { - var id = index, - strength = defaultStrength, - strengths, - distance = constant(30), - distances, - nodes, - count, - bias, - iterations = 1; - - if (links == null) links = []; - - function defaultStrength(link) { - return 1 / Math.min(count[link.source.index], count[link.target.index]); - } - - function force(alpha) { - for (var k = 0, n = links.length; k < iterations; ++k) { - for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { - link = links[i], source = link.source, target = link.target; - x = target.x + target.vx - source.x - source.vx || jiggle(); - y = target.y + target.vy - source.y - source.vy || jiggle(); - l = Math.sqrt(x * x + y * y); - l = (l - distances[i]) / l * alpha * strengths[i]; - x *= l, y *= l; - target.vx -= x * (b = bias[i]); - target.vy -= y * b; - source.vx += x * (b = 1 - b); - source.vy += y * b; - } - } - } - - function initialize() { - if (!nodes) return; - - var i, - n = nodes.length, - m = links.length, - nodeById = d3Collection.map(nodes, id), - link; - - for (i = 0, count = new Array(n); i < m; ++i) { - link = links[i], link.index = i; - if (typeof link.source !== "object") link.source = find(nodeById, link.source); - if (typeof link.target !== "object") link.target = find(nodeById, link.target); - count[link.source.index] = (count[link.source.index] || 0) + 1; - count[link.target.index] = (count[link.target.index] || 0) + 1; - } + exports.axisTop = axisTop; + exports.axisRight = axisRight; + exports.axisBottom = axisBottom; + exports.axisLeft = axisLeft; - for (i = 0, bias = new Array(m); i < m; ++i) { - link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); - } + Object.defineProperty(exports, '__esModule', {value: true}); - strengths = new Array(m), initializeStrength(); - distances = new Array(m), initializeDistance(); - } + }))); - function initializeStrength() { - if (!nodes) return; + }, {}], + 10: [function (require, module, exports) { +// https://d3js.org/d3-brush/ v1.1.5 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } - for (var i = 0, n = links.length; i < n; ++i) { - strengths[i] = +strength(links[i], i, links); - } - } + function BrushEvent(target, type, selection) { + this.target = target; + this.type = type; + this.selection = selection; + } - function initializeDistance() { - if (!nodes) return; + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } - for (var i = 0, n = links.length; i < n; ++i) { - distances[i] = +distance(links[i], i, links); - } - } - - force.initialize = function(_) { - nodes = _; - initialize(); - }; - - force.links = function(_) { - return arguments.length ? (links = _, initialize(), force) : links; - }; - - force.id = function(_) { - return arguments.length ? (id = _, force) : id; - }; - - force.iterations = function(_) { - return arguments.length ? (iterations = +_, force) : iterations; - }; - - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength; - }; - - force.distance = function(_) { - return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; - }; - - return force; -} - -function x$1(d) { - return d.x; -} - -function y$1(d) { - return d.y; -} - -var initialRadius = 10, - initialAngle = Math.PI * (3 - Math.sqrt(5)); - -function simulation(nodes) { - var simulation, - alpha = 1, - alphaMin = 0.001, - alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), - alphaTarget = 0, - velocityDecay = 0.6, - forces = d3Collection.map(), - stepper = d3Timer.timer(step), - event = d3Dispatch.dispatch("tick", "end"); - - if (nodes == null) nodes = []; - - function step() { - tick(); - event.call("tick", simulation); - if (alpha < alphaMin) { - stepper.stop(); - event.call("end", simulation); - } - } + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } - function tick(iterations) { - var i, n = nodes.length, node; + var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; - if (iterations === undefined) iterations = 1; + function number1(e) { + return [+e[0], +e[1]]; + } - for (var k = 0; k < iterations; ++k) { - alpha += (alphaTarget - alpha) * alphaDecay; + function number2(e) { + return [number1(e[0]), number1(e[1])]; + } - forces.each(function (force) { - force(alpha); - }); + function toucher(identifier) { + return function (target) { + return d3Selection.touch(target, d3Selection.event.touches, identifier); + }; + } - for (i = 0; i < n; ++i) { - node = nodes[i]; - if (node.fx == null) node.x += node.vx *= velocityDecay; - else node.x = node.fx, node.vx = 0; - if (node.fy == null) node.y += node.vy *= velocityDecay; - else node.y = node.fy, node.vy = 0; - } - } + var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function (x, e) { + return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; + }, + output: function (xy) { + return xy && [xy[0][0], xy[1][0]]; + } + }; + + var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function (y, e) { + return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; + }, + output: function (xy) { + return xy && [xy[0][1], xy[1][1]]; + } + }; + + var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function (xy) { + return xy == null ? null : number2(xy); + }, + output: function (xy) { + return xy; + } + }; + + var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" + }; + + var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" + }; + + var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" + }; + + var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 + }; + + var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 + }; + + function type(t) { + return {type: t}; + } - return simulation; - } - - function initializeNodes() { - for (var i = 0, n = nodes.length, node; i < n; ++i) { - node = nodes[i], node.index = i; - if (node.fx != null) node.x = node.fx; - if (node.fy != null) node.y = node.fy; - if (isNaN(node.x) || isNaN(node.y)) { - var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; - node.x = radius * Math.cos(angle); - node.y = radius * Math.sin(angle); - } - if (isNaN(node.vx) || isNaN(node.vy)) { - node.vx = node.vy = 0; - } - } - } - - function initializeForce(force) { - if (force.initialize) force.initialize(nodes); - return force; - } - - initializeNodes(); - - return simulation = { - tick: tick, - - restart: function() { - return stepper.restart(step), simulation; - }, - - stop: function() { - return stepper.stop(), simulation; - }, - - nodes: function(_) { - return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; - }, - - alpha: function(_) { - return arguments.length ? (alpha = +_, simulation) : alpha; - }, - - alphaMin: function(_) { - return arguments.length ? (alphaMin = +_, simulation) : alphaMin; - }, - - alphaDecay: function(_) { - return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; - }, - - alphaTarget: function(_) { - return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; - }, - - velocityDecay: function(_) { - return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; - }, - - force: function(name, _) { - return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); - }, - - find: function(x, y, radius) { - var i = 0, - n = nodes.length, - dx, - dy, - d2, - node, - closest; - - if (radius == null) radius = Infinity; - else radius *= radius; - - for (i = 0; i < n; ++i) { - node = nodes[i]; - dx = x - node.x; - dy = y - node.y; - d2 = dx * dx + dy * dy; - if (d2 < radius) closest = node, radius = d2; - } - - return closest; - }, - - on: function(name, _) { - return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); - } - }; -} - -function manyBody() { - var nodes, - node, - alpha, - strength = constant(-30), - strengths, - distanceMin2 = 1, - distanceMax2 = Infinity, - theta2 = 0.81; - - function force(_) { - var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(accumulate); - for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); - } - - function initialize() { - if (!nodes) return; - var i, n = nodes.length, node; - strengths = new Array(n); - for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); - } - - function accumulate(quad) { - var strength = 0, q, c, weight = 0, x, y, i; - - // For internal nodes, accumulate forces from child quadrants. - if (quad.length) { - for (x = y = i = 0; i < 4; ++i) { - if ((q = quad[i]) && (c = Math.abs(q.value))) { - strength += q.value, weight += c, x += c * q.x, y += c * q.y; - } - } - quad.x = x / weight; - quad.y = y / weight; - } +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } - // For leaf nodes, accumulate forces from coincident quadrants. - else { - q = quad; - q.x = q.data.x; - q.y = q.data.y; - do strength += strengths[q.data.index]; - while (q = q.next); - } + function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; + } - quad.value = strength; - } - - function apply(quad, x1, _, x2) { - if (!quad.value) return true; - - var x = quad.x - node.x, - y = quad.y - node.y, - w = x2 - x1, - l = x * x + y * y; - - // Apply the Barnes-Hut approximation if possible. - // Limit forces for very close nodes; randomize direction if coincident. - if (w * w / theta2 < l) { - if (l < distanceMax2) { - if (x === 0) x = jiggle(), l += x * x; - if (y === 0) y = jiggle(), l += y * y; - if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); - node.vx += x * quad.value * alpha / l; - node.vy += y * quad.value * alpha / l; - } - return true; - } + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } - // Otherwise, process points directly. - else if (quad.length || l >= distanceMax2) return; +// Like d3.local, but with the name “__brush” rather than auto-generated. + function local(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; + } - // Limit forces for very close nodes; randomize direction if coincident. - if (quad.data !== node || quad.next) { - if (x === 0) x = jiggle(), l += x * x; - if (y === 0) y = jiggle(), l += y * y; - if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); - } + function empty(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; + } - do if (quad.data !== node) { - w = strengths[quad.data.index] * alpha / l; - node.vx += x * w; - node.vy += y * w; - } while (quad = quad.next); - } - - force.initialize = function(_) { - nodes = _; - initialize(); - }; - - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; - }; - - force.distanceMin = function(_) { - return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); - }; - - force.distanceMax = function(_) { - return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); - }; - - force.theta = function(_) { - return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); - }; - - return force; -} - -function radial(radius, x, y) { - var nodes, - strength = constant(0.1), - strengths, - radiuses; - - if (typeof radius !== "function") radius = constant(+radius); - if (x == null) x = 0; - if (y == null) y = 0; - - function force(alpha) { - for (var i = 0, n = nodes.length; i < n; ++i) { - var node = nodes[i], - dx = node.x - x || 1e-6, - dy = node.y - y || 1e-6, - r = Math.sqrt(dx * dx + dy * dy), - k = (radiuses[i] - r) * strengths[i] * alpha / r; - node.vx += dx * k; - node.vy += dy * k; - } - } - - function initialize() { - if (!nodes) return; - var i, n = nodes.length; - strengths = new Array(n); - radiuses = new Array(n); - for (i = 0; i < n; ++i) { - radiuses[i] = +radius(nodes[i], i, nodes); - strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); - } - } + function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; + } - force.initialize = function(_) { - nodes = _, initialize(); - }; + function brushX() { + return brush$1(X); + } - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; - }; + function brushY() { + return brush$1(Y); + } - force.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; - }; + function brush() { + return brush$1(XY); + } - force.x = function(_) { - return arguments.length ? (x = +_, force) : x; - }; + function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter, + touchable = defaultTouchable, + keys = true, + listeners = d3Dispatch.dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function () { + var extent = local(this).extent; + d3Selection.select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function (d) { + return d.type; + }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function (d) { + return "handle handle--" + d.type; + }) + .attr("cursor", function (d) { + return cursors[d.type]; + }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } - force.y = function(_) { - return arguments.length ? (y = +_, force) : y; - }; + brush.move = function (group, selection) { + if (group.selection) { + group + .on("start.brush", function () { + emitter(this, arguments).beforestart().start(); + }) + .on("interrupt.brush end.brush", function () { + emitter(this, arguments).end(); + }) + .tween("brush", function () { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = d3Interpolate.interpolate(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function () { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + d3Transition.interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function (group) { + brush.move(group, null); + }; + + function redraw() { + var group = d3Selection.select(this), + selection = local(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function (d) { + return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; + }) + .attr("y", function (d) { + return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; + }) + .attr("width", function (d) { + return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; + }) + .attr("height", function (d) { + return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; + }); + } else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } - return force; -} + function emitter(that, args, clean) { + return (!clean && that.__brush.emitter) || new Emitter(that, args); + } -function x$2(x) { - var strength = constant(0.1), - nodes, - strengths, - xz; + function Emitter(that, args) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + } - if (typeof x !== "function") x = constant(x == null ? 0 : +x); + Emitter.prototype = { + beforestart: function () { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function () { + if (this.starting) this.starting = false, this.emit("start"); + else this.emit("brush"); + return this; + }, + brush: function () { + this.emit("brush"); + return this; + }, + end: function () { + if (--this.active === 0) delete this.state.emitter, this.emit("end"); + return this; + }, + emit: function (type) { + d3Selection.customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function started() { + if (touchending && !d3Selection.event.touches) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = d3Selection.event.target.__data__.type, + mode = (keys && d3Selection.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && d3Selection.event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && d3Selection.event.shiftKey, + lockX, + lockY, + pointer = d3Selection.event.touches ? toucher(d3Selection.event.changedTouches[0].identifier) : d3Selection.mouse, + point0 = pointer(that), + point = point0, + emit = emitter(that, arguments, true).beforestart(); + + if (type === "overlay") { + if (selection) moving = true; + state.selection = selection = [ + [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], + [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] + ]; + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } - function force(alpha) { - for (var i = 0, n = nodes.length, node; i < n; ++i) { - node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; - } - } - - function initialize() { - if (!nodes) return; - var i, n = nodes.length; - strengths = new Array(n); - xz = new Array(n); - for (i = 0; i < n; ++i) { - strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); - } - } + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = d3Selection.select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + if (d3Selection.event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = d3Selection.select(d3Selection.event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + d3Drag.dragDisable(d3Selection.event.view); + } - force.initialize = function(_) { - nodes = _; - initialize(); - }; + nopropagation(); + d3Transition.interrupt(that); + redraw.call(that); + emit.start(); + + function moved() { + var point1 = pointer(that); + if (shifting && !lockX && !lockY) { + if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; + else lockX = true; + } + point = point1; + moving = true; + noevent(); + move(); + } - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; - }; + function move() { + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + break; + } + case MODE_CENTER: { + if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); + if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(); + } + } - force.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x; - }; + function ended() { + nopropagation(); + if (d3Selection.event.touches) { + if (d3Selection.event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! + } else { + d3Drag.dragEnable(d3Selection.event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(); + } - return force; -} + function keydowned() { + switch (d3Selection.event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: + return; + } + noevent(); + } -function y$2(y) { - var strength = constant(0.1), - nodes, - strengths, - yz; + function keyupped() { + switch (d3Selection.event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (d3Selection.event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: + return; + } + noevent(); + } + } - if (typeof y !== "function") y = constant(y == null ? 0 : +y); + function touchmoved() { + emitter(this, arguments).moved(); + } - function force(alpha) { - for (var i = 0, n = nodes.length, node; i < n; ++i) { - node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; - } - } - - function initialize() { - if (!nodes) return; - var i, n = nodes.length; - strengths = new Array(n); - yz = new Array(n); - for (i = 0; i < n; ++i) { - strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); - } - } + function touchended() { + emitter(this, arguments).ended(); + } - force.initialize = function(_) { - nodes = _; - initialize(); - }; + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; - }; + brush.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent; + }; - force.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; - }; + brush.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; + }; - return force; -} + brush.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable; + }; -exports.forceCenter = center; -exports.forceCollide = collide; -exports.forceLink = link; -exports.forceManyBody = manyBody; -exports.forceRadial = radial; -exports.forceSimulation = simulation; -exports.forceX = x$2; -exports.forceY = y$2; + brush.handleSize = function (_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; -Object.defineProperty(exports, '__esModule', { value: true }); + brush.keyModifiers = function (_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; -}))); + brush.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; -},{"d3-collection":12,"d3-dispatch":15,"d3-quadtree":27,"d3-timer":35}],21:[function(require,module,exports){ -// https://d3js.org/d3-format/ v1.4.3 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; + return brush; + } -// Computes the decimal coefficient and exponent of the specified number x with -// significant digits p, where x is positive and p is in [1, 21] or undefined. -// For example, formatDecimal(1.23) returns ["123", 0]. -function formatDecimal(x, p) { - if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity - var i, coefficient = x.slice(0, i); - - // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ - // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). - return [ - coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, - +x.slice(i + 1) - ]; -} - -function exponent(x) { - return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; -} - -function formatGroup(grouping, thousands) { - return function(value, width) { - var i = value.length, - t = [], - j = 0, - g = grouping[0], - length = 0; - - while (i > 0 && g > 0) { - if (length + g + 1 > width) g = Math.max(1, width - length); - t.push(value.substring(i -= g, i + g)); - if ((length += g + 1) > width) break; - g = grouping[j = (j + 1) % grouping.length]; - } + exports.brush = brush; + exports.brushSelection = brushSelection; + exports.brushX = brushX; + exports.brushY = brushY; - return t.reverse().join(thousands); - }; -} + Object.defineProperty(exports, '__esModule', {value: true}); -function formatNumerals(numerals) { - return function(value) { - return value.replace(/[0-9]/g, function(i) { - return numerals[+i]; - }); - }; -} + })); -// [[fill]align][sign][symbol][0][width][,][.precision][~][type] -var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; - -function formatSpecifier(specifier) { - if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); - var match; - return new FormatSpecifier({ - fill: match[1], - align: match[2], - sign: match[3], - symbol: match[4], - zero: match[5], - width: match[6], - comma: match[7], - precision: match[8] && match[8].slice(1), - trim: match[9], - type: match[10] - }); -} - -formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof - -function FormatSpecifier(specifier) { - this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; - this.align = specifier.align === undefined ? ">" : specifier.align + ""; - this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; - this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; - this.zero = !!specifier.zero; - this.width = specifier.width === undefined ? undefined : +specifier.width; - this.comma = !!specifier.comma; - this.precision = specifier.precision === undefined ? undefined : +specifier.precision; - this.trim = !!specifier.trim; - this.type = specifier.type === undefined ? "" : specifier.type + ""; -} - -FormatSpecifier.prototype.toString = function() { - return this.fill - + this.align - + this.sign - + this.symbol - + (this.zero ? "0" : "") - + (this.width === undefined ? "" : Math.max(1, this.width | 0)) - + (this.comma ? "," : "") - + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) - + (this.trim ? "~" : "") - + this.type; -}; + }, {"d3-dispatch": 15, "d3-drag": 16, "d3-interpolate": 24, "d3-selection": 31, "d3-transition": 36}], + 11: [function (require, module, exports) { +// https://d3js.org/d3-chord/ v1.0.6 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-path')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-path'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3)); + }(this, (function (exports, d3Array, d3Path) { + 'use strict'; + + var cos = Math.cos; + var sin = Math.sin; + var pi = Math.PI; + var halfPi = pi / 2; + var tau = pi * 2; + var max = Math.max; + + function compareValue(compare) { + return function (a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; + } -// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. -function formatTrim(s) { - out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { - switch (s[i]) { - case ".": i0 = i1 = i; break; - case "0": if (i0 === 0) i0 = i; i1 = i; break; - default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break; - } - } - return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; -} - -var prefixExponent; - -function formatPrefixAuto(x, p) { - var d = formatDecimal(x, p); - if (!d) return x + ""; - var coefficient = d[0], - exponent = d[1], - i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, - n = coefficient.length; - return i === n ? coefficient - : i > n ? coefficient + new Array(i - n + 1).join("0") - : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) - : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! -} - -function formatRounded(x, p) { - var d = formatDecimal(x, p); - if (!d) return x + ""; - var coefficient = d[0], - exponent = d[1]; - return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient - : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) - : coefficient + new Array(exponent - coefficient.length + 2).join("0"); -} - -var formatTypes = { - "%": function(x, p) { return (x * 100).toFixed(p); }, - "b": function(x) { return Math.round(x).toString(2); }, - "c": function(x) { return x + ""; }, - "d": function(x) { return Math.round(x).toString(10); }, - "e": function(x, p) { return x.toExponential(p); }, - "f": function(x, p) { return x.toFixed(p); }, - "g": function(x, p) { return x.toPrecision(p); }, - "o": function(x) { return Math.round(x).toString(8); }, - "p": function(x, p) { return formatRounded(x * 100, p); }, - "r": formatRounded, - "s": formatPrefixAuto, - "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, - "x": function(x) { return Math.round(x).toString(16); } -}; - -function identity(x) { - return x; -} - -var map = Array.prototype.map, - prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"]; - -function formatLocale(locale) { - var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), - currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", - currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", - decimal = locale.decimal === undefined ? "." : locale.decimal + "", - numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)), - percent = locale.percent === undefined ? "%" : locale.percent + "", - minus = locale.minus === undefined ? "-" : locale.minus + "", - nan = locale.nan === undefined ? "NaN" : locale.nan + ""; - - function newFormat(specifier) { - specifier = formatSpecifier(specifier); - - var fill = specifier.fill, - align = specifier.align, - sign = specifier.sign, - symbol = specifier.symbol, - zero = specifier.zero, - width = specifier.width, - comma = specifier.comma, - precision = specifier.precision, - trim = specifier.trim, - type = specifier.type; - - // The "n" type is an alias for ",g". - if (type === "n") comma = true, type = "g"; - - // The "" type, and any invalid type, is an alias for ".12~g". - else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; - - // If zero fill is specified, padding goes after sign and before digits. - if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; - - // Compute the prefix and suffix. - // For SI-prefix, the suffix is lazily computed. - var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", - suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; - - // What format function should we use? - // Is this an integer type? - // Can this type generate exponential notation? - var formatType = formatTypes[type], - maybeSuffix = /[defgprs%]/.test(type); - - // Set the default precision if not specified, - // or clamp the specified precision to the supported range. - // For significant precision, it must be in [1, 21]. - // For fixed precision, it must be in [0, 20]. - precision = precision === undefined ? 6 - : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) - : Math.max(0, Math.min(20, precision)); - - function format(value) { - var valuePrefix = prefix, - valueSuffix = suffix, - i, n, c; - - if (type === "c") { - valueSuffix = formatType(value) + valueSuffix; - value = ""; - } else { - value = +value; - - // Perform the initial formatting. - var valueNegative = value < 0; - value = isNaN(value) ? nan : formatType(Math.abs(value), precision); - - // Trim insignificant zeros. - if (trim) value = formatTrim(value); - - // If a negative value rounds to zero during formatting, treat as positive. - if (valueNegative && +value === 0) valueNegative = false; - - // Compute the prefix and suffix. - valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; - - valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); - - // Break the formatted value into the integer “value” part that can be - // grouped, and fractional or exponential “suffix” part that is not. - if (maybeSuffix) { - i = -1, n = value.length; - while (++i < n) { - if (c = value.charCodeAt(i), 48 > c || c > 57) { - valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; - value = value.slice(0, i); - break; - } - } - } - } + function chord() { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = [], + groupIndex = d3Array.range(n), + subgroupIndex = [], + chords = [], + groups = chords.groups = new Array(n), + subgroups = new Array(n * n), + k, + x, + x0, + dx, + i, + j; + + // Compute the sum. + k = 0, i = -1; + while (++i < n) { + x = 0, j = -1; + while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(d3Array.range(n)); + k += x; + } - // If the fill character is not "0", grouping is applied before padding. - if (comma && !zero) value = group(value, Infinity); + // Sort groups… + if (sortGroups) groupIndex.sort(function (a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + + // Sort subgroups… + if (sortSubgroups) subgroupIndex.forEach(function (d, i) { + d.sort(function (a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + + // Convert the sum to scaling factor for [0, 2pi]. + // TODO Allow start and end angle to be specified? + // TODO Allow padding to be specified as percentage? + k = max(0, tau - padAngle * n) / k; + dx = k ? padAngle : tau / n; + + // Compute the start and end angle for each group and subgroup. + // Note: Opera has a bug reordering object literal properties! + x = 0, i = -1; + while (++i < n) { + x0 = x, j = -1; + while (++j < n) { + var di = groupIndex[i], + dj = subgroupIndex[di][j], + v = matrix[di][dj], + a0 = x, + a1 = x += v * k; + subgroups[dj * n + di] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += dx; + } - // Compute the padding. - var length = valuePrefix.length + value.length + valueSuffix.length, - padding = length < width ? new Array(width - length + 1).join(fill) : ""; + // Generate chords for each (non-empty) subgroup-subgroup link. + i = -1; + while (++i < n) { + j = i - 1; + while (++j < n) { + var source = subgroups[j * n + i], + target = subgroups[i * n + j]; + if (source.value || target.value) { + chords.push(source.value < target.value + ? {source: target, target: source} + : {source: source, target: target}); + } + } + } - // If the fill character is "0", grouping is applied after padding. - if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + return sortChords ? chords.sort(sortChords) : chords; + } - // Reconstruct the final output based on the desired alignment. - switch (align) { - case "<": value = valuePrefix + value + valueSuffix + padding; break; - case "=": value = valuePrefix + padding + value + valueSuffix; break; - case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; - default: value = padding + valuePrefix + value + valueSuffix; break; - } + chord.padAngle = function (_) { + return arguments.length ? (padAngle = max(0, _), chord) : padAngle; + }; - return numerals(value); - } + chord.sortGroups = function (_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; - format.toString = function() { - return specifier + ""; - }; - - return format; - } - - function formatPrefix(specifier, value) { - var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), - e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, - k = Math.pow(10, -e), - prefix = prefixes[8 + e / 3]; - return function(value) { - return f(k * value) + prefix; - }; - } - - return { - format: newFormat, - formatPrefix: formatPrefix - }; -} - -var locale; - -defaultLocale({ - decimal: ".", - thousands: ",", - grouping: [3], - currency: ["$", ""], - minus: "-" -}); - -function defaultLocale(definition) { - locale = formatLocale(definition); - exports.format = locale.format; - exports.formatPrefix = locale.formatPrefix; - return locale; -} - -function precisionFixed(step) { - return Math.max(0, -exponent(Math.abs(step))); -} - -function precisionPrefix(step, value) { - return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); -} - -function precisionRound(step, max) { - step = Math.abs(step), max = Math.abs(max) - step; - return Math.max(0, exponent(max) - exponent(step)) + 1; -} - -exports.FormatSpecifier = FormatSpecifier; -exports.formatDefaultLocale = defaultLocale; -exports.formatLocale = formatLocale; -exports.formatSpecifier = formatSpecifier; -exports.precisionFixed = precisionFixed; -exports.precisionPrefix = precisionPrefix; -exports.precisionRound = precisionRound; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],22:[function(require,module,exports){ -// https://d3js.org/d3-geo/ v1.11.9 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); -}(this, function (exports, d3Array) { 'use strict'; + chord.sortSubgroups = function (_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; -// Adds floating point numbers with twice the normal precision. -// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and -// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) -// 305–363 (1997). -// Code adapted from GeographicLib by Charles F. F. Karney, -// http://geographiclib.sourceforge.net/ + chord.sortChords = function (_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; -function adder() { - return new Adder; -} - -function Adder() { - this.reset(); -} - -Adder.prototype = { - constructor: Adder, - reset: function() { - this.s = // rounded value - this.t = 0; // exact error - }, - add: function(y) { - add(temp, y, this.t); - add(this, temp.s, this.s); - if (this.s) this.t += temp.t; - else this.s = temp.t; - }, - valueOf: function() { - return this.s; - } -}; - -var temp = new Adder; - -function add(adder, a, b) { - var x = adder.s = a + b, - bv = x - a, - av = x - bv; - adder.t = (a - av) + (b - bv); -} - -var epsilon = 1e-6; -var epsilon2 = 1e-12; -var pi = Math.PI; -var halfPi = pi / 2; -var quarterPi = pi / 4; -var tau = pi * 2; - -var degrees = 180 / pi; -var radians = pi / 180; - -var abs = Math.abs; -var atan = Math.atan; -var atan2 = Math.atan2; -var cos = Math.cos; -var ceil = Math.ceil; -var exp = Math.exp; -var log = Math.log; -var pow = Math.pow; -var sin = Math.sin; -var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; -var sqrt = Math.sqrt; -var tan = Math.tan; - -function acos(x) { - return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); -} - -function asin(x) { - return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); -} - -function haversin(x) { - return (x = sin(x / 2)) * x; -} - -function noop() {} - -function streamGeometry(geometry, stream) { - if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { - streamGeometryType[geometry.type](geometry, stream); - } -} - -var streamObjectType = { - Feature: function(object, stream) { - streamGeometry(object.geometry, stream); - }, - FeatureCollection: function(object, stream) { - var features = object.features, i = -1, n = features.length; - while (++i < n) streamGeometry(features[i].geometry, stream); - } -}; - -var streamGeometryType = { - Sphere: function(object, stream) { - stream.sphere(); - }, - Point: function(object, stream) { - object = object.coordinates; - stream.point(object[0], object[1], object[2]); - }, - MultiPoint: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); - }, - LineString: function(object, stream) { - streamLine(object.coordinates, stream, 0); - }, - MultiLineString: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) streamLine(coordinates[i], stream, 0); - }, - Polygon: function(object, stream) { - streamPolygon(object.coordinates, stream); - }, - MultiPolygon: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) streamPolygon(coordinates[i], stream); - }, - GeometryCollection: function(object, stream) { - var geometries = object.geometries, i = -1, n = geometries.length; - while (++i < n) streamGeometry(geometries[i], stream); - } -}; - -function streamLine(coordinates, stream, closed) { - var i = -1, n = coordinates.length - closed, coordinate; - stream.lineStart(); - while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); - stream.lineEnd(); -} - -function streamPolygon(coordinates, stream) { - var i = -1, n = coordinates.length; - stream.polygonStart(); - while (++i < n) streamLine(coordinates[i], stream, 1); - stream.polygonEnd(); -} - -function geoStream(object, stream) { - if (object && streamObjectType.hasOwnProperty(object.type)) { - streamObjectType[object.type](object, stream); - } else { - streamGeometry(object, stream); - } -} - -var areaRingSum = adder(); - -var areaSum = adder(), - lambda00, - phi00, - lambda0, - cosPhi0, - sinPhi0; - -var areaStream = { - point: noop, - lineStart: noop, - lineEnd: noop, - polygonStart: function() { - areaRingSum.reset(); - areaStream.lineStart = areaRingStart; - areaStream.lineEnd = areaRingEnd; - }, - polygonEnd: function() { - var areaRing = +areaRingSum; - areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); - this.lineStart = this.lineEnd = this.point = noop; - }, - sphere: function() { - areaSum.add(tau); - } -}; - -function areaRingStart() { - areaStream.point = areaPointFirst; -} - -function areaRingEnd() { - areaPoint(lambda00, phi00); -} - -function areaPointFirst(lambda, phi) { - areaStream.point = areaPoint; - lambda00 = lambda, phi00 = phi; - lambda *= radians, phi *= radians; - lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); -} - -function areaPoint(lambda, phi) { - lambda *= radians, phi *= radians; - phi = phi / 2 + quarterPi; // half the angular distance from south pole - - // Spherical excess E for a spherical triangle with vertices: south pole, - // previous point, current point. Uses a formula derived from Cagnoli’s - // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). - var dLambda = lambda - lambda0, - sdLambda = dLambda >= 0 ? 1 : -1, - adLambda = sdLambda * dLambda, - cosPhi = cos(phi), - sinPhi = sin(phi), - k = sinPhi0 * sinPhi, - u = cosPhi0 * cosPhi + k * cos(adLambda), - v = k * sdLambda * sin(adLambda); - areaRingSum.add(atan2(v, u)); - - // Advance the previous points. - lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; -} - -function area(object) { - areaSum.reset(); - geoStream(object, areaStream); - return areaSum * 2; -} - -function spherical(cartesian) { - return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; -} - -function cartesian(spherical) { - var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); - return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; -} - -function cartesianDot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; -} - -function cartesianCross(a, b) { - return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; -} + return chord; + } -// TODO return a -function cartesianAddInPlace(a, b) { - a[0] += b[0], a[1] += b[1], a[2] += b[2]; -} - -function cartesianScale(vector, k) { - return [vector[0] * k, vector[1] * k, vector[2] * k]; -} + var slice = Array.prototype.slice; -// TODO return d -function cartesianNormalizeInPlace(d) { - var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); - d[0] /= l, d[1] /= l, d[2] /= l; -} - -var lambda0$1, phi0, lambda1, phi1, // bounds - lambda2, // previous lambda-coordinate - lambda00$1, phi00$1, // first point - p0, // previous 3D point - deltaSum = adder(), - ranges, - range; - -var boundsStream = { - point: boundsPoint, - lineStart: boundsLineStart, - lineEnd: boundsLineEnd, - polygonStart: function() { - boundsStream.point = boundsRingPoint; - boundsStream.lineStart = boundsRingStart; - boundsStream.lineEnd = boundsRingEnd; - deltaSum.reset(); - areaStream.polygonStart(); - }, - polygonEnd: function() { - areaStream.polygonEnd(); - boundsStream.point = boundsPoint; - boundsStream.lineStart = boundsLineStart; - boundsStream.lineEnd = boundsLineEnd; - if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); - else if (deltaSum > epsilon) phi1 = 90; - else if (deltaSum < -epsilon) phi0 = -90; - range[0] = lambda0$1, range[1] = lambda1; - }, - sphere: function() { - lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); - } -}; - -function boundsPoint(lambda, phi) { - ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); - if (phi < phi0) phi0 = phi; - if (phi > phi1) phi1 = phi; -} - -function linePoint(lambda, phi) { - var p = cartesian([lambda * radians, phi * radians]); - if (p0) { - var normal = cartesianCross(p0, p), - equatorial = [normal[1], -normal[0], 0], - inflection = cartesianCross(equatorial, normal); - cartesianNormalizeInPlace(inflection); - inflection = spherical(inflection); - var delta = lambda - lambda2, - sign = delta > 0 ? 1 : -1, - lambdai = inflection[0] * degrees * sign, - phii, - antimeridian = abs(delta) > 180; - if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { - phii = inflection[1] * degrees; - if (phii > phi1) phi1 = phii; - } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { - phii = -inflection[1] * degrees; - if (phii < phi0) phi0 = phii; - } else { - if (phi < phi0) phi0 = phi; - if (phi > phi1) phi1 = phi; - } - if (antimeridian) { - if (lambda < lambda2) { - if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; - } else { - if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; - } - } else { - if (lambda1 >= lambda0$1) { - if (lambda < lambda0$1) lambda0$1 = lambda; - if (lambda > lambda1) lambda1 = lambda; - } else { - if (lambda > lambda2) { - if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; - } else { - if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; - } - } - } - } else { - ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); - } - if (phi < phi0) phi0 = phi; - if (phi > phi1) phi1 = phi; - p0 = p, lambda2 = lambda; -} - -function boundsLineStart() { - boundsStream.point = linePoint; -} - -function boundsLineEnd() { - range[0] = lambda0$1, range[1] = lambda1; - boundsStream.point = boundsPoint; - p0 = null; -} - -function boundsRingPoint(lambda, phi) { - if (p0) { - var delta = lambda - lambda2; - deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); - } else { - lambda00$1 = lambda, phi00$1 = phi; - } - areaStream.point(lambda, phi); - linePoint(lambda, phi); -} - -function boundsRingStart() { - areaStream.lineStart(); -} - -function boundsRingEnd() { - boundsRingPoint(lambda00$1, phi00$1); - areaStream.lineEnd(); - if (abs(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180); - range[0] = lambda0$1, range[1] = lambda1; - p0 = null; -} + function constant(x) { + return function () { + return x; + }; + } -// Finds the left-right distance between two longitudes. -// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want -// the distance between ±180° to be 360°. -function angle(lambda0, lambda1) { - return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; -} - -function rangeCompare(a, b) { - return a[0] - b[0]; -} - -function rangeContains(range, x) { - return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; -} - -function bounds(feature) { - var i, n, a, b, merged, deltaMax, delta; - - phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); - ranges = []; - geoStream(feature, boundsStream); - - // First, sort ranges by their minimum longitudes. - if (n = ranges.length) { - ranges.sort(rangeCompare); - - // Then, merge any ranges that overlap. - for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { - b = ranges[i]; - if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { - if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; - if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; - } else { - merged.push(a = b); - } - } + function defaultSource(d) { + return d.source; + } - // Finally, find the largest gap between the merged ranges. - // The final bounding box will be the inverse of this gap. - for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { - b = merged[i]; - if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; - } - } - - ranges = range = null; - - return lambda0$1 === Infinity || phi0 === Infinity - ? [[NaN, NaN], [NaN, NaN]] - : [[lambda0$1, phi0], [lambda1, phi1]]; -} - -var W0, W1, - X0, Y0, Z0, - X1, Y1, Z1, - X2, Y2, Z2, - lambda00$2, phi00$2, // first point - x0, y0, z0; // previous point - -var centroidStream = { - sphere: noop, - point: centroidPoint, - lineStart: centroidLineStart, - lineEnd: centroidLineEnd, - polygonStart: function() { - centroidStream.lineStart = centroidRingStart; - centroidStream.lineEnd = centroidRingEnd; - }, - polygonEnd: function() { - centroidStream.lineStart = centroidLineStart; - centroidStream.lineEnd = centroidLineEnd; - } -}; + function defaultTarget(d) { + return d.target; + } -// Arithmetic mean of Cartesian vectors. -function centroidPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi); - centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); -} - -function centroidPointCartesian(x, y, z) { - ++W0; - X0 += (x - X0) / W0; - Y0 += (y - Y0) / W0; - Z0 += (z - Z0) / W0; -} - -function centroidLineStart() { - centroidStream.point = centroidLinePointFirst; -} - -function centroidLinePointFirst(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi); - x0 = cosPhi * cos(lambda); - y0 = cosPhi * sin(lambda); - z0 = sin(phi); - centroidStream.point = centroidLinePoint; - centroidPointCartesian(x0, y0, z0); -} - -function centroidLinePoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi), - x = cosPhi * cos(lambda), - y = cosPhi * sin(lambda), - z = sin(phi), - w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); - W1 += w; - X1 += w * (x0 + (x0 = x)); - Y1 += w * (y0 + (y0 = y)); - Z1 += w * (z0 + (z0 = z)); - centroidPointCartesian(x0, y0, z0); -} - -function centroidLineEnd() { - centroidStream.point = centroidPoint; -} + function defaultRadius(d) { + return d.radius; + } -// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, -// J. Applied Mechanics 42, 239 (1975). -function centroidRingStart() { - centroidStream.point = centroidRingPointFirst; -} - -function centroidRingEnd() { - centroidRingPoint(lambda00$2, phi00$2); - centroidStream.point = centroidPoint; -} - -function centroidRingPointFirst(lambda, phi) { - lambda00$2 = lambda, phi00$2 = phi; - lambda *= radians, phi *= radians; - centroidStream.point = centroidRingPoint; - var cosPhi = cos(phi); - x0 = cosPhi * cos(lambda); - y0 = cosPhi * sin(lambda); - z0 = sin(phi); - centroidPointCartesian(x0, y0, z0); -} - -function centroidRingPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi), - x = cosPhi * cos(lambda), - y = cosPhi * sin(lambda), - z = sin(phi), - cx = y0 * z - z0 * y, - cy = z0 * x - x0 * z, - cz = x0 * y - y0 * x, - m = sqrt(cx * cx + cy * cy + cz * cz), - w = asin(m), // line weight = angle - v = m && -w / m; // area weight multiplier - X2 += v * cx; - Y2 += v * cy; - Z2 += v * cz; - W1 += w; - X1 += w * (x0 + (x0 = x)); - Y1 += w * (y0 + (y0 = y)); - Z1 += w * (z0 + (z0 = z)); - centroidPointCartesian(x0, y0, z0); -} - -function centroid(object) { - W0 = W1 = - X0 = Y0 = Z0 = - X1 = Y1 = Z1 = - X2 = Y2 = Z2 = 0; - geoStream(object, centroidStream); - - var x = X2, - y = Y2, - z = Z2, - m = x * x + y * y + z * z; - - // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. - if (m < epsilon2) { - x = X1, y = Y1, z = Z1; - // If the feature has zero length, fall back to arithmetic mean of point vectors. - if (W1 < epsilon) x = X0, y = Y0, z = Z0; - m = x * x + y * y + z * z; - // If the feature still has an undefined ccentroid, then return. - if (m < epsilon2) return [NaN, NaN]; - } - - return [atan2(y, x) * degrees, asin(z / sqrt(m)) * degrees]; -} - -function constant(x) { - return function() { - return x; - }; -} - -function compose(a, b) { - - function compose(x, y) { - return x = a(x, y), b(x[0], x[1]); - } - - if (a.invert && b.invert) compose.invert = function(x, y) { - return x = b.invert(x, y), x && a.invert(x[0], x[1]); - }; - - return compose; -} - -function rotationIdentity(lambda, phi) { - return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; -} - -rotationIdentity.invert = rotationIdentity; - -function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { - return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) - : rotationLambda(deltaLambda)) - : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) - : rotationIdentity); -} - -function forwardRotationLambda(deltaLambda) { - return function(lambda, phi) { - return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; - }; -} - -function rotationLambda(deltaLambda) { - var rotation = forwardRotationLambda(deltaLambda); - rotation.invert = forwardRotationLambda(-deltaLambda); - return rotation; -} - -function rotationPhiGamma(deltaPhi, deltaGamma) { - var cosDeltaPhi = cos(deltaPhi), - sinDeltaPhi = sin(deltaPhi), - cosDeltaGamma = cos(deltaGamma), - sinDeltaGamma = sin(deltaGamma); - - function rotation(lambda, phi) { - var cosPhi = cos(phi), - x = cos(lambda) * cosPhi, - y = sin(lambda) * cosPhi, - z = sin(phi), - k = z * cosDeltaPhi + x * sinDeltaPhi; - return [ - atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), - asin(k * cosDeltaGamma + y * sinDeltaGamma) - ]; - } - - rotation.invert = function(lambda, phi) { - var cosPhi = cos(phi), - x = cos(lambda) * cosPhi, - y = sin(lambda) * cosPhi, - z = sin(phi), - k = z * cosDeltaGamma - y * sinDeltaGamma; - return [ - atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), - asin(k * cosDeltaPhi - x * sinDeltaPhi) - ]; - }; - - return rotation; -} - -function rotation(rotate) { - rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); - - function forward(coordinates) { - coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); - return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; - } - - forward.invert = function(coordinates) { - coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); - return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; - }; - - return forward; -} + function defaultStartAngle(d) { + return d.startAngle; + } -// Generates a circle centered at [0°, 0°], with a given radius and precision. -function circleStream(stream, radius, delta, direction, t0, t1) { - if (!delta) return; - var cosRadius = cos(radius), - sinRadius = sin(radius), - step = direction * delta; - if (t0 == null) { - t0 = radius + direction * tau; - t1 = radius - step / 2; - } else { - t0 = circleRadius(cosRadius, t0); - t1 = circleRadius(cosRadius, t1); - if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; - } - for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { - point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); - stream.point(point[0], point[1]); - } -} + function defaultEndAngle(d) { + return d.endAngle; + } -// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. -function circleRadius(cosRadius, point) { - point = cartesian(point), point[0] -= cosRadius; - cartesianNormalizeInPlace(point); - var radius = acos(-point[1]); - return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; -} - -function circle() { - var center = constant([0, 0]), - radius = constant(90), - precision = constant(6), - ring, - rotate, - stream = {point: point}; - - function point(x, y) { - ring.push(x = rotate(x, y)); - x[0] *= degrees, x[1] *= degrees; - } - - function circle() { - var c = center.apply(this, arguments), - r = radius.apply(this, arguments) * radians, - p = precision.apply(this, arguments) * radians; - ring = []; - rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; - circleStream(stream, r, p, 1); - c = {type: "Polygon", coordinates: [ring]}; - ring = rotate = null; - return c; - } - - circle.center = function(_) { - return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center; - }; - - circle.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius; - }; - - circle.precision = function(_) { - return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision; - }; - - return circle; -} - -function clipBuffer() { - var lines = [], - line; - return { - point: function(x, y) { - line.push([x, y]); - }, - lineStart: function() { - lines.push(line = []); - }, - lineEnd: noop, - rejoin: function() { - if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); - }, - result: function() { - var result = lines; - lines = []; - line = null; - return result; - } - }; -} - -function pointEqual(a, b) { - return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; -} - -function Intersection(point, points, other, entry) { - this.x = point; - this.z = points; - this.o = other; // another intersection - this.e = entry; // is an entry? - this.v = false; // visited - this.n = this.p = null; // next & previous -} + function ribbon() { + var source = defaultSource, + target = defaultTarget, + radius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + context = null; + + function ribbon() { + var buffer, + argv = slice.call(arguments), + s = source.apply(this, argv), + t = target.apply(this, argv), + sr = +radius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi, + sa1 = endAngle.apply(this, argv) - halfPi, + sx0 = sr * cos(sa0), + sy0 = sr * sin(sa0), + tr = +radius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi, + ta1 = endAngle.apply(this, argv) - halfPi; + + if (!context) context = buffer = d3Path.path(); + + context.moveTo(sx0, sy0); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + context.quadraticCurveTo(0, 0, sx0, sy0); + context.closePath(); -// A generalized polygon clipping algorithm: given a polygon that has been cut -// into its visible line segments, and rejoins the segments by interpolating -// along the clip edge. -function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { - var subject = [], - clip = [], - i, - n; - - segments.forEach(function(segment) { - if ((n = segment.length - 1) <= 0) return; - var n, p0 = segment[0], p1 = segment[n], x; - - // If the first and last points of a segment are coincident, then treat as a - // closed ring. TODO if all rings are closed, then the winding order of the - // exterior ring should be checked. - if (pointEqual(p0, p1)) { - stream.lineStart(); - for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); - stream.lineEnd(); - return; - } + if (buffer) return context = null, buffer + "" || null; + } - subject.push(x = new Intersection(p0, segment, null, true)); - clip.push(x.o = new Intersection(p0, null, x, false)); - subject.push(x = new Intersection(p1, segment, null, false)); - clip.push(x.o = new Intersection(p1, null, x, true)); - }); - - if (!subject.length) return; - - clip.sort(compareIntersection); - link(subject); - link(clip); - - for (i = 0, n = clip.length; i < n; ++i) { - clip[i].e = startInside = !startInside; - } - - var start = subject[0], - points, - point; - - while (1) { - // Find first unvisited intersection. - var current = start, - isSubject = true; - while (current.v) if ((current = current.n) === start) return; - points = current.z; - stream.lineStart(); - do { - current.v = current.o.v = true; - if (current.e) { - if (isSubject) { - for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); - } else { - interpolate(current.x, current.n.x, 1, stream); - } - current = current.n; - } else { - if (isSubject) { - points = current.p.z; - for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); - } else { - interpolate(current.x, current.p.x, -1, stream); - } - current = current.p; - } - current = current.o; - points = current.z; - isSubject = !isSubject; - } while (!current.v); - stream.lineEnd(); - } -} - -function link(array) { - if (!(n = array.length)) return; - var n, - i = 0, - a = array[0], - b; - while (++i < n) { - a.n = b = array[i]; - b.p = a; - a = b; - } - a.n = b = array[0]; - b.p = a; -} - -var sum = adder(); - -function longitude(point) { - if (abs(point[0]) <= pi) - return point[0]; - else - return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); -} - -function polygonContains(polygon, point) { - var lambda = longitude(point), - phi = point[1], - sinPhi = sin(phi), - normal = [sin(lambda), -cos(lambda), 0], - angle = 0, - winding = 0; - - sum.reset(); - - if (sinPhi === 1) phi = halfPi + epsilon; - else if (sinPhi === -1) phi = -halfPi - epsilon; - - for (var i = 0, n = polygon.length; i < n; ++i) { - if (!(m = (ring = polygon[i]).length)) continue; - var ring, - m, - point0 = ring[m - 1], - lambda0 = longitude(point0), - phi0 = point0[1] / 2 + quarterPi, - sinPhi0 = sin(phi0), - cosPhi0 = cos(phi0); - - for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { - var point1 = ring[j], - lambda1 = longitude(point1), - phi1 = point1[1] / 2 + quarterPi, - sinPhi1 = sin(phi1), - cosPhi1 = cos(phi1), - delta = lambda1 - lambda0, - sign = delta >= 0 ? 1 : -1, - absDelta = sign * delta, - antimeridian = absDelta > pi, - k = sinPhi0 * sinPhi1; - - sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); - angle += antimeridian ? delta + sign * tau : delta; - - // Are the longitudes either side of the point’s meridian (lambda), - // and are the latitudes smaller than the parallel (phi)? - if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { - var arc = cartesianCross(cartesian(point0), cartesian(point1)); - cartesianNormalizeInPlace(arc); - var intersection = cartesianCross(normal, arc); - cartesianNormalizeInPlace(intersection); - var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); - if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { - winding += antimeridian ^ delta >= 0 ? 1 : -1; - } - } - } - } - - // First, determine whether the South pole is inside or outside: - // - // It is inside if: - // * the polygon winds around it in a clockwise direction. - // * the polygon does not (cumulatively) wind around it, but has a negative - // (counter-clockwise) area. - // - // Second, count the (signed) number of times a segment crosses a lambda - // from the point to the South pole. If it is zero, then the point is the - // same side as the South pole. - - return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1); -} - -function clip(pointVisible, clipLine, interpolate, start) { - return function(sink) { - var line = clipLine(sink), - ringBuffer = clipBuffer(), - ringSink = clipLine(ringBuffer), - polygonStarted = false, - polygon, - segments, - ring; - - var clip = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - clip.point = pointRing; - clip.lineStart = ringStart; - clip.lineEnd = ringEnd; - segments = []; - polygon = []; - }, - polygonEnd: function() { - clip.point = point; - clip.lineStart = lineStart; - clip.lineEnd = lineEnd; - segments = d3Array.merge(segments); - var startInside = polygonContains(polygon, start); - if (segments.length) { - if (!polygonStarted) sink.polygonStart(), polygonStarted = true; - clipRejoin(segments, compareIntersection, startInside, interpolate, sink); - } else if (startInside) { - if (!polygonStarted) sink.polygonStart(), polygonStarted = true; - sink.lineStart(); - interpolate(null, null, 1, sink); - sink.lineEnd(); - } - if (polygonStarted) sink.polygonEnd(), polygonStarted = false; - segments = polygon = null; - }, - sphere: function() { - sink.polygonStart(); - sink.lineStart(); - interpolate(null, null, 1, sink); - sink.lineEnd(); - sink.polygonEnd(); - } - }; - - function point(lambda, phi) { - if (pointVisible(lambda, phi)) sink.point(lambda, phi); - } + ribbon.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), ribbon) : radius; + }; - function pointLine(lambda, phi) { - line.point(lambda, phi); - } + ribbon.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; + }; - function lineStart() { - clip.point = pointLine; - line.lineStart(); - } + ribbon.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; + }; - function lineEnd() { - clip.point = point; - line.lineEnd(); - } + ribbon.source = function (_) { + return arguments.length ? (source = _, ribbon) : source; + }; - function pointRing(lambda, phi) { - ring.push([lambda, phi]); - ringSink.point(lambda, phi); - } + ribbon.target = function (_) { + return arguments.length ? (target = _, ribbon) : target; + }; - function ringStart() { - ringSink.lineStart(); - ring = []; - } + ribbon.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; - function ringEnd() { - pointRing(ring[0][0], ring[0][1]); - ringSink.lineEnd(); - - var clean = ringSink.clean(), - ringSegments = ringBuffer.result(), - i, n = ringSegments.length, m, - segment, - point; - - ring.pop(); - polygon.push(ring); - ring = null; - - if (!n) return; - - // No intersections. - if (clean & 1) { - segment = ringSegments[0]; - if ((m = segment.length - 1) > 0) { - if (!polygonStarted) sink.polygonStart(), polygonStarted = true; - sink.lineStart(); - for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); - sink.lineEnd(); - } - return; - } + return ribbon; + } - // Rejoin connected segments. - // TODO reuse ringBuffer.rejoin()? - if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + exports.chord = chord; + exports.ribbon = ribbon; - segments.push(ringSegments.filter(validSegment)); - } + Object.defineProperty(exports, '__esModule', {value: true}); - return clip; - }; -} + }))); -function validSegment(segment) { - return segment.length > 1; -} + }, {"d3-array": 8, "d3-path": 25}], + 12: [function (require, module, exports) { +// https://d3js.org/d3-collection/ v1.0.7 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; -// Intersections are sorted along the clip edge. For both antimeridian cutting -// and circle clipping, the same comparison is used. -function compareIntersection(a, b) { - return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) - - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); -} - -var clipAntimeridian = clip( - function() { return true; }, - clipAntimeridianLine, - clipAntimeridianInterpolate, - [-pi, -halfPi] -); + var prefix = "$"; -// Takes a line and cuts into visible segments. Return values: 0 - there were -// intersections or the line was empty; 1 - no intersections; 2 - there were -// intersections, and the first and last segments should be rejoined. -function clipAntimeridianLine(stream) { - var lambda0 = NaN, - phi0 = NaN, - sign0 = NaN, - clean; // no intersections - - return { - lineStart: function() { - stream.lineStart(); - clean = 1; - }, - point: function(lambda1, phi1) { - var sign1 = lambda1 > 0 ? pi : -pi, - delta = abs(lambda1 - lambda0); - if (abs(delta - pi) < epsilon) { // line crosses a pole - stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); - stream.point(sign0, phi0); - stream.lineEnd(); - stream.lineStart(); - stream.point(sign1, phi0); - stream.point(lambda1, phi0); - clean = 0; - } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian - if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies - if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon; - phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); - stream.point(sign0, phi0); - stream.lineEnd(); - stream.lineStart(); - stream.point(sign1, phi0); - clean = 0; - } - stream.point(lambda0 = lambda1, phi0 = phi1); - sign0 = sign1; - }, - lineEnd: function() { - stream.lineEnd(); - lambda0 = phi0 = NaN; - }, - clean: function() { - return 2 - clean; // if intersections, rejoin first and last segments - } - }; -} - -function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { - var cosPhi0, - cosPhi1, - sinLambda0Lambda1 = sin(lambda0 - lambda1); - return abs(sinLambda0Lambda1) > epsilon - ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) - - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) - / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) - : (phi0 + phi1) / 2; -} - -function clipAntimeridianInterpolate(from, to, direction, stream) { - var phi; - if (from == null) { - phi = direction * halfPi; - stream.point(-pi, phi); - stream.point(0, phi); - stream.point(pi, phi); - stream.point(pi, 0); - stream.point(pi, -phi); - stream.point(0, -phi); - stream.point(-pi, -phi); - stream.point(-pi, 0); - stream.point(-pi, phi); - } else if (abs(from[0] - to[0]) > epsilon) { - var lambda = from[0] < to[0] ? pi : -pi; - phi = direction * lambda / 2; - stream.point(-lambda, phi); - stream.point(0, phi); - stream.point(lambda, phi); - } else { - stream.point(to[0], to[1]); - } -} - -function clipCircle(radius) { - var cr = cos(radius), - delta = 6 * radians, - smallRadius = cr > 0, - notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case - - function interpolate(from, to, direction, stream) { - circleStream(stream, radius, delta, direction, from, to); - } - - function visible(lambda, phi) { - return cos(lambda) * cos(phi) > cr; - } - - // Takes a line and cuts into visible segments. Return values used for polygon - // clipping: 0 - there were intersections or the line was empty; 1 - no - // intersections 2 - there were intersections, and the first and last segments - // should be rejoined. - function clipLine(stream) { - var point0, // previous point - c0, // code for previous point - v0, // visibility of previous point - v00, // visibility of first point - clean; // no intersections - return { - lineStart: function() { - v00 = v0 = false; - clean = 1; - }, - point: function(lambda, phi) { - var point1 = [lambda, phi], - point2, - v = visible(lambda, phi), - c = smallRadius - ? v ? 0 : code(lambda, phi) - : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; - if (!point0 && (v00 = v0 = v)) stream.lineStart(); - // Handle degeneracies. - // TODO ignore if not clipping polygons. - if (v !== v0) { - point2 = intersect(point0, point1); - if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { - point1[0] += epsilon; - point1[1] += epsilon; - v = visible(point1[0], point1[1]); - } - } - if (v !== v0) { - clean = 0; - if (v) { - // outside going in - stream.lineStart(); - point2 = intersect(point1, point0); - stream.point(point2[0], point2[1]); - } else { - // inside going out - point2 = intersect(point0, point1); - stream.point(point2[0], point2[1]); - stream.lineEnd(); - } - point0 = point2; - } else if (notHemisphere && point0 && smallRadius ^ v) { - var t; - // If the codes for two points are different, or are both zero, - // and there this segment intersects with the small circle. - if (!(c & c0) && (t = intersect(point1, point0, true))) { - clean = 0; - if (smallRadius) { - stream.lineStart(); - stream.point(t[0][0], t[0][1]); - stream.point(t[1][0], t[1][1]); - stream.lineEnd(); - } else { - stream.point(t[1][0], t[1][1]); - stream.lineEnd(); - stream.lineStart(); - stream.point(t[0][0], t[0][1]); + function Map() { } - } - } - if (v && (!point0 || !pointEqual(point0, point1))) { - stream.point(point1[0], point1[1]); - } - point0 = point1, v0 = v, c0 = c; - }, - lineEnd: function() { - if (v0) stream.lineEnd(); - point0 = null; - }, - // Rejoin first and last segments if there were intersections and the first - // and last points were visible. - clean: function() { - return clean | ((v00 && v0) << 1); - } - }; - } - - // Intersects the great circle between a and b with the clip circle. - function intersect(a, b, two) { - var pa = cartesian(a), - pb = cartesian(b); - - // We have two planes, n1.p = d1 and n2.p = d2. - // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). - var n1 = [1, 0, 0], // normal - n2 = cartesianCross(pa, pb), - n2n2 = cartesianDot(n2, n2), - n1n2 = n2[0], // cartesianDot(n1, n2), - determinant = n2n2 - n1n2 * n1n2; - - // Two polar points. - if (!determinant) return !two && a; - - var c1 = cr * n2n2 / determinant, - c2 = -cr * n1n2 / determinant, - n1xn2 = cartesianCross(n1, n2), - A = cartesianScale(n1, c1), - B = cartesianScale(n2, c2); - cartesianAddInPlace(A, B); - - // Solve |p(t)|^2 = 1. - var u = n1xn2, - w = cartesianDot(A, u), - uu = cartesianDot(u, u), - t2 = w * w - uu * (cartesianDot(A, A) - 1); - - if (t2 < 0) return; - - var t = sqrt(t2), - q = cartesianScale(u, (-w - t) / uu); - cartesianAddInPlace(q, A); - q = spherical(q); - - if (!two) return q; - - // Two intersection points. - var lambda0 = a[0], - lambda1 = b[0], - phi0 = a[1], - phi1 = b[1], - z; - - if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; - - var delta = lambda1 - lambda0, - polar = abs(delta - pi) < epsilon, - meridian = polar || delta < epsilon; - - if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; - - // Check that the first point is between a and b. - if (meridian - ? polar - ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1) - : phi0 <= q[1] && q[1] <= phi1 - : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { - var q1 = cartesianScale(u, (-w + t) / uu); - cartesianAddInPlace(q1, A); - return [q, spherical(q1)]; - } - } - - // Generates a 4-bit vector representing the location of a point relative to - // the small circle's bounding box. - function code(lambda, phi) { - var r = smallRadius ? radius : pi - radius, - code = 0; - if (lambda < -r) code |= 1; // left - else if (lambda > r) code |= 2; // right - if (phi < -r) code |= 4; // below - else if (phi > r) code |= 8; // above - return code; - } - - return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); -} - -function clipLine(a, b, x0, y0, x1, y1) { - var ax = a[0], - ay = a[1], - bx = b[0], - by = b[1], - t0 = 0, - t1 = 1, - dx = bx - ax, - dy = by - ay, - r; - - r = x0 - ax; - if (!dx && r > 0) return; - r /= dx; - if (dx < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dx > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - - r = x1 - ax; - if (!dx && r < 0) return; - r /= dx; - if (dx < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dx > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - - r = y0 - ay; - if (!dy && r > 0) return; - r /= dy; - if (dy < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dy > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - - r = y1 - ay; - if (!dy && r < 0) return; - r /= dy; - if (dy < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dy > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - - if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; - if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; - return true; -} - -var clipMax = 1e9, clipMin = -clipMax; -// TODO Use d3-polygon’s polygonContains here for the ring check? -// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + Map.prototype = map.prototype = { + constructor: Map, + has: function (key) { + return (prefix + key) in this; + }, + get: function (key) { + return this[prefix + key]; + }, + set: function (key, value) { + this[prefix + key] = value; + return this; + }, + remove: function (key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function () { + for (var property in this) if (property[0] === prefix) delete this[property]; + }, + keys: function () { + var keys = []; + for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); + return keys; + }, + values: function () { + var values = []; + for (var property in this) if (property[0] === prefix) values.push(this[property]); + return values; + }, + entries: function () { + var entries = []; + for (var property in this) if (property[0] === prefix) entries.push({ + key: property.slice(1), + value: this[property] + }); + return entries; + }, + size: function () { + var size = 0; + for (var property in this) if (property[0] === prefix) ++size; + return size; + }, + empty: function () { + for (var property in this) if (property[0] === prefix) return false; + return true; + }, + each: function (f) { + for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); + } + }; -function clipRectangle(x0, y0, x1, y1) { - - function visible(x, y) { - return x0 <= x && x <= x1 && y0 <= y && y <= y1; - } - - function interpolate(from, to, direction, stream) { - var a = 0, a1 = 0; - if (from == null - || (a = corner(from, direction)) !== (a1 = corner(to, direction)) - || comparePoint(from, to) < 0 ^ direction > 0) { - do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); - while ((a = (a + direction + 4) % 4) !== a1); - } else { - stream.point(to[0], to[1]); - } - } - - function corner(p, direction) { - return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 - : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 - : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 - : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon - } - - function compareIntersection(a, b) { - return comparePoint(a.x, b.x); - } - - function comparePoint(a, b) { - var ca = corner(a, 1), - cb = corner(b, 1); - return ca !== cb ? ca - cb - : ca === 0 ? b[1] - a[1] - : ca === 1 ? a[0] - b[0] - : ca === 2 ? a[1] - b[1] - : b[0] - a[0]; - } - - return function(stream) { - var activeStream = stream, - bufferStream = clipBuffer(), - segments, - polygon, - ring, - x__, y__, v__, // first point - x_, y_, v_, // previous point - first, - clean; - - var clipStream = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: polygonStart, - polygonEnd: polygonEnd - }; - - function point(x, y) { - if (visible(x, y)) activeStream.point(x, y); - } + function map(object, f) { + var map = new Map; - function polygonInside() { - var winding = 0; + // Copy constructor. + if (object instanceof Map) object.each(function (value, key) { + map.set(key, value); + }); - for (var i = 0, n = polygon.length; i < n; ++i) { - for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { - a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; - if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } - else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } - } - } + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; - return winding; - } + if (f == null) while (++i < n) map.set(i, object[i]); + else while (++i < n) map.set(f(o = object[i], i, object), o); + } - // Buffer geometry within a polygon and then clip it en masse. - function polygonStart() { - activeStream = bufferStream, segments = [], polygon = [], clean = true; - } + // Convert object to map. + else if (object) for (var key in object) map.set(key, object[key]); - function polygonEnd() { - var startInside = polygonInside(), - cleanInside = clean && startInside, - visible = (segments = d3Array.merge(segments)).length; - if (cleanInside || visible) { - stream.polygonStart(); - if (cleanInside) { - stream.lineStart(); - interpolate(null, null, 1, stream); - stream.lineEnd(); - } - if (visible) { - clipRejoin(segments, compareIntersection, startInside, interpolate, stream); - } - stream.polygonEnd(); - } - activeStream = stream, segments = polygon = ring = null; - } + return map; + } - function lineStart() { - clipStream.point = linePoint; - if (polygon) polygon.push(ring = []); - first = true; - v_ = false; - x_ = y_ = NaN; - } + function nest() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) { + if (sortValues != null) array.sort(sortValues); + return rollup != null ? rollup(array) : array; + } - // TODO rather than special-case polygons, simply handle them separately. - // Ideally, coincident intersection points should be jittered to avoid - // clipping issues. - function lineEnd() { - if (segments) { - linePoint(x__, y__); - if (v__ && v_) bufferStream.rejoin(); - segments.push(bufferStream.result()); - } - clipStream.point = point; - if (v_) activeStream.lineEnd(); - } + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } - function linePoint(x, y) { - var v = visible(x, y); - if (polygon) ring.push([x, y]); - if (first) { - x__ = x, y__ = y, v__ = v; - first = false; - if (v) { - activeStream.lineStart(); - activeStream.point(x, y); - } - } else { - if (v && v_) activeStream.point(x, y); - else { - var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], - b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; - if (clipLine(a, b, x0, y0, x1, y1)) { - if (!v_) { - activeStream.lineStart(); - activeStream.point(a[0], a[1]); - } - activeStream.point(b[0], b[1]); - if (!v) activeStream.lineEnd(); - clean = false; - } else if (v) { - activeStream.lineStart(); - activeStream.point(x, y); - clean = false; - } - } - } - x_ = x, y_ = y, v_ = v; - } + valuesByKey.each(function (values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); - return clipStream; - }; -} - -function extent() { - var x0 = 0, - y0 = 0, - x1 = 960, - y1 = 500, - cache, - cacheStream, - clip; - - return clip = { - stream: function(stream) { - return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); - }, - extent: function(_) { - return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; - } - }; -} - -var lengthSum = adder(), - lambda0$2, - sinPhi0$1, - cosPhi0$1; - -var lengthStream = { - sphere: noop, - point: noop, - lineStart: lengthLineStart, - lineEnd: noop, - polygonStart: noop, - polygonEnd: noop -}; - -function lengthLineStart() { - lengthStream.point = lengthPointFirst; - lengthStream.lineEnd = lengthLineEnd; -} - -function lengthLineEnd() { - lengthStream.point = lengthStream.lineEnd = noop; -} - -function lengthPointFirst(lambda, phi) { - lambda *= radians, phi *= radians; - lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi); - lengthStream.point = lengthPoint; -} - -function lengthPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var sinPhi = sin(phi), - cosPhi = cos(phi), - delta = abs(lambda - lambda0$2), - cosDelta = cos(delta), - sinDelta = sin(delta), - x = cosPhi * sinDelta, - y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, - z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; - lengthSum.add(atan2(sqrt(x * x + y * y), z)); - lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; -} - -function length(object) { - lengthSum.reset(); - geoStream(object, lengthStream); - return +lengthSum; -} - -var coordinates = [null, null], - object = {type: "LineString", coordinates: coordinates}; - -function distance(a, b) { - coordinates[0] = a; - coordinates[1] = b; - return length(object); -} - -var containsObjectType = { - Feature: function(object, point) { - return containsGeometry(object.geometry, point); - }, - FeatureCollection: function(object, point) { - var features = object.features, i = -1, n = features.length; - while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; - return false; - } -}; - -var containsGeometryType = { - Sphere: function() { - return true; - }, - Point: function(object, point) { - return containsPoint(object.coordinates, point); - }, - MultiPoint: function(object, point) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) if (containsPoint(coordinates[i], point)) return true; - return false; - }, - LineString: function(object, point) { - return containsLine(object.coordinates, point); - }, - MultiLineString: function(object, point) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) if (containsLine(coordinates[i], point)) return true; - return false; - }, - Polygon: function(object, point) { - return containsPolygon(object.coordinates, point); - }, - MultiPolygon: function(object, point) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) if (containsPolygon(coordinates[i], point)) return true; - return false; - }, - GeometryCollection: function(object, point) { - var geometries = object.geometries, i = -1, n = geometries.length; - while (++i < n) if (containsGeometry(geometries[i], point)) return true; - return false; - } -}; - -function containsGeometry(geometry, point) { - return geometry && containsGeometryType.hasOwnProperty(geometry.type) - ? containsGeometryType[geometry.type](geometry, point) - : false; -} - -function containsPoint(coordinates, point) { - return distance(coordinates, point) === 0; -} - -function containsLine(coordinates, point) { - var ao, bo, ab; - for (var i = 0, n = coordinates.length; i < n; i++) { - bo = distance(coordinates[i], point); - if (bo === 0) return true; - if (i > 0) { - ab = distance(coordinates[i], coordinates[i - 1]); - if ( - ab > 0 && - ao <= ab && - bo <= ab && - (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab - ) - return true; - } - ao = bo; - } - return false; -} - -function containsPolygon(coordinates, point) { - return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); -} - -function ringRadians(ring) { - return ring = ring.map(pointRadians), ring.pop(), ring; -} - -function pointRadians(point) { - return [point[0] * radians, point[1] * radians]; -} - -function contains(object, point) { - return (object && containsObjectType.hasOwnProperty(object.type) - ? containsObjectType[object.type] - : containsGeometry)(object, point); -} - -function graticuleX(y0, y1, dy) { - var y = d3Array.range(y0, y1 - epsilon, dy).concat(y1); - return function(x) { return y.map(function(y) { return [x, y]; }); }; -} - -function graticuleY(x0, x1, dx) { - var x = d3Array.range(x0, x1 - epsilon, dx).concat(x1); - return function(y) { return x.map(function(x) { return [x, y]; }); }; -} - -function graticule() { - var x1, x0, X1, X0, - y1, y0, Y1, Y0, - dx = 10, dy = dx, DX = 90, DY = 360, - x, y, X, Y, - precision = 2.5; - - function graticule() { - return {type: "MultiLineString", coordinates: lines()}; - } - - function lines() { - return d3Array.range(ceil(X0 / DX) * DX, X1, DX).map(X) - .concat(d3Array.range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) - .concat(d3Array.range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon; }).map(x)) - .concat(d3Array.range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon; }).map(y)); - } - - graticule.lines = function() { - return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); - }; - - graticule.outline = function() { - return { - type: "Polygon", - coordinates: [ - X(X0).concat( - Y(Y1).slice(1), - X(X1).reverse().slice(1), - Y(Y0).reverse().slice(1)) - ] - }; - }; - - graticule.extent = function(_) { - if (!arguments.length) return graticule.extentMinor(); - return graticule.extentMajor(_).extentMinor(_); - }; - - graticule.extentMajor = function(_) { - if (!arguments.length) return [[X0, Y0], [X1, Y1]]; - X0 = +_[0][0], X1 = +_[1][0]; - Y0 = +_[0][1], Y1 = +_[1][1]; - if (X0 > X1) _ = X0, X0 = X1, X1 = _; - if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; - return graticule.precision(precision); - }; - - graticule.extentMinor = function(_) { - if (!arguments.length) return [[x0, y0], [x1, y1]]; - x0 = +_[0][0], x1 = +_[1][0]; - y0 = +_[0][1], y1 = +_[1][1]; - if (x0 > x1) _ = x0, x0 = x1, x1 = _; - if (y0 > y1) _ = y0, y0 = y1, y1 = _; - return graticule.precision(precision); - }; - - graticule.step = function(_) { - if (!arguments.length) return graticule.stepMinor(); - return graticule.stepMajor(_).stepMinor(_); - }; - - graticule.stepMajor = function(_) { - if (!arguments.length) return [DX, DY]; - DX = +_[0], DY = +_[1]; - return graticule; - }; - - graticule.stepMinor = function(_) { - if (!arguments.length) return [dx, dy]; - dx = +_[0], dy = +_[1]; - return graticule; - }; - - graticule.precision = function(_) { - if (!arguments.length) return precision; - precision = +_; - x = graticuleX(y0, y1, 90); - y = graticuleY(x0, x1, precision); - X = graticuleX(Y0, Y1, 90); - Y = graticuleY(X0, X1, precision); - return graticule; - }; - - return graticule - .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) - .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); -} - -function graticule10() { - return graticule()(); -} - -function interpolate(a, b) { - var x0 = a[0] * radians, - y0 = a[1] * radians, - x1 = b[0] * radians, - y1 = b[1] * radians, - cy0 = cos(y0), - sy0 = sin(y0), - cy1 = cos(y1), - sy1 = sin(y1), - kx0 = cy0 * cos(x0), - ky0 = cy0 * sin(x0), - kx1 = cy1 * cos(x1), - ky1 = cy1 * sin(x1), - d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), - k = sin(d); - - var interpolate = d ? function(t) { - var B = sin(t *= d) / k, - A = sin(d - t) / k, - x = A * kx0 + B * kx1, - y = A * ky0 + B * ky1, - z = A * sy0 + B * sy1; - return [ - atan2(y, x) * degrees, - atan2(z, sqrt(x * x + y * y)) * degrees - ]; - } : function() { - return [x0 * degrees, y0 * degrees]; - }; - - interpolate.distance = d; - - return interpolate; -} - -function identity(x) { - return x; -} - -var areaSum$1 = adder(), - areaRingSum$1 = adder(), - x00, - y00, - x0$1, - y0$1; - -var areaStream$1 = { - point: noop, - lineStart: noop, - lineEnd: noop, - polygonStart: function() { - areaStream$1.lineStart = areaRingStart$1; - areaStream$1.lineEnd = areaRingEnd$1; - }, - polygonEnd: function() { - areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop; - areaSum$1.add(abs(areaRingSum$1)); - areaRingSum$1.reset(); - }, - result: function() { - var area = areaSum$1 / 2; - areaSum$1.reset(); - return area; - } -}; - -function areaRingStart$1() { - areaStream$1.point = areaPointFirst$1; -} - -function areaPointFirst$1(x, y) { - areaStream$1.point = areaPoint$1; - x00 = x0$1 = x, y00 = y0$1 = y; -} - -function areaPoint$1(x, y) { - areaRingSum$1.add(y0$1 * x - x0$1 * y); - x0$1 = x, y0$1 = y; -} - -function areaRingEnd$1() { - areaPoint$1(x00, y00); -} - -var x0$2 = Infinity, - y0$2 = x0$2, - x1 = -x0$2, - y1 = x1; - -var boundsStream$1 = { - point: boundsPoint$1, - lineStart: noop, - lineEnd: noop, - polygonStart: noop, - polygonEnd: noop, - result: function() { - var bounds = [[x0$2, y0$2], [x1, y1]]; - x1 = y1 = -(y0$2 = x0$2 = Infinity); - return bounds; - } -}; - -function boundsPoint$1(x, y) { - if (x < x0$2) x0$2 = x; - if (x > x1) x1 = x; - if (y < y0$2) y0$2 = y; - if (y > y1) y1 = y; -} + return result; + } -// TODO Enforce positive area for exterior, negative area for interior? + function entries(map$$1, depth) { + if (++depth > keys.length) return map$$1; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) array = map$$1.entries(); + else array = [], map$$1.each(function (v, k) { + array.push({key: k, values: entries(v, depth)}); + }); + return sortKey != null ? array.sort(function (a, b) { + return sortKey(a.key, b.key); + }) : array; + } -var X0$1 = 0, - Y0$1 = 0, - Z0$1 = 0, - X1$1 = 0, - Y1$1 = 0, - Z1$1 = 0, - X2$1 = 0, - Y2$1 = 0, - Z2$1 = 0, - x00$1, - y00$1, - x0$3, - y0$3; - -var centroidStream$1 = { - point: centroidPoint$1, - lineStart: centroidLineStart$1, - lineEnd: centroidLineEnd$1, - polygonStart: function() { - centroidStream$1.lineStart = centroidRingStart$1; - centroidStream$1.lineEnd = centroidRingEnd$1; - }, - polygonEnd: function() { - centroidStream$1.point = centroidPoint$1; - centroidStream$1.lineStart = centroidLineStart$1; - centroidStream$1.lineEnd = centroidLineEnd$1; - }, - result: function() { - var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] - : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] - : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] - : [NaN, NaN]; - X0$1 = Y0$1 = Z0$1 = - X1$1 = Y1$1 = Z1$1 = - X2$1 = Y2$1 = Z2$1 = 0; - return centroid; - } -}; - -function centroidPoint$1(x, y) { - X0$1 += x; - Y0$1 += y; - ++Z0$1; -} - -function centroidLineStart$1() { - centroidStream$1.point = centroidPointFirstLine; -} - -function centroidPointFirstLine(x, y) { - centroidStream$1.point = centroidPointLine; - centroidPoint$1(x0$3 = x, y0$3 = y); -} - -function centroidPointLine(x, y) { - var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); - X1$1 += z * (x0$3 + x) / 2; - Y1$1 += z * (y0$3 + y) / 2; - Z1$1 += z; - centroidPoint$1(x0$3 = x, y0$3 = y); -} - -function centroidLineEnd$1() { - centroidStream$1.point = centroidPoint$1; -} - -function centroidRingStart$1() { - centroidStream$1.point = centroidPointFirstRing; -} - -function centroidRingEnd$1() { - centroidPointRing(x00$1, y00$1); -} - -function centroidPointFirstRing(x, y) { - centroidStream$1.point = centroidPointRing; - centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); -} - -function centroidPointRing(x, y) { - var dx = x - x0$3, - dy = y - y0$3, - z = sqrt(dx * dx + dy * dy); - - X1$1 += z * (x0$3 + x) / 2; - Y1$1 += z * (y0$3 + y) / 2; - Z1$1 += z; - - z = y0$3 * x - x0$3 * y; - X2$1 += z * (x0$3 + x); - Y2$1 += z * (y0$3 + y); - Z2$1 += z * 3; - centroidPoint$1(x0$3 = x, y0$3 = y); -} - -function PathContext(context) { - this._context = context; -} - -PathContext.prototype = { - _radius: 4.5, - pointRadius: function(_) { - return this._radius = _, this; - }, - polygonStart: function() { - this._line = 0; - }, - polygonEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._line === 0) this._context.closePath(); - this._point = NaN; - }, - point: function(x, y) { - switch (this._point) { - case 0: { - this._context.moveTo(x, y); - this._point = 1; - break; - } - case 1: { - this._context.lineTo(x, y); - break; - } - default: { - this._context.moveTo(x + this._radius, y); - this._context.arc(x, y, this._radius, 0, tau); - break; - } - } - }, - result: noop -}; - -var lengthSum$1 = adder(), - lengthRing, - x00$2, - y00$2, - x0$4, - y0$4; - -var lengthStream$1 = { - point: noop, - lineStart: function() { - lengthStream$1.point = lengthPointFirst$1; - }, - lineEnd: function() { - if (lengthRing) lengthPoint$1(x00$2, y00$2); - lengthStream$1.point = noop; - }, - polygonStart: function() { - lengthRing = true; - }, - polygonEnd: function() { - lengthRing = null; - }, - result: function() { - var length = +lengthSum$1; - lengthSum$1.reset(); - return length; - } -}; - -function lengthPointFirst$1(x, y) { - lengthStream$1.point = lengthPoint$1; - x00$2 = x0$4 = x, y00$2 = y0$4 = y; -} - -function lengthPoint$1(x, y) { - x0$4 -= x, y0$4 -= y; - lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); - x0$4 = x, y0$4 = y; -} - -function PathString() { - this._string = []; -} - -PathString.prototype = { - _radius: 4.5, - _circle: circle$1(4.5), - pointRadius: function(_) { - if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; - return this; - }, - polygonStart: function() { - this._line = 0; - }, - polygonEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._line === 0) this._string.push("Z"); - this._point = NaN; - }, - point: function(x, y) { - switch (this._point) { - case 0: { - this._string.push("M", x, ",", y); - this._point = 1; - break; - } - case 1: { - this._string.push("L", x, ",", y); - break; - } - default: { - if (this._circle == null) this._circle = circle$1(this._radius); - this._string.push("M", x, ",", y, this._circle); - break; - } - } - }, - result: function() { - if (this._string.length) { - var result = this._string.join(""); - this._string = []; - return result; - } else { - return null; - } - } -}; - -function circle$1(radius) { - return "m0," + radius - + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius - + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius - + "z"; -} - -function index(projection, context) { - var pointRadius = 4.5, - projectionStream, - contextStream; - - function path(object) { - if (object) { - if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); - geoStream(object, projectionStream(contextStream)); - } - return contextStream.result(); - } - - path.area = function(object) { - geoStream(object, projectionStream(areaStream$1)); - return areaStream$1.result(); - }; - - path.measure = function(object) { - geoStream(object, projectionStream(lengthStream$1)); - return lengthStream$1.result(); - }; - - path.bounds = function(object) { - geoStream(object, projectionStream(boundsStream$1)); - return boundsStream$1.result(); - }; - - path.centroid = function(object) { - geoStream(object, projectionStream(centroidStream$1)); - return centroidStream$1.result(); - }; - - path.projection = function(_) { - return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; - }; - - path.context = function(_) { - if (!arguments.length) return context; - contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); - if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); - return path; - }; - - path.pointRadius = function(_) { - if (!arguments.length) return pointRadius; - pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); - return path; - }; - - return path.projection(projection).context(context); -} - -function transform(methods) { - return { - stream: transformer(methods) - }; -} - -function transformer(methods) { - return function(stream) { - var s = new TransformStream; - for (var key in methods) s[key] = methods[key]; - s.stream = stream; - return s; - }; -} - -function TransformStream() {} - -TransformStream.prototype = { - constructor: TransformStream, - point: function(x, y) { this.stream.point(x, y); }, - sphere: function() { this.stream.sphere(); }, - lineStart: function() { this.stream.lineStart(); }, - lineEnd: function() { this.stream.lineEnd(); }, - polygonStart: function() { this.stream.polygonStart(); }, - polygonEnd: function() { this.stream.polygonEnd(); } -}; - -function fit(projection, fitBounds, object) { - var clip = projection.clipExtent && projection.clipExtent(); - projection.scale(150).translate([0, 0]); - if (clip != null) projection.clipExtent(null); - geoStream(object, projection.stream(boundsStream$1)); - fitBounds(boundsStream$1.result()); - if (clip != null) projection.clipExtent(clip); - return projection; -} - -function fitExtent(projection, extent, object) { - return fit(projection, function(b) { - var w = extent[1][0] - extent[0][0], - h = extent[1][1] - extent[0][1], - k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), - x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, - y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; - projection.scale(150 * k).translate([x, y]); - }, object); -} - -function fitSize(projection, size, object) { - return fitExtent(projection, [[0, 0], size], object); -} - -function fitWidth(projection, width, object) { - return fit(projection, function(b) { - var w = +width, - k = w / (b[1][0] - b[0][0]), - x = (w - k * (b[1][0] + b[0][0])) / 2, - y = -k * b[0][1]; - projection.scale(150 * k).translate([x, y]); - }, object); -} - -function fitHeight(projection, height, object) { - return fit(projection, function(b) { - var h = +height, - k = h / (b[1][1] - b[0][1]), - x = -k * b[0][0], - y = (h - k * (b[1][1] + b[0][1])) / 2; - projection.scale(150 * k).translate([x, y]); - }, object); -} - -var maxDepth = 16, // maximum depth of subdivision - cosMinDistance = cos(30 * radians); // cos(minimum angular distance) - -function resample(project, delta2) { - return +delta2 ? resample$1(project, delta2) : resampleNone(project); -} - -function resampleNone(project) { - return transformer({ - point: function(x, y) { - x = project(x, y); - this.stream.point(x[0], x[1]); - } - }); -} - -function resample$1(project, delta2) { - - function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { - var dx = x1 - x0, - dy = y1 - y0, - d2 = dx * dx + dy * dy; - if (d2 > 4 * delta2 && depth--) { - var a = a0 + a1, - b = b0 + b1, - c = c0 + c1, - m = sqrt(a * a + b * b + c * c), - phi2 = asin(c /= m), - lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), - p = project(lambda2, phi2), - x2 = p[0], - y2 = p[1], - dx2 = x2 - x0, - dy2 = y2 - y0, - dz = dy * dx2 - dx * dy2; - if (dz * dz / d2 > delta2 // perpendicular projected distance - || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end - || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance - resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); - stream.point(x2, y2); - resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); - } - } - } - return function(stream) { - var lambda00, x00, y00, a00, b00, c00, // first point - lambda0, x0, y0, a0, b0, c0; // previous point - - var resampleStream = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, - polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } - }; - - function point(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); - } + return nest = { + object: function (array) { + return apply(array, 0, createObject, setObject); + }, + map: function (array) { + return apply(array, 0, createMap, setMap); + }, + entries: function (array) { + return entries(apply(array, 0, createMap, setMap), 0); + }, + key: function (d) { + keys.push(d); + return nest; + }, + sortKeys: function (order) { + sortKeys[keys.length - 1] = order; + return nest; + }, + sortValues: function (order) { + sortValues = order; + return nest; + }, + rollup: function (f) { + rollup = f; + return nest; + } + }; + } - function lineStart() { - x0 = NaN; - resampleStream.point = linePoint; - stream.lineStart(); - } + function createObject() { + return {}; + } - function linePoint(lambda, phi) { - var c = cartesian([lambda, phi]), p = project(lambda, phi); - resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); - stream.point(x0, y0); - } + function setObject(object, key, value) { + object[key] = value; + } - function lineEnd() { - resampleStream.point = point; - stream.lineEnd(); - } + function createMap() { + return map(); + } - function ringStart() { - lineStart(); - resampleStream.point = ringPoint; - resampleStream.lineEnd = ringEnd; - } + function setMap(map$$1, key, value) { + map$$1.set(key, value); + } - function ringPoint(lambda, phi) { - linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; - resampleStream.point = linePoint; - } + function Set() { + } - function ringEnd() { - resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); - resampleStream.lineEnd = lineEnd; - lineEnd(); - } + var proto = map.prototype; + + Set.prototype = set.prototype = { + constructor: Set, + has: proto.has, + add: function (value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each + }; + + function set(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) object.each(function (value) { + set.add(value); + }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) while (++i < n) set.add(object[i]); + else while (++i < n) set.add(f(object[i], i, object)); + } - return resampleStream; - }; -} - -var transformRadians = transformer({ - point: function(x, y) { - this.stream.point(x * radians, y * radians); - } -}); - -function transformRotate(rotate) { - return transformer({ - point: function(x, y) { - var r = rotate(x, y); - return this.stream.point(r[0], r[1]); - } - }); -} - -function scaleTranslate(k, dx, dy) { - function transform(x, y) { - return [dx + k * x, dy - k * y]; - } - transform.invert = function(x, y) { - return [(x - dx) / k, (dy - y) / k]; - }; - return transform; -} - -function scaleTranslateRotate(k, dx, dy, alpha) { - var cosAlpha = cos(alpha), - sinAlpha = sin(alpha), - a = cosAlpha * k, - b = sinAlpha * k, - ai = cosAlpha / k, - bi = sinAlpha / k, - ci = (sinAlpha * dy - cosAlpha * dx) / k, - fi = (sinAlpha * dx + cosAlpha * dy) / k; - function transform(x, y) { - return [a * x - b * y + dx, dy - b * x - a * y]; - } - transform.invert = function(x, y) { - return [ai * x - bi * y + ci, fi - bi * x - ai * y]; - }; - return transform; -} - -function projection(project) { - return projectionMutator(function() { return project; })(); -} - -function projectionMutator(projectAt) { - var project, - k = 150, // scale - x = 480, y = 250, // translate - lambda = 0, phi = 0, // center - deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate - alpha = 0, // post-rotate - theta = null, preclip = clipAntimeridian, // pre-clip angle - x0 = null, y0, x1, y1, postclip = identity, // post-clip extent - delta2 = 0.5, // precision - projectResample, - projectTransform, - projectRotateTransform, - cache, - cacheStream; - - function projection(point) { - return projectRotateTransform(point[0] * radians, point[1] * radians); - } - - function invert(point) { - point = projectRotateTransform.invert(point[0], point[1]); - return point && [point[0] * degrees, point[1] * degrees]; - } - - projection.stream = function(stream) { - return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); - }; - - projection.preclip = function(_) { - return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; - }; - - projection.postclip = function(_) { - return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; - }; - - projection.clipAngle = function(_) { - return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; - }; - - projection.clipExtent = function(_) { - return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }; - - projection.scale = function(_) { - return arguments.length ? (k = +_, recenter()) : k; - }; - - projection.translate = function(_) { - return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; - }; - - projection.center = function(_) { - return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; - }; - - projection.rotate = function(_) { - return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; - }; - - projection.angle = function(_) { - return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; - }; - - projection.precision = function(_) { - return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); - }; - - projection.fitExtent = function(extent, object) { - return fitExtent(projection, extent, object); - }; - - projection.fitSize = function(size, object) { - return fitSize(projection, size, object); - }; - - projection.fitWidth = function(width, object) { - return fitWidth(projection, width, object); - }; - - projection.fitHeight = function(height, object) { - return fitHeight(projection, height, object); - }; - - function recenter() { - var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)), - transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha); - rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); - projectTransform = compose(project, transform); - projectRotateTransform = compose(rotate, projectTransform); - projectResample = resample(projectTransform, delta2); - return reset(); - } - - function reset() { - cache = cacheStream = null; - return projection; - } - - return function() { - project = projectAt.apply(this, arguments); - projection.invert = project.invert && invert; - return recenter(); - }; -} - -function conicProjection(projectAt) { - var phi0 = 0, - phi1 = pi / 3, - m = projectionMutator(projectAt), - p = m(phi0, phi1); - - p.parallels = function(_) { - return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; - }; - - return p; -} - -function cylindricalEqualAreaRaw(phi0) { - var cosPhi0 = cos(phi0); - - function forward(lambda, phi) { - return [lambda * cosPhi0, sin(phi) / cosPhi0]; - } - - forward.invert = function(x, y) { - return [x / cosPhi0, asin(y * cosPhi0)]; - }; - - return forward; -} - -function conicEqualAreaRaw(y0, y1) { - var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; - - // Are the parallels symmetrical around the Equator? - if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); - - var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; - - function project(x, y) { - var r = sqrt(c - 2 * n * sin(y)) / n; - return [r * sin(x *= n), r0 - r * cos(x)]; - } - - project.invert = function(x, y) { - var r0y = r0 - y; - return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; - }; - - return project; -} - -function conicEqualArea() { - return conicProjection(conicEqualAreaRaw) - .scale(155.424) - .center([0, 33.6442]); -} - -function albers() { - return conicEqualArea() - .parallels([29.5, 45.5]) - .scale(1070) - .translate([480, 250]) - .rotate([96, 0]) - .center([-0.6, 38.7]); -} + return set; + } -// The projections must have mutually exclusive clip regions on the sphere, -// as this will avoid emitting interleaving lines and polygons. -function multiplex(streams) { - var n = streams.length; - return { - point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, - sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, - lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, - lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, - polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, - polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } - }; -} + function keys(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; + } -// A composite projection for the United States, configured by default for -// 960×500. The projection also works quite well at 960×600 if you change the -// scale to 1285 and adjust the translate accordingly. The set of standard -// parallels for each region comes from USGS, which is published here: -// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers -function albersUsa() { - var cache, - cacheStream, - lower48 = albers(), lower48Point, - alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 - hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 - point, pointStream = {point: function(x, y) { point = [x, y]; }}; - - function albersUsa(coordinates) { - var x = coordinates[0], y = coordinates[1]; - return point = null, - (lower48Point.point(x, y), point) - || (alaskaPoint.point(x, y), point) - || (hawaiiPoint.point(x, y), point); - } - - albersUsa.invert = function(coordinates) { - var k = lower48.scale(), - t = lower48.translate(), - x = (coordinates[0] - t[0]) / k, - y = (coordinates[1] - t[1]) / k; - return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska - : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii - : lower48).invert(coordinates); - }; - - albersUsa.stream = function(stream) { - return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); - }; - - albersUsa.precision = function(_) { - if (!arguments.length) return lower48.precision(); - lower48.precision(_), alaska.precision(_), hawaii.precision(_); - return reset(); - }; - - albersUsa.scale = function(_) { - if (!arguments.length) return lower48.scale(); - lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); - return albersUsa.translate(lower48.translate()); - }; - - albersUsa.translate = function(_) { - if (!arguments.length) return lower48.translate(); - var k = lower48.scale(), x = +_[0], y = +_[1]; - - lower48Point = lower48 - .translate(_) - .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) - .stream(pointStream); - - alaskaPoint = alaska - .translate([x - 0.307 * k, y + 0.201 * k]) - .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) - .stream(pointStream); - - hawaiiPoint = hawaii - .translate([x - 0.205 * k, y + 0.212 * k]) - .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) - .stream(pointStream); - - return reset(); - }; - - albersUsa.fitExtent = function(extent, object) { - return fitExtent(albersUsa, extent, object); - }; - - albersUsa.fitSize = function(size, object) { - return fitSize(albersUsa, size, object); - }; - - albersUsa.fitWidth = function(width, object) { - return fitWidth(albersUsa, width, object); - }; - - albersUsa.fitHeight = function(height, object) { - return fitHeight(albersUsa, height, object); - }; - - function reset() { - cache = cacheStream = null; - return albersUsa; - } - - return albersUsa.scale(1070); -} - -function azimuthalRaw(scale) { - return function(x, y) { - var cx = cos(x), - cy = cos(y), - k = scale(cx * cy); - return [ - k * cy * sin(x), - k * sin(y) - ]; - } -} - -function azimuthalInvert(angle) { - return function(x, y) { - var z = sqrt(x * x + y * y), - c = angle(z), - sc = sin(c), - cc = cos(c); - return [ - atan2(x * sc, z * cc), - asin(z && y * sc / z) - ]; - } -} - -var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { - return sqrt(2 / (1 + cxcy)); -}); - -azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { - return 2 * asin(z / 2); -}); - -function azimuthalEqualArea() { - return projection(azimuthalEqualAreaRaw) - .scale(124.75) - .clipAngle(180 - 1e-3); -} - -var azimuthalEquidistantRaw = azimuthalRaw(function(c) { - return (c = acos(c)) && c / sin(c); -}); - -azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { - return z; -}); - -function azimuthalEquidistant() { - return projection(azimuthalEquidistantRaw) - .scale(79.4188) - .clipAngle(180 - 1e-3); -} - -function mercatorRaw(lambda, phi) { - return [lambda, log(tan((halfPi + phi) / 2))]; -} - -mercatorRaw.invert = function(x, y) { - return [x, 2 * atan(exp(y)) - halfPi]; -}; - -function mercator() { - return mercatorProjection(mercatorRaw) - .scale(961 / tau); -} - -function mercatorProjection(project) { - var m = projection(project), - center = m.center, - scale = m.scale, - translate = m.translate, - clipExtent = m.clipExtent, - x0 = null, y0, x1, y1; // clip extent - - m.scale = function(_) { - return arguments.length ? (scale(_), reclip()) : scale(); - }; - - m.translate = function(_) { - return arguments.length ? (translate(_), reclip()) : translate(); - }; - - m.center = function(_) { - return arguments.length ? (center(_), reclip()) : center(); - }; - - m.clipExtent = function(_) { - return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }; - - function reclip() { - var k = pi * scale(), - t = m(rotation(m.rotate()).invert([0, 0])); - return clipExtent(x0 == null - ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw - ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] - : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); - } - - return reclip(); -} - -function tany(y) { - return tan((halfPi + y) / 2); -} - -function conicConformalRaw(y0, y1) { - var cy0 = cos(y0), - n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), - f = cy0 * pow(tany(y0), n) / n; - - if (!n) return mercatorRaw; - - function project(x, y) { - if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; } - else { if (y > halfPi - epsilon) y = halfPi - epsilon; } - var r = f / pow(tany(y), n); - return [r * sin(n * x), f - r * cos(n * x)]; - } - - project.invert = function(x, y) { - var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy); - return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi]; - }; - - return project; -} - -function conicConformal() { - return conicProjection(conicConformalRaw) - .scale(109.5) - .parallels([30, 30]); -} - -function equirectangularRaw(lambda, phi) { - return [lambda, phi]; -} - -equirectangularRaw.invert = equirectangularRaw; - -function equirectangular() { - return projection(equirectangularRaw) - .scale(152.63); -} - -function conicEquidistantRaw(y0, y1) { - var cy0 = cos(y0), - n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0), - g = cy0 / n + y0; - - if (abs(n) < epsilon) return equirectangularRaw; - - function project(x, y) { - var gy = g - y, nx = n * x; - return [gy * sin(nx), g - gy * cos(nx)]; - } - - project.invert = function(x, y) { - var gy = g - y; - return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)]; - }; - - return project; -} - -function conicEquidistant() { - return conicProjection(conicEquidistantRaw) - .scale(131.154) - .center([0, 13.9389]); -} - -var A1 = 1.340264, - A2 = -0.081106, - A3 = 0.000893, - A4 = 0.003796, - M = sqrt(3) / 2, - iterations = 12; - -function equalEarthRaw(lambda, phi) { - var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2; - return [ - lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), - l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - ]; -} - -equalEarthRaw.invert = function(x, y) { - var l = y, l2 = l * l, l6 = l2 * l2 * l2; - for (var i = 0, delta, fy, fpy; i < iterations; ++i) { - fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; - fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); - l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; - if (abs(delta) < epsilon2) break; - } - return [ - M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l), - asin(sin(l) / M) - ]; -}; - -function equalEarth() { - return projection(equalEarthRaw) - .scale(177.158); -} - -function gnomonicRaw(x, y) { - var cy = cos(y), k = cos(x) * cy; - return [cy * sin(x) / k, sin(y) / k]; -} - -gnomonicRaw.invert = azimuthalInvert(atan); - -function gnomonic() { - return projection(gnomonicRaw) - .scale(144.049) - .clipAngle(60); -} - -function scaleTranslate$1(kx, ky, tx, ty) { - return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity : transformer({ - point: function(x, y) { - this.stream.point(x * kx + tx, y * ky + ty); - } - }); -} - -function identity$1() { - var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity, // scale, translate and reflect - x0 = null, y0, x1, y1, // clip extent - postclip = identity, - cache, - cacheStream, - projection; - - function reset() { - cache = cacheStream = null; - return projection; - } - - return projection = { - stream: function(stream) { - return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); - }, - postclip: function(_) { - return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; - }, - clipExtent: function(_) { - return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }, - scale: function(_) { - return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k; - }, - translate: function(_) { - return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty]; - }, - reflectX: function(_) { - return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0; - }, - reflectY: function(_) { - return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0; - }, - fitExtent: function(extent, object) { - return fitExtent(projection, extent, object); - }, - fitSize: function(size, object) { - return fitSize(projection, size, object); - }, - fitWidth: function(width, object) { - return fitWidth(projection, width, object); - }, - fitHeight: function(height, object) { - return fitHeight(projection, height, object); - } - }; -} - -function naturalEarth1Raw(lambda, phi) { - var phi2 = phi * phi, phi4 = phi2 * phi2; - return [ - lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), - phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - ]; -} - -naturalEarth1Raw.invert = function(x, y) { - var phi = y, i = 25, delta; - do { - var phi2 = phi * phi, phi4 = phi2 * phi2; - phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / - (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); - } while (abs(delta) > epsilon && --i > 0); - return [ - x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), - phi - ]; -}; - -function naturalEarth1() { - return projection(naturalEarth1Raw) - .scale(175.295); -} - -function orthographicRaw(x, y) { - return [cos(y) * sin(x), sin(y)]; -} - -orthographicRaw.invert = azimuthalInvert(asin); - -function orthographic() { - return projection(orthographicRaw) - .scale(249.5) - .clipAngle(90 + epsilon); -} - -function stereographicRaw(x, y) { - var cy = cos(y), k = 1 + cos(x) * cy; - return [cy * sin(x) / k, sin(y) / k]; -} - -stereographicRaw.invert = azimuthalInvert(function(z) { - return 2 * atan(z); -}); - -function stereographic() { - return projection(stereographicRaw) - .scale(250) - .clipAngle(142); -} - -function transverseMercatorRaw(lambda, phi) { - return [log(tan((halfPi + phi) / 2)), -lambda]; -} - -transverseMercatorRaw.invert = function(x, y) { - return [-y, 2 * atan(exp(x)) - halfPi]; -}; - -function transverseMercator() { - var m = mercatorProjection(transverseMercatorRaw), - center = m.center, - rotate = m.rotate; - - m.center = function(_) { - return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); - }; - - m.rotate = function(_) { - return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); - }; - - return rotate([0, 0, 90]) - .scale(159.155); -} - -exports.geoAlbers = albers; -exports.geoAlbersUsa = albersUsa; -exports.geoArea = area; -exports.geoAzimuthalEqualArea = azimuthalEqualArea; -exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; -exports.geoAzimuthalEquidistant = azimuthalEquidistant; -exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; -exports.geoBounds = bounds; -exports.geoCentroid = centroid; -exports.geoCircle = circle; -exports.geoClipAntimeridian = clipAntimeridian; -exports.geoClipCircle = clipCircle; -exports.geoClipExtent = extent; -exports.geoClipRectangle = clipRectangle; -exports.geoConicConformal = conicConformal; -exports.geoConicConformalRaw = conicConformalRaw; -exports.geoConicEqualArea = conicEqualArea; -exports.geoConicEqualAreaRaw = conicEqualAreaRaw; -exports.geoConicEquidistant = conicEquidistant; -exports.geoConicEquidistantRaw = conicEquidistantRaw; -exports.geoContains = contains; -exports.geoDistance = distance; -exports.geoEqualEarth = equalEarth; -exports.geoEqualEarthRaw = equalEarthRaw; -exports.geoEquirectangular = equirectangular; -exports.geoEquirectangularRaw = equirectangularRaw; -exports.geoGnomonic = gnomonic; -exports.geoGnomonicRaw = gnomonicRaw; -exports.geoGraticule = graticule; -exports.geoGraticule10 = graticule10; -exports.geoIdentity = identity$1; -exports.geoInterpolate = interpolate; -exports.geoLength = length; -exports.geoMercator = mercator; -exports.geoMercatorRaw = mercatorRaw; -exports.geoNaturalEarth1 = naturalEarth1; -exports.geoNaturalEarth1Raw = naturalEarth1Raw; -exports.geoOrthographic = orthographic; -exports.geoOrthographicRaw = orthographicRaw; -exports.geoPath = index; -exports.geoProjection = projection; -exports.geoProjectionMutator = projectionMutator; -exports.geoRotation = rotation; -exports.geoStereographic = stereographic; -exports.geoStereographicRaw = stereographicRaw; -exports.geoStream = geoStream; -exports.geoTransform = transform; -exports.geoTransverseMercator = transverseMercator; -exports.geoTransverseMercatorRaw = transverseMercatorRaw; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{"d3-array":8}],23:[function(require,module,exports){ -// https://d3js.org/d3-hierarchy/ v1.1.9 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -function defaultSeparation(a, b) { - return a.parent === b.parent ? 1 : 2; -} - -function meanX(children) { - return children.reduce(meanXReduce, 0) / children.length; -} - -function meanXReduce(x, c) { - return x + c.x; -} - -function maxY(children) { - return 1 + children.reduce(maxYReduce, 0); -} - -function maxYReduce(y, c) { - return Math.max(y, c.y); -} - -function leafLeft(node) { - var children; - while (children = node.children) node = children[0]; - return node; -} - -function leafRight(node) { - var children; - while (children = node.children) node = children[children.length - 1]; - return node; -} - -function cluster() { - var separation = defaultSeparation, - dx = 1, - dy = 1, - nodeSize = false; - - function cluster(root) { - var previousNode, - x = 0; - - // First walk, computing the initial x & y values. - root.eachAfter(function(node) { - var children = node.children; - if (children) { - node.x = meanX(children); - node.y = maxY(children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - var left = leafLeft(root), - right = leafRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - return root.eachAfter(nodeSize ? function(node) { - node.x = (node.x - root.x) * dx; - node.y = (root.y - node.y) * dy; - } : function(node) { - node.x = (node.x - x0) / (x1 - x0) * dx; - node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; - }); - } - - cluster.separation = function(x) { - return arguments.length ? (separation = x, cluster) : separation; - }; - - cluster.size = function(x) { - return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); - }; - - cluster.nodeSize = function(x) { - return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); - }; - - return cluster; -} - -function count(node) { - var sum = 0, - children = node.children, - i = children && children.length; - if (!i) sum = 1; - else while (--i >= 0) sum += children[i].value; - node.value = sum; -} - -function node_count() { - return this.eachAfter(count); -} - -function node_each(callback) { - var node = this, current, next = [node], children, i, n; - do { - current = next.reverse(), next = []; - while (node = current.pop()) { - callback(node), children = node.children; - if (children) for (i = 0, n = children.length; i < n; ++i) { - next.push(children[i]); - } - } - } while (next.length); - return this; -} - -function node_eachBefore(callback) { - var node = this, nodes = [node], children, i; - while (node = nodes.pop()) { - callback(node), children = node.children; - if (children) for (i = children.length - 1; i >= 0; --i) { - nodes.push(children[i]); - } - } - return this; -} - -function node_eachAfter(callback) { - var node = this, nodes = [node], next = [], children, i, n; - while (node = nodes.pop()) { - next.push(node), children = node.children; - if (children) for (i = 0, n = children.length; i < n; ++i) { - nodes.push(children[i]); - } - } - while (node = next.pop()) { - callback(node); - } - return this; -} - -function node_sum(value) { - return this.eachAfter(function(node) { - var sum = +value(node.data) || 0, - children = node.children, - i = children && children.length; - while (--i >= 0) sum += children[i].value; - node.value = sum; - }); -} - -function node_sort(compare) { - return this.eachBefore(function(node) { - if (node.children) { - node.children.sort(compare); - } - }); -} - -function node_path(end) { - var start = this, - ancestor = leastCommonAncestor(start, end), - nodes = [start]; - while (start !== ancestor) { - start = start.parent; - nodes.push(start); - } - var k = nodes.length; - while (end !== ancestor) { - nodes.splice(k, 0, end); - end = end.parent; - } - return nodes; -} - -function leastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = a.ancestors(), - bNodes = b.ancestors(), - c = null; - a = aNodes.pop(); - b = bNodes.pop(); - while (a === b) { - c = a; - a = aNodes.pop(); - b = bNodes.pop(); - } - return c; -} - -function node_ancestors() { - var node = this, nodes = [node]; - while (node = node.parent) { - nodes.push(node); - } - return nodes; -} - -function node_descendants() { - var nodes = []; - this.each(function(node) { - nodes.push(node); - }); - return nodes; -} - -function node_leaves() { - var leaves = []; - this.eachBefore(function(node) { - if (!node.children) { - leaves.push(node); - } - }); - return leaves; -} - -function node_links() { - var root = this, links = []; - root.each(function(node) { - if (node !== root) { // Don’t include the root’s parent, if any. - links.push({source: node.parent, target: node}); - } - }); - return links; -} - -function hierarchy(data, children) { - var root = new Node(data), - valued = +data.value && (root.value = data.value), - node, - nodes = [root], - child, - childs, - i, - n; - - if (children == null) children = defaultChildren; - - while (node = nodes.pop()) { - if (valued) node.value = +node.data.value; - if ((childs = children(node.data)) && (n = childs.length)) { - node.children = new Array(n); - for (i = n - 1; i >= 0; --i) { - nodes.push(child = node.children[i] = new Node(childs[i])); - child.parent = node; - child.depth = node.depth + 1; - } - } - } - - return root.eachBefore(computeHeight); -} - -function node_copy() { - return hierarchy(this).eachBefore(copyData); -} - -function defaultChildren(d) { - return d.children; -} - -function copyData(node) { - node.data = node.data.data; -} - -function computeHeight(node) { - var height = 0; - do node.height = height; - while ((node = node.parent) && (node.height < ++height)); -} - -function Node(data) { - this.data = data; - this.depth = - this.height = 0; - this.parent = null; -} - -Node.prototype = hierarchy.prototype = { - constructor: Node, - count: node_count, - each: node_each, - eachAfter: node_eachAfter, - eachBefore: node_eachBefore, - sum: node_sum, - sort: node_sort, - path: node_path, - ancestors: node_ancestors, - descendants: node_descendants, - leaves: node_leaves, - links: node_links, - copy: node_copy -}; - -var slice = Array.prototype.slice; - -function shuffle(array) { - var m = array.length, - t, - i; - - while (m) { - i = Math.random() * m-- | 0; - t = array[m]; - array[m] = array[i]; - array[i] = t; - } - - return array; -} - -function enclose(circles) { - var i = 0, n = (circles = shuffle(slice.call(circles))).length, B = [], p, e; - - while (i < n) { - p = circles[i]; - if (e && enclosesWeak(e, p)) ++i; - else e = encloseBasis(B = extendBasis(B, p)), i = 0; - } - - return e; -} - -function extendBasis(B, p) { - var i, j; - - if (enclosesWeakAll(p, B)) return [p]; - - // If we get here then B must have at least one element. - for (i = 0; i < B.length; ++i) { - if (enclosesNot(p, B[i]) - && enclosesWeakAll(encloseBasis2(B[i], p), B)) { - return [B[i], p]; - } - } - - // If we get here then B must have at least two elements. - for (i = 0; i < B.length - 1; ++i) { - for (j = i + 1; j < B.length; ++j) { - if (enclosesNot(encloseBasis2(B[i], B[j]), p) - && enclosesNot(encloseBasis2(B[i], p), B[j]) - && enclosesNot(encloseBasis2(B[j], p), B[i]) - && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { - return [B[i], B[j], p]; - } - } - } - - // If we get here then something is very wrong. - throw new Error; -} - -function enclosesNot(a, b) { - var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; - return dr < 0 || dr * dr < dx * dx + dy * dy; -} - -function enclosesWeak(a, b) { - var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y; - return dr > 0 && dr * dr > dx * dx + dy * dy; -} - -function enclosesWeakAll(a, B) { - for (var i = 0; i < B.length; ++i) { - if (!enclosesWeak(a, B[i])) { - return false; - } - } - return true; -} - -function encloseBasis(B) { - switch (B.length) { - case 1: return encloseBasis1(B[0]); - case 2: return encloseBasis2(B[0], B[1]); - case 3: return encloseBasis3(B[0], B[1], B[2]); - } -} - -function encloseBasis1(a) { - return { - x: a.x, - y: a.y, - r: a.r - }; -} - -function encloseBasis2(a, b) { - var x1 = a.x, y1 = a.y, r1 = a.r, - x2 = b.x, y2 = b.y, r2 = b.r, - x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, - l = Math.sqrt(x21 * x21 + y21 * y21); - return { - x: (x1 + x2 + x21 / l * r21) / 2, - y: (y1 + y2 + y21 / l * r21) / 2, - r: (l + r1 + r2) / 2 - }; -} - -function encloseBasis3(a, b, c) { - var x1 = a.x, y1 = a.y, r1 = a.r, - x2 = b.x, y2 = b.y, r2 = b.r, - x3 = c.x, y3 = c.y, r3 = c.r, - a2 = x1 - x2, - a3 = x1 - x3, - b2 = y1 - y2, - b3 = y1 - y3, - c2 = r2 - r1, - c3 = r3 - r1, - d1 = x1 * x1 + y1 * y1 - r1 * r1, - d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, - d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, - ab = a3 * b2 - a2 * b3, - xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, - xb = (b3 * c2 - b2 * c3) / ab, - ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, - yb = (a2 * c3 - a3 * c2) / ab, - A = xb * xb + yb * yb - 1, - B = 2 * (r1 + xa * xb + ya * yb), - C = xa * xa + ya * ya - r1 * r1, - r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); - return { - x: x1 + xa + xb * r, - y: y1 + ya + yb * r, - r: r - }; -} - -function place(b, a, c) { - var dx = b.x - a.x, x, a2, - dy = b.y - a.y, y, b2, - d2 = dx * dx + dy * dy; - if (d2) { - a2 = a.r + c.r, a2 *= a2; - b2 = b.r + c.r, b2 *= b2; - if (a2 > b2) { - x = (d2 + b2 - a2) / (2 * d2); - y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); - c.x = b.x - x * dx - y * dy; - c.y = b.y - x * dy + y * dx; - } else { - x = (d2 + a2 - b2) / (2 * d2); - y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); - c.x = a.x + x * dx - y * dy; - c.y = a.y + x * dy + y * dx; - } - } else { - c.x = a.x + c.r; - c.y = a.y; - } -} - -function intersects(a, b) { - var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; - return dr > 0 && dr * dr > dx * dx + dy * dy; -} - -function score(node) { - var a = node._, - b = node.next._, - ab = a.r + b.r, - dx = (a.x * b.r + b.x * a.r) / ab, - dy = (a.y * b.r + b.y * a.r) / ab; - return dx * dx + dy * dy; -} - -function Node$1(circle) { - this._ = circle; - this.next = null; - this.previous = null; -} - -function packEnclose(circles) { - if (!(n = circles.length)) return 0; - - var a, b, c, n, aa, ca, i, j, k, sj, sk; - - // Place the first circle. - a = circles[0], a.x = 0, a.y = 0; - if (!(n > 1)) return a.r; - - // Place the second circle. - b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; - if (!(n > 2)) return a.r + b.r; - - // Place the third circle. - place(b, a, c = circles[2]); - - // Initialize the front-chain using the first three circles a, b and c. - a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); - a.next = c.previous = b; - b.next = a.previous = c; - c.next = b.previous = a; - - // Attempt to place each remaining circle… - pack: for (i = 3; i < n; ++i) { - place(a._, b._, c = circles[i]), c = new Node$1(c); - - // Find the closest intersecting circle on the front-chain, if any. - // “Closeness” is determined by linear distance along the front-chain. - // “Ahead” or “behind” is likewise determined by linear distance. - j = b.next, k = a.previous, sj = b._.r, sk = a._.r; - do { - if (sj <= sk) { - if (intersects(j._, c._)) { - b = j, a.next = b, b.previous = a, --i; - continue pack; - } - sj += j._.r, j = j.next; - } else { - if (intersects(k._, c._)) { - a = k, a.next = b, b.previous = a, --i; - continue pack; - } - sk += k._.r, k = k.previous; - } - } while (j !== k.next); - - // Success! Insert the new circle c between a and b. - c.previous = a, c.next = b, a.next = b.previous = b = c; - - // Compute the new closest circle pair to the centroid. - aa = score(a); - while ((c = c.next) !== b) { - if ((ca = score(c)) < aa) { - a = c, aa = ca; - } - } - b = a.next; - } - - // Compute the enclosing circle of the front chain. - a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); - - // Translate the circles to put the enclosing circle around the origin. - for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; - - return c.r; -} - -function siblings(circles) { - packEnclose(circles); - return circles; -} - -function optional(f) { - return f == null ? null : required(f); -} - -function required(f) { - if (typeof f !== "function") throw new Error; - return f; -} - -function constantZero() { - return 0; -} - -function constant(x) { - return function() { - return x; - }; -} - -function defaultRadius(d) { - return Math.sqrt(d.value); -} - -function index() { - var radius = null, - dx = 1, - dy = 1, - padding = constantZero; - - function pack(root) { - root.x = dx / 2, root.y = dy / 2; - if (radius) { - root.eachBefore(radiusLeaf(radius)) - .eachAfter(packChildren(padding, 0.5)) - .eachBefore(translateChild(1)); - } else { - root.eachBefore(radiusLeaf(defaultRadius)) - .eachAfter(packChildren(constantZero, 1)) - .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) - .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); - } - return root; - } + function values(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; + } - pack.radius = function(x) { - return arguments.length ? (radius = optional(x), pack) : radius; - }; + function entries(map) { + var entries = []; + for (var key in map) entries.push({key: key, value: map[key]}); + return entries; + } - pack.size = function(x) { - return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; - }; + exports.nest = nest; + exports.set = set; + exports.map = map; + exports.keys = keys; + exports.values = values; + exports.entries = entries; - pack.padding = function(x) { - return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding; - }; + Object.defineProperty(exports, '__esModule', {value: true}); - return pack; -} + }))); -function radiusLeaf(radius) { - return function(node) { - if (!node.children) { - node.r = Math.max(0, +radius(node) || 0); - } - }; -} - -function packChildren(padding, k) { - return function(node) { - if (children = node.children) { - var children, - i, - n = children.length, - r = padding(node) * k || 0, - e; - - if (r) for (i = 0; i < n; ++i) children[i].r += r; - e = packEnclose(children); - if (r) for (i = 0; i < n; ++i) children[i].r -= r; - node.r = e + r; - } - }; -} - -function translateChild(k) { - return function(node) { - var parent = node.parent; - node.r *= k; - if (parent) { - node.x = parent.x + k * node.x; - node.y = parent.y + k * node.y; - } - }; -} - -function roundNode(node) { - node.x0 = Math.round(node.x0); - node.y0 = Math.round(node.y0); - node.x1 = Math.round(node.x1); - node.y1 = Math.round(node.y1); -} - -function treemapDice(parent, x0, y0, x1, y1) { - var nodes = parent.children, - node, - i = -1, - n = nodes.length, - k = parent.value && (x1 - x0) / parent.value; - - while (++i < n) { - node = nodes[i], node.y0 = y0, node.y1 = y1; - node.x0 = x0, node.x1 = x0 += node.value * k; - } -} - -function partition() { - var dx = 1, - dy = 1, - padding = 0, - round = false; - - function partition(root) { - var n = root.height + 1; - root.x0 = - root.y0 = padding; - root.x1 = dx; - root.y1 = dy / n; - root.eachBefore(positionNode(dy, n)); - if (round) root.eachBefore(roundNode); - return root; - } - - function positionNode(dy, n) { - return function(node) { - if (node.children) { - treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); - } - var x0 = node.x0, - y0 = node.y0, - x1 = node.x1 - padding, - y1 = node.y1 - padding; - if (x1 < x0) x0 = x1 = (x0 + x1) / 2; - if (y1 < y0) y0 = y1 = (y0 + y1) / 2; - node.x0 = x0; - node.y0 = y0; - node.x1 = x1; - node.y1 = y1; - }; - } - - partition.round = function(x) { - return arguments.length ? (round = !!x, partition) : round; - }; - - partition.size = function(x) { - return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; - }; - - partition.padding = function(x) { - return arguments.length ? (padding = +x, partition) : padding; - }; - - return partition; -} - -var keyPrefix = "$", // Protect against keys like “__proto__”. - preroot = {depth: -1}, - ambiguous = {}; - -function defaultId(d) { - return d.id; -} - -function defaultParentId(d) { - return d.parentId; -} - -function stratify() { - var id = defaultId, - parentId = defaultParentId; - - function stratify(data) { - var d, - i, - n = data.length, - root, - parent, - node, - nodes = new Array(n), - nodeId, - nodeKey, - nodeByKey = {}; - - for (i = 0; i < n; ++i) { - d = data[i], node = nodes[i] = new Node(d); - if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { - nodeKey = keyPrefix + (node.id = nodeId); - nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; - } - } + }, {}], + 13: [function (require, module, exports) { +// https://d3js.org/d3-color/ v1.4.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; + } - for (i = 0; i < n; ++i) { - node = nodes[i], nodeId = parentId(data[i], i, data); - if (nodeId == null || !(nodeId += "")) { - if (root) throw new Error("multiple roots"); - root = node; - } else { - parent = nodeByKey[keyPrefix + nodeId]; - if (!parent) throw new Error("missing: " + nodeId); - if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); - if (parent.children) parent.children.push(node); - else parent.children = [node]; - node.parent = parent; - } - } + function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; + } - if (!root) throw new Error("no root"); - root.parent = preroot; - root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); - root.parent = null; - if (n > 0) throw new Error("cycle"); + function Color() { + } - return root; - } + var darker = 0.7; + var brighter = 1 / darker; + + var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + + var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }; + + define(Color, color, { + copy: function (channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function () { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb + }); + + function color_formatHex() { + return this.rgb().formatHex(); + } - stratify.id = function(x) { - return arguments.length ? (id = required(x), stratify) : id; - }; + function color_formatHsl() { + return hslConvert(this).formatHsl(); + } - stratify.parentId = function(x) { - return arguments.length ? (parentId = required(x), stratify) : parentId; - }; + function color_formatRgb() { + return this.rgb().formatRgb(); + } - return stratify; -} + function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; + } -function defaultSeparation$1(a, b) { - return a.parent === b.parent ? 1 : 2; -} + function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); + } -// function radialSeparation(a, b) { -// return (a.parent === b.parent ? 1 : 2) / a.depth; -// } + function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); + } -// This function is used to traverse the left contour of a subtree (or -// subforest). It returns the successor of v on this contour. This successor is -// either given by the leftmost child of v or by the thread of v. The function -// returns null if and only if v is on the highest level of its subtree. -function nextLeft(v) { - var children = v.children; - return children ? children[0] : v.t; -} + function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); + } -// This function works analogously to nextLeft. -function nextRight(v) { - var children = v.children; - return children ? children[children.length - 1] : v.t; -} + function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + } -// Shifts the current subtree rooted at w+. This is done by increasing -// prelim(w+) and mod(w+) by shift. -function moveSubtree(wm, wp, shift) { - var change = shift / (wp.i - wm.i); - wp.c -= change; - wp.s += shift; - wm.c += change; - wp.z += shift; - wp.m += shift; -} + function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; + } -// All other shifts, applied to the smaller subtrees between w- and w+, are -// performed by this function. To prepare the shifts, we have to adjust -// change(w+), shift(w+), and change(w-). -function executeShifts(v) { - var shift = 0, - change = 0, - children = v.children, - i = children.length, - w; - while (--i >= 0) { - w = children[i]; - w.z += shift; - w.m += shift; - shift += w.s + (change += w.c); - } -} + define(Rgb, rgb, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function () { + return this; + }, + displayable: function () { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb + })); + + function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); + } -// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, -// returns the specified (default) ancestor. -function nextAncestor(vim, v, ancestor) { - return vim.a.parent === v.parent ? vim.a : ancestor; -} - -function TreeNode(node, i) { - this._ = node; - this.parent = null; - this.children = null; - this.A = null; // default ancestor - this.a = this; // ancestor - this.z = 0; // prelim - this.m = 0; // mod - this.c = 0; // change - this.s = 0; // shift - this.t = null; // thread - this.i = i; // number -} - -TreeNode.prototype = Object.create(Node.prototype); - -function treeRoot(root) { - var tree = new TreeNode(root, 0), - node, - nodes = [tree], - child, - children, - i, - n; - - while (node = nodes.pop()) { - if (children = node._.children) { - node.children = new Array(n = children.length); - for (i = n - 1; i >= 0; --i) { - nodes.push(child = node.children[i] = new TreeNode(children[i], i)); - child.parent = node; - } - } - } + function rgb_formatRgb() { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); + } - (tree.parent = new TreeNode(null, 0)).children = [tree]; - return tree; -} + function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); + } -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -function tree() { - var separation = defaultSeparation$1, - dx = 1, - dy = 1, - nodeSize = null; - - function tree(root) { - var t = treeRoot(root); - - // Compute the layout using Buchheim et al.’s algorithm. - t.eachAfter(firstWalk), t.parent.m = -t.z; - t.eachBefore(secondWalk); - - // If a fixed node size is specified, scale x and y. - if (nodeSize) root.eachBefore(sizeNode); - - // If a fixed tree size is specified, scale x and y based on the extent. - // Compute the left-most, right-most, and depth-most nodes for extents. - else { - var left = root, - right = root, - bottom = root; - root.eachBefore(function(node) { - if (node.x < left.x) left = node; - if (node.x > right.x) right = node; - if (node.depth > bottom.depth) bottom = node; - }); - var s = left === right ? 1 : separation(left, right) / 2, - tx = s - left.x, - kx = dx / (right.x + s + tx), - ky = dy / (bottom.depth || 1); - root.eachBefore(function(node) { - node.x = (node.x + tx) * kx; - node.y = node.depth * ky; - }); - } + function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); + } - return root; - } - - // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is - // applied recursively to the children of v, as well as the function - // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the - // node v is placed to the midpoint of its outermost children. - function firstWalk(v) { - var children = v.children, - siblings = v.parent.children, - w = v.i ? siblings[v.i - 1] : null; - if (children) { - executeShifts(v); - var midpoint = (children[0].z + children[children.length - 1].z) / 2; - if (w) { - v.z = w.z + separation(v._, w._); - v.m = v.z - midpoint; - } else { - v.z = midpoint; - } - } else if (w) { - v.z = w.z + separation(v._, w._); - } - v.parent.A = apportion(v, w, v.parent.A || siblings[0]); - } - - // Computes all real x-coordinates by summing up the modifiers recursively. - function secondWalk(v) { - v._.x = v.z + v.parent.m; - v.m += v.parent.m; - } - - // The core of the algorithm. Here, a new subtree is combined with the - // previous subtrees. Threads are used to traverse the inside and outside - // contours of the left and right subtree up to the highest common level. The - // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the - // superscript o means outside and i means inside, the subscript - means left - // subtree and + means right subtree. For summing up the modifiers along the - // contour, we use respective variables si+, si-, so-, and so+. Whenever two - // nodes of the inside contours conflict, we compute the left one of the - // greatest uncommon ancestors using the function ANCESTOR and call MOVE - // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. - // Finally, we add a new thread (if necessary). - function apportion(v, w, ancestor) { - if (w) { - var vip = v, - vop = v, - vim = w, - vom = vip.parent.children[0], - sip = vip.m, - sop = vop.m, - sim = vim.m, - som = vom.m, - shift; - while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { - vom = nextLeft(vom); - vop = nextRight(vop); - vop.a = v; - shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); - if (shift > 0) { - moveSubtree(nextAncestor(vim, v, ancestor), v, shift); - sip += shift; - sop += shift; - } - sim += vim.m; - sip += vip.m; - som += vom.m; - sop += vop.m; - } - if (vim && !nextRight(vop)) { - vop.t = vim; - vop.m += sim - sop; - } - if (vip && !nextLeft(vom)) { - vom.t = vip; - vom.m += sip - som; - ancestor = v; - } - } - return ancestor; - } - - function sizeNode(node) { - node.x *= dx; - node.y = node.depth * dy; - } - - tree.separation = function(x) { - return arguments.length ? (separation = x, tree) : separation; - }; - - tree.size = function(x) { - return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); - }; - - tree.nodeSize = function(x) { - return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); - }; - - return tree; -} - -function treemapSlice(parent, x0, y0, x1, y1) { - var nodes = parent.children, - node, - i = -1, - n = nodes.length, - k = parent.value && (y1 - y0) / parent.value; - - while (++i < n) { - node = nodes[i], node.x0 = x0, node.x1 = x1; - node.y0 = y0, node.y1 = y0 += node.value * k; - } -} - -var phi = (1 + Math.sqrt(5)) / 2; - -function squarifyRatio(ratio, parent, x0, y0, x1, y1) { - var rows = [], - nodes = parent.children, - row, - nodeValue, - i0 = 0, - i1 = 0, - n = nodes.length, - dx, dy, - value = parent.value, - sumValue, - minValue, - maxValue, - newRatio, - minRatio, - alpha, - beta; - - while (i0 < n) { - dx = x1 - x0, dy = y1 - y0; - - // Find the next non-empty node. - do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); - minValue = maxValue = sumValue; - alpha = Math.max(dy / dx, dx / dy) / (value * ratio); - beta = sumValue * sumValue * alpha; - minRatio = Math.max(maxValue / beta, beta / minValue); - - // Keep adding nodes while the aspect ratio maintains or improves. - for (; i1 < n; ++i1) { - sumValue += nodeValue = nodes[i1].value; - if (nodeValue < minValue) minValue = nodeValue; - if (nodeValue > maxValue) maxValue = nodeValue; - beta = sumValue * sumValue * alpha; - newRatio = Math.max(maxValue / beta, beta / minValue); - if (newRatio > minRatio) { sumValue -= nodeValue; break; } - minRatio = newRatio; - } + function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); + } - // Position and record the row orientation. - rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); - if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); - else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); - value -= sumValue, i0 = i1; - } - - return rows; -} - -var squarify = (function custom(ratio) { - - function squarify(parent, x0, y0, x1, y1) { - squarifyRatio(ratio, parent, x0, y0, x1, y1); - } - - squarify.ratio = function(x) { - return custom((x = +x) > 1 ? x : 1); - }; - - return squarify; -})(phi); - -function index$1() { - var tile = squarify, - round = false, - dx = 1, - dy = 1, - paddingStack = [0], - paddingInner = constantZero, - paddingTop = constantZero, - paddingRight = constantZero, - paddingBottom = constantZero, - paddingLeft = constantZero; - - function treemap(root) { - root.x0 = - root.y0 = 0; - root.x1 = dx; - root.y1 = dy; - root.eachBefore(positionNode); - paddingStack = [0]; - if (round) root.eachBefore(roundNode); - return root; - } - - function positionNode(node) { - var p = paddingStack[node.depth], - x0 = node.x0 + p, - y0 = node.y0 + p, - x1 = node.x1 - p, - y1 = node.y1 - p; - if (x1 < x0) x0 = x1 = (x0 + x1) / 2; - if (y1 < y0) y0 = y1 = (y0 + y1) / 2; - node.x0 = x0; - node.y0 = y0; - node.x1 = x1; - node.y1 = y1; - if (node.children) { - p = paddingStack[node.depth + 1] = paddingInner(node) / 2; - x0 += paddingLeft(node) - p; - y0 += paddingTop(node) - p; - x1 -= paddingRight(node) - p; - y1 -= paddingBottom(node) - p; - if (x1 < x0) x0 = x1 = (x0 + x1) / 2; - if (y1 < y0) y0 = y1 = (y0 + y1) / 2; - tile(node, x0, y0, x1, y1); - } - } + function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); + } - treemap.round = function(x) { - return arguments.length ? (round = !!x, treemap) : round; - }; + function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } - treemap.size = function(x) { - return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; - }; + define(Hsl, hsl, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function () { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function () { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function () { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } + })); + + /* From FvD 13.37, CSS Color Module Level 3 */ + function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; + } - treemap.tile = function(x) { - return arguments.length ? (tile = required(x), treemap) : tile; - }; + var deg2rad = Math.PI / 180; + var rad2deg = 180 / Math.PI; - treemap.padding = function(x) { - return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); - }; +// https://observablehq.com/@mbostock/lab-and-rgb + var K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; + + function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); + } - treemap.paddingInner = function(x) { - return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner; - }; + function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); + } - treemap.paddingOuter = function(x) { - return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); - }; + function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); + } - treemap.paddingTop = function(x) { - return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop; - }; + function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; + } - treemap.paddingRight = function(x) { - return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight; - }; + define(Lab, lab, extend(Color, { + brighter: function (k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function (k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function () { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } + })); - treemap.paddingBottom = function(x) { - return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom; - }; + function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; + } - treemap.paddingLeft = function(x) { - return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft; - }; + function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); + } - return treemap; -} + function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); + } -function binary(parent, x0, y0, x1, y1) { - var nodes = parent.children, - i, n = nodes.length, - sum, sums = new Array(n + 1); + function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); + } - for (sums[0] = sum = i = 0; i < n; ++i) { - sums[i + 1] = sum += nodes[i].value; - } + function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); + } - partition(0, n, parent.value, x0, y0, x1, y1); + function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } - function partition(i, j, value, x0, y0, x1, y1) { - if (i >= j - 1) { - var node = nodes[i]; - node.x0 = x0, node.y0 = y0; - node.x1 = x1, node.y1 = y1; - return; - } + function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } - var valueOffset = sums[i], - valueTarget = (value / 2) + valueOffset, - k = i + 1, - hi = j - 1; + function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; + } - while (k < hi) { - var mid = k + hi >>> 1; - if (sums[mid] < valueTarget) k = mid + 1; - else hi = mid; - } + function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); + } - if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + define(Hcl, hcl, extend(Color, { + brighter: function (k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function (k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function () { + return hcl2lab(this).rgb(); + } + })); + + var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + + function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); + } - var valueLeft = sums[k] - valueOffset, - valueRight = value - valueLeft; + function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); + } - if ((x1 - x0) > (y1 - y0)) { - var xk = (x0 * valueRight + x1 * valueLeft) / value; - partition(i, k, valueLeft, x0, y0, xk, y1); - partition(k, j, valueRight, xk, y0, x1, y1); - } else { - var yk = (y0 * valueRight + y1 * valueLeft) / value; - partition(i, k, valueLeft, x0, y0, x1, yk); - partition(k, j, valueRight, x0, yk, x1, y1); - } - } -} - -function sliceDice(parent, x0, y0, x1, y1) { - (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); -} - -var resquarify = (function custom(ratio) { - - function resquarify(parent, x0, y0, x1, y1) { - if ((rows = parent._squarify) && (rows.ratio === ratio)) { - var rows, - row, - nodes, - i, - j = -1, - n, - m = rows.length, - value = parent.value; - - while (++j < m) { - row = rows[j], nodes = row.children; - for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; - if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); - else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); - value -= row.value; - } - } else { - parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); - rows.ratio = ratio; - } - } - - resquarify.ratio = function(x) { - return custom((x = +x) > 1 ? x : 1); - }; - - return resquarify; -})(phi); - -exports.cluster = cluster; -exports.hierarchy = hierarchy; -exports.pack = index; -exports.packEnclose = enclose; -exports.packSiblings = siblings; -exports.partition = partition; -exports.stratify = stratify; -exports.tree = tree; -exports.treemap = index$1; -exports.treemapBinary = binary; -exports.treemapDice = treemapDice; -exports.treemapResquarify = resquarify; -exports.treemapSlice = treemapSlice; -exports.treemapSliceDice = sliceDice; -exports.treemapSquarify = squarify; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],24:[function(require,module,exports){ -// https://d3js.org/d3-interpolate/ v1.4.0 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); -}(this, function (exports, d3Color) { 'use strict'; - -function basis(t1, v0, v1, v2, v3) { - var t2 = t1 * t1, t3 = t2 * t1; - return ((1 - 3 * t1 + 3 * t2 - t3) * v0 - + (4 - 6 * t2 + 3 * t3) * v1 - + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 - + t3 * v3) / 6; -} - -function basis$1(values) { - var n = values.length - 1; - return function(t) { - var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), - v1 = values[i], - v2 = values[i + 1], - v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, - v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; - return basis((t - i / n) * n, v0, v1, v2, v3); - }; -} - -function basisClosed(values) { - var n = values.length; - return function(t) { - var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), - v0 = values[(i + n - 1) % n], - v1 = values[i % n], - v2 = values[(i + 1) % n], - v3 = values[(i + 2) % n]; - return basis((t - i / n) * n, v0, v1, v2, v3); - }; -} - -function constant(x) { - return function() { - return x; - }; -} - -function linear(a, d) { - return function(t) { - return a + t * d; - }; -} - -function exponential(a, b, y) { - return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { - return Math.pow(a + t * b, y); - }; -} - -function hue(a, b) { - var d = b - a; - return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); -} - -function gamma(y) { - return (y = +y) === 1 ? nogamma : function(a, b) { - return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); - }; -} - -function nogamma(a, b) { - var d = b - a; - return d ? linear(a, d) : constant(isNaN(a) ? b : a); -} - -var rgb = (function rgbGamma(y) { - var color = gamma(y); - - function rgb(start, end) { - var r = color((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), - g = color(start.g, end.g), - b = color(start.b, end.b), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.r = r(t); - start.g = g(t); - start.b = b(t); - start.opacity = opacity(t); - return start + ""; - }; - } - - rgb.gamma = rgbGamma; - - return rgb; -})(1); - -function rgbSpline(spline) { - return function(colors) { - var n = colors.length, - r = new Array(n), - g = new Array(n), - b = new Array(n), - i, color; - for (i = 0; i < n; ++i) { - color = d3Color.rgb(colors[i]); - r[i] = color.r || 0; - g[i] = color.g || 0; - b[i] = color.b || 0; - } - r = spline(r); - g = spline(g); - b = spline(b); - color.opacity = 1; - return function(t) { - color.r = r(t); - color.g = g(t); - color.b = b(t); - return color + ""; - }; - }; -} - -var rgbBasis = rgbSpline(basis$1); -var rgbBasisClosed = rgbSpline(basisClosed); - -function numberArray(a, b) { - if (!b) b = []; - var n = a ? Math.min(b.length, a.length) : 0, - c = b.slice(), - i; - return function(t) { - for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; - return c; - }; -} - -function isNumberArray(x) { - return ArrayBuffer.isView(x) && !(x instanceof DataView); -} - -function array(a, b) { - return (isNumberArray(b) ? numberArray : genericArray)(a, b); -} - -function genericArray(a, b) { - var nb = b ? b.length : 0, - na = a ? Math.min(nb, a.length) : 0, - x = new Array(na), - c = new Array(nb), - i; - - for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); - for (; i < nb; ++i) c[i] = b[i]; - - return function(t) { - for (i = 0; i < na; ++i) c[i] = x[i](t); - return c; - }; -} - -function date(a, b) { - var d = new Date; - return a = +a, b = +b, function(t) { - return d.setTime(a * (1 - t) + b * t), d; - }; -} - -function number(a, b) { - return a = +a, b = +b, function(t) { - return a * (1 - t) + b * t; - }; -} - -function object(a, b) { - var i = {}, - c = {}, - k; - - if (a === null || typeof a !== "object") a = {}; - if (b === null || typeof b !== "object") b = {}; - - for (k in b) { - if (k in a) { - i[k] = value(a[k], b[k]); - } else { - c[k] = b[k]; - } - } - - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, - reB = new RegExp(reA.source, "g"); - -function zero(b) { - return function() { - return b; - }; -} - -function one(b) { - return function(t) { - return b(t) + ""; - }; -} - -function string(a, b) { - var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b - am, // current match in a - bm, // current match in b - bs, // string preceding current number in b, if any - i = -1, // index in s - s = [], // string constants and placeholders - q = []; // number interpolators - - // Coerce inputs to strings. - a = a + "", b = b + ""; - - // Interpolate pairs of numbers in a & b. - while ((am = reA.exec(a)) - && (bm = reB.exec(b))) { - if ((bs = bm.index) > bi) { // a string precedes the next number in b - bs = b.slice(bi, bs); - if (s[i]) s[i] += bs; // coalesce with previous string - else s[++i] = bs; - } - if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match - if (s[i]) s[i] += bm; // coalesce with previous string - else s[++i] = bm; - } else { // interpolate non-matching numbers - s[++i] = null; - q.push({i: i, x: number(am, bm)}); - } - bi = reB.lastIndex; - } - - // Add remains of b. - if (bi < b.length) { - bs = b.slice(bi); - if (s[i]) s[i] += bs; // coalesce with previous string - else s[++i] = bs; - } - - // Special optimization for only a single match. - // Otherwise, interpolate each of the numbers and rejoin the string. - return s.length < 2 ? (q[0] - ? one(q[0].x) - : zero(b)) - : (b = q.length, function(t) { - for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }); -} - -function value(a, b) { - var t = typeof b, c; - return b == null || t === "boolean" ? constant(b) - : (t === "number" ? number - : t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb) : string) - : b instanceof d3Color.color ? rgb - : b instanceof Date ? date - : isNumberArray(b) ? numberArray - : Array.isArray(b) ? genericArray - : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object - : number)(a, b); -} - -function discrete(range) { - var n = range.length; - return function(t) { - return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; - }; -} - -function hue$1(a, b) { - var i = hue(+a, +b); - return function(t) { - var x = i(t); - return x - 360 * Math.floor(x / 360); - }; -} - -function round(a, b) { - return a = +a, b = +b, function(t) { - return Math.round(a * (1 - t) + b * t); - }; -} - -var degrees = 180 / Math.PI; - -var identity = { - translateX: 0, - translateY: 0, - rotate: 0, - skewX: 0, - scaleX: 1, - scaleY: 1 -}; - -function decompose(a, b, c, d, e, f) { - var scaleX, scaleY, skewX; - if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; - if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; - if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; - if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; - return { - translateX: e, - translateY: f, - rotate: Math.atan2(b, a) * degrees, - skewX: Math.atan(skewX) * degrees, - scaleX: scaleX, - scaleY: scaleY - }; -} - -var cssNode, - cssRoot, - cssView, - svgNode; - -function parseCss(value) { - if (value === "none") return identity; - if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; - cssNode.style.transform = value; - value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); - cssRoot.removeChild(cssNode); - value = value.slice(7, -1).split(","); - return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); -} - -function parseSvg(value) { - if (value == null) return identity; - if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); - svgNode.setAttribute("transform", value); - if (!(value = svgNode.transform.baseVal.consolidate())) return identity; - value = value.matrix; - return decompose(value.a, value.b, value.c, value.d, value.e, value.f); -} - -function interpolateTransform(parse, pxComma, pxParen, degParen) { - - function pop(s) { - return s.length ? s.pop() + " " : ""; - } - - function translate(xa, ya, xb, yb, s, q) { - if (xa !== xb || ya !== yb) { - var i = s.push("translate(", null, pxComma, null, pxParen); - q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); - } else if (xb || yb) { - s.push("translate(" + xb + pxComma + yb + pxParen); - } - } - - function rotate(a, b, s, q) { - if (a !== b) { - if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path - q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); - } else if (b) { - s.push(pop(s) + "rotate(" + b + degParen); - } - } + function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } - function skewX(a, b, s, q) { - if (a !== b) { - q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); - } else if (b) { - s.push(pop(s) + "skewX(" + b + degParen); - } - } - - function scale(xa, ya, xb, yb, s, q) { - if (xa !== xb || ya !== yb) { - var i = s.push(pop(s) + "scale(", null, ",", null, ")"); - q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); - } else if (xb !== 1 || yb !== 1) { - s.push(pop(s) + "scale(" + xb + "," + yb + ")"); - } - } - - return function(a, b) { - var s = [], // string constants and placeholders - q = []; // number interpolators - a = parse(a), b = parse(b); - translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); - rotate(a.rotate, b.rotate, s, q); - skewX(a.skewX, b.skewX, s, q); - scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); - a = b = null; // gc - return function(t) { - var i = -1, n = q.length, o; - while (++i < n) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; - }; -} - -var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); -var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); - -var rho = Math.SQRT2, - rho2 = 2, - rho4 = 4, - epsilon2 = 1e-12; - -function cosh(x) { - return ((x = Math.exp(x)) + 1 / x) / 2; -} - -function sinh(x) { - return ((x = Math.exp(x)) - 1 / x) / 2; -} - -function tanh(x) { - return ((x = Math.exp(2 * x)) - 1) / (x + 1); -} + define(Cubehelix, cubehelix, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function () { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } + })); -// p0 = [ux0, uy0, w0] -// p1 = [ux1, uy1, w1] -function zoom(p0, p1) { - var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], - ux1 = p1[0], uy1 = p1[1], w1 = p1[2], - dx = ux1 - ux0, - dy = uy1 - uy0, - d2 = dx * dx + dy * dy, - i, - S; - - // Special case for u0 ≅ u1. - if (d2 < epsilon2) { - S = Math.log(w1 / w0) / rho; - i = function(t) { - return [ - ux0 + t * dx, - uy0 + t * dy, - w0 * Math.exp(rho * t * S) - ]; - }; - } - - // General case. - else { - var d1 = Math.sqrt(d2), - b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), - b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), - r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), - r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); - S = (r1 - r0) / rho; - i = function(t) { - var s = t * S, - coshr0 = cosh(r0), - u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); - return [ - ux0 + u * dx, - uy0 + u * dy, - w0 * coshr0 / cosh(rho * s + r0) - ]; - }; - } - - i.duration = S * 1000; - - return i; -} - -function hsl(hue) { - return function(start, end) { - var h = hue((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), - s = nogamma(start.s, end.s), - l = nogamma(start.l, end.l), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.h = h(t); - start.s = s(t); - start.l = l(t); - start.opacity = opacity(t); - return start + ""; - }; - } -} - -var hsl$1 = hsl(hue); -var hslLong = hsl(nogamma); - -function lab(start, end) { - var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), - a = nogamma(start.a, end.a), - b = nogamma(start.b, end.b), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.l = l(t); - start.a = a(t); - start.b = b(t); - start.opacity = opacity(t); - return start + ""; - }; -} - -function hcl(hue) { - return function(start, end) { - var h = hue((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), - c = nogamma(start.c, end.c), - l = nogamma(start.l, end.l), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.h = h(t); - start.c = c(t); - start.l = l(t); - start.opacity = opacity(t); - return start + ""; - }; - } -} - -var hcl$1 = hcl(hue); -var hclLong = hcl(nogamma); - -function cubehelix(hue) { - return (function cubehelixGamma(y) { - y = +y; - - function cubehelix(start, end) { - var h = hue((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), - s = nogamma(start.s, end.s), - l = nogamma(start.l, end.l), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.h = h(t); - start.s = s(t); - start.l = l(Math.pow(t, y)); - start.opacity = opacity(t); - return start + ""; - }; - } + exports.color = color; + exports.cubehelix = cubehelix; + exports.gray = gray; + exports.hcl = hcl; + exports.hsl = hsl; + exports.lab = lab; + exports.lch = lch; + exports.rgb = rgb; - cubehelix.gamma = cubehelixGamma; - - return cubehelix; - })(1); -} - -var cubehelix$1 = cubehelix(hue); -var cubehelixLong = cubehelix(nogamma); - -function piecewise(interpolate, values) { - var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); - while (i < n) I[i] = interpolate(v, v = values[++i]); - return function(t) { - var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); - return I[i](t - i); - }; -} - -function quantize(interpolator, n) { - var samples = new Array(n); - for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); - return samples; -} - -exports.interpolate = value; -exports.interpolateArray = array; -exports.interpolateBasis = basis$1; -exports.interpolateBasisClosed = basisClosed; -exports.interpolateCubehelix = cubehelix$1; -exports.interpolateCubehelixLong = cubehelixLong; -exports.interpolateDate = date; -exports.interpolateDiscrete = discrete; -exports.interpolateHcl = hcl$1; -exports.interpolateHclLong = hclLong; -exports.interpolateHsl = hsl$1; -exports.interpolateHslLong = hslLong; -exports.interpolateHue = hue$1; -exports.interpolateLab = lab; -exports.interpolateNumber = number; -exports.interpolateNumberArray = numberArray; -exports.interpolateObject = object; -exports.interpolateRgb = rgb; -exports.interpolateRgbBasis = rgbBasis; -exports.interpolateRgbBasisClosed = rgbBasisClosed; -exports.interpolateRound = round; -exports.interpolateString = string; -exports.interpolateTransformCss = interpolateTransformCss; -exports.interpolateTransformSvg = interpolateTransformSvg; -exports.interpolateZoom = zoom; -exports.piecewise = piecewise; -exports.quantize = quantize; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{"d3-color":13}],25:[function(require,module,exports){ -// https://d3js.org/d3-path/ v1.0.9 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -var pi = Math.PI, - tau = 2 * pi, - epsilon = 1e-6, - tauEpsilon = tau - epsilon; - -function Path() { - this._x0 = this._y0 = // start of current subpath - this._x1 = this._y1 = null; // end of current subpath - this._ = ""; -} - -function path() { - return new Path; -} - -Path.prototype = path.prototype = { - constructor: Path, - moveTo: function(x, y) { - this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); - }, - closePath: function() { - if (this._x1 !== null) { - this._x1 = this._x0, this._y1 = this._y0; - this._ += "Z"; - } - }, - lineTo: function(x, y) { - this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); - }, - quadraticCurveTo: function(x1, y1, x, y) { - this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); - }, - bezierCurveTo: function(x1, y1, x2, y2, x, y) { - this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); - }, - arcTo: function(x1, y1, x2, y2, r) { - x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; - var x0 = this._x1, - y0 = this._y1, - x21 = x2 - x1, - y21 = y2 - y1, - x01 = x0 - x1, - y01 = y0 - y1, - l01_2 = x01 * x01 + y01 * y01; - - // Is the radius negative? Error. - if (r < 0) throw new Error("negative radius: " + r); - - // Is this path empty? Move to (x1,y1). - if (this._x1 === null) { - this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); - } + Object.defineProperty(exports, '__esModule', {value: true}); - // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. - else if (!(l01_2 > epsilon)); + })); - // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? - // Equivalently, is (x1,y1) coincident with (x2,y2)? - // Or, is the radius zero? Line to (x1,y1). - else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { - this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); - } + }, {}], + 14: [function (require, module, exports) { +// https://d3js.org/d3-contour/ v1.3.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3)); + }(this, (function (exports, d3Array) { + 'use strict'; - // Otherwise, draw an arc! - else { - var x20 = x2 - x0, - y20 = y2 - y0, - l21_2 = x21 * x21 + y21 * y21, - l20_2 = x20 * x20 + y20 * y20, - l21 = Math.sqrt(l21_2), - l01 = Math.sqrt(l01_2), - l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), - t01 = l / l01, - t21 = l / l21; - - // If the start tangent is not coincident with (x0,y0), line to. - if (Math.abs(t01 - 1) > epsilon) { - this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); - } - - this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); - } - }, - arc: function(x, y, r, a0, a1, ccw) { - x = +x, y = +y, r = +r, ccw = !!ccw; - var dx = r * Math.cos(a0), - dy = r * Math.sin(a0), - x0 = x + dx, - y0 = y + dy, - cw = 1 ^ ccw, - da = ccw ? a0 - a1 : a1 - a0; - - // Is the radius negative? Error. - if (r < 0) throw new Error("negative radius: " + r); - - // Is this path empty? Move to (x0,y0). - if (this._x1 === null) { - this._ += "M" + x0 + "," + y0; - } + var array = Array.prototype; - // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). - else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { - this._ += "L" + x0 + "," + y0; - } + var slice = array.slice; - // Is this arc empty? We’re done. - if (!r) return; + function ascending(a, b) { + return a - b; + } - // Does the angle go the wrong way? Flip the direction. - if (da < 0) da = da % tau + tau; + function area(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; + } - // Is this a complete circle? Draw two arcs to complete the circle. - if (da > tauEpsilon) { - this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); - } + function constant(x) { + return function () { + return x; + }; + } - // Is this arc non-empty? Draw an arc! - else if (da > epsilon) { - this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); - } - }, - rect: function(x, y, w, h) { - this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; - }, - toString: function() { - return this._; - } -}; + function contains(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; + } -exports.path = path; + function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; + } -Object.defineProperty(exports, '__esModule', { value: true }); + function segmentContains(a, b, c) { + var i; + return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); + } -})); + function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); + } -},{}],26:[function(require,module,exports){ -// https://d3js.org/d3-polygon/ v1.0.6 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -function area(polygon) { - var i = -1, - n = polygon.length, - a, - b = polygon[n - 1], - area = 0; - - while (++i < n) { - a = b; - b = polygon[i]; - area += a[1] * b[0] - a[0] * b[1]; - } - - return area / 2; -} - -function centroid(polygon) { - var i = -1, - n = polygon.length, - x = 0, - y = 0, - a, - b = polygon[n - 1], - c, - k = 0; - - while (++i < n) { - a = b; - b = polygon[i]; - k += c = a[0] * b[1] - b[0] * a[1]; - x += (a[0] + b[0]) * c; - y += (a[1] + b[1]) * c; - } - - return k *= 3, [x / k, y / k]; -} + function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; + } -// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of -// the 3D cross product in a quadrant I Cartesian coordinate system (+x is -// right, +y is up). Returns a positive value if ABC is counter-clockwise, -// negative if clockwise, and zero if the points are collinear. -function cross(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); -} + function noop() { + } -function lexicographicOrder(a, b) { - return a[0] - b[0] || a[1] - b[1]; -} + var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] + ]; + + function contours() { + var dx = 1, + dy = 1, + threshold = d3Array.thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = d3Array.extent(values), start = domain[0], stop = domain[1]; + tz = d3Array.tickStep(start, stop, tz); + tz = d3Array.range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending); + } -// Computes the upper convex hull per the monotone chain algorithm. -// Assumes points.length >= 3, is sorted by x, unique in y. -// Returns an array of indices into points in left-to-right order. -function computeUpperHullIndexes(points) { - var n = points.length, - indexes = [0, 1], - size = 2; - - for (var i = 2; i < n; ++i) { - while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; - indexes[size++] = i; - } - - return indexes.slice(0, size); // remove popped points -} - -function hull(points) { - if ((n = points.length) < 3) return null; - - var i, - n, - sortedPoints = new Array(n), - flippedPoints = new Array(n); - - for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; - sortedPoints.sort(lexicographicOrder); - for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; - - var upperIndexes = computeUpperHullIndexes(sortedPoints), - lowerIndexes = computeUpperHullIndexes(flippedPoints); - - // Construct the hull polygon, removing possible duplicate endpoints. - var skipLeft = lowerIndexes[0] === upperIndexes[0], - skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], - hull = []; - - // Add upper hull in right-to-l order. - // Then add lower hull in left-to-right order. - for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); - for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); - - return hull; -} - -function contains(polygon, point) { - var n = polygon.length, - p = polygon[n - 1], - x = point[0], y = point[1], - x0 = p[0], y0 = p[1], - x1, y1, - inside = false; - - for (var i = 0; i < n; ++i) { - p = polygon[i], x1 = p[0], y1 = p[1]; - if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; - x0 = x1, y0 = y1; - } - - return inside; -} - -function length(polygon) { - var i = -1, - n = polygon.length, - b = polygon[n - 1], - xa, - ya, - xb = b[0], - yb = b[1], - perimeter = 0; - - while (++i < n) { - xa = xb; - ya = yb; - b = polygon[i]; - xb = b[0]; - yb = b[1]; - xa -= xb; - ya -= yb; - perimeter += Math.sqrt(xa * xa + ya * ya); - } - - return perimeter; -} - -exports.polygonArea = area; -exports.polygonCentroid = centroid; -exports.polygonContains = contains; -exports.polygonHull = hull; -exports.polygonLength = length; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],27:[function(require,module,exports){ -// https://d3js.org/d3-quadtree/ v1.0.7 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -function tree_add(d) { - var x = +this._x.call(null, d), - y = +this._y.call(null, d); - return add(this.cover(x, y), x, y, d); -} - -function add(tree, x, y, d) { - if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points - - var parent, - node = tree._root, - leaf = {data: d}, - x0 = tree._x0, - y0 = tree._y0, - x1 = tree._x1, - y1 = tree._y1, - xm, - ym, - xp, - yp, - right, - bottom, - i, - j; - - // If the tree is empty, initialize the root as a leaf. - if (!node) return tree._root = leaf, tree; - - // Find the existing leaf for the new point, or add it. - while (node.length) { - if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; - if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; - if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; - } - - // Is the new point is exactly coincident with the existing point? - xp = +tree._x.call(null, node.data); - yp = +tree._y.call(null, node.data); - if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; - - // Otherwise, split the leaf node until the old and new point are separated. - do { - parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); - if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; - if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; - } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); - return parent[j] = node, parent[i] = leaf, tree; -} - -function addAll(data) { - var d, i, n = data.length, - x, - y, - xz = new Array(n), - yz = new Array(n), - x0 = Infinity, - y0 = Infinity, - x1 = -Infinity, - y1 = -Infinity; - - // Compute the points and their extent. - for (i = 0; i < n; ++i) { - if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; - xz[i] = x; - yz[i] = y; - if (x < x0) x0 = x; - if (x > x1) x1 = x; - if (y < y0) y0 = y; - if (y > y1) y1 = y; - } - - // If there were no (valid) points, abort. - if (x0 > x1 || y0 > y1) return this; - - // Expand the tree to cover the new points. - this.cover(x0, y0).cover(x1, y1); - - // Add the new points. - for (i = 0; i < n; ++i) { - add(this, xz[i], yz[i], data[i]); - } - - return this; -} - -function tree_cover(x, y) { - if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points - - var x0 = this._x0, - y0 = this._y0, - x1 = this._x1, - y1 = this._y1; - - // If the quadtree has no extent, initialize them. - // Integer extent are necessary so that if we later double the extent, - // the existing quadrant boundaries don’t change due to floating point error! - if (isNaN(x0)) { - x1 = (x0 = Math.floor(x)) + 1; - y1 = (y0 = Math.floor(y)) + 1; - } - - // Otherwise, double repeatedly to cover. - else { - var z = x1 - x0, - node = this._root, - parent, - i; - - while (x0 > x || x >= x1 || y0 > y || y >= y1) { - i = (y < y0) << 1 | (x < x0); - parent = new Array(4), parent[i] = node, node = parent, z *= 2; - switch (i) { - case 0: x1 = x0 + z, y1 = y0 + z; break; - case 1: x0 = x1 - z, y1 = y0 + z; break; - case 2: x1 = x0 + z, y0 = y1 - z; break; - case 3: x0 = x1 - z, y0 = y1 - z; break; - } - } + return tz.map(function (value) { + return contour(values, value); + }); + } - if (this._root && this._root.length) this._root = node; - } - - this._x0 = x0; - this._y0 = y0; - this._x1 = x1; - this._y1 = y1; - return this; -} - -function tree_data() { - var data = []; - this.visit(function(node) { - if (!node.length) do data.push(node.data); while (node = node.next) - }); - return data; -} - -function tree_extent(_) { - return arguments.length - ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) - : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; -} - -function Quad(node, x0, y0, x1, y1) { - this.node = node; - this.x0 = x0; - this.y0 = y0; - this.x1 = x1; - this.y1 = y1; -} - -function tree_find(x, y, radius) { - var data, - x0 = this._x0, - y0 = this._y0, - x1, - y1, - x2, - y2, - x3 = this._x1, - y3 = this._y1, - quads = [], - node = this._root, - q, - i; - - if (node) quads.push(new Quad(node, x0, y0, x3, y3)); - if (radius == null) radius = Infinity; - else { - x0 = x - radius, y0 = y - radius; - x3 = x + radius, y3 = y + radius; - radius *= radius; - } - - while (q = quads.pop()) { - - // Stop searching if this quadrant can’t contain a closer node. - if (!(node = q.node) - || (x1 = q.x0) > x3 - || (y1 = q.y0) > y3 - || (x2 = q.x1) < x0 - || (y2 = q.y1) < y0) continue; - - // Bisect the current quadrant. - if (node.length) { - var xm = (x1 + x2) / 2, - ym = (y1 + y2) / 2; - - quads.push( - new Quad(node[3], xm, ym, x2, y2), - new Quad(node[2], x1, ym, xm, y2), - new Quad(node[1], xm, y1, x2, ym), - new Quad(node[0], x1, y1, xm, ym) - ); - - // Visit the closest quadrant first. - if (i = (y >= ym) << 1 | (x >= xm)) { - q = quads[quads.length - 1]; - quads[quads.length - 1] = quads[quads.length - 1 - i]; - quads[quads.length - 1 - i] = q; - } - } + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function (ring) { + smooth(ring, values, value); + if (area(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function (hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } - // Visit this point. (Visiting coincident points isn’t necessary!) - else { - var dx = x - +this._x.call(null, node.data), - dy = y - +this._y.call(null, node.data), - d2 = dx * dx + dy * dy; - if (d2 < radius) { - var d = Math.sqrt(radius = d2); - x0 = x - d, y0 = y - d; - x3 = x + d, y3 = y + d; - data = node.data; - } - } - } - - return data; -} - -function tree_remove(d) { - if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points - - var parent, - node = this._root, - retainer, - previous, - next, - x0 = this._x0, - y0 = this._y0, - x1 = this._x1, - y1 = this._y1, - x, - y, - xm, - ym, - right, - bottom, - i, - j; - - // If the tree is empty, initialize the root as a leaf. - if (!node) return this; - - // Find the leaf node for the point. - // While descending, also retain the deepest parent with a non-removed sibling. - if (node.length) while (true) { - if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; - if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; - if (!(parent = node, node = node[i = bottom << 1 | right])) return this; - if (!node.length) break; - if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; - } - - // Find the point to remove. - while (node.data !== d) if (!(previous = node, node = node.next)) return this; - if (next = node.next) delete node.next; - - // If there are multiple coincident points, remove just the point. - if (previous) return (next ? previous.next = next : delete previous.next), this; - - // If this is the root point, remove it. - if (!parent) return this._root = next, this; - - // Remove this leaf. - next ? parent[i] = next : delete parent[i]; - - // If the parent now contains exactly one leaf, collapse superfluous parents. - if ((node = parent[0] || parent[1] || parent[2] || parent[3]) - && node === (parent[3] || parent[2] || parent[1] || parent[0]) - && !node.length) { - if (retainer) retainer[j] = node; - else this._root = node; - } - - return this; -} - -function removeAll(data) { - for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); - return this; -} - -function tree_root() { - return this._root; -} - -function tree_size() { - var size = 0; - this.visit(function(node) { - if (!node.length) do ++size; while (node = node.next) - }); - return size; -} - -function tree_visit(callback) { - var quads = [], q, node = this._root, child, x0, y0, x1, y1; - if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); - while (q = quads.pop()) { - if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { - var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; - if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); - if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); - if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); - if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); - } - } - return this; -} - -function tree_visitAfter(callback) { - var quads = [], next = [], q; - if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); - while (q = quads.pop()) { - var node = q.node; - if (node.length) { - var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; - if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); - if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); - if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); - if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); - } - next.push(q); - } - while (q = next.pop()) { - callback(q.node, q.x0, q.y0, q.x1, q.y1); - } - return this; -} - -function defaultX(d) { - return d[0]; -} - -function tree_x(_) { - return arguments.length ? (this._x = _, this) : this._x; -} - -function defaultY(d) { - return d[1]; -} - -function tree_y(_) { - return arguments.length ? (this._y = _, this) : this._y; -} - -function quadtree(nodes, x, y) { - var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); - return nodes == null ? tree : tree.addAll(nodes); -} - -function Quadtree(x, y, x0, y0, x1, y1) { - this._x = x; - this._y = y; - this._x0 = x0; - this._y0 = y0; - this._x1 = x1; - this._y1 = y1; - this._root = undefined; -} - -function leaf_copy(leaf) { - var copy = {data: leaf.data}, next = copy; - while (leaf = leaf.next) next = next.next = {data: leaf.data}; - return copy; -} - -var treeProto = quadtree.prototype = Quadtree.prototype; - -treeProto.copy = function() { - var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), - node = this._root, - nodes, - child; - - if (!node) return copy; - - if (!node.length) return copy._root = leaf_copy(node), copy; - - nodes = [{source: node, target: copy._root = new Array(4)}]; - while (node = nodes.pop()) { - for (var i = 0; i < 4; ++i) { - if (child = node.source[i]) { - if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); - else node.target[i] = leaf_copy(child); - } - } - } + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } - return copy; -}; + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = { + start: f.start, + end: g.end, + ring: f.ring.concat(g.ring) + }; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = { + start: g.start, + end: f.end, + ring: g.ring.concat(f.ring) + }; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = { + start: startIndex, + end: endIndex, + ring: [start, end] + }; + } + } + } -treeProto.add = tree_add; -treeProto.addAll = addAll; -treeProto.cover = tree_cover; -treeProto.data = tree_data; -treeProto.extent = tree_extent; -treeProto.find = tree_find; -treeProto.remove = tree_remove; -treeProto.removeAll = removeAll; -treeProto.root = tree_root; -treeProto.size = tree_size; -treeProto.visit = tree_visit; -treeProto.visitAfter = tree_visitAfter; -treeProto.x = tree_x; -treeProto.y = tree_y; + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } -exports.quadtree = quadtree; + function smoothLinear(ring, values, value) { + ring.forEach(function (point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } -Object.defineProperty(exports, '__esModule', { value: true }); + contours.contour = contour; -})); + contours.size = function (_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; -},{}],28:[function(require,module,exports){ -// https://d3js.org/d3-random/ v1.1.2 Copyright 2018 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(factory((global.d3 = global.d3 || {}))); -}(this, (function (exports) { 'use strict'; - -function defaultSource() { - return Math.random(); -} - -var uniform = (function sourceRandomUniform(source) { - function randomUniform(min, max) { - min = min == null ? 0 : +min; - max = max == null ? 1 : +max; - if (arguments.length === 1) max = min, min = 0; - else max -= min; - return function() { - return source() * max + min; - }; - } - - randomUniform.source = sourceRandomUniform; - - return randomUniform; -})(defaultSource); - -var normal = (function sourceRandomNormal(source) { - function randomNormal(mu, sigma) { - var x, r; - mu = mu == null ? 0 : +mu; - sigma = sigma == null ? 1 : +sigma; - return function() { - var y; - - // If available, use the second previously-generated uniform random. - if (x != null) y = x, x = null; - - // Otherwise, generate a new x and y. - else do { - x = source() * 2 - 1; - y = source() * 2 - 1; - r = x * x + y * y; - } while (!r || r > 1); - - return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); - }; - } - - randomNormal.source = sourceRandomNormal; - - return randomNormal; -})(defaultSource); - -var logNormal = (function sourceRandomLogNormal(source) { - function randomLogNormal() { - var randomNormal = normal.source(source).apply(this, arguments); - return function() { - return Math.exp(randomNormal()); - }; - } - - randomLogNormal.source = sourceRandomLogNormal; - - return randomLogNormal; -})(defaultSource); - -var irwinHall = (function sourceRandomIrwinHall(source) { - function randomIrwinHall(n) { - return function() { - for (var sum = 0, i = 0; i < n; ++i) sum += source(); - return sum; - }; - } - - randomIrwinHall.source = sourceRandomIrwinHall; - - return randomIrwinHall; -})(defaultSource); - -var bates = (function sourceRandomBates(source) { - function randomBates(n) { - var randomIrwinHall = irwinHall.source(source)(n); - return function() { - return randomIrwinHall() / n; - }; - } - - randomBates.source = sourceRandomBates; - - return randomBates; -})(defaultSource); - -var exponential = (function sourceRandomExponential(source) { - function randomExponential(lambda) { - return function() { - return -Math.log(1 - source()) / lambda; - }; - } - - randomExponential.source = sourceRandomExponential; - - return randomExponential; -})(defaultSource); - -exports.randomUniform = uniform; -exports.randomNormal = normal; -exports.randomLogNormal = logNormal; -exports.randomBates = bates; -exports.randomIrwinHall = irwinHall; -exports.randomExponential = exponential; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -},{}],29:[function(require,module,exports){ -// https://d3js.org/d3-scale-chromatic/ v1.5.0 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-interpolate'), require('d3-color')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-interpolate', 'd3-color'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); -}(this, function (exports, d3Interpolate, d3Color) { 'use strict'; - -function colors(specifier) { - var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; - while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); - return colors; -} - -var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); - -var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); - -var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); - -var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); - -var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); - -var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); - -var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); - -var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); - -var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); - -var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); - -function ramp(scheme) { - return d3Interpolate.interpolateRgbBasis(scheme[scheme.length - 1]); -} - -var scheme = new Array(3).concat( - "d8b365f5f5f55ab4ac", - "a6611adfc27d80cdc1018571", - "a6611adfc27df5f5f580cdc1018571", - "8c510ad8b365f6e8c3c7eae55ab4ac01665e", - "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", - "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", - "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", - "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", - "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" -).map(colors); - -var BrBG = ramp(scheme); - -var scheme$1 = new Array(3).concat( - "af8dc3f7f7f77fbf7b", - "7b3294c2a5cfa6dba0008837", - "7b3294c2a5cff7f7f7a6dba0008837", - "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", - "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", - "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", - "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", - "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", - "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" -).map(colors); - -var PRGn = ramp(scheme$1); - -var scheme$2 = new Array(3).concat( - "e9a3c9f7f7f7a1d76a", - "d01c8bf1b6dab8e1864dac26", - "d01c8bf1b6daf7f7f7b8e1864dac26", - "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", - "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", - "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", - "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", - "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", - "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" -).map(colors); - -var PiYG = ramp(scheme$2); - -var scheme$3 = new Array(3).concat( - "998ec3f7f7f7f1a340", - "5e3c99b2abd2fdb863e66101", - "5e3c99b2abd2f7f7f7fdb863e66101", - "542788998ec3d8daebfee0b6f1a340b35806", - "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", - "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", - "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", - "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", - "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" -).map(colors); - -var PuOr = ramp(scheme$3); - -var scheme$4 = new Array(3).concat( - "ef8a62f7f7f767a9cf", - "ca0020f4a58292c5de0571b0", - "ca0020f4a582f7f7f792c5de0571b0", - "b2182bef8a62fddbc7d1e5f067a9cf2166ac", - "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", - "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", - "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", - "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", - "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" -).map(colors); - -var RdBu = ramp(scheme$4); - -var scheme$5 = new Array(3).concat( - "ef8a62ffffff999999", - "ca0020f4a582bababa404040", - "ca0020f4a582ffffffbababa404040", - "b2182bef8a62fddbc7e0e0e09999994d4d4d", - "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", - "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", - "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", - "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", - "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" -).map(colors); - -var RdGy = ramp(scheme$5); - -var scheme$6 = new Array(3).concat( - "fc8d59ffffbf91bfdb", - "d7191cfdae61abd9e92c7bb6", - "d7191cfdae61ffffbfabd9e92c7bb6", - "d73027fc8d59fee090e0f3f891bfdb4575b4", - "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", - "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", - "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", - "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", - "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" -).map(colors); - -var RdYlBu = ramp(scheme$6); - -var scheme$7 = new Array(3).concat( - "fc8d59ffffbf91cf60", - "d7191cfdae61a6d96a1a9641", - "d7191cfdae61ffffbfa6d96a1a9641", - "d73027fc8d59fee08bd9ef8b91cf601a9850", - "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", - "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", - "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", - "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", - "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" -).map(colors); - -var RdYlGn = ramp(scheme$7); - -var scheme$8 = new Array(3).concat( - "fc8d59ffffbf99d594", - "d7191cfdae61abdda42b83ba", - "d7191cfdae61ffffbfabdda42b83ba", - "d53e4ffc8d59fee08be6f59899d5943288bd", - "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", - "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", - "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", - "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", - "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" -).map(colors); - -var Spectral = ramp(scheme$8); - -var scheme$9 = new Array(3).concat( - "e5f5f999d8c92ca25f", - "edf8fbb2e2e266c2a4238b45", - "edf8fbb2e2e266c2a42ca25f006d2c", - "edf8fbccece699d8c966c2a42ca25f006d2c", - "edf8fbccece699d8c966c2a441ae76238b45005824", - "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", - "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" -).map(colors); - -var BuGn = ramp(scheme$9); - -var scheme$a = new Array(3).concat( - "e0ecf49ebcda8856a7", - "edf8fbb3cde38c96c688419d", - "edf8fbb3cde38c96c68856a7810f7c", - "edf8fbbfd3e69ebcda8c96c68856a7810f7c", - "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", - "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", - "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" -).map(colors); - -var BuPu = ramp(scheme$a); - -var scheme$b = new Array(3).concat( - "e0f3dba8ddb543a2ca", - "f0f9e8bae4bc7bccc42b8cbe", - "f0f9e8bae4bc7bccc443a2ca0868ac", - "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", - "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", - "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", - "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" -).map(colors); - -var GnBu = ramp(scheme$b); - -var scheme$c = new Array(3).concat( - "fee8c8fdbb84e34a33", - "fef0d9fdcc8afc8d59d7301f", - "fef0d9fdcc8afc8d59e34a33b30000", - "fef0d9fdd49efdbb84fc8d59e34a33b30000", - "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", - "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", - "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" -).map(colors); - -var OrRd = ramp(scheme$c); - -var scheme$d = new Array(3).concat( - "ece2f0a6bddb1c9099", - "f6eff7bdc9e167a9cf02818a", - "f6eff7bdc9e167a9cf1c9099016c59", - "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", - "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", - "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", - "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" -).map(colors); - -var PuBuGn = ramp(scheme$d); - -var scheme$e = new Array(3).concat( - "ece7f2a6bddb2b8cbe", - "f1eef6bdc9e174a9cf0570b0", - "f1eef6bdc9e174a9cf2b8cbe045a8d", - "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", - "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", - "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", - "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" -).map(colors); - -var PuBu = ramp(scheme$e); - -var scheme$f = new Array(3).concat( - "e7e1efc994c7dd1c77", - "f1eef6d7b5d8df65b0ce1256", - "f1eef6d7b5d8df65b0dd1c77980043", - "f1eef6d4b9dac994c7df65b0dd1c77980043", - "f1eef6d4b9dac994c7df65b0e7298ace125691003f", - "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", - "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" -).map(colors); - -var PuRd = ramp(scheme$f); - -var scheme$g = new Array(3).concat( - "fde0ddfa9fb5c51b8a", - "feebe2fbb4b9f768a1ae017e", - "feebe2fbb4b9f768a1c51b8a7a0177", - "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", - "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", - "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", - "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" -).map(colors); - -var RdPu = ramp(scheme$g); - -var scheme$h = new Array(3).concat( - "edf8b17fcdbb2c7fb8", - "ffffcca1dab441b6c4225ea8", - "ffffcca1dab441b6c42c7fb8253494", - "ffffccc7e9b47fcdbb41b6c42c7fb8253494", - "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", - "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", - "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" -).map(colors); - -var YlGnBu = ramp(scheme$h); - -var scheme$i = new Array(3).concat( - "f7fcb9addd8e31a354", - "ffffccc2e69978c679238443", - "ffffccc2e69978c67931a354006837", - "ffffccd9f0a3addd8e78c67931a354006837", - "ffffccd9f0a3addd8e78c67941ab5d238443005a32", - "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", - "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" -).map(colors); - -var YlGn = ramp(scheme$i); - -var scheme$j = new Array(3).concat( - "fff7bcfec44fd95f0e", - "ffffd4fed98efe9929cc4c02", - "ffffd4fed98efe9929d95f0e993404", - "ffffd4fee391fec44ffe9929d95f0e993404", - "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", - "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", - "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" -).map(colors); - -var YlOrBr = ramp(scheme$j); - -var scheme$k = new Array(3).concat( - "ffeda0feb24cf03b20", - "ffffb2fecc5cfd8d3ce31a1c", - "ffffb2fecc5cfd8d3cf03b20bd0026", - "ffffb2fed976feb24cfd8d3cf03b20bd0026", - "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", - "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", - "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" -).map(colors); - -var YlOrRd = ramp(scheme$k); - -var scheme$l = new Array(3).concat( - "deebf79ecae13182bd", - "eff3ffbdd7e76baed62171b5", - "eff3ffbdd7e76baed63182bd08519c", - "eff3ffc6dbef9ecae16baed63182bd08519c", - "eff3ffc6dbef9ecae16baed64292c62171b5084594", - "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", - "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" -).map(colors); - -var Blues = ramp(scheme$l); - -var scheme$m = new Array(3).concat( - "e5f5e0a1d99b31a354", - "edf8e9bae4b374c476238b45", - "edf8e9bae4b374c47631a354006d2c", - "edf8e9c7e9c0a1d99b74c47631a354006d2c", - "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", - "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", - "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" -).map(colors); - -var Greens = ramp(scheme$m); - -var scheme$n = new Array(3).concat( - "f0f0f0bdbdbd636363", - "f7f7f7cccccc969696525252", - "f7f7f7cccccc969696636363252525", - "f7f7f7d9d9d9bdbdbd969696636363252525", - "f7f7f7d9d9d9bdbdbd969696737373525252252525", - "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", - "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" -).map(colors); - -var Greys = ramp(scheme$n); - -var scheme$o = new Array(3).concat( - "efedf5bcbddc756bb1", - "f2f0f7cbc9e29e9ac86a51a3", - "f2f0f7cbc9e29e9ac8756bb154278f", - "f2f0f7dadaebbcbddc9e9ac8756bb154278f", - "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", - "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", - "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" -).map(colors); - -var Purples = ramp(scheme$o); - -var scheme$p = new Array(3).concat( - "fee0d2fc9272de2d26", - "fee5d9fcae91fb6a4acb181d", - "fee5d9fcae91fb6a4ade2d26a50f15", - "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", - "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", - "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", - "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" -).map(colors); - -var Reds = ramp(scheme$p); - -var scheme$q = new Array(3).concat( - "fee6cefdae6be6550d", - "feeddefdbe85fd8d3cd94701", - "feeddefdbe85fd8d3ce6550da63603", - "feeddefdd0a2fdae6bfd8d3ce6550da63603", - "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", - "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", - "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" -).map(colors); - -var Oranges = ramp(scheme$q); - -function cividis(t) { - t = Math.max(0, Math.min(1, t)); - return "rgb(" - + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " - + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " - + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) - + ")"; -} - -var cubehelix = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); - -var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); - -var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); - -var c = d3Color.cubehelix(); - -function rainbow(t) { - if (t < 0 || t > 1) t -= Math.floor(t); - var ts = Math.abs(t - 0.5); - c.h = 360 * t - 100; - c.s = 1.5 - 1.5 * ts; - c.l = 0.8 - 0.9 * ts; - return c + ""; -} - -var c$1 = d3Color.rgb(), - pi_1_3 = Math.PI / 3, - pi_2_3 = Math.PI * 2 / 3; - -function sinebow(t) { - var x; - t = (0.5 - t) * Math.PI; - c$1.r = 255 * (x = Math.sin(t)) * x; - c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; - c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; - return c$1 + ""; -} - -function turbo(t) { - t = Math.max(0, Math.min(1, t)); - return "rgb(" - + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " - + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " - + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) - + ")"; -} - -function ramp$1(range) { - var n = range.length; - return function(t) { - return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; - }; -} - -var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); - -var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); - -var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); - -var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); - -exports.interpolateBlues = Blues; -exports.interpolateBrBG = BrBG; -exports.interpolateBuGn = BuGn; -exports.interpolateBuPu = BuPu; -exports.interpolateCividis = cividis; -exports.interpolateCool = cool; -exports.interpolateCubehelixDefault = cubehelix; -exports.interpolateGnBu = GnBu; -exports.interpolateGreens = Greens; -exports.interpolateGreys = Greys; -exports.interpolateInferno = inferno; -exports.interpolateMagma = magma; -exports.interpolateOrRd = OrRd; -exports.interpolateOranges = Oranges; -exports.interpolatePRGn = PRGn; -exports.interpolatePiYG = PiYG; -exports.interpolatePlasma = plasma; -exports.interpolatePuBu = PuBu; -exports.interpolatePuBuGn = PuBuGn; -exports.interpolatePuOr = PuOr; -exports.interpolatePuRd = PuRd; -exports.interpolatePurples = Purples; -exports.interpolateRainbow = rainbow; -exports.interpolateRdBu = RdBu; -exports.interpolateRdGy = RdGy; -exports.interpolateRdPu = RdPu; -exports.interpolateRdYlBu = RdYlBu; -exports.interpolateRdYlGn = RdYlGn; -exports.interpolateReds = Reds; -exports.interpolateSinebow = sinebow; -exports.interpolateSpectral = Spectral; -exports.interpolateTurbo = turbo; -exports.interpolateViridis = viridis; -exports.interpolateWarm = warm; -exports.interpolateYlGn = YlGn; -exports.interpolateYlGnBu = YlGnBu; -exports.interpolateYlOrBr = YlOrBr; -exports.interpolateYlOrRd = YlOrRd; -exports.schemeAccent = Accent; -exports.schemeBlues = scheme$l; -exports.schemeBrBG = scheme; -exports.schemeBuGn = scheme$9; -exports.schemeBuPu = scheme$a; -exports.schemeCategory10 = category10; -exports.schemeDark2 = Dark2; -exports.schemeGnBu = scheme$b; -exports.schemeGreens = scheme$m; -exports.schemeGreys = scheme$n; -exports.schemeOrRd = scheme$c; -exports.schemeOranges = scheme$q; -exports.schemePRGn = scheme$1; -exports.schemePaired = Paired; -exports.schemePastel1 = Pastel1; -exports.schemePastel2 = Pastel2; -exports.schemePiYG = scheme$2; -exports.schemePuBu = scheme$e; -exports.schemePuBuGn = scheme$d; -exports.schemePuOr = scheme$3; -exports.schemePuRd = scheme$f; -exports.schemePurples = scheme$o; -exports.schemeRdBu = scheme$4; -exports.schemeRdGy = scheme$5; -exports.schemeRdPu = scheme$g; -exports.schemeRdYlBu = scheme$6; -exports.schemeRdYlGn = scheme$7; -exports.schemeReds = scheme$p; -exports.schemeSet1 = Set1; -exports.schemeSet2 = Set2; -exports.schemeSet3 = Set3; -exports.schemeSpectral = scheme$8; -exports.schemeTableau10 = Tableau10; -exports.schemeYlGn = scheme$i; -exports.schemeYlGnBu = scheme$h; -exports.schemeYlOrBr = scheme$j; -exports.schemeYlOrRd = scheme$k; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{"d3-color":13,"d3-interpolate":24}],30:[function(require,module,exports){ -// https://d3js.org/d3-scale/ v2.2.2 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-collection'), require('d3-array'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-collection', 'd3-array', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format'], factory) : -(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3)); -}(this, (function (exports,d3Collection,d3Array,d3Interpolate,d3Format,d3Time,d3TimeFormat) { 'use strict'; - -function initRange(domain, range) { - switch (arguments.length) { - case 0: break; - case 1: this.range(domain); break; - default: this.range(range).domain(domain); break; - } - return this; -} - -function initInterpolator(domain, interpolator) { - switch (arguments.length) { - case 0: break; - case 1: this.interpolator(domain); break; - default: this.interpolator(interpolator).domain(domain); break; - } - return this; -} - -var array = Array.prototype; - -var map = array.map; -var slice = array.slice; - -var implicit = {name: "implicit"}; - -function ordinal() { - var index = d3Collection.map(), - domain = [], - range = [], - unknown = implicit; - - function scale(d) { - var key = d + "", i = index.get(key); - if (!i) { - if (unknown !== implicit) return unknown; - index.set(key, i = domain.push(d)); - } - return range[(i - 1) % range.length]; - } - - scale.domain = function(_) { - if (!arguments.length) return domain.slice(); - domain = [], index = d3Collection.map(); - var i = -1, n = _.length, d, key; - while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); - return scale; - }; - - scale.range = function(_) { - return arguments.length ? (range = slice.call(_), scale) : range.slice(); - }; - - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; - - scale.copy = function() { - return ordinal(domain, range).unknown(unknown); - }; - - initRange.apply(scale, arguments); - - return scale; -} - -function band() { - var scale = ordinal().unknown(undefined), - domain = scale.domain, - ordinalRange = scale.range, - range = [0, 1], - step, - bandwidth, - round = false, - paddingInner = 0, - paddingOuter = 0, - align = 0.5; - - delete scale.unknown; - - function rescale() { - var n = domain().length, - reverse = range[1] < range[0], - start = range[reverse - 0], - stop = range[1 - reverse]; - step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); - if (round) step = Math.floor(step); - start += (stop - start - step * (n - paddingInner)) * align; - bandwidth = step * (1 - paddingInner); - if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); - var values = d3Array.range(n).map(function(i) { return start + step * i; }); - return ordinalRange(reverse ? values.reverse() : values); - } - - scale.domain = function(_) { - return arguments.length ? (domain(_), rescale()) : domain(); - }; - - scale.range = function(_) { - return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); - }; - - scale.rangeRound = function(_) { - return range = [+_[0], +_[1]], round = true, rescale(); - }; - - scale.bandwidth = function() { - return bandwidth; - }; - - scale.step = function() { - return step; - }; - - scale.round = function(_) { - return arguments.length ? (round = !!_, rescale()) : round; - }; - - scale.padding = function(_) { - return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; - }; - - scale.paddingInner = function(_) { - return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; - }; - - scale.paddingOuter = function(_) { - return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; - }; - - scale.align = function(_) { - return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; - }; - - scale.copy = function() { - return band(domain(), range) - .round(round) - .paddingInner(paddingInner) - .paddingOuter(paddingOuter) - .align(align); - }; - - return initRange.apply(rescale(), arguments); -} - -function pointish(scale) { - var copy = scale.copy; - - scale.padding = scale.paddingOuter; - delete scale.paddingInner; - delete scale.paddingOuter; - - scale.copy = function() { - return pointish(copy()); - }; - - return scale; -} - -function point() { - return pointish(band.apply(null, arguments).paddingInner(1)); -} - -function constant(x) { - return function() { - return x; - }; -} - -function number(x) { - return +x; -} - -var unit = [0, 1]; - -function identity(x) { - return x; -} - -function normalize(a, b) { - return (b -= (a = +a)) - ? function(x) { return (x - a) / b; } - : constant(isNaN(b) ? NaN : 0.5); -} - -function clamper(domain) { - var a = domain[0], b = domain[domain.length - 1], t; - if (a > b) t = a, a = b, b = t; - return function(x) { return Math.max(a, Math.min(b, x)); }; -} + contours.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold; + }; -// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. -// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. -function bimap(domain, range, interpolate) { - var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; - if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); - else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); - return function(x) { return r0(d0(x)); }; -} - -function polymap(domain, range, interpolate) { - var j = Math.min(domain.length, range.length) - 1, - d = new Array(j), - r = new Array(j), - i = -1; - - // Reverse descending domains. - if (domain[j] < domain[0]) { - domain = domain.slice().reverse(); - range = range.slice().reverse(); - } - - while (++i < j) { - d[i] = normalize(domain[i], domain[i + 1]); - r[i] = interpolate(range[i], range[i + 1]); - } - - return function(x) { - var i = d3Array.bisect(domain, x, 1, j) - 1; - return r[i](d[i](x)); - }; -} - -function copy(source, target) { - return target - .domain(source.domain()) - .range(source.range()) - .interpolate(source.interpolate()) - .clamp(source.clamp()) - .unknown(source.unknown()); -} - -function transformer() { - var domain = unit, - range = unit, - interpolate = d3Interpolate.interpolate, - transform, - untransform, - unknown, - clamp = identity, - piecewise, - output, - input; - - function rescale() { - piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; - output = input = null; - return scale; - } - - function scale(x) { - return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); - } - - scale.invert = function(y) { - return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y))); - }; - - scale.domain = function(_) { - return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice(); - }; - - scale.range = function(_) { - return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); - }; - - scale.rangeRound = function(_) { - return range = slice.call(_), interpolate = d3Interpolate.interpolateRound, rescale(); - }; - - scale.clamp = function(_) { - return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity; - }; - - scale.interpolate = function(_) { - return arguments.length ? (interpolate = _, rescale()) : interpolate; - }; - - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; - - return function(t, u) { - transform = t, untransform = u; - return rescale(); - }; -} - -function continuous(transform, untransform) { - return transformer()(transform, untransform); -} - -function tickFormat(start, stop, count, specifier) { - var step = d3Array.tickStep(start, stop, count), - precision; - specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); - switch (specifier.type) { - case "s": { - var value = Math.max(Math.abs(start), Math.abs(stop)); - if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; - return d3Format.formatPrefix(specifier, value); - } - case "": - case "e": - case "g": - case "p": - case "r": { - if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); - break; - } - case "f": - case "%": { - if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; - break; - } - } - return d3Format.format(specifier); -} - -function linearish(scale) { - var domain = scale.domain; - - scale.ticks = function(count) { - var d = domain(); - return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); - }; - - scale.tickFormat = function(count, specifier) { - var d = domain(); - return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); - }; - - scale.nice = function(count) { - if (count == null) count = 10; - - var d = domain(), - i0 = 0, - i1 = d.length - 1, - start = d[i0], - stop = d[i1], - step; - - if (stop < start) { - step = start, start = stop, stop = step; - step = i0, i0 = i1, i1 = step; - } + contours.smooth = function (_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear; + }; - step = d3Array.tickIncrement(start, stop, count); + return contours; + } - if (step > 0) { - start = Math.floor(start / step) * step; - stop = Math.ceil(stop / step) * step; - step = d3Array.tickIncrement(start, stop, count); - } else if (step < 0) { - start = Math.ceil(start * step) / step; - stop = Math.floor(stop * step) / step; - step = d3Array.tickIncrement(start, stop, count); - } +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. + function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } + } - if (step > 0) { - d[i0] = Math.floor(start / step) * step; - d[i1] = Math.ceil(stop / step) * step; - domain(d); - } else if (step < 0) { - d[i0] = Math.ceil(start * step) / step; - d[i1] = Math.floor(stop * step) / step; - domain(d); - } +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. + function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } + } - return scale; - }; + function defaultX(d) { + return d[0]; + } - return scale; -} + function defaultY(d) { + return d[1]; + } -function linear() { - var scale = continuous(identity, identity); + function defaultWeight() { + return 1; + } - scale.copy = function() { - return copy(scale, linear()); - }; + function density() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function (d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = d3Array.max(values0); + tz = d3Array.tickStep(0, stop, tz); + tz = d3Array.range(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } - initRange.apply(scale, arguments); - - return linearish(scale); -} - -function identity$1(domain) { - var unknown; - - function scale(x) { - return isNaN(x = +x) ? unknown : x; - } - - scale.invert = scale; - - scale.domain = scale.range = function(_) { - return arguments.length ? (domain = map.call(_, number), scale) : domain.slice(); - }; - - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; - - scale.copy = function() { - return identity$1(domain).unknown(unknown); - }; - - domain = arguments.length ? map.call(domain, number) : [0, 1]; - - return linearish(scale); -} - -function nice(domain, interval) { - domain = domain.slice(); - - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - t; - - if (x1 < x0) { - t = i0, i0 = i1, i1 = t; - t = x0, x0 = x1, x1 = t; - } - - domain[i0] = interval.floor(x0); - domain[i1] = interval.ceil(x1); - return domain; -} - -function transformLog(x) { - return Math.log(x); -} - -function transformExp(x) { - return Math.exp(x); -} - -function transformLogn(x) { - return -Math.log(-x); -} - -function transformExpn(x) { - return -Math.exp(-x); -} - -function pow10(x) { - return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; -} - -function powp(base) { - return base === 10 ? pow10 - : base === Math.E ? Math.exp - : function(x) { return Math.pow(base, x); }; -} - -function logp(base) { - return base === Math.E ? Math.log - : base === 10 && Math.log10 - || base === 2 && Math.log2 - || (base = Math.log(base), function(x) { return Math.log(x) / base; }); -} - -function reflect(f) { - return function(x) { - return -f(-x); - }; -} - -function loggish(transform) { - var scale = transform(transformLog, transformExp), - domain = scale.domain, - base = 10, - logs, - pows; - - function rescale() { - logs = logp(base), pows = powp(base); - if (domain()[0] < 0) { - logs = reflect(logs), pows = reflect(pows); - transform(transformLogn, transformExpn); - } else { - transform(transformLog, transformExp); - } - return scale; - } - - scale.base = function(_) { - return arguments.length ? (base = +_, rescale()) : base; - }; - - scale.domain = function(_) { - return arguments.length ? (domain(_), rescale()) : domain(); - }; - - scale.ticks = function(count) { - var d = domain(), - u = d[0], - v = d[d.length - 1], - r; - - if (r = v < u) i = u, u = v, v = i; - - var i = logs(u), - j = logs(v), - p, - k, - t, - n = count == null ? 10 : +count, - z = []; - - if (!(base % 1) && j - i < n) { - i = Math.round(i) - 1, j = Math.round(j) + 1; - if (u > 0) for (; i < j; ++i) { - for (k = 1, p = pows(i); k < base; ++k) { - t = p * k; - if (t < u) continue; - if (t > v) break; - z.push(t); - } - } else for (; i < j; ++i) { - for (k = base - 1, p = pows(i); k >= 1; --k) { - t = p * k; - if (t < u) continue; - if (t > v) break; - z.push(t); - } - } - } else { - z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); - } + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } - return r ? z.reverse() : z; - }; - - scale.tickFormat = function(count, specifier) { - if (specifier == null) specifier = base === 10 ? ".0e" : ","; - if (typeof specifier !== "function") specifier = d3Format.format(specifier); - if (count === Infinity) return specifier; - if (count == null) count = 10; - var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? - return function(d) { - var i = d / pows(Math.round(logs(d))); - if (i * base < base - 0.5) i *= base; - return i <= k ? specifier(d) : ""; - }; - }; - - scale.nice = function() { - return domain(nice(domain(), { - floor: function(x) { return pows(Math.floor(logs(x))); }, - ceil: function(x) { return pows(Math.ceil(logs(x))); } - })); - }; - - return scale; -} - -function log() { - var scale = loggish(transformer()).domain([1, 10]); - - scale.copy = function() { - return copy(scale, log()).base(scale.base()); - }; - - initRange.apply(scale, arguments); - - return scale; -} - -function transformSymlog(c) { - return function(x) { - return Math.sign(x) * Math.log1p(Math.abs(x / c)); - }; -} - -function transformSymexp(c) { - return function(x) { - return Math.sign(x) * Math.expm1(Math.abs(x)) * c; - }; -} - -function symlogish(transform) { - var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); - - scale.constant = function(_) { - return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; - }; - - return linearish(scale); -} - -function symlog() { - var scale = symlogish(transformer()); - - scale.copy = function() { - return copy(scale, symlog()).constant(scale.constant()); - }; - - return initRange.apply(scale, arguments); -} - -function transformPow(exponent) { - return function(x) { - return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); - }; -} - -function transformSqrt(x) { - return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); -} - -function transformSquare(x) { - return x < 0 ? -x * x : x * x; -} - -function powish(transform) { - var scale = transform(identity, identity), - exponent = 1; - - function rescale() { - return exponent === 1 ? transform(identity, identity) - : exponent === 0.5 ? transform(transformSqrt, transformSquare) - : transform(transformPow(exponent), transformPow(1 / exponent)); - } - - scale.exponent = function(_) { - return arguments.length ? (exponent = +_, rescale()) : exponent; - }; - - return linearish(scale); -} - -function pow() { - var scale = powish(transformer()); - - scale.copy = function() { - return copy(scale, pow()).exponent(scale.exponent()); - }; - - initRange.apply(scale, arguments); - - return scale; -} - -function sqrt() { - return pow.apply(null, arguments).exponent(0.5); -} - -function quantile() { - var domain = [], - range = [], - thresholds = [], - unknown; - - function rescale() { - var i = 0, n = Math.max(1, range.length); - thresholds = new Array(n - 1); - while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n); - return scale; - } - - function scale(x) { - return isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)]; - } - - scale.invertExtent = function(y) { - var i = range.indexOf(y); - return i < 0 ? [NaN, NaN] : [ - i > 0 ? thresholds[i - 1] : domain[0], - i < thresholds.length ? thresholds[i] : domain[domain.length - 1] - ]; - }; - - scale.domain = function(_) { - if (!arguments.length) return domain.slice(); - domain = []; - for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); - domain.sort(d3Array.ascending); - return rescale(); - }; - - scale.range = function(_) { - return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); - }; - - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; - - scale.quantiles = function() { - return thresholds.slice(); - }; - - scale.copy = function() { - return quantile() - .domain(domain) - .range(range) - .unknown(unknown); - }; - - return initRange.apply(scale, arguments); -} - -function quantize() { - var x0 = 0, - x1 = 1, - n = 1, - domain = [0.5], - range = [0, 1], - unknown; - - function scale(x) { - return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; - } - - function rescale() { - var i = -1; - domain = new Array(n); - while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); - return scale; - } - - scale.domain = function(_) { - return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; - }; - - scale.range = function(_) { - return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice(); - }; - - scale.invertExtent = function(y) { - var i = range.indexOf(y); - return i < 0 ? [NaN, NaN] - : i < 1 ? [x0, domain[0]] - : i >= n ? [domain[n - 1], x1] - : [domain[i - 1], domain[i]]; - }; - - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : scale; - }; - - scale.thresholds = function() { - return domain.slice(); - }; - - scale.copy = function() { - return quantize() - .domain([x0, x1]) - .range(range) - .unknown(unknown); - }; - - return initRange.apply(linearish(scale), arguments); -} - -function threshold() { - var domain = [0.5], - range = [0, 1], - unknown, - n = 1; - - function scale(x) { - return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; - } - - scale.domain = function(_) { - return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); - }; - - scale.range = function(_) { - return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); - }; - - scale.invertExtent = function(y) { - var i = range.indexOf(y); - return [domain[i - 1], domain[i]]; - }; - - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; - - scale.copy = function() { - return threshold() - .domain(domain) - .range(range) - .unknown(unknown); - }; - - return initRange.apply(scale, arguments); -} - -var durationSecond = 1000, - durationMinute = durationSecond * 60, - durationHour = durationMinute * 60, - durationDay = durationHour * 24, - durationWeek = durationDay * 7, - durationMonth = durationDay * 30, - durationYear = durationDay * 365; - -function date(t) { - return new Date(t); -} - -function number$1(t) { - return t instanceof Date ? +t : +new Date(+t); -} - -function calendar(year, month, week, day, hour, minute, second, millisecond, format) { - var scale = continuous(identity, identity), - invert = scale.invert, - domain = scale.domain; - - var formatMillisecond = format(".%L"), - formatSecond = format(":%S"), - formatMinute = format("%I:%M"), - formatHour = format("%I %p"), - formatDay = format("%a %d"), - formatWeek = format("%b %d"), - formatMonth = format("%B"), - formatYear = format("%Y"); - - var tickIntervals = [ - [second, 1, durationSecond], - [second, 5, 5 * durationSecond], - [second, 15, 15 * durationSecond], - [second, 30, 30 * durationSecond], - [minute, 1, durationMinute], - [minute, 5, 5 * durationMinute], - [minute, 15, 15 * durationMinute], - [minute, 30, 30 * durationMinute], - [ hour, 1, durationHour ], - [ hour, 3, 3 * durationHour ], - [ hour, 6, 6 * durationHour ], - [ hour, 12, 12 * durationHour ], - [ day, 1, durationDay ], - [ day, 2, 2 * durationDay ], - [ week, 1, durationWeek ], - [ month, 1, durationMonth ], - [ month, 3, 3 * durationMonth ], - [ year, 1, durationYear ] - ]; - - function tickFormat(date) { - return (second(date) < date ? formatMillisecond - : minute(date) < date ? formatSecond - : hour(date) < date ? formatMinute - : day(date) < date ? formatHour - : month(date) < date ? (week(date) < date ? formatDay : formatWeek) - : year(date) < date ? formatMonth - : formatYear)(date); - } - - function tickInterval(interval, start, stop, step) { - if (interval == null) interval = 10; - - // If a desired tick count is specified, pick a reasonable tick interval - // based on the extent of the domain and a rough estimate of tick size. - // Otherwise, assume interval is already a time interval and use it. - if (typeof interval === "number") { - var target = Math.abs(stop - start) / interval, - i = d3Array.bisector(function(i) { return i[2]; }).right(tickIntervals, target); - if (i === tickIntervals.length) { - step = d3Array.tickStep(start / durationYear, stop / durationYear, interval); - interval = year; - } else if (i) { - i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; - step = i[1]; - interval = i[0]; - } else { - step = Math.max(d3Array.tickStep(start, stop, interval), 1); - interval = millisecond; - } - } + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } - return step == null ? interval : interval.every(step); - } - - scale.invert = function(y) { - return new Date(invert(y)); - }; - - scale.domain = function(_) { - return arguments.length ? domain(map.call(_, number$1)) : domain().map(date); - }; - - scale.ticks = function(interval, step) { - var d = domain(), - t0 = d[0], - t1 = d[d.length - 1], - r = t1 < t0, - t; - if (r) t = t0, t0 = t1, t1 = t; - t = tickInterval(interval, t0, t1, step); - t = t ? t.range(t0, t1 + 1) : []; // inclusive stop - return r ? t.reverse() : t; - }; - - scale.tickFormat = function(count, specifier) { - return specifier == null ? tickFormat : format(specifier); - }; - - scale.nice = function(interval, step) { - var d = domain(); - return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) - ? domain(nice(d, interval)) - : scale; - }; - - scale.copy = function() { - return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); - }; - - return scale; -} - -function time() { - return initRange.apply(calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); -} - -function utcTime() { - return initRange.apply(calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); -} - -function transformer$1() { - var x0 = 0, - x1 = 1, - t0, - t1, - k10, - transform, - interpolator = identity, - clamp = false, - unknown; - - function scale(x) { - return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); - } - - scale.domain = function(_) { - return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; - }; - - scale.clamp = function(_) { - return arguments.length ? (clamp = !!_, scale) : clamp; - }; - - scale.interpolator = function(_) { - return arguments.length ? (interpolator = _, scale) : interpolator; - }; - - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; - - return function(t) { - transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); - return scale; - }; -} - -function copy$1(source, target) { - return target - .domain(source.domain()) - .interpolator(source.interpolator()) - .clamp(source.clamp()) - .unknown(source.unknown()); -} - -function sequential() { - var scale = linearish(transformer$1()(identity)); - - scale.copy = function() { - return copy$1(scale, sequential()); - }; - - return initInterpolator.apply(scale, arguments); -} - -function sequentialLog() { - var scale = loggish(transformer$1()).domain([1, 10]); - - scale.copy = function() { - return copy$1(scale, sequentialLog()).base(scale.base()); - }; - - return initInterpolator.apply(scale, arguments); -} - -function sequentialSymlog() { - var scale = symlogish(transformer$1()); - - scale.copy = function() { - return copy$1(scale, sequentialSymlog()).constant(scale.constant()); - }; - - return initInterpolator.apply(scale, arguments); -} - -function sequentialPow() { - var scale = powish(transformer$1()); - - scale.copy = function() { - return copy$1(scale, sequentialPow()).exponent(scale.exponent()); - }; - - return initInterpolator.apply(scale, arguments); -} - -function sequentialSqrt() { - return sequentialPow.apply(null, arguments).exponent(0.5); -} - -function sequentialQuantile() { - var domain = [], - interpolator = identity; - - function scale(x) { - if (!isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x) - 1) / (domain.length - 1)); - } - - scale.domain = function(_) { - if (!arguments.length) return domain.slice(); - domain = []; - for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); - domain.sort(d3Array.ascending); - return scale; - }; - - scale.interpolator = function(_) { - return arguments.length ? (interpolator = _, scale) : interpolator; - }; - - scale.copy = function() { - return sequentialQuantile(interpolator).domain(domain); - }; - - return initInterpolator.apply(scale, arguments); -} - -function transformer$2() { - var x0 = 0, - x1 = 0.5, - x2 = 1, - t0, - t1, - t2, - k10, - k21, - interpolator = identity, - transform, - clamp = false, - unknown; - - function scale(x) { - return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); - } - - scale.domain = function(_) { - return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2]; - }; - - scale.clamp = function(_) { - return arguments.length ? (clamp = !!_, scale) : clamp; - }; - - scale.interpolator = function(_) { - return arguments.length ? (interpolator = _, scale) : interpolator; - }; - - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; - - return function(t) { - transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1); - return scale; - }; -} - -function diverging() { - var scale = linearish(transformer$2()(identity)); - - scale.copy = function() { - return copy$1(scale, diverging()); - }; - - return initInterpolator.apply(scale, arguments); -} - -function divergingLog() { - var scale = loggish(transformer$2()).domain([0.1, 1, 10]); - - scale.copy = function() { - return copy$1(scale, divergingLog()).base(scale.base()); - }; - - return initInterpolator.apply(scale, arguments); -} - -function divergingSymlog() { - var scale = symlogish(transformer$2()); - - scale.copy = function() { - return copy$1(scale, divergingSymlog()).constant(scale.constant()); - }; - - return initInterpolator.apply(scale, arguments); -} - -function divergingPow() { - var scale = powish(transformer$2()); - - scale.copy = function() { - return copy$1(scale, divergingPow()).exponent(scale.exponent()); - }; - - return initInterpolator.apply(scale, arguments); -} - -function divergingSqrt() { - return divergingPow.apply(null, arguments).exponent(0.5); -} - -exports.scaleBand = band; -exports.scalePoint = point; -exports.scaleIdentity = identity$1; -exports.scaleLinear = linear; -exports.scaleLog = log; -exports.scaleSymlog = symlog; -exports.scaleOrdinal = ordinal; -exports.scaleImplicit = implicit; -exports.scalePow = pow; -exports.scaleSqrt = sqrt; -exports.scaleQuantile = quantile; -exports.scaleQuantize = quantize; -exports.scaleThreshold = threshold; -exports.scaleTime = time; -exports.scaleUtc = utcTime; -exports.scaleSequential = sequential; -exports.scaleSequentialLog = sequentialLog; -exports.scaleSequentialPow = sequentialPow; -exports.scaleSequentialSqrt = sequentialSqrt; -exports.scaleSequentialSymlog = sequentialSymlog; -exports.scaleSequentialQuantile = sequentialQuantile; -exports.scaleDiverging = diverging; -exports.scaleDivergingLog = divergingLog; -exports.scaleDivergingPow = divergingPow; -exports.scaleDivergingSqrt = divergingSqrt; -exports.scaleDivergingSymlog = divergingSymlog; -exports.tickFormat = tickFormat; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -},{"d3-array":8,"d3-collection":12,"d3-format":21,"d3-interpolate":24,"d3-time":34,"d3-time-format":33}],31:[function(require,module,exports){ -// https://d3js.org/d3-selection/ v1.4.1 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -var xhtml = "http://www.w3.org/1999/xhtml"; - -var namespaces = { - svg: "http://www.w3.org/2000/svg", - xhtml: xhtml, - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" -}; - -function namespace(name) { - var prefix = name += "", i = prefix.indexOf(":"); - if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); - return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; -} - -function creatorInherit(name) { - return function() { - var document = this.ownerDocument, - uri = this.namespaceURI; - return uri === xhtml && document.documentElement.namespaceURI === xhtml - ? document.createElement(name) - : document.createElementNS(uri, name); - }; -} - -function creatorFixed(fullname) { - return function() { - return this.ownerDocument.createElementNS(fullname.space, fullname.local); - }; -} - -function creator(name) { - var fullname = namespace(name); - return (fullname.local - ? creatorFixed - : creatorInherit)(fullname); -} - -function none() {} - -function selector(selector) { - return selector == null ? none : function() { - return this.querySelector(selector); - }; -} - -function selection_select(select) { - if (typeof select !== "function") select = selector(select); - - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { - if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { - if ("__data__" in node) subnode.__data__ = node.__data__; - subgroup[i] = subnode; - } - } - } - - return new Selection(subgroups, this._parents); -} - -function empty() { - return []; -} - -function selectorAll(selector) { - return selector == null ? empty : function() { - return this.querySelectorAll(selector); - }; -} - -function selection_selectAll(select) { - if (typeof select !== "function") select = selectorAll(select); - - for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - subgroups.push(select.call(node, node.__data__, i, group)); - parents.push(node); - } - } - } + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } - return new Selection(subgroups, parents); -} + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } -function matcher(selector) { - return function() { - return this.matches(selector); - }; -} + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } -function selection_filter(match) { - if (typeof match !== "function") match = matcher(match); + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { - if ((node = group[i]) && match.call(node, node.__data__, i, group)) { - subgroup.push(node); - } - } - } - - return new Selection(subgroups, this._parents); -} - -function sparse(update) { - return new Array(update.length); -} - -function selection_enter() { - return new Selection(this._enter || this._groups.map(sparse), this._parents); -} - -function EnterNode(parent, datum) { - this.ownerDocument = parent.ownerDocument; - this.namespaceURI = parent.namespaceURI; - this._next = null; - this._parent = parent; - this.__data__ = datum; -} - -EnterNode.prototype = { - constructor: EnterNode, - appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, - insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, - querySelector: function(selector) { return this._parent.querySelector(selector); }, - querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } -}; - -function constant(x) { - return function() { - return x; - }; -} - -var keyPrefix = "$"; // Protect against keys like “__proto__”. - -function bindIndex(parent, group, enter, update, exit, data) { - var i = 0, - node, - groupLength = group.length, - dataLength = data.length; - - // Put any non-null nodes that fit into update. - // Put any null nodes into enter. - // Put any remaining data into enter. - for (; i < dataLength; ++i) { - if (node = group[i]) { - node.__data__ = data[i]; - update[i] = node; - } else { - enter[i] = new EnterNode(parent, data[i]); - } - } + density.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), density) : x; + }; + + density.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), density) : y; + }; + + density.weight = function (_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant(+_), density) : weight; + }; + + density.size = function (_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function (_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold; + }; + + density.bandwidth = function (_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; + } - // Put any non-null nodes that don’t fit into exit. - for (; i < groupLength; ++i) { - if (node = group[i]) { - exit[i] = node; - } - } -} - -function bindKey(parent, group, enter, update, exit, data, key) { - var i, - node, - nodeByKeyValue = {}, - groupLength = group.length, - dataLength = data.length, - keyValues = new Array(groupLength), - keyValue; - - // Compute the key for each node. - // If multiple nodes have the same key, the duplicates are added to exit. - for (i = 0; i < groupLength; ++i) { - if (node = group[i]) { - keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); - if (keyValue in nodeByKeyValue) { - exit[i] = node; - } else { - nodeByKeyValue[keyValue] = node; - } - } - } - - // Compute the key for each datum. - // If there a node associated with this key, join and add it to update. - // If there is not (or the key is a duplicate), add it to enter. - for (i = 0; i < dataLength; ++i) { - keyValue = keyPrefix + key.call(parent, data[i], i, data); - if (node = nodeByKeyValue[keyValue]) { - update[i] = node; - node.__data__ = data[i]; - nodeByKeyValue[keyValue] = null; - } else { - enter[i] = new EnterNode(parent, data[i]); - } - } + exports.contours = contours; + exports.contourDensity = density; - // Add any remaining nodes that were not bound to data to exit. - for (i = 0; i < groupLength; ++i) { - if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { - exit[i] = node; - } - } -} - -function selection_data(value, key) { - if (!value) { - data = new Array(this.size()), j = -1; - this.each(function(d) { data[++j] = d; }); - return data; - } - - var bind = key ? bindKey : bindIndex, - parents = this._parents, - groups = this._groups; - - if (typeof value !== "function") value = constant(value); - - for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { - var parent = parents[j], - group = groups[j], - groupLength = group.length, - data = value.call(parent, parent && parent.__data__, j, parents), - dataLength = data.length, - enterGroup = enter[j] = new Array(dataLength), - updateGroup = update[j] = new Array(dataLength), - exitGroup = exit[j] = new Array(groupLength); - - bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); - - // Now connect the enter nodes to their following update node, such that - // appendChild can insert the materialized enter node before this node, - // rather than at the end of the parent node. - for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { - if (previous = enterGroup[i0]) { - if (i0 >= i1) i1 = i0 + 1; - while (!(next = updateGroup[i1]) && ++i1 < dataLength); - previous._next = next || null; - } - } - } - - update = new Selection(update, parents); - update._enter = enter; - update._exit = exit; - return update; -} - -function selection_exit() { - return new Selection(this._exit || this._groups.map(sparse), this._parents); -} - -function selection_join(onenter, onupdate, onexit) { - var enter = this.enter(), update = this, exit = this.exit(); - enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); - if (onupdate != null) update = onupdate(update); - if (onexit == null) exit.remove(); else onexit(exit); - return enter && update ? enter.merge(update).order() : update; -} - -function selection_merge(selection) { - - for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { - for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group0[i] || group1[i]) { - merge[i] = node; - } - } - } + Object.defineProperty(exports, '__esModule', {value: true}); - for (; j < m0; ++j) { - merges[j] = groups0[j]; - } + }))); - return new Selection(merges, this._parents); -} + }, {"d3-array": 8}], + 15: [function (require, module, exports) { +// https://d3js.org/d3-dispatch/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var noop = { + value: function () { + } + }; -function selection_order() { + function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); + } - for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { - for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { - if (node = group[i]) { - if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); - next = node; - } - } - } + function Dispatch(_) { + this._ = _; + } - return this; -} + function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); + } -function selection_sort(compare) { - if (!compare) compare = ascending; + Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function (typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } - function compareNode(a, b) { - return a && b ? compare(a.__data__, b.__data__) : !a - !b; - } + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } - for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group[i]) { - sortgroup[i] = node; - } - } - sortgroup.sort(compareNode); - } - - return new Selection(sortgroups, this._parents).order(); -} - -function ascending(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -} - -function selection_call() { - var callback = arguments[0]; - arguments[0] = this; - callback.apply(null, arguments); - return this; -} - -function selection_nodes() { - var nodes = new Array(this.size()), i = -1; - this.each(function() { nodes[++i] = this; }); - return nodes; -} - -function selection_node() { - - for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { - for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { - var node = group[i]; - if (node) return node; - } - } + return this; + }, + copy: function () { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function (type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function (type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } + }; - return null; -} + function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } + } -function selection_size() { - var size = 0; - this.each(function() { ++size; }); - return size; -} + function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; + } -function selection_empty() { - return !this.node(); -} + exports.dispatch = dispatch; -function selection_each(callback) { + Object.defineProperty(exports, '__esModule', {value: true}); - for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { - for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { - if (node = group[i]) callback.call(node, node.__data__, i, group); - } - } - - return this; -} - -function attrRemove(name) { - return function() { - this.removeAttribute(name); - }; -} - -function attrRemoveNS(fullname) { - return function() { - this.removeAttributeNS(fullname.space, fullname.local); - }; -} - -function attrConstant(name, value) { - return function() { - this.setAttribute(name, value); - }; -} - -function attrConstantNS(fullname, value) { - return function() { - this.setAttributeNS(fullname.space, fullname.local, value); - }; -} - -function attrFunction(name, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) this.removeAttribute(name); - else this.setAttribute(name, v); - }; -} - -function attrFunctionNS(fullname, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) this.removeAttributeNS(fullname.space, fullname.local); - else this.setAttributeNS(fullname.space, fullname.local, v); - }; -} - -function selection_attr(name, value) { - var fullname = namespace(name); - - if (arguments.length < 2) { - var node = this.node(); - return fullname.local - ? node.getAttributeNS(fullname.space, fullname.local) - : node.getAttribute(fullname); - } - - return this.each((value == null - ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" - ? (fullname.local ? attrFunctionNS : attrFunction) - : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); -} - -function defaultView(node) { - return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node - || (node.document && node) // node is a Window - || node.defaultView; // node is a Document -} - -function styleRemove(name) { - return function() { - this.style.removeProperty(name); - }; -} - -function styleConstant(name, value, priority) { - return function() { - this.style.setProperty(name, value, priority); - }; -} - -function styleFunction(name, value, priority) { - return function() { - var v = value.apply(this, arguments); - if (v == null) this.style.removeProperty(name); - else this.style.setProperty(name, v, priority); - }; -} - -function selection_style(name, value, priority) { - return arguments.length > 1 - ? this.each((value == null - ? styleRemove : typeof value === "function" - ? styleFunction - : styleConstant)(name, value, priority == null ? "" : priority)) - : styleValue(this.node(), name); -} - -function styleValue(node, name) { - return node.style.getPropertyValue(name) - || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); -} - -function propertyRemove(name) { - return function() { - delete this[name]; - }; -} - -function propertyConstant(name, value) { - return function() { - this[name] = value; - }; -} - -function propertyFunction(name, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) delete this[name]; - else this[name] = v; - }; -} - -function selection_property(name, value) { - return arguments.length > 1 - ? this.each((value == null - ? propertyRemove : typeof value === "function" - ? propertyFunction - : propertyConstant)(name, value)) - : this.node()[name]; -} - -function classArray(string) { - return string.trim().split(/^|\s+/); -} - -function classList(node) { - return node.classList || new ClassList(node); -} - -function ClassList(node) { - this._node = node; - this._names = classArray(node.getAttribute("class") || ""); -} - -ClassList.prototype = { - add: function(name) { - var i = this._names.indexOf(name); - if (i < 0) { - this._names.push(name); - this._node.setAttribute("class", this._names.join(" ")); - } - }, - remove: function(name) { - var i = this._names.indexOf(name); - if (i >= 0) { - this._names.splice(i, 1); - this._node.setAttribute("class", this._names.join(" ")); - } - }, - contains: function(name) { - return this._names.indexOf(name) >= 0; - } -}; - -function classedAdd(node, names) { - var list = classList(node), i = -1, n = names.length; - while (++i < n) list.add(names[i]); -} - -function classedRemove(node, names) { - var list = classList(node), i = -1, n = names.length; - while (++i < n) list.remove(names[i]); -} - -function classedTrue(names) { - return function() { - classedAdd(this, names); - }; -} - -function classedFalse(names) { - return function() { - classedRemove(this, names); - }; -} - -function classedFunction(names, value) { - return function() { - (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); - }; -} - -function selection_classed(name, value) { - var names = classArray(name + ""); - - if (arguments.length < 2) { - var list = classList(this.node()), i = -1, n = names.length; - while (++i < n) if (!list.contains(names[i])) return false; - return true; - } - - return this.each((typeof value === "function" - ? classedFunction : value - ? classedTrue - : classedFalse)(names, value)); -} - -function textRemove() { - this.textContent = ""; -} - -function textConstant(value) { - return function() { - this.textContent = value; - }; -} - -function textFunction(value) { - return function() { - var v = value.apply(this, arguments); - this.textContent = v == null ? "" : v; - }; -} - -function selection_text(value) { - return arguments.length - ? this.each(value == null - ? textRemove : (typeof value === "function" - ? textFunction - : textConstant)(value)) - : this.node().textContent; -} - -function htmlRemove() { - this.innerHTML = ""; -} - -function htmlConstant(value) { - return function() { - this.innerHTML = value; - }; -} - -function htmlFunction(value) { - return function() { - var v = value.apply(this, arguments); - this.innerHTML = v == null ? "" : v; - }; -} - -function selection_html(value) { - return arguments.length - ? this.each(value == null - ? htmlRemove : (typeof value === "function" - ? htmlFunction - : htmlConstant)(value)) - : this.node().innerHTML; -} - -function raise() { - if (this.nextSibling) this.parentNode.appendChild(this); -} - -function selection_raise() { - return this.each(raise); -} - -function lower() { - if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); -} - -function selection_lower() { - return this.each(lower); -} - -function selection_append(name) { - var create = typeof name === "function" ? name : creator(name); - return this.select(function() { - return this.appendChild(create.apply(this, arguments)); - }); -} - -function constantNull() { - return null; -} - -function selection_insert(name, before) { - var create = typeof name === "function" ? name : creator(name), - select = before == null ? constantNull : typeof before === "function" ? before : selector(before); - return this.select(function() { - return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); - }); -} - -function remove() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); -} - -function selection_remove() { - return this.each(remove); -} - -function selection_cloneShallow() { - var clone = this.cloneNode(false), parent = this.parentNode; - return parent ? parent.insertBefore(clone, this.nextSibling) : clone; -} - -function selection_cloneDeep() { - var clone = this.cloneNode(true), parent = this.parentNode; - return parent ? parent.insertBefore(clone, this.nextSibling) : clone; -} - -function selection_clone(deep) { - return this.select(deep ? selection_cloneDeep : selection_cloneShallow); -} - -function selection_datum(value) { - return arguments.length - ? this.property("__data__", value) - : this.node().__data__; -} - -var filterEvents = {}; - -exports.event = null; - -if (typeof document !== "undefined") { - var element = document.documentElement; - if (!("onmouseenter" in element)) { - filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; - } -} - -function filterContextListener(listener, index, group) { - listener = contextListener(listener, index, group); - return function(event) { - var related = event.relatedTarget; - if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { - listener.call(this, event); - } - }; -} - -function contextListener(listener, index, group) { - return function(event1) { - var event0 = exports.event; // Events can be reentrant (e.g., focus). - exports.event = event1; - try { - listener.call(this, this.__data__, index, group); - } finally { - exports.event = event0; - } - }; -} - -function parseTypenames(typenames) { - return typenames.trim().split(/^|\s+/).map(function(t) { - var name = "", i = t.indexOf("."); - if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); - return {type: t, name: name}; - }); -} - -function onRemove(typename) { - return function() { - var on = this.__on; - if (!on) return; - for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { - if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.capture); - } else { - on[++i] = o; - } - } - if (++i) on.length = i; - else delete this.__on; - }; -} - -function onAdd(typename, value, capture) { - var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; - return function(d, i, group) { - var on = this.__on, o, listener = wrap(value, i, group); - if (on) for (var j = 0, m = on.length; j < m; ++j) { - if ((o = on[j]).type === typename.type && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.capture); - this.addEventListener(o.type, o.listener = listener, o.capture = capture); - o.value = value; - return; - } - } - this.addEventListener(typename.type, listener, capture); - o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; - if (!on) this.__on = [o]; - else on.push(o); - }; -} - -function selection_on(typename, value, capture) { - var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; - - if (arguments.length < 2) { - var on = this.node().__on; - if (on) for (var j = 0, m = on.length, o; j < m; ++j) { - for (i = 0, o = on[j]; i < n; ++i) { - if ((t = typenames[i]).type === o.type && t.name === o.name) { - return o.value; - } - } - } - return; - } - - on = value ? onAdd : onRemove; - if (capture == null) capture = false; - for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); - return this; -} - -function customEvent(event1, listener, that, args) { - var event0 = exports.event; - event1.sourceEvent = exports.event; - exports.event = event1; - try { - return listener.apply(that, args); - } finally { - exports.event = event0; - } -} - -function dispatchEvent(node, type, params) { - var window = defaultView(node), - event = window.CustomEvent; - - if (typeof event === "function") { - event = new event(type, params); - } else { - event = window.document.createEvent("Event"); - if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; - else event.initEvent(type, false, false); - } - - node.dispatchEvent(event); -} - -function dispatchConstant(type, params) { - return function() { - return dispatchEvent(this, type, params); - }; -} - -function dispatchFunction(type, params) { - return function() { - return dispatchEvent(this, type, params.apply(this, arguments)); - }; -} - -function selection_dispatch(type, params) { - return this.each((typeof params === "function" - ? dispatchFunction - : dispatchConstant)(type, params)); -} - -var root = [null]; - -function Selection(groups, parents) { - this._groups = groups; - this._parents = parents; -} - -function selection() { - return new Selection([[document.documentElement]], root); -} - -Selection.prototype = selection.prototype = { - constructor: Selection, - select: selection_select, - selectAll: selection_selectAll, - filter: selection_filter, - data: selection_data, - enter: selection_enter, - exit: selection_exit, - join: selection_join, - merge: selection_merge, - order: selection_order, - sort: selection_sort, - call: selection_call, - nodes: selection_nodes, - node: selection_node, - size: selection_size, - empty: selection_empty, - each: selection_each, - attr: selection_attr, - style: selection_style, - property: selection_property, - classed: selection_classed, - text: selection_text, - html: selection_html, - raise: selection_raise, - lower: selection_lower, - append: selection_append, - insert: selection_insert, - remove: selection_remove, - clone: selection_clone, - datum: selection_datum, - on: selection_on, - dispatch: selection_dispatch -}; - -function select(selector) { - return typeof selector === "string" - ? new Selection([[document.querySelector(selector)]], [document.documentElement]) - : new Selection([[selector]], root); -} - -function create(name) { - return select(creator(name).call(document.documentElement)); -} - -var nextId = 0; - -function local() { - return new Local; -} - -function Local() { - this._ = "@" + (++nextId).toString(36); -} - -Local.prototype = local.prototype = { - constructor: Local, - get: function(node) { - var id = this._; - while (!(id in node)) if (!(node = node.parentNode)) return; - return node[id]; - }, - set: function(node, value) { - return node[this._] = value; - }, - remove: function(node) { - return this._ in node && delete node[this._]; - }, - toString: function() { - return this._; - } -}; - -function sourceEvent() { - var current = exports.event, source; - while (source = current.sourceEvent) current = source; - return current; -} - -function point(node, event) { - var svg = node.ownerSVGElement || node; - - if (svg.createSVGPoint) { - var point = svg.createSVGPoint(); - point.x = event.clientX, point.y = event.clientY; - point = point.matrixTransform(node.getScreenCTM().inverse()); - return [point.x, point.y]; - } - - var rect = node.getBoundingClientRect(); - return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; -} - -function mouse(node) { - var event = sourceEvent(); - if (event.changedTouches) event = event.changedTouches[0]; - return point(node, event); -} - -function selectAll(selector) { - return typeof selector === "string" - ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) - : new Selection([selector == null ? [] : selector], root); -} - -function touch(node, touches, identifier) { - if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; - - for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { - if ((touch = touches[i]).identifier === identifier) { - return point(node, touch); - } - } - - return null; -} - -function touches(node, touches) { - if (touches == null) touches = sourceEvent().touches; - - for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { - points[i] = point(node, touches[i]); - } - - return points; -} - -exports.clientPoint = point; -exports.create = create; -exports.creator = creator; -exports.customEvent = customEvent; -exports.local = local; -exports.matcher = matcher; -exports.mouse = mouse; -exports.namespace = namespace; -exports.namespaces = namespaces; -exports.select = select; -exports.selectAll = selectAll; -exports.selection = selection; -exports.selector = selector; -exports.selectorAll = selectorAll; -exports.style = styleValue; -exports.touch = touch; -exports.touches = touches; -exports.window = defaultView; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],32:[function(require,module,exports){ -// https://d3js.org/d3-shape/ v1.3.7 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-path')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); -}(this, function (exports, d3Path) { 'use strict'; - -function constant(x) { - return function constant() { - return x; - }; -} - -var abs = Math.abs; -var atan2 = Math.atan2; -var cos = Math.cos; -var max = Math.max; -var min = Math.min; -var sin = Math.sin; -var sqrt = Math.sqrt; - -var epsilon = 1e-12; -var pi = Math.PI; -var halfPi = pi / 2; -var tau = 2 * pi; - -function acos(x) { - return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); -} - -function asin(x) { - return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); -} - -function arcInnerRadius(d) { - return d.innerRadius; -} - -function arcOuterRadius(d) { - return d.outerRadius; -} - -function arcStartAngle(d) { - return d.startAngle; -} - -function arcEndAngle(d) { - return d.endAngle; -} - -function arcPadAngle(d) { - return d && d.padAngle; // Note: optional! -} - -function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { - var x10 = x1 - x0, y10 = y1 - y0, - x32 = x3 - x2, y32 = y3 - y2, - t = y32 * x10 - x32 * y10; - if (t * t < epsilon) return; - t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; - return [x0 + t * x10, y0 + t * y10]; -} + })); -// Compute perpendicular offset line of length rc. -// http://mathworld.wolfram.com/Circle-LineIntersection.html -function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { - var x01 = x0 - x1, - y01 = y0 - y1, - lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), - ox = lo * y01, - oy = -lo * x01, - x11 = x0 + ox, - y11 = y0 + oy, - x10 = x1 + ox, - y10 = y1 + oy, - x00 = (x11 + x10) / 2, - y00 = (y11 + y10) / 2, - dx = x10 - x11, - dy = y10 - y11, - d2 = dx * dx + dy * dy, - r = r1 - rc, - D = x11 * y10 - x10 * y11, - d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), - cx0 = (D * dy - dx * d) / d2, - cy0 = (-D * dx - dy * d) / d2, - cx1 = (D * dy + dx * d) / d2, - cy1 = (-D * dx + dy * d) / d2, - dx0 = cx0 - x00, - dy0 = cy0 - y00, - dx1 = cx1 - x00, - dy1 = cy1 - y00; - - // Pick the closer of the two intersection points. - // TODO Is there a faster way to determine which intersection to use? - if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; - - return { - cx: cx0, - cy: cy0, - x01: -ox, - y01: -oy, - x11: cx0 * (r1 / r - 1), - y11: cy0 * (r1 / r - 1) - }; -} - -function arc() { - var innerRadius = arcInnerRadius, - outerRadius = arcOuterRadius, - cornerRadius = constant(0), - padRadius = null, - startAngle = arcStartAngle, - endAngle = arcEndAngle, - padAngle = arcPadAngle, - context = null; - - function arc() { - var buffer, - r, - r0 = +innerRadius.apply(this, arguments), - r1 = +outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) - halfPi, - a1 = endAngle.apply(this, arguments) - halfPi, - da = abs(a1 - a0), - cw = a1 > a0; - - if (!context) context = buffer = d3Path.path(); - - // Ensure that the outer radius is always larger than the inner radius. - if (r1 < r0) r = r1, r1 = r0, r0 = r; - - // Is it a point? - if (!(r1 > epsilon)) context.moveTo(0, 0); - - // Or is it a circle or annulus? - else if (da > tau - epsilon) { - context.moveTo(r1 * cos(a0), r1 * sin(a0)); - context.arc(0, 0, r1, a0, a1, !cw); - if (r0 > epsilon) { - context.moveTo(r0 * cos(a1), r0 * sin(a1)); - context.arc(0, 0, r0, a1, a0, cw); - } - } + }, {}], + 16: [function (require, module, exports) { +// https://d3js.org/d3-drag/ v1.2.5 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-selection')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-selection'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Selection) { + 'use strict'; + + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } - // Or is it a circular or annular sector? - else { - var a01 = a0, - a11 = a1, - a00 = a0, - a10 = a1, - da0 = da, - da1 = da, - ap = padAngle.apply(this, arguments) / 2, - rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), - rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), - rc0 = rc, - rc1 = rc, - t0, - t1; - - // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. - if (rp > epsilon) { - var p0 = asin(rp / r0 * sin(ap)), - p1 = asin(rp / r1 * sin(ap)); - if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; - else da0 = 0, a00 = a10 = (a0 + a1) / 2; - if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; - else da1 = 0, a01 = a11 = (a0 + a1) / 2; - } - - var x01 = r1 * cos(a01), - y01 = r1 * sin(a01), - x10 = r0 * cos(a10), - y10 = r0 * sin(a10); - - // Apply rounded corners? - if (rc > epsilon) { - var x11 = r1 * cos(a11), - y11 = r1 * sin(a11), - x00 = r0 * cos(a00), - y00 = r0 * sin(a00), - oc; - - // Restrict the corner radius according to the sector angle. - if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { - var ax = x01 - oc[0], - ay = y01 - oc[1], - bx = x11 - oc[0], - by = y11 - oc[1], - kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), - lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); - rc0 = min(rc, (r0 - lc) / (kc - 1)); - rc1 = min(rc, (r1 - lc) / (kc + 1)); - } - } + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } - // Is the sector collapsed to a line? - if (!(da1 > epsilon)) context.moveTo(x01, y01); + function nodrag(view) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } + } - // Does the sector’s outer ring have rounded corners? - else if (rc1 > epsilon) { - t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); - t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function () { + selection.on("click.drag", null); + }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } + } - context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + function constant(x) { + return function () { + return x; + }; + } - // Have the corners merged? - if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { + this.target = target; + this.type = type; + this.subject = subject; + this.identifier = id; + this.active = active; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + this._ = dispatch; + } - // Otherwise, draw the two corners and the ring. - else { - context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); - context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); - context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); - } - } + DragEvent.prototype.on = function () { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; + }; - // Or is the outer ring just a circular arc? - else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } - // Is there no inner ring, and it’s a circular sector? - // Or perhaps it’s an annular sector collapsed due to padding? - if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); + function defaultContainer() { + return this.parentNode; + } - // Does the sector’s inner ring (or point) have rounded corners? - else if (rc0 > epsilon) { - t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); - t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + function defaultSubject(d) { + return d == null ? {x: d3Selection.event.x, y: d3Selection.event.y} : d; + } - context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } - // Have the corners merged? - if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + function drag() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = d3Dispatch.dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } - // Otherwise, draw the two corners and the ring. - else { - context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); - context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); - context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); - } - } + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var gesture = beforestart("mouse", container.apply(this, arguments), d3Selection.mouse, this, arguments); + if (!gesture) return; + d3Selection.select(d3Selection.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + nodrag(d3Selection.event.view); + nopropagation(); + mousemoving = false; + mousedownx = d3Selection.event.clientX; + mousedowny = d3Selection.event.clientY; + gesture("start"); + } - // Or is the inner ring just a circular arc? - else context.arc(0, 0, r0, a10, a00, cw); - } + function mousemoved() { + noevent(); + if (!mousemoving) { + var dx = d3Selection.event.clientX - mousedownx, dy = d3Selection.event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag"); + } - context.closePath(); - - if (buffer) return context = null, buffer + "" || null; - } - - arc.centroid = function() { - var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, - a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; - return [cos(a) * r, sin(a) * r]; - }; - - arc.innerRadius = function(_) { - return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; - }; - - arc.outerRadius = function(_) { - return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; - }; - - arc.cornerRadius = function(_) { - return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; - }; - - arc.padRadius = function(_) { - return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; - }; - - arc.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; - }; - - arc.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; - }; - - arc.padAngle = function(_) { - return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; - }; - - arc.context = function(_) { - return arguments.length ? ((context = _ == null ? null : _), arc) : context; - }; - - return arc; -} - -function Linear(context) { - this._context = context; -} - -Linear.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; // proceed - default: this._context.lineTo(x, y); break; - } - } -}; - -function curveLinear(context) { - return new Linear(context); -} - -function x(p) { - return p[0]; -} - -function y(p) { - return p[1]; -} - -function line() { - var x$1 = x, - y$1 = y, - defined = constant(true), - context = null, - curve = curveLinear, - output = null; - - function line(data) { - var i, - n = data.length, - d, - defined0 = false, - buffer; - - if (context == null) output = curve(buffer = d3Path.path()); - - for (i = 0; i <= n; ++i) { - if (!(i < n && defined(d = data[i], i, data)) === defined0) { - if (defined0 = !defined0) output.lineStart(); - else output.lineEnd(); - } - if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data)); - } + function mouseupped() { + d3Selection.select(d3Selection.event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(d3Selection.event.view, mousemoving); + noevent(); + gestures.mouse("end"); + } - if (buffer) return output = null, buffer + "" || null; - } - - line.x = function(_) { - return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), line) : x$1; - }; - - line.y = function(_) { - return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), line) : y$1; - }; - - line.defined = function(_) { - return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), line) : defined; - }; - - line.curve = function(_) { - return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; - }; - - line.context = function(_) { - return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; - }; - - return line; -} - -function area() { - var x0 = x, - x1 = null, - y0 = constant(0), - y1 = y, - defined = constant(true), - context = null, - curve = curveLinear, - output = null; - - function area(data) { - var i, - j, - k, - n = data.length, - d, - defined0 = false, - buffer, - x0z = new Array(n), - y0z = new Array(n); - - if (context == null) output = curve(buffer = d3Path.path()); - - for (i = 0; i <= n; ++i) { - if (!(i < n && defined(d = data[i], i, data)) === defined0) { - if (defined0 = !defined0) { - j = i; - output.areaStart(); - output.lineStart(); - } else { - output.lineEnd(); - output.lineStart(); - for (k = i - 1; k >= j; --k) { - output.point(x0z[k], y0z[k]); - } - output.lineEnd(); - output.areaEnd(); - } - } - if (defined0) { - x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); - output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); - } - } + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = d3Selection.event.changedTouches, + c = container.apply(this, arguments), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(touches[i].identifier, c, d3Selection.touch, this, arguments)) { + nopropagation(); + gesture("start"); + } + } + } - if (buffer) return output = null, buffer + "" || null; - } - - function arealine() { - return line().defined(defined).curve(curve).context(context); - } - - area.x = function(_) { - return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), x1 = null, area) : x0; - }; - - area.x0 = function(_) { - return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), area) : x0; - }; - - area.x1 = function(_) { - return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : x1; - }; - - area.y = function(_) { - return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), y1 = null, area) : y0; - }; - - area.y0 = function(_) { - return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), area) : y0; - }; - - area.y1 = function(_) { - return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : y1; - }; - - area.lineX0 = - area.lineY0 = function() { - return arealine().x(x0).y(y0); - }; - - area.lineY1 = function() { - return arealine().x(x0).y(y1); - }; - - area.lineX1 = function() { - return arealine().x(x1).y(y0); - }; - - area.defined = function(_) { - return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), area) : defined; - }; - - area.curve = function(_) { - return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; - }; - - area.context = function(_) { - return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; - }; - - return area; -} - -function descending(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -} - -function identity(d) { - return d; -} - -function pie() { - var value = identity, - sortValues = descending, - sort = null, - startAngle = constant(0), - endAngle = constant(tau), - padAngle = constant(0); - - function pie(data) { - var i, - n = data.length, - j, - k, - sum = 0, - index = new Array(n), - arcs = new Array(n), - a0 = +startAngle.apply(this, arguments), - da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), - a1, - p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), - pa = p * (da < 0 ? -1 : 1), - v; - - for (i = 0; i < n; ++i) { - if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { - sum += v; - } - } + function touchmoved() { + var touches = d3Selection.event.changedTouches, + n = touches.length, i, gesture; - // Optionally sort the arcs by previously-computed values or by data. - if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); - else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); - - // Compute the arcs! They are stored in the original data's order. - for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { - j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { - data: data[j], - index: i, - value: v, - startAngle: a0, - endAngle: a1, - padAngle: p - }; - } + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(); + gesture("drag"); + } + } + } - return arcs; - } - - pie.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), pie) : value; - }; - - pie.sortValues = function(_) { - return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; - }; - - pie.sort = function(_) { - return arguments.length ? (sort = _, sortValues = null, pie) : sort; - }; - - pie.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), pie) : startAngle; - }; - - pie.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), pie) : endAngle; - }; - - pie.padAngle = function(_) { - return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), pie) : padAngle; - }; - - return pie; -} - -var curveRadialLinear = curveRadial(curveLinear); - -function Radial(curve) { - this._curve = curve; -} - -Radial.prototype = { - areaStart: function() { - this._curve.areaStart(); - }, - areaEnd: function() { - this._curve.areaEnd(); - }, - lineStart: function() { - this._curve.lineStart(); - }, - lineEnd: function() { - this._curve.lineEnd(); - }, - point: function(a, r) { - this._curve.point(r * Math.sin(a), r * -Math.cos(a)); - } -}; - -function curveRadial(curve) { - - function radial(context) { - return new Radial(curve(context)); - } - - radial._curve = curve; - - return radial; -} - -function lineRadial(l) { - var c = l.curve; - - l.angle = l.x, delete l.x; - l.radius = l.y, delete l.y; - - l.curve = function(_) { - return arguments.length ? c(curveRadial(_)) : c()._curve; - }; - - return l; -} - -function lineRadial$1() { - return lineRadial(line().curve(curveRadialLinear)); -} - -function areaRadial() { - var a = area().curve(curveRadialLinear), - c = a.curve, - x0 = a.lineX0, - x1 = a.lineX1, - y0 = a.lineY0, - y1 = a.lineY1; - - a.angle = a.x, delete a.x; - a.startAngle = a.x0, delete a.x0; - a.endAngle = a.x1, delete a.x1; - a.radius = a.y, delete a.y; - a.innerRadius = a.y0, delete a.y0; - a.outerRadius = a.y1, delete a.y1; - a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0; - a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; - a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; - a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; - - a.curve = function(_) { - return arguments.length ? c(curveRadial(_)) : c()._curve; - }; - - return a; -} - -function pointRadial(x, y) { - return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; -} - -var slice = Array.prototype.slice; - -function linkSource(d) { - return d.source; -} - -function linkTarget(d) { - return d.target; -} - -function link(curve) { - var source = linkSource, - target = linkTarget, - x$1 = x, - y$1 = y, - context = null; - - function link() { - var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); - if (!context) context = buffer = d3Path.path(); - curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); - if (buffer) return context = null, buffer + "" || null; - } - - link.source = function(_) { - return arguments.length ? (source = _, link) : source; - }; - - link.target = function(_) { - return arguments.length ? (target = _, link) : target; - }; - - link.x = function(_) { - return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), link) : x$1; - }; - - link.y = function(_) { - return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), link) : y$1; - }; - - link.context = function(_) { - return arguments.length ? ((context = _ == null ? null : _), link) : context; - }; - - return link; -} - -function curveHorizontal(context, x0, y0, x1, y1) { - context.moveTo(x0, y0); - context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); -} - -function curveVertical(context, x0, y0, x1, y1) { - context.moveTo(x0, y0); - context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); -} - -function curveRadial$1(context, x0, y0, x1, y1) { - var p0 = pointRadial(x0, y0), - p1 = pointRadial(x0, y0 = (y0 + y1) / 2), - p2 = pointRadial(x1, y0), - p3 = pointRadial(x1, y1); - context.moveTo(p0[0], p0[1]); - context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); -} - -function linkHorizontal() { - return link(curveHorizontal); -} - -function linkVertical() { - return link(curveVertical); -} - -function linkRadial() { - var l = link(curveRadial$1); - l.angle = l.x, delete l.x; - l.radius = l.y, delete l.y; - return l; -} - -var circle = { - draw: function(context, size) { - var r = Math.sqrt(size / pi); - context.moveTo(r, 0); - context.arc(0, 0, r, 0, tau); - } -}; - -var cross = { - draw: function(context, size) { - var r = Math.sqrt(size / 5) / 2; - context.moveTo(-3 * r, -r); - context.lineTo(-r, -r); - context.lineTo(-r, -3 * r); - context.lineTo(r, -3 * r); - context.lineTo(r, -r); - context.lineTo(3 * r, -r); - context.lineTo(3 * r, r); - context.lineTo(r, r); - context.lineTo(r, 3 * r); - context.lineTo(-r, 3 * r); - context.lineTo(-r, r); - context.lineTo(-3 * r, r); - context.closePath(); - } -}; - -var tan30 = Math.sqrt(1 / 3), - tan30_2 = tan30 * 2; - -var diamond = { - draw: function(context, size) { - var y = Math.sqrt(size / tan30_2), - x = y * tan30; - context.moveTo(0, -y); - context.lineTo(x, 0); - context.lineTo(0, y); - context.lineTo(-x, 0); - context.closePath(); - } -}; - -var ka = 0.89081309152928522810, - kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), - kx = Math.sin(tau / 10) * kr, - ky = -Math.cos(tau / 10) * kr; - -var star = { - draw: function(context, size) { - var r = Math.sqrt(size * ka), - x = kx * r, - y = ky * r; - context.moveTo(0, -r); - context.lineTo(x, y); - for (var i = 1; i < 5; ++i) { - var a = tau * i / 5, - c = Math.cos(a), - s = Math.sin(a); - context.lineTo(s * r, -c * r); - context.lineTo(c * x - s * y, s * x + c * y); - } - context.closePath(); - } -}; - -var square = { - draw: function(context, size) { - var w = Math.sqrt(size), - x = -w / 2; - context.rect(x, x, w, w); - } -}; - -var sqrt3 = Math.sqrt(3); - -var triangle = { - draw: function(context, size) { - var y = -Math.sqrt(size / (sqrt3 * 3)); - context.moveTo(0, y * 2); - context.lineTo(-sqrt3 * y, -y); - context.lineTo(sqrt3 * y, -y); - context.closePath(); - } -}; - -var c = -0.5, - s = Math.sqrt(3) / 2, - k = 1 / Math.sqrt(12), - a = (k / 2 + 1) * 3; - -var wye = { - draw: function(context, size) { - var r = Math.sqrt(size / a), - x0 = r / 2, - y0 = r * k, - x1 = x0, - y1 = r * k + r, - x2 = -x1, - y2 = y1; - context.moveTo(x0, y0); - context.lineTo(x1, y1); - context.lineTo(x2, y2); - context.lineTo(c * x0 - s * y0, s * x0 + c * y0); - context.lineTo(c * x1 - s * y1, s * x1 + c * y1); - context.lineTo(c * x2 - s * y2, s * x2 + c * y2); - context.lineTo(c * x0 + s * y0, c * y0 - s * x0); - context.lineTo(c * x1 + s * y1, c * y1 - s * x1); - context.lineTo(c * x2 + s * y2, c * y2 - s * x2); - context.closePath(); - } -}; - -var symbols = [ - circle, - cross, - diamond, - square, - star, - triangle, - wye -]; - -function symbol() { - var type = constant(circle), - size = constant(64), - context = null; - - function symbol() { - var buffer; - if (!context) context = buffer = d3Path.path(); - type.apply(this, arguments).draw(context, +size.apply(this, arguments)); - if (buffer) return context = null, buffer + "" || null; - } - - symbol.type = function(_) { - return arguments.length ? (type = typeof _ === "function" ? _ : constant(_), symbol) : type; - }; - - symbol.size = function(_) { - return arguments.length ? (size = typeof _ === "function" ? _ : constant(+_), symbol) : size; - }; - - symbol.context = function(_) { - return arguments.length ? (context = _ == null ? null : _, symbol) : context; - }; - - return symbol; -} - -function noop() {} - -function point(that, x, y) { - that._context.bezierCurveTo( - (2 * that._x0 + that._x1) / 3, - (2 * that._y0 + that._y1) / 3, - (that._x0 + 2 * that._x1) / 3, - (that._y0 + 2 * that._y1) / 3, - (that._x0 + 4 * that._x1 + x) / 6, - (that._y0 + 4 * that._y1 + y) / 6 - ); -} - -function Basis(context) { - this._context = context; -} - -Basis.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 3: point(this, this._x1, this._y1); // proceed - case 2: this._context.lineTo(this._x1, this._y1); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; break; - case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed - default: point(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; - -function basis(context) { - return new Basis(context); -} - -function BasisClosed(context) { - this._context = context; -} - -BasisClosed.prototype = { - areaStart: noop, - areaEnd: noop, - lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 1: { - this._context.moveTo(this._x2, this._y2); - this._context.closePath(); - break; - } - case 2: { - this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); - this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); - this._context.closePath(); - break; - } - case 3: { - this.point(this._x2, this._y2); - this.point(this._x3, this._y3); - this.point(this._x4, this._y4); - break; - } - } - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._x2 = x, this._y2 = y; break; - case 1: this._point = 2; this._x3 = x, this._y3 = y; break; - case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; - default: point(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; - -function basisClosed(context) { - return new BasisClosed(context); -} - -function BasisOpen(context) { - this._context = context; -} - -BasisOpen.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = NaN; - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; break; - case 1: this._point = 2; break; - case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; - case 3: this._point = 4; // proceed - default: point(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; - -function basisOpen(context) { - return new BasisOpen(context); -} - -function Bundle(context, beta) { - this._basis = new Basis(context); - this._beta = beta; -} - -Bundle.prototype = { - lineStart: function() { - this._x = []; - this._y = []; - this._basis.lineStart(); - }, - lineEnd: function() { - var x = this._x, - y = this._y, - j = x.length - 1; - - if (j > 0) { - var x0 = x[0], - y0 = y[0], - dx = x[j] - x0, - dy = y[j] - y0, - i = -1, - t; - - while (++i <= j) { - t = i / j; - this._basis.point( - this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), - this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) - ); - } - } + function touchended() { + var touches = d3Selection.event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(); + gesture("end"); + } + } + } - this._x = this._y = null; - this._basis.lineEnd(); - }, - point: function(x, y) { - this._x.push(+x); - this._y.push(+y); - } -}; - -var bundle = (function custom(beta) { - - function bundle(context) { - return beta === 1 ? new Basis(context) : new Bundle(context, beta); - } - - bundle.beta = function(beta) { - return custom(+beta); - }; - - return bundle; -})(0.85); - -function point$1(that, x, y) { - that._context.bezierCurveTo( - that._x1 + that._k * (that._x2 - that._x0), - that._y1 + that._k * (that._y2 - that._y0), - that._x2 + that._k * (that._x1 - x), - that._y2 + that._k * (that._y1 - y), - that._x2, - that._y2 - ); -} - -function Cardinal(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; -} - -Cardinal.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 2: this._context.lineTo(this._x2, this._y2); break; - case 3: point$1(this, this._x1, this._y1); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; this._x1 = x, this._y1 = y; break; - case 2: this._point = 3; // proceed - default: point$1(this, x, y); break; - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; - -var cardinal = (function custom(tension) { - - function cardinal(context) { - return new Cardinal(context, tension); - } - - cardinal.tension = function(tension) { - return custom(+tension); - }; - - return cardinal; -})(0); - -function CardinalClosed(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; -} - -CardinalClosed.prototype = { - areaStart: noop, - areaEnd: noop, - lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 1: { - this._context.moveTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 2: { - this._context.lineTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 3: { - this.point(this._x3, this._y3); - this.point(this._x4, this._y4); - this.point(this._x5, this._y5); - break; - } - } - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._x3 = x, this._y3 = y; break; - case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; - case 2: this._point = 3; this._x5 = x, this._y5 = y; break; - default: point$1(this, x, y); break; - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; - -var cardinalClosed = (function custom(tension) { - - function cardinal(context) { - return new CardinalClosed(context, tension); - } - - cardinal.tension = function(tension) { - return custom(+tension); - }; - - return cardinal; -})(0); - -function CardinalOpen(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; -} - -CardinalOpen.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; break; - case 1: this._point = 2; break; - case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; - case 3: this._point = 4; // proceed - default: point$1(this, x, y); break; - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; - -var cardinalOpen = (function custom(tension) { - - function cardinal(context) { - return new CardinalOpen(context, tension); - } - - cardinal.tension = function(tension) { - return custom(+tension); - }; - - return cardinal; -})(0); - -function point$2(that, x, y) { - var x1 = that._x1, - y1 = that._y1, - x2 = that._x2, - y2 = that._y2; - - if (that._l01_a > epsilon) { - var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, - n = 3 * that._l01_a * (that._l01_a + that._l12_a); - x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; - y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; - } - - if (that._l23_a > epsilon) { - var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, - m = 3 * that._l23_a * (that._l23_a + that._l12_a); - x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; - y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; - } - - that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); -} - -function CatmullRom(context, alpha) { - this._context = context; - this._alpha = alpha; -} - -CatmullRom.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 2: this._context.lineTo(this._x2, this._y2); break; - case 3: this.point(this._x2, this._y2); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); - } + function beforestart(id, container, point, that, args) { + var p = point(container, id), s, dx, dy, + sublisteners = listeners.copy(); + + if (!d3Selection.customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function () { + if ((d3Selection.event.subject = s = subject.apply(that, args)) == null) return false; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return true; + })) return; + + return function gesture(type) { + var p0 = p, n; + switch (type) { + case "start": + gestures[id] = gesture, n = active++; + break; + case "end": + delete gestures[id], --active; // nobreak + case "drag": + p = point(container, id), n = active; + break; + } + d3Selection.customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); + }; + } - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; break; - case 2: this._point = 3; // proceed - default: point$2(this, x, y); break; - } + drag.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), drag) : filter; + }; - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; - -var catmullRom = (function custom(alpha) { - - function catmullRom(context) { - return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); - } - - catmullRom.alpha = function(alpha) { - return custom(+alpha); - }; - - return catmullRom; -})(0.5); - -function CatmullRomClosed(context, alpha) { - this._context = context; - this._alpha = alpha; -} - -CatmullRomClosed.prototype = { - areaStart: noop, - areaEnd: noop, - lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 1: { - this._context.moveTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 2: { - this._context.lineTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 3: { - this.point(this._x3, this._y3); - this.point(this._x4, this._y4); - this.point(this._x5, this._y5); - break; - } - } - }, - point: function(x, y) { - x = +x, y = +y; - - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); - } + drag.container = function (_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; + }; - switch (this._point) { - case 0: this._point = 1; this._x3 = x, this._y3 = y; break; - case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; - case 2: this._point = 3; this._x5 = x, this._y5 = y; break; - default: point$2(this, x, y); break; - } + drag.subject = function (_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant(_), drag) : subject; + }; - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; - -var catmullRomClosed = (function custom(alpha) { - - function catmullRom(context) { - return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); - } - - catmullRom.alpha = function(alpha) { - return custom(+alpha); - }; - - return catmullRom; -})(0.5); - -function CatmullRomOpen(context, alpha) { - this._context = context; - this._alpha = alpha; -} - -CatmullRomOpen.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); - } + drag.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), drag) : touchable; + }; - switch (this._point) { - case 0: this._point = 1; break; - case 1: this._point = 2; break; - case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; - case 3: this._point = 4; // proceed - default: point$2(this, x, y); break; - } + drag.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; - -var catmullRomOpen = (function custom(alpha) { - - function catmullRom(context) { - return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); - } - - catmullRom.alpha = function(alpha) { - return custom(+alpha); - }; - - return catmullRom; -})(0.5); - -function LinearClosed(context) { - this._context = context; -} - -LinearClosed.prototype = { - areaStart: noop, - areaEnd: noop, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._point) this._context.closePath(); - }, - point: function(x, y) { - x = +x, y = +y; - if (this._point) this._context.lineTo(x, y); - else this._point = 1, this._context.moveTo(x, y); - } -}; - -function linearClosed(context) { - return new LinearClosed(context); -} - -function sign(x) { - return x < 0 ? -1 : 1; -} + drag.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; -// Calculate the slopes of the tangents (Hermite-type interpolation) based on -// the following paper: Steffen, M. 1990. A Simple Method for Monotonic -// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. -// NOV(II), P. 443, 1990. -function slope3(that, x2, y2) { - var h0 = that._x1 - that._x0, - h1 = x2 - that._x1, - s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), - s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), - p = (s0 * h1 + s1 * h0) / (h0 + h1); - return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; -} + return drag; + } -// Calculate a one-sided slope. -function slope2(that, t) { - var h = that._x1 - that._x0; - return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; -} + exports.drag = drag; + exports.dragDisable = nodrag; + exports.dragEnable = yesdrag; -// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations -// "you can express cubic Hermite interpolation in terms of cubic Bézier curves -// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". -function point$3(that, t0, t1) { - var x0 = that._x0, - y0 = that._y0, - x1 = that._x1, - y1 = that._y1, - dx = (x1 - x0) / 3; - that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); -} - -function MonotoneX(context) { - this._context = context; -} - -MonotoneX.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = - this._t0 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 2: this._context.lineTo(this._x1, this._y1); break; - case 3: point$3(this, this._t0, slope2(this, this._t0)); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - var t1 = NaN; - - x = +x, y = +y; - if (x === this._x1 && y === this._y1) return; // Ignore coincident points. - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; break; - case 2: this._point = 3; point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); break; - default: point$3(this, this._t0, t1 = slope3(this, x, y)); break; - } + Object.defineProperty(exports, '__esModule', {value: true}); - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - this._t0 = t1; - } -}; - -function MonotoneY(context) { - this._context = new ReflectContext(context); -} - -(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { - MonotoneX.prototype.point.call(this, y, x); -}; - -function ReflectContext(context) { - this._context = context; -} - -ReflectContext.prototype = { - moveTo: function(x, y) { this._context.moveTo(y, x); }, - closePath: function() { this._context.closePath(); }, - lineTo: function(x, y) { this._context.lineTo(y, x); }, - bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } -}; - -function monotoneX(context) { - return new MonotoneX(context); -} - -function monotoneY(context) { - return new MonotoneY(context); -} - -function Natural(context) { - this._context = context; -} - -Natural.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x = []; - this._y = []; - }, - lineEnd: function() { - var x = this._x, - y = this._y, - n = x.length; - - if (n) { - this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); - if (n === 2) { - this._context.lineTo(x[1], y[1]); - } else { - var px = controlPoints(x), - py = controlPoints(y); - for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { - this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); - } - } - } + })); - if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); - this._line = 1 - this._line; - this._x = this._y = null; - }, - point: function(x, y) { - this._x.push(+x); - this._y.push(+y); - } -}; + }, {"d3-dispatch": 15, "d3-selection": 31}], + 17: [function (require, module, exports) { +// https://d3js.org/d3-dsv/ v1.2.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + + function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function (name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); + } -// See https://www.particleincell.com/2012/bezier-splines/ for derivation. -function controlPoints(x) { - var i, - n = x.length - 1, - m, - a = new Array(n), - b = new Array(n), - r = new Array(n); - a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; - for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; - a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; - for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; - a[n - 1] = r[n - 1] / b[n - 1]; - for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; - b[n - 1] = (x[n] + a[n - 1]) / 2; - for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; - return [a, b]; -} - -function natural(context) { - return new Natural(context); -} - -function Step(context, t) { - this._context = context; - this._t = t; -} - -Step.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x = this._y = NaN; - this._point = 0; - }, - lineEnd: function() { - if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; // proceed - default: { - if (this._t <= 0) { - this._context.lineTo(this._x, y); - this._context.lineTo(x, y); - } else { - var x1 = this._x * (1 - this._t) + x * this._t; - this._context.lineTo(x1, this._y); - this._context.lineTo(x1, y); - } - break; - } - } - this._x = x, this._y = y; - } -}; - -function step(context) { - return new Step(context, 0.5); -} - -function stepBefore(context) { - return new Step(context, 0); -} - -function stepAfter(context) { - return new Step(context, 1); -} - -function none(series, order) { - if (!((n = series.length) > 1)) return; - for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { - s0 = s1, s1 = series[order[i]]; - for (j = 0; j < m; ++j) { - s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; - } - } -} - -function none$1(series) { - var n = series.length, o = new Array(n); - while (--n >= 0) o[n] = n; - return o; -} - -function stackValue(d, key) { - return d[key]; -} - -function stack() { - var keys = constant([]), - order = none$1, - offset = none, - value = stackValue; - - function stack(data) { - var kz = keys.apply(this, arguments), - i, - m = data.length, - n = kz.length, - sz = new Array(n), - oz; - - for (i = 0; i < n; ++i) { - for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { - si[j] = sij = [0, +value(data[j], ki, j, data)]; - sij.data = data[j]; - } - si.key = ki; - } + function customConverter(columns, f) { + var object = objectConverter(columns); + return function (row, i) { + return f(object(row), i, columns); + }; + } - for (i = 0, oz = order(sz); i < n; ++i) { - sz[oz[i]].index = i; - } +// Compute unique columns in order of discovery. + function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function (row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); - offset(sz, oz); - return sz; - } - - stack.keys = function(_) { - return arguments.length ? (keys = typeof _ === "function" ? _ : constant(slice.call(_)), stack) : keys; - }; - - stack.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), stack) : value; - }; - - stack.order = function(_) { - return arguments.length ? (order = _ == null ? none$1 : typeof _ === "function" ? _ : constant(slice.call(_)), stack) : order; - }; - - stack.offset = function(_) { - return arguments.length ? (offset = _ == null ? none : _, stack) : offset; - }; - - return stack; -} - -function expand(series, order) { - if (!((n = series.length) > 0)) return; - for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { - for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; - if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; - } - none(series, order); -} - -function diverging(series, order) { - if (!((n = series.length) > 0)) return; - for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { - for (yp = yn = 0, i = 0; i < n; ++i) { - if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { - d[0] = yp, d[1] = yp += dy; - } else if (dy < 0) { - d[1] = yn, d[0] = yn += dy; - } else { - d[0] = 0, d[1] = dy; - } - } - } -} - -function silhouette(series, order) { - if (!((n = series.length) > 0)) return; - for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { - for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; - s0[j][1] += s0[j][0] = -y / 2; - } - none(series, order); -} - -function wiggle(series, order) { - if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; - for (var y = 0, j = 1, s0, m, n; j < m; ++j) { - for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { - var si = series[order[i]], - sij0 = si[j][1] || 0, - sij1 = si[j - 1][1] || 0, - s3 = (sij0 - sij1) / 2; - for (var k = 0; k < i; ++k) { - var sk = series[order[k]], - skj0 = sk[j][1] || 0, - skj1 = sk[j - 1][1] || 0; - s3 += skj0 - skj1; - } - s1 += sij0, s2 += s3 * sij0; - } - s0[j - 1][1] += s0[j - 1][0] = y; - if (s1) y -= s2 / s1; - } - s0[j - 1][1] += s0[j - 1][0] = y; - none(series, order); -} - -function appearance(series) { - var peaks = series.map(peak); - return none$1(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); -} - -function peak(series) { - var i = -1, j = 0, n = series.length, vi, vj = -Infinity; - while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; - return j; -} - -function ascending(series) { - var sums = series.map(sum); - return none$1(series).sort(function(a, b) { return sums[a] - sums[b]; }); -} - -function sum(series) { - var s = 0, i = -1, n = series.length, v; - while (++i < n) if (v = +series[i][1]) s += v; - return s; -} - -function descending$1(series) { - return ascending(series).reverse(); -} - -function insideOut(series) { - var n = series.length, - i, - j, - sums = series.map(sum), - order = appearance(series), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - - for (i = 0; i < n; ++i) { - j = order[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - - return bottoms.reverse().concat(tops); -} - -function reverse(series) { - return none$1(series).reverse(); -} - -exports.arc = arc; -exports.area = area; -exports.areaRadial = areaRadial; -exports.curveBasis = basis; -exports.curveBasisClosed = basisClosed; -exports.curveBasisOpen = basisOpen; -exports.curveBundle = bundle; -exports.curveCardinal = cardinal; -exports.curveCardinalClosed = cardinalClosed; -exports.curveCardinalOpen = cardinalOpen; -exports.curveCatmullRom = catmullRom; -exports.curveCatmullRomClosed = catmullRomClosed; -exports.curveCatmullRomOpen = catmullRomOpen; -exports.curveLinear = curveLinear; -exports.curveLinearClosed = linearClosed; -exports.curveMonotoneX = monotoneX; -exports.curveMonotoneY = monotoneY; -exports.curveNatural = natural; -exports.curveStep = step; -exports.curveStepAfter = stepAfter; -exports.curveStepBefore = stepBefore; -exports.line = line; -exports.lineRadial = lineRadial$1; -exports.linkHorizontal = linkHorizontal; -exports.linkRadial = linkRadial; -exports.linkVertical = linkVertical; -exports.pie = pie; -exports.pointRadial = pointRadial; -exports.radialArea = areaRadial; -exports.radialLine = lineRadial$1; -exports.stack = stack; -exports.stackOffsetDiverging = diverging; -exports.stackOffsetExpand = expand; -exports.stackOffsetNone = none; -exports.stackOffsetSilhouette = silhouette; -exports.stackOffsetWiggle = wiggle; -exports.stackOrderAppearance = appearance; -exports.stackOrderAscending = ascending; -exports.stackOrderDescending = descending$1; -exports.stackOrderInsideOut = insideOut; -exports.stackOrderNone = none$1; -exports.stackOrderReverse = reverse; -exports.symbol = symbol; -exports.symbolCircle = circle; -exports.symbolCross = cross; -exports.symbolDiamond = diamond; -exports.symbolSquare = square; -exports.symbolStar = star; -exports.symbolTriangle = triangle; -exports.symbolWye = wye; -exports.symbols = symbols; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{"d3-path":25}],33:[function(require,module,exports){ -// https://d3js.org/d3-time-format/ v2.2.3 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); -}(this, function (exports, d3Time) { 'use strict'; - -function localDate(d) { - if (0 <= d.y && d.y < 100) { - var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); - date.setFullYear(d.y); - return date; - } - return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); -} - -function utcDate(d) { - if (0 <= d.y && d.y < 100) { - var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); - date.setUTCFullYear(d.y); - return date; - } - return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); -} - -function newDate(y, m, d) { - return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; -} - -function formatLocale(locale) { - var locale_dateTime = locale.dateTime, - locale_date = locale.date, - locale_time = locale.time, - locale_periods = locale.periods, - locale_weekdays = locale.days, - locale_shortWeekdays = locale.shortDays, - locale_months = locale.months, - locale_shortMonths = locale.shortMonths; - - var periodRe = formatRe(locale_periods), - periodLookup = formatLookup(locale_periods), - weekdayRe = formatRe(locale_weekdays), - weekdayLookup = formatLookup(locale_weekdays), - shortWeekdayRe = formatRe(locale_shortWeekdays), - shortWeekdayLookup = formatLookup(locale_shortWeekdays), - monthRe = formatRe(locale_months), - monthLookup = formatLookup(locale_months), - shortMonthRe = formatRe(locale_shortMonths), - shortMonthLookup = formatLookup(locale_shortMonths); - - var formats = { - "a": formatShortWeekday, - "A": formatWeekday, - "b": formatShortMonth, - "B": formatMonth, - "c": null, - "d": formatDayOfMonth, - "e": formatDayOfMonth, - "f": formatMicroseconds, - "H": formatHour24, - "I": formatHour12, - "j": formatDayOfYear, - "L": formatMilliseconds, - "m": formatMonthNumber, - "M": formatMinutes, - "p": formatPeriod, - "q": formatQuarter, - "Q": formatUnixTimestamp, - "s": formatUnixTimestampSeconds, - "S": formatSeconds, - "u": formatWeekdayNumberMonday, - "U": formatWeekNumberSunday, - "V": formatWeekNumberISO, - "w": formatWeekdayNumberSunday, - "W": formatWeekNumberMonday, - "x": null, - "X": null, - "y": formatYear, - "Y": formatFullYear, - "Z": formatZone, - "%": formatLiteralPercent - }; - - var utcFormats = { - "a": formatUTCShortWeekday, - "A": formatUTCWeekday, - "b": formatUTCShortMonth, - "B": formatUTCMonth, - "c": null, - "d": formatUTCDayOfMonth, - "e": formatUTCDayOfMonth, - "f": formatUTCMicroseconds, - "H": formatUTCHour24, - "I": formatUTCHour12, - "j": formatUTCDayOfYear, - "L": formatUTCMilliseconds, - "m": formatUTCMonthNumber, - "M": formatUTCMinutes, - "p": formatUTCPeriod, - "q": formatUTCQuarter, - "Q": formatUnixTimestamp, - "s": formatUnixTimestampSeconds, - "S": formatUTCSeconds, - "u": formatUTCWeekdayNumberMonday, - "U": formatUTCWeekNumberSunday, - "V": formatUTCWeekNumberISO, - "w": formatUTCWeekdayNumberSunday, - "W": formatUTCWeekNumberMonday, - "x": null, - "X": null, - "y": formatUTCYear, - "Y": formatUTCFullYear, - "Z": formatUTCZone, - "%": formatLiteralPercent - }; - - var parses = { - "a": parseShortWeekday, - "A": parseWeekday, - "b": parseShortMonth, - "B": parseMonth, - "c": parseLocaleDateTime, - "d": parseDayOfMonth, - "e": parseDayOfMonth, - "f": parseMicroseconds, - "H": parseHour24, - "I": parseHour24, - "j": parseDayOfYear, - "L": parseMilliseconds, - "m": parseMonthNumber, - "M": parseMinutes, - "p": parsePeriod, - "q": parseQuarter, - "Q": parseUnixTimestamp, - "s": parseUnixTimestampSeconds, - "S": parseSeconds, - "u": parseWeekdayNumberMonday, - "U": parseWeekNumberSunday, - "V": parseWeekNumberISO, - "w": parseWeekdayNumberSunday, - "W": parseWeekNumberMonday, - "x": parseLocaleDate, - "X": parseLocaleTime, - "y": parseYear, - "Y": parseFullYear, - "Z": parseZone, - "%": parseLiteralPercent - }; - - // These recursive directive definitions must be deferred. - formats.x = newFormat(locale_date, formats); - formats.X = newFormat(locale_time, formats); - formats.c = newFormat(locale_dateTime, formats); - utcFormats.x = newFormat(locale_date, utcFormats); - utcFormats.X = newFormat(locale_time, utcFormats); - utcFormats.c = newFormat(locale_dateTime, utcFormats); - - function newFormat(specifier, formats) { - return function(date) { - var string = [], - i = -1, - j = 0, - n = specifier.length, - c, - pad, - format; - - if (!(date instanceof Date)) date = new Date(+date); - - while (++i < n) { - if (specifier.charCodeAt(i) === 37) { - string.push(specifier.slice(j, i)); - if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); - else pad = c === "e" ? " " : "0"; - if (format = formats[c]) c = format(date, pad); - string.push(c); - j = i + 1; - } - } - - string.push(specifier.slice(j, i)); - return string.join(""); - }; - } - - function newParse(specifier, Z) { - return function(string) { - var d = newDate(1900, undefined, 1), - i = parseSpecifier(d, specifier, string += "", 0), - week, day; - if (i != string.length) return null; - - // If a UNIX timestamp is specified, return it. - if ("Q" in d) return new Date(d.Q); - if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); - - // If this is utcParse, never use the local timezone. - if (Z && !("Z" in d)) d.Z = 0; - - // The am-pm flag is 0 for AM, and 1 for PM. - if ("p" in d) d.H = d.H % 12 + d.p * 12; - - // If the month was not specified, inherit from the quarter. - if (d.m === undefined) d.m = "q" in d ? d.q : 0; - - // Convert day-of-week and week-of-year to day-of-year. - if ("V" in d) { - if (d.V < 1 || d.V > 53) return null; - if (!("w" in d)) d.w = 1; - if ("Z" in d) { - week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); - week = day > 4 || day === 0 ? d3Time.utcMonday.ceil(week) : d3Time.utcMonday(week); - week = d3Time.utcDay.offset(week, (d.V - 1) * 7); - d.y = week.getUTCFullYear(); - d.m = week.getUTCMonth(); - d.d = week.getUTCDate() + (d.w + 6) % 7; - } else { - week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); - week = day > 4 || day === 0 ? d3Time.timeMonday.ceil(week) : d3Time.timeMonday(week); - week = d3Time.timeDay.offset(week, (d.V - 1) * 7); - d.y = week.getFullYear(); - d.m = week.getMonth(); - d.d = week.getDate() + (d.w + 6) % 7; - } - } else if ("W" in d || "U" in d) { - if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; - day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); - d.m = 0; - d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; - } - - // If a time zone is specified, all fields are interpreted as UTC and then - // offset according to the specified time zone. - if ("Z" in d) { - d.H += d.Z / 100 | 0; - d.M += d.Z % 100; - return utcDate(d); - } - - // Otherwise, all fields are in local time. - return localDate(d); - }; - } - - function parseSpecifier(d, specifier, string, j) { - var i = 0, - n = specifier.length, - m = string.length, - c, - parse; - - while (i < n) { - if (j >= m) return -1; - c = specifier.charCodeAt(i++); - if (c === 37) { - c = specifier.charAt(i++); - parse = parses[c in pads ? specifier.charAt(i++) : c]; - if (!parse || ((j = parse(d, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } + return columns; + } - return j; - } - - function parsePeriod(d, string, i) { - var n = periodRe.exec(string.slice(i)); - return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; - } - - function parseShortWeekday(d, string, i) { - var n = shortWeekdayRe.exec(string.slice(i)); - return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; - } - - function parseWeekday(d, string, i) { - var n = weekdayRe.exec(string.slice(i)); - return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; - } - - function parseShortMonth(d, string, i) { - var n = shortMonthRe.exec(string.slice(i)); - return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; - } - - function parseMonth(d, string, i) { - var n = monthRe.exec(string.slice(i)); - return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; - } - - function parseLocaleDateTime(d, string, i) { - return parseSpecifier(d, locale_dateTime, string, i); - } - - function parseLocaleDate(d, string, i) { - return parseSpecifier(d, locale_date, string, i); - } - - function parseLocaleTime(d, string, i) { - return parseSpecifier(d, locale_time, string, i); - } - - function formatShortWeekday(d) { - return locale_shortWeekdays[d.getDay()]; - } - - function formatWeekday(d) { - return locale_weekdays[d.getDay()]; - } - - function formatShortMonth(d) { - return locale_shortMonths[d.getMonth()]; - } - - function formatMonth(d) { - return locale_months[d.getMonth()]; - } - - function formatPeriod(d) { - return locale_periods[+(d.getHours() >= 12)]; - } - - function formatQuarter(d) { - return 1 + ~~(d.getMonth() / 3); - } - - function formatUTCShortWeekday(d) { - return locale_shortWeekdays[d.getUTCDay()]; - } - - function formatUTCWeekday(d) { - return locale_weekdays[d.getUTCDay()]; - } - - function formatUTCShortMonth(d) { - return locale_shortMonths[d.getUTCMonth()]; - } - - function formatUTCMonth(d) { - return locale_months[d.getUTCMonth()]; - } - - function formatUTCPeriod(d) { - return locale_periods[+(d.getUTCHours() >= 12)]; - } - - function formatUTCQuarter(d) { - return 1 + ~~(d.getUTCMonth() / 3); - } - - return { - format: function(specifier) { - var f = newFormat(specifier += "", formats); - f.toString = function() { return specifier; }; - return f; - }, - parse: function(specifier) { - var p = newParse(specifier += "", false); - p.toString = function() { return specifier; }; - return p; - }, - utcFormat: function(specifier) { - var f = newFormat(specifier += "", utcFormats); - f.toString = function() { return specifier; }; - return f; - }, - utcParse: function(specifier) { - var p = newParse(specifier += "", true); - p.toString = function() { return specifier; }; - return p; - } - }; -} - -var pads = {"-": "", "_": " ", "0": "0"}, - numberRe = /^\s*\d+/, // note: ignores next directive - percentRe = /^%/, - requoteRe = /[\\^$*+?|[\]().{}]/g; - -function pad(value, fill, width) { - var sign = value < 0 ? "-" : "", - string = (sign ? -value : value) + "", - length = string.length; - return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); -} - -function requote(s) { - return s.replace(requoteRe, "\\$&"); -} - -function formatRe(names) { - return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); -} - -function formatLookup(names) { - var map = {}, i = -1, n = names.length; - while (++i < n) map[names[i].toLowerCase()] = i; - return map; -} - -function parseWeekdayNumberSunday(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 1)); - return n ? (d.w = +n[0], i + n[0].length) : -1; -} - -function parseWeekdayNumberMonday(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 1)); - return n ? (d.u = +n[0], i + n[0].length) : -1; -} - -function parseWeekNumberSunday(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.U = +n[0], i + n[0].length) : -1; -} - -function parseWeekNumberISO(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.V = +n[0], i + n[0].length) : -1; -} - -function parseWeekNumberMonday(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.W = +n[0], i + n[0].length) : -1; -} - -function parseFullYear(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 4)); - return n ? (d.y = +n[0], i + n[0].length) : -1; -} - -function parseYear(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; -} - -function parseZone(d, string, i) { - var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); - return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; -} - -function parseQuarter(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 1)); - return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; -} - -function parseMonthNumber(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.m = n[0] - 1, i + n[0].length) : -1; -} - -function parseDayOfMonth(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.d = +n[0], i + n[0].length) : -1; -} - -function parseDayOfYear(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 3)); - return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; -} - -function parseHour24(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.H = +n[0], i + n[0].length) : -1; -} - -function parseMinutes(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.M = +n[0], i + n[0].length) : -1; -} - -function parseSeconds(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.S = +n[0], i + n[0].length) : -1; -} - -function parseMilliseconds(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 3)); - return n ? (d.L = +n[0], i + n[0].length) : -1; -} - -function parseMicroseconds(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 6)); - return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; -} - -function parseLiteralPercent(d, string, i) { - var n = percentRe.exec(string.slice(i, i + 1)); - return n ? i + n[0].length : -1; -} - -function parseUnixTimestamp(d, string, i) { - var n = numberRe.exec(string.slice(i)); - return n ? (d.Q = +n[0], i + n[0].length) : -1; -} - -function parseUnixTimestampSeconds(d, string, i) { - var n = numberRe.exec(string.slice(i)); - return n ? (d.s = +n[0], i + n[0].length) : -1; -} - -function formatDayOfMonth(d, p) { - return pad(d.getDate(), p, 2); -} - -function formatHour24(d, p) { - return pad(d.getHours(), p, 2); -} - -function formatHour12(d, p) { - return pad(d.getHours() % 12 || 12, p, 2); -} - -function formatDayOfYear(d, p) { - return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); -} - -function formatMilliseconds(d, p) { - return pad(d.getMilliseconds(), p, 3); -} - -function formatMicroseconds(d, p) { - return formatMilliseconds(d, p) + "000"; -} - -function formatMonthNumber(d, p) { - return pad(d.getMonth() + 1, p, 2); -} - -function formatMinutes(d, p) { - return pad(d.getMinutes(), p, 2); -} - -function formatSeconds(d, p) { - return pad(d.getSeconds(), p, 2); -} - -function formatWeekdayNumberMonday(d) { - var day = d.getDay(); - return day === 0 ? 7 : day; -} - -function formatWeekNumberSunday(d, p) { - return pad(d3Time.timeSunday.count(d3Time.timeYear(d) - 1, d), p, 2); -} - -function formatWeekNumberISO(d, p) { - var day = d.getDay(); - d = (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); - return pad(d3Time.timeThursday.count(d3Time.timeYear(d), d) + (d3Time.timeYear(d).getDay() === 4), p, 2); -} - -function formatWeekdayNumberSunday(d) { - return d.getDay(); -} - -function formatWeekNumberMonday(d, p) { - return pad(d3Time.timeMonday.count(d3Time.timeYear(d) - 1, d), p, 2); -} - -function formatYear(d, p) { - return pad(d.getFullYear() % 100, p, 2); -} - -function formatFullYear(d, p) { - return pad(d.getFullYear() % 10000, p, 4); -} - -function formatZone(d) { - var z = d.getTimezoneOffset(); - return (z > 0 ? "-" : (z *= -1, "+")) - + pad(z / 60 | 0, "0", 2) - + pad(z % 60, "0", 2); -} - -function formatUTCDayOfMonth(d, p) { - return pad(d.getUTCDate(), p, 2); -} - -function formatUTCHour24(d, p) { - return pad(d.getUTCHours(), p, 2); -} - -function formatUTCHour12(d, p) { - return pad(d.getUTCHours() % 12 || 12, p, 2); -} - -function formatUTCDayOfYear(d, p) { - return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); -} - -function formatUTCMilliseconds(d, p) { - return pad(d.getUTCMilliseconds(), p, 3); -} - -function formatUTCMicroseconds(d, p) { - return formatUTCMilliseconds(d, p) + "000"; -} - -function formatUTCMonthNumber(d, p) { - return pad(d.getUTCMonth() + 1, p, 2); -} - -function formatUTCMinutes(d, p) { - return pad(d.getUTCMinutes(), p, 2); -} - -function formatUTCSeconds(d, p) { - return pad(d.getUTCSeconds(), p, 2); -} - -function formatUTCWeekdayNumberMonday(d) { - var dow = d.getUTCDay(); - return dow === 0 ? 7 : dow; -} - -function formatUTCWeekNumberSunday(d, p) { - return pad(d3Time.utcSunday.count(d3Time.utcYear(d) - 1, d), p, 2); -} - -function formatUTCWeekNumberISO(d, p) { - var day = d.getUTCDay(); - d = (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); - return pad(d3Time.utcThursday.count(d3Time.utcYear(d), d) + (d3Time.utcYear(d).getUTCDay() === 4), p, 2); -} - -function formatUTCWeekdayNumberSunday(d) { - return d.getUTCDay(); -} - -function formatUTCWeekNumberMonday(d, p) { - return pad(d3Time.utcMonday.count(d3Time.utcYear(d) - 1, d), p, 2); -} - -function formatUTCYear(d, p) { - return pad(d.getUTCFullYear() % 100, p, 2); -} - -function formatUTCFullYear(d, p) { - return pad(d.getUTCFullYear() % 10000, p, 4); -} - -function formatUTCZone() { - return "+0000"; -} - -function formatLiteralPercent() { - return "%"; -} - -function formatUnixTimestamp(d) { - return +d; -} - -function formatUnixTimestampSeconds(d) { - return Math.floor(+d / 1000); -} - -var locale; - -defaultLocale({ - dateTime: "%x, %X", - date: "%-m/%-d/%Y", - time: "%-I:%M:%S %p", - periods: ["AM", "PM"], - days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] -}); - -function defaultLocale(definition) { - locale = formatLocale(definition); - exports.timeFormat = locale.format; - exports.timeParse = locale.parse; - exports.utcFormat = locale.utcFormat; - exports.utcParse = locale.utcParse; - return locale; -} - -var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; - -function formatIsoNative(date) { - return date.toISOString(); -} - -var formatIso = Date.prototype.toISOString - ? formatIsoNative - : exports.utcFormat(isoSpecifier); - -function parseIsoNative(string) { - var date = new Date(string); - return isNaN(date) ? null : date; -} - -var parseIso = +new Date("2000-01-01T00:00:00.000Z") - ? parseIsoNative - : exports.utcParse(isoSpecifier); - -exports.isoFormat = formatIso; -exports.isoParse = parseIso; -exports.timeFormatDefaultLocale = defaultLocale; -exports.timeFormatLocale = formatLocale; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{"d3-time":34}],34:[function(require,module,exports){ -// https://d3js.org/d3-time/ v1.1.0 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -var t0 = new Date, - t1 = new Date; - -function newInterval(floori, offseti, count, field) { - - function interval(date) { - return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; - } - - interval.floor = function(date) { - return floori(date = new Date(+date)), date; - }; - - interval.ceil = function(date) { - return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; - }; - - interval.round = function(date) { - var d0 = interval(date), - d1 = interval.ceil(date); - return date - d0 < d1 - date ? d0 : d1; - }; - - interval.offset = function(date, step) { - return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; - }; - - interval.range = function(start, stop, step) { - var range = [], previous; - start = interval.ceil(start); - step = step == null ? 1 : Math.floor(step); - if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date - do range.push(previous = new Date(+start)), offseti(start, step), floori(start); - while (previous < start && start < stop); - return range; - }; - - interval.filter = function(test) { - return newInterval(function(date) { - if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); - }, function(date, step) { - if (date >= date) { - if (step < 0) while (++step <= 0) { - while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty - } else while (--step >= 0) { - while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty - } - } - }); - }; - - if (count) { - interval.count = function(start, end) { - t0.setTime(+start), t1.setTime(+end); - floori(t0), floori(t1); - return Math.floor(count(t0, t1)); - }; - - interval.every = function(step) { - step = Math.floor(step); - return !isFinite(step) || !(step > 0) ? null - : !(step > 1) ? interval - : interval.filter(field - ? function(d) { return field(d) % step === 0; } - : function(d) { return interval.count(0, d) % step === 0; }); - }; - } - - return interval; -} - -var millisecond = newInterval(function() { - // noop -}, function(date, step) { - date.setTime(+date + step); -}, function(start, end) { - return end - start; -}); + function pad(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; + } -// An optimized implementation for this simple case. -millisecond.every = function(k) { - k = Math.floor(k); - if (!isFinite(k) || !(k > 0)) return null; - if (!(k > 1)) return millisecond; - return newInterval(function(date) { - date.setTime(Math.floor(date / k) * k); - }, function(date, step) { - date.setTime(+date + step * k); - }, function(start, end) { - return (end - start) / k; - }); -}; -var milliseconds = millisecond.range; - -var durationSecond = 1e3; -var durationMinute = 6e4; -var durationHour = 36e5; -var durationDay = 864e5; -var durationWeek = 6048e5; - -var second = newInterval(function(date) { - date.setTime(date - date.getMilliseconds()); -}, function(date, step) { - date.setTime(+date + step * durationSecond); -}, function(start, end) { - return (end - start) / durationSecond; -}, function(date) { - return date.getUTCSeconds(); -}); -var seconds = second.range; - -var minute = newInterval(function(date) { - date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); -}, function(date, step) { - date.setTime(+date + step * durationMinute); -}, function(start, end) { - return (end - start) / durationMinute; -}, function(date) { - return date.getMinutes(); -}); -var minutes = minute.range; - -var hour = newInterval(function(date) { - date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); -}, function(date, step) { - date.setTime(+date + step * durationHour); -}, function(start, end) { - return (end - start) / durationHour; -}, function(date) { - return date.getHours(); -}); -var hours = hour.range; - -var day = newInterval(function(date) { - date.setHours(0, 0, 0, 0); -}, function(date, step) { - date.setDate(date.getDate() + step); -}, function(start, end) { - return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; -}, function(date) { - return date.getDate() - 1; -}); -var days = day.range; - -function weekday(i) { - return newInterval(function(date) { - date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); - date.setHours(0, 0, 0, 0); - }, function(date, step) { - date.setDate(date.getDate() + step * 7); - }, function(start, end) { - return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; - }); -} - -var sunday = weekday(0); -var monday = weekday(1); -var tuesday = weekday(2); -var wednesday = weekday(3); -var thursday = weekday(4); -var friday = weekday(5); -var saturday = weekday(6); - -var sundays = sunday.range; -var mondays = monday.range; -var tuesdays = tuesday.range; -var wednesdays = wednesday.range; -var thursdays = thursday.range; -var fridays = friday.range; -var saturdays = saturday.range; - -var month = newInterval(function(date) { - date.setDate(1); - date.setHours(0, 0, 0, 0); -}, function(date, step) { - date.setMonth(date.getMonth() + step); -}, function(start, end) { - return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; -}, function(date) { - return date.getMonth(); -}); -var months = month.range; - -var year = newInterval(function(date) { - date.setMonth(0, 1); - date.setHours(0, 0, 0, 0); -}, function(date, step) { - date.setFullYear(date.getFullYear() + step); -}, function(start, end) { - return end.getFullYear() - start.getFullYear(); -}, function(date) { - return date.getFullYear(); -}); + function formatYear(year) { + return year < 0 ? "-" + pad(-year, 6) + : year > 9999 ? "+" + pad(year, 6) + : pad(year, 4); + } -// An optimized implementation for this simple case. -year.every = function(k) { - return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { - date.setFullYear(Math.floor(date.getFullYear() / k) * k); - date.setMonth(0, 1); - date.setHours(0, 0, 0, 0); - }, function(date, step) { - date.setFullYear(date.getFullYear() + step * k); - }); -}; -var years = year.range; - -var utcMinute = newInterval(function(date) { - date.setUTCSeconds(0, 0); -}, function(date, step) { - date.setTime(+date + step * durationMinute); -}, function(start, end) { - return (end - start) / durationMinute; -}, function(date) { - return date.getUTCMinutes(); -}); -var utcMinutes = utcMinute.range; - -var utcHour = newInterval(function(date) { - date.setUTCMinutes(0, 0, 0); -}, function(date, step) { - date.setTime(+date + step * durationHour); -}, function(start, end) { - return (end - start) / durationHour; -}, function(date) { - return date.getUTCHours(); -}); -var utcHours = utcHour.range; - -var utcDay = newInterval(function(date) { - date.setUTCHours(0, 0, 0, 0); -}, function(date, step) { - date.setUTCDate(date.getUTCDate() + step); -}, function(start, end) { - return (end - start) / durationDay; -}, function(date) { - return date.getUTCDate() - 1; -}); -var utcDays = utcDay.range; - -function utcWeekday(i) { - return newInterval(function(date) { - date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); - date.setUTCHours(0, 0, 0, 0); - }, function(date, step) { - date.setUTCDate(date.getUTCDate() + step * 7); - }, function(start, end) { - return (end - start) / durationWeek; - }); -} - -var utcSunday = utcWeekday(0); -var utcMonday = utcWeekday(1); -var utcTuesday = utcWeekday(2); -var utcWednesday = utcWeekday(3); -var utcThursday = utcWeekday(4); -var utcFriday = utcWeekday(5); -var utcSaturday = utcWeekday(6); - -var utcSundays = utcSunday.range; -var utcMondays = utcMonday.range; -var utcTuesdays = utcTuesday.range; -var utcWednesdays = utcWednesday.range; -var utcThursdays = utcThursday.range; -var utcFridays = utcFriday.range; -var utcSaturdays = utcSaturday.range; - -var utcMonth = newInterval(function(date) { - date.setUTCDate(1); - date.setUTCHours(0, 0, 0, 0); -}, function(date, step) { - date.setUTCMonth(date.getUTCMonth() + step); -}, function(start, end) { - return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; -}, function(date) { - return date.getUTCMonth(); -}); -var utcMonths = utcMonth.range; - -var utcYear = newInterval(function(date) { - date.setUTCMonth(0, 1); - date.setUTCHours(0, 0, 0, 0); -}, function(date, step) { - date.setUTCFullYear(date.getUTCFullYear() + step); -}, function(start, end) { - return end.getUTCFullYear() - start.getUTCFullYear(); -}, function(date) { - return date.getUTCFullYear(); -}); + function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); + } -// An optimized implementation for this simple case. -utcYear.every = function(k) { - return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { - date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); - date.setUTCMonth(0, 1); - date.setUTCHours(0, 0, 0, 0); - }, function(date, step) { - date.setUTCFullYear(date.getUTCFullYear() + step * k); - }); -}; -var utcYears = utcYear.range; - -exports.timeDay = day; -exports.timeDays = days; -exports.timeFriday = friday; -exports.timeFridays = fridays; -exports.timeHour = hour; -exports.timeHours = hours; -exports.timeInterval = newInterval; -exports.timeMillisecond = millisecond; -exports.timeMilliseconds = milliseconds; -exports.timeMinute = minute; -exports.timeMinutes = minutes; -exports.timeMonday = monday; -exports.timeMondays = mondays; -exports.timeMonth = month; -exports.timeMonths = months; -exports.timeSaturday = saturday; -exports.timeSaturdays = saturdays; -exports.timeSecond = second; -exports.timeSeconds = seconds; -exports.timeSunday = sunday; -exports.timeSundays = sundays; -exports.timeThursday = thursday; -exports.timeThursdays = thursdays; -exports.timeTuesday = tuesday; -exports.timeTuesdays = tuesdays; -exports.timeWednesday = wednesday; -exports.timeWednesdays = wednesdays; -exports.timeWeek = sunday; -exports.timeWeeks = sundays; -exports.timeYear = year; -exports.timeYears = years; -exports.utcDay = utcDay; -exports.utcDays = utcDays; -exports.utcFriday = utcFriday; -exports.utcFridays = utcFridays; -exports.utcHour = utcHour; -exports.utcHours = utcHours; -exports.utcMillisecond = millisecond; -exports.utcMilliseconds = milliseconds; -exports.utcMinute = utcMinute; -exports.utcMinutes = utcMinutes; -exports.utcMonday = utcMonday; -exports.utcMondays = utcMondays; -exports.utcMonth = utcMonth; -exports.utcMonths = utcMonths; -exports.utcSaturday = utcSaturday; -exports.utcSaturdays = utcSaturdays; -exports.utcSecond = second; -exports.utcSeconds = seconds; -exports.utcSunday = utcSunday; -exports.utcSundays = utcSundays; -exports.utcThursday = utcThursday; -exports.utcThursdays = utcThursdays; -exports.utcTuesday = utcTuesday; -exports.utcTuesdays = utcTuesdays; -exports.utcWednesday = utcWednesday; -exports.utcWednesdays = utcWednesdays; -exports.utcWeek = utcSunday; -exports.utcWeeks = utcSundays; -exports.utcYear = utcYear; -exports.utcYears = utcYears; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],35:[function(require,module,exports){ -// https://d3js.org/d3-timer/ v1.0.10 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {})); -}(this, function (exports) { 'use strict'; - -var frame = 0, // is an animation frame pending? - timeout = 0, // is a timeout pending? - interval = 0, // are any timers active? - pokeDelay = 1000, // how frequently we check for clock skew - taskHead, - taskTail, - clockLast = 0, - clockNow = 0, - clockSkew = 0, - clock = typeof performance === "object" && performance.now ? performance : Date, - setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; - -function now() { - return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); -} - -function clearNow() { - clockNow = 0; -} - -function Timer() { - this._call = - this._time = - this._next = null; -} - -Timer.prototype = timer.prototype = { - constructor: Timer, - restart: function(callback, delay, time) { - if (typeof callback !== "function") throw new TypeError("callback is not a function"); - time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); - if (!this._next && taskTail !== this) { - if (taskTail) taskTail._next = this; - else taskHead = this; - taskTail = this; - } - this._call = callback; - this._time = time; - sleep(); - }, - stop: function() { - if (this._call) { - this._call = null; - this._time = Infinity; - sleep(); - } - } -}; - -function timer(callback, delay, time) { - var t = new Timer; - t.restart(callback, delay, time); - return t; -} - -function timerFlush() { - now(); // Get the current time, if not already set. - ++frame; // Pretend we’ve set an alarm, if we haven’t already. - var t = taskHead, e; - while (t) { - if ((e = clockNow - t._time) >= 0) t._call.call(null, e); - t = t._next; - } - --frame; -} - -function wake() { - clockNow = (clockLast = clock.now()) + clockSkew; - frame = timeout = 0; - try { - timerFlush(); - } finally { - frame = 0; - nap(); - clockNow = 0; - } -} - -function poke() { - var now = clock.now(), delay = now - clockLast; - if (delay > pokeDelay) clockSkew -= delay, clockLast = now; -} - -function nap() { - var t0, t1 = taskHead, t2, time = Infinity; - while (t1) { - if (t1._call) { - if (time > t1._time) time = t1._time; - t0 = t1, t1 = t1._next; - } else { - t2 = t1._next, t1._next = null; - t1 = t0 ? t0._next = t2 : taskHead = t2; - } - } - taskTail = t0; - sleep(time); -} - -function sleep(time) { - if (frame) return; // Soonest alarm already set, or will be. - if (timeout) timeout = clearTimeout(timeout); - var delay = time - clockNow; // Strictly less than if we recomputed clockNow. - if (delay > 24) { - if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); - if (interval) interval = clearInterval(interval); - } else { - if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); - frame = 1, setFrame(wake); - } -} - -function timeout$1(callback, delay, time) { - var t = new Timer; - delay = delay == null ? 0 : +delay; - t.restart(function(elapsed) { - t.stop(); - callback(elapsed + delay); - }, delay, time); - return t; -} - -function interval$1(callback, delay, time) { - var t = new Timer, total = delay; - if (delay == null) return t.restart(callback, delay, time), t; - delay = +delay, time = time == null ? now() : +time; - t.restart(function tick(elapsed) { - elapsed += total; - t.restart(tick, total += delay, time); - callback(elapsed); - }, delay, time); - return t; -} - -exports.interval = interval$1; -exports.now = now; -exports.timeout = timeout$1; -exports.timer = timer; -exports.timerFlush = timerFlush; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],36:[function(require,module,exports){ -// https://d3js.org/d3-transition/ v1.3.2 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-timer'), require('d3-interpolate'), require('d3-color'), require('d3-ease')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); -}(this, function (exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) { 'use strict'; - -var emptyOn = d3Dispatch.dispatch("start", "end", "cancel", "interrupt"); -var emptyTween = []; - -var CREATED = 0; -var SCHEDULED = 1; -var STARTING = 2; -var STARTED = 3; -var RUNNING = 4; -var ENDING = 5; -var ENDED = 6; - -function schedule(node, name, id, index, group, timing) { - var schedules = node.__transition; - if (!schedules) node.__transition = {}; - else if (id in schedules) return; - create(node, id, { - name: name, - index: index, // For context during callback. - group: group, // For context during callback. - on: emptyOn, - tween: emptyTween, - time: timing.time, - delay: timing.delay, - duration: timing.duration, - ease: timing.ease, - timer: null, - state: CREATED - }); -} - -function init(node, id) { - var schedule = get(node, id); - if (schedule.state > CREATED) throw new Error("too late; already scheduled"); - return schedule; -} - -function set(node, id) { - var schedule = get(node, id); - if (schedule.state > STARTED) throw new Error("too late; already running"); - return schedule; -} - -function get(node, id) { - var schedule = node.__transition; - if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); - return schedule; -} - -function create(node, id, self) { - var schedules = node.__transition, - tween; - - // Initialize the self timer when the transition is created. - // Note the actual delay is not known until the first callback! - schedules[id] = self; - self.timer = d3Timer.timer(schedule, 0, self.time); - - function schedule(elapsed) { - self.state = SCHEDULED; - self.timer.restart(start, self.delay, self.time); - - // If the elapsed delay is less than our first sleep, start immediately. - if (self.delay <= elapsed) start(elapsed - self.delay); - } - - function start(elapsed) { - var i, j, n, o; - - // If the state is not SCHEDULED, then we previously errored on start. - if (self.state !== SCHEDULED) return stop(); - - for (i in schedules) { - o = schedules[i]; - if (o.name !== self.name) continue; - - // While this element already has a starting transition during this frame, - // defer starting an interrupting transition until that transition has a - // chance to tick (and possibly end); see d3/d3-transition#54! - if (o.state === STARTED) return d3Timer.timeout(start); - - // Interrupt the active transition, if any. - if (o.state === RUNNING) { - o.state = ENDED; - o.timer.stop(); - o.on.call("interrupt", node, node.__data__, o.index, o.group); - delete schedules[i]; - } - - // Cancel any pre-empted transitions. - else if (+i < id) { - o.state = ENDED; - o.timer.stop(); - o.on.call("cancel", node, node.__data__, o.index, o.group); - delete schedules[i]; - } - } + function dsv(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function (row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } - // Defer the first tick to end of the current frame; see d3/d3#1576. - // Note the transition may be canceled after start and before the first tick! - // Note this must be scheduled before the start event; see d3/d3-transition#16! - // Assuming this is successful, subsequent callbacks go straight to tick. - d3Timer.timeout(function() { - if (self.state === STARTED) { - self.state = RUNNING; - self.timer.restart(tick, self.delay, self.time); - tick(elapsed); - } - }); - - // Dispatch the start event. - // Note this must be done before the tween are initialized. - self.state = STARTING; - self.on.call("start", node, node.__data__, self.index, self.group); - if (self.state !== STARTING) return; // interrupted - self.state = STARTED; - - // Initialize the tween, deleting null tween. - tween = new Array(n = self.tween.length); - for (i = 0, j = -1; i < n; ++i) { - if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { - tween[++j] = o; - } - } - tween.length = j + 1; - } + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE) ; + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { + eol = true; + if (text.charCodeAt(I) === NEWLINE) ++I; + } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { + eol = true; + if (text.charCodeAt(I) === NEWLINE) ++I; + } else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } - function tick(elapsed) { - var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), - i = -1, - n = tween.length; + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } - while (++i < n) { - tween[i].call(node, t); - } + return rows; + } - // Dispatch the end event. - if (self.state === ENDING) { - self.on.call("end", node, node.__data__, self.index, self.group); - stop(); - } - } - - function stop() { - self.state = ENDED; - self.timer.stop(); - delete schedules[id]; - for (var i in schedules) return; // eslint-disable-line no-unused-vars - delete node.__transition; - } -} - -function interrupt(node, name) { - var schedules = node.__transition, - schedule, - active, - empty = true, - i; - - if (!schedules) return; - - name = name == null ? null : name + ""; - - for (i in schedules) { - if ((schedule = schedules[i]).name !== name) { empty = false; continue; } - active = schedule.state > STARTING && schedule.state < ENDING; - schedule.state = ENDED; - schedule.timer.stop(); - schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); - delete schedules[i]; - } - - if (empty) delete node.__transition; -} - -function selection_interrupt(name) { - return this.each(function() { - interrupt(this, name); - }); -} - -function tweenRemove(id, name) { - var tween0, tween1; - return function() { - var schedule = set(this, id), - tween = schedule.tween; - - // If this node shared tween with the previous node, - // just assign the updated shared tween and we’re done! - // Otherwise, copy-on-write. - if (tween !== tween0) { - tween1 = tween0 = tween; - for (var i = 0, n = tween1.length; i < n; ++i) { - if (tween1[i].name === name) { - tween1 = tween1.slice(); - tween1.splice(i, 1); - break; - } - } - } + function preformatBody(rows, columns) { + return rows.map(function (row) { + return columns.map(function (column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } - schedule.tween = tween1; - }; -} - -function tweenFunction(id, name, value) { - var tween0, tween1; - if (typeof value !== "function") throw new Error; - return function() { - var schedule = set(this, id), - tween = schedule.tween; - - // If this node shared tween with the previous node, - // just assign the updated shared tween and we’re done! - // Otherwise, copy-on-write. - if (tween !== tween0) { - tween1 = (tween0 = tween).slice(); - for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { - if (tween1[i].name === name) { - tween1[i] = t; - break; - } - } - if (i === n) tween1.push(t); - } + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } - schedule.tween = tween1; - }; -} + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } -function transition_tween(name, value) { - var id = this._id; + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } - name += ""; + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } - if (arguments.length < 2) { - var tween = get(this.node(), id).tween; - for (var i = 0, n = tween.length, t; i < n; ++i) { - if ((t = tween[i]).name === name) { - return t.value; - } - } - return null; - } - - return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); -} - -function tweenValue(transition, name, value) { - var id = transition._id; - - transition.each(function() { - var schedule = set(this, id); - (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); - }); - - return function(node) { - return get(node, id).value[name]; - }; -} - -function interpolate(a, b) { - var c; - return (typeof b === "number" ? d3Interpolate.interpolateNumber - : b instanceof d3Color.color ? d3Interpolate.interpolateRgb - : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) - : d3Interpolate.interpolateString)(a, b); -} - -function attrRemove(name) { - return function() { - this.removeAttribute(name); - }; -} - -function attrRemoveNS(fullname) { - return function() { - this.removeAttributeNS(fullname.space, fullname.local); - }; -} - -function attrConstant(name, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = this.getAttribute(name); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); - }; -} - -function attrConstantNS(fullname, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = this.getAttributeNS(fullname.space, fullname.local); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); - }; -} - -function attrFunction(name, interpolate, value) { - var string00, - string10, - interpolate0; - return function() { - var string0, value1 = value(this), string1; - if (value1 == null) return void this.removeAttribute(name); - string0 = this.getAttribute(name); - string1 = value1 + ""; - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); - }; -} - -function attrFunctionNS(fullname, interpolate, value) { - var string00, - string10, - interpolate0; - return function() { - var string0, value1 = value(this), string1; - if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); - string0 = this.getAttributeNS(fullname.space, fullname.local); - string1 = value1 + ""; - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); - }; -} - -function transition_attr(name, value) { - var fullname = d3Selection.namespace(name), i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; - return this.attrTween(name, typeof value === "function" - ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) - : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) - : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); -} - -function attrInterpolate(name, i) { - return function(t) { - this.setAttribute(name, i.call(this, t)); - }; -} - -function attrInterpolateNS(fullname, i) { - return function(t) { - this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); - }; -} - -function attrTweenNS(fullname, value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); - return t0; - } - tween._value = value; - return tween; -} - -function attrTween(name, value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); - return t0; - } - tween._value = value; - return tween; -} - -function transition_attrTween(name, value) { - var key = "attr." + name; - if (arguments.length < 2) return (key = this.tween(key)) && key._value; - if (value == null) return this.tween(key, null); - if (typeof value !== "function") throw new Error; - var fullname = d3Selection.namespace(name); - return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); -} - -function delayFunction(id, value) { - return function() { - init(this, id).delay = +value.apply(this, arguments); - }; -} - -function delayConstant(id, value) { - return value = +value, function() { - init(this, id).delay = value; - }; -} - -function transition_delay(value) { - var id = this._id; - - return arguments.length - ? this.each((typeof value === "function" - ? delayFunction - : delayConstant)(id, value)) - : get(this.node(), id).delay; -} - -function durationFunction(id, value) { - return function() { - set(this, id).duration = +value.apply(this, arguments); - }; -} - -function durationConstant(id, value) { - return value = +value, function() { - set(this, id).duration = value; - }; -} - -function transition_duration(value) { - var id = this._id; - - return arguments.length - ? this.each((typeof value === "function" - ? durationFunction - : durationConstant)(id, value)) - : get(this.node(), id).duration; -} - -function easeConstant(id, value) { - if (typeof value !== "function") throw new Error; - return function() { - set(this, id).ease = value; - }; -} - -function transition_ease(value) { - var id = this._id; - - return arguments.length - ? this.each(easeConstant(id, value)) - : get(this.node(), id).ease; -} - -function transition_filter(match) { - if (typeof match !== "function") match = d3Selection.matcher(match); - - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { - if ((node = group[i]) && match.call(node, node.__data__, i, group)) { - subgroup.push(node); - } - } - } + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } - return new Transition(subgroups, this._parents, this._name, this._id); -} + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; + } -function transition_merge(transition) { - if (transition._id !== this._id) throw new Error; + var csv = dsv(","); + + var csvParse = csv.parse; + var csvParseRows = csv.parseRows; + var csvFormat = csv.format; + var csvFormatBody = csv.formatBody; + var csvFormatRows = csv.formatRows; + var csvFormatRow = csv.formatRow; + var csvFormatValue = csv.formatValue; + + var tsv = dsv("\t"); + + var tsvParse = tsv.parse; + var tsvParseRows = tsv.parseRows; + var tsvFormat = tsv.format; + var tsvFormatBody = tsv.formatBody; + var tsvFormatRows = tsv.formatRows; + var tsvFormatRow = tsv.formatRow; + var tsvFormatValue = tsv.formatValue; + + function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } else continue; + object[key] = value; + } + return object; + } - for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { - for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group0[i] || group1[i]) { - merge[i] = node; - } - } - } - - for (; j < m0; ++j) { - merges[j] = groups0[j]; - } - - return new Transition(merges, this._parents, this._name, this._id); -} - -function start(name) { - return (name + "").trim().split(/^|\s+/).every(function(t) { - var i = t.indexOf("."); - if (i >= 0) t = t.slice(0, i); - return !t || t === "start"; - }); -} - -function onFunction(id, name, listener) { - var on0, on1, sit = start(name) ? init : set; - return function() { - var schedule = sit(this, id), - on = schedule.on; - - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); - - schedule.on = on1; - }; -} - -function transition_on(name, listener) { - var id = this._id; - - return arguments.length < 2 - ? get(this.node(), id).on.on(name) - : this.each(onFunction(id, name, listener)); -} - -function removeFunction(id) { - return function() { - var parent = this.parentNode; - for (var i in this.__transition) if (+i !== id) return; - if (parent) parent.removeChild(this); - }; -} - -function transition_remove() { - return this.on("end.remove", removeFunction(this._id)); -} - -function transition_select(select) { - var name = this._name, - id = this._id; - - if (typeof select !== "function") select = d3Selection.selector(select); - - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { - if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { - if ("__data__" in node) subnode.__data__ = node.__data__; - subgroup[i] = subnode; - schedule(subgroup[i], name, id, i, subgroup, get(node, id)); - } - } - } +// https://github.com/d3/d3-dsv/issues/45 + var fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + + exports.autoType = autoType; + exports.csvFormat = csvFormat; + exports.csvFormatBody = csvFormatBody; + exports.csvFormatRow = csvFormatRow; + exports.csvFormatRows = csvFormatRows; + exports.csvFormatValue = csvFormatValue; + exports.csvParse = csvParse; + exports.csvParseRows = csvParseRows; + exports.dsvFormat = dsv; + exports.tsvFormat = tsvFormat; + exports.tsvFormatBody = tsvFormatBody; + exports.tsvFormatRow = tsvFormatRow; + exports.tsvFormatRows = tsvFormatRows; + exports.tsvFormatValue = tsvFormatValue; + exports.tsvParse = tsvParse; + exports.tsvParseRows = tsvParseRows; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 18: [function (require, module, exports) { +// https://d3js.org/d3-ease/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function linear(t) { + return +t; + } - return new Transition(subgroups, this._parents, name, id); -} + function quadIn(t) { + return t * t; + } -function transition_selectAll(select) { - var name = this._name, - id = this._id; + function quadOut(t) { + return t * (2 - t); + } - if (typeof select !== "function") select = d3Selection.selectorAll(select); + function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; + } - for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { - if (child = children[k]) { - schedule(child, name, id, k, children, inherit); - } - } - subgroups.push(children); - parents.push(node); - } - } - } - - return new Transition(subgroups, parents, name, id); -} - -var Selection = d3Selection.selection.prototype.constructor; - -function transition_selection() { - return new Selection(this._groups, this._parents); -} - -function styleNull(name, interpolate) { - var string00, - string10, - interpolate0; - return function() { - var string0 = d3Selection.style(this, name), - string1 = (this.style.removeProperty(name), d3Selection.style(this, name)); - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, string10 = string1); - }; -} - -function styleRemove(name) { - return function() { - this.style.removeProperty(name); - }; -} - -function styleConstant(name, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = d3Selection.style(this, name); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); - }; -} - -function styleFunction(name, interpolate, value) { - var string00, - string10, - interpolate0; - return function() { - var string0 = d3Selection.style(this, name), - value1 = value(this), - string1 = value1 + ""; - if (value1 == null) string1 = value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); - }; -} - -function styleMaybeRemove(id, name) { - var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; - return function() { - var schedule = set(this, id), - on = schedule.on, - listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; - - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); - - schedule.on = on1; - }; -} - -function transition_style(name, value, priority) { - var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; - return value == null ? this - .styleTween(name, styleNull(name, i)) - .on("end.style." + name, styleRemove(name)) - : typeof value === "function" ? this - .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) - .each(styleMaybeRemove(this._id, name)) - : this - .styleTween(name, styleConstant(name, i, value), priority) - .on("end.style." + name, null); -} - -function styleInterpolate(name, i, priority) { - return function(t) { - this.style.setProperty(name, i.call(this, t), priority); - }; -} - -function styleTween(name, value, priority) { - var t, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); - return t; - } - tween._value = value; - return tween; -} - -function transition_styleTween(name, value, priority) { - var key = "style." + (name += ""); - if (arguments.length < 2) return (key = this.tween(key)) && key._value; - if (value == null) return this.tween(key, null); - if (typeof value !== "function") throw new Error; - return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); -} - -function textConstant(value) { - return function() { - this.textContent = value; - }; -} - -function textFunction(value) { - return function() { - var value1 = value(this); - this.textContent = value1 == null ? "" : value1; - }; -} - -function transition_text(value) { - return this.tween("text", typeof value === "function" - ? textFunction(tweenValue(this, "text", value)) - : textConstant(value == null ? "" : value + "")); -} - -function textInterpolate(i) { - return function(t) { - this.textContent = i.call(this, t); - }; -} - -function textTween(value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) t0 = (i0 = i) && textInterpolate(i); - return t0; - } - tween._value = value; - return tween; -} - -function transition_textTween(value) { - var key = "text"; - if (arguments.length < 1) return (key = this.tween(key)) && key._value; - if (value == null) return this.tween(key, null); - if (typeof value !== "function") throw new Error; - return this.tween(key, textTween(value)); -} - -function transition_transition() { - var name = this._name, - id0 = this._id, - id1 = newId(); - - for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - var inherit = get(node, id0); - schedule(node, name, id1, i, group, { - time: inherit.time + inherit.delay + inherit.duration, - delay: 0, - duration: inherit.duration, - ease: inherit.ease - }); - } - } - } - - return new Transition(groups, this._parents, name, id1); -} - -function transition_end() { - var on0, on1, that = this, id = that._id, size = that.size(); - return new Promise(function(resolve, reject) { - var cancel = {value: reject}, - end = {value: function() { if (--size === 0) resolve(); }}; - - that.each(function() { - var schedule = set(this, id), - on = schedule.on; - - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0) { - on1 = (on0 = on).copy(); - on1._.cancel.push(cancel); - on1._.interrupt.push(cancel); - on1._.end.push(end); - } - - schedule.on = on1; - }); - }); -} - -var id = 0; - -function Transition(groups, parents, name, id) { - this._groups = groups; - this._parents = parents; - this._name = name; - this._id = id; -} - -function transition(name) { - return d3Selection.selection().transition(name); -} - -function newId() { - return ++id; -} - -var selection_prototype = d3Selection.selection.prototype; - -Transition.prototype = transition.prototype = { - constructor: Transition, - select: transition_select, - selectAll: transition_selectAll, - filter: transition_filter, - merge: transition_merge, - selection: transition_selection, - transition: transition_transition, - call: selection_prototype.call, - nodes: selection_prototype.nodes, - node: selection_prototype.node, - size: selection_prototype.size, - empty: selection_prototype.empty, - each: selection_prototype.each, - on: transition_on, - attr: transition_attr, - attrTween: transition_attrTween, - style: transition_style, - styleTween: transition_styleTween, - text: transition_text, - textTween: transition_textTween, - remove: transition_remove, - tween: transition_tween, - delay: transition_delay, - duration: transition_duration, - ease: transition_ease, - end: transition_end -}; - -var defaultTiming = { - time: null, // Set on use. - delay: 0, - duration: 250, - ease: d3Ease.easeCubicInOut -}; - -function inherit(node, id) { - var timing; - while (!(timing = node.__transition) || !(timing = timing[id])) { - if (!(node = node.parentNode)) { - return defaultTiming.time = d3Timer.now(), defaultTiming; - } - } - return timing; -} - -function selection_transition(name) { - var id, - timing; - - if (name instanceof Transition) { - id = name._id, name = name._name; - } else { - id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; - } - - for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - schedule(node, name, id, i, group, timing || inherit(node, id)); - } - } - } + function cubicIn(t) { + return t * t * t; + } - return new Transition(groups, this._parents, name, id); -} + function cubicOut(t) { + return --t * t * t + 1; + } -d3Selection.selection.prototype.interrupt = selection_interrupt; -d3Selection.selection.prototype.transition = selection_transition; + function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; + } -var root = [null]; + var exponent = 3; -function active(node, name) { - var schedules = node.__transition, - schedule, - i; + var polyIn = (function custom(e) { + e = +e; - if (schedules) { - name = name == null ? null : name + ""; - for (i in schedules) { - if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { - return new Transition([[node]], root, name, +i); - } - } - } + function polyIn(t) { + return Math.pow(t, e); + } - return null; -} + polyIn.exponent = custom; -exports.active = active; -exports.interrupt = interrupt; -exports.transition = transition; + return polyIn; + })(exponent); -Object.defineProperty(exports, '__esModule', { value: true }); + var polyOut = (function custom(e) { + e = +e; -})); + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } -},{"d3-color":13,"d3-dispatch":15,"d3-ease":18,"d3-interpolate":24,"d3-selection":31,"d3-timer":35}],37:[function(require,module,exports){ -// https://d3js.org/d3-voronoi/ v1.1.4 Copyright 2018 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : -typeof define === 'function' && define.amd ? define(['exports'], factory) : -(factory((global.d3 = global.d3 || {}))); -}(this, (function (exports) { 'use strict'; - -function constant(x) { - return function() { - return x; - }; -} - -function x(d) { - return d[0]; -} - -function y(d) { - return d[1]; -} - -function RedBlackTree() { - this._ = null; // root node -} - -function RedBlackNode(node) { - node.U = // parent node - node.C = // color - true for red, false for black - node.L = // left node - node.R = // right node - node.P = // previous node - node.N = null; // next node -} - -RedBlackTree.prototype = { - constructor: RedBlackTree, - - insert: function(after, node) { - var parent, grandpa, uncle; - - if (after) { - node.P = after; - node.N = after.N; - if (after.N) after.N.P = node; - after.N = node; - if (after.R) { - after = after.R; - while (after.L) after = after.L; - after.L = node; - } else { - after.R = node; - } - parent = after; - } else if (this._) { - after = RedBlackFirst(this._); - node.P = null; - node.N = after; - after.P = after.L = node; - parent = after; - } else { - node.P = node.N = null; - this._ = node; - parent = null; - } - node.L = node.R = null; - node.U = parent; - node.C = true; - - after = node; - while (parent && parent.C) { - grandpa = parent.U; - if (parent === grandpa.L) { - uncle = grandpa.R; - if (uncle && uncle.C) { - parent.C = uncle.C = false; - grandpa.C = true; - after = grandpa; - } else { - if (after === parent.R) { - RedBlackRotateLeft(this, parent); - after = parent; - parent = after.U; - } - parent.C = false; - grandpa.C = true; - RedBlackRotateRight(this, grandpa); - } - } else { - uncle = grandpa.L; - if (uncle && uncle.C) { - parent.C = uncle.C = false; - grandpa.C = true; - after = grandpa; - } else { - if (after === parent.L) { - RedBlackRotateRight(this, parent); - after = parent; - parent = after.U; - } - parent.C = false; - grandpa.C = true; - RedBlackRotateLeft(this, grandpa); - } - } - parent = after.U; - } - this._.C = false; - }, - - remove: function(node) { - if (node.N) node.N.P = node.P; - if (node.P) node.P.N = node.N; - node.N = node.P = null; - - var parent = node.U, - sibling, - left = node.L, - right = node.R, - next, - red; - - if (!left) next = right; - else if (!right) next = left; - else next = RedBlackFirst(right); - - if (parent) { - if (parent.L === node) parent.L = next; - else parent.R = next; - } else { - this._ = next; - } + polyOut.exponent = custom; - if (left && right) { - red = next.C; - next.C = node.C; - next.L = left; - left.U = next; - if (next !== right) { - parent = next.U; - next.U = node.U; - node = next.R; - parent.L = node; - next.R = right; - right.U = next; - } else { - next.U = parent; - parent = next; - node = next.R; - } - } else { - red = node.C; - node = next; - } + return polyOut; + })(exponent); + + var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; + })(exponent); + + var pi = Math.PI, + halfPi = pi / 2; + + function sinIn(t) { + return 1 - Math.cos(t * halfPi); + } + + function sinOut(t) { + return Math.sin(t * halfPi); + } + + function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; + } + + function expIn(t) { + return Math.pow(2, 10 * t - 10); + } + + function expOut(t) { + return 1 - Math.pow(2, -10 * t); + } + + function expInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; + } + + function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); + } + + function circleOut(t) { + return Math.sqrt(1 - --t * t); + } + + function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; + } + + var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + + function bounceIn(t) { + return 1 - bounceOut(1 - t); + } + + function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; + } + + function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; + } + + var overshoot = 1.70158; + + var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return t * t * ((s + 1) * t - s); + } + + backIn.overshoot = custom; + + return backIn; + })(overshoot); + + var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((s + 1) * t + s) + 1; + } + + backOut.overshoot = custom; + + return backOut; + })(overshoot); + + var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; + })(overshoot); + + var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; + + var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticIn.period = function (p) { + return custom(a, p); + }; + + return elasticIn; + })(amplitude, period); + + var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticOut.period = function (p) { + return custom(a, p); + }; + + return elasticOut; + })(amplitude, period); + + var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) + : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticInOut.period = function (p) { + return custom(a, p); + }; + + return elasticInOut; + })(amplitude, period); + + exports.easeBack = backInOut; + exports.easeBackIn = backIn; + exports.easeBackInOut = backInOut; + exports.easeBackOut = backOut; + exports.easeBounce = bounceOut; + exports.easeBounceIn = bounceIn; + exports.easeBounceInOut = bounceInOut; + exports.easeBounceOut = bounceOut; + exports.easeCircle = circleInOut; + exports.easeCircleIn = circleIn; + exports.easeCircleInOut = circleInOut; + exports.easeCircleOut = circleOut; + exports.easeCubic = cubicInOut; + exports.easeCubicIn = cubicIn; + exports.easeCubicInOut = cubicInOut; + exports.easeCubicOut = cubicOut; + exports.easeElastic = elasticOut; + exports.easeElasticIn = elasticIn; + exports.easeElasticInOut = elasticInOut; + exports.easeElasticOut = elasticOut; + exports.easeExp = expInOut; + exports.easeExpIn = expIn; + exports.easeExpInOut = expInOut; + exports.easeExpOut = expOut; + exports.easeLinear = linear; + exports.easePoly = polyInOut; + exports.easePolyIn = polyIn; + exports.easePolyInOut = polyInOut; + exports.easePolyOut = polyOut; + exports.easeQuad = quadInOut; + exports.easeQuadIn = quadIn; + exports.easeQuadInOut = quadInOut; + exports.easeQuadOut = quadOut; + exports.easeSin = sinInOut; + exports.easeSinIn = sinIn; + exports.easeSinInOut = sinInOut; + exports.easeSinOut = sinOut; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 19: [function (require, module, exports) { +// https://d3js.org/d3-fetch/ v1.1.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dsv')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dsv'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3)); + }(this, (function (exports, d3Dsv) { + 'use strict'; + + function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); + } + + function blob(input, init) { + return fetch(input, init).then(responseBlob); + } + + function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); + } + + function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); + } + + function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); + } + + function text(input, init) { + return fetch(input, init).then(responseText); + } + + function dsvParse(parse) { + return function (input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function (response) { + return parse(response, row); + }); + }; + } + + function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = d3Dsv.dsvFormat(delimiter); + return text(input, init).then(function (response) { + return format.parse(response, row); + }); + } + + var csv = dsvParse(d3Dsv.csvParse); + var tsv = dsvParse(d3Dsv.tsvParse); + + function image(input, init) { + return new Promise(function (resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function () { + resolve(image); + }; + image.src = input; + }); + } + + function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.json(); + } + + function json(input, init) { + return fetch(input, init).then(responseJson); + } + + function parser(type) { + return function (input, init) { + return text(input, init).then(function (text$$1) { + return (new DOMParser).parseFromString(text$$1, type); + }); + }; + } + + var xml = parser("application/xml"); + + var html = parser("text/html"); + + var svg = parser("image/svg+xml"); + + exports.blob = blob; + exports.buffer = buffer; + exports.dsv = dsv; + exports.csv = csv; + exports.tsv = tsv; + exports.image = image; + exports.json = json; + exports.text = text; + exports.xml = xml; + exports.html = html; + exports.svg = svg; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-dsv": 17}], + 20: [function (require, module, exports) { +// https://d3js.org/d3-force/ v1.2.1 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-quadtree'), require('d3-collection'), require('d3-dispatch'), require('d3-timer')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-quadtree', 'd3-collection', 'd3-dispatch', 'd3-timer'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3, global.d3, global.d3)); + }(this, (function (exports, d3Quadtree, d3Collection, d3Dispatch, d3Timer) { + 'use strict'; + + function center(x, y) { + var nodes; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function (_) { + nodes = _; + }; + + force.x = function (_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function (_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + } + + function constant(x) { + return function () { + return x; + }; + } + + function jiggle() { + return (Math.random() - 0.5) * 1e-6; + } + + function x(d) { + return d.x + d.vx; + } + + function y(d) { + return d.y + d.vy; + } + + function collide(radius) { + var nodes, + radii, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.iterations = function (_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function (_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + return force; + } + + function index(d) { + return d.index; + } + + function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("missing: " + nodeId); + return node; + } + + function link(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant(30), + distances, + nodes, + count, + bias, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(); + y = target.y + target.vy - source.y - source.vy || jiggle(); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = d3Collection.map(nodes, id), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.links = function (_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function (_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function (_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength; + }; + + force.distance = function (_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; + }; + + return force; + } + + function x$1(d) { + return d.x; + } + + function y$1(d) { + return d.y; + } + + var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + + function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = d3Collection.map(), + stepper = d3Timer.timer(step), + event = d3Dispatch.dispatch("tick", "end"); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.each(function (force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function () { + return stepper.restart(step), simulation; + }, + + stop: function () { + return stepper.stop(), simulation; + }, + + nodes: function (_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + }, + + alpha: function (_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function (_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function (_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function (_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function (_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + force: function (name, _) { + return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function (x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function (name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; + } + + function manyBody() { + var nodes, + node, + alpha, + strength = constant(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.distanceMin = function (_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function (_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function (_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; + } + + function radial(radius, x, y) { + var nodes, + strength = constant(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _, initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + force.x = function (_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function (_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + } + + function x$2(x) { + var strength = constant(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x; + }; + + return force; + } + + function y$2(y) { + var strength = constant(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; + }; + + return force; + } + + exports.forceCenter = center; + exports.forceCollide = collide; + exports.forceLink = link; + exports.forceManyBody = manyBody; + exports.forceRadial = radial; + exports.forceSimulation = simulation; + exports.forceX = x$2; + exports.forceY = y$2; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-collection": 12, "d3-dispatch": 15, "d3-quadtree": 27, "d3-timer": 35}], + 21: [function (require, module, exports) { +// https://d3js.org/d3-format/ v1.4.3 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimal(1.23) returns ["123", 0]. + function formatDecimal(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; + } + + function exponent(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; + } + + function formatGroup(grouping, thousands) { + return function (value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; + } + + function formatNumerals(numerals) { + return function (value) { + return value.replace(/[0-9]/g, function (i) { + return numerals[+i]; + }); + }; + } + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] + var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + + function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); + } + + formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + + function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; + } + + FormatSpecifier.prototype.toString = function () { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; + }; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. + function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": + i0 = i1 = i; + break; + case "0": + if (i0 === 0) i0 = i; + i1 = i; + break; + default: + if (!+s[i]) break out; + if (i0 > 0) i0 = 0; + break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; + } + + var prefixExponent; + + function formatPrefixAuto(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! + } + + function formatRounded(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); + } + + var formatTypes = { + "%": function (x, p) { + return (x * 100).toFixed(p); + }, + "b": function (x) { + return Math.round(x).toString(2); + }, + "c": function (x) { + return x + ""; + }, + "d": function (x) { + return Math.round(x).toString(10); + }, + "e": function (x, p) { + return x.toExponential(p); + }, + "f": function (x, p) { + return x.toFixed(p); + }, + "g": function (x, p) { + return x.toPrecision(p); + }, + "o": function (x) { + return Math.round(x).toString(8); + }, + "p": function (x, p) { + return formatRounded(x * 100, p); + }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function (x) { + return Math.round(x).toString(16).toUpperCase(); + }, + "x": function (x) { + return Math.round(x).toString(16); + } + }; + + function identity(x) { + return x; + } + + var map = Array.prototype.map, + prefixes = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; + + function formatLocale(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "-" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Perform the initial formatting. + var valueNegative = value < 0; + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero during formatting, treat as positive. + if (valueNegative && +value === 0) valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": + value = valuePrefix + value + valueSuffix + padding; + break; + case "=": + value = valuePrefix + padding + value + valueSuffix; + break; + case "^": + value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); + break; + default: + value = padding + valuePrefix + value + valueSuffix; + break; + } + + return numerals(value); + } + + format.toString = function () { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function (value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; + } + + var locale; + + defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""], + minus: "-" + }); + + function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; + } + + function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); + } + + function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); + } + + function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; + } + + exports.FormatSpecifier = FormatSpecifier; + exports.formatDefaultLocale = defaultLocale; + exports.formatLocale = formatLocale; + exports.formatSpecifier = formatSpecifier; + exports.precisionFixed = precisionFixed; + exports.precisionPrefix = precisionPrefix; + exports.precisionRound = precisionRound; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 22: [function (require, module, exports) { +// https://d3js.org/d3-geo/ v1.11.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Array) { + 'use strict'; + +// Adds floating point numbers with twice the normal precision. +// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and +// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) +// 305–363 (1997). +// Code adapted from GeographicLib by Charles F. F. Karney, +// http://geographiclib.sourceforge.net/ + + function adder() { + return new Adder; + } + + function Adder() { + this.reset(); + } + + Adder.prototype = { + constructor: Adder, + reset: function () { + this.s = // rounded value + this.t = 0; // exact error + }, + add: function (y) { + add(temp, y, this.t); + add(this, temp.s, this.s); + if (this.s) this.t += temp.t; + else this.s = temp.t; + }, + valueOf: function () { + return this.s; + } + }; + + var temp = new Adder; + + function add(adder, a, b) { + var x = adder.s = a + b, + bv = x - a, + av = x - bv; + adder.t = (a - av) + (b - bv); + } + + var epsilon = 1e-6; + var epsilon2 = 1e-12; + var pi = Math.PI; + var halfPi = pi / 2; + var quarterPi = pi / 4; + var tau = pi * 2; + + var degrees = 180 / pi; + var radians = pi / 180; + + var abs = Math.abs; + var atan = Math.atan; + var atan2 = Math.atan2; + var cos = Math.cos; + var ceil = Math.ceil; + var exp = Math.exp; + var log = Math.log; + var pow = Math.pow; + var sin = Math.sin; + var sign = Math.sign || function (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + }; + var sqrt = Math.sqrt; + var tan = Math.tan; + + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); + } + + function asin(x) { + return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); + } + + function haversin(x) { + return (x = sin(x / 2)) * x; + } + + function noop() { + } + + function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } + } + + var streamObjectType = { + Feature: function (object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function (object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } + }; + + var streamGeometryType = { + Sphere: function (object, stream) { + stream.sphere(); + }, + Point: function (object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function (object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function (object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function (object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } + }; + + function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); + } + + function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); + } + + function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } + } + + var areaRingSum = adder(); + + var areaSum = adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + + var areaStream = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function () { + areaRingSum.reset(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function () { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop; + }, + sphere: function () { + areaSum.add(tau); + } + }; + + function areaRingStart() { + areaStream.point = areaPointFirst; + } + + function areaRingEnd() { + areaPoint(lambda00, phi00); + } + + function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); + } + + function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos(phi), + sinPhi = sin(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos(adLambda), + v = k * sdLambda * sin(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; + } + + function area(object) { + areaSum.reset(); + geoStream(object, areaStream); + return areaSum * 2; + } + + function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; + } + + function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); + return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; + } + + function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + + function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; + } + +// TODO return a + function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; + } + + function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; + } + +// TODO return d + function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; + } + + var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum = adder(), + ranges, + range; + + var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function () { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum.reset(); + areaStream.polygonStart(); + }, + polygonEnd: function () { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon) phi1 = 90; + else if (deltaSum < -epsilon) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function () { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } + }; + + function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + + function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; + } + + function boundsLineStart() { + boundsStream.point = linePoint; + } + + function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; + } + + function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); + } + + function boundsRingStart() { + areaStream.lineStart(); + } + + function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; + } + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. + function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; + } + + function rangeCompare(a, b) { + return a[0] - b[0]; + } + + function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + + function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; + } + + var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00$2, phi00$2, // first point + x0, y0, z0; // previous point + + var centroidStream = { + sphere: noop, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function () { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function () { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } + }; + +// Arithmetic mean of Cartesian vectors. + function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); + } + + function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; + } + + function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; + } + + function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); + } + + function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroidLineEnd() { + centroidStream.point = centroidPoint; + } + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). + function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; + } + + function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; + } + + function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidPointCartesian(x0, y0, z0); + } + + function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = sqrt(cx * cx + cy * cy + cz * cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2 += v * cx; + Y2 += v * cy; + Z2 += v * cz; + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroid(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + geoStream(object, centroidStream); + + var x = X2, + y = Y2, + z = Z2, + m = x * x + y * y + z * z; + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon) x = X0, y = Y0, z = Z0; + m = x * x + y * y + z * z; + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees, asin(z / sqrt(m)) * degrees]; + } + + function constant(x) { + return function () { + return x; + }; + } + + function compose(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function (x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; + } + + function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; + } + + rotationIdentity.invert = rotationIdentity; + + function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); + } + + function forwardRotationLambda(deltaLambda) { + return function (lambda, phi) { + return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; + }; + } + + function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; + } + + function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos(deltaPhi), + sinDeltaPhi = sin(deltaPhi), + cosDeltaGamma = cos(deltaGamma), + sinDeltaGamma = sin(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function (lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; + } + + function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + } + + forward.invert = function (coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + }; + + return forward; + } + +// Generates a circle centered at [0°, 0°], with a given radius and precision. + function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos(radius), + sinRadius = sin(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); + stream.point(point[0], point[1]); + } + } + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. + function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; + } + + function circle() { + var center = constant([0, 0]), + radius = constant(90), + precision = constant(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees, x[1] *= degrees; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function (_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius; + }; + + circle.precision = function (_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision; + }; + + return circle; + } + + function clipBuffer() { + var lines = [], + line; + return { + point: function (x, y) { + line.push([x, y]); + }, + lineStart: function () { + lines.push(line = []); + }, + lineEnd: noop, + rejoin: function () { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function () { + var result = lines; + lines = []; + line = null; + return result; + } + }; + } + + function pointEqual(a, b) { + return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; + } + + function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous + } + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. + function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function (segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + // If the first and last points of a segment are coincident, then treat as a + // closed ring. TODO if all rings are closed, then the winding order of the + // exterior ring should be checked. + if (pointEqual(p0, p1)) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link(subject); + link(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } + } + + function link(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; + } + + var sum = adder(); + + function longitude(point) { + if (abs(point[0]) <= pi) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); + } + + function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin(phi), + normal = [sin(lambda), -cos(lambda), 0], + angle = 0, + winding = 0; + + sum.reset(); + + if (sinPhi === 1) phi = halfPi + epsilon; + else if (sinPhi === -1) phi = -halfPi - epsilon; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin(phi0), + cosPhi0 = cos(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin(phi1), + cosPhi1 = cos(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi, + k = sinPhi0 * sinPhi1; + + sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); + angle += antimeridian ? delta + sign * tau : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1); + } + + function clip(pointVisible, clipLine, interpolate, start) { + return function (sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function () { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function () { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3Array.merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function () { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; + } + + function validSegment(segment) { + return segment.length > 1; + } + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. + function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); + } + + var clipAntimeridian = clip( + function () { + return true; + }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi, -halfPi] + ); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. + function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function () { + stream.lineStart(); + clean = 1; + }, + point: function (lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi : -pi, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi) < epsilon) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function () { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function () { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; + } + + function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon + ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) + - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; + } + + function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi; + stream.point(-pi, phi); + stream.point(0, phi); + stream.point(pi, phi); + stream.point(pi, 0); + stream.point(pi, -phi); + stream.point(0, -phi); + stream.point(-pi, -phi); + stream.point(-pi, 0); + stream.point(-pi, phi); + } else if (abs(from[0] - to[0]) > epsilon) { + var lambda = from[0] < to[0] ? pi : -pi; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } + } + + function clipCircle(radius) { + var cr = cos(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos(lambda) * cos(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function () { + v00 = v0 = false; + clean = 1; + }, + point: function (lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + // Handle degeneracies. + // TODO ignore if not clipping polygons. + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { + point1[0] += epsilon; + point1[1] += epsilon; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1]); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function () { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function () { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi) < epsilon, + meridian = polar || delta < epsilon; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); + } + + function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; + } + + var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + + function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function (stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { + if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; + } else { + if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; + } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = d3Array.merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; + } + + function extent() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function (stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function (_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; + } + + var lengthSum = adder(), + lambda0$2, + sinPhi0$1, + cosPhi0$1; + + var lengthStream = { + sphere: noop, + point: noop, + lineStart: lengthLineStart, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop + }; + + function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; + } + + function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop; + } + + function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi); + lengthStream.point = lengthPoint; + } + + function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin(phi), + cosPhi = cos(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos(delta), + sinDelta = sin(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; + } + + function length(object) { + lengthSum.reset(); + geoStream(object, lengthStream); + return +lengthSum; + } + + var coordinates = [null, null], + object = {type: "LineString", coordinates: coordinates}; + + function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length(object); + } + + var containsObjectType = { + Feature: function (object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function (object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } + }; + + var containsGeometryType = { + Sphere: function () { + return true; + }, + Point: function (object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function (object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function (object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function (object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } + }; + + function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; + } + + function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; + } + + function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab + ) + return true; + } + ao = bo; + } + return false; + } + + function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); + } + + function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; + } + + function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; + } + + function contains(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); + } + + function graticuleX(y0, y1, dy) { + var y = d3Array.range(y0, y1 - epsilon, dy).concat(y1); + return function (x) { + return y.map(function (y) { + return [x, y]; + }); + }; + } + + function graticuleY(x0, x1, dx) { + var x = d3Array.range(x0, x1 - epsilon, dx).concat(x1); + return function (y) { + return x.map(function (x) { + return [x, y]; + }); + }; + } + + function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return d3Array.range(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(d3Array.range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(d3Array.range(ceil(x0 / dx) * dx, x1, dx).filter(function (x) { + return abs(x % DX) > epsilon; + }).map(x)) + .concat(d3Array.range(ceil(y0 / dy) * dy, y1, dy).filter(function (y) { + return abs(y % DY) > epsilon; + }).map(y)); + } + + graticule.lines = function () { + return lines().map(function (coordinates) { + return {type: "LineString", coordinates: coordinates}; + }); + }; + + graticule.outline = function () { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function (_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function (_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function (_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function (_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function (_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function (_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function (_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) + .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); + } + + function graticule10() { + return graticule()(); + } + + function interpolate(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos(y0), + sy0 = sin(y0), + cy1 = cos(y1), + sy1 = sin(y1), + kx0 = cy0 * cos(x0), + ky0 = cy0 * sin(x0), + kx1 = cy1 * cos(x1), + ky1 = cy1 * sin(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin(d); + + var interpolate = d ? function (t) { + var B = sin(t *= d) / k, + A = sin(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees, + atan2(z, sqrt(x * x + y * y)) * degrees + ]; + } : function () { + return [x0 * degrees, y0 * degrees]; + }; + + interpolate.distance = d; + + return interpolate; + } + + function identity(x) { + return x; + } + + var areaSum$1 = adder(), + areaRingSum$1 = adder(), + x00, + y00, + x0$1, + y0$1; + + var areaStream$1 = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function () { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function () { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1.reset(); + }, + result: function () { + var area = areaSum$1 / 2; + areaSum$1.reset(); + return area; + } + }; + + function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; + } + + function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; + } + + function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; + } + + function areaRingEnd$1() { + areaPoint$1(x00, y00); + } + + var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + + var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop, + result: function () { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } + }; + + function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; + } + +// TODO Enforce positive area for exterior, negative area for interior? + + var X0$1 = 0, + Y0$1 = 0, + Z0$1 = 0, + X1$1 = 0, + Y1$1 = 0, + Z1$1 = 0, + X2$1 = 0, + Y2$1 = 0, + Z2$1 = 0, + x00$1, + y00$1, + x0$3, + y0$3; + + var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function () { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function () { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function () { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } + }; + + function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; + } + + function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; + } + + function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; + } + + function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; + } + + function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); + } + + function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); + } + + function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function PathContext(context) { + this._context = context; + } + + PathContext.prototype = { + _radius: 4.5, + pointRadius: function (_) { + return this._radius = _, this; + }, + polygonStart: function () { + this._line = 0; + }, + polygonEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function (x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau); + break; + } + } + }, + result: noop + }; + + var lengthSum$1 = adder(), + lengthRing, + x00$2, + y00$2, + x0$4, + y0$4; + + var lengthStream$1 = { + point: noop, + lineStart: function () { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function () { + if (lengthRing) lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop; + }, + polygonStart: function () { + lengthRing = true; + }, + polygonEnd: function () { + lengthRing = null; + }, + result: function () { + var length = +lengthSum$1; + lengthSum$1.reset(); + return length; + } + }; + + function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; + } + + function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; + } + + function PathString() { + this._string = []; + } + + PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function (_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function () { + this._line = 0; + }, + polygonEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function (x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function () { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } + }; + + function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; + } + + function index(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function (object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.measure = function (object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); + }; + + path.bounds = function (object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function (object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function (_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; + }; + + path.context = function (_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function (_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); + } + + function transform(methods) { + return { + stream: transformer(methods) + }; + } + + function transformer(methods) { + return function (stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; + } + + function TransformStream() { + } + + TransformStream.prototype = { + constructor: TransformStream, + point: function (x, y) { + this.stream.point(x, y); + }, + sphere: function () { + this.stream.sphere(); + }, + lineStart: function () { + this.stream.lineStart(); + }, + lineEnd: function () { + this.stream.lineEnd(); + }, + polygonStart: function () { + this.stream.polygonStart(); + }, + polygonEnd: function () { + this.stream.polygonEnd(); + } + }; + + function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream$1)); + fitBounds(boundsStream$1.result()); + if (clip != null) projection.clipExtent(clip); + return projection; + } + + function fitExtent(projection, extent, object) { + return fit(projection, function (b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); + } + + function fitWidth(projection, width, object) { + return fit(projection, function (b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + function fitHeight(projection, height, object) { + return fit(projection, function (b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos(30 * radians); // cos(minimum angular distance) + + function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); + } + + function resampleNone(project) { + return transformer({ + point: function (x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); + } + + function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + + return function (stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function () { + stream.polygonStart(); + resampleStream.lineStart = ringStart; + }, + polygonEnd: function () { + stream.polygonEnd(); + resampleStream.lineStart = lineStart; + } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; + } + + var transformRadians = transformer({ + point: function (x, y) { + this.stream.point(x * radians, y * radians); + } + }); + + function transformRotate(rotate) { + return transformer({ + point: function (x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); + } + + function scaleTranslate(k, dx, dy) { + function transform(x, y) { + return [dx + k * x, dy - k * y]; + } + + transform.invert = function (x, y) { + return [(x - dx) / k, (dy - y) / k]; + }; + return transform; + } + + function scaleTranslateRotate(k, dx, dy, alpha) { + var cosAlpha = cos(alpha), + sinAlpha = sin(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + + function transform(x, y) { + return [a * x - b * y + dx, dy - b * x - a * y]; + } + + transform.invert = function (x, y) { + return [ai * x - bi * y + ci, fi - bi * x - ai * y]; + }; + return transform; + } + + function projection(project) { + return projectionMutator(function () { + return project; + })(); + } + + function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees, point[1] * degrees]; + } + + projection.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function (_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function (_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; + }; + + projection.clipExtent = function (_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function (_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function (_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function (_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; + }; + + projection.rotate = function (_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + }; + + projection.angle = function (_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.precision = function (_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function (extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function (size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function (width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function (height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)), + transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function () { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; + } + + function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function (_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; + }; + + return p; + } + + function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin(phi) / cosPhi0]; + } + + forward.invert = function (x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; + } + + function conicEqualAreaRaw(y0, y1) { + var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin(y)) / n; + return [r * sin(x *= n), r0 - r * cos(x)]; + } + + project.invert = function (x, y) { + var r0y = r0 - y; + return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; + } + + function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); + } + + function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); + } + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. + function multiplex(streams) { + var n = streams.length; + return { + point: function (x, y) { + var i = -1; + while (++i < n) streams[i].point(x, y); + }, + sphere: function () { + var i = -1; + while (++i < n) streams[i].sphere(); + }, + lineStart: function () { + var i = -1; + while (++i < n) streams[i].lineStart(); + }, + lineEnd: function () { + var i = -1; + while (++i < n) streams[i].lineEnd(); + }, + polygonStart: function () { + var i = -1; + while (++i < n) streams[i].polygonStart(); + }, + polygonEnd: function () { + var i = -1; + while (++i < n) streams[i].polygonEnd(); + } + }; + } + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers + function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = { + point: function (x, y) { + point = [x, y]; + } + }; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function (coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function (_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function (_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function (_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function (extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function (size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function (width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function (height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); + } + + function azimuthalRaw(scale) { + return function (x, y) { + var cx = cos(x), + cy = cos(y), + k = scale(cx * cy); + return [ + k * cy * sin(x), + k * sin(y) + ]; + } + } + + function azimuthalInvert(angle) { + return function (x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin(c), + cc = cos(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } + } + + var azimuthalEqualAreaRaw = azimuthalRaw(function (cxcy) { + return sqrt(2 / (1 + cxcy)); + }); + + azimuthalEqualAreaRaw.invert = azimuthalInvert(function (z) { + return 2 * asin(z / 2); + }); + + function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); + } + + var azimuthalEquidistantRaw = azimuthalRaw(function (c) { + return (c = acos(c)) && c / sin(c); + }); + + azimuthalEquidistantRaw.invert = azimuthalInvert(function (z) { + return z; + }); + + function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); + } + + function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi + phi) / 2))]; + } + + mercatorRaw.invert = function (x, y) { + return [x, 2 * atan(exp(y)) - halfPi]; + }; + + function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau); + } + + function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function (_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function (_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function (_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function (_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); + } + + function tany(y) { + return tan((halfPi + y) / 2); + } + + function conicConformalRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { + if (y < -halfPi + epsilon) y = -halfPi + epsilon; + } else { + if (y > halfPi - epsilon) y = halfPi - epsilon; + } + var r = f / pow(tany(y), n); + return [r * sin(n * x), f - r * cos(n * x)]; + } + + project.invert = function (x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy); + return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi]; + }; + + return project; + } + + function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); + } + + function equirectangularRaw(lambda, phi) { + return [lambda, phi]; + } + + equirectangularRaw.invert = equirectangularRaw; + + function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); + } + + function conicEquidistantRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin(nx), g - gy * cos(nx)]; + } + + project.invert = function (x, y) { + var gy = g - y; + return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; + } + + function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); + } + + var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + + function equalEarthRaw(lambda, phi) { + var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; + } + + equalEarthRaw.invert = function (x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l), + asin(sin(l) / M) + ]; + }; + + function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); + } + + function gnomonicRaw(x, y) { + var cy = cos(y), k = cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; + } + + gnomonicRaw.invert = azimuthalInvert(atan); + + function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); + } + + function scaleTranslate$1(kx, ky, tx, ty) { + return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity : transformer({ + point: function (x, y) { + this.stream.point(x * kx + tx, y * ky + ty); + } + }); + } + + function identity$1() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity, // scale, translate and reflect + x0 = null, y0, x1, y1, // clip extent + postclip = identity, + cache, + cacheStream, + projection; + + function reset() { + cache = cacheStream = null; + return projection; + } + + return projection = { + stream: function (stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }, + postclip: function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }, + clipExtent: function (_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }, + scale: function (_) { + return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k; + }, + translate: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty]; + }, + reflectX: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0; + }, + reflectY: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0; + }, + fitExtent: function (extent, object) { + return fitExtent(projection, extent, object); + }, + fitSize: function (size, object) { + return fitSize(projection, size, object); + }, + fitWidth: function (width, object) { + return fitWidth(projection, width, object); + }, + fitHeight: function (height, object) { + return fitHeight(projection, height, object); + } + }; + } + + function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; + } + + naturalEarth1Raw.invert = function (x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; + }; + + function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); + } + + function orthographicRaw(x, y) { + return [cos(y) * sin(x), sin(y)]; + } + + orthographicRaw.invert = azimuthalInvert(asin); + + function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon); + } + + function stereographicRaw(x, y) { + var cy = cos(y), k = 1 + cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; + } + + stereographicRaw.invert = azimuthalInvert(function (z) { + return 2 * atan(z); + }); + + function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); + } + + function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi + phi) / 2)), -lambda]; + } + + transverseMercatorRaw.invert = function (x, y) { + return [-y, 2 * atan(exp(x)) - halfPi]; + }; + + function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function (_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function (_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); + } + + exports.geoAlbers = albers; + exports.geoAlbersUsa = albersUsa; + exports.geoArea = area; + exports.geoAzimuthalEqualArea = azimuthalEqualArea; + exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; + exports.geoAzimuthalEquidistant = azimuthalEquidistant; + exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; + exports.geoBounds = bounds; + exports.geoCentroid = centroid; + exports.geoCircle = circle; + exports.geoClipAntimeridian = clipAntimeridian; + exports.geoClipCircle = clipCircle; + exports.geoClipExtent = extent; + exports.geoClipRectangle = clipRectangle; + exports.geoConicConformal = conicConformal; + exports.geoConicConformalRaw = conicConformalRaw; + exports.geoConicEqualArea = conicEqualArea; + exports.geoConicEqualAreaRaw = conicEqualAreaRaw; + exports.geoConicEquidistant = conicEquidistant; + exports.geoConicEquidistantRaw = conicEquidistantRaw; + exports.geoContains = contains; + exports.geoDistance = distance; + exports.geoEqualEarth = equalEarth; + exports.geoEqualEarthRaw = equalEarthRaw; + exports.geoEquirectangular = equirectangular; + exports.geoEquirectangularRaw = equirectangularRaw; + exports.geoGnomonic = gnomonic; + exports.geoGnomonicRaw = gnomonicRaw; + exports.geoGraticule = graticule; + exports.geoGraticule10 = graticule10; + exports.geoIdentity = identity$1; + exports.geoInterpolate = interpolate; + exports.geoLength = length; + exports.geoMercator = mercator; + exports.geoMercatorRaw = mercatorRaw; + exports.geoNaturalEarth1 = naturalEarth1; + exports.geoNaturalEarth1Raw = naturalEarth1Raw; + exports.geoOrthographic = orthographic; + exports.geoOrthographicRaw = orthographicRaw; + exports.geoPath = index; + exports.geoProjection = projection; + exports.geoProjectionMutator = projectionMutator; + exports.geoRotation = rotation; + exports.geoStereographic = stereographic; + exports.geoStereographicRaw = stereographicRaw; + exports.geoStream = geoStream; + exports.geoTransform = transform; + exports.geoTransverseMercator = transverseMercator; + exports.geoTransverseMercatorRaw = transverseMercatorRaw; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-array": 8}], + 23: [function (require, module, exports) { +// https://d3js.org/d3-hierarchy/ v1.1.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; + } + + function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; + } + + function meanXReduce(x, c) { + return x + c.x; + } + + function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); + } + + function maxYReduce(y, c) { + return Math.max(y, c.y); + } + + function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; + } + + function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; + } + + function cluster() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function (node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function (node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function (node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function (x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function (x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function (x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; + } + + function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; + } + + function node_count() { + return this.eachAfter(count); + } + + function node_each(callback) { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + callback(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } while (next.length); + return this; + } + + function node_eachBefore(callback) { + var node = this, nodes = [node], children, i; + while (node = nodes.pop()) { + callback(node), children = node.children; + if (children) for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + return this; + } + + function node_eachAfter(callback) { + var node = this, nodes = [node], next = [], children, i, n; + while (node = nodes.pop()) { + next.push(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + while (node = next.pop()) { + callback(node); + } + return this; + } + + function node_sum(value) { + return this.eachAfter(function (node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); + } + + function node_sort(compare) { + return this.eachBefore(function (node) { + if (node.children) { + node.children.sort(compare); + } + }); + } + + function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; + } + + function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; + } + + function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; + } + + function node_descendants() { + var nodes = []; + this.each(function (node) { + nodes.push(node); + }); + return nodes; + } + + function node_leaves() { + var leaves = []; + this.eachBefore(function (node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; + } + + function node_links() { + var root = this, links = []; + root.each(function (node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; + } + + function hierarchy(data, children) { + var root = new Node(data), + valued = +data.value && (root.value = data.value), + node, + nodes = [root], + child, + childs, + i, + n; + + if (children == null) children = defaultChildren; + + while (node = nodes.pop()) { + if (valued) node.value = +node.data.value; + if ((childs = children(node.data)) && (n = childs.length)) { + node.children = new Array(n); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); + } + + function node_copy() { + return hierarchy(this).eachBefore(copyData); + } + + function defaultChildren(d) { + return d.children; + } + + function copyData(node) { + node.data = node.data.data; + } + + function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); + } + + function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; + } + + Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy + }; + + var slice = Array.prototype.slice; + + function shuffle(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; + } + + function enclose(circles) { + var i = 0, n = (circles = shuffle(slice.call(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; + } + + function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; + } + + function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; + } + + function enclosesWeak(a, b) { + var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; + } + + function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; + } + + function encloseBasis(B) { + switch (B.length) { + case 1: + return encloseBasis1(B[0]); + case 2: + return encloseBasis2(B[0], B[1]); + case 3: + return encloseBasis3(B[0], B[1], B[2]); + } + } + + function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; + } + + function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; + } + + function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; + } + + function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } + } + + function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; + } + + function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; + } + + function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; + } + + function packEnclose(circles) { + if (!(n = circles.length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; + while ((c = c.next) !== b) a.push(c._); + c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; + } + + function siblings(circles) { + packEnclose(circles); + return circles; + } + + function optional(f) { + return f == null ? null : required(f); + } + + function required(f) { + if (typeof f !== "function") throw new Error; + return f; + } + + function constantZero() { + return 0; + } + + function constant(x) { + return function () { + return x; + }; + } + + function defaultRadius(d) { + return Math.sqrt(d.value); + } + + function index() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function (x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function (x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding; + }; + + return pack; + } + + function radiusLeaf(radius) { + return function (node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; + } + + function packChildren(padding, k) { + return function (node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; + } + + function translateChild(k) { + return function (node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; + } + + function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); + } + + function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } + } + + function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function (node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function (x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function (x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; + } + + var keyPrefix = "$", // Protect against keys like “__proto__”. + preroot = {depth: -1}, + ambiguous = {}; + + function defaultId(d) { + return d.id; + } + + function defaultParentId(d) { + return d.parentId; + } + + function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var d, + i, + n = data.length, + root, + parent, + node, + nodes = new Array(n), + nodeId, + nodeKey, + nodeByKey = {}; + + for (i = 0; i < n; ++i) { + d = data[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = keyPrefix + (node.id = nodeId); + nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i], nodeId = parentId(data[i], i, data); + if (nodeId == null || !(nodeId += "")) { + if (root) throw new Error("multiple roots"); + root = node; + } else { + parent = nodeByKey[keyPrefix + nodeId]; + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function (node) { + node.depth = node.parent.depth + 1; + --n; + }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function (x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function (x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; + } + + function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; + } + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. + function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; + } + +// This function works analogously to nextLeft. + function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; + } + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. + function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; + } + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). + function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } + } + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. + function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; + } + + function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number + } + + TreeNode.prototype = Object.create(Node.prototype); + + function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; + } + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm + function tree() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function (node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function (node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function (x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function (x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function (x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; + } + + function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } + } + + var phi = (1 + Math.sqrt(5)) / 2; + + function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { + sumValue -= nodeValue; + break; + } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; + } + + var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function (x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; + })(phi); + + function index$1() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function (x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function (x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function (x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function (x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function (x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function (x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function (x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function (x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function (x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft; + }; + + return treemap; + } + + function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = (x0 * valueRight + x1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = (y0 * valueRight + y1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } + } + + function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); + } + + var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); + else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function (x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; + })(phi); + + exports.cluster = cluster; + exports.hierarchy = hierarchy; + exports.pack = index; + exports.packEnclose = enclose; + exports.packSiblings = siblings; + exports.partition = partition; + exports.stratify = stratify; + exports.tree = tree; + exports.treemap = index$1; + exports.treemapBinary = binary; + exports.treemapDice = treemapDice; + exports.treemapResquarify = resquarify; + exports.treemapSlice = treemapSlice; + exports.treemapSliceDice = sliceDice; + exports.treemapSquarify = squarify; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 24: [function (require, module, exports) { +// https://d3js.org/d3-interpolate/ v1.4.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Color) { + 'use strict'; + + function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; + } + + function basis$1(values) { + var n = values.length - 1; + return function (t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; + } + + function basisClosed(values) { + var n = values.length; + return function (t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; + } + + function constant(x) { + return function () { + return x; + }; + } + + function linear(a, d) { + return function (t) { + return a + t * d; + }; + } + + function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) { + return Math.pow(a + t * b, y); + }; + } + + function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); + } + + function gamma(y) { + return (y = +y) === 1 ? nogamma : function (a, b) { + return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); + }; + } + + function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant(isNaN(a) ? b : a); + } + + var rgb = (function rgbGamma(y) { + var color = gamma(y); + + function rgb(start, end) { + var r = color((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb.gamma = rgbGamma; + + return rgb; + })(1); + + function rgbSpline(spline) { + return function (colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = d3Color.rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function (t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; + } + + var rgbBasis = rgbSpline(basis$1); + var rgbBasisClosed = rgbSpline(basisClosed); + + function numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function (t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; + } + + function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); + } + + function array(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); + } + + function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function (t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; + } + + function date(a, b) { + var d = new Date; + return a = +a, b = +b, function (t) { + return d.setTime(a * (1 - t) + b * t), d; + }; + } + + function number(a, b) { + return a = +a, b = +b, function (t) { + return a * (1 - t) + b * t; + }; + } + + function object(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = value(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function (t) { + for (k in i) c[k] = i[k](t); + return c; + }; + } + + var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + + function zero(b) { + return function () { + return b; + }; + } + + function one(b) { + return function (t) { + return b(t) + ""; + }; + } + + function string(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: number(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function (t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); + } + + function value(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant(b) + : (t === "number" ? number + : t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb) : string) + : b instanceof d3Color.color ? rgb + : b instanceof Date ? date + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : number)(a, b); + } + + function discrete(range) { + var n = range.length; + return function (t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + function hue$1(a, b) { + var i = hue(+a, +b); + return function (t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; + } + + function round(a, b) { + return a = +a, b = +b, function (t) { + return Math.round(a * (1 - t) + b * t); + }; + } + + var degrees = 180 / Math.PI; + + var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 + }; + + function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; + } + + var cssNode, + cssRoot, + cssView, + svgNode; + + function parseCss(value) { + if (value === "none") return identity; + if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); + } + + function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); + } + + function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function (a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function (t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; + } + + var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); + var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + + var rho = Math.SQRT2, + rho2 = 2, + rho4 = 4, + epsilon2 = 1e-12; + + function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; + } + + function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; + } + + function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); + } + +// p0 = [ux0, uy0, w0] +// p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function (t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function (t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; + } + + function hsl(hue) { + return function (start, end) { + var h = hue((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hsl$1 = hsl(hue); + var hslLong = hsl(nogamma); + + function lab(start, end) { + var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + function hcl(hue) { + return function (start, end) { + var h = hue((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hcl$1 = hcl(hue); + var hclLong = hcl(nogamma); + + function cubehelix(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix(start, end) { + var h = hue((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix.gamma = cubehelixGamma; + + return cubehelix; + })(1); + } + + var cubehelix$1 = cubehelix(hue); + var cubehelixLong = cubehelix(nogamma); + + function piecewise(interpolate, values) { + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function (t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; + } + + function quantize(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; + } + + exports.interpolate = value; + exports.interpolateArray = array; + exports.interpolateBasis = basis$1; + exports.interpolateBasisClosed = basisClosed; + exports.interpolateCubehelix = cubehelix$1; + exports.interpolateCubehelixLong = cubehelixLong; + exports.interpolateDate = date; + exports.interpolateDiscrete = discrete; + exports.interpolateHcl = hcl$1; + exports.interpolateHclLong = hclLong; + exports.interpolateHsl = hsl$1; + exports.interpolateHslLong = hslLong; + exports.interpolateHue = hue$1; + exports.interpolateLab = lab; + exports.interpolateNumber = number; + exports.interpolateNumberArray = numberArray; + exports.interpolateObject = object; + exports.interpolateRgb = rgb; + exports.interpolateRgbBasis = rgbBasis; + exports.interpolateRgbBasisClosed = rgbBasisClosed; + exports.interpolateRound = round; + exports.interpolateString = string; + exports.interpolateTransformCss = interpolateTransformCss; + exports.interpolateTransformSvg = interpolateTransformSvg; + exports.interpolateZoom = zoom; + exports.piecewise = piecewise; + exports.quantize = quantize; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13}], + 25: [function (require, module, exports) { +// https://d3js.org/d3-path/ v1.0.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var pi = Math.PI, + tau = 2 * pi, + epsilon = 1e-6, + tauEpsilon = tau - epsilon; + + function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + + function path() { + return new Path; + } + + Path.prototype = path.prototype = { + constructor: Path, + moveTo: function (x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function () { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function (x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function (x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function (x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function (x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon)) ; + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function (x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau + tau; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function (x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function () { + return this._; + } + }; + + exports.path = path; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 26: [function (require, module, exports) { +// https://d3js.org/d3-polygon/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function area(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; + } + + function centroid(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; + } + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. + function cross(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + } + + function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. + function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1], + size = 2; + + for (var i = 2; i < n; ++i) { + while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points + } + + function hull(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; + } + + function contains(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; + } + + function length(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.sqrt(xa * xa + ya * ya); + } + + return perimeter; + } + + exports.polygonArea = area; + exports.polygonCentroid = centroid; + exports.polygonContains = contains; + exports.polygonHull = hull; + exports.polygonLength = length; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 27: [function (require, module, exports) { +// https://d3js.org/d3-quadtree/ v1.0.7 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function tree_add(d) { + var x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); + } + + function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; + } + + function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; + } + + function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: + x1 = x0 + z, y1 = y0 + z; + break; + case 1: + x0 = x1 - z, y1 = y0 + z; + break; + case 2: + x1 = x0 + z, y0 = y1 - z; + break; + case 3: + x0 = x1 - z, y0 = y1 - z; + break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; + } + + function tree_data() { + var data = []; + this.visit(function (node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; + } + + function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; + } + + function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; + } + + function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; + } + + function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; + } + + function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; + } + + function tree_root() { + return this._root; + } + + function tree_size() { + var size = 0; + this.visit(function (node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; + } + + function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; + } + + function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; + } + + function defaultX(d) { + return d[0]; + } + + function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; + } + + function defaultY(d) { + return d[1]; + } + + function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; + } + + function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); + } + + function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; + } + + function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; + } + + var treeProto = quadtree.prototype = Quadtree.prototype; + + treeProto.copy = function () { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; + }; + + treeProto.add = tree_add; + treeProto.addAll = addAll; + treeProto.cover = tree_cover; + treeProto.data = tree_data; + treeProto.extent = tree_extent; + treeProto.find = tree_find; + treeProto.remove = tree_remove; + treeProto.removeAll = removeAll; + treeProto.root = tree_root; + treeProto.size = tree_size; + treeProto.visit = tree_visit; + treeProto.visitAfter = tree_visitAfter; + treeProto.x = tree_x; + treeProto.y = tree_y; + + exports.quadtree = quadtree; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 28: [function (require, module, exports) { +// https://d3js.org/d3-random/ v1.1.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function defaultSource() { + return Math.random(); + } + + var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function () { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; + })(defaultSource); + + var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function () { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; + })(defaultSource); + + var logNormal = (function sourceRandomLogNormal(source) { + function randomLogNormal() { + var randomNormal = normal.source(source).apply(this, arguments); + return function () { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; + })(defaultSource); + + var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + return function () { + for (var sum = 0, i = 0; i < n; ++i) sum += source(); + return sum; + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; + })(defaultSource); + + var bates = (function sourceRandomBates(source) { + function randomBates(n) { + var randomIrwinHall = irwinHall.source(source)(n); + return function () { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; + })(defaultSource); + + var exponential = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function () { + return -Math.log(1 - source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; + })(defaultSource); + + exports.randomUniform = uniform; + exports.randomNormal = normal; + exports.randomLogNormal = logNormal; + exports.randomBates = bates; + exports.randomIrwinHall = irwinHall; + exports.randomExponential = exponential; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 29: [function (require, module, exports) { +// https://d3js.org/d3-scale-chromatic/ v1.5.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-interpolate'), require('d3-color')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-interpolate', 'd3-color'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); + }(this, function (exports, d3Interpolate, d3Color) { + 'use strict'; + + function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; + } + + var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + + var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + + var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + + var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + + var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + + var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + + var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + + var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + + var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + + var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + + function ramp(scheme) { + return d3Interpolate.interpolateRgbBasis(scheme[scheme.length - 1]); + } + + var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" + ).map(colors); + + var BrBG = ramp(scheme); + + var scheme$1 = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" + ).map(colors); + + var PRGn = ramp(scheme$1); + + var scheme$2 = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" + ).map(colors); + + var PiYG = ramp(scheme$2); + + var scheme$3 = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" + ).map(colors); + + var PuOr = ramp(scheme$3); + + var scheme$4 = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" + ).map(colors); + + var RdBu = ramp(scheme$4); + + var scheme$5 = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" + ).map(colors); + + var RdGy = ramp(scheme$5); + + var scheme$6 = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" + ).map(colors); + + var RdYlBu = ramp(scheme$6); + + var scheme$7 = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" + ).map(colors); + + var RdYlGn = ramp(scheme$7); + + var scheme$8 = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" + ).map(colors); + + var Spectral = ramp(scheme$8); + + var scheme$9 = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" + ).map(colors); + + var BuGn = ramp(scheme$9); + + var scheme$a = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" + ).map(colors); + + var BuPu = ramp(scheme$a); + + var scheme$b = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" + ).map(colors); + + var GnBu = ramp(scheme$b); + + var scheme$c = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" + ).map(colors); + + var OrRd = ramp(scheme$c); + + var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" + ).map(colors); + + var PuBuGn = ramp(scheme$d); + + var scheme$e = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" + ).map(colors); + + var PuBu = ramp(scheme$e); + + var scheme$f = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" + ).map(colors); + + var PuRd = ramp(scheme$f); + + var scheme$g = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" + ).map(colors); + + var RdPu = ramp(scheme$g); + + var scheme$h = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" + ).map(colors); + + var YlGnBu = ramp(scheme$h); + + var scheme$i = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" + ).map(colors); + + var YlGn = ramp(scheme$i); + + var scheme$j = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" + ).map(colors); + + var YlOrBr = ramp(scheme$j); + + var scheme$k = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" + ).map(colors); + + var YlOrRd = ramp(scheme$k); + + var scheme$l = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" + ).map(colors); + + var Blues = ramp(scheme$l); + + var scheme$m = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" + ).map(colors); + + var Greens = ramp(scheme$m); + + var scheme$n = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" + ).map(colors); + + var Greys = ramp(scheme$n); + + var scheme$o = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" + ).map(colors); + + var Purples = ramp(scheme$o); + + var scheme$p = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" + ).map(colors); + + var Reds = ramp(scheme$p); + + var scheme$q = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" + ).map(colors); + + var Oranges = ramp(scheme$q); + + function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; + } + + var cubehelix = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); + + var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + + var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + + var c = d3Color.cubehelix(); + + function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; + } + + var c$1 = d3Color.rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + + function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; + } + + function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; + } + + function ramp$1(range) { + var n = range.length; + return function (t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + + var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + + var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + + var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + + exports.interpolateBlues = Blues; + exports.interpolateBrBG = BrBG; + exports.interpolateBuGn = BuGn; + exports.interpolateBuPu = BuPu; + exports.interpolateCividis = cividis; + exports.interpolateCool = cool; + exports.interpolateCubehelixDefault = cubehelix; + exports.interpolateGnBu = GnBu; + exports.interpolateGreens = Greens; + exports.interpolateGreys = Greys; + exports.interpolateInferno = inferno; + exports.interpolateMagma = magma; + exports.interpolateOrRd = OrRd; + exports.interpolateOranges = Oranges; + exports.interpolatePRGn = PRGn; + exports.interpolatePiYG = PiYG; + exports.interpolatePlasma = plasma; + exports.interpolatePuBu = PuBu; + exports.interpolatePuBuGn = PuBuGn; + exports.interpolatePuOr = PuOr; + exports.interpolatePuRd = PuRd; + exports.interpolatePurples = Purples; + exports.interpolateRainbow = rainbow; + exports.interpolateRdBu = RdBu; + exports.interpolateRdGy = RdGy; + exports.interpolateRdPu = RdPu; + exports.interpolateRdYlBu = RdYlBu; + exports.interpolateRdYlGn = RdYlGn; + exports.interpolateReds = Reds; + exports.interpolateSinebow = sinebow; + exports.interpolateSpectral = Spectral; + exports.interpolateTurbo = turbo; + exports.interpolateViridis = viridis; + exports.interpolateWarm = warm; + exports.interpolateYlGn = YlGn; + exports.interpolateYlGnBu = YlGnBu; + exports.interpolateYlOrBr = YlOrBr; + exports.interpolateYlOrRd = YlOrRd; + exports.schemeAccent = Accent; + exports.schemeBlues = scheme$l; + exports.schemeBrBG = scheme; + exports.schemeBuGn = scheme$9; + exports.schemeBuPu = scheme$a; + exports.schemeCategory10 = category10; + exports.schemeDark2 = Dark2; + exports.schemeGnBu = scheme$b; + exports.schemeGreens = scheme$m; + exports.schemeGreys = scheme$n; + exports.schemeOrRd = scheme$c; + exports.schemeOranges = scheme$q; + exports.schemePRGn = scheme$1; + exports.schemePaired = Paired; + exports.schemePastel1 = Pastel1; + exports.schemePastel2 = Pastel2; + exports.schemePiYG = scheme$2; + exports.schemePuBu = scheme$e; + exports.schemePuBuGn = scheme$d; + exports.schemePuOr = scheme$3; + exports.schemePuRd = scheme$f; + exports.schemePurples = scheme$o; + exports.schemeRdBu = scheme$4; + exports.schemeRdGy = scheme$5; + exports.schemeRdPu = scheme$g; + exports.schemeRdYlBu = scheme$6; + exports.schemeRdYlGn = scheme$7; + exports.schemeReds = scheme$p; + exports.schemeSet1 = Set1; + exports.schemeSet2 = Set2; + exports.schemeSet3 = Set3; + exports.schemeSpectral = scheme$8; + exports.schemeTableau10 = Tableau10; + exports.schemeYlGn = scheme$i; + exports.schemeYlGnBu = scheme$h; + exports.schemeYlOrBr = scheme$j; + exports.schemeYlOrRd = scheme$k; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13, "d3-interpolate": 24}], + 30: [function (require, module, exports) { +// https://d3js.org/d3-scale/ v2.2.2 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-collection'), require('d3-array'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-collection', 'd3-array', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, (function (exports, d3Collection, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) { + 'use strict'; + + function initRange(domain, range) { + switch (arguments.length) { + case 0: + break; + case 1: + this.range(domain); + break; + default: + this.range(range).domain(domain); + break; + } + return this; + } + + function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: + break; + case 1: + this.interpolator(domain); + break; + default: + this.interpolator(interpolator).domain(domain); + break; + } + return this; + } + + var array = Array.prototype; + + var map = array.map; + var slice = array.slice; + + var implicit = {name: "implicit"}; + + function ordinal() { + var index = d3Collection.map(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = [], index = d3Collection.map(); + var i = -1, n = _.length, d, key; + while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), scale) : range.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range[1] < range[0], + start = range[reverse - 0], + stop = range[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = d3Array.range(n).map(function (i) { + return start + step * i; + }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function (_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function (_) { + return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); + }; + + scale.rangeRound = function (_) { + return range = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function () { + return bandwidth; + }; + + scale.step = function () { + return step; + }; + + scale.round = function (_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function (_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function (_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function (_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function (_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function () { + return band(domain(), range) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); + } + + function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function () { + return pointish(copy()); + }; + + return scale; + } + + function point() { + return pointish(band.apply(null, arguments).paddingInner(1)); + } + + function constant(x) { + return function () { + return x; + }; + } + + function number(x) { + return +x; + } + + var unit = [0, 1]; + + function identity(x) { + return x; + } + + function normalize(a, b) { + return (b -= (a = +a)) + ? function (x) { + return (x - a) / b; + } + : constant(isNaN(b) ? NaN : 0.5); + } + + function clamper(domain) { + var a = domain[0], b = domain[domain.length - 1], t; + if (a > b) t = a, a = b, b = t; + return function (x) { + return Math.max(a, Math.min(b, x)); + }; + } + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. + function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function (x) { + return r0(d0(x)); + }; + } + + function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function (x) { + var i = d3Array.bisect(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; + } + + function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); + } + + function transformer() { + var domain = unit, + range = unit, + interpolate = d3Interpolate.interpolate, + transform, + untransform, + unknown, + clamp = identity, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function (y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y))); + }; + + scale.domain = function (_) { + return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function (_) { + return range = slice.call(_), interpolate = d3Interpolate.interpolateRound, rescale(); + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity; + }; + + scale.interpolate = function (_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t, u) { + transform = t, untransform = u; + return rescale(); + }; + } + + function continuous(transform, untransform) { + return transformer()(transform, untransform); + } + + function tickFormat(start, stop, count, specifier) { + var step = d3Array.tickStep(start, stop, count), + precision; + specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; + return d3Format.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return d3Format.format(specifier); + } + + function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function (count) { + var d = domain(); + return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function (count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function (count) { + if (count == null) count = 10; + + var d = domain(), + i0 = 0, + i1 = d.length - 1, + start = d[i0], + stop = d[i1], + step; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + step = d3Array.tickIncrement(start, stop, count); + + if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + step = d3Array.tickIncrement(start, stop, count); + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + step = d3Array.tickIncrement(start, stop, count); + } + + if (step > 0) { + d[i0] = Math.floor(start / step) * step; + d[i1] = Math.ceil(stop / step) * step; + domain(d); + } else if (step < 0) { + d[i0] = Math.ceil(start * step) / step; + d[i1] = Math.floor(stop * step) / step; + domain(d); + } + + return scale; + }; + + return scale; + } + + function linear() { + var scale = continuous(identity, identity); + + scale.copy = function () { + return copy(scale, linear()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); + } + + function identity$1(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function (_) { + return arguments.length ? (domain = map.call(_, number), scale) : domain.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return identity$1(domain).unknown(unknown); + }; + + domain = arguments.length ? map.call(domain, number) : [0, 1]; + + return linearish(scale); + } + + function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; + } + + function transformLog(x) { + return Math.log(x); + } + + function transformExp(x) { + return Math.exp(x); + } + + function transformLogn(x) { + return -Math.log(-x); + } + + function transformExpn(x) { + return -Math.exp(-x); + } + + function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; + } + + function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function (x) { + return Math.pow(base, x); + }; + } + + function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function (x) { + return Math.log(x) / base; + }); + } + + function reflect(f) { + return function (x) { + return -f(-x); + }; + } + + function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function (_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function (_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function (count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + } else { + z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function (count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = d3Format.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function (d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function () { + return domain(nice(domain(), { + floor: function (x) { + return pows(Math.floor(logs(x))); + }, + ceil: function (x) { + return pows(Math.ceil(logs(x))); + } + })); + }; + + return scale; + } + + function log() { + var scale = loggish(transformer()).domain([1, 10]); + + scale.copy = function () { + return copy(scale, log()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function transformSymlog(c) { + return function (x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; + } + + function transformSymexp(c) { + return function (x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; + } + + function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function (_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); + } + + function symlog() { + var scale = symlogish(transformer()); + + scale.copy = function () { + return copy(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); + } + + function transformPow(exponent) { + return function (x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; + } + + function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); + } + + function transformSquare(x) { + return x < 0 ? -x * x : x * x; + } + + function powish(transform) { + var scale = transform(identity, identity), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity, identity) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function (_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); + } + + function pow() { + var scale = powish(transformer()); + + scale.copy = function () { + return copy(scale, pow()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function sqrt() { + return pow.apply(null, arguments).exponent(0.5); + } + + function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)]; + } + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return rescale(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function () { + return thresholds.slice(); + }; + + scale.copy = function () { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); + } + + function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function (_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function (_) { + return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function () { + return domain.slice(); + }; + + scale.copy = function () { + return quantize() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); + } + + function threshold() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; + } + + scale.domain = function (_) { + return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return threshold() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); + } + + var durationSecond = 1000, + durationMinute = durationSecond * 60, + durationHour = durationMinute * 60, + durationDay = durationHour * 24, + durationWeek = durationDay * 7, + durationMonth = durationDay * 30, + durationYear = durationDay * 365; + + function date(t) { + return new Date(t); + } + + function number$1(t) { + return t instanceof Date ? +t : +new Date(+t); + } + + function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(identity, identity), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [hour, 1, durationHour], + [hour, 3, 3 * durationHour], + [hour, 6, 6 * durationHour], + [hour, 12, 12 * durationHour], + [day, 1, durationDay], + [day, 2, 2 * durationDay], + [week, 1, durationWeek], + [month, 1, durationMonth], + [month, 3, 3 * durationMonth], + [year, 1, durationYear] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = d3Array.bisector(function (i) { + return i[2]; + }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = d3Array.tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(d3Array.tickStep(start, stop, interval), 1); + interval = millisecond; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function (y) { + return new Date(invert(y)); + }; + + scale.domain = function (_) { + return arguments.length ? domain(map.call(_, number$1)) : domain().map(date); + }; + + scale.ticks = function (interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function (count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function (interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function () { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; + } + + function time() { + return initRange.apply(calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); + } + + function utcTime() { + return initRange.apply(calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); + } + + function transformer$1() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function (_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; + } + + function copy$1(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); + } + + function sequential() { + var scale = linearish(transformer$1()(identity)); + + scale.copy = function () { + return copy$1(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialLog() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function () { + return copy$1(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialSymlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function () { + return copy$1(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialPow() { + var scale = powish(transformer$1()); + + scale.copy = function () { + return copy$1(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); + } + + function sequentialQuantile() { + var domain = [], + interpolator = identity; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x) - 1) / (domain.length - 1)); + } + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return scale; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function () { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); + } + + function transformer$2() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function (_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2]; + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1); + return scale; + }; + } + + function diverging() { + var scale = linearish(transformer$2()(identity)); + + scale.copy = function () { + return copy$1(scale, diverging()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingLog() { + var scale = loggish(transformer$2()).domain([0.1, 1, 10]); + + scale.copy = function () { + return copy$1(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingSymlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function () { + return copy$1(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingPow() { + var scale = powish(transformer$2()); + + scale.copy = function () { + return copy$1(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); + } + + exports.scaleBand = band; + exports.scalePoint = point; + exports.scaleIdentity = identity$1; + exports.scaleLinear = linear; + exports.scaleLog = log; + exports.scaleSymlog = symlog; + exports.scaleOrdinal = ordinal; + exports.scaleImplicit = implicit; + exports.scalePow = pow; + exports.scaleSqrt = sqrt; + exports.scaleQuantile = quantile; + exports.scaleQuantize = quantize; + exports.scaleThreshold = threshold; + exports.scaleTime = time; + exports.scaleUtc = utcTime; + exports.scaleSequential = sequential; + exports.scaleSequentialLog = sequentialLog; + exports.scaleSequentialPow = sequentialPow; + exports.scaleSequentialSqrt = sequentialSqrt; + exports.scaleSequentialSymlog = sequentialSymlog; + exports.scaleSequentialQuantile = sequentialQuantile; + exports.scaleDiverging = diverging; + exports.scaleDivergingLog = divergingLog; + exports.scaleDivergingPow = divergingPow; + exports.scaleDivergingSqrt = divergingSqrt; + exports.scaleDivergingSymlog = divergingSymlog; + exports.tickFormat = tickFormat; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, { + "d3-array": 8, + "d3-collection": 12, + "d3-format": 21, + "d3-interpolate": 24, + "d3-time": 34, + "d3-time-format": 33 + }], + 31: [function (require, module, exports) { +// https://d3js.org/d3-selection/ v1.4.1 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var xhtml = "http://www.w3.org/1999/xhtml"; + + var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + + function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + } + + function creatorInherit(name) { + return function () { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function () { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; + } + + function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); + } + + function none() { + } + + function selector(selector) { + return selector == null ? none : function () { + return this.querySelector(selector); + }; + } + + function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); + } + + function empty() { + return []; + } + + function selectorAll(selector) { + return selector == null ? empty : function () { + return this.querySelectorAll(selector); + }; + } + + function selection_selectAll(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); + } + + function matcher(selector) { + return function () { + return this.matches(selector); + }; + } + + function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); + } + + function sparse(update) { + return new Array(update.length); + } + + function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); + } + + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; + } + + EnterNode.prototype = { + constructor: EnterNode, + appendChild: function (child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function (child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function (selector) { + return this._parent.querySelector(selector); + }, + querySelectorAll: function (selector) { + return this._parent.querySelectorAll(selector); + } + }; + + function constant(x) { + return function () { + return x; + }; + } + + var keyPrefix = "$"; // Protect against keys like “__proto__”. + + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } + } + + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } + } + + function selection_data(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function (d) { + data[++j] = d; + }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength) ; + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; + } + + function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); + } + + function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; + } + + function selection_merge(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); + } + + function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; + } + + function selection_sort(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); + } + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; + } + + function selection_nodes() { + var nodes = new Array(this.size()), i = -1; + this.each(function () { + nodes[++i] = this; + }); + return nodes; + } + + function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; + } + + function selection_size() { + var size = 0; + this.each(function () { + ++size; + }); + return size; + } + + function selection_empty() { + return !this.node(); + } + + function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; + } + + function attrRemove(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, value) { + return function () { + this.setAttribute(name, value); + }; + } + + function attrConstantNS(fullname, value) { + return function () { + this.setAttributeNS(fullname.space, fullname.local, value); + }; + } + + function attrFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; + } + + function attrFunctionNS(fullname, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; + } + + function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); + } + + function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document + } + + function styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, value, priority) { + return function () { + this.style.setProperty(name, value, priority); + }; + } + + function styleFunction(name, value, priority) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; + } + + function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); + } + + function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); + } + + function propertyRemove(name) { + return function () { + delete this[name]; + }; + } + + function propertyConstant(name, value) { + return function () { + this[name] = value; + }; + } + + function propertyFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; + } + + function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; + } + + function classArray(string) { + return string.trim().split(/^|\s+/); + } + + function classList(node) { + return node.classList || new ClassList(node); + } + + function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); + } + + ClassList.prototype = { + add: function (name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function (name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function (name) { + return this._names.indexOf(name) >= 0; + } + }; + + function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); + } + + function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); + } + + function classedTrue(names) { + return function () { + classedAdd(this, names); + }; + } + + function classedFalse(names) { + return function () { + classedRemove(this, names); + }; + } + + function classedFunction(names, value) { + return function () { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; + } + + function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); + } + + function textRemove() { + this.textContent = ""; + } + + function textConstant(value) { + return function () { + this.textContent = value; + }; + } + + function textFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; + } + + function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; + } + + function htmlRemove() { + this.innerHTML = ""; + } + + function htmlConstant(value) { + return function () { + this.innerHTML = value; + }; + } + + function htmlFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; + } + + function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; + } + + function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); + } + + function selection_raise() { + return this.each(raise); + } + + function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); + } + + function selection_lower() { + return this.each(lower); + } + + function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function () { + return this.appendChild(create.apply(this, arguments)); + }); + } + + function constantNull() { + return null; + } + + function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function () { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); + } + + function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + + function selection_remove() { + return this.each(remove); + } + + function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); + } + + function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; + } + + var filterEvents = {}; + + exports.event = null; + + if (typeof document !== "undefined") { + var element = document.documentElement; + if (!("onmouseenter" in element)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } + } + + function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function (event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; + } + + function contextListener(listener, index, group) { + return function (event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; + } + + function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); + } + + function onRemove(typename) { + return function () { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; + } + + function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function (d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; + } + + function selection_on(typename, value, capture) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; + } + + function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } + } + + function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); + } + + function dispatchConstant(type, params) { + return function () { + return dispatchEvent(this, type, params); + }; + } + + function dispatchFunction(type, params) { + return function () { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; + } + + function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); + } + + var root = [null]; + + function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; + } + + function selection() { + return new Selection([[document.documentElement]], root); + } + + Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch + }; + + function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); + } + + function create(name) { + return select(creator(name).call(document.documentElement)); + } + + var nextId = 0; + + function local() { + return new Local; + } + + function Local() { + this._ = "@" + (++nextId).toString(36); + } + + Local.prototype = local.prototype = { + constructor: Local, + get: function (node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function (node, value) { + return node[this._] = value; + }, + remove: function (node) { + return this._ in node && delete node[this._]; + }, + toString: function () { + return this._; + } + }; + + function sourceEvent() { + var current = exports.event, source; + while (source = current.sourceEvent) current = source; + return current; + } + + function point(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + + function mouse(node) { + var event = sourceEvent(); + if (event.changedTouches) event = event.changedTouches[0]; + return point(node, event); + } + + function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); + } + + function touch(node, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point(node, touch); + } + } + + return null; + } + + function touches(node, touches) { + if (touches == null) touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point(node, touches[i]); + } + + return points; + } + + exports.clientPoint = point; + exports.create = create; + exports.creator = creator; + exports.customEvent = customEvent; + exports.local = local; + exports.matcher = matcher; + exports.mouse = mouse; + exports.namespace = namespace; + exports.namespaces = namespaces; + exports.select = select; + exports.selectAll = selectAll; + exports.selection = selection; + exports.selector = selector; + exports.selectorAll = selectorAll; + exports.style = styleValue; + exports.touch = touch; + exports.touches = touches; + exports.window = defaultView; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 32: [function (require, module, exports) { +// https://d3js.org/d3-shape/ v1.3.7 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-path')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Path) { + 'use strict'; + + function constant(x) { + return function constant() { + return x; + }; + } + + var abs = Math.abs; + var atan2 = Math.atan2; + var cos = Math.cos; + var max = Math.max; + var min = Math.min; + var sin = Math.sin; + var sqrt = Math.sqrt; + + var epsilon = 1e-12; + var pi = Math.PI; + var halfPi = pi / 2; + var tau = 2 * pi; + + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); + } + + function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); + } + + function arcInnerRadius(d) { + return d.innerRadius; + } + + function arcOuterRadius(d) { + return d.outerRadius; + } + + function arcStartAngle(d) { + return d.startAngle; + } + + function arcEndAngle(d) { + return d.endAngle; + } + + function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! + } + + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; + } + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html + function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; + } + + function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi, + a1 = endAngle.apply(this, arguments) - halfPi, + da = abs(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = d3Path.path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); + + // Apply rounded corners? + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function () { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; + }; + + arc.innerRadius = function (_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; + }; + + arc.outerRadius = function (_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function (_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; + }; + + arc.padRadius = function (_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; + }; + + arc.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; + }; + + arc.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; + }; + + arc.padAngle = function (_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; + }; + + arc.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; + } + + function Linear(context) { + this._context = context; + } + + Linear.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; // proceed + default: + this._context.lineTo(x, y); + break; + } + } + }; + + function curveLinear(context) { + return new Linear(context); + } + + function x(p) { + return p[0]; + } + + function y(p) { + return p[1]; + } + + function line() { + var x$1 = x, + y$1 = y, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + function line(data) { + var i, + n = data.length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = d3Path.path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function (_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), line) : x$1; + }; + + line.y = function (_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), line) : y$1; + }; + + line.defined = function (_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), line) : defined; + }; + + line.curve = function (_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function (_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; + } + + function area() { + var x0 = x, + x1 = null, + y0 = constant(0), + y1 = y, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + function area(data) { + var i, + j, + k, + n = data.length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = d3Path.path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function (_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), x1 = null, area) : x0; + }; + + area.x0 = function (_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), area) : x0; + }; + + area.x1 = function (_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : x1; + }; + + area.y = function (_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), y1 = null, area) : y0; + }; + + area.y0 = function (_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), area) : y0; + }; + + area.y1 = function (_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function () { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function () { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function () { + return arealine().x(x1).y(y0); + }; + + area.defined = function (_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), area) : defined; + }; + + area.curve = function (_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function (_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; + } + + function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } + + function identity(d) { + return d; + } + + function pie() { + var value = identity, + sortValues = descending, + sort = null, + startAngle = constant(0), + endAngle = constant(tau), + padAngle = constant(0); + + function pie(data) { + var i, + n = data.length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function (i, j) { + return sortValues(arcs[i], arcs[j]); + }); + else if (sort != null) index.sort(function (i, j) { + return sort(data[i], data[j]); + }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), pie) : value; + }; + + pie.sortValues = function (_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function (_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), pie) : startAngle; + }; + + pie.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), pie) : endAngle; + }; + + pie.padAngle = function (_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), pie) : padAngle; + }; + + return pie; + } + + var curveRadialLinear = curveRadial(curveLinear); + + function Radial(curve) { + this._curve = curve; + } + + Radial.prototype = { + areaStart: function () { + this._curve.areaStart(); + }, + areaEnd: function () { + this._curve.areaEnd(); + }, + lineStart: function () { + this._curve.lineStart(); + }, + lineEnd: function () { + this._curve.lineEnd(); + }, + point: function (a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } + }; + + function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; + } + + function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function (_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; + } + + function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); + } + + function areaRadial() { + var a = area().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function () { + return lineRadial(x0()); + }, delete a.lineX0; + a.lineEndAngle = function () { + return lineRadial(x1()); + }, delete a.lineX1; + a.lineInnerRadius = function () { + return lineRadial(y0()); + }, delete a.lineY0; + a.lineOuterRadius = function () { + return lineRadial(y1()); + }, delete a.lineY1; + + a.curve = function (_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; + } + + function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; + } + + var slice = Array.prototype.slice; + + function linkSource(d) { + return d.source; + } + + function linkTarget(d) { + return d.target; + } + + function link(curve) { + var source = linkSource, + target = linkTarget, + x$1 = x, + y$1 = y, + context = null; + + function link() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), + t = target.apply(this, argv); + if (!context) context = buffer = d3Path.path(); + curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function (_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function (_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function (_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), link) : x$1; + }; + + link.y = function (_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), link) : y$1; + }; + + link.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; + } + + function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); + } + + function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); + } + + function curveRadial$1(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); + } + + function linkHorizontal() { + return link(curveHorizontal); + } + + function linkVertical() { + return link(curveVertical); + } + + function linkRadial() { + var l = link(curveRadial$1); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; + } + + var circle = { + draw: function (context, size) { + var r = Math.sqrt(size / pi); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau); + } + }; + + var cross = { + draw: function (context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } + }; + + var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + + var diamond = { + draw: function (context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } + }; + + var ka = 0.89081309152928522810, + kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), + kx = Math.sin(tau / 10) * kr, + ky = -Math.cos(tau / 10) * kr; + + var star = { + draw: function (context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } + }; + + var square = { + draw: function (context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } + }; + + var sqrt3 = Math.sqrt(3); + + var triangle = { + draw: function (context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } + }; + + var c = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + + var wye = { + draw: function (context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); + } + }; + + var symbols = [ + circle, + cross, + diamond, + square, + star, + triangle, + wye + ]; + + function symbol() { + var type = constant(circle), + size = constant(64), + context = null; + + function symbol() { + var buffer; + if (!context) context = buffer = d3Path.path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function (_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant(_), symbol) : type; + }; + + symbol.size = function (_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant(+_), symbol) : size; + }; + + symbol.context = function (_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; + } + + function noop() { + } + + function point(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); + } + + function Basis(context) { + this._context = context; + } + + Basis.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 3: + point(this, this._x1, this._y1); // proceed + case 2: + this._context.lineTo(this._x1, this._y1); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basis(context) { + return new Basis(context); + } + + function BasisClosed(context) { + this._context = context; + } + + BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._x2 = x, this._y2 = y; + break; + case 1: + this._point = 2; + this._x3 = x, this._y3 = y; + break; + case 2: + this._point = 3; + this._x4 = x, this._y4 = y; + this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); + break; + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basisClosed(context) { + return new BasisClosed(context); + } + + function BasisOpen(context) { + this._context = context; + } + + BasisOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; + this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); + break; + case 3: + this._point = 4; // proceed + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basisOpen(context) { + return new BasisOpen(context); + } + + function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; + } + + Bundle.prototype = { + lineStart: function () { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function () { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function (x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + + var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function (beta) { + return custom(+beta); + }; + + return bundle; + })(0.85); + + function point$1(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); + } + + function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + Cardinal.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x2, this._y2); + break; + case 3: + point$1(this, this._x1, this._y1); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + this._x1 = x, this._y1 = y; + break; + case 2: + this._point = 3; // proceed + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._x3 = x, this._y3 = y; + break; + case 1: + this._point = 2; + this._context.moveTo(this._x4 = x, this._y4 = y); + break; + case 2: + this._point = 3; + this._x5 = x, this._y5 = y; + break; + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); + break; + case 3: + this._point = 4; // proceed + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function point$2(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); + } + + function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRom.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x2, this._y2); + break; + case 3: + this.point(this._x2, this._y2); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; // proceed + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + this._x3 = x, this._y3 = y; + break; + case 1: + this._point = 2; + this._context.moveTo(this._x4 = x, this._y4 = y); + break; + case 2: + this._point = 3; + this._x5 = x, this._y5 = y; + break; + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); + break; + case 3: + this._point = 4; // proceed + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function LinearClosed(context) { + this._context = context; + } + + LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._point) this._context.closePath(); + }, + point: function (x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } + }; + + function linearClosed(context) { + return new LinearClosed(context); + } + + function sign(x) { + return x < 0 ? -1 : 1; + } + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. + function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; + } + +// Calculate a one-sided slope. + function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; + } + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". + function point$3(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); + } + + function MonotoneX(context) { + this._context = context; + } + + MonotoneX.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x1, this._y1); + break; + case 3: + point$3(this, this._t0, slope2(this, this._t0)); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); + break; + default: + point$3(this, this._t0, t1 = slope3(this, x, y)); + break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } + }; + + function MonotoneY(context) { + this._context = new ReflectContext(context); + } + + (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function (x, y) { + MonotoneX.prototype.point.call(this, y, x); + }; + + function ReflectContext(context) { + this._context = context; + } + + ReflectContext.prototype = { + moveTo: function (x, y) { + this._context.moveTo(y, x); + }, + closePath: function () { + this._context.closePath(); + }, + lineTo: function (x, y) { + this._context.lineTo(y, x); + }, + bezierCurveTo: function (x1, y1, x2, y2, x, y) { + this._context.bezierCurveTo(y1, x1, y2, x2, y, x); + } + }; + + function monotoneX(context) { + return new MonotoneX(context); + } + + function monotoneY(context) { + return new MonotoneY(context); + } + + function Natural(context) { + this._context = context; + } + + Natural.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x = []; + this._y = []; + }, + lineEnd: function () { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function (x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. + function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; + } + + function natural(context) { + return new Natural(context); + } + + function Step(context, t) { + this._context = context; + this._t = t; + } + + Step.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function () { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } + }; + + function step(context) { + return new Step(context, 0.5); + } + + function stepBefore(context) { + return new Step(context, 0); + } + + function stepAfter(context) { + return new Step(context, 1); + } + + function none(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } + } + + function none$1(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; + } + + function stackValue(d, key) { + return d[key]; + } + + function stack() { + var keys = constant([]), + order = none$1, + offset = none, + value = stackValue; + + function stack(data) { + var kz = keys.apply(this, arguments), + i, + m = data.length, + n = kz.length, + sz = new Array(n), + oz; + + for (i = 0; i < n; ++i) { + for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { + si[j] = sij = [0, +value(data[j], ki, j, data)]; + sij.data = data[j]; + } + si.key = ki; + } + + for (i = 0, oz = order(sz); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function (_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant(slice.call(_)), stack) : keys; + }; + + stack.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), stack) : value; + }; + + stack.order = function (_) { + return arguments.length ? (order = _ == null ? none$1 : typeof _ === "function" ? _ : constant(slice.call(_)), stack) : order; + }; + + stack.offset = function (_) { + return arguments.length ? (offset = _ == null ? none : _, stack) : offset; + }; + + return stack; + } + + function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none(series, order); + } + + function diverging(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } + } + + function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none(series, order); + } + + function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none(series, order); + } + + function appearance(series) { + var peaks = series.map(peak); + return none$1(series).sort(function (a, b) { + return peaks[a] - peaks[b]; + }); + } + + function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; + } + + function ascending(series) { + var sums = series.map(sum); + return none$1(series).sort(function (a, b) { + return sums[a] - sums[b]; + }); + } + + function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; + } + + function descending$1(series) { + return ascending(series).reverse(); + } + + function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); + } + + function reverse(series) { + return none$1(series).reverse(); + } + + exports.arc = arc; + exports.area = area; + exports.areaRadial = areaRadial; + exports.curveBasis = basis; + exports.curveBasisClosed = basisClosed; + exports.curveBasisOpen = basisOpen; + exports.curveBundle = bundle; + exports.curveCardinal = cardinal; + exports.curveCardinalClosed = cardinalClosed; + exports.curveCardinalOpen = cardinalOpen; + exports.curveCatmullRom = catmullRom; + exports.curveCatmullRomClosed = catmullRomClosed; + exports.curveCatmullRomOpen = catmullRomOpen; + exports.curveLinear = curveLinear; + exports.curveLinearClosed = linearClosed; + exports.curveMonotoneX = monotoneX; + exports.curveMonotoneY = monotoneY; + exports.curveNatural = natural; + exports.curveStep = step; + exports.curveStepAfter = stepAfter; + exports.curveStepBefore = stepBefore; + exports.line = line; + exports.lineRadial = lineRadial$1; + exports.linkHorizontal = linkHorizontal; + exports.linkRadial = linkRadial; + exports.linkVertical = linkVertical; + exports.pie = pie; + exports.pointRadial = pointRadial; + exports.radialArea = areaRadial; + exports.radialLine = lineRadial$1; + exports.stack = stack; + exports.stackOffsetDiverging = diverging; + exports.stackOffsetExpand = expand; + exports.stackOffsetNone = none; + exports.stackOffsetSilhouette = silhouette; + exports.stackOffsetWiggle = wiggle; + exports.stackOrderAppearance = appearance; + exports.stackOrderAscending = ascending; + exports.stackOrderDescending = descending$1; + exports.stackOrderInsideOut = insideOut; + exports.stackOrderNone = none$1; + exports.stackOrderReverse = reverse; + exports.symbol = symbol; + exports.symbolCircle = circle; + exports.symbolCross = cross; + exports.symbolDiamond = diamond; + exports.symbolSquare = square; + exports.symbolStar = star; + exports.symbolTriangle = triangle; + exports.symbolWye = wye; + exports.symbols = symbols; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-path": 25}], + 33: [function (require, module, exports) { +// https://d3js.org/d3-time-format/ v2.2.3 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Time) { + 'use strict'; + + function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); + } + + function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); + } + + function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; + } + + function formatLocale(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function (date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, Z) { + return function (string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); + week = day > 4 || day === 0 ? d3Time.utcMonday.ceil(week) : d3Time.utcMonday(week); + week = d3Time.utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); + week = day > 4 || day === 0 ? d3Time.timeMonday.ceil(week) : d3Time.timeMonday(week); + week = d3Time.timeDay.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return localDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function (specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function () { + return specifier; + }; + return f; + }, + parse: function (specifier) { + var p = newParse(specifier += "", false); + p.toString = function () { + return specifier; + }; + return p; + }, + utcFormat: function (specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function () { + return specifier; + }; + return f; + }, + utcParse: function (specifier) { + var p = newParse(specifier += "", true); + p.toString = function () { + return specifier; + }; + return p; + } + }; + } + + var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + + function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + + function requote(s) { + return s.replace(requoteRe, "\\$&"); + } + + function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); + } + + function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) map[names[i].toLowerCase()] = i; + return map; + } + + function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; + } + + function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; + } + + function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; + } + + function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; + } + + function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; + } + + function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; + } + + function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; + } + + function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; + } + + function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; + } + + function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; + } + + function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; + } + + function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; + } + + function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; + } + + function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; + } + + function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; + } + + function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; + } + + function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; + } + + function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); + } + + function formatHour24(d, p) { + return pad(d.getHours(), p, 2); + } + + function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); + } + + function formatDayOfYear(d, p) { + return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); + } + + function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); + } + + function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; + } + + function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); + } + + function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); + } + + function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); + } + + function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; + } + + function formatWeekNumberSunday(d, p) { + return pad(d3Time.timeSunday.count(d3Time.timeYear(d) - 1, d), p, 2); + } + + function formatWeekNumberISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); + return pad(d3Time.timeThursday.count(d3Time.timeYear(d), d) + (d3Time.timeYear(d).getDay() === 4), p, 2); + } + + function formatWeekdayNumberSunday(d) { + return d.getDay(); + } + + function formatWeekNumberMonday(d, p) { + return pad(d3Time.timeMonday.count(d3Time.timeYear(d) - 1, d), p, 2); + } + + function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); + } + + function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); + } + + function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); + } + + function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); + } + + function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); + } + + function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); + } + + function formatUTCDayOfYear(d, p) { + return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); + } + + function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); + } + + function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; + } + + function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); + } + + function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); + } + + function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); + } + + function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; + } + + function formatUTCWeekNumberSunday(d, p) { + return pad(d3Time.utcSunday.count(d3Time.utcYear(d) - 1, d), p, 2); + } + + function formatUTCWeekNumberISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); + return pad(d3Time.utcThursday.count(d3Time.utcYear(d), d) + (d3Time.utcYear(d).getUTCDay() === 4), p, 2); + } + + function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); + } + + function formatUTCWeekNumberMonday(d, p) { + return pad(d3Time.utcMonday.count(d3Time.utcYear(d) - 1, d), p, 2); + } + + function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); + } + + function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); + } + + function formatUTCZone() { + return "+0000"; + } + + function formatLiteralPercent() { + return "%"; + } + + function formatUnixTimestamp(d) { + return +d; + } + + function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); + } + + var locale; + + defaultLocale({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + }); + + function defaultLocale(definition) { + locale = formatLocale(definition); + exports.timeFormat = locale.format; + exports.timeParse = locale.parse; + exports.utcFormat = locale.utcFormat; + exports.utcParse = locale.utcParse; + return locale; + } + + var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + + function formatIsoNative(date) { + return date.toISOString(); + } + + var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + + function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + } + + var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + + exports.isoFormat = formatIso; + exports.isoParse = parseIso; + exports.timeFormatDefaultLocale = defaultLocale; + exports.timeFormatLocale = formatLocale; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-time": 34}], + 34: [function (require, module, exports) { +// https://d3js.org/d3-time/ v1.1.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var t0 = new Date, + t1 = new Date; + + function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function (date) { + return floori(date = new Date(+date)), date; + }; + + interval.ceil = function (date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function (date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function (date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function (start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function (test) { + return newInterval(function (date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function (date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) { + } // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) { + } // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function (start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + interval.every = function (step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function (d) { + return field(d) % step === 0; + } + : function (d) { + return interval.count(0, d) % step === 0; + }); + }; + } + + return interval; + } + + var millisecond = newInterval(function () { + // noop + }, function (date, step) { + date.setTime(+date + step); + }, function (start, end) { + return end - start; + }); + +// An optimized implementation for this simple case. + millisecond.every = function (k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function (date) { + date.setTime(Math.floor(date / k) * k); + }, function (date, step) { + date.setTime(+date + step * k); + }, function (start, end) { + return (end - start) / k; + }); + }; + var milliseconds = millisecond.range; + + var durationSecond = 1e3; + var durationMinute = 6e4; + var durationHour = 36e5; + var durationDay = 864e5; + var durationWeek = 6048e5; + + var second = newInterval(function (date) { + date.setTime(date - date.getMilliseconds()); + }, function (date, step) { + date.setTime(+date + step * durationSecond); + }, function (start, end) { + return (end - start) / durationSecond; + }, function (date) { + return date.getUTCSeconds(); + }); + var seconds = second.range; + + var minute = newInterval(function (date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); + }, function (date, step) { + date.setTime(+date + step * durationMinute); + }, function (start, end) { + return (end - start) / durationMinute; + }, function (date) { + return date.getMinutes(); + }); + var minutes = minute.range; + + var hour = newInterval(function (date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); + }, function (date, step) { + date.setTime(+date + step * durationHour); + }, function (start, end) { + return (end - start) / durationHour; + }, function (date) { + return date.getHours(); + }); + var hours = hour.range; + + var day = newInterval(function (date) { + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setDate(date.getDate() + step); + }, function (start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; + }, function (date) { + return date.getDate() - 1; + }); + var days = day.range; + + function weekday(i) { + return newInterval(function (date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setDate(date.getDate() + step * 7); + }, function (start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); + } + + var sunday = weekday(0); + var monday = weekday(1); + var tuesday = weekday(2); + var wednesday = weekday(3); + var thursday = weekday(4); + var friday = weekday(5); + var saturday = weekday(6); + + var sundays = sunday.range; + var mondays = monday.range; + var tuesdays = tuesday.range; + var wednesdays = wednesday.range; + var thursdays = thursday.range; + var fridays = friday.range; + var saturdays = saturday.range; + + var month = newInterval(function (date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setMonth(date.getMonth() + step); + }, function (start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; + }, function (date) { + return date.getMonth(); + }); + var months = month.range; + + var year = newInterval(function (date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setFullYear(date.getFullYear() + step); + }, function (start, end) { + return end.getFullYear() - start.getFullYear(); + }, function (date) { + return date.getFullYear(); + }); + +// An optimized implementation for this simple case. + year.every = function (k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function (date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); + }; + var years = year.range; + + var utcMinute = newInterval(function (date) { + date.setUTCSeconds(0, 0); + }, function (date, step) { + date.setTime(+date + step * durationMinute); + }, function (start, end) { + return (end - start) / durationMinute; + }, function (date) { + return date.getUTCMinutes(); + }); + var utcMinutes = utcMinute.range; + + var utcHour = newInterval(function (date) { + date.setUTCMinutes(0, 0, 0); + }, function (date, step) { + date.setTime(+date + step * durationHour); + }, function (start, end) { + return (end - start) / durationHour; + }, function (date) { + return date.getUTCHours(); + }); + var utcHours = utcHour.range; + + var utcDay = newInterval(function (date) { + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCDate(date.getUTCDate() + step); + }, function (start, end) { + return (end - start) / durationDay; + }, function (date) { + return date.getUTCDate() - 1; + }); + var utcDays = utcDay.range; + + function utcWeekday(i) { + return newInterval(function (date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function (start, end) { + return (end - start) / durationWeek; + }); + } + + var utcSunday = utcWeekday(0); + var utcMonday = utcWeekday(1); + var utcTuesday = utcWeekday(2); + var utcWednesday = utcWeekday(3); + var utcThursday = utcWeekday(4); + var utcFriday = utcWeekday(5); + var utcSaturday = utcWeekday(6); + + var utcSundays = utcSunday.range; + var utcMondays = utcMonday.range; + var utcTuesdays = utcTuesday.range; + var utcWednesdays = utcWednesday.range; + var utcThursdays = utcThursday.range; + var utcFridays = utcFriday.range; + var utcSaturdays = utcSaturday.range; + + var utcMonth = newInterval(function (date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCMonth(date.getUTCMonth() + step); + }, function (start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; + }, function (date) { + return date.getUTCMonth(); + }); + var utcMonths = utcMonth.range; + + var utcYear = newInterval(function (date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); + }, function (start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); + }, function (date) { + return date.getUTCFullYear(); + }); + +// An optimized implementation for this simple case. + utcYear.every = function (k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function (date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); + }; + var utcYears = utcYear.range; + + exports.timeDay = day; + exports.timeDays = days; + exports.timeFriday = friday; + exports.timeFridays = fridays; + exports.timeHour = hour; + exports.timeHours = hours; + exports.timeInterval = newInterval; + exports.timeMillisecond = millisecond; + exports.timeMilliseconds = milliseconds; + exports.timeMinute = minute; + exports.timeMinutes = minutes; + exports.timeMonday = monday; + exports.timeMondays = mondays; + exports.timeMonth = month; + exports.timeMonths = months; + exports.timeSaturday = saturday; + exports.timeSaturdays = saturdays; + exports.timeSecond = second; + exports.timeSeconds = seconds; + exports.timeSunday = sunday; + exports.timeSundays = sundays; + exports.timeThursday = thursday; + exports.timeThursdays = thursdays; + exports.timeTuesday = tuesday; + exports.timeTuesdays = tuesdays; + exports.timeWednesday = wednesday; + exports.timeWednesdays = wednesdays; + exports.timeWeek = sunday; + exports.timeWeeks = sundays; + exports.timeYear = year; + exports.timeYears = years; + exports.utcDay = utcDay; + exports.utcDays = utcDays; + exports.utcFriday = utcFriday; + exports.utcFridays = utcFridays; + exports.utcHour = utcHour; + exports.utcHours = utcHours; + exports.utcMillisecond = millisecond; + exports.utcMilliseconds = milliseconds; + exports.utcMinute = utcMinute; + exports.utcMinutes = utcMinutes; + exports.utcMonday = utcMonday; + exports.utcMondays = utcMondays; + exports.utcMonth = utcMonth; + exports.utcMonths = utcMonths; + exports.utcSaturday = utcSaturday; + exports.utcSaturdays = utcSaturdays; + exports.utcSecond = second; + exports.utcSeconds = seconds; + exports.utcSunday = utcSunday; + exports.utcSundays = utcSundays; + exports.utcThursday = utcThursday; + exports.utcThursdays = utcThursdays; + exports.utcTuesday = utcTuesday; + exports.utcTuesdays = utcTuesdays; + exports.utcWednesday = utcWednesday; + exports.utcWednesdays = utcWednesdays; + exports.utcWeek = utcSunday; + exports.utcWeeks = utcSundays; + exports.utcYear = utcYear; + exports.utcYears = utcYears; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 35: [function (require, module, exports) { +// https://d3js.org/d3-timer/ v1.0.10 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) { + setTimeout(f, 17); + }; + + function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); + } + + function clearNow() { + clockNow = 0; + } + + function Timer() { + this._call = + this._time = + this._next = null; + } + + Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function (callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function () { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } + }; + + function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; + } + + function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; + } + + function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } + } + + function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; + } + + function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); + } + + function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } + } + + function timeout$1(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(function (elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; + } + + function interval$1(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + delay = +delay, time = time == null ? now() : +time; + t.restart(function tick(elapsed) { + elapsed += total; + t.restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + return t; + } + + exports.interval = interval$1; + exports.now = now; + exports.timeout = timeout$1; + exports.timer = timer; + exports.timerFlush = timerFlush; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 36: [function (require, module, exports) { +// https://d3js.org/d3-transition/ v1.3.2 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-timer'), require('d3-interpolate'), require('d3-color'), require('d3-ease')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) { + 'use strict'; + + var emptyOn = d3Dispatch.dispatch("start", "end", "cancel", "interrupt"); + var emptyTween = []; + + var CREATED = 0; + var SCHEDULED = 1; + var STARTING = 2; + var STARTED = 3; + var RUNNING = 4; + var ENDING = 5; + var ENDED = 6; + + function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); + } + + function init(node, id) { + var schedule = get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; + } + + function set(node, id) { + var schedule = get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; + } + + function get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; + } + + function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = d3Timer.timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return d3Timer.timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + d3Timer.timeout(function () { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } + } + + function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; + } + + function selection_interrupt(name) { + return this.each(function () { + interrupt(this, name); + }); + } + + function tweenRemove(id, name) { + var tween0, tween1; + return function () { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; + } + + function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function () { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; + } + + function transition_tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); + } + + function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function () { + var schedule = set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function (node) { + return get(node, id).value[name]; + }; + } + + function interpolate(a, b) { + var c; + return (typeof b === "number" ? d3Interpolate.interpolateNumber + : b instanceof d3Color.color ? d3Interpolate.interpolateRgb + : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) + : d3Interpolate.interpolateString)(a, b); + } + + function attrRemove(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function transition_attr(name, value) { + var fullname = d3Selection.namespace(name), + i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); + } + + function attrInterpolate(name, i) { + return function (t) { + this.setAttribute(name, i.call(this, t)); + }; + } + + function attrInterpolateNS(fullname, i) { + return function (t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; + } + + function attrTweenNS(fullname, value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + + tween._value = value; + return tween; + } + + function attrTween(name, value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + + tween._value = value; + return tween; + } + + function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = d3Selection.namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); + } + + function delayFunction(id, value) { + return function () { + init(this, id).delay = +value.apply(this, arguments); + }; + } + + function delayConstant(id, value) { + return value = +value, function () { + init(this, id).delay = value; + }; + } + + function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get(this.node(), id).delay; + } + + function durationFunction(id, value) { + return function () { + set(this, id).duration = +value.apply(this, arguments); + }; + } + + function durationConstant(id, value) { + return value = +value, function () { + set(this, id).duration = value; + }; + } + + function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get(this.node(), id).duration; + } + + function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function () { + set(this, id).ease = value; + }; + } + + function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get(this.node(), id).ease; + } + + function transition_filter(match) { + if (typeof match !== "function") match = d3Selection.matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); + } + + function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); + } + + function start(name) { + return (name + "").trim().split(/^|\s+/).every(function (t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); + } + + function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set; + return function () { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; + } + + function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); + } + + function removeFunction(id) { + return function () { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; + } + + function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); + } + + function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); + } + + function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); + } + + var Selection = d3Selection.selection.prototype.constructor; + + function transition_selection() { + return new Selection(this._groups, this._parents); + } + + function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function () { + var string0 = d3Selection.style(this, name), + string1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; + } + + function styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = d3Selection.style(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0 = d3Selection.style(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function () { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; + } + + function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant(name, i, value), priority) + .on("end.style." + name, null); + } + + function styleInterpolate(name, i, priority) { + return function (t) { + this.style.setProperty(name, i.call(this, t), priority); + }; + } + + function styleTween(name, value, priority) { + var t, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + + tween._value = value; + return tween; + } + + function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); + } + + function textConstant(value) { + return function () { + this.textContent = value; + }; + } + + function textFunction(value) { + return function () { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; + } + + function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); + } + + function textInterpolate(i) { + return function (t) { + this.textContent = i.call(this, t); + }; + } + + function textTween(value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + + tween._value = value; + return tween; + } + + function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); + } + + function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); + } + + function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function (resolve, reject) { + var cancel = {value: reject}, + end = { + value: function () { + if (--size === 0) resolve(); + } + }; + + that.each(function () { + var schedule = set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + }); + } + + var id = 0; + + function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; + } + + function transition(name) { + return d3Selection.selection().transition(name); + } + + function newId() { + return ++id; + } + + var selection_prototype = d3Selection.selection.prototype; + + Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + end: transition_end + }; + + var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: d3Ease.easeCubicInOut + }; + + function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + return defaultTiming.time = d3Timer.now(), defaultTiming; + } + } + return timing; + } + + function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); + } + + d3Selection.selection.prototype.interrupt = selection_interrupt; + d3Selection.selection.prototype.transition = selection_transition; + + var root = [null]; + + function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root, name, +i); + } + } + } + + return null; + } + + exports.active = active; + exports.interrupt = interrupt; + exports.transition = transition; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13, "d3-dispatch": 15, "d3-ease": 18, "d3-interpolate": 24, "d3-selection": 31, "d3-timer": 35}], + 37: [function (require, module, exports) { +// https://d3js.org/d3-voronoi/ v1.1.4 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } + + function x(d) { + return d[0]; + } + + function y(d) { + return d[1]; + } + + function RedBlackTree() { + this._ = null; // root node + } + + function RedBlackNode(node) { + node.U = // parent node + node.C = // color - true for red, false for black + node.L = // left node + node.R = // right node + node.P = // previous node + node.N = null; // next node + } + + RedBlackTree.prototype = { + constructor: RedBlackTree, + + insert: function (after, node) { + var parent, grandpa, uncle; + + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = RedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + RedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + RedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + + remove: function (node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + + var parent = node.U, + sibling, + left = node.L, + right = node.R, + next, + red; + + if (!left) next = right; + else if (!right) next = left; + else next = RedBlackFirst(right); + + if (parent) { + if (parent.L === node) parent.L = next; + else parent.R = next; + } else { + this._ = next; + } + + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + + if (node) node.U = parent; + if (red) return; + if (node && node.C) { + node.C = false; + return; + } + + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + RedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + RedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateRight(this, parent); + sibling = parent.L; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + RedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + RedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + + if (node) node.C = false; + } + }; + + function RedBlackRotateLeft(tree, node) { + var p = node, + q = node.R, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; + } + + function RedBlackRotateRight(tree, node) { + var p = node, + q = node.L, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; + } + + function RedBlackFirst(node) { + while (node.L) node = node.L; + return node; + } + + function createEdge(left, right, v0, v1) { + var edge = [null, null], + index = edges.push(edge) - 1; + edge.left = left; + edge.right = right; + if (v0) setEdgeEnd(edge, left, right, v0); + if (v1) setEdgeEnd(edge, right, left, v1); + cells[left.index].halfedges.push(index); + cells[right.index].halfedges.push(index); + return edge; + } + + function createBorderEdge(left, v0, v1) { + var edge = [v0, v1]; + edge.left = left; + return edge; + } + + function setEdgeEnd(edge, left, right, vertex) { + if (!edge[0] && !edge[1]) { + edge[0] = vertex; + edge.left = left; + edge.right = right; + } else if (edge.left === right) { + edge[1] = vertex; + } else { + edge[0] = vertex; + } + } + +// Liang–Barsky line clipping. + function clipEdge(edge, x0, y0, x1, y1) { + var a = edge[0], + b = edge[1], + ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? + + if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; + if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; + return true; + } + + function connectEdge(edge, x0, y0, x1, y1) { + var v1 = edge[1]; + if (v1) return true; + + var v0 = edge[0], + left = edge.left, + right = edge.right, + lx = left[0], + ly = left[1], + rx = right[0], + ry = right[1], + fx = (lx + rx) / 2, + fy = (ly + ry) / 2, + fm, + fb; + + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!v0) v0 = [fx, y0]; + else if (v0[1] >= y1) return; + v1 = [fx, y1]; + } else { + if (!v0) v0 = [fx, y1]; + else if (v0[1] < y0) return; + v1 = [fx, y0]; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!v0) v0 = [(y0 - fb) / fm, y0]; + else if (v0[1] >= y1) return; + v1 = [(y1 - fb) / fm, y1]; + } else { + if (!v0) v0 = [(y1 - fb) / fm, y1]; + else if (v0[1] < y0) return; + v1 = [(y0 - fb) / fm, y0]; + } + } else { + if (ly < ry) { + if (!v0) v0 = [x0, fm * x0 + fb]; + else if (v0[0] >= x1) return; + v1 = [x1, fm * x1 + fb]; + } else { + if (!v0) v0 = [x1, fm * x1 + fb]; + else if (v0[0] < x0) return; + v1 = [x0, fm * x0 + fb]; + } + } + } + + edge[0] = v0; + edge[1] = v1; + return true; + } + + function clipEdges(x0, y0, x1, y1) { + var i = edges.length, + edge; + + while (i--) { + if (!connectEdge(edge = edges[i], x0, y0, x1, y1) + || !clipEdge(edge, x0, y0, x1, y1) + || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon + || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) { + delete edges[i]; + } + } + } + + function createCell(site) { + return cells[site.index] = { + site: site, + halfedges: [] + }; + } + + function cellHalfedgeAngle(cell, edge) { + var site = cell.site, + va = edge.left, + vb = edge.right; + if (site === vb) vb = va, va = site; + if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); + if (site === va) va = edge[1], vb = edge[0]; + else va = edge[0], vb = edge[1]; + return Math.atan2(va[0] - vb[0], vb[1] - va[1]); + } + + function cellHalfedgeStart(cell, edge) { + return edge[+(edge.left !== cell.site)]; + } + + function cellHalfedgeEnd(cell, edge) { + return edge[+(edge.left === cell.site)]; + } + + function sortCellHalfedges() { + for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { + if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { + var index = new Array(m), + array = new Array(m); + for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); + index.sort(function (i, j) { + return array[j] - array[i]; + }); + for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; + for (j = 0; j < m; ++j) halfedges[j] = array[j]; + } + } + } + + function clipCells(x0, y0, x1, y1) { + var nCells = cells.length, + iCell, + cell, + site, + iHalfedge, + halfedges, + nHalfedges, + start, + startX, + startY, + end, + endX, + endY, + cover = true; + + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + halfedges = cell.halfedges; + iHalfedge = halfedges.length; + + // Remove any dangling clipped edges. + while (iHalfedge--) { + if (!edges[halfedges[iHalfedge]]) { + halfedges.splice(iHalfedge, 1); + } + } + + // Insert any border edges as necessary. + iHalfedge = 0, nHalfedges = halfedges.length; + while (iHalfedge < nHalfedges) { + end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; + start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; + if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) { + halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, + Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1] + : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1] + : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0] + : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0] + : null)) - 1); + ++nHalfedges; + } + } + + if (nHalfedges) cover = false; + } + } + + // If there weren’t any edges, have the closest site cover the extent. + // It doesn’t matter which corner of the extent we measure! + if (cover) { + var dx, dy, d2, dc = Infinity; + + for (iCell = 0, cover = null; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + dx = site[0] - x0; + dy = site[1] - y0; + d2 = dx * dx + dy * dy; + if (d2 < dc) dc = d2, cover = cell; + } + } + + if (cover) { + var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; + cover.halfedges.push( + edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, + edges.push(createBorderEdge(site, v01, v11)) - 1, + edges.push(createBorderEdge(site, v11, v10)) - 1, + edges.push(createBorderEdge(site, v10, v00)) - 1 + ); + } + } + + // Lastly delete any cells with no edges; these were entirely clipped. + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + if (!cell.halfedges.length) { + delete cells[iCell]; + } + } + } + } + + var circlePool = []; - if (node) node.U = parent; - if (red) return; - if (node && node.C) { node.C = false; return; } - - do { - if (node === this._) break; - if (node === parent.L) { - sibling = parent.R; - if (sibling.C) { - sibling.C = false; - parent.C = true; - RedBlackRotateLeft(this, parent); - sibling = parent.R; - } - if ((sibling.L && sibling.L.C) - || (sibling.R && sibling.R.C)) { - if (!sibling.R || !sibling.R.C) { - sibling.L.C = false; - sibling.C = true; - RedBlackRotateRight(this, sibling); - sibling = parent.R; - } - sibling.C = parent.C; - parent.C = sibling.R.C = false; - RedBlackRotateLeft(this, parent); - node = this._; - break; - } - } else { - sibling = parent.L; - if (sibling.C) { - sibling.C = false; - parent.C = true; - RedBlackRotateRight(this, parent); - sibling = parent.L; - } - if ((sibling.L && sibling.L.C) - || (sibling.R && sibling.R.C)) { - if (!sibling.L || !sibling.L.C) { - sibling.R.C = false; - sibling.C = true; - RedBlackRotateLeft(this, sibling); - sibling = parent.L; - } - sibling.C = parent.C; - parent.C = sibling.L.C = false; - RedBlackRotateRight(this, parent); - node = this._; - break; - } - } - sibling.C = true; - node = parent; - parent = parent.U; - } while (!node.C); - - if (node) node.C = false; - } -}; - -function RedBlackRotateLeft(tree, node) { - var p = node, - q = node.R, - parent = p.U; - - if (parent) { - if (parent.L === p) parent.L = q; - else parent.R = q; - } else { - tree._ = q; - } - - q.U = parent; - p.U = q; - p.R = q.L; - if (p.R) p.R.U = p; - q.L = p; -} - -function RedBlackRotateRight(tree, node) { - var p = node, - q = node.L, - parent = p.U; - - if (parent) { - if (parent.L === p) parent.L = q; - else parent.R = q; - } else { - tree._ = q; - } - - q.U = parent; - p.U = q; - p.L = q.R; - if (p.L) p.L.U = p; - q.R = p; -} - -function RedBlackFirst(node) { - while (node.L) node = node.L; - return node; -} - -function createEdge(left, right, v0, v1) { - var edge = [null, null], - index = edges.push(edge) - 1; - edge.left = left; - edge.right = right; - if (v0) setEdgeEnd(edge, left, right, v0); - if (v1) setEdgeEnd(edge, right, left, v1); - cells[left.index].halfedges.push(index); - cells[right.index].halfedges.push(index); - return edge; -} - -function createBorderEdge(left, v0, v1) { - var edge = [v0, v1]; - edge.left = left; - return edge; -} - -function setEdgeEnd(edge, left, right, vertex) { - if (!edge[0] && !edge[1]) { - edge[0] = vertex; - edge.left = left; - edge.right = right; - } else if (edge.left === right) { - edge[1] = vertex; - } else { - edge[0] = vertex; - } -} + var firstCircle; -// Liang–Barsky line clipping. -function clipEdge(edge, x0, y0, x1, y1) { - var a = edge[0], - b = edge[1], - ax = a[0], - ay = a[1], - bx = b[0], - by = b[1], - t0 = 0, - t1 = 1, - dx = bx - ax, - dy = by - ay, - r; - - r = x0 - ax; - if (!dx && r > 0) return; - r /= dx; - if (dx < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dx > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - - r = x1 - ax; - if (!dx && r < 0) return; - r /= dx; - if (dx < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dx > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - - r = y0 - ay; - if (!dy && r > 0) return; - r /= dy; - if (dy < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dy > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } - - r = y1 - ay; - if (!dy && r < 0) return; - r /= dy; - if (dy < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dy > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } - - if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? - - if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; - if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; - return true; -} - -function connectEdge(edge, x0, y0, x1, y1) { - var v1 = edge[1]; - if (v1) return true; - - var v0 = edge[0], - left = edge.left, - right = edge.right, - lx = left[0], - ly = left[1], - rx = right[0], - ry = right[1], - fx = (lx + rx) / 2, - fy = (ly + ry) / 2, - fm, - fb; - - if (ry === ly) { - if (fx < x0 || fx >= x1) return; - if (lx > rx) { - if (!v0) v0 = [fx, y0]; - else if (v0[1] >= y1) return; - v1 = [fx, y1]; - } else { - if (!v0) v0 = [fx, y1]; - else if (v0[1] < y0) return; - v1 = [fx, y0]; - } - } else { - fm = (lx - rx) / (ry - ly); - fb = fy - fm * fx; - if (fm < -1 || fm > 1) { - if (lx > rx) { - if (!v0) v0 = [(y0 - fb) / fm, y0]; - else if (v0[1] >= y1) return; - v1 = [(y1 - fb) / fm, y1]; - } else { - if (!v0) v0 = [(y1 - fb) / fm, y1]; - else if (v0[1] < y0) return; - v1 = [(y0 - fb) / fm, y0]; - } - } else { - if (ly < ry) { - if (!v0) v0 = [x0, fm * x0 + fb]; - else if (v0[0] >= x1) return; - v1 = [x1, fm * x1 + fb]; - } else { - if (!v0) v0 = [x1, fm * x1 + fb]; - else if (v0[0] < x0) return; - v1 = [x0, fm * x0 + fb]; - } - } - } - - edge[0] = v0; - edge[1] = v1; - return true; -} - -function clipEdges(x0, y0, x1, y1) { - var i = edges.length, - edge; - - while (i--) { - if (!connectEdge(edge = edges[i], x0, y0, x1, y1) - || !clipEdge(edge, x0, y0, x1, y1) - || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon - || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) { - delete edges[i]; - } - } -} - -function createCell(site) { - return cells[site.index] = { - site: site, - halfedges: [] - }; -} - -function cellHalfedgeAngle(cell, edge) { - var site = cell.site, - va = edge.left, - vb = edge.right; - if (site === vb) vb = va, va = site; - if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); - if (site === va) va = edge[1], vb = edge[0]; - else va = edge[0], vb = edge[1]; - return Math.atan2(va[0] - vb[0], vb[1] - va[1]); -} - -function cellHalfedgeStart(cell, edge) { - return edge[+(edge.left !== cell.site)]; -} - -function cellHalfedgeEnd(cell, edge) { - return edge[+(edge.left === cell.site)]; -} - -function sortCellHalfedges() { - for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { - if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { - var index = new Array(m), - array = new Array(m); - for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); - index.sort(function(i, j) { return array[j] - array[i]; }); - for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; - for (j = 0; j < m; ++j) halfedges[j] = array[j]; - } - } -} - -function clipCells(x0, y0, x1, y1) { - var nCells = cells.length, - iCell, - cell, - site, - iHalfedge, - halfedges, - nHalfedges, - start, - startX, - startY, - end, - endX, - endY, - cover = true; - - for (iCell = 0; iCell < nCells; ++iCell) { - if (cell = cells[iCell]) { - site = cell.site; - halfedges = cell.halfedges; - iHalfedge = halfedges.length; - - // Remove any dangling clipped edges. - while (iHalfedge--) { - if (!edges[halfedges[iHalfedge]]) { - halfedges.splice(iHalfedge, 1); - } - } - - // Insert any border edges as necessary. - iHalfedge = 0, nHalfedges = halfedges.length; - while (iHalfedge < nHalfedges) { - end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; - start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; - if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) { - halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, - Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1] - : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1] - : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0] - : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0] - : null)) - 1); - ++nHalfedges; - } - } + function Circle() { + RedBlackNode(this); + this.x = + this.y = + this.arc = + this.site = + this.cy = null; + } - if (nHalfedges) cover = false; - } - } - - // If there weren’t any edges, have the closest site cover the extent. - // It doesn’t matter which corner of the extent we measure! - if (cover) { - var dx, dy, d2, dc = Infinity; - - for (iCell = 0, cover = null; iCell < nCells; ++iCell) { - if (cell = cells[iCell]) { - site = cell.site; - dx = site[0] - x0; - dy = site[1] - y0; - d2 = dx * dx + dy * dy; - if (d2 < dc) dc = d2, cover = cell; - } - } + function attachCircle(arc) { + var lArc = arc.P, + rArc = arc.N; + + if (!lArc || !rArc) return; + + var lSite = lArc.site, + cSite = arc.site, + rSite = rArc.site; + + if (lSite === rSite) return; + + var bx = cSite[0], + by = cSite[1], + ax = lSite[0] - bx, + ay = lSite[1] - by, + cx = rSite[0] - bx, + cy = rSite[1] - by; + + var d = 2 * (ax * cy - ay * cx); + if (d >= -epsilon2) return; + + var ha = ax * ax + ay * ay, + hc = cx * cx + cy * cy, + x = (cy * ha - ay * hc) / d, + y = (ax * hc - cx * ha) / d; + + var circle = circlePool.pop() || new Circle; + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom + + arc.circle = circle; + + var before = null, + node = circles._; + + while (node) { + if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { + if (node.L) node = node.L; + else { + before = node.P; + break; + } + } else { + if (node.R) node = node.R; + else { + before = node; + break; + } + } + } - if (cover) { - var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; - cover.halfedges.push( - edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, - edges.push(createBorderEdge(site, v01, v11)) - 1, - edges.push(createBorderEdge(site, v11, v10)) - 1, - edges.push(createBorderEdge(site, v10, v00)) - 1 - ); - } - } - - // Lastly delete any cells with no edges; these were entirely clipped. - for (iCell = 0; iCell < nCells; ++iCell) { - if (cell = cells[iCell]) { - if (!cell.halfedges.length) { - delete cells[iCell]; - } - } - } -} - -var circlePool = []; - -var firstCircle; - -function Circle() { - RedBlackNode(this); - this.x = - this.y = - this.arc = - this.site = - this.cy = null; -} - -function attachCircle(arc) { - var lArc = arc.P, - rArc = arc.N; - - if (!lArc || !rArc) return; - - var lSite = lArc.site, - cSite = arc.site, - rSite = rArc.site; - - if (lSite === rSite) return; - - var bx = cSite[0], - by = cSite[1], - ax = lSite[0] - bx, - ay = lSite[1] - by, - cx = rSite[0] - bx, - cy = rSite[1] - by; - - var d = 2 * (ax * cy - ay * cx); - if (d >= -epsilon2) return; - - var ha = ax * ax + ay * ay, - hc = cx * cx + cy * cy, - x = (cy * ha - ay * hc) / d, - y = (ax * hc - cx * ha) / d; - - var circle = circlePool.pop() || new Circle; - circle.arc = arc; - circle.site = cSite; - circle.x = x + bx; - circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom - - arc.circle = circle; - - var before = null, - node = circles._; - - while (node) { - if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { - if (node.L) node = node.L; - else { before = node.P; break; } - } else { - if (node.R) node = node.R; - else { before = node; break; } - } - } - - circles.insert(before, circle); - if (!before) firstCircle = circle; -} - -function detachCircle(arc) { - var circle = arc.circle; - if (circle) { - if (!circle.P) firstCircle = circle.N; - circles.remove(circle); - circlePool.push(circle); - RedBlackNode(circle); - arc.circle = null; - } -} - -var beachPool = []; - -function Beach() { - RedBlackNode(this); - this.edge = - this.site = - this.circle = null; -} - -function createBeach(site) { - var beach = beachPool.pop() || new Beach; - beach.site = site; - return beach; -} - -function detachBeach(beach) { - detachCircle(beach); - beaches.remove(beach); - beachPool.push(beach); - RedBlackNode(beach); -} - -function removeBeach(beach) { - var circle = beach.circle, - x = circle.x, - y = circle.cy, - vertex = [x, y], - previous = beach.P, - next = beach.N, - disappearing = [beach]; - - detachBeach(beach); - - var lArc = previous; - while (lArc.circle - && Math.abs(x - lArc.circle.x) < epsilon - && Math.abs(y - lArc.circle.cy) < epsilon) { - previous = lArc.P; - disappearing.unshift(lArc); - detachBeach(lArc); - lArc = previous; - } - - disappearing.unshift(lArc); - detachCircle(lArc); - - var rArc = next; - while (rArc.circle - && Math.abs(x - rArc.circle.x) < epsilon - && Math.abs(y - rArc.circle.cy) < epsilon) { - next = rArc.N; - disappearing.push(rArc); - detachBeach(rArc); - rArc = next; - } - - disappearing.push(rArc); - detachCircle(rArc); - - var nArcs = disappearing.length, - iArc; - for (iArc = 1; iArc < nArcs; ++iArc) { - rArc = disappearing[iArc]; - lArc = disappearing[iArc - 1]; - setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); - } - - lArc = disappearing[0]; - rArc = disappearing[nArcs - 1]; - rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); - - attachCircle(lArc); - attachCircle(rArc); -} - -function addBeach(site) { - var x = site[0], - directrix = site[1], - lArc, - rArc, - dxl, - dxr, - node = beaches._; - - while (node) { - dxl = leftBreakPoint(node, directrix) - x; - if (dxl > epsilon) node = node.L; else { - dxr = x - rightBreakPoint(node, directrix); - if (dxr > epsilon) { - if (!node.R) { - lArc = node; - break; - } - node = node.R; - } else { - if (dxl > -epsilon) { - lArc = node.P; - rArc = node; - } else if (dxr > -epsilon) { - lArc = node; - rArc = node.N; - } else { - lArc = rArc = node; - } - break; - } - } - } - - createCell(site); - var newArc = createBeach(site); - beaches.insert(lArc, newArc); - - if (!lArc && !rArc) return; - - if (lArc === rArc) { - detachCircle(lArc); - rArc = createBeach(lArc.site); - beaches.insert(newArc, rArc); - newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); - attachCircle(lArc); - attachCircle(rArc); - return; - } - - if (!rArc) { // && lArc - newArc.edge = createEdge(lArc.site, newArc.site); - return; - } - - // else lArc !== rArc - detachCircle(lArc); - detachCircle(rArc); - - var lSite = lArc.site, - ax = lSite[0], - ay = lSite[1], - bx = site[0] - ax, - by = site[1] - ay, - rSite = rArc.site, - cx = rSite[0] - ax, - cy = rSite[1] - ay, - d = 2 * (bx * cy - by * cx), - hb = bx * bx + by * by, - hc = cx * cx + cy * cy, - vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; - - setEdgeEnd(rArc.edge, lSite, rSite, vertex); - newArc.edge = createEdge(lSite, site, null, vertex); - rArc.edge = createEdge(site, rSite, null, vertex); - attachCircle(lArc); - attachCircle(rArc); -} - -function leftBreakPoint(arc, directrix) { - var site = arc.site, - rfocx = site[0], - rfocy = site[1], - pby2 = rfocy - directrix; - - if (!pby2) return rfocx; - - var lArc = arc.P; - if (!lArc) return -Infinity; - - site = lArc.site; - var lfocx = site[0], - lfocy = site[1], - plby2 = lfocy - directrix; - - if (!plby2) return lfocx; - - var hl = lfocx - rfocx, - aby2 = 1 / pby2 - 1 / plby2, - b = hl / plby2; - - if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; - - return (rfocx + lfocx) / 2; -} - -function rightBreakPoint(arc, directrix) { - var rArc = arc.N; - if (rArc) return leftBreakPoint(rArc, directrix); - var site = arc.site; - return site[1] === directrix ? site[0] : Infinity; -} - -var epsilon = 1e-6; -var epsilon2 = 1e-12; -var beaches; -var cells; -var circles; -var edges; - -function triangleArea(a, b, c) { - return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); -} - -function lexicographic(a, b) { - return b[1] - a[1] - || b[0] - a[0]; -} - -function Diagram(sites, extent) { - var site = sites.sort(lexicographic).pop(), - x, - y, - circle; - - edges = []; - cells = new Array(sites.length); - beaches = new RedBlackTree; - circles = new RedBlackTree; - - while (true) { - circle = firstCircle; - if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { - if (site[0] !== x || site[1] !== y) { - addBeach(site); - x = site[0], y = site[1]; - } - site = sites.pop(); - } else if (circle) { - removeBeach(circle.arc); - } else { - break; - } - } - - sortCellHalfedges(); - - if (extent) { - var x0 = +extent[0][0], - y0 = +extent[0][1], - x1 = +extent[1][0], - y1 = +extent[1][1]; - clipEdges(x0, y0, x1, y1); - clipCells(x0, y0, x1, y1); - } - - this.edges = edges; - this.cells = cells; - - beaches = - circles = - edges = - cells = null; -} - -Diagram.prototype = { - constructor: Diagram, - - polygons: function() { - var edges = this.edges; - - return this.cells.map(function(cell) { - var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); }); - polygon.data = cell.site.data; - return polygon; - }); - }, - - triangles: function() { - var triangles = [], - edges = this.edges; - - this.cells.forEach(function(cell, i) { - if (!(m = (halfedges = cell.halfedges).length)) return; - var site = cell.site, - halfedges, - j = -1, - m, - s0, - e1 = edges[halfedges[m - 1]], - s1 = e1.left === site ? e1.right : e1.left; - - while (++j < m) { - s0 = s1; - e1 = edges[halfedges[j]]; - s1 = e1.left === site ? e1.right : e1.left; - if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { - triangles.push([site.data, s0.data, s1.data]); - } - } - }); - - return triangles; - }, - - links: function() { - return this.edges.filter(function(edge) { - return edge.right; - }).map(function(edge) { - return { - source: edge.left.data, - target: edge.right.data - }; - }); - }, - - find: function(x, y, radius) { - var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; - - // Use the previously-found cell, or start with an arbitrary one. - while (!(cell = that.cells[i1])) if (++i1 >= n) return null; - var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; - - // Traverse the half-edges to find a closer cell, if any. - do { - cell = that.cells[i0 = i1], i1 = null; - cell.halfedges.forEach(function(e) { - var edge = that.edges[e], v = edge.left; - if ((v === cell.site || !v) && !(v = edge.right)) return; - var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; - if (v2 < d2) d2 = v2, i1 = v.index; - }); - } while (i1 !== null); - - that._found = i0; - - return radius == null || d2 <= radius * radius ? cell.site : null; - } -}; - -function voronoi() { - var x$$1 = x, - y$$1 = y, - extent = null; - - function voronoi(data) { - return new Diagram(data.map(function(d, i) { - var s = [Math.round(x$$1(d, i, data) / epsilon) * epsilon, Math.round(y$$1(d, i, data) / epsilon) * epsilon]; - s.index = i; - s.data = d; - return s; - }), extent); - } - - voronoi.polygons = function(data) { - return voronoi(data).polygons(); - }; - - voronoi.links = function(data) { - return voronoi(data).links(); - }; - - voronoi.triangles = function(data) { - return voronoi(data).triangles(); - }; - - voronoi.x = function(_) { - return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : x$$1; - }; - - voronoi.y = function(_) { - return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : y$$1; - }; - - voronoi.extent = function(_) { - return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; - }; - - voronoi.size = function(_) { - return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; - }; - - return voronoi; -} - -exports.voronoi = voronoi; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); - -},{}],38:[function(require,module,exports){ + circles.insert(before, circle); + if (!before) firstCircle = circle; + } + + function detachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) firstCircle = circle.N; + circles.remove(circle); + circlePool.push(circle); + RedBlackNode(circle); + arc.circle = null; + } + } + + var beachPool = []; + + function Beach() { + RedBlackNode(this); + this.edge = + this.site = + this.circle = null; + } + + function createBeach(site) { + var beach = beachPool.pop() || new Beach; + beach.site = site; + return beach; + } + + function detachBeach(beach) { + detachCircle(beach); + beaches.remove(beach); + beachPool.push(beach); + RedBlackNode(beach); + } + + function removeBeach(beach) { + var circle = beach.circle, + x = circle.x, + y = circle.cy, + vertex = [x, y], + previous = beach.P, + next = beach.N, + disappearing = [beach]; + + detachBeach(beach); + + var lArc = previous; + while (lArc.circle + && Math.abs(x - lArc.circle.x) < epsilon + && Math.abs(y - lArc.circle.cy) < epsilon) { + previous = lArc.P; + disappearing.unshift(lArc); + detachBeach(lArc); + lArc = previous; + } + + disappearing.unshift(lArc); + detachCircle(lArc); + + var rArc = next; + while (rArc.circle + && Math.abs(x - rArc.circle.x) < epsilon + && Math.abs(y - rArc.circle.cy) < epsilon) { + next = rArc.N; + disappearing.push(rArc); + detachBeach(rArc); + rArc = next; + } + + disappearing.push(rArc); + detachCircle(rArc); + + var nArcs = disappearing.length, + iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + + attachCircle(lArc); + attachCircle(rArc); + } + + function addBeach(site) { + var x = site[0], + directrix = site[1], + lArc, + rArc, + dxl, + dxr, + node = beaches._; + + while (node) { + dxl = leftBreakPoint(node, directrix) - x; + if (dxl > epsilon) node = node.L; else { + dxr = x - rightBreakPoint(node, directrix); + if (dxr > epsilon) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -epsilon) { + lArc = node.P; + rArc = node; + } else if (dxr > -epsilon) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + + createCell(site); + var newArc = createBeach(site); + beaches.insert(lArc, newArc); + + if (!lArc && !rArc) return; + + if (lArc === rArc) { + detachCircle(lArc); + rArc = createBeach(lArc.site); + beaches.insert(newArc, rArc); + newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); + attachCircle(lArc); + attachCircle(rArc); + return; + } + + if (!rArc) { // && lArc + newArc.edge = createEdge(lArc.site, newArc.site); + return; + } + + // else lArc !== rArc + detachCircle(lArc); + detachCircle(rArc); + + var lSite = lArc.site, + ax = lSite[0], + ay = lSite[1], + bx = site[0] - ax, + by = site[1] - ay, + rSite = rArc.site, + cx = rSite[0] - ax, + cy = rSite[1] - ay, + d = 2 * (bx * cy - by * cx), + hb = bx * bx + by * by, + hc = cx * cx + cy * cy, + vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; + + setEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = createEdge(lSite, site, null, vertex); + rArc.edge = createEdge(site, rSite, null, vertex); + attachCircle(lArc); + attachCircle(rArc); + } + + function leftBreakPoint(arc, directrix) { + var site = arc.site, + rfocx = site[0], + rfocy = site[1], + pby2 = rfocy - directrix; + + if (!pby2) return rfocx; + + var lArc = arc.P; + if (!lArc) return -Infinity; + + site = lArc.site; + var lfocx = site[0], + lfocy = site[1], + plby2 = lfocy - directrix; + + if (!plby2) return lfocx; + + var hl = lfocx - rfocx, + aby2 = 1 / pby2 - 1 / plby2, + b = hl / plby2; + + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + + return (rfocx + lfocx) / 2; + } + + function rightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return leftBreakPoint(rArc, directrix); + var site = arc.site; + return site[1] === directrix ? site[0] : Infinity; + } + + var epsilon = 1e-6; + var epsilon2 = 1e-12; + var beaches; + var cells; + var circles; + var edges; + + function triangleArea(a, b, c) { + return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); + } + + function lexicographic(a, b) { + return b[1] - a[1] + || b[0] - a[0]; + } + + function Diagram(sites, extent) { + var site = sites.sort(lexicographic).pop(), + x, + y, + circle; + + edges = []; + cells = new Array(sites.length); + beaches = new RedBlackTree; + circles = new RedBlackTree; + + while (true) { + circle = firstCircle; + if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { + if (site[0] !== x || site[1] !== y) { + addBeach(site); + x = site[0], y = site[1]; + } + site = sites.pop(); + } else if (circle) { + removeBeach(circle.arc); + } else { + break; + } + } + + sortCellHalfedges(); + + if (extent) { + var x0 = +extent[0][0], + y0 = +extent[0][1], + x1 = +extent[1][0], + y1 = +extent[1][1]; + clipEdges(x0, y0, x1, y1); + clipCells(x0, y0, x1, y1); + } + + this.edges = edges; + this.cells = cells; + + beaches = + circles = + edges = + cells = null; + } + + Diagram.prototype = { + constructor: Diagram, + + polygons: function () { + var edges = this.edges; + + return this.cells.map(function (cell) { + var polygon = cell.halfedges.map(function (i) { + return cellHalfedgeStart(cell, edges[i]); + }); + polygon.data = cell.site.data; + return polygon; + }); + }, + + triangles: function () { + var triangles = [], + edges = this.edges; + + this.cells.forEach(function (cell, i) { + if (!(m = (halfedges = cell.halfedges).length)) return; + var site = cell.site, + halfedges, + j = -1, + m, + s0, + e1 = edges[halfedges[m - 1]], + s1 = e1.left === site ? e1.right : e1.left; + + while (++j < m) { + s0 = s1; + e1 = edges[halfedges[j]]; + s1 = e1.left === site ? e1.right : e1.left; + if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { + triangles.push([site.data, s0.data, s1.data]); + } + } + }); + + return triangles; + }, + + links: function () { + return this.edges.filter(function (edge) { + return edge.right; + }).map(function (edge) { + return { + source: edge.left.data, + target: edge.right.data + }; + }); + }, + + find: function (x, y, radius) { + var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; + + // Use the previously-found cell, or start with an arbitrary one. + while (!(cell = that.cells[i1])) if (++i1 >= n) return null; + var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; + + // Traverse the half-edges to find a closer cell, if any. + do { + cell = that.cells[i0 = i1], i1 = null; + cell.halfedges.forEach(function (e) { + var edge = that.edges[e], v = edge.left; + if ((v === cell.site || !v) && !(v = edge.right)) return; + var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; + if (v2 < d2) d2 = v2, i1 = v.index; + }); + } while (i1 !== null); + + that._found = i0; + + return radius == null || d2 <= radius * radius ? cell.site : null; + } + }; + + function voronoi() { + var x$$1 = x, + y$$1 = y, + extent = null; + + function voronoi(data) { + return new Diagram(data.map(function (d, i) { + var s = [Math.round(x$$1(d, i, data) / epsilon) * epsilon, Math.round(y$$1(d, i, data) / epsilon) * epsilon]; + s.index = i; + s.data = d; + return s; + }), extent); + } + + voronoi.polygons = function (data) { + return voronoi(data).polygons(); + }; + + voronoi.links = function (data) { + return voronoi(data).links(); + }; + + voronoi.triangles = function (data) { + return voronoi(data).triangles(); + }; + + voronoi.x = function (_) { + return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : x$$1; + }; + + voronoi.y = function (_) { + return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : y$$1; + }; + + voronoi.extent = function (_) { + return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; + }; + + voronoi.size = function (_) { + return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; + }; + + return voronoi; + } + + exports.voronoi = voronoi; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 38: [function (require, module, exports) { // https://d3js.org/d3-zoom/ v1.8.3 Copyright 2019 Mike Bostock -(function (global, factory) { -typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : -typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : -(global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); -}(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { 'use strict'; - -function constant(x) { - return function() { - return x; - }; -} - -function ZoomEvent(target, type, transform) { - this.target = target; - this.type = type; - this.transform = transform; -} - -function Transform(k, x, y) { - this.k = k; - this.x = x; - this.y = y; -} - -Transform.prototype = { - constructor: Transform, - scale: function(k) { - return k === 1 ? this : new Transform(this.k * k, this.x, this.y); - }, - translate: function(x, y) { - return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); - }, - apply: function(point) { - return [point[0] * this.k + this.x, point[1] * this.k + this.y]; - }, - applyX: function(x) { - return x * this.k + this.x; - }, - applyY: function(y) { - return y * this.k + this.y; - }, - invert: function(location) { - return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; - }, - invertX: function(x) { - return (x - this.x) / this.k; - }, - invertY: function(y) { - return (y - this.y) / this.k; - }, - rescaleX: function(x) { - return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); - }, - rescaleY: function(y) { - return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); - }, - toString: function() { - return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; - } -}; - -var identity = new Transform(1, 0, 0); - -transform.prototype = Transform.prototype; - -function transform(node) { - while (!node.__zoom) if (!(node = node.parentNode)) return identity; - return node.__zoom; -} - -function nopropagation() { - d3Selection.event.stopImmediatePropagation(); -} - -function noevent() { - d3Selection.event.preventDefault(); - d3Selection.event.stopImmediatePropagation(); -} + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } + + function ZoomEvent(target, type, transform) { + this.target = target; + this.type = type; + this.transform = transform; + } + + function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; + } + + Transform.prototype = { + constructor: Transform, + scale: function (k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function (x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function (point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function (x) { + return x * this.k + this.x; + }, + applyY: function (y) { + return y * this.k + this.y; + }, + invert: function (location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function (x) { + return (x - this.x) / this.k; + }, + invertY: function (y) { + return (y - this.y) / this.k; + }, + rescaleX: function (x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function (y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function () { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } + }; + + var identity = new Transform(1, 0, 0); + + transform.prototype = Transform.prototype; + + function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; + return node.__zoom; + } + + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } + + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } // Ignore right-click, since that should open the context menu. -function defaultFilter() { - return !d3Selection.event.ctrlKey && !d3Selection.event.button; -} - -function defaultExtent() { - var e = this; - if (e instanceof SVGElement) { - e = e.ownerSVGElement || e; - if (e.hasAttribute("viewBox")) { - e = e.viewBox.baseVal; - return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; - } - return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; - } - return [[0, 0], [e.clientWidth, e.clientHeight]]; -} - -function defaultTransform() { - return this.__zoom || identity; -} - -function defaultWheelDelta() { - return -d3Selection.event.deltaY * (d3Selection.event.deltaMode === 1 ? 0.05 : d3Selection.event.deltaMode ? 1 : 0.002); -} - -function defaultTouchable() { - return navigator.maxTouchPoints || ("ontouchstart" in this); -} - -function defaultConstrain(transform, extent, translateExtent) { - var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], - dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], - dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], - dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; - return transform.translate( - dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), - dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) - ); -} - -function zoom() { - var filter = defaultFilter, - extent = defaultExtent, - constrain = defaultConstrain, - wheelDelta = defaultWheelDelta, - touchable = defaultTouchable, - scaleExtent = [0, Infinity], - translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], - duration = 250, - interpolate = d3Interpolate.interpolateZoom, - listeners = d3Dispatch.dispatch("start", "zoom", "end"), - touchstarting, - touchending, - touchDelay = 500, - wheelDelay = 150, - clickDistance2 = 0; - - function zoom(selection) { - selection - .property("__zoom", defaultTransform) - .on("wheel.zoom", wheeled) - .on("mousedown.zoom", mousedowned) - .on("dblclick.zoom", dblclicked) - .filter(touchable) - .on("touchstart.zoom", touchstarted) - .on("touchmove.zoom", touchmoved) - .on("touchend.zoom touchcancel.zoom", touchended) - .style("touch-action", "none") - .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); - } - - zoom.transform = function(collection, transform, point) { - var selection = collection.selection ? collection.selection() : collection; - selection.property("__zoom", defaultTransform); - if (collection !== selection) { - schedule(collection, transform, point); - } else { - selection.interrupt().each(function() { - gesture(this, arguments) - .start() - .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) - .end(); - }); - } - }; - - zoom.scaleBy = function(selection, k, p) { - zoom.scaleTo(selection, function() { - var k0 = this.__zoom.k, - k1 = typeof k === "function" ? k.apply(this, arguments) : k; - return k0 * k1; - }, p); - }; - - zoom.scaleTo = function(selection, k, p) { - zoom.transform(selection, function() { - var e = extent.apply(this, arguments), - t0 = this.__zoom, - p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, - p1 = t0.invert(p0), - k1 = typeof k === "function" ? k.apply(this, arguments) : k; - return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); - }, p); - }; - - zoom.translateBy = function(selection, x, y) { - zoom.transform(selection, function() { - return constrain(this.__zoom.translate( - typeof x === "function" ? x.apply(this, arguments) : x, - typeof y === "function" ? y.apply(this, arguments) : y - ), extent.apply(this, arguments), translateExtent); - }); - }; - - zoom.translateTo = function(selection, x, y, p) { - zoom.transform(selection, function() { - var e = extent.apply(this, arguments), - t = this.__zoom, - p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; - return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( - typeof x === "function" ? -x.apply(this, arguments) : -x, - typeof y === "function" ? -y.apply(this, arguments) : -y - ), e, translateExtent); - }, p); - }; - - function scale(transform, k) { - k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); - return k === transform.k ? transform : new Transform(k, transform.x, transform.y); - } - - function translate(transform, p0, p1) { - var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; - return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); - } - - function centroid(extent) { - return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; - } - - function schedule(transition, transform, point) { - transition - .on("start.zoom", function() { gesture(this, arguments).start(); }) - .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); }) - .tween("zoom", function() { - var that = this, - args = arguments, - g = gesture(that, args), - e = extent.apply(that, args), - p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, - w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), - a = that.__zoom, - b = typeof transform === "function" ? transform.apply(that, args) : transform, - i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); - return function(t) { - if (t === 1) t = b; // Avoid rounding error on end. - else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } - g.zoom(null, t); - }; - }); - } - - function gesture(that, args, clean) { - return (!clean && that.__zooming) || new Gesture(that, args); - } - - function Gesture(that, args) { - this.that = that; - this.args = args; - this.active = 0; - this.extent = extent.apply(that, args); - this.taps = 0; - } - - Gesture.prototype = { - start: function() { - if (++this.active === 1) { - this.that.__zooming = this; - this.emit("start"); - } - return this; - }, - zoom: function(key, transform) { - if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); - if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); - if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); - this.that.__zoom = transform; - this.emit("zoom"); - return this; - }, - end: function() { - if (--this.active === 0) { - delete this.that.__zooming; - this.emit("end"); - } - return this; - }, - emit: function(type) { - d3Selection.customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); - } - }; - - function wheeled() { - if (!filter.apply(this, arguments)) return; - var g = gesture(this, arguments), - t = this.__zoom, - k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), - p = d3Selection.mouse(this); - - // If the mouse is in the same location as before, reuse it. - // If there were recent wheel events, reset the wheel idle timeout. - if (g.wheel) { - if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { - g.mouse[1] = t.invert(g.mouse[0] = p); - } - clearTimeout(g.wheel); - } + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } - // If this wheel event won’t trigger a transform change, ignore it. - else if (t.k === k) return; + function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; + } - // Otherwise, capture the mouse point and location at the start. - else { - g.mouse = [p, t.invert(p)]; - d3Transition.interrupt(this); - g.start(); - } + function defaultTransform() { + return this.__zoom || identity; + } - noevent(); - g.wheel = setTimeout(wheelidled, wheelDelay); - g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + function defaultWheelDelta() { + return -d3Selection.event.deltaY * (d3Selection.event.deltaMode === 1 ? 0.05 : d3Selection.event.deltaMode ? 1 : 0.002); + } - function wheelidled() { - g.wheel = null; - g.end(); - } - } - - function mousedowned() { - if (touchending || !filter.apply(this, arguments)) return; - var g = gesture(this, arguments, true), - v = d3Selection.select(d3Selection.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), - p = d3Selection.mouse(this), - x0 = d3Selection.event.clientX, - y0 = d3Selection.event.clientY; - - d3Drag.dragDisable(d3Selection.event.view); - nopropagation(); - g.mouse = [p, this.__zoom.invert(p)]; - d3Transition.interrupt(this); - g.start(); - - function mousemoved() { - noevent(); - if (!g.moved) { - var dx = d3Selection.event.clientX - x0, dy = d3Selection.event.clientY - y0; - g.moved = dx * dx + dy * dy > clickDistance2; - } - g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3Selection.mouse(g.that), g.mouse[1]), g.extent, translateExtent)); - } + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } - function mouseupped() { - v.on("mousemove.zoom mouseup.zoom", null); - d3Drag.dragEnable(d3Selection.event.view, g.moved); - noevent(); - g.end(); - } - } - - function dblclicked() { - if (!filter.apply(this, arguments)) return; - var t0 = this.__zoom, - p0 = d3Selection.mouse(this), - p1 = t0.invert(p0), - k1 = t0.k * (d3Selection.event.shiftKey ? 0.5 : 2), - t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); - - noevent(); - if (duration > 0) d3Selection.select(this).transition().duration(duration).call(schedule, t1, p0); - else d3Selection.select(this).call(zoom.transform, t1); - } - - function touchstarted() { - if (!filter.apply(this, arguments)) return; - var touches = d3Selection.event.touches, - n = touches.length, - g = gesture(this, arguments, d3Selection.event.changedTouches.length === n), - started, i, t, p; - - nopropagation(); - for (i = 0; i < n; ++i) { - t = touches[i], p = d3Selection.touch(this, touches, t.identifier); - p = [p, this.__zoom.invert(p), t.identifier]; - if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; - else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; - } + function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); + } - if (touchstarting) touchstarting = clearTimeout(touchstarting); + function zoom() { + var filter = defaultFilter, + extent = defaultExtent, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = d3Interpolate.interpolateZoom, + listeners = d3Dispatch.dispatch("start", "zoom", "end"), + touchstarting, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } - if (started) { - if (g.taps < 2) touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); - d3Transition.interrupt(this); - g.start(); - } - } - - function touchmoved() { - if (!this.__zooming) return; - var g = gesture(this, arguments), - touches = d3Selection.event.changedTouches, - n = touches.length, i, t, p, l; - - noevent(); - if (touchstarting) touchstarting = clearTimeout(touchstarting); - g.taps = 0; - for (i = 0; i < n; ++i) { - t = touches[i], p = d3Selection.touch(this, touches, t.identifier); - if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; - else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; - } - t = g.that.__zoom; - if (g.touch1) { - var p0 = g.touch0[0], l0 = g.touch0[1], - p1 = g.touch1[0], l1 = g.touch1[1], - dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, - dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; - t = scale(t, Math.sqrt(dp / dl)); - p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; - l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; - } - else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; - else return; - g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); - } - - function touchended() { - if (!this.__zooming) return; - var g = gesture(this, arguments), - touches = d3Selection.event.changedTouches, - n = touches.length, i, t; - - nopropagation(); - if (touchending) clearTimeout(touchending); - touchending = setTimeout(function() { touchending = null; }, touchDelay); - for (i = 0; i < n; ++i) { - t = touches[i]; - if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; - else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; - } - if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; - if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); - else { - g.end(); - // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. - if (g.taps === 2) { - var p = d3Selection.select(this).on("dblclick.zoom"); - if (p) p.apply(this, arguments); - } - } - } - - zoom.wheelDelta = function(_) { - return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; - }; - - zoom.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; - }; - - zoom.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; - }; - - zoom.extent = function(_) { - return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; - }; - - zoom.scaleExtent = function(_) { - return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; - }; - - zoom.translateExtent = function(_) { - return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; - }; - - zoom.constrain = function(_) { - return arguments.length ? (constrain = _, zoom) : constrain; - }; - - zoom.duration = function(_) { - return arguments.length ? (duration = +_, zoom) : duration; - }; - - zoom.interpolate = function(_) { - return arguments.length ? (interpolate = _, zoom) : interpolate; - }; - - zoom.on = function() { - var value = listeners.on.apply(listeners, arguments); - return value === listeners ? zoom : value; - }; - - zoom.clickDistance = function(_) { - return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); - }; - - return zoom; -} - -exports.zoom = zoom; -exports.zoomIdentity = identity; -exports.zoomTransform = transform; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{"d3-dispatch":15,"d3-drag":16,"d3-interpolate":24,"d3-selection":31,"d3-transition":36}],39:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var d3Array = require('d3-array'); -var d3Axis = require('d3-axis'); -var d3Brush = require('d3-brush'); -var d3Chord = require('d3-chord'); -var d3Collection = require('d3-collection'); -var d3Color = require('d3-color'); -var d3Contour = require('d3-contour'); -var d3Dispatch = require('d3-dispatch'); -var d3Drag = require('d3-drag'); -var d3Dsv = require('d3-dsv'); -var d3Ease = require('d3-ease'); -var d3Fetch = require('d3-fetch'); -var d3Force = require('d3-force'); -var d3Format = require('d3-format'); -var d3Geo = require('d3-geo'); -var d3Hierarchy = require('d3-hierarchy'); -var d3Interpolate = require('d3-interpolate'); -var d3Path = require('d3-path'); -var d3Polygon = require('d3-polygon'); -var d3Quadtree = require('d3-quadtree'); -var d3Random = require('d3-random'); -var d3Scale = require('d3-scale'); -var d3ScaleChromatic = require('d3-scale-chromatic'); -var d3Selection = require('d3-selection'); -var d3Shape = require('d3-shape'); -var d3Time = require('d3-time'); -var d3TimeFormat = require('d3-time-format'); -var d3Timer = require('d3-timer'); -var d3Transition = require('d3-transition'); -var d3Voronoi = require('d3-voronoi'); -var d3Zoom = require('d3-zoom'); - -var version = "5.15.0"; - -Object.keys(d3Array).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Array[k]; - } - }); -}); -Object.keys(d3Axis).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Axis[k]; - } - }); -}); -Object.keys(d3Brush).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Brush[k]; - } - }); -}); -Object.keys(d3Chord).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Chord[k]; - } - }); -}); -Object.keys(d3Collection).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Collection[k]; - } - }); -}); -Object.keys(d3Color).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Color[k]; - } - }); -}); -Object.keys(d3Contour).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Contour[k]; - } - }); -}); -Object.keys(d3Dispatch).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Dispatch[k]; - } - }); -}); -Object.keys(d3Drag).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Drag[k]; - } - }); -}); -Object.keys(d3Dsv).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Dsv[k]; - } - }); -}); -Object.keys(d3Ease).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Ease[k]; - } - }); -}); -Object.keys(d3Fetch).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Fetch[k]; - } - }); -}); -Object.keys(d3Force).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Force[k]; - } - }); -}); -Object.keys(d3Format).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Format[k]; - } - }); -}); -Object.keys(d3Geo).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Geo[k]; - } - }); -}); -Object.keys(d3Hierarchy).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Hierarchy[k]; - } - }); -}); -Object.keys(d3Interpolate).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Interpolate[k]; - } - }); -}); -Object.keys(d3Path).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Path[k]; - } - }); -}); -Object.keys(d3Polygon).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Polygon[k]; - } - }); -}); -Object.keys(d3Quadtree).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Quadtree[k]; - } - }); -}); -Object.keys(d3Random).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Random[k]; - } - }); -}); -Object.keys(d3Scale).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Scale[k]; - } - }); -}); -Object.keys(d3ScaleChromatic).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3ScaleChromatic[k]; - } - }); -}); -Object.keys(d3Selection).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Selection[k]; - } - }); -}); -Object.keys(d3Shape).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Shape[k]; - } - }); -}); -Object.keys(d3Time).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Time[k]; - } - }); -}); -Object.keys(d3TimeFormat).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3TimeFormat[k]; - } - }); -}); -Object.keys(d3Timer).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Timer[k]; - } - }); -}); -Object.keys(d3Transition).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Transition[k]; - } - }); -}); -Object.keys(d3Voronoi).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Voronoi[k]; - } - }); -}); -Object.keys(d3Zoom).forEach(function (k) { - if (k !== 'default') Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Zoom[k]; - } - }); -}); -exports.version = version; - -},{"d3-array":8,"d3-axis":9,"d3-brush":10,"d3-chord":11,"d3-collection":12,"d3-color":13,"d3-contour":14,"d3-dispatch":15,"d3-drag":16,"d3-dsv":17,"d3-ease":18,"d3-fetch":19,"d3-force":20,"d3-format":21,"d3-geo":22,"d3-hierarchy":23,"d3-interpolate":24,"d3-path":25,"d3-polygon":26,"d3-quadtree":27,"d3-random":28,"d3-scale":30,"d3-scale-chromatic":29,"d3-selection":31,"d3-shape":32,"d3-time":34,"d3-time-format":33,"d3-timer":35,"d3-transition":36,"d3-voronoi":37,"d3-zoom":38}],40:[function(require,module,exports){ -(function (process,global){ -!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.commonJsModule=e():"undefined"!=typeof global?global.commonJsModule=e():"undefined"!=typeof self&&(self.commonJsModule=e())}(function(){var define,module,exports;module={exports:(exports={})}; + zoom.transform = function (collection, transform, point) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point); + } else { + selection.interrupt().each(function () { + gesture(this, arguments) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function (selection, k, p) { + zoom.scaleTo(selection, function () { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p); + }; + + zoom.scaleTo = function (selection, k, p) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p); + }; + + zoom.translateBy = function (selection, x, y) { + zoom.transform(selection, function () { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }); + }; + + zoom.translateTo = function (selection, x, y, p) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } -// var fs = require('fs'); + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point) { + transition + .on("start.zoom", function () { + gesture(this, arguments).start(); + }) + .on("interrupt.zoom end.zoom", function () { + gesture(this, arguments).end(); + }) + .tween("zoom", function () { + var that = this, + args = arguments, + g = gesture(that, args), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function (t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { + var l = i(t), k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } -module.exports = { + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } - // Read and transform Lasio Json files to Wellio.js json data format + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.extent = extent.apply(that, args); + this.taps = 0; + } -/** - * File reading utility function. - * @param {string} : file_to_read - The file to open. - * - * @returns {string} : The file's contents as a string. - */ - read_lasio_json_file: function(file_to_read) { - // Configure fs if running from node - let fs = ''; + Gesture.prototype = { + start: function () { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function (key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function () { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function (type) { + d3Selection.customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function wheeled() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = d3Selection.mouse(this); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } - if (process !== 'undefined' && process.versions != null && process.versions.node != null) { - fs = require('fs'); - } + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; - return fs.readFileSync(file_to_read, 'utf8'); - }, - -/** -* The lasio_obj_2_wellio_obj function transforms lasio JSON strings into wellio.js JSON data format in memory and returns it. -* @param {object} lasio_json - A JavaScript object representation of lasio well log format -* -* @example -* let wellio = require('wellio') -* let lasio_json_str = wellio.read_lasio_json_file('lasio.json'); -* let lasio_obj = JSON.parse(lasio_json_str); -* let wellio_obj = wellio.lasio_obj_2_wellio_obj(lasio_obj); -* -* @returns {object} A wellio style JSON object -*/ - lasio_obj_2_wellio_obj: function(lasio_obj) { - - let std_headers = { - 'Version': 'VERSION INFORMATION', - 'Well': 'WELL INFORMATION BLOCK', - 'Curves': 'CURVE INFORMATION BLOCK', - 'Parameter': 'PARAMETER INFORMATION' - }; - - let lasjson = {}; - lasjson["VERSION INFORMATION"] = {}; - lasjson["WELL INFORMATION BLOCK"] = {}; - lasjson["CURVE INFORMATION BLOCK"] = {}; - lasjson["PARAMETER INFORMATION"] = {}; - lasjson["CURVES"] = lasio_obj.data; - - // Example code for adding non-standard headers - for (let item in lasio_obj.metadata) { - if ( !(item in std_headers) ) { - lasjson[item.toUpperCase()] = lasio_obj.metadata[item]; - } - else { - for (let mnemonic in lasio_obj.metadata[item]) { - section = std_headers[item]; - lasjson[section][mnemonic] = { - MNEM: mnemonic, - UNIT: '', - DATA: lasio_obj.metadata[item][mnemonic], - 'DESCRIPTION OF MNEMONIC 1': '', - 'DESCRIPTION OF MNEMONIC 2': '' - }; - } - } - } + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + d3Transition.interrupt(this); + g.start(); + } - return lasjson; - }, + noevent(); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + function wheelidled() { + g.wheel = null; + g.end(); + } + } -/** - * A helper function that proves wellio,js was installed correctly. It merely returns the argument provided to it. For example, "test" as input would return "test". - * @param {*} onelas anything - * @returns Returns the input that was givne as an argument. This is just for testing that wellio was installed correctly. - * @example wellio.returnThing("test") = "test" - */ - returnThing: function(onelas){ - return onelas - }, + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, arguments, true), + v = d3Selection.select(d3Selection.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = d3Selection.mouse(this), + x0 = d3Selection.event.clientX, + y0 = d3Selection.event.clientY; + + d3Drag.dragDisable(d3Selection.event.view); + nopropagation(); + g.mouse = [p, this.__zoom.invert(p)]; + d3Transition.interrupt(this); + g.start(); + + function mousemoved() { + noevent(); + if (!g.moved) { + var dx = d3Selection.event.clientX - x0, dy = d3Selection.event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3Selection.mouse(g.that), g.mouse[1]), g.extent, translateExtent)); + } + function mouseupped() { + v.on("mousemove.zoom mouseup.zoom", null); + d3Drag.dragEnable(d3Selection.event.view, g.moved); + noevent(); + g.end(); + } + } -/** -* Loads a LAS 2.0 file from local files -* @param {string} well_log A string reprepresentatiion of filename of well log to be loaded into memory -* @returns {string} A string representation of the contents of that well log file. It is a single string. -*/ - loadLAS:function(well_log){ - var file = well_log - var fs = ''; + function dblclicked() { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = d3Selection.mouse(this), + p1 = t0.invert(p0), + k1 = t0.k * (d3Selection.event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); + + noevent(); + if (duration > 0) d3Selection.select(this).transition().duration(duration).call(schedule, t1, p0); + else d3Selection.select(this).call(zoom.transform, t1); + } - if (process !== 'undefined' && process.versions != null && process.versions.node != null) { - fs = require('fs'); - } - var contents = fs.readFileSync(file).toString(); - // var contents = fs.readFileSync('test.LAS', 'utf8'); - return contents - }, - //// Converts a LAS 2.0 file already loaded into memory into a json format - /** - * las2jso function converts a LAS 2.0 file already loaded into memory as a string into a JSON object - * @param {string} onelas A string representation of a LAS 2.0 well log file. Typically from the result of the loadLAS function. - * @returns {Object} A JSON object that represents the information that was in the LAS 2.0 well log file but in JSON wellio style format. - */ - las2json: function(onelas){ - //// var lasjson establishes a blank json for holding las 2.0 data. It will look like the example below: - var lasjson = { - "VERSION INFORMATION":{ - "VERS":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, - "WRAP":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} - } - , - "WELL INFORMATION BLOCK":{ - "GENERATED":"", - "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, - "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, - "MNEM_2":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} - } - , - "CURVE INFORMATION BLOCK":{ - "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}, - "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""} - } - , - "PARAMETER INFORMATION":{ - "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, - "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} - } - , - "CURVES":{ - "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], - "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], - } - } - //// Some objects in the json were partially populated in the example above to make understanding the format easier. - //// We'll empty them as a first step - lasjson["VERSION INFORMATION"] = {}; - lasjson["WELL INFORMATION BLOCK"] = {}; - lasjson["CURVE INFORMATION BLOCK"] = {}; - lasjson["PARAMETER INFORMATION"] = {}; - lasjson["CURVES"] = {}; - //// Within the "blocks" ["CURVE INFORMATION BLOCK","PARAMETER INFORMATION", etc.] there are other objects with repeating keys. - //// The variables below will be the building blocks for each of those objects {}. They are initially populated with empty strings as the values. - var ver_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; - var well_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; - var curve_info_obj = {"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}; - var param_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; - //// The las file is read as a txt file. It will first be split into seperate strings based on "~" character which occurs at the top of each "block" - console.log("onelas = ",onelas) - //// Split in to las sections that start with a tilde: ~. - var split1 = onelas.split(/(~[^~]+)/); - console.log("split1 = ",split1) - var vers_str = ""; - var well_info_str = ""; - var curve_info_str = ""; - var param_info_str = ""; - var other = ""; - var curve_str = ""; - - //// As the 'OTHER' block may or may not be present, we have to split by '~' and then look for a substring to make sure we have the right block before we put each into a variable. - for(i = 0; i < split1.length; i++){ - //// Skip blank entries in the split1 array. - if (split1[i].length === 0) { - continue; - } - if(split1[i].includes("~V")){var vers_str = split1[i]} - else if (split1[i].includes("~W")){well_info_str = split1[i]} - else if (split1[i].includes("~C")){curve_info_str = split1[i]} - else if (split1[i].includes("~P")){param_info_str = split1[i]} - else if (split1[i].includes("~O")){other = split1[i]} - else if (split1[i].includes("~A")){curve_str = split1[i]} - else{ - console.log("WARNING: In wellio.js the las2json() function: split1[" + i + "] is not a recognized las section" ) - console.log("elem: [" + split1[i] + "]"); - } - } - - - //// Working with version block first by splitting it by newline and places each item into an array - //// and taking items of array 1 and 2 for vers and wrap - var vers_line = vers_str.split("\n")[1]; - var wrap_line = vers_str.split("\n")[2]; - //// As version information, well information, and parameter information blocks contain objects with the same keys, we can process them using a loop. - //// function to process objects for ver_info_obj, well_inf_obj, and param_info_obj - //// The splitLineofType1() function takes as argument the prototypical object building block and the array of strings for that block - function splitLineofType1(ver_info_obj,arrayString){ - //// splits string (should be a single line from the LAS text) by ":", takes the first item of the resulting array, and then replaces any " " with "". - var vers_line_1half = arrayString.split(":")[0].replace(" ",""); - //// splits the previous string variable by "." into an array of strings. - var vers_line_1half_array = vers_line_1half.split(".") - //// trimming this so I get "UWI" instead of "UWI " - ver_info_obj["MNEM"] = vers_line_1half_array[0].trim() - var unit_and_data = vers_line_1half_array.slice(1,vers_line_1half_array.length); - var unit_and_data_str = " "; - if (unit_and_data.length > 1){ - unit_and_data_str = unit_and_data[0].toString()+"."+unit_and_data[1].toString(); - } - else{ - unit_and_data_str = unit_and_data.toString() - } - var unit = unit_and_data_str[0,5].trim(); - var data = unit_and_data_str.substring(5,unit_and_data_str.length).trim(); - ver_info_obj["DATA"] = data - ver_info_obj["UNIT"] = unit - //// - if(arrayString.split(":")[1].indexOf("-") !== -1){ - ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].split("-")[0].trim() - ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = arrayString.split(":")[1].split("-")[1].replace("\r","").trim() - } - else{ - ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].replace("\r","").trim() - ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = "" - } - return ver_info_obj - }; - lasjson["VERSION INFORMATION"]["WRAP"] = splitLineofType1(Object.assign({}, ver_info_obj),wrap_line); - lasjson["VERSION INFORMATION"]["VERS"] = splitLineofType1(Object.assign({}, ver_info_obj),vers_line); - //// Working with PARAMETER INFORMATION block second by splitting it by newline into an array. - //// This skips the line with the section's title. - var param_line_array = param_info_str.split("\n").slice(1,); - for(i = 0; i < param_line_array.length; i++){ - //// create one object for parameter line - //// Skip empty elements and comment elements that start with '#'. - if(param_line_array[i] != "" && param_line_array[i][0] !== '#'){ - var param_obj_inst = splitLineofType1(Object.assign({}, param_info_obj),param_line_array[i]); - lasjson["PARAMETER INFORMATION"][param_obj_inst["MNEM"]] = param_obj_inst - } - } - //// Working with CURVE INFORMATION BLOCK second by splitting it by newline into an array. - //// This skips the line with the section's title. - var curve_line_array = curve_info_str.split("\n").slice(1,); - for(i = 0; i < curve_line_array.length; i++){ - //// create one object for parameter line - //// Skip empty elements and comment elements that start with '#'. - if(curve_line_array[i] != "" && curve_line_array[i][0] !== '#'){ - var curve_obj_inst = splitLineofType1(Object.assign({}, curve_info_obj),curve_line_array[i]); - lasjson["CURVE INFORMATION BLOCK"][curve_obj_inst["MNEM"]] = curve_obj_inst - } - } - //// Working with WELL INFORMATION BLOCK second by splitting it by newline into an array. - //// This skips the line with the section's title. - var well_line_array = well_info_str.split("\n").slice(1,); - for(i = 0; i < well_line_array.length; i++){ - if(well_line_array[i].includes("Generated")){ - lasjson["WELL INFORMATION BLOCK"]["GENERATED"] = well_line_array[i].replace("\r","").replace("\t"," ").replace("#","") - } - //// create one object for parameter line - //// Skip empty elements and comment elements that start with '#'. - if(well_line_array[i] != "" && well_line_array[i][0] !== '#'){ - var well_obj_inst = splitLineofType1(Object.assign({}, well_info_obj),well_line_array[i]); - lasjson["WELL INFORMATION BLOCK"][well_obj_inst["MNEM"]] = well_obj_inst - } - else{ - console.log("INFO: in else for well_line: " + i) - console.log("elem: [" + well_line_array[i] + "]"); - } - } - //// Work with CURVES section by splitting it by newline into an array, - //// Iterate through the array items populate arrays for each key - var curve_str_array = curve_str.split("\n"); - - //// Get the curve column names from the curve names in the curve information block - //// - //// Per LAS_20_Update_Jan2014.pdf section 5.5 specs for ~C(Curve Information) - //// - This section is manditory. - //// - It desribes the curves and its units in the order they appear in the ~ASCII - //// log data section of the file. - //// - The channels described in this section must be present in the data set. - var curve_names_array_holder = []; - var curve_info = Object.keys(lasjson['CURVE INFORMATION BLOCK']); - - if (curve_info.length > 0){ - for(k = 0; k < curve_info.length; k++){ - col_name = curve_info[k]; - curve_names_array_holder.push(col_name); - lasjson.CURVES[col_name] = []; - } - } - - var curve_data_line_array = []; - - //// start at position 1 instead of 0 is to avoid the curve names - for(j = 1; j < curve_str_array.length; j++){ - //// Skip empty rows. - if (curve_str_array[j].length === 0) { - continue; - } - - var temp_data_array = curve_str_array[j].split(/\s+/); - //// Split can leave an empty element at the beginning, remove it. - if (temp_data_array[0].length === 0){ - temp_data_array.shift(); - } - - //// If data is wrapped continue to accumulate data from rows till - //// we have a data element for each data column - var idx = curve_data_line_array.length; - curve_data_line_array.length = idx + temp_data_array.length; - for (var i = 0; i < temp_data_array.length; i++, idx++) { - curve_data_line_array[idx] = temp_data_array[i]; - } - - if ( - lasjson["VERSION INFORMATION"].WRAP.DATA == 'YES' - && curve_data_line_array.length < curve_names_array_holder.length) - { - continue; - } - - var counter_of_curve_names = 0; - console.log("curve_data_line_array.length = ",curve_data_line_array.length) - console.log("curve_data_line_array = ",curve_data_line_array) - - - var last_curv_data_line_position = curve_data_line_array.length - 1; - console.log("curve_data_line_array[last_curv_data_line_position] = ",curve_data_line_array[last_curv_data_line_position]) - curve_data_line_array[last_curv_data_line_position] = curve_data_line_array[last_curv_data_line_position].replace("\r","") - console.log("curve_data_line_array[last_curv_data_line_position] = ",curve_data_line_array[last_curv_data_line_position]) - for(k = 0; k < curve_data_line_array.length; k++){ - if(curve_data_line_array[k] !== ""){ - lasjson["CURVES"][curve_names_array_holder[counter_of_curve_names]].push(curve_data_line_array[k]) - counter_of_curve_names += 1; - } - } - //// Zero out curve_data_line_array for next set of data - curve_data_line_array = []; - } - console.log(" test: lasjson",lasjson); - return(lasjson) - }, - - //// Given a well already converted into json, returns the available curves - CurveNames: function(well_json){ - var curveNames = Object.keys(well_json["CURVES"]); - return curveNames - }, - //// - VER_block: function(well_json){ - return well_json["VERSION INFORMATION"] - }, - //// Given a well already converted into json, returns the well UWI - UWI: function(well_json){ - return well_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] - }, - //// Given a well already converted into json, returns a given curve name in string format - getCurve(well_json,curve){ - if (!well_json["CURVES"][curve]){ - console.log("in getCurve function, that curve does not exist! =",curve) - return "that curve does not exist! see console.log" - - } else { - return well_json["CURVES"][curve] - } - } -} - - - -return module.exports;}); - -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"_process":2,"fs":1}]},{},[4,6,5,7]); + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = d3Selection.event.touches, + n = touches.length, + g = gesture(this, arguments, d3Selection.event.changedTouches.length === n), + started, i, t, p; + + nopropagation(); + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.touch(this, touches, t.identifier); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchstarting = setTimeout(function () { + touchstarting = null; + }, touchDelay); + d3Transition.interrupt(this); + g.start(); + } + } + + function touchmoved() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = d3Selection.event.changedTouches, + n = touches.length, i, t, p, l; + + noevent(); + if (touchstarting) touchstarting = clearTimeout(touchstarting); + g.taps = 0; + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.touch(this, touches, t.identifier); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = d3Selection.event.changedTouches, + n = touches.length, i, t; + + nopropagation(); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + var p = d3Selection.select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + + zoom.wheelDelta = function (_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; + + zoom.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; + + zoom.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; + + zoom.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function (_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function (_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function (_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function (_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function (_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + return zoom; + } + + exports.zoom = zoom; + exports.zoomIdentity = identity; + exports.zoomTransform = transform; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-dispatch": 15, "d3-drag": 16, "d3-interpolate": 24, "d3-selection": 31, "d3-transition": 36}], + 39: [function (require, module, exports) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', {value: true}); + + var d3Array = require('d3-array'); + var d3Axis = require('d3-axis'); + var d3Brush = require('d3-brush'); + var d3Chord = require('d3-chord'); + var d3Collection = require('d3-collection'); + var d3Color = require('d3-color'); + var d3Contour = require('d3-contour'); + var d3Dispatch = require('d3-dispatch'); + var d3Drag = require('d3-drag'); + var d3Dsv = require('d3-dsv'); + var d3Ease = require('d3-ease'); + var d3Fetch = require('d3-fetch'); + var d3Force = require('d3-force'); + var d3Format = require('d3-format'); + var d3Geo = require('d3-geo'); + var d3Hierarchy = require('d3-hierarchy'); + var d3Interpolate = require('d3-interpolate'); + var d3Path = require('d3-path'); + var d3Polygon = require('d3-polygon'); + var d3Quadtree = require('d3-quadtree'); + var d3Random = require('d3-random'); + var d3Scale = require('d3-scale'); + var d3ScaleChromatic = require('d3-scale-chromatic'); + var d3Selection = require('d3-selection'); + var d3Shape = require('d3-shape'); + var d3Time = require('d3-time'); + var d3TimeFormat = require('d3-time-format'); + var d3Timer = require('d3-timer'); + var d3Transition = require('d3-transition'); + var d3Voronoi = require('d3-voronoi'); + var d3Zoom = require('d3-zoom'); + + var version = "5.15.0"; + + Object.keys(d3Array).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Array[k]; + } + }); + }); + Object.keys(d3Axis).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Axis[k]; + } + }); + }); + Object.keys(d3Brush).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Brush[k]; + } + }); + }); + Object.keys(d3Chord).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Chord[k]; + } + }); + }); + Object.keys(d3Collection).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Collection[k]; + } + }); + }); + Object.keys(d3Color).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Color[k]; + } + }); + }); + Object.keys(d3Contour).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Contour[k]; + } + }); + }); + Object.keys(d3Dispatch).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Dispatch[k]; + } + }); + }); + Object.keys(d3Drag).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Drag[k]; + } + }); + }); + Object.keys(d3Dsv).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Dsv[k]; + } + }); + }); + Object.keys(d3Ease).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Ease[k]; + } + }); + }); + Object.keys(d3Fetch).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Fetch[k]; + } + }); + }); + Object.keys(d3Force).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Force[k]; + } + }); + }); + Object.keys(d3Format).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Format[k]; + } + }); + }); + Object.keys(d3Geo).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Geo[k]; + } + }); + }); + Object.keys(d3Hierarchy).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Hierarchy[k]; + } + }); + }); + Object.keys(d3Interpolate).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Interpolate[k]; + } + }); + }); + Object.keys(d3Path).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Path[k]; + } + }); + }); + Object.keys(d3Polygon).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Polygon[k]; + } + }); + }); + Object.keys(d3Quadtree).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Quadtree[k]; + } + }); + }); + Object.keys(d3Random).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Random[k]; + } + }); + }); + Object.keys(d3Scale).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Scale[k]; + } + }); + }); + Object.keys(d3ScaleChromatic).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3ScaleChromatic[k]; + } + }); + }); + Object.keys(d3Selection).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Selection[k]; + } + }); + }); + Object.keys(d3Shape).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Shape[k]; + } + }); + }); + Object.keys(d3Time).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Time[k]; + } + }); + }); + Object.keys(d3TimeFormat).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3TimeFormat[k]; + } + }); + }); + Object.keys(d3Timer).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Timer[k]; + } + }); + }); + Object.keys(d3Transition).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Transition[k]; + } + }); + }); + Object.keys(d3Voronoi).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Voronoi[k]; + } + }); + }); + Object.keys(d3Zoom).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Zoom[k]; + } + }); + }); + exports.version = version; + + }, { + "d3-array": 8, + "d3-axis": 9, + "d3-brush": 10, + "d3-chord": 11, + "d3-collection": 12, + "d3-color": 13, + "d3-contour": 14, + "d3-dispatch": 15, + "d3-drag": 16, + "d3-dsv": 17, + "d3-ease": 18, + "d3-fetch": 19, + "d3-force": 20, + "d3-format": 21, + "d3-geo": 22, + "d3-hierarchy": 23, + "d3-interpolate": 24, + "d3-path": 25, + "d3-polygon": 26, + "d3-quadtree": 27, + "d3-random": 28, + "d3-scale": 30, + "d3-scale-chromatic": 29, + "d3-selection": 31, + "d3-shape": 32, + "d3-time": 34, + "d3-time-format": 33, + "d3-timer": 35, + "d3-transition": 36, + "d3-voronoi": 37, + "d3-zoom": 38 + }], + 40: [function (require, module, exports) { + (function (process, global) { + !function (e) { + "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.commonJsModule = e() : "undefined" != typeof global ? global.commonJsModule = e() : "undefined" != typeof self && (self.commonJsModule = e()) + }(function () { + var define, module, exports; + module = {exports: (exports = {})}; + +// var fs = require('fs'); + + module.exports = { + + // Read and transform Lasio Json files to Wellio.js json data format + + /** + * File reading utility function. + * @param {string} : file_to_read - The file to open. + * + * @returns {string} : The file's contents as a string. + */ + read_lasio_json_file: function (file_to_read) { + // Configure fs if running from node + let fs = ''; + + if (process !== 'undefined' && process.versions != null && process.versions.node != null) { + fs = require('fs'); + } + + return fs.readFileSync(file_to_read, 'utf8'); + }, + + /** + * The lasio_obj_2_wellio_obj function transforms lasio JSON strings into wellio.js JSON data format in memory and returns it. + * @param {object} lasio_json - A JavaScript object representation of lasio well log format + * + * @example + * let wellio = require('wellio') + * let lasio_json_str = wellio.read_lasio_json_file('lasio.json'); + * let lasio_obj = JSON.parse(lasio_json_str); + * let wellio_obj = wellio.lasio_obj_2_wellio_obj(lasio_obj); + * + * @returns {object} A wellio style JSON object + */ + lasio_obj_2_wellio_obj: function (lasio_obj) { + + let std_headers = { + 'Version': 'VERSION INFORMATION', + 'Well': 'WELL INFORMATION BLOCK', + 'Curves': 'CURVE INFORMATION BLOCK', + 'Parameter': 'PARAMETER INFORMATION' + }; + + let lasjson = {}; + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = lasio_obj.data; + + // Example code for adding non-standard headers + for (let item in lasio_obj.metadata) { + if (!(item in std_headers)) { + lasjson[item.toUpperCase()] = lasio_obj.metadata[item]; + } else { + for (let mnemonic in lasio_obj.metadata[item]) { + section = std_headers[item]; + lasjson[section][mnemonic] = { + MNEM: mnemonic, + UNIT: '', + DATA: lasio_obj.metadata[item][mnemonic], + 'DESCRIPTION OF MNEMONIC 1': '', + 'DESCRIPTION OF MNEMONIC 2': '' + }; + } + } + } + + return lasjson; + }, + + + /** + * A helper function that proves wellio,js was installed correctly. It merely returns the argument provided to it. For example, "test" as input would return "test". + * @param {*} onelas anything + * @returns Returns the input that was givne as an argument. This is just for testing that wellio was installed correctly. + * @example wellio.returnThing("test") = "test" + */ + returnThing: function (onelas) { + return onelas + }, + + + /** + * Loads a LAS 2.0 file from local files + * @param {string} well_log A string reprepresentatiion of filename of well log to be loaded into memory + * @returns {string} A string representation of the contents of that well log file. It is a single string. + */ + loadLAS: function (well_log) { + var file = well_log + var fs = ''; + + if (process !== 'undefined' && process.versions != null && process.versions.node != null) { + fs = require('fs'); + } + var contents = fs.readFileSync(file).toString(); + // var contents = fs.readFileSync('test.LAS', 'utf8'); + return contents + }, + //// Converts a LAS 2.0 file already loaded into memory into a json format + /** + * las2jso function converts a LAS 2.0 file already loaded into memory as a string into a JSON object + * @param {string} onelas A string representation of a LAS 2.0 well log file. Typically from the result of the loadLAS function. + * @returns {Object} A JSON object that represents the information that was in the LAS 2.0 well log file but in JSON wellio style format. + */ + las2json: function (onelas) { + //// var lasjson establishes a blank json for holding las 2.0 data. It will look like the example below: + var lasjson = { + "VERSION INFORMATION": { + "VERS": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "WRAP": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "WELL INFORMATION BLOCK": { + "GENERATED": "", + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_1": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_2": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "CURVE INFORMATION BLOCK": { + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + }, + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + } + } + , + "PARAMETER INFORMATION": { + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_1": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "CURVES": { + "Curve_NAME_ONE": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + "Curve_NAME_ONE": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + } + } + //// Some objects in the json were partially populated in the example above to make understanding the format easier. + //// We'll empty them as a first step + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = {}; + //// Within the "blocks" ["CURVE INFORMATION BLOCK","PARAMETER INFORMATION", etc.] there are other objects with repeating keys. + //// The variables below will be the building blocks for each of those objects {}. They are initially populated with empty strings as the values. + var ver_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + var well_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + var curve_info_obj = { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + }; + var param_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + //// The las file is read as a txt file. It will first be split into seperate strings based on "~" character which occurs at the top of each "block" + console.log("onelas = ", onelas) + //// Split in to las sections that start with a tilde: ~. + var split1 = onelas.split(/(~[^~]+)/); + console.log("split1 = ", split1) + var vers_str = ""; + var well_info_str = ""; + var curve_info_str = ""; + var param_info_str = ""; + var other = ""; + var curve_str = ""; + + //// As the 'OTHER' block may or may not be present, we have to split by '~' and then look for a substring to make sure we have the right block before we put each into a variable. + for (i = 0; i < split1.length; i++) { + //// Skip blank entries in the split1 array. + if (split1[i].length === 0) { + continue; + } + if (split1[i].includes("~V")) { + var vers_str = split1[i] + } else if (split1[i].includes("~W")) { + well_info_str = split1[i] + } else if (split1[i].includes("~C")) { + curve_info_str = split1[i] + } else if (split1[i].includes("~P")) { + param_info_str = split1[i] + } else if (split1[i].includes("~O")) { + other = split1[i] + } else if (split1[i].includes("~A")) { + curve_str = split1[i] + } else { + console.log("WARNING: In wellio.js the las2json() function: split1[" + i + "] is not a recognized las section") + console.log("elem: [" + split1[i] + "]"); + } + } + + + //// Working with version block first by splitting it by newline and places each item into an array + //// and taking items of array 1 and 2 for vers and wrap + var vers_line = vers_str.split("\n")[1]; + var wrap_line = vers_str.split("\n")[2]; + //// As version information, well information, and parameter information blocks contain objects with the same keys, we can process them using a loop. + //// function to process objects for ver_info_obj, well_inf_obj, and param_info_obj + //// The splitLineofType1() function takes as argument the prototypical object building block and the array of strings for that block + function splitLineofType1(ver_info_obj, arrayString) { + //// splits string (should be a single line from the LAS text) by ":", takes the first item of the resulting array, and then replaces any " " with "". + var vers_line_1half = arrayString.split(":")[0].replace(" ", ""); + //// splits the previous string variable by "." into an array of strings. + var vers_line_1half_array = vers_line_1half.split(".") + //// trimming this so I get "UWI" instead of "UWI " + ver_info_obj["MNEM"] = vers_line_1half_array[0].trim() + var unit_and_data = vers_line_1half_array.slice(1, vers_line_1half_array.length); + var unit_and_data_str = " "; + if (unit_and_data.length > 1) { + unit_and_data_str = unit_and_data[0].toString() + "." + unit_and_data[1].toString(); + } else { + unit_and_data_str = unit_and_data.toString() + } + var unit = unit_and_data_str[0, 5].trim(); + var data = unit_and_data_str.substring(5, unit_and_data_str.length).trim(); + ver_info_obj["DATA"] = data + ver_info_obj["UNIT"] = unit + //// + if (arrayString.split(":")[1].indexOf("-") !== -1) { + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].split("-")[0].trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = arrayString.split(":")[1].split("-")[1].replace("\r", "").trim() + } else { + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].replace("\r", "").trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = "" + } + return ver_info_obj + }; + lasjson["VERSION INFORMATION"]["WRAP"] = splitLineofType1(Object.assign({}, ver_info_obj), wrap_line); + lasjson["VERSION INFORMATION"]["VERS"] = splitLineofType1(Object.assign({}, ver_info_obj), vers_line); + //// Working with PARAMETER INFORMATION block second by splitting it by newline into an array. + //// This skips the line with the section's title. + var param_line_array = param_info_str.split("\n").slice(1,); + for (i = 0; i < param_line_array.length; i++) { + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (param_line_array[i] != "" && param_line_array[i][0] !== '#') { + var param_obj_inst = splitLineofType1(Object.assign({}, param_info_obj), param_line_array[i]); + lasjson["PARAMETER INFORMATION"][param_obj_inst["MNEM"]] = param_obj_inst + } + } + //// Working with CURVE INFORMATION BLOCK second by splitting it by newline into an array. + //// This skips the line with the section's title. + var curve_line_array = curve_info_str.split("\n").slice(1,); + for (i = 0; i < curve_line_array.length; i++) { + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (curve_line_array[i] != "" && curve_line_array[i][0] !== '#') { + var curve_obj_inst = splitLineofType1(Object.assign({}, curve_info_obj), curve_line_array[i]); + lasjson["CURVE INFORMATION BLOCK"][curve_obj_inst["MNEM"]] = curve_obj_inst + } + } + //// Working with WELL INFORMATION BLOCK second by splitting it by newline into an array. + //// This skips the line with the section's title. + var well_line_array = well_info_str.split("\n").slice(1,); + for (i = 0; i < well_line_array.length; i++) { + if (well_line_array[i].includes("Generated")) { + lasjson["WELL INFORMATION BLOCK"]["GENERATED"] = well_line_array[i].replace("\r", "").replace("\t", " ").replace("#", "") + } + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (well_line_array[i] != "" && well_line_array[i][0] !== '#') { + var well_obj_inst = splitLineofType1(Object.assign({}, well_info_obj), well_line_array[i]); + lasjson["WELL INFORMATION BLOCK"][well_obj_inst["MNEM"]] = well_obj_inst + } else { + console.log("INFO: in else for well_line: " + i) + console.log("elem: [" + well_line_array[i] + "]"); + } + } + //// Work with CURVES section by splitting it by newline into an array, + //// Iterate through the array items populate arrays for each key + var curve_str_array = curve_str.split("\n"); + + //// Get the curve column names from the curve names in the curve information block + //// + //// Per LAS_20_Update_Jan2014.pdf section 5.5 specs for ~C(Curve Information) + //// - This section is manditory. + //// - It desribes the curves and its units in the order they appear in the ~ASCII + //// log data section of the file. + //// - The channels described in this section must be present in the data set. + var curve_names_array_holder = []; + var curve_info = Object.keys(lasjson['CURVE INFORMATION BLOCK']); + + if (curve_info.length > 0) { + for (k = 0; k < curve_info.length; k++) { + col_name = curve_info[k]; + curve_names_array_holder.push(col_name); + lasjson.CURVES[col_name] = []; + } + } + + var curve_data_line_array = []; + + //// start at position 1 instead of 0 is to avoid the curve names + for (j = 1; j < curve_str_array.length; j++) { + //// Skip empty rows. + if (curve_str_array[j].length === 0) { + continue; + } + + var temp_data_array = curve_str_array[j].split(/\s+/); + //// Split can leave an empty element at the beginning, remove it. + if (temp_data_array[0].length === 0) { + temp_data_array.shift(); + } + + //// If data is wrapped continue to accumulate data from rows till + //// we have a data element for each data column + var idx = curve_data_line_array.length; + curve_data_line_array.length = idx + temp_data_array.length; + for (var i = 0; i < temp_data_array.length; i++, idx++) { + curve_data_line_array[idx] = temp_data_array[i]; + } + + if ( + lasjson["VERSION INFORMATION"].WRAP.DATA == 'YES' + && curve_data_line_array.length < curve_names_array_holder.length) { + continue; + } + + var counter_of_curve_names = 0; + console.log("curve_data_line_array.length = ", curve_data_line_array.length) + console.log("curve_data_line_array = ", curve_data_line_array) + + + var last_curv_data_line_position = curve_data_line_array.length - 1; + console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) + curve_data_line_array[last_curv_data_line_position] = curve_data_line_array[last_curv_data_line_position].replace("\r", "") + console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) + for (k = 0; k < curve_data_line_array.length; k++) { + if (curve_data_line_array[k] !== "") { + lasjson["CURVES"][curve_names_array_holder[counter_of_curve_names]].push(curve_data_line_array[k]) + counter_of_curve_names += 1; + } + } + //// Zero out curve_data_line_array for next set of data + curve_data_line_array = []; + } + console.log(" test: lasjson", lasjson); + return (lasjson) + }, + + //// Given a well already converted into json, returns the available curves + CurveNames: function (well_json) { + var curveNames = Object.keys(well_json["CURVES"]); + return curveNames + }, + //// + VER_block: function (well_json) { + return well_json["VERSION INFORMATION"] + }, + //// Given a well already converted into json, returns the well UWI + UWI: function (well_json) { + return well_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + }, + //// Given a well already converted into json, returns a given curve name in string format + getCurve(well_json, curve) { + if (!well_json["CURVES"][curve]) { + console.log("in getCurve function, that curve does not exist! =", curve) + return "that curve does not exist! see console.log" + + } else { + return well_json["CURVES"][curve] + } + } + } + + + return module.exports; + }); + + }).call(this, require('_process'), typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + }, {"_process": 2, "fs": 1}] +}, {}, [4, 6, 5, 7]); diff --git a/package-lock.json b/package-lock.json index 304d9b2..e62036a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6640,6 +6640,16 @@ "resolved": "https://registry.npmjs.org/wellio/-/wellio-0.1.7.tgz", "integrity": "sha512-J0E39NeUT0PWTrULO4EsP0uOx9HWOfNtJIKFLHsFw3hlRn6pES1YLBQvRIiFFFRN1b4oPzqrxE2d/PEn9oKfOw==" }, + "wellioviz": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/wellioviz/-/wellioviz-0.0.28.tgz", + "integrity": "sha512-gTadYw3WPkNSb6ZRFQyFn9ADL9Y4+Jj5vADcjSUTKHkuawTO2ukV9joEFoaAztrjZnN3yyMef9i6O6jeFor/Ig==", + "requires": { + "d3": "^5.15.0", + "npm": "^6.14.5", + "wellio": "^0.1.7" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index 6bc4fe0..453d357 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "dependencies": { "d3": "^5.15.0", "npm": "^6.14.5", + "wellioviz": "^0.0.28", "wellio": "^0.1.7" }, "devDependencies": { diff --git a/panel_test_app/00_01-01-073-05W5_0-1.json b/panel_test_app/00_01-01-073-05W5_0-1.json new file mode 100644 index 0000000..61d1059 --- /dev/null +++ b/panel_test_app/00_01-01-073-05W5_0-1.json @@ -0,0 +1,6555 @@ +{ + "VERSION INFORMATION": { + "WRAP": { + "MNEM": "WRAP", + "UNIT": "", + "DATA": "NO", + "DESCRIPTION OF MNEMONIC 1": "ONE LINE PER DEPTH STEP", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "VERS": { + "MNEM": "VERS", + "UNIT": "", + "DATA": "2.0", + "DESCRIPTION OF MNEMONIC 1": "CWLS LOG ASCII STANDARD", + "DESCRIPTION OF MNEMONIC 2": "VERSION 2.0" + } + }, + "WELL INFORMATION BLOCK": { + "GENERATED": " Generated from Intellog Unique Number CW_73_75/WELL/2722", + "WELL": { + "MNEM": "WELL", + "UNIT": "", + "DATA": "CHEVRON MGSU 1 MITSUE 01-01", + "DESCRIPTION OF MNEMONIC 1": "Well_name", + "DESCRIPTION OF MNEMONIC 2": "WELL" + }, + "LOC": { + "MNEM": "LOC", + "UNIT": "", + "DATA": "00/01-01-073-05W5/0", + "DESCRIPTION OF MNEMONIC 1": "Location", + "DESCRIPTION OF MNEMONIC 2": "LOCATION" + }, + "UWI": { + "MNEM": "UWI", + "UNIT": "", + "DATA": "00/01-01-073-05W5/0", + "DESCRIPTION OF MNEMONIC 1": "Uwi", + "DESCRIPTION OF MNEMONIC 2": "UNIQUE WELL ID" + }, + "ENTR": { + "MNEM": "ENTR", + "UNIT": "", + "DATA": "JAYE", + "DESCRIPTION OF MNEMONIC 1": "Entered", + "DESCRIPTION OF MNEMONIC 2": "ENTERED BY" + }, + "SRVC": { + "MNEM": "SRVC", + "UNIT": "", + "DATA": "SCHLUMBERGER", + "DESCRIPTION OF MNEMONIC 1": "Scn", + "DESCRIPTION OF MNEMONIC 2": "SERVICE COMPANY" + }, + "DATE": { + "MNEM": "DATE", + "UNIT": "", + "DATA": "23 DEC 86", + "DESCRIPTION OF MNEMONIC 1": "Date", + "DESCRIPTION OF MNEMONIC 2": "LOG DATE" + }, + "STRT": { + "MNEM": "STRT", + "UNIT": "", + "DATA": "390", + "DESCRIPTION OF MNEMONIC 1": "top_depth", + "DESCRIPTION OF MNEMONIC 2": "START DEPTH" + }, + "STOP": { + "MNEM": "STOP", + "UNIT": "", + "DATA": "650", + "DESCRIPTION OF MNEMONIC 1": "bot_depth", + "DESCRIPTION OF MNEMONIC 2": "STOP DEPTH" + }, + "STEP": { + "MNEM": "STEP", + "UNIT": "", + "DATA": "0.25", + "DESCRIPTION OF MNEMONIC 1": "increment", + "DESCRIPTION OF MNEMONIC 2": "STEP LENGTH" + }, + "NULL": { + "MNEM": "NULL", + "UNIT": ".", + "DATA": ".2500", + "DESCRIPTION OF MNEMONIC 1": "NULL Value", + "DESCRIPTION OF MNEMONIC 2": "" + } + }, + "CURVE INFORMATION BLOCK": { + "DEPT": { + "MNEM": "DEPT", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 001 00 00", + "DESCRIPTION OF MNEMONIC 1": "DEPTH", + "DESCRIPTION OF MNEMONIC 2": "DEPTH" + }, + "DPHI": { + "MNEM": "DPHI", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 890 00 00", + "DESCRIPTION OF MNEMONIC 1": "PHID", + "DESCRIPTION OF MNEMONIC 2": "DENSITY POROSITY (SANDSTONE)" + }, + "NPHI": { + "MNEM": "NPHI", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 330 00 00", + "DESCRIPTION OF MNEMONIC 1": "PHIN", + "DESCRIPTION OF MNEMONIC 2": "NEUTRON POROSITY (SANDSTONE)" + }, + "GR": { + "MNEM": "GR", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 310 00 00", + "DESCRIPTION OF MNEMONIC 1": "GR", + "DESCRIPTION OF MNEMONIC 2": "GAMMA RAY" + }, + "CALI": { + "MNEM": "CALI", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 280 01 00", + "DESCRIPTION OF MNEMONIC 1": "CAL", + "DESCRIPTION OF MNEMONIC 2": "CALIPER" + }, + "ILD": { + "MNEM": "ILD", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "", + "DATA": "00 120 00 00", + "DESCRIPTION OF MNEMONIC 1": "RESD", + "DESCRIPTION OF MNEMONIC 2": "DEEP RESISTIVITY (DIL)" + } + }, + "PARAMETER INFORMATION": { + "GL": { + "MNEM": "GL", + "UNIT": "", + "DATA": "583.3", + "DESCRIPTION OF MNEMONIC 1": "gl", + "DESCRIPTION OF MNEMONIC 2": "GROUND LEVEL ELEVATION" + }, + "EREF": { + "MNEM": "EREF", + "UNIT": "", + "DATA": "589", + "DESCRIPTION OF MNEMONIC 1": "kb", + "DESCRIPTION OF MNEMONIC 2": "ELEVATION OF DEPTH REFERENCE" + }, + "DATM": { + "MNEM": "DATM", + "UNIT": "", + "DATA": "583.3", + "DESCRIPTION OF MNEMONIC 1": "datum", + "DESCRIPTION OF MNEMONIC 2": "DATUM ELEVATION" + }, + "TDD": { + "MNEM": "TDD", + "UNIT": "", + "DATA": "733.4", + "DESCRIPTION OF MNEMONIC 1": "tdd", + "DESCRIPTION OF MNEMONIC 2": "TOTAL DEPTH DRILLER" + }, + "RUN": { + "MNEM": "RUN", + "UNIT": "", + "DATA": "ONE", + "DESCRIPTION OF MNEMONIC 1": "Run", + "DESCRIPTION OF MNEMONIC 2": "RUN NUMBER" + }, + "ENG": { + "MNEM": "ENG", + "UNIT": "", + "DATA": "SIMMONS", + "DESCRIPTION OF MNEMONIC 1": "Engineer", + "DESCRIPTION OF MNEMONIC 2": "RECORDING ENGINEER" + }, + "WIT": { + "MNEM": "WIT", + "UNIT": "", + "DATA": "SANK", + "DESCRIPTION OF MNEMONIC 1": "Witness", + "DESCRIPTION OF MNEMONIC 2": "WITNESSED BY" + }, + "BASE": { + "MNEM": "BASE", + "UNIT": "", + "DATA": "S.L", + "DESCRIPTION OF MNEMONIC 1": "Branch", + "DESCRIPTION OF MNEMONIC 2": "HOME BASE OF LOGGING UNIT" + }, + "MUD": { + "MNEM": "MUD", + "UNIT": "", + "DATA": "GEL CHEM", + "DESCRIPTION OF MNEMONIC 1": "Mud_type", + "DESCRIPTION OF MNEMONIC 2": "MUD TYPE" + }, + "MATR": { + "MNEM": "MATR", + "UNIT": "", + "DATA": "SANDSTONE", + "DESCRIPTION OF MNEMONIC 1": "Logunit", + "DESCRIPTION OF MNEMONIC 2": "NEUTRON MATRIX" + }, + "TMAX": { + "MNEM": "TMAX", + "UNIT": "", + "DATA": "41", + "DESCRIPTION OF MNEMONIC 1": "BHT", + "DESCRIPTION OF MNEMONIC 2": "MAXIMUM RECORDED TEMPERATURE" + }, + "BHTD": { + "MNEM": "BHTD", + "UNIT": "", + "DATA": "733.8", + "DESCRIPTION OF MNEMONIC 1": "BHTDEP", + "DESCRIPTION OF MNEMONIC 2": "MAXIMUM RECORDED TEMPERATURE" + }, + "RMT": { + "MNEM": "RMT", + "UNIT": "", + "DATA": "17", + "DESCRIPTION OF MNEMONIC 1": "MDTP", + "DESCRIPTION OF MNEMONIC 2": "TEMPERATURE OF MUD" + }, + "MUDD": { + "MNEM": "MUDD", + "UNIT": "", + "DATA": "1100", + "DESCRIPTION OF MNEMONIC 1": "MWT", + "DESCRIPTION OF MNEMONIC 2": "MUD DENSITY" + }, + "NEUT": { + "MNEM": "NEUT", + "UNIT": "", + "DATA": "1", + "DESCRIPTION OF MNEMONIC 1": "NEUTRON", + "DESCRIPTION OF MNEMONIC 2": "NEUTRON TYPE" + }, + "RESI": { + "MNEM": "RESI", + "UNIT": "", + "DATA": "0", + "DESCRIPTION OF MNEMONIC 1": "RESIST", + "DESCRIPTION OF MNEMONIC 2": "RESISTIVITY TYPE" + }, + "RM": { + "MNEM": "RM", + "UNIT": "", + "DATA": "2.62", + "DESCRIPTION OF MNEMONIC 1": "RM", + "DESCRIPTION OF MNEMONIC 2": "RESISTIVITY OF MUD" + }, + "RMC": { + "MNEM": "RMC", + "UNIT": "", + "DATA": "0", + "DESCRIPTION OF MNEMONIC 1": "RMC", + "DESCRIPTION OF MNEMONIC 2": "RESISTIVITY OF MUD CAKE" + }, + "RMF": { + "MNEM": "RMF", + "UNIT": "", + "DATA": "1.02", + "DESCRIPTION OF MNEMONIC 1": "RMF", + "DESCRIPTION OF MNEMONIC 2": "RESISTIVITY OF MUD FILTRATE" + }, + "SUFT": { + "MNEM": "SUFT", + "UNIT": "", + "DATA": "0", + "DESCRIPTION OF MNEMONIC 1": "SUFT", + "DESCRIPTION OF MNEMONIC 2": "SURFACE TEMPERATURE" + } + }, + "CURVES": { + "DEPTH": [ + "390.000", + "390.250", + "390.500", + "390.750", + "391.000", + "391.250", + "391.500", + "391.750", + "392.000", + "392.250", + "392.500", + "392.750", + "393.000", + "393.250", + "393.500", + "393.750", + "394.000", + "394.250", + "394.500", + "394.750", + "395.000", + "395.250", + "395.500", + "395.750", + "396.000", + "396.250", + "396.500", + "396.750", + "397.000", + "397.250", + "397.500", + "397.750", + "398.000", + "398.250", + "398.500", + "398.750", + "399.000", + "399.250", + "399.500", + "399.750", + "400.000", + "400.250", + "400.500", + "400.750", + "401.000", + "401.250", + "401.500", + "401.750", + "402.000", + "402.250", + "402.500", + "402.750", + "403.000", + "403.250", + "403.500", + "403.750", + "404.000", + "404.250", + "404.500", + "404.750", + "405.000", + "405.250", + "405.500", + "405.750", + "406.000", + "406.250", + "406.500", + "406.750", + "407.000", + "407.250", + "407.500", + "407.750", + "408.000", + "408.250", + "408.500", + "408.750", + "409.000", + "409.250", + "409.500", + "409.750", + "410.000", + "410.250", + "410.500", + "410.750", + "411.000", + "411.250", + "411.500", + "411.750", + "412.000", + "412.250", + "412.500", + "412.750", + "413.000", + "413.250", + "413.500", + "413.750", + "414.000", + "414.250", + "414.500", + "414.750", + "415.000", + "415.250", + "415.500", + "415.750", + "416.000", + "416.250", + "416.500", + "416.750", + "417.000", + "417.250", + "417.500", + "417.750", + "418.000", + "418.250", + "418.500", + "418.750", + "419.000", + "419.250", + "419.500", + "419.750", + "420.000", + "420.250", + "420.500", + "420.750", + "421.000", + "421.250", + "421.500", + "421.750", + "422.000", + "422.250", + "422.500", + "422.750", + "423.000", + "423.250", + "423.500", + "423.750", + "424.000", + "424.250", + "424.500", + "424.750", + "425.000", + "425.250", + "425.500", + "425.750", + "426.000", + "426.250", + "426.500", + "426.750", + "427.000", + "427.250", + "427.500", + "427.750", + "428.000", + "428.250", + "428.500", + "428.750", + "429.000", + "429.250", + "429.500", + "429.750", + "430.000", + "430.250", + "430.500", + "430.750", + "431.000", + "431.250", + "431.500", + "431.750", + "432.000", + "432.250", + "432.500", + "432.750", + "433.000", + "433.250", + "433.500", + "433.750", + "434.000", + "434.250", + "434.500", + "434.750", + "435.000", + "435.250", + "435.500", + "435.750", + "436.000", + "436.250", + "436.500", + "436.750", + "437.000", + "437.250", + "437.500", + "437.750", + "438.000", + "438.250", + "438.500", + "438.750", + "439.000", + "439.250", + "439.500", + "439.750", + "440.000", + "440.250", + "440.500", + "440.750", + "441.000", + "441.250", + "441.500", + "441.750", + "442.000", + "442.250", + "442.500", + "442.750", + "443.000", + "443.250", + "443.500", + "443.750", + "444.000", + "444.250", + "444.500", + "444.750", + "445.000", + "445.250", + "445.500", + "445.750", + "446.000", + "446.250", + "446.500", + "446.750", + "447.000", + "447.250", + "447.500", + "447.750", + "448.000", + "448.250", + "448.500", + "448.750", + "449.000", + "449.250", + "449.500", + "449.750", + "450.000", + "450.250", + "450.500", + "450.750", + "451.000", + "451.250", + "451.500", + "451.750", + "452.000", + "452.250", + "452.500", + "452.750", + "453.000", + "453.250", + "453.500", + "453.750", + "454.000", + "454.250", + "454.500", + "454.750", + "455.000", + "455.250", + "455.500", + "455.750", + "456.000", + "456.250", + "456.500", + "456.750", + "457.000", + "457.250", + "457.500", + "457.750", + "458.000", + "458.250", + "458.500", + "458.750", + "459.000", + "459.250", + "459.500", + "459.750", + "460.000", + "460.250", + "460.500", + "460.750", + "461.000", + "461.250", + "461.500", + "461.750", + "462.000", + "462.250", + "462.500", + "462.750", + "463.000", + "463.250", + "463.500", + "463.750", + "464.000", + "464.250", + "464.500", + "464.750", + "465.000", + "465.250", + "465.500", + "465.750", + "466.000", + "466.250", + "466.500", + "466.750", + "467.000", + "467.250", + "467.500", + "467.750", + "468.000", + "468.250", + "468.500", + "468.750", + "469.000", + "469.250", + "469.500", + "469.750", + "470.000", + "470.250", + "470.500", + "470.750", + "471.000", + "471.250", + "471.500", + "471.750", + "472.000", + "472.250", + "472.500", + "472.750", + "473.000", + "473.250", + "473.500", + "473.750", + "474.000", + "474.250", + "474.500", + "474.750", + "475.000", + "475.250", + "475.500", + "475.750", + "476.000", + "476.250", + "476.500", + "476.750", + "477.000", + "477.250", + "477.500", + "477.750", + "478.000", + "478.250", + "478.500", + "478.750", + "479.000", + "479.250", + "479.500", + "479.750", + "480.000", + "480.250", + "480.500", + "480.750", + "481.000", + "481.250", + "481.500", + "481.750", + "482.000", + "482.250", + "482.500", + "482.750", + "483.000", + "483.250", + "483.500", + "483.750", + "484.000", + "484.250", + "484.500", + "484.750", + "485.000", + "485.250", + "485.500", + "485.750", + "486.000", + "486.250", + "486.500", + "486.750", + "487.000", + "487.250", + "487.500", + "487.750", + "488.000", + "488.250", + "488.500", + "488.750", + "489.000", + "489.250", + "489.500", + "489.750", + "490.000", + "490.250", + "490.500", + "490.750", + "491.000", + "491.250", + "491.500", + "491.750", + "492.000", + "492.250", + "492.500", + "492.750", + "493.000", + "493.250", + "493.500", + "493.750", + "494.000", + "494.250", + "494.500", + "494.750", + "495.000", + "495.250", + "495.500", + "495.750", + "496.000", + "496.250", + "496.500", + "496.750", + "497.000", + "497.250", + "497.500", + "497.750", + "498.000", + "498.250", + "498.500", + "498.750", + "499.000", + "499.250", + "499.500", + "499.750", + "500.000", + "500.250", + "500.500", + "500.750", + "501.000", + "501.250", + "501.500", + "501.750", + "502.000", + "502.250", + "502.500", + "502.750", + "503.000", + "503.250", + "503.500", + "503.750", + "504.000", + "504.250", + "504.500", + "504.750", + "505.000", + "505.250", + "505.500", + "505.750", + "506.000", + "506.250", + "506.500", + "506.750", + "507.000", + "507.250", + "507.500", + "507.750", + "508.000", + "508.250", + "508.500", + "508.750", + "509.000", + "509.250", + "509.500", + "509.750", + "510.000", + "510.250", + "510.500", + "510.750", + "511.000", + "511.250", + "511.500", + "511.750", + "512.000", + "512.250", + "512.500", + "512.750", + "513.000", + "513.250", + "513.500", + "513.750", + "514.000", + "514.250", + "514.500", + "514.750", + "515.000", + "515.250", + "515.500", + "515.750", + "516.000", + "516.250", + "516.500", + "516.750", + "517.000", + "517.250", + "517.500", + "517.750", + "518.000", + "518.250", + "518.500", + "518.750", + "519.000", + "519.250", + "519.500", + "519.750", + "520.000", + "520.250", + "520.500", + "520.750", + "521.000", + "521.250", + "521.500", + "521.750", + "522.000", + "522.250", + "522.500", + "522.750", + "523.000", + "523.250", + "523.500", + "523.750", + "524.000", + "524.250", + "524.500", + "524.750", + "525.000", + "525.250", + "525.500", + "525.750", + "526.000", + "526.250", + "526.500", + "526.750", + "527.000", + "527.250", + "527.500", + "527.750", + "528.000", + "528.250", + "528.500", + "528.750", + "529.000", + "529.250", + "529.500", + "529.750", + "530.000", + "530.250", + "530.500", + "530.750", + "531.000", + "531.250", + "531.500", + "531.750", + "532.000", + "532.250", + "532.500", + "532.750", + "533.000", + "533.250", + "533.500", + "533.750", + "534.000", + "534.250", + "534.500", + "534.750", + "535.000", + "535.250", + "535.500", + "535.750", + "536.000", + "536.250", + "536.500", + "536.750", + "537.000", + "537.250", + "537.500", + "537.750", + "538.000", + "538.250", + "538.500", + "538.750", + "539.000", + "539.250", + "539.500", + "539.750", + "540.000", + "540.250", + "540.500", + "540.750", + "541.000", + "541.250", + "541.500", + "541.750", + "542.000", + "542.250", + "542.500", + "542.750", + "543.000", + "543.250", + "543.500", + "543.750", + "544.000", + "544.250", + "544.500", + "544.750", + "545.000", + "545.250", + "545.500", + "545.750", + "546.000", + "546.250", + "546.500", + "546.750", + "547.000", + "547.250", + "547.500", + "547.750", + "548.000", + "548.250", + "548.500", + "548.750", + "549.000", + "549.250", + "549.500", + "549.750", + "550.000", + "550.250", + "550.500", + "550.750", + "551.000", + "551.250", + "551.500", + "551.750", + "552.000", + "552.250", + "552.500", + "552.750", + "553.000", + "553.250", + "553.500", + "553.750", + "554.000", + "554.250", + "554.500", + "554.750", + "555.000", + "555.250", + "555.500", + "555.750", + "556.000", + "556.250", + "556.500", + "556.750", + "557.000", + "557.250", + "557.500", + "557.750", + "558.000", + "558.250", + "558.500", + "558.750", + "559.000", + "559.250", + "559.500", + "559.750", + "560.000", + "560.250", + "560.500", + "560.750", + "561.000", + "561.250", + "561.500", + "561.750", + "562.000", + "562.250", + "562.500", + "562.750", + "563.000", + "563.250", + "563.500", + "563.750", + "564.000", + "564.250", + "564.500", + "564.750", + "565.000", + "565.250", + "565.500", + "565.750", + "566.000", + "566.250", + "566.500", + "566.750", + "567.000", + "567.250", + "567.500", + "567.750", + "568.000", + "568.250", + "568.500", + "568.750", + "569.000", + "569.250", + "569.500", + "569.750", + "570.000", + "570.250", + "570.500", + "570.750", + "571.000", + "571.250", + "571.500", + "571.750", + "572.000", + "572.250", + "572.500", + "572.750", + "573.000", + "573.250", + "573.500", + "573.750", + "574.000", + "574.250", + "574.500", + "574.750", + "575.000", + "575.250", + "575.500", + "575.750", + "576.000", + "576.250", + "576.500", + "576.750", + "577.000", + "577.250", + "577.500", + "577.750", + "578.000", + "578.250", + "578.500", + "578.750", + "579.000", + "579.250", + "579.500", + "579.750", + "580.000", + "580.250", + "580.500", + "580.750", + "581.000", + "581.250", + "581.500", + "581.750", + "582.000", + "582.250", + "582.500", + "582.750", + "583.000", + "583.250", + "583.500", + "583.750", + "584.000", + "584.250", + "584.500", + "584.750", + "585.000", + "585.250", + "585.500", + "585.750", + "586.000", + "586.250", + "586.500", + "586.750", + "587.000", + "587.250", + "587.500", + "587.750", + "588.000", + "588.250", + "588.500", + "588.750", + "589.000", + "589.250", + "589.500", + "589.750", + "590.000", + "590.250", + "590.500", + "590.750", + "591.000", + "591.250", + "591.500", + "591.750", + "592.000", + "592.250", + "592.500", + "592.750", + "593.000", + "593.250", + "593.500", + "593.750", + "594.000", + "594.250", + "594.500", + "594.750", + "595.000", + "595.250", + "595.500", + "595.750", + "596.000", + "596.250", + "596.500", + "596.750", + "597.000", + "597.250", + "597.500", + "597.750", + "598.000", + "598.250", + "598.500", + "598.750", + "599.000", + "599.250", + "599.500", + "599.750", + "600.000", + "600.250", + "600.500", + "600.750", + "601.000", + "601.250", + "601.500", + "601.750", + "602.000", + "602.250", + "602.500", + "602.750", + "603.000", + "603.250", + "603.500", + "603.750", + "604.000", + "604.250", + "604.500", + "604.750", + "605.000", + "605.250", + "605.500", + "605.750", + "606.000", + "606.250", + "606.500", + "606.750", + "607.000", + "607.250", + "607.500", + "607.750", + "608.000", + "608.250", + "608.500", + "608.750", + "609.000", + "609.250", + "609.500", + "609.750", + "610.000", + "610.250", + "610.500", + "610.750", + "611.000", + "611.250", + "611.500", + "611.750", + "612.000", + "612.250", + "612.500", + "612.750", + "613.000", + "613.250", + "613.500", + "613.750", + "614.000", + "614.250", + "614.500", + "614.750", + "615.000", + "615.250", + "615.500", + "615.750", + "616.000", + "616.250", + "616.500", + "616.750", + "617.000", + "617.250", + "617.500", + "617.750", + "618.000", + "618.250", + "618.500", + "618.750", + "619.000", + "619.250", + "619.500", + "619.750", + "620.000", + "620.250", + "620.500", + "620.750", + "621.000", + "621.250", + "621.500", + "621.750", + "622.000", + "622.250", + "622.500", + "622.750", + "623.000", + "623.250", + "623.500", + "623.750", + "624.000", + "624.250", + "624.500", + "624.750", + "625.000", + "625.250", + "625.500", + "625.750", + "626.000", + "626.250", + "626.500", + "626.750", + "627.000", + "627.250", + "627.500", + "627.750", + "628.000", + "628.250", + "628.500", + "628.750", + "629.000", + "629.250", + "629.500", + "629.750", + "630.000", + "630.250", + "630.500", + "630.750", + "631.000", + "631.250", + "631.500", + "631.750", + "632.000", + "632.250", + "632.500", + "632.750", + "633.000", + "633.250", + "633.500", + "633.750", + "634.000", + "634.250", + "634.500", + "634.750", + "635.000", + "635.250", + "635.500", + "635.750", + "636.000", + "636.250", + "636.500", + "636.750", + "637.000", + "637.250", + "637.500", + "637.750", + "638.000", + "638.250", + "638.500", + "638.750", + "639.000", + "639.250", + "639.500", + "639.750", + "640.000", + "640.250", + "640.500", + "640.750", + "641.000", + "641.250", + "641.500", + "641.750", + "642.000", + "642.250", + "642.500", + "642.750", + "643.000", + "643.250", + "643.500", + "643.750", + "644.000", + "644.250", + "644.500", + "644.750", + "645.000", + "645.250", + "645.500", + "645.750", + "646.000", + "646.250", + "646.500", + "646.750", + "647.000", + "647.250", + "647.500", + "647.750", + "648.000", + "648.250", + "648.500", + "648.750", + "649.000", + "649.250", + "649.500", + "649.750", + "650.000" + ], + "PHID": [ + "0.199", + "0.208", + "0.246", + "0.266", + "0.287", + "0.288", + "0.241", + "0.215", + "0.190", + "0.219", + "0.269", + "0.316", + "0.299", + "0.241", + "0.216", + "0.293", + "0.374", + "0.454", + "0.508", + "0.553", + "0.535", + "0.507", + "0.422", + "0.344", + "0.332", + "0.278", + "0.230", + "0.208", + "0.235", + "0.234", + "0.227", + "0.237", + "0.247", + "0.250", + "0.253", + "0.264", + "0.282", + "0.304", + "0.332", + "0.501", + "0.507", + "0.289", + "0.252", + "0.248", + "0.252", + "0.252", + "0.260", + "0.270", + "0.255", + "0.209", + "0.191", + "0.103", + "0.078", + "0.095", + "0.186", + "0.223", + "0.244", + "0.268", + "0.281", + "0.284", + "0.283", + "0.286", + "0.309", + "0.364", + "0.548", + "0.498", + "0.413", + "0.329", + "0.287", + "0.283", + "0.279", + "0.284", + "0.302", + "0.320", + "0.323", + "0.293", + "0.254", + "0.219", + "0.215", + "0.233", + "0.250", + "0.279", + "0.279", + "0.275", + "0.292", + "0.314", + "0.324", + "0.315", + "0.281", + "0.247", + "0.316", + "0.354", + "0.349", + "0.325", + "0.337", + "0.339", + "0.324", + "0.264", + "0.223", + "0.223", + "0.246", + "0.260", + "0.230", + "0.205", + "0.190", + "0.263", + "0.308", + "0.307", + "0.285", + "0.266", + "0.251", + "0.220", + "0.208", + "0.213", + "0.208", + "0.200", + "0.201", + "0.214", + "0.268", + "0.406", + "0.517", + "0.570", + "0.612", + "0.645", + "0.389", + "0.322", + "0.297", + "0.289", + "0.296", + "0.303", + "0.309", + "0.313", + "0.313", + "0.312", + "0.306", + "0.294", + "0.288", + "0.269", + "0.242", + "0.221", + "0.267", + "0.292", + "0.308", + "0.323", + "0.341", + "0.348", + "0.343", + "0.340", + "0.337", + "0.334", + "0.335", + "0.344", + "0.351", + "0.345", + "0.341", + "0.344", + "0.352", + "0.359", + "0.359", + "0.347", + "0.344", + "0.342", + "0.334", + "0.329", + "0.335", + "0.339", + "0.340", + "0.330", + "0.336", + "0.339", + "0.334", + "0.331", + "0.336", + "0.350", + "0.349", + "0.332", + "0.318", + "0.281", + "0.436", + "0.476", + "0.476", + "0.432", + "0.330", + "0.297", + "0.281", + "0.264", + "0.243", + "0.264", + "0.310", + "0.328", + "0.328", + "0.319", + "0.302", + "0.316", + "0.321", + "0.322", + "0.319", + "0.310", + "0.294", + "0.270", + "0.260", + "0.314", + "0.331", + "0.337", + "0.344", + "0.352", + "0.364", + "0.351", + "0.349", + "0.347", + "0.334", + "0.326", + "0.331", + "0.349", + "0.358", + "0.354", + "0.344", + "0.334", + "0.321", + "0.311", + "0.318", + "0.330", + "0.339", + "0.346", + "0.339", + "0.315", + "0.282", + "0.237", + "0.095", + "0.039", + "0.075", + "0.183", + "0.274", + "0.309", + "0.341", + "0.356", + "0.350", + "0.342", + "0.338", + "0.335", + "0.331", + "0.335", + "0.344", + "0.333", + "0.324", + "0.335", + "0.358", + "0.353", + "0.333", + "0.334", + "0.333", + "0.332", + "0.341", + "0.348", + "0.349", + "0.341", + "0.329", + "0.325", + "0.324", + "0.327", + "0.338", + "0.349", + "0.353", + "0.351", + "0.339", + "0.333", + "0.332", + "0.342", + "0.599", + "0.574", + "0.533", + "0.259", + "0.215", + "0.224", + "0.246", + "0.260", + "0.265", + "0.253", + "0.257", + "0.276", + "0.302", + "0.317", + "0.313", + "0.306", + "0.301", + "0.300", + "0.302", + "0.303", + "0.305", + "0.306", + "0.306", + "0.306", + "0.307", + "0.309", + "0.312", + "0.316", + "0.321", + "0.322", + "0.321", + "0.320", + "0.319", + "0.316", + "0.309", + "0.300", + "0.268", + "0.182", + "0.081", + "0.038", + "0.060", + "0.118", + "0.222", + "0.268", + "0.298", + "0.288", + "0.302", + "0.326", + "0.327", + "0.314", + "0.296", + "0.245", + "0.141", + "0.061", + "0.022", + "0.001", + "0.008", + "0.040", + "0.187", + "0.253", + "0.282", + "0.306", + "0.309", + "0.299", + "0.299", + "0.302", + "0.308", + "0.310", + "0.313", + "0.305", + "0.284", + "0.262", + "0.235", + "0.218", + "0.222", + "0.235", + "0.250", + "0.259", + "0.256", + "0.254", + "0.256", + "0.256", + "0.259", + "0.269", + "0.250", + "0.244", + "0.251", + "0.202", + "0.182", + "0.181", + "0.228", + "0.258", + "0.280", + "0.245", + "0.202", + "0.215", + "0.245", + "0.266", + "0.274", + "0.286", + "0.307", + "0.312", + "0.303", + "0.295", + "0.298", + "0.303", + "0.309", + "0.307", + "0.306", + "0.303", + "0.291", + "0.278", + "0.268", + "0.275", + "0.289", + "0.298", + "0.307", + "0.316", + "0.325", + "0.323", + "0.318", + "0.310", + "0.303", + "0.291", + "0.314", + "0.319", + "0.316", + "0.306", + "0.294", + "0.286", + "0.302", + "0.307", + "0.305", + "0.300", + "0.288", + "0.265", + "0.192", + "0.141", + "0.091", + "0.142", + "0.206", + "0.255", + "0.276", + "0.262", + "0.240", + "0.234", + "0.257", + "0.260", + "0.254", + "0.250", + "0.252", + "0.251", + "0.250", + "0.251", + "0.248", + "0.252", + "0.244", + "0.255", + "0.251", + "0.241", + "0.229", + "0.220", + "0.209", + "0.200", + "0.205", + "0.224", + "0.232", + "0.239", + "0.243", + "0.229", + "0.215", + "0.207", + "0.204", + "0.197", + "0.191", + "0.191", + "0.218", + "0.215", + "0.205", + "0.218", + "0.255", + "0.272", + "0.283", + "0.296", + "0.308", + "0.315", + "0.308", + "0.291", + "0.274", + "0.260", + "0.267", + "0.263", + "0.248", + "0.244", + "0.236", + "0.223", + "0.207", + "0.196", + "0.214", + "0.220", + "0.212", + "0.202", + "0.218", + "0.242", + "0.293", + "0.328", + "0.334", + "0.330", + "0.329", + "0.331", + "0.333", + "0.335", + "0.340", + "0.341", + "0.335", + "0.329", + "0.323", + "0.322", + "0.325", + "0.327", + "0.325", + "0.316", + "0.306", + "0.300", + "0.301", + "0.306", + "0.311", + "0.313", + "0.315", + "0.318", + "0.317", + "0.316", + "0.316", + "0.317", + "0.317", + "0.319", + "0.320", + "0.323", + "0.325", + "0.326", + "0.324", + "0.321", + "0.320", + "0.321", + "0.324", + "0.326", + "0.327", + "0.326", + "0.329", + "0.330", + "0.328", + "0.333", + "0.336", + "0.337", + "0.335", + "0.331", + "0.326", + "0.324", + "0.323", + "0.321", + "0.321", + "0.321", + "0.320", + "0.325", + "0.330", + "0.327", + "0.321", + "0.319", + "0.309", + "0.265", + "0.223", + "0.135", + "0.141", + "0.162", + "0.188", + "0.221", + "0.273", + "0.305", + "0.293", + "0.277", + "0.262", + "0.247", + "0.270", + "0.290", + "0.304", + "0.294", + "0.278", + "0.262", + "0.258", + "0.255", + "0.218", + "0.212", + "0.232", + "0.258", + "0.261", + "0.261", + "0.247", + "0.238", + "0.224", + "0.211", + "0.215", + "0.224", + "0.221", + "0.227", + "0.240", + "0.233", + "0.215", + "0.179", + "0.188", + "0.218", + "0.190", + "0.132", + "0.074", + "0.160", + "0.199", + "0.210", + "0.200", + "0.201", + "0.213", + "0.221", + "0.222", + "0.215", + "0.233", + "0.232", + "0.218", + "0.200", + "0.183", + "0.197", + "0.215", + "0.225", + "0.236", + "0.236", + "0.247", + "0.235", + "0.200", + "0.199", + "0.222", + "0.241", + "0.264", + "0.250", + "0.238", + "0.225", + "0.218", + "0.220", + "0.219", + "0.217", + "0.214", + "0.212", + "0.211", + "0.213", + "0.217", + "0.221", + "0.220", + "0.219", + "0.216", + "0.208", + "0.199", + "0.192", + "0.186", + "0.190", + "0.193", + "0.199", + "0.213", + "0.226", + "0.239", + "0.251", + "0.267", + "0.254", + "0.247", + "0.238", + "0.229", + "0.218", + "0.229", + "0.201", + "0.175", + "0.145", + "0.160", + "0.184", + "0.195", + "0.186", + "0.190", + "0.180", + "0.176", + "0.183", + "0.181", + "0.173", + "0.169", + "0.176", + "0.183", + "0.191", + "0.191", + "0.184", + "0.177", + "0.185", + "0.191", + "0.188", + "0.179", + "0.178", + "0.195", + "0.226", + "0.261", + "0.234", + "0.219", + "0.209", + "0.206", + "0.206", + "0.197", + "0.176", + "0.186", + "0.204", + "0.230", + "0.250", + "0.263", + "0.253", + "0.260", + "0.262", + "0.249", + "0.237", + "0.226", + "0.217", + "0.213", + "0.211", + "0.205", + "0.189", + "0.189", + "0.191", + "0.189", + "0.187", + "0.187", + "0.188", + "0.199", + "0.207", + "0.198", + "0.186", + "0.200", + "0.217", + "0.234", + "0.235", + "0.228", + "0.176", + "0.093", + "0.143", + "0.199", + "0.224", + "0.238", + "0.260", + "0.289", + "0.298", + "0.268", + "0.248", + "0.237", + "0.229", + "0.217", + "0.192", + "0.206", + "0.230", + "0.246", + "0.256", + "0.257", + "0.249", + "0.233", + "0.213", + "0.226", + "0.238", + "0.245", + "0.253", + "0.238", + "0.208", + "0.187", + "0.187", + "0.206", + "0.222", + "0.234", + "0.214", + "0.216", + "0.214", + "0.167", + "0.126", + "0.170", + "0.212", + "0.227", + "0.237", + "0.227", + "0.210", + "0.191", + "0.173", + "0.186", + "0.191", + "0.187", + "0.179", + "0.170", + "0.156", + "0.177", + "0.188", + "0.196", + "0.206", + "0.196", + "0.181", + "0.164", + "0.173", + "0.159", + "0.190", + "0.214", + "0.210", + "0.197", + "0.206", + "0.213", + "0.204", + "0.184", + "0.159", + "0.116", + "0.096", + "0.120", + "0.132", + "0.135", + "0.162", + "0.179", + "0.205", + "0.192", + "0.185", + "0.178", + "0.166", + "0.149", + "0.138", + "0.150", + "0.149", + "0.145", + "0.132", + "0.143", + "0.184", + "0.177", + "0.156", + "0.122", + "0.124", + "0.148", + "0.165", + "0.136", + "0.113", + "0.099", + "0.085", + "0.072", + "0.075", + "0.087", + "0.111", + "0.137", + "0.188", + "0.247", + "0.331", + "0.370", + "0.435", + "0.490", + "0.580", + "0.562", + "0.551", + "0.587", + "0.528", + "0.483", + "0.563", + "0.642", + "0.367", + "0.180", + "0.219", + "0.269", + "0.310", + "0.280", + "0.221", + "0.187", + "0.210", + "0.238", + "0.256", + "0.267", + "0.242", + "0.214", + "0.183", + "0.151", + "0.255", + "0.314", + "0.349", + "0.358", + "0.338", + "0.298", + "0.280", + "0.257", + "0.223", + "0.129", + "0.027", + "0.320", + "0.342", + "0.303", + "0.212", + "0.156", + "0.107", + "0.108", + "0.119", + "0.135", + "0.150", + "0.137", + "0.160", + "0.187", + "0.174", + "0.191", + "0.212", + "0.204", + "0.199", + "0.295", + "0.388", + "0.606", + "0.662", + "0.492", + "0.333", + "0.271", + "0.199", + "0.180", + "0.208", + "0.224", + "0.211", + "0.189", + "0.168", + "0.144", + "0.172", + "0.290", + "0.379", + "0.296", + "0.217", + "0.175", + "0.202", + "0.225", + "0.238", + "0.250", + "0.240", + "0.227", + "0.248", + "0.267", + "0.263", + "0.243", + "0.222", + "0.249", + "0.237", + "0.196", + "0.165", + "0.143", + "0.139", + "0.152", + "0.163", + "0.134", + "0.088", + "0.070", + "0.120", + "0.166", + "0.170", + "0.159", + "0.150", + "0.152", + "0.169", + "0.179", + "0.150", + "0.154", + "0.164", + "0.174", + "0.181", + "0.189", + "0.198", + "0.203", + "0.209", + "0.214", + "0.193", + "0.092", + "0.058", + "0.031", + "0.016", + "0.047", + "0.094", + "0.111", + "0.141", + "0.170", + "0.185", + "0.196", + "0.209", + "0.201", + "0.184", + "0.198", + "0.208", + "0.193", + "0.169", + "0.136", + "0.120", + "0.268", + "0.364", + "0.476", + "0.385", + "0.352", + "0.303", + "0.276", + "0.249", + "0.225", + "0.196", + "0.147", + "0.096", + "0.172", + "0.199", + "0.231", + "0.264", + "0.254", + "0.244", + "0.230", + "0.221", + "0.325", + "0.490", + "0.519", + "0.768", + "0.734", + "0.729", + "0.783", + "0.703", + "0.773", + "0.810", + "0.461", + "0.323", + "0.256", + "0.241", + "0.209", + "0.232", + "0.235", + "0.231", + "0.226", + "0.222", + "0.241", + "0.321", + "0.435", + "0.451", + "0.488", + "0.315", + "0.251", + "0.198", + "0.185", + "0.177", + "0.163", + "0.152", + "0.161", + "0.172", + "0.183", + "0.201", + "0.198", + "0.206", + "0.310", + "0.336", + "0.332", + "0.509", + "0.595", + "0.340", + "0.224", + "0.160", + "0.004", + "0.010", + "0.018", + "0.021", + "0.015", + "0.003", + "-0.005", + "-0.005", + "0.009", + "0.019", + "0.014", + "0.005", + "-0.011", + "-0.010", + "-0.004", + "0.000", + "0.007", + "0.017", + "0.023", + "0.028", + "0.036" + ], + "PHIN": [ + "0.457", + "0.456", + "0.452", + "0.475", + "0.484", + "0.474", + "0.461", + "0.471", + "0.448", + "0.478", + "0.552", + "0.458", + "0.429", + "0.385", + "0.329", + "0.355", + "0.481", + "0.536", + "0.565", + "0.578", + "0.573", + "0.538", + "0.458", + "0.444", + "0.440", + "0.440", + "0.435", + "0.418", + "0.424", + "0.477", + "0.464", + "0.419", + "0.430", + "0.441", + "0.439", + "0.426", + "0.404", + "0.467", + "0.487", + "0.510", + "0.480", + "0.442", + "0.428", + "0.408", + "0.435", + "0.452", + "0.436", + "0.426", + "0.411", + "0.368", + "0.304", + "0.257", + "0.340", + "0.380", + "0.421", + "0.401", + "0.402", + "0.408", + "0.404", + "0.394", + "0.391", + "0.380", + "0.466", + "0.519", + "0.486", + "0.432", + "0.386", + "0.381", + "0.390", + "0.408", + "0.430", + "0.432", + "0.414", + "0.392", + "0.369", + "0.366", + "0.369", + "0.370", + "0.401", + "0.408", + "0.397", + "0.403", + "0.393", + "0.361", + "0.338", + "0.361", + "0.375", + "0.361", + "0.336", + "0.343", + "0.383", + "0.509", + "0.500", + "0.528", + "0.521", + "0.413", + "0.391", + "0.403", + "0.374", + "0.352", + "0.331", + "0.314", + "0.306", + "0.340", + "0.354", + "0.358", + "0.345", + "0.350", + "0.359", + "0.358", + "0.361", + "0.383", + "0.421", + "0.435", + "0.410", + "0.385", + "0.365", + "0.391", + "0.439", + "0.514", + "0.564", + "0.601", + "0.648", + "0.672", + "0.512", + "0.436", + "0.421", + "0.416", + "0.436", + "0.451", + "0.443", + "0.435", + "0.444", + "0.449", + "0.421", + "0.435", + "0.451", + "0.454", + "0.445", + "0.426", + "0.451", + "0.487", + "0.477", + "0.449", + "0.428", + "0.398", + "0.431", + "0.452", + "0.417", + "0.405", + "0.399", + "0.393", + "0.404", + "0.418", + "0.433", + "0.452", + "0.461", + "0.434", + "0.421", + "0.429", + "0.450", + "0.453", + "0.419", + "0.437", + "0.415", + "0.381", + "0.400", + "0.419", + "0.407", + "0.417", + "0.426", + "0.428", + "0.421", + "0.412", + "0.407", + "0.401", + "0.402", + "0.416", + "0.498", + "0.546", + "0.575", + "0.463", + "0.435", + "0.453", + "0.456", + "0.455", + "0.448", + "0.430", + "0.406", + "0.384", + "0.397", + "0.402", + "0.419", + "0.416", + "0.425", + "0.418", + "0.405", + "0.395", + "0.427", + "0.458", + "0.463", + "0.407", + "0.360", + "0.381", + "0.434", + "0.438", + "0.417", + "0.415", + "0.400", + "0.369", + "0.391", + "0.412", + "0.428", + "0.427", + "0.411", + "0.397", + "0.409", + "0.398", + "0.391", + "0.412", + "0.412", + "0.393", + "0.404", + "0.399", + "0.401", + "0.435", + "0.368", + "0.317", + "0.152", + "0.179", + "0.268", + "0.358", + "0.389", + "0.380", + "0.396", + "0.392", + "0.389", + "0.402", + "0.414", + "0.393", + "0.384", + "0.403", + "0.410", + "0.406", + "0.404", + "0.408", + "0.412", + "0.413", + "0.407", + "0.407", + "0.433", + "0.453", + "0.440", + "0.429", + "0.437", + "0.448", + "0.431", + "0.401", + "0.378", + "0.411", + "0.421", + "0.424", + "0.432", + "0.443", + "0.435", + "0.415", + "0.400", + "0.413", + "0.552", + "0.622", + "0.617", + "0.516", + "0.434", + "0.417", + "0.416", + "0.448", + "0.458", + "0.456", + "0.446", + "0.428", + "0.415", + "0.398", + "0.408", + "0.395", + "0.397", + "0.406", + "0.400", + "0.387", + "0.408", + "0.430", + "0.438", + "0.416", + "0.408", + "0.421", + "0.426", + "0.428", + "0.435", + "0.422", + "0.407", + "0.416", + "0.425", + "0.429", + "0.445", + "0.428", + "0.278", + "0.210", + "0.196", + "0.204", + "0.237", + "0.307", + "0.387", + "0.400", + "0.403", + "0.408", + "0.415", + "0.427", + "0.410", + "0.394", + "0.420", + "0.414", + "0.365", + "0.210", + "0.214", + "0.197", + "0.180", + "0.201", + "0.289", + "0.356", + "0.397", + "0.419", + "0.435", + "0.424", + "0.426", + "0.424", + "0.409", + "0.417", + "0.420", + "0.395", + "0.418", + "0.435", + "0.406", + "0.400", + "0.420", + "0.450", + "0.424", + "0.414", + "0.437", + "0.467", + "0.433", + "0.414", + "0.401", + "0.396", + "0.408", + "0.421", + "0.416", + "0.417", + "0.425", + "0.437", + "0.449", + "0.431", + "0.415", + "0.398", + "0.403", + "0.424", + "0.417", + "0.399", + "0.394", + "0.406", + "0.395", + "0.404", + "0.423", + "0.468", + "0.509", + "0.468", + "0.449", + "0.442", + "0.432", + "0.431", + "0.444", + "0.481", + "0.479", + "0.459", + "0.447", + "0.428", + "0.416", + "0.444", + "0.444", + "0.427", + "0.422", + "0.451", + "0.457", + "0.457", + "0.447", + "0.426", + "0.447", + "0.456", + "0.436", + "0.416", + "0.400", + "0.436", + "0.464", + "0.443", + "0.430", + "0.447", + "0.374", + "0.257", + "0.246", + "0.306", + "0.378", + "0.431", + "0.434", + "0.434", + "0.433", + "0.437", + "0.443", + "0.448", + "0.442", + "0.429", + "0.413", + "0.396", + "0.404", + "0.430", + "0.450", + "0.457", + "0.461", + "0.463", + "0.455", + "0.425", + "0.402", + "0.411", + "0.432", + "0.404", + "0.397", + "0.414", + "0.428", + "0.441", + "0.410", + "0.410", + "0.428", + "0.444", + "0.455", + "0.447", + "0.433", + "0.431", + "0.441", + "0.453", + "0.460", + "0.459", + "0.449", + "0.443", + "0.438", + "0.423", + "0.415", + "0.405", + "0.394", + "0.376", + "0.380", + "0.393", + "0.400", + "0.408", + "0.410", + "0.417", + "0.421", + "0.401", + "0.387", + "0.391", + "0.416", + "0.434", + "0.434", + "0.429", + "0.440", + "0.428", + "0.410", + "0.402", + "0.414", + "0.402", + "0.413", + "0.428", + "0.443", + "0.418", + "0.400", + "0.402", + "0.428", + "0.440", + "0.452", + "0.461", + "0.458", + "0.442", + "0.425", + "0.404", + "0.418", + "0.403", + "0.399", + "0.410", + "0.418", + "0.424", + "0.423", + "0.402", + "0.403", + "0.417", + "0.426", + "0.438", + "0.426", + "0.410", + "0.420", + "0.430", + "0.434", + "0.421", + "0.408", + "0.435", + "0.446", + "0.433", + "0.448", + "0.452", + "0.447", + "0.439", + "0.427", + "0.415", + "0.421", + "0.450", + "0.448", + "0.431", + "0.413", + "0.400", + "0.403", + "0.435", + "0.420", + "0.413", + "0.410", + "0.402", + "0.393", + "0.397", + "0.404", + "0.407", + "0.411", + "0.422", + "0.438", + "0.387", + "0.336", + "0.270", + "0.289", + "0.325", + "0.424", + "0.452", + "0.457", + "0.441", + "0.427", + "0.413", + "0.408", + "0.416", + "0.424", + "0.441", + "0.464", + "0.445", + "0.425", + "0.417", + "0.416", + "0.417", + "0.416", + "0.424", + "0.446", + "0.435", + "0.437", + "0.434", + "0.421", + "0.429", + "0.422", + "0.406", + "0.413", + "0.409", + "0.397", + "0.424", + "0.459", + "0.403", + "0.375", + "0.352", + "0.405", + "0.457", + "0.271", + "0.266", + "0.376", + "0.405", + "0.409", + "0.400", + "0.398", + "0.415", + "0.428", + "0.439", + "0.406", + "0.390", + "0.396", + "0.423", + "0.448", + "0.429", + "0.443", + "0.460", + "0.427", + "0.416", + "0.434", + "0.447", + "0.429", + "0.419", + "0.406", + "0.391", + "0.420", + "0.411", + "0.397", + "0.412", + "0.434", + "0.456", + "0.451", + "0.430", + "0.420", + "0.424", + "0.442", + "0.443", + "0.435", + "0.448", + "0.462", + "0.465", + "0.443", + "0.421", + "0.419", + "0.431", + "0.431", + "0.427", + "0.438", + "0.448", + "0.450", + "0.431", + "0.409", + "0.399", + "0.385", + "0.403", + "0.427", + "0.449", + "0.427", + "0.409", + "0.397", + "0.410", + "0.438", + "0.296", + "0.298", + "0.340", + "0.392", + "0.420", + "0.426", + "0.434", + "0.437", + "0.417", + "0.394", + "0.421", + "0.454", + "0.444", + "0.435", + "0.461", + "0.481", + "0.475", + "0.437", + "0.397", + "0.399", + "0.421", + "0.441", + "0.455", + "0.470", + "0.452", + "0.478", + "0.510", + "0.494", + "0.455", + "0.440", + "0.451", + "0.449", + "0.435", + "0.428", + "0.440", + "0.452", + "0.448", + "0.435", + "0.436", + "0.450", + "0.455", + "0.410", + "0.387", + "0.365", + "0.338", + "0.340", + "0.372", + "0.393", + "0.407", + "0.412", + "0.415", + "0.411", + "0.400", + "0.387", + "0.379", + "0.396", + "0.402", + "0.410", + "0.431", + "0.408", + "0.394", + "0.381", + "0.371", + "0.382", + "0.382", + "0.320", + "0.278", + "0.297", + "0.341", + "0.394", + "0.416", + "0.424", + "0.431", + "0.453", + "0.457", + "0.428", + "0.418", + "0.413", + "0.390", + "0.364", + "0.346", + "0.374", + "0.426", + "0.439", + "0.429", + "0.411", + "0.395", + "0.382", + "0.364", + "0.393", + "0.388", + "0.394", + "0.407", + "0.438", + "0.424", + "0.416", + "0.409", + "0.402", + "0.404", + "0.401", + "0.386", + "0.358", + "0.312", + "0.278", + "0.341", + "0.371", + "0.387", + "0.404", + "0.394", + "0.391", + "0.407", + "0.392", + "0.369", + "0.360", + "0.349", + "0.343", + "0.348", + "0.375", + "0.393", + "0.409", + "0.401", + "0.390", + "0.412", + "0.406", + "0.387", + "0.378", + "0.385", + "0.389", + "0.405", + "0.394", + "0.390", + "0.408", + "0.401", + "0.392", + "0.383", + "0.357", + "0.314", + "0.306", + "0.330", + "0.326", + "0.308", + "0.312", + "0.334", + "0.370", + "0.353", + "0.339", + "0.327", + "0.356", + "0.387", + "0.348", + "0.330", + "0.345", + "0.318", + "0.301", + "0.337", + "0.401", + "0.432", + "0.383", + "0.328", + "0.310", + "0.351", + "0.396", + "0.371", + "0.355", + "0.368", + "0.344", + "0.326", + "0.321", + "0.328", + "0.330", + "0.320", + "0.314", + "0.372", + "0.446", + "0.466", + "0.479", + "0.507", + "0.548", + "0.579", + "0.579", + "0.548", + "0.586", + "0.513", + "0.487", + "0.652", + "0.371", + "0.353", + "0.367", + "0.390", + "0.400", + "0.403", + "0.399", + "0.372", + "0.361", + "0.395", + "0.409", + "0.391", + "0.383", + "0.372", + "0.366", + "0.346", + "0.323", + "0.297", + "0.400", + "0.441", + "0.463", + "0.459", + "0.439", + "0.425", + "0.412", + "0.392", + "0.346", + "0.416", + "0.443", + "0.437", + "0.336", + "0.349", + "0.358", + "0.331", + "0.345", + "0.358", + "0.368", + "0.365", + "0.342", + "0.366", + "0.365", + "0.328", + "0.312", + "0.312", + "0.308", + "0.302", + "0.285", + "0.278", + "0.449", + "0.550", + "0.467", + "0.393", + "0.348", + "0.336", + "0.323", + "0.317", + "0.301", + "0.282", + "0.252", + "0.235", + "0.243", + "0.286", + "0.376", + "0.344", + "0.322", + "0.307", + "0.310", + "0.320", + "0.333", + "0.338", + "0.321", + "0.327", + "0.338", + "0.347", + "0.345", + "0.332", + "0.312", + "0.299", + "0.314", + "0.329", + "0.329", + "0.328", + "0.333", + "0.345", + "0.362", + "0.299", + "0.273", + "0.221", + "0.228", + "0.297", + "0.308", + "0.291", + "0.265", + "0.253", + "0.278", + "0.300", + "0.324", + "0.338", + "0.345", + "0.327", + "0.307", + "0.307", + "0.318", + "0.315", + "0.298", + "0.307", + "0.317", + "0.289", + "0.192", + "0.154", + "0.178", + "0.237", + "0.272", + "0.297", + "0.322", + "0.361", + "0.325", + "0.333", + "0.325", + "0.276", + "0.276", + "0.307", + "0.315", + "0.276", + "0.276", + "0.310", + "0.345", + "0.367", + "0.499", + "0.530", + "0.467", + "0.355", + "0.310", + "0.289", + "0.266", + "0.248", + "0.237", + "0.228", + "0.254", + "0.287", + "0.304", + "0.299", + "0.292", + "0.293", + "0.312", + "0.311", + "0.295", + "0.272", + "0.323", + "0.370", + "0.557", + "0.549", + "0.566", + "0.557", + "0.536", + "0.546", + "0.539", + "0.576", + "0.627", + "0.443", + "0.286", + "0.298", + "0.299", + "0.295", + "0.285", + "0.277", + "0.272", + "0.297", + "0.402", + "0.433", + "0.480", + "0.467", + "0.545", + "0.483", + "0.358", + "0.305", + "0.303", + "0.291", + "0.281", + "0.283", + "0.298", + "0.295", + "0.281", + "0.278", + "0.300", + "0.329", + "0.399", + "0.390", + "0.381", + "0.381", + "0.535", + "0.240", + "0.203", + "0.152", + "0.090", + "0.091", + "0.097", + "0.088", + "0.065", + "0.055", + "0.053", + "0.056", + "0.062", + "0.067", + "0.072", + "0.074", + "0.074", + "0.075", + "0.079", + "0.088", + "0.098", + "0.111", + "0.126", + "0.146", + "0.166" + ], + "GR": [ + "82.478", + "86.413", + "90.229", + "90.944", + "88.866", + "82.638", + "83.345", + "88.403", + "91.038", + "89.579", + "84.092", + "78.479", + "72.249", + "69.179", + "67.349", + "58.390", + "54.888", + "61.614", + "68.592", + "60.065", + "53.025", + "64.902", + "81.805", + "85.120", + "76.965", + "71.476", + "69.652", + "68.996", + "69.709", + "70.504", + "70.950", + "68.689", + "65.494", + "61.810", + "62.210", + "65.527", + "70.460", + "72.472", + "72.876", + "69.745", + "64.755", + "64.783", + "65.746", + "67.389", + "68.414", + "69.559", + "68.475", + "64.971", + "61.780", + "58.398", + "51.237", + "45.191", + "45.474", + "51.519", + "57.687", + "63.922", + "62.958", + "56.916", + "54.898", + "53.010", + "51.303", + "52.635", + "59.803", + "64.915", + "73.006", + "59.894", + "53.101", + "47.489", + "44.979", + "49.847", + "58.563", + "51.026", + "44.359", + "44.021", + "46.097", + "53.200", + "59.119", + "69.196", + "73.198", + "73.786", + "72.827", + "68.639", + "56.950", + "46.131", + "38.227", + "33.108", + "38.535", + "47.499", + "56.952", + "74.906", + "81.757", + "87.990", + "96.765", + "90.659", + "88.705", + "86.381", + "78.131", + "78.131", + "76.861", + "65.360", + "53.732", + "37.332", + "59.934", + "69.144", + "67.499", + "51.655", + "37.920", + "32.929", + "40.160", + "49.489", + "61.672", + "70.198", + "82.883", + "77.207", + "70.293", + "66.975", + "69.053", + "74.793", + "81.579", + "86.821", + "80.526", + "74.295", + "64.963", + "55.816", + "59.940", + "64.005", + "64.903", + "67.665", + "70.483", + "69.460", + "69.369", + "69.588", + "70.859", + "69.526", + "67.323", + "66.242", + "66.144", + "66.113", + "70.300", + "73.989", + "74.826", + "74.362", + "72.285", + "63.882", + "56.969", + "55.950", + "55.295", + "54.147", + "54.552", + "55.701", + "56.475", + "58.368", + "58.833", + "58.868", + "59.949", + "58.801", + "58.274", + "58.805", + "59.578", + "60.726", + "60.631", + "60.105", + "58.279", + "53.906", + "49.970", + "50.808", + "54.808", + "57.193", + "59.767", + "62.032", + "61.815", + "58.624", + "57.663", + "58.375", + "60.763", + "63.087", + "65.102", + "69.601", + "73.292", + "75.055", + "74.779", + "74.561", + "75.708", + "77.722", + "80.049", + "76.175", + "67.153", + "60.052", + "52.393", + "45.416", + "43.775", + "43.805", + "44.217", + "45.667", + "47.372", + "48.770", + "49.914", + "51.807", + "55.561", + "60.552", + "63.123", + "54.538", + "48.800", + "44.122", + "42.289", + "49.390", + "50.107", + "48.092", + "46.638", + "45.550", + "41.860", + "42.947", + "45.082", + "48.958", + "49.672", + "43.878", + "43.781", + "46.917", + "47.942", + "44.433", + "44.157", + "47.286", + "50.852", + "46.920", + "45.340", + "47.167", + "50.791", + "45.802", + "43.232", + "42.949", + "44.849", + "46.173", + "48.809", + "49.460", + "45.832", + "42.269", + "45.215", + "48.099", + "46.578", + "45.248", + "44.846", + "45.685", + "46.086", + "46.303", + "46.644", + "48.352", + "47.699", + "47.609", + "48.760", + "50.024", + "51.852", + "54.242", + "58.736", + "54.241", + "51.606", + "49.224", + "47.391", + "45.065", + "46.835", + "49.406", + "50.865", + "51.085", + "51.553", + "52.383", + "53.221", + "51.706", + "50.682", + "49.658", + "55.952", + "62.062", + "68.664", + "75.208", + "79.208", + "81.600", + "82.555", + "83.643", + "81.132", + "74.463", + "68.481", + "61.755", + "56.699", + "55.987", + "56.453", + "56.729", + "54.343", + "54.808", + "56.143", + "55.987", + "55.715", + "56.489", + "57.514", + "58.905", + "63.711", + "65.605", + "64.147", + "61.759", + "58.195", + "55.498", + "57.262", + "59.526", + "59.742", + "57.294", + "56.457", + "55.933", + "52.736", + "46.752", + "41.762", + "38.693", + "43.807", + "50.477", + "54.910", + "54.011", + "53.736", + "54.444", + "55.289", + "55.441", + "55.779", + "56.368", + "56.956", + "56.496", + "54.358", + "47.563", + "45.054", + "46.261", + "47.285", + "47.565", + "50.079", + "52.775", + "56.156", + "49.118", + "44.934", + "46.513", + "57.333", + "63.442", + "62.358", + "62.201", + "63.412", + "63.940", + "65.148", + "67.536", + "69.430", + "65.180", + "62.734", + "66.425", + "70.794", + "72.066", + "74.141", + "74.111", + "68.003", + "65.058", + "68.997", + "65.742", + "62.423", + "63.513", + "66.269", + "73.557", + "73.959", + "69.220", + "65.962", + "66.612", + "70.178", + "72.691", + "72.288", + "68.535", + "63.669", + "59.110", + "57.840", + "56.506", + "54.925", + "55.266", + "56.788", + "63.018", + "61.314", + "56.445", + "56.913", + "58.494", + "57.594", + "56.758", + "57.721", + "60.107", + "63.610", + "69.968", + "64.231", + "57.812", + "53.319", + "53.288", + "56.853", + "60.361", + "60.015", + "58.437", + "59.335", + "61.227", + "57.662", + "58.687", + "63.058", + "68.172", + "65.601", + "59.182", + "56.982", + "56.334", + "55.932", + "56.579", + "61.077", + "71.523", + "64.114", + "61.788", + "64.237", + "67.249", + "65.788", + "58.752", + "60.085", + "69.745", + "65.854", + "65.086", + "65.793", + "67.747", + "69.698", + "70.417", + "70.442", + "69.797", + "68.335", + "65.514", + "64.614", + "68.245", + "70.444", + "70.165", + "68.524", + "66.325", + "64.494", + "63.035", + "64.494", + "67.134", + "70.697", + "71.966", + "70.698", + "65.951", + "68.217", + "68.746", + "69.150", + "70.918", + "72.186", + "72.157", + "72.186", + "72.589", + "72.558", + "71.785", + "71.013", + "70.234", + "69.091", + "67.077", + "64.815", + "63.041", + "60.597", + "59.390", + "58.861", + "58.395", + "58.487", + "59.208", + "60.593", + "63.540", + "65.934", + "66.088", + "66.920", + "69.311", + "71.389", + "72.534", + "73.311", + "73.535", + "73.374", + "71.667", + "68.600", + "64.040", + "58.182", + "56.600", + "54.277", + "53.439", + "54.772", + "56.603", + "55.887", + "53.439", + "51.860", + "52.758", + "54.089", + "56.108", + "57.382", + "58.157", + "58.556", + "58.967", + "59.176", + "59.208", + "58.744", + "57.476", + "56.200", + "55.987", + "57.566", + "56.295", + "51.179", + "52.141", + "54.097", + "55.429", + "55.834", + "56.180", + "56.700", + "57.849", + "58.129", + "57.913", + "55.089", + "49.849", + "51.746", + "53.015", + "49.884", + "48.052", + "51.060", + "53.822", + "55.404", + "55.374", + "54.041", + "52.086", + "48.955", + "49.173", + "51.558", + "51.280", + "50.632", + "51.097", + "54.292", + "60.087", + "59.002", + "55.747", + "51.065", + "51.035", + "52.120", + "55.561", + "55.469", + "52.154", + "51.502", + "53.455", + "57.085", + "62.322", + "65.767", + "64.743", + "71.159", + "72.681", + "71.038", + "67.471", + "59.750", + "59.537", + "61.364", + "61.830", + "62.051", + "62.264", + "61.612", + "57.180", + "57.400", + "58.608", + "59.879", + "61.401", + "62.857", + "65.251", + "67.323", + "69.025", + "65.336", + "62.515", + "61.307", + "64.066", + "68.004", + "69.524", + "64.845", + "60.286", + "61.185", + "65.310", + "65.897", + "61.835", + "64.907", + "64.255", + "61.310", + "63.637", + "68.072", + "62.398", + "55.114", + "49.126", + "61.375", + "66.924", + "71.856", + "71.886", + "72.231", + "73.318", + "74.030", + "73.995", + "70.932", + "68.913", + "68.511", + "71.329", + "74.771", + "76.415", + "76.386", + "76.667", + "76.201", + "73.443", + "69.689", + "64.701", + "62.434", + "66.560", + "71.053", + "72.758", + "68.388", + "63.025", + "66.716", + "70.218", + "72.117", + "72.642", + "72.608", + "71.337", + "72.919", + "76.114", + "76.703", + "74.193", + "72.242", + "71.713", + "71.307", + "74.252", + "77.697", + "77.663", + "78.935", + "79.091", + "74.720", + "74.068", + "77.015", + "79.527", + "83.277", + "84.178", + "80.673", + "78.224", + "78.255", + "80.955", + "80.059", + "78.166", + "76.644", + "72.771", + "67.219", + "61.050", + "55.811", + "56.461", + "66.042", + "74.882", + "78.387", + "81.084", + "81.732", + "82.138", + "79.500", + "76.121", + "72.928", + "72.838", + "74.667", + "78.107", + "80.061", + "81.332", + "82.170", + "81.766", + "79.255", + "78.854", + "80.868", + "81.023", + "76.591", + "75.257", + "78.016", + "78.234", + "74.546", + "75.817", + "79.136", + "76.563", + "74.237", + "73.523", + "73.678", + "75.322", + "76.533", + "72.287", + "67.417", + "62.614", + "57.311", + "55.418", + "56.317", + "55.981", + "54.768", + "54.739", + "53.839", + "53.312", + "57.128", + "60.944", + "62.211", + "63.548", + "64.260", + "64.788", + "65.687", + "67.142", + "72.694", + "74.089", + "71.457", + "69.687", + "68.417", + "67.331", + "65.317", + "61.625", + "56.823", + "56.730", + "55.706", + "53.007", + "50.682", + "47.923", + "49.444", + "54.065", + "58.375", + "61.008", + "57.446", + "54.192", + "58.063", + "58.777", + "56.769", + "56.112", + "56.638", + "57.106", + "57.879", + "56.485", + "54.967", + "54.377", + "55.465", + "58.843", + "66.686", + "61.077", + "57.695", + "58.787", + "60.305", + "60.705", + "60.550", + "60.151", + "59.683", + "59.159", + "57.822", + "52.584", + "52.056", + "57.049", + "61.854", + "62.444", + "60.059", + "58.043", + "56.586", + "54.945", + "54.352", + "54.882", + "56.030", + "57.303", + "57.827", + "56.555", + "52.556", + "53.950", + "55.225", + "55.998", + "56.528", + "56.313", + "56.530", + "60.467", + "64.590", + "64.620", + "60.869", + "59.475", + "63.667", + "67.787", + "72.651", + "78.081", + "79.909", + "80.807", + "81.709", + "82.798", + "83.507", + "83.040", + "78.483", + "75.352", + "72.472", + "70.083", + "67.384", + "66.609", + "70.858", + "74.797", + "77.557", + "76.100", + "74.207", + "71.760", + "68.254", + "68.412", + "71.480", + "74.302", + "76.069", + "71.263", + "71.173", + "72.628", + "72.969", + "73.248", + "75.080", + "77.902", + "76.569", + "71.637", + "70.619", + "71.763", + "74.837", + "77.592", + "81.470", + "83.177", + "80.166", + "73.316", + "70.927", + "73.006", + "77.255", + "80.634", + "83.703", + "88.137", + "91.703", + "93.408", + "85.750", + "77.535", + "68.823", + "62.651", + "63.117", + "66.003", + "67.832", + "78.466", + "77.323", + "68.111", + "65.544", + "67.243", + "69.942", + "71.959", + "72.737", + "73.571", + "74.096", + "74.690", + "74.717", + "75.182", + "76.022", + "77.602", + "81.913", + "77.727", + "77.945", + "78.712", + "73.907", + "71.080", + "69.931", + "72.686", + "77.476", + "81.341", + "80.874", + "77.987", + "76.710", + "75.867", + "73.415", + "69.224", + "67.328", + "71.755", + "76.612", + "79.795", + "82.857", + "85.980", + "89.351", + "89.439", + "88.532", + "93.824", + "90.261", + "86.811", + "79.159", + "68.709", + "57.457", + "50.667", + "46.169", + "41.485", + "38.907", + "48.970", + "63.865", + "74.980", + "77.608", + "60.284", + "50.150", + "43.420", + "36.322", + "31.017", + "27.387", + "28.898", + "33.136", + "35.518", + "30.895", + "37.921", + "53.933", + "61.827", + "68.914", + "65.345", + "55.890", + "53.003", + "52.162", + "50.389", + "47.379", + "48.023", + "50.466", + "46.773", + "47.604", + "49.425", + "47.655", + "47.495", + "50.802", + "55.722", + "59.340", + "62.031", + "65.399", + "71.063", + "69.416", + "55.066", + "44.311", + "35.105", + "30.668", + "32.242", + "37.161", + "42.642", + "48.800", + "55.703", + "62.048", + "67.213", + "72.938", + "80.584", + "61.962", + "56.471", + "56.189", + "61.169", + "68.380", + "68.777", + "61.676", + "56.002", + "56.212", + "49.918", + "42.326", + "38.258", + "38.784", + "42.711", + "49.239", + "57.195", + "58.396", + "53.530", + "49.526", + "44.904", + "41.213", + "38.761", + "37.295", + "36.826", + "38.648", + "44.249", + "54.993", + "63.568", + "68.982", + "60.582", + "51.439", + "45.328", + "36.183", + "27.597", + "29.670", + "26.782", + "22.342", + "21.997", + "25.369", + "36.670", + "50.821", + "55.184", + "40.772", + "30.761", + "24.031", + "26.287", + "29.720", + "31.297", + "32.249", + "34.009", + "38.989", + "45.892", + "53.290", + "64.653", + "66.973", + "62.475", + "60.019", + "61.843", + "65.216", + "67.406", + "68.545", + "60.827", + "50.073", + "39.625", + "37.605", + "38.814", + "38.089", + "37.127", + "38.514", + "41.882", + "46.989", + "48.010", + "46.481", + "43.718", + "42.875", + "41.227", + "39.148", + "40.596", + "44.901", + "43.312", + "36.769", + "33.757", + "34.526", + "39.695", + "38.792", + "36.893", + "36.735", + "36.451", + "36.287", + "39.349", + "44.704", + "45.471", + "42.831", + "39.077", + "38.421", + "35.038", + "29.673", + "29.823", + "31.520", + "31.854", + "30.642", + "29.116", + "28.460", + "27.370", + "25.415", + "23.640", + "26.889", + "29.639", + "31.711", + "33.344", + "36.037", + "38.599", + "41.662", + "46.210", + "51.129", + "58.340", + "64.622" + ], + "CAL": [ + "238.379", + "238.331", + "238.069", + "238.752", + "239.724", + "241.951", + "244.478", + "247.116", + "250.475", + "254.764", + "258.019", + "260.143", + "256.370", + "253.120", + "252.442", + "253.526", + "256.377", + "261.799", + "272.700", + "300.036", + "267.431", + "355.538", + "384.114", + "387.164", + "256.995", + "238.548", + "275.286", + "260.768", + "247.176", + "244.445", + "245.215", + "247.332", + "249.248", + "248.998", + "249.046", + "250.229", + "252.661", + "256.950", + "265.992", + "275.241", + "269.713", + "249.406", + "235.404", + "235.040", + "234.264", + "234.433", + "233.854", + "233.806", + "237.163", + "238.969", + "239.233", + "240.113", + "241.102", + "242.288", + "245.137", + "246.315", + "248.127", + "249.829", + "250.297", + "250.047", + "250.192", + "250.757", + "255.049", + "264.307", + "287.399", + "294.169", + "259.908", + "239.288", + "238.415", + "239.188", + "240.284", + "240.947", + "241.827", + "242.502", + "243.167", + "243.965", + "244.312", + "244.565", + "244.823", + "244.979", + "244.514", + "244.468", + "244.421", + "244.574", + "244.623", + "244.467", + "244.213", + "245.514", + "246.793", + "251.293", + "257.854", + "270.101", + "286.791", + "323.020", + "323.895", + "306.173", + "272.324", + "256.668", + "253.831", + "254.084", + "254.554", + "254.196", + "252.697", + "250.369", + "246.704", + "244.580", + "243.391", + "242.832", + "242.881", + "243.347", + "243.820", + "244.377", + "246.089", + "247.682", + "251.055", + "253.059", + "255.086", + "256.679", + "260.035", + "271.561", + "303.443", + "320.241", + "297.967", + "275.906", + "250.737", + "247.481", + "246.819", + "247.897", + "248.572", + "249.033", + "249.292", + "249.663", + "249.710", + "249.872", + "250.442", + "250.285", + "250.645", + "252.142", + "252.709", + "254.731", + "259.950", + "263.923", + "257.877", + "252.873", + "250.333", + "248.009", + "246.725", + "246.163", + "246.123", + "246.161", + "246.209", + "246.151", + "246.109", + "246.364", + "246.619", + "246.779", + "247.038", + "247.292", + "247.452", + "248.135", + "248.481", + "249.058", + "249.411", + "249.379", + "249.217", + "249.155", + "249.221", + "249.368", + "249.849", + "250.200", + "250.664", + "250.927", + "250.768", + "250.815", + "250.243", + "250.713", + "250.762", + "260.426", + "276.189", + "305.489", + "325.491", + "283.581", + "266.682", + "262.912", + "258.322", + "253.715", + "249.330", + "248.136", + "248.090", + "248.136", + "248.600", + "249.687", + "250.465", + "250.723", + "251.189", + "251.553", + "251.910", + "252.586", + "253.462", + "254.244", + "254.703", + "254.443", + "253.163", + "251.873", + "250.894", + "250.326", + "250.156", + "250.117", + "250.054", + "250.012", + "249.863", + "249.503", + "248.826", + "248.361", + "248.110", + "248.155", + "248.319", + "248.356", + "248.217", + "248.160", + "248.102", + "247.652", + "247.379", + "247.127", + "247.271", + "247.435", + "247.906", + "247.949", + "247.902", + "247.645", + "247.278", + "247.225", + "247.383", + "247.856", + "248.005", + "248.474", + "248.828", + "249.506", + "249.462", + "249.202", + "248.838", + "248.579", + "247.929", + "247.763", + "247.500", + "247.339", + "247.095", + "246.928", + "246.870", + "247.231", + "247.593", + "247.749", + "247.807", + "247.453", + "247.185", + "246.941", + "246.683", + "246.626", + "246.889", + "247.465", + "248.244", + "248.601", + "248.963", + "249.317", + "249.780", + "250.031", + "250.805", + "259.441", + "276.438", + "296.953", + "285.843", + "273.187", + "262.177", + "257.794", + "258.985", + "258.616", + "256.500", + "253.963", + "250.920", + "247.555", + "247.095", + "248.177", + "247.505", + "246.644", + "246.587", + "246.639", + "247.096", + "247.785", + "248.352", + "248.815", + "249.059", + "249.347", + "249.284", + "249.222", + "248.756", + "248.290", + "247.937", + "247.470", + "247.309", + "247.154", + "246.899", + "246.858", + "246.803", + "246.949", + "247.210", + "247.579", + "247.942", + "248.088", + "248.360", + "248.399", + "248.459", + "248.722", + "249.076", + "249.332", + "249.921", + "250.383", + "250.833", + "251.200", + "251.252", + "251.299", + "251.359", + "251.312", + "251.257", + "251.504", + "251.465", + "251.300", + "251.464", + "252.752", + "254.873", + "256.262", + "258.395", + "259.373", + "260.154", + "260.826", + "261.178", + "261.329", + "261.381", + "262.056", + "262.325", + "262.373", + "262.428", + "262.058", + "261.706", + "261.563", + "261.492", + "261.443", + "261.503", + "261.542", + "261.698", + "263.004", + "263.978", + "264.851", + "266.047", + "266.715", + "267.189", + "267.544", + "268.734", + "270.131", + "271.313", + "272.194", + "269.661", + "265.579", + "261.708", + "257.530", + "253.849", + "249.975", + "250.031", + "250.389", + "250.657", + "250.910", + "251.063", + "251.119", + "250.856", + "250.598", + "250.030", + "249.368", + "249.207", + "249.153", + "249.417", + "249.878", + "250.040", + "250.096", + "250.037", + "250.194", + "250.462", + "250.720", + "251.072", + "252.671", + "254.084", + "254.548", + "254.915", + "255.055", + "255.116", + "255.158", + "255.211", + "254.641", + "254.175", + "253.620", + "253.355", + "253.715", + "257.279", + "260.132", + "261.940", + "263.028", + "263.592", + "263.641", + "262.867", + "264.784", + "267.732", + "269.842", + "271.857", + "273.054", + "274.245", + "275.329", + "276.105", + "276.462", + "276.616", + "276.564", + "276.409", + "276.372", + "276.318", + "276.166", + "276.222", + "276.269", + "276.721", + "277.198", + "277.445", + "277.916", + "278.482", + "278.840", + "279.418", + "279.669", + "279.835", + "279.789", + "279.724", + "279.877", + "280.658", + "280.498", + "279.934", + "279.887", + "279.829", + "279.987", + "279.834", + "279.471", + "277.777", + "276.478", + "276.111", + "275.237", + "274.464", + "274.203", + "274.461", + "275.130", + "275.492", + "275.657", + "276.432", + "277.000", + "277.257", + "276.594", + "275.499", + "272.863", + "270.023", + "268.729", + "267.649", + "266.769", + "266.618", + "266.572", + "266.199", + "264.611", + "263.313", + "262.227", + "261.445", + "260.879", + "260.726", + "261.203", + "262.282", + "264.193", + "265.168", + "266.470", + "267.447", + "268.532", + "268.996", + "269.047", + "268.595", + "268.017", + "268.179", + "268.848", + "270.037", + "271.434", + "273.351", + "274.745", + "276.028", + "277.543", + "278.412", + "279.598", + "280.581", + "280.941", + "281.621", + "281.771", + "281.615", + "281.675", + "281.523", + "281.468", + "281.013", + "280.655", + "280.685", + "280.535", + "280.694", + "280.538", + "280.587", + "280.441", + "280.798", + "281.259", + "281.628", + "281.681", + "281.834", + "281.881", + "282.241", + "282.815", + "283.799", + "284.471", + "284.832", + "284.366", + "283.285", + "282.301", + "281.217", + "280.340", + "280.086", + "279.933", + "279.983", + "280.239", + "280.084", + "279.824", + "279.460", + "279.112", + "278.744", + "278.693", + "278.843", + "278.893", + "278.852", + "278.692", + "278.739", + "278.794", + "278.854", + "278.596", + "278.649", + "279.007", + "279.058", + "279.725", + "280.717", + "281.591", + "282.259", + "282.621", + "282.574", + "283.141", + "284.960", + "286.761", + "289.288", + "292.345", + "293.743", + "293.063", + "288.879", + "286.449", + "285.365", + "285.428", + "285.676", + "285.935", + "286.300", + "286.358", + "286.307", + "286.358", + "286.509", + "286.557", + "286.411", + "286.153", + "286.203", + "285.846", + "285.270", + "284.501", + "284.031", + "284.401", + "284.966", + "286.578", + "287.554", + "288.740", + "289.723", + "290.503", + "290.969", + "291.431", + "291.784", + "292.047", + "292.109", + "292.050", + "292.102", + "292.157", + "292.317", + "292.673", + "292.624", + "292.564", + "292.209", + "291.952", + "291.586", + "291.229", + "291.172", + "291.227", + "292.414", + "292.155", + "292.317", + "292.883", + "293.349", + "293.620", + "294.183", + "294.647", + "295.423", + "296.297", + "296.758", + "296.914", + "296.662", + "296.206", + "295.839", + "295.367", + "294.402", + "293.617", + "292.949", + "292.378", + "291.805", + "290.622", + "289.735", + "288.461", + "287.567", + "286.276", + "285.000", + "284.422", + "283.955", + "283.695", + "283.652", + "283.695", + "283.539", + "283.592", + "284.161", + "285.247", + "286.857", + "288.252", + "290.479", + "292.792", + "296.268", + "297.963", + "299.563", + "301.383", + "303.082", + "305.207", + "307.110", + "309.349", + "310.635", + "311.711", + "313.328", + "314.510", + "315.902", + "318.240", + "319.951", + "321.555", + "322.738", + "323.293", + "324.181", + "324.958", + "325.731", + "326.619", + "327.593", + "329.296", + "330.895", + "332.597", + "334.521", + "336.121", + "338.023", + "341.692", + "346.201", + "349.971", + "352.807", + "355.442", + "355.913", + "355.029", + "348.682", + "343.978", + "342.072", + "341.181", + "340.822", + "340.882", + "341.035", + "341.397", + "341.768", + "341.815", + "341.552", + "341.193", + "340.834", + "340.575", + "340.411", + "340.265", + "340.011", + "340.674", + "341.552", + "341.293", + "339.897", + "336.650", + "335.256", + "334.072", + "333.702", + "333.350", + "333.499", + "334.381", + "335.874", + "337.474", + "339.599", + "341.927", + "343.634", + "344.918", + "346.002", + "346.573", + "345.077", + "341.517", + "339.707", + "338.201", + "336.602", + "335.733", + "335.464", + "335.211", + "335.169", + "335.315", + "335.468", + "335.724", + "336.097", + "336.248", + "336.303", + "336.355", + "336.406", + "336.661", + "336.915", + "337.081", + "336.716", + "336.556", + "336.822", + "337.185", + "337.853", + "338.321", + "338.885", + "339.871", + "340.643", + "340.698", + "340.544", + "340.694", + "341.065", + "341.129", + "341.378", + "341.432", + "341.371", + "340.305", + "338.579", + "332.132", + "327.632", + "324.992", + "324.123", + "323.759", + "323.288", + "322.511", + "321.230", + "319.928", + "316.988", + "315.080", + "313.792", + "313.116", + "312.657", + "312.908", + "313.583", + "314.048", + "312.962", + "310.322", + "306.758", + "304.640", + "303.977", + "303.509", + "302.219", + "301.234", + "300.458", + "299.686", + "299.633", + "299.892", + "300.777", + "301.655", + "302.433", + "302.992", + "303.469", + "303.616", + "303.767", + "304.343", + "304.497", + "304.443", + "304.599", + "305.180", + "305.631", + "305.786", + "305.633", + "305.273", + "304.918", + "304.561", + "304.187", + "304.048", + "304.195", + "304.551", + "305.338", + "306.108", + "307.714", + "309.106", + "310.496", + "312.202", + "313.907", + "316.962", + "320.526", + "327.501", + "339.748", + "359.538", + "381.813", + "411.838", + "412.407", + "357.163", + "371.168", + "373.707", + "347.914", + "352.618", + "388.540", + "385.384", + "361.253", + "330.503", + "343.271", + "344.671", + "340.378", + "331.645", + "327.355", + "331.022", + "337.799", + "341.151", + "344.210", + "340.119", + "330.975", + "322.179", + "317.361", + "317.815", + "328.493", + "343.715", + "331.577", + "323.455", + "321.650", + "320.140", + "317.599", + "314.541", + "310.658", + "306.775", + "302.476", + "320.695", + "317.122", + "309.112", + "304.296", + "300.002", + "297.875", + "296.791", + "297.548", + "298.723", + "298.870", + "299.841", + "302.257", + "302.506", + "286.953", + "273.467", + "266.490", + "263.849", + "263.066", + "267.544", + "284.313", + "328.035", + "328.387", + "309.015", + "289.539", + "268.619", + "288.383", + "276.036", + "264.517", + "255.365", + "246.936", + "246.989", + "247.646", + "247.167", + "246.485", + "245.816", + "245.640", + "245.373", + "244.999", + "244.222", + "243.958", + "243.892", + "243.932", + "244.907", + "245.779", + "245.719", + "245.135", + "244.343", + "243.563", + "242.675", + "242.197", + "242.761", + "243.114", + "243.151", + "242.986", + "242.921", + "243.381", + "243.629", + "244.605", + "244.742", + "244.783", + "245.031", + "244.670", + "244.187", + "243.818", + "243.964", + "244.932", + "246.733", + "250.697", + "251.045", + "248.820", + "248.346", + "248.075", + "247.298", + "246.615", + "245.839", + "245.466", + "245.192", + "244.918", + "244.548", + "244.081", + "244.634", + "245.711", + "246.158", + "246.207", + "246.039", + "245.363", + "245.088", + "244.208", + "243.418", + "242.528", + "242.266", + "242.405", + "242.859", + "242.605", + "242.441", + "242.684", + "243.037", + "243.070", + "242.817", + "242.844", + "242.590", + "242.619", + "242.562", + "242.187", + "242.017", + "241.867", + "241.792", + "241.633", + "241.676", + "241.725", + "242.379", + "242.834", + "243.075", + "243.127", + "243.468", + "243.823", + "244.284", + "244.940", + "246.429", + "251.733", + "287.916", + "337.009", + "355.640", + "336.988", + "386.493", + "349.360", + "309.955", + "311.236", + "356.301", + "311.529", + "291.122", + "285.489", + "287.290", + "288.671", + "289.647", + "290.405", + "291.373", + "292.346", + "294.351", + "296.252", + "297.737", + "300.266", + "301.748", + "302.510", + "301.109", + "300.423", + "300.780", + "300.821", + "300.761", + "300.495", + "300.950", + "301.398", + "301.028", + "300.345", + "299.975", + "300.945", + "302.742", + "308.678", + "313.676", + "318.156", + "323.667", + "322.469", + "297.419", + "280.114", + "269.312", + "261.816", + "259.588", + "259.529", + "259.575", + "259.714", + "259.446", + "259.277", + "258.502", + "258.226", + "258.369", + "258.517", + "259.086", + "259.426", + "260.405", + "261.784", + "263.173", + "264.141", + "264.697", + "265.467", + "266.024", + "266.581" + ], + "RESD": [ + "2.923", + "2.925", + "2.917", + "2.898", + "2.890", + "2.844", + "2.748", + "2.725", + "2.748", + "2.845", + "2.939", + "3.088", + "3.338", + "3.580", + "3.870", + "4.097", + "3.848", + "3.267", + "2.853", + "2.630", + "2.502", + "2.431", + "2.429", + "2.490", + "2.687", + "2.807", + "2.972", + "3.129", + "3.276", + "3.310", + "3.395", + "3.548", + "3.763", + "4.113", + "4.436", + "4.706", + "4.702", + "4.558", + "4.179", + "3.903", + "3.693", + "3.554", + "3.531", + "3.581", + "3.707", + "3.787", + "3.950", + "4.334", + "4.964", + "5.590", + "5.997", + "6.092", + "6.132", + "6.069", + "5.711", + "5.062", + "4.503", + "4.238", + "4.140", + "4.206", + "4.306", + "4.253", + "4.171", + "4.044", + "3.936", + "3.881", + "3.834", + "3.845", + "3.906", + "3.895", + "3.885", + "3.902", + "3.965", + "4.167", + "4.503", + "4.996", + "5.380", + "5.600", + "5.585", + "5.275", + "4.973", + "4.662", + "4.226", + "3.924", + "3.645", + "3.501", + "3.524", + "3.731", + "3.965", + "4.090", + "4.101", + "3.991", + "3.728", + "3.423", + "3.357", + "3.759", + "4.155", + "4.786", + "5.299", + "5.825", + "6.178", + "6.196", + "5.864", + "5.579", + "4.991", + "4.375", + "3.987", + "3.731", + "3.511", + "3.587", + "3.841", + "4.136", + "4.429", + "4.653", + "4.844", + "5.006", + "5.106", + "4.804", + "4.330", + "3.514", + "2.906", + "2.699", + "2.858", + "3.183", + "3.484", + "4.237", + "4.675", + "4.174", + "3.921", + "4.082", + "4.265", + "4.416", + "4.454", + "4.407", + "4.314", + "4.206", + "4.071", + "3.991", + "3.798", + "3.662", + "3.511", + "3.475", + "3.485", + "3.601", + "3.841", + "4.246", + "4.512", + "4.619", + "4.675", + "4.670", + "4.649", + "4.627", + "4.623", + "4.601", + "4.597", + "4.576", + "4.554", + "4.541", + "4.546", + "4.558", + "4.563", + "4.567", + "4.580", + "4.601", + "4.648", + "4.715", + "4.755", + "4.785", + "4.817", + "4.848", + "4.891", + "4.905", + "4.908", + "4.913", + "4.881", + "4.849", + "4.808", + "4.584", + "4.139", + "3.655", + "3.138", + "3.118", + "3.407", + "3.745", + "4.116", + "4.741", + "5.019", + "5.024", + "5.086", + "5.129", + "5.144", + "5.177", + "5.231", + "5.305", + "5.330", + "5.304", + "5.279", + "5.197", + "5.048", + "4.867", + "4.755", + "4.723", + "4.799", + "4.894", + "5.038", + "5.148", + "5.172", + "5.217", + "5.250", + "5.275", + "5.280", + "5.266", + "5.270", + "5.295", + "5.319", + "5.354", + "5.340", + "5.335", + "5.350", + "5.365", + "5.379", + "5.364", + "5.319", + "5.294", + "5.309", + "5.445", + "5.754", + "6.184", + "6.759", + "7.387", + "8.212", + "8.792", + "8.573", + "7.627", + "6.835", + "5.879", + "5.289", + "5.052", + "4.936", + "4.922", + "4.917", + "4.894", + "4.872", + "4.877", + "4.881", + "4.923", + "4.944", + "4.923", + "4.908", + "4.867", + "4.873", + "4.867", + "4.863", + "4.849", + "4.845", + "4.830", + "4.817", + "4.803", + "4.808", + "4.830", + "4.854", + "4.831", + "4.836", + "4.858", + "4.872", + "4.978", + "5.076", + "5.186", + "5.250", + "5.207", + "5.001", + "4.688", + "4.563", + "4.499", + "4.420", + "4.375", + "4.346", + "4.358", + "4.379", + "4.366", + "4.370", + "4.391", + "4.420", + "4.350", + "4.313", + "4.230", + "4.210", + "4.206", + "4.163", + "4.082", + "3.980", + "3.902", + "3.841", + "3.816", + "3.820", + "3.816", + "3.841", + "3.896", + "3.973", + "4.044", + "4.124", + "4.183", + "4.211", + "4.254", + "4.289", + "4.367", + "4.478", + "4.679", + "4.935", + "5.579", + "6.132", + "6.579", + "6.784", + "6.230", + "5.819", + "5.435", + "5.028", + "4.592", + "4.139", + "4.006", + "4.225", + "4.867", + "5.379", + "6.024", + "7.004", + "8.158", + "9.290", + "11.361", + "14.668", + "12.131", + "9.717", + "7.237", + "6.041", + "5.090", + "4.428", + "4.066", + "3.812", + "3.696", + "3.686", + "3.731", + "3.805", + "3.902", + "4.009", + "4.222", + "4.321", + "4.366", + "4.403", + "4.448", + "4.486", + "4.524", + "4.528", + "4.533", + "4.563", + "4.567", + "4.605", + "4.610", + "4.640", + "4.679", + "4.727", + "4.688", + "4.597", + "4.449", + "4.354", + "4.383", + "4.436", + "4.550", + "4.545", + "4.358", + "4.109", + "3.961", + "3.891", + "3.837", + "3.841", + "3.925", + "4.002", + "4.113", + "4.178", + "4.253", + "4.314", + "4.309", + "4.233", + "4.174", + "4.109", + "4.036", + "3.920", + "3.815", + "3.713", + "3.634", + "3.544", + "3.514", + "3.452", + "3.379", + "3.332", + "3.268", + "3.222", + "3.206", + "3.167", + "3.182", + "3.191", + "3.212", + "3.227", + "3.285", + "3.363", + "3.507", + "3.798", + "4.143", + "4.537", + "4.803", + "5.211", + "5.506", + "5.615", + "5.215", + "4.444", + "4.043", + "3.920", + "3.830", + "3.776", + "3.766", + "3.805", + "3.851", + "3.898", + "3.961", + "3.987", + "4.021", + "4.047", + "4.081", + "4.132", + "4.182", + "4.233", + "4.285", + "4.354", + "4.473", + "4.683", + "4.996", + "4.736", + "4.383", + "4.281", + "4.214", + "4.186", + "4.159", + "4.155", + "4.166", + "4.178", + "4.206", + "4.186", + "4.159", + "4.132", + "4.082", + "4.002", + "3.852", + "3.748", + "3.682", + "3.624", + "3.580", + "3.524", + "3.501", + "3.517", + "3.567", + "3.728", + "3.895", + "4.100", + "4.245", + "4.265", + "4.253", + "4.234", + "4.229", + "4.233", + "4.190", + "4.139", + "4.104", + "4.024", + "3.917", + "3.819", + "3.682", + "3.543", + "3.385", + "3.168", + "3.077", + "2.983", + "2.898", + "2.831", + "2.766", + "2.742", + "2.745", + "2.773", + "2.849", + "2.983", + "3.118", + "3.209", + "3.366", + "3.484", + "3.614", + "3.755", + "3.909", + "4.047", + "4.135", + "4.147", + "4.144", + "4.116", + "4.112", + "4.062", + "4.013", + "3.920", + "3.808", + "3.638", + "3.501", + "3.413", + "3.378", + "3.394", + "3.494", + "3.638", + "3.752", + "3.672", + "3.662", + "3.631", + "3.621", + "3.610", + "3.614", + "3.631", + "3.675", + "3.727", + "3.780", + "3.833", + "3.895", + "3.935", + "3.969", + "3.979", + "4.036", + "4.116", + "4.190", + "4.202", + "4.112", + "3.920", + "3.669", + "3.465", + "3.297", + "3.173", + "3.194", + "3.338", + "3.560", + "3.995", + "4.499", + "5.057", + "5.138", + "4.745", + "4.358", + "3.972", + "3.675", + "3.530", + "3.527", + "3.611", + "3.655", + "3.699", + "3.766", + "3.833", + "4.006", + "4.170", + "4.399", + "4.554", + "4.592", + "4.511", + "4.399", + "4.297", + "4.293", + "4.428", + "4.618", + "4.881", + "5.061", + "5.230", + "5.335", + "5.420", + "5.455", + "5.369", + "5.274", + "5.182", + "5.177", + "5.269", + "5.496", + "5.884", + "6.444", + "6.758", + "6.958", + "6.809", + "6.383", + "5.863", + "5.506", + "5.250", + "5.090", + "4.991", + "4.940", + "4.890", + "4.867", + "4.871", + "4.839", + "4.780", + "4.662", + "4.596", + "4.465", + "4.370", + "4.309", + "4.265", + "4.214", + "4.186", + "4.166", + "4.170", + "4.262", + "4.338", + "4.398", + "4.470", + "4.490", + "4.520", + "4.567", + "4.666", + "4.741", + "4.816", + "4.857", + "4.880", + "4.858", + "4.844", + "4.858", + "4.835", + "4.804", + "4.763", + "4.740", + "4.719", + "4.715", + "4.684", + "4.661", + "4.623", + "4.593", + "4.554", + "4.498", + "4.420", + "4.390", + "4.370", + "4.325", + "4.313", + "4.366", + "4.486", + "4.750", + "5.105", + "5.621", + "6.063", + "6.103", + "5.563", + "5.119", + "4.889", + "4.740", + "4.545", + "4.342", + "4.123", + "3.858", + "3.617", + "3.449", + "3.319", + "3.297", + "3.319", + "3.404", + "3.557", + "3.788", + "4.047", + "4.221", + "4.085", + "3.816", + "3.511", + "3.291", + "2.994", + "2.866", + "3.022", + "3.328", + "3.651", + "3.946", + "4.234", + "4.341", + "4.370", + "4.466", + "4.545", + "4.644", + "4.807", + "5.033", + "5.329", + "5.579", + "6.007", + "6.467", + "6.783", + "6.726", + "6.462", + "5.923", + "5.429", + "4.921", + "4.640", + "4.465", + "4.346", + "4.285", + "4.241", + "4.222", + "4.241", + "4.206", + "4.147", + "4.120", + "4.241", + "4.601", + "5.029", + "5.354", + "5.797", + "6.431", + "7.042", + "7.541", + "7.477", + "6.867", + "6.167", + "5.579", + "4.889", + "4.374", + "4.092", + "3.881", + "3.805", + "3.873", + "4.024", + "4.398", + "4.898", + "5.235", + "5.419", + "5.355", + "5.279", + "5.118", + "4.781", + "4.432", + "4.178", + "4.066", + "4.002", + "3.998", + "3.994", + "4.006", + "4.070", + "4.237", + "4.322", + "4.383", + "4.419", + "4.482", + "4.613", + "4.794", + "4.973", + "5.109", + "5.279", + "5.444", + "5.584", + "5.579", + "5.523", + "5.465", + "5.379", + "5.354", + "5.420", + "5.600", + "5.786", + "5.945", + "6.040", + "6.046", + "5.995", + "5.802", + "5.543", + "5.314", + "4.963", + "4.723", + "4.701", + "4.884", + "5.171", + "5.364", + "5.378", + "5.235", + "4.945", + "4.723", + "4.562", + "4.498", + "4.596", + "4.931", + "5.379", + "5.857", + "6.330", + "6.752", + "7.297", + "7.740", + "7.909", + "7.698", + "7.216", + "6.714", + "6.413", + "6.383", + "6.413", + "6.552", + "6.759", + "6.970", + "7.229", + "7.456", + "7.533", + "7.484", + "7.547", + "7.784", + "8.074", + "8.204", + "8.210", + "8.096", + "7.806", + "7.442", + "7.394", + "7.401", + "7.619", + "7.990", + "8.318", + "8.420", + "8.165", + "7.625", + "6.608", + "5.444", + "4.085", + "3.117", + "2.474", + "1.927", + "1.727", + "1.622", + "1.549", + "1.616", + "1.721", + "1.863", + "2.063", + "2.444", + "2.944", + "3.641", + "4.265", + "5.071", + "5.764", + "6.046", + "6.132", + "6.103", + "5.985", + "5.912", + "5.840", + "5.857", + "6.006", + "6.348", + "6.679", + "7.157", + "7.500", + "7.185", + "6.618", + "5.191", + "3.937", + "3.708", + "3.843", + "4.141", + "4.729", + "5.261", + "5.842", + "6.134", + "6.111", + "6.021", + "5.965", + "6.044", + "6.453", + "6.851", + "7.060", + "6.776", + "6.218", + "5.979", + "6.092", + "6.529", + "7.498", + "7.990", + "9.279", + "10.898", + "11.922", + "11.464", + "8.678", + "6.948", + "5.450", + "4.563", + "5.020", + "5.885", + "7.269", + "9.114", + "11.863", + "13.932", + "15.674", + "17.051", + "17.020", + "14.685", + "12.981", + "11.200", + "8.967", + "7.780", + "7.008", + "6.126", + "5.405", + "4.681", + "4.154", + "3.748", + "3.504", + "3.332", + "3.174", + "3.024", + "2.974", + "2.974", + "3.030", + "3.169", + "3.487", + "3.716", + "4.042", + "4.471", + "5.078", + "5.565", + "6.226", + "6.913", + "7.634", + "8.653", + "9.290", + "9.000", + "8.384", + "7.737", + "7.220", + "6.515", + "6.103", + "5.858", + "5.804", + "5.902", + "6.208", + "6.604", + "6.972", + "7.091", + "6.921", + "6.544", + "6.459", + "6.820", + "7.308", + "8.424", + "9.638", + "10.583", + "11.427", + "11.535", + "9.841", + "7.938", + "6.391", + "5.204", + "4.465", + "4.128", + "3.889", + "3.760", + "3.789", + "3.941", + "4.091", + "4.335", + "4.603", + "4.933", + "5.179", + "5.437", + "5.581", + "5.357", + "4.665", + "4.086", + "3.598", + "3.140", + "2.791", + "2.684", + "2.797", + "3.182", + "3.435", + "3.668", + "3.872", + "3.759", + "3.501", + "3.411", + "3.515", + "3.676", + "3.824", + "3.999", + "4.238", + "4.491", + "4.671", + "4.760", + "4.932", + "5.130", + "5.237", + "5.247", + "5.045", + "4.771", + "4.345", + "4.101", + "4.003", + "3.981", + "4.033", + "4.298", + "4.598", + "5.077", + "5.523", + "6.260", + "7.016", + "7.893", + "8.913", + "10.606", + "12.226", + "10.372", + "7.970", + "6.889", + "6.205", + "5.726", + "5.558", + "5.548", + "5.528", + "5.426", + "5.198", + "5.073", + "5.017", + "4.924", + "4.852", + "4.852", + "4.916", + "6.280", + "7.487", + "8.777", + "10.004", + "11.255", + "12.381", + "13.418", + "14.380", + "15.154", + "15.791", + "16.271", + "16.517", + "16.799", + "16.957", + "17.182", + "17.474", + "17.574", + "17.608", + "17.478", + "17.220", + "16.934", + "16.559", + "15.834", + "14.449", + "12.236", + "10.576" + ] + } +} \ No newline at end of file diff --git a/panel_test_app/make_a_plot.js b/panel_test_app/make_a_plot.js new file mode 100644 index 0000000..626c18d --- /dev/null +++ b/panel_test_app/make_a_plot.js @@ -0,0 +1,91 @@ +async function plot_log(div_id) { + let ShaleSiltCutOff = 80 + let SiltSandCutOff = 55 + var fileUrltoWellLog = "https://gist.githubusercontent.com/JustinGOSSES/2685e588d5c2f2a0ba1591ec7b9c9421/raw/415fe8a2f27dc7621f06f60ffd40a62c0d55a0f0/00-01-01-095-19W4-0.las" + var fetched = await fetch(fileUrltoWellLog) + var well_as_string = await fetched.text() + var well_json_01_01_095_19W4 = wellio.las2json(well_as_string) + let depth_curve_name = "DEPT" + let three_things_2 = wellioviz.fromJSONofWEllGetThingsForPlotting(well_json_01_01_095_19W4, depth_curve_name) + let curve_names2 = Array(6) ["DEPT", "GR", "CALI", "NPHI", "DPHI", "ILD"] + let uwi2 = "00/01-01-095-19W4/0" + let well_log_curves_reformatted_for_d3_2 = three_things_2["well_log_curves_reformatted_for_d3"] + var example_template = wellioviz.curveBoxTemplateExamples("example") + var gr_plot_template_noFill = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ["CALI"], ["black"], [""], [ + { + "curve_name": "GR", + "fill": "no", + "fill_direction": "left", + "cutoffs": [0, ShaleSiltCutOff, SiltSandCutOff], + "fill_colors": ["gray", "orange", "yellow"], + "curve2": "" + }], "well_holder_1A", 200, 700, "DEPT") + var resd_plot_template_1 = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ['ILD'], ["RED"], [""], [ + { + "curve_name": "ILD", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [5, 10, 25], + "fill_colors": ["#ffe6e6", "#ffb3b3", "red"], + "curve2": "ILD" + }], "well_holder_1B", 200, 700, "DEPT") + var poro_plot_template_1 = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ["NPHI", "DPHI"], ["purple", "pink"], [""], [{ + "curve_name": "NPHI", + "fill": "yes", + "fill_direction": "between", + "cutoffs": [0], + "fill_colors": ["lightblue"], + "curve2": "DPHI" + }, + { + "curve_name": "DPHI", + "fill": "no", + "fill_direction": "left", + "cutoffs": [], + "fill_colors": [], + "curve2": "" + } + ], "well_holder_1C", 200, 700, "DEPT") + var gr_plot_template_1 = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ["GR"], ["black"], [""], + [{ + "curve_name": "GR", + "fill": "yes", + "fill_direction": "right", + "cutoffs": [0, ShaleSiltCutOff, SiltSandCutOff], + "fill_colors": ["yellow", "orange", "gray"], + "curve2": "" + }], "well_holder_1D", 200, 700, "DEPT") + wellioviz.multipleLogPlot(div_id, [gr_plot_template_noFill, gr_plot_template_1, resd_plot_template_1, poro_plot_template_1], true) + + // Get Template + // d3.json(json_file).then(function (data) { + // // Load json and plot it + // // let well_d3_obj = wellioviz.convertWellJSONToObj( + // // data, + // // Object.keys(data.CURVES), + // // data['WELL INFORMATION BLOCK']['UWI']['DATA'], + // // 'DEPTH') + // let ShaleSiltCutOff = 80 + // let SiltSandCutOff = 55 + // let three_things_2 = wellioviz.fromJSONofWEllGetThingsForPlotting(data, 'DEPTH') + // var example_template = wellioviz.curveBoxTemplateExamples("example") + // gr_plot_template_1 = wellioviz.minimumDataIntoTemplateFunc(example_template, three_things_2['well_log_curves_reformatted_for_d3'], three_things_2['uwi'], ["GR"], ["black"], ["API"], + // [{ + // "curve_name": "GR", + // "fill": "yes", + // "fill_direction": "right", + // "cutoffs": [0, ShaleSiltCutOff, SiltSandCutOff], + // "fill_colors": ["yellow", "orange", "gray"], + // "curve2": "" + // }], "well_holder_1A", 200, 800, "DEPTH") + // // cali_plot_template_noFill = wellioviz.minimumDataIntoTemplateFunc(example_template,three_things_2['well_log_curves_reformatted_for_d3'],three_things_2['uwi'],["CALI"],["black"],["IN"],[ + // // {"curve_name":"GR","fill":"no","fill_direction":"left","cutoffs":[0,ShaleSiltCutOff,SiltSandCutOff],"fill_colors":["gray","orange","yellow"],"curve2":""}],"well_holder_1A",200,800,"DEPTH") + // result_1 = wellioviz.multipleLogPlot(div_id, [gr_plot_template_1], true) + // + // + // // return visualization + // // return result_1 + // }) + // return result_1 + +} \ No newline at end of file diff --git a/panel_test_app/well_log_viz/curve_box.js b/panel_test_app/well_log_viz/curve_box.js new file mode 100644 index 0000000..6e05d9c --- /dev/null +++ b/panel_test_app/well_log_viz/curve_box.js @@ -0,0 +1,160 @@ +function CurveBox(well_curve_config_template, rootNode) { + //// Getting the variables out of the input json template + well_curve_config_template = well_curve_config_template[0] + let multipleLines = well_curve_config_template["multipleLines"] + let curveNames = well_curve_config_template["curveNames"] + let curveColors = well_curve_config_template["curveColors"] + let curveName = curveNames[0] + let curveColor = curveColors[0] + //// + let data = well_curve_config_template["data"] + let width = well_curve_config_template["width"] + let height = well_curve_config_template["height"] + let margin = well_curve_config_template["margin"] + let depth_curve_name = well_curve_config_template["depth_curve_name"] + //// Calculate depth min and max + let depth_min + if (!depth_min) { + depth_min = d3.min(data, function (d) { + return +d[depth_curve_name]; + }); + } + let depth_max + if (!depth_max) { + depth_max = d3.max(data, function (d) { + return +d[depth_curve_name]; + }); + } + // Calculate x domain extent for one or more than one curve + let mins = [] + let maxes = [] + for (let i = 0; i < curveNames.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curveNames[i]] + }) + let max_this = d3.max(data, function (d) { + return +d[curveNames[i]] + }) + mins.push(min_this) + maxes.push(max_this) + } + // let min_all_curves = d3.min(mins) + // let max_all_curves = d3.max(maxes) + let min_all_curves = d3.min([0]) + let max_all_curves = d3.max([50]) + //// Calculate Axis & Scales + let x = d3.scaleLinear().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]) + let y = d3.scaleLinear().domain([depth_max, depth_min]).nice().range([height - margin.bottom, margin.top]) + let xAxis = g => g.attr("transform", `translate(0,${height - margin.bottom })`).call(d3.axisBottom(x).ticks(width / 80).tickSizeOuter(0)) + let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + /////// All variables created above now they are applied below + /////// , some in for loops for multiple curves and areas + + /////// attempt at function for color used in ..... + function colors(data_array) { + let color_array = []; + for (let i = 0; i < data_array.length; i++) { + if (data[i][curveName] > 0) { + color_array.push("blue") + } else { + color_array.push("green") + } + } + return color_array + } + + //// START to make the firt SVG + const svg = d3.select("#"+rootNode).append("svg") + svg.attr("class", "first") + svg.attr("width", width) + .attr("height", height); + svg.append("g") + .call(xAxis); + svg.append("g") + .call(yAxis); + /////// throw away code for single curve to plot that will be deleted soon + ///// was here: + //// Code that assumes multiple curves are plotted in same curvebox + if (multipleLines == "yes") { + for (let k = 0; k < curveNames.length; k++) { + ///// code that creates a line for each Curve in order provided and applies + ///// the color in the color array in order provided + let another_line = d3.line().x(d => x(d[curveNames[k]])).y(d => y(d[depth_curve_name])); + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curveColors[k]) + .attr("stroke-width", 1.5) + .attr("stroke-linejoin", "round") + .attr("stroke-linecap", "round") + .attr("d", another_line); + } + // define the area filled under the curve + let two_curve_fill_flag = "no" + for (let i = 0; i < well_curve_config_template["fill"].length; i++) { + //// + if (well_curve_config_template["fill"][i]["fill"] == "yes") { + + let number_colors = well_curve_config_template["fill"][i]["fillColors"].length + let curveName1 = well_curve_config_template["fill"][i]["curveName"] + let threshold = -99999999 + let fillColor = "gray" + console.log("got inside fill,", curveName1, 'number_colors', number_colors) + ////// + + for (let j = 0; j < number_colors; j++) { + console.log("got to start of J loop", j) + let area1 = d3.area() + if (number_colors != 0) { + threshold = well_curve_config_template["fill"][i]["cutoffs"][j] + fillColor = well_curve_config_template["fill"][i]["fillColors"][j] + } + if (well_curve_config_template["fill"][i]["fillDirection"] == "left") { + let startFromLeft = well_curve_config_template["margin"]["left"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => startFromLeft) + .defined(d => ((d[curveName1]) > threshold)) + .y(d => y(d[depth_curve_name])); + } + if (well_curve_config_template["fill"][i]["fillDirection"] == "right") { + let startFromRight = well_curve_config_template["margin"]["right"] + area1 + .x0(d => x(d[curveName1])) + .x1(d => startFromRight) + .defined(d => ((d[curveName1]) < threshold)) + .y(d => y(d[depth_curve_name])); + } + if (well_curve_config_template["fill"][i]["fillDirection"] == "between") { + let between2Curve = well_curve_config_template["fill"][i]["curve2"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => x(d[between2Curve])) + .defined(d => ((d[curveName1]) > threshold)) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill", fillColor) + .attr("fill-opacity", 0.8); + ///// + console.log("got to end of J loop", j) + } + } + } + } else { + let another_line = d3.line().x(d => x(d[curveNames[0]])).y(d => y(d[depth_curve_name])); + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curveColors[0]) + .attr("stroke-width", 1.5) + .attr("stroke-linejoin", "round") + .attr("stroke-linecap", "round") + .attr("d", another_line); + } + return svg.node(); +} \ No newline at end of file diff --git a/panel_test_app/well_log_viz/d3.js b/panel_test_app/well_log_viz/d3.js new file mode 100644 index 0000000..0e2fd15 --- /dev/null +++ b/panel_test_app/well_log_viz/d3.js @@ -0,0 +1,18428 @@ +// https://d3js.org v5.12.0 Copyright 2019 Mike Bostock +(function (global, factory) { +typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : +typeof define === 'function' && define.amd ? define(['exports'], factory) : +(global = global || self, factory(global.d3 = global.d3 || {})); +}(this, function (exports) { 'use strict'; + +var version = "5.12.0"; + +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function bisector(compare) { + if (compare.length === 1) compare = ascendingComparator(compare); + return { + left: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + }; +} + +function ascendingComparator(f) { + return function(d, x) { + return ascending(f(d), x); + }; +} + +var ascendingBisect = bisector(ascending); +var bisectRight = ascendingBisect.right; +var bisectLeft = ascendingBisect.left; + +function pairs(array, f) { + if (f == null) f = pair; + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = f(p, p = array[++i]); + return pairs; +} + +function pair(a, b) { + return [a, b]; +} + +function cross(values0, values1, reduce) { + var n0 = values0.length, + n1 = values1.length, + values = new Array(n0 * n1), + i0, + i1, + i, + value0; + + if (reduce == null) reduce = pair; + + for (i0 = i = 0; i0 < n0; ++i0) { + for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { + values[i] = reduce(value0, values1[i1]); + } + } + + return values; +} + +function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function number(x) { + return x === null ? NaN : +x; +} + +function variance(values, valueof) { + var n = values.length, + m = 0, + i = -1, + mean = 0, + value, + delta, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + if (m > 1) return sum / (m - 1); +} + +function deviation(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; +} + +function extent(values, valueof) { + var n = values.length, + i = -1, + value, + min, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } + + return [min, max]; +} + +var array = Array.prototype; + +var slice = array.slice; +var map = array.map; + +function constant(x) { + return function() { + return x; + }; +} + +function identity(x) { + return x; +} + +function sequence(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; +} + +var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + +function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + start = Math.floor(start * step); + stop = Math.ceil(stop * step); + ticks = new Array(n = Math.ceil(start - stop + 1)); + while (++i < n) ticks[i] = (start - i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; +} + +function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); +} + +function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; +} + +function thresholdSturges(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; +} + +function histogram() { + var value = identity, + domain = extent, + threshold = thresholdSturges; + + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + tz = tickStep(x0, x1, tz); + tz = sequence(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; +} + +function threshold(values, p, valueof) { + if (valueof == null) valueof = number; + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); +} + +function freedmanDiaconis(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3))); +} + +function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); +} + +function max(values, valueof) { + var n = values.length, + i = -1, + value, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && value > max) { + max = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && value > max) { + max = value; + } + } + } + } + } + + return max; +} + +function mean(values, valueof) { + var n = values.length, + m = n, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) sum += value; + else --m; + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; + else --m; + } + } + + if (m) return sum / m; +} + +function median(values, valueof) { + var n = values.length, + i = -1, + value, + numbers = []; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + numbers.push(value); + } + } + } + + else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + numbers.push(value); + } + } + } + + return threshold(numbers.sort(ascending), 0.5); +} + +function merge(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + + return merged; +} + +function min(values, valueof) { + var n = values.length, + i = -1, + value, + min; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && min > value) { + min = value; + } + } + } + } + } + + else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && min > value) { + min = value; + } + } + } + } + } + + return min; +} + +function permute(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; +} + +function scan(values, compare) { + if (!(n = values.length)) return; + var n, + i = 0, + j = 0, + xi, + xj = values[j]; + + if (compare == null) compare = ascending; + + while (++i < n) { + if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { + xj = xi, j = i; + } + } + + if (compare(xj, xj) === 0) return j; +} + +function shuffle(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + + return array; +} + +function sum(values, valueof) { + var n = values.length, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (value = +values[i]) sum += value; // Note: zero and null are equivalent. + } + } + + else { + while (++i < n) { + if (value = +valueof(values[i], i, values)) sum += value; + } + } + + return sum; +} + +function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; +} + +function length(d) { + return d.length; +} + +function zip() { + return transpose(arguments); +} + +var slice$1 = Array.prototype.slice; + +function identity$1(x) { + return x; +} + +var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; + +function translateX(x) { + return "translate(" + (x + 0.5) + ",0)"; +} + +function translateY(y) { + return "translate(0," + (y + 0.5) + ")"; +} + +function number$1(scale) { + return function(d) { + return +scale(d); + }; +} + +function center(scale) { + var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. + if (scale.round()) offset = Math.round(offset); + return function(d) { + return +scale(d) + offset; + }; +} + +function entering() { + return !this.__axis; +} + +function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + 0.5, + range1 = +range[range.length - 1] + 0.5, + position = (scale.bandwidth ? center : number$1)(scale.copy()), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient == right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position(d)); }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function() { this.__axis = position; }); + } + + axis.scale = function(_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function() { + return tickArguments = slice$1.call(arguments), axis; + }; + + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function(_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function(_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function(_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function(_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function(_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + return axis; +} + +function axisTop(scale) { + return axis(top, scale); +} + +function axisRight(scale) { + return axis(right, scale); +} + +function axisBottom(scale) { + return axis(bottom, scale); +} + +function axisLeft(scale) { + return axis(left, scale); +} + +var noop = {value: function() {}}; + +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} + +function Dispatch(_) { + this._ = _; +} + +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); +} + +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; + +function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } +} + +function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; +} + +var xhtml = "http://www.w3.org/1999/xhtml"; + +var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; +} + +function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; +} + +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} + +function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); +} + +function none() {} + +function selector(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +} + +function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); +} + +function empty() { + return []; +} + +function selectorAll(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; +} + +function selection_selectAll(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); +} + +function matcher(selector) { + return function() { + return this.matches(selector); + }; +} + +function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); +} + +function sparse(update) { + return new Array(update.length); +} + +function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); +} + +function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; +} + +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } +}; + +function constant$1(x) { + return function() { + return x; + }; +} + +var keyPrefix = "$"; // Protect against keys like “__proto__”. + +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} + +function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } +} + +function selection_data(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function(d) { data[++j] = d; }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant$1(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} + +function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); +} + +function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +function selection_merge(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); +} + +function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; +} + +function selection_sort(compare) { + if (!compare) compare = ascending$1; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); +} + +function ascending$1(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; +} + +function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +function selection_nodes() { + var nodes = new Array(this.size()), i = -1; + this.each(function() { nodes[++i] = this; }); + return nodes; +} + +function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; +} + +function selection_size() { + var size = 0; + this.each(function() { ++size; }); + return size; +} + +function selection_empty() { + return !this.node(); +} + +function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; +} + +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} + +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} + +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} + +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} + +function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); +} + +function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document +} + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} + +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} + +function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +} + +function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); +} + +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} + +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} + +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} + +function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; +} + +function classArray(string) { + return string.trim().split(/^|\s+/); +} + +function classList(node) { + return node.classList || new ClassList(node); +} + +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} + +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; + +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} + +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} + +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} + +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} + +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} + +function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); +} + +function textRemove() { + this.textContent = ""; +} + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} + +function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; +} + +function htmlRemove() { + this.innerHTML = ""; +} + +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} + +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} + +function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; +} + +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} + +function selection_raise() { + return this.each(raise); +} + +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} + +function selection_lower() { + return this.each(lower); +} + +function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); +} + +function constantNull() { + return null; +} + +function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} + +function selection_remove() { + return this.each(remove); +} + +function selection_cloneShallow() { + return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling); +} + +function selection_cloneDeep() { + return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling); +} + +function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; +} + +var filterEvents = {}; + +exports.event = null; + +if (typeof document !== "undefined") { + var element = document.documentElement; + if (!("onmouseenter" in element)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } +} + +function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function(event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; +} + +function contextListener(listener, index, group) { + return function(event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; +} + +function parseTypenames$1(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); +} + +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} + +function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function(d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; +} + +function selection_on(typename, value, capture) { + var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; +} + +function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } +} + +function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); +} + +function dispatchConstant(type, params) { + return function() { + return dispatchEvent(this, type, params); + }; +} + +function dispatchFunction(type, params) { + return function() { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; +} + +function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); +} + +var root = [null]; + +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} + +function selection() { + return new Selection([[document.documentElement]], root); +} + +Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch +}; + +function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); +} + +function create(name) { + return select(creator(name).call(document.documentElement)); +} + +var nextId = 0; + +function local() { + return new Local; +} + +function Local() { + this._ = "@" + (++nextId).toString(36); +} + +Local.prototype = local.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } +}; + +function sourceEvent() { + var current = exports.event, source; + while (source = current.sourceEvent) current = source; + return current; +} + +function point(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; +} + +function mouse(node) { + var event = sourceEvent(); + if (event.changedTouches) event = event.changedTouches[0]; + return point(node, event); +} + +function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); +} + +function touch(node, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point(node, touch); + } + } + + return null; +} + +function touches(node, touches) { + if (touches == null) touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point(node, touches[i]); + } + + return points; +} + +function nopropagation() { + exports.event.stopImmediatePropagation(); +} + +function noevent() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +} + +function dragDisable(view) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } +} + +function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function() { selection.on("click.drag", null); }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } +} + +function constant$2(x) { + return function() { + return x; + }; +} + +function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { + this.target = target; + this.type = type; + this.subject = subject; + this.identifier = id; + this.active = active; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + this._ = dispatch; +} + +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// Ignore right-click, since that should open the context menu. +function defaultFilter() { + return !exports.event.ctrlKey && !exports.event.button; +} + +function defaultContainer() { + return this.parentNode; +} + +function defaultSubject(d) { + return d == null ? {x: exports.event.x, y: exports.event.y} : d; +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function drag() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments); + if (!gesture) return; + select(exports.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + dragDisable(exports.event.view); + nopropagation(); + mousemoving = false; + mousedownx = exports.event.clientX; + mousedowny = exports.event.clientY; + gesture("start"); + } + + function mousemoved() { + noevent(); + if (!mousemoving) { + var dx = exports.event.clientX - mousedownx, dy = exports.event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag"); + } + + function mouseupped() { + select(exports.event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(exports.event.view, mousemoving); + noevent(); + gestures.mouse("end"); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = exports.event.changedTouches, + c = container.apply(this, arguments), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) { + nopropagation(); + gesture("start"); + } + } + } + + function touchmoved() { + var touches = exports.event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(); + gesture("drag"); + } + } + } + + function touchended() { + var touches = exports.event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(); + gesture("end"); + } + } + } + + function beforestart(id, container, point, that, args) { + var p = point(container, id), s, dx, dy, + sublisteners = listeners.copy(); + + if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() { + if ((exports.event.subject = s = subject.apply(that, args)) == null) return false; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return true; + })) return; + + return function gesture(type) { + var p0 = p, n; + switch (type) { + case "start": gestures[id] = gesture, n = active++; break; + case "end": delete gestures[id], --active; // nobreak + case "drag": p = point(container, id), n = active; break; + } + customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); + }; + } + + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject; + }; + + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; +} + +function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} + +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} + +function Color() {} + +var darker = 0.7; +var brighter = 1 / darker; + +var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex3 = /^#([0-9a-f]{3})$/, + reHex6 = /^#([0-9a-f]{6})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + +var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 +}; + +define(Color, color, { + copy: function(channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function() { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); + +function color_formatHex() { + return this.rgb().formatHex(); +} + +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} + +function color_formatRgb() { + return this.rgb().formatRgb(); +} + +function color(format) { + var m; + format = (format + "").trim().toLowerCase(); + return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00 + : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000 + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; +} + +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +} + +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); +} + +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} + +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} + +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} + +define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); + +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} + +function rgb_formatRgb() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); +} + +function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} + +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} + +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} + +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} + +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } +})); + +/* From FvD 13.37, CSS Color Module Level 3 */ +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; +} + +var deg2rad = Math.PI / 180; +var rad2deg = 180 / Math.PI; + +// https://observablehq.com/@mbostock/lab-and-rgb +var K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; + +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} + +function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); +} + +function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} + +function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} + +define(Lab, lab, extend(Color, { + brighter: function(k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } +})); + +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} + +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} + +function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} + +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} + +function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} + +function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} + +function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +} + +define(Hcl, hcl, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return hcl2lab(this).rgb(); + } +})); + +var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} + +function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} + +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} + +define(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } +})); + +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; +} + +function basis$1(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +function basisClosed(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +function constant$3(x) { + return function() { + return x; + }; +} + +function linear(a, d) { + return function(t) { + return a + t * d; + }; +} + +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; +} + +function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a); +} + +function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a); + }; +} + +function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant$3(isNaN(a) ? b : a); +} + +var interpolateRgb = (function rgbGamma(y) { + var color = gamma(y); + + function rgb$1(start, end) { + var r = color((start = rgb(start)).r, (end = rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb$1.gamma = rgbGamma; + + return rgb$1; +})(1); + +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function(t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; +} + +var rgbBasis = rgbSpline(basis$1); +var rgbBasisClosed = rgbSpline(basisClosed); + +function array$1(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = interpolateValue(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; +} + +function date(a, b) { + var d = new Date; + return a = +a, b -= a, function(t) { + return d.setTime(a + b * t), d; + }; +} + +function interpolateNumber(a, b) { + return a = +a, b -= a, function(t) { + return a + b * t; + }; +} + +function object(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = interpolateValue(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; +} + +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + +function zero(b) { + return function() { + return b; + }; +} + +function one(b) { + return function(t) { + return b(t) + ""; + }; +} + +function interpolateString(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: interpolateNumber(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +} + +function interpolateValue(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant$3(b) + : (t === "number" ? interpolateNumber + : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString) + : b instanceof color ? interpolateRgb + : b instanceof Date ? date + : Array.isArray(b) ? array$1 + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : interpolateNumber)(a, b); +} + +function discrete(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +function hue$1(a, b) { + var i = hue(+a, +b); + return function(t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; +} + +function interpolateRound(a, b) { + return a = +a, b -= a, function(t) { + return Math.round(a + b * t); + }; +} + +var degrees = 180 / Math.PI; + +var identity$2 = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; + +function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; +} + +var cssNode, + cssRoot, + cssView, + svgNode; + +function parseCss(value) { + if (value === "none") return identity$2; + if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); +} + +function parseSvg(value) { + if (value == null) return identity$2; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +} + +function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} + +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +var rho = Math.SQRT2, + rho2 = 2, + rho4 = 4, + epsilon2 = 1e-12; + +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; +} + +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; +} + +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); +} + +// p0 = [ux0, uy0, w0] +// p1 = [ux1, uy1, w1] +function interpolateZoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; +} + +function hsl$1(hue) { + return function(start, end) { + var h = hue((start = hsl(start)).h, (end = hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hsl$2 = hsl$1(hue); +var hslLong = hsl$1(nogamma); + +function lab$1(start, end) { + var l = nogamma((start = lab(start)).l, (end = lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; +} + +function hcl$1(hue) { + return function(start, end) { + var h = hue((start = hcl(start)).h, (end = hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } +} + +var hcl$2 = hcl$1(hue); +var hclLong = hcl$1(nogamma); + +function cubehelix$1(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix$1(start, end) { + var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix$1.gamma = cubehelixGamma; + + return cubehelix$1; + })(1); +} + +var cubehelix$2 = cubehelix$1(hue); +var cubehelixLong = cubehelix$1(nogamma); + +function piecewise(interpolate, values) { + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function(t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; +} + +function quantize(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +} + +var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; + +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} + +function clearNow() { + clockNow = 0; +} + +function Timer() { + this._call = + this._time = + this._next = null; +} + +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; + +function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; +} + +function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; +} + +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} + +function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; +} + +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} + +function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +function timeout$1(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(function(elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +function interval$1(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + delay = +delay, time = time == null ? now() : +time; + t.restart(function tick(elapsed) { + elapsed += total; + t.restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + return t; +} + +var emptyOn = dispatch("start", "end", "cancel", "interrupt"); +var emptyTween = []; + +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; + +function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create$1(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} + +function init(node, id) { + var schedule = get$1(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} + +function set$1(node, id) { + var schedule = get$1(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} + +function get$1(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; +} + +function create$1(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return timeout$1(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + timeout$1(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } +} + +function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; +} + +function selection_interrupt(name) { + return this.each(function() { + interrupt(this, name); + }); +} + +function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = set$1(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; +} + +function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = set$1(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; +} + +function transition_tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get$1(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); +} + +function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function() { + var schedule = set$1(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function(node) { + return get$1(node, id).value[name]; + }; +} + +function interpolate(a, b) { + var c; + return (typeof b === "number" ? interpolateNumber + : b instanceof color ? interpolateRgb + : (c = color(b)) ? (b = c, interpolateRgb) + : interpolateString)(a, b); +} + +function attrRemove$1(name) { + return function() { + this.removeAttribute(name); + }; +} + +function attrRemoveNS$1(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} + +function attrConstant$1(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrConstantNS$1(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function attrFunction$1(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function attrFunctionNS$1(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function transition_attr(name, value) { + var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname) + : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value)); +} + +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i(t)); + }; +} + +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i(t)); + }; +} + +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} + +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} + +function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +function delayFunction(id, value) { + return function() { + init(this, id).delay = +value.apply(this, arguments); + }; +} + +function delayConstant(id, value) { + return value = +value, function() { + init(this, id).delay = value; + }; +} + +function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get$1(this.node(), id).delay; +} + +function durationFunction(id, value) { + return function() { + set$1(this, id).duration = +value.apply(this, arguments); + }; +} + +function durationConstant(id, value) { + return value = +value, function() { + set$1(this, id).duration = value; + }; +} + +function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get$1(this.node(), id).duration; +} + +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set$1(this, id).ease = value; + }; +} + +function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get$1(this.node(), id).ease; +} + +function transition_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); +} + +function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); +} + +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} + +function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set$1; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; +} + +function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get$1(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); +} + +function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; +} + +function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); +} + +function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); +} + +function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); +} + +var Selection$1 = selection.prototype.constructor; + +function transition_selection() { + return new Selection$1(this._groups, this._parents); +} + +function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} + +function styleRemove$1(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant$1(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function styleFunction$1(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0 = styleValue(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function() { + var schedule = set$1(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; +} + +function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove$1(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant$1(name, i, value), priority) + .on("end.style." + name, null); +} + +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i(t), priority); + }; +} + +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} + +function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +function textConstant$1(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction$1(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction$1(tweenValue(this, "text", value)) + : textConstant$1(value == null ? "" : value + "")); +} + +function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get$1(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); +} + +function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = {value: reject}, + end = {value: function() { if (--size === 0) resolve(); }}; + + that.each(function() { + var schedule = set$1(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + }); +} + +var id = 0; + +function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; +} + +function transition(name) { + return selection().transition(name); +} + +function newId() { + return ++id; +} + +var selection_prototype = selection.prototype; + +Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + end: transition_end +}; + +function linear$1(t) { + return +t; +} + +function quadIn(t) { + return t * t; +} + +function quadOut(t) { + return t * (2 - t); +} + +function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; +} + +function cubicIn(t) { + return t * t * t; +} + +function cubicOut(t) { + return --t * t * t + 1; +} + +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +var exponent = 3; + +var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; +})(exponent); + +var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; +})(exponent); + +var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; +})(exponent); + +var pi = Math.PI, + halfPi = pi / 2; + +function sinIn(t) { + return 1 - Math.cos(t * halfPi); +} + +function sinOut(t) { + return Math.sin(t * halfPi); +} + +function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; +} + +function expIn(t) { + return Math.pow(2, 10 * t - 10); +} + +function expOut(t) { + return 1 - Math.pow(2, -10 * t); +} + +function expInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; +} + +function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); +} + +function circleOut(t) { + return Math.sqrt(1 - --t * t); +} + +function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; +} + +var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + +function bounceIn(t) { + return 1 - bounceOut(1 - t); +} + +function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; +} + +function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; +} + +var overshoot = 1.70158; + +var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return t * t * ((s + 1) * t - s); + } + + backIn.overshoot = custom; + + return backIn; +})(overshoot); + +var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((s + 1) * t + s) + 1; + } + + backOut.overshoot = custom; + + return backOut; +})(overshoot); + +var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; +})(overshoot); + +var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; + +var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function(a) { return custom(a, p * tau); }; + elasticIn.period = function(p) { return custom(a, p); }; + + return elasticIn; +})(amplitude, period); + +var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticOut.period = function(p) { return custom(a, p); }; + + return elasticOut; +})(amplitude, period); + +var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) + : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticInOut.period = function(p) { return custom(a, p); }; + + return elasticInOut; +})(amplitude, period); + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + return defaultTiming.time = now(), defaultTiming; + } + } + return timing; +} + +function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); +} + +selection.prototype.interrupt = selection_interrupt; +selection.prototype.transition = selection_transition; + +var root$1 = [null]; + +function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root$1, name, +i); + } + } + } + + return null; +} + +function constant$4(x) { + return function() { + return x; + }; +} + +function BrushEvent(target, type, selection) { + this.target = target; + this.type = type; + this.selection = selection; +} + +function nopropagation$1() { + exports.event.stopImmediatePropagation(); +} + +function noevent$1() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +} + +var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + +function number1(e) { + return [+e[0], +e[1]]; +} + +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} + +function toucher(identifier) { + return function(target) { + return touch(target, exports.event.touches, identifier); + }; +} + +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; }, + output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } +}; + +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; }, + output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } +}; + +var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { return xy == null ? null : number2(xy); }, + output: function(xy) { return xy; } +}; + +var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" +}; + +var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" +}; + +var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" +}; + +var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 +}; + +var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 +}; + +function type(t) { + return {type: t}; +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter$1() { + return !exports.event.ctrlKey && !exports.event.button; +} + +function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +} + +function defaultTouchable$1() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +// Like d3.local, but with the name “__brush” rather than auto-generated. +function local$1(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; +} + +function empty$1(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; +} + +function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; +} + +function brushX() { + return brush$1(X); +} + +function brushY() { + return brush$1(Y); +} + +function brush() { + return brush$1(XY); +} + +function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter$1, + touchable = defaultTouchable$1, + keys = true, + listeners = dispatch(brush, "start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function() { + var extent = local$1(this).extent; + select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function(d) { return d.type; }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function(d) { return "handle handle--" + d.type; }) + .attr("cursor", function(d) { return cursors[d.type]; }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function(group, selection) { + if (group.selection) { + group + .on("start.brush", function() { emitter(this, arguments).beforestart().start(); }) + .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); }) + .tween("brush", function() { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = interpolateValue(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function() { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function(group) { + brush.move(group, null); + }; + + function redraw() { + var group = select(this), + selection = local$1(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; }) + .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; }) + .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; }) + .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; }); + } + + else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args, clean) { + return (!clean && that.__brush.emitter) || new Emitter(that, args); + } + + function Emitter(that, args) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + } + + Emitter.prototype = { + beforestart: function() { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function() { + if (this.starting) this.starting = false, this.emit("start"); + else this.emit("brush"); + return this; + }, + brush: function() { + this.emit("brush"); + return this; + }, + end: function() { + if (--this.active === 0) delete this.state.emitter, this.emit("end"); + return this; + }, + emit: function(type) { + customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function started() { + if (touchending && !exports.event.touches) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = exports.event.target.__data__.type, + mode = (keys && exports.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && exports.event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local$1(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && exports.event.shiftKey, + lockX, + lockY, + pointer = exports.event.touches ? toucher(exports.event.changedTouches[0].identifier) : mouse, + point0 = pointer(that), + point = point0, + emit = emitter(that, arguments, true).beforestart(); + + if (type === "overlay") { + if (selection) moving = true; + state.selection = selection = [ + [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], + [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] + ]; + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + if (exports.event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = select(exports.event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + dragDisable(exports.event.view); + } + + nopropagation$1(); + interrupt(that); + redraw.call(that); + emit.start(); + + function moved() { + var point1 = pointer(that); + if (shifting && !lockX && !lockY) { + if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; + else lockX = true; + } + point = point1; + moving = true; + noevent$1(); + move(); + } + + function move() { + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + break; + } + case MODE_CENTER: { + if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); + if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(); + } + } + + function ended() { + nopropagation$1(); + if (exports.event.touches) { + if (exports.event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + } else { + yesdrag(exports.event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty$1(selection)) state.selection = null, redraw.call(that); + emit.end(); + } + + function keydowned() { + switch (exports.event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: return; + } + noevent$1(); + } + + function keyupped() { + switch (exports.event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (exports.event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: return; + } + noevent$1(); + } + } + + function touchmoved() { + emitter(this, arguments).moved(); + } + + function touchended() { + emitter(this, arguments).ended(); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4(number2(_)), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function(_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; +} + +var cos = Math.cos; +var sin = Math.sin; +var pi$1 = Math.PI; +var halfPi$1 = pi$1 / 2; +var tau$1 = pi$1 * 2; +var max$1 = Math.max; + +function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; +} + +function chord() { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = [], + groupIndex = sequence(n), + subgroupIndex = [], + chords = [], + groups = chords.groups = new Array(n), + subgroups = new Array(n * n), + k, + x, + x0, + dx, + i, + j; + + // Compute the sum. + k = 0, i = -1; while (++i < n) { + x = 0, j = -1; while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(sequence(n)); + k += x; + } + + // Sort groups… + if (sortGroups) groupIndex.sort(function(a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + + // Sort subgroups… + if (sortSubgroups) subgroupIndex.forEach(function(d, i) { + d.sort(function(a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + + // Convert the sum to scaling factor for [0, 2pi]. + // TODO Allow start and end angle to be specified? + // TODO Allow padding to be specified as percentage? + k = max$1(0, tau$1 - padAngle * n) / k; + dx = k ? padAngle : tau$1 / n; + + // Compute the start and end angle for each group and subgroup. + // Note: Opera has a bug reordering object literal properties! + x = 0, i = -1; while (++i < n) { + x0 = x, j = -1; while (++j < n) { + var di = groupIndex[i], + dj = subgroupIndex[di][j], + v = matrix[di][dj], + a0 = x, + a1 = x += v * k; + subgroups[dj * n + di] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += dx; + } + + // Generate chords for each (non-empty) subgroup-subgroup link. + i = -1; while (++i < n) { + j = i - 1; while (++j < n) { + var source = subgroups[j * n + i], + target = subgroups[i * n + j]; + if (source.value || target.value) { + chords.push(source.value < target.value + ? {source: target, target: source} + : {source: source, target: target}); + } + } + } + + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle; + }; + + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; +} + +var slice$2 = Array.prototype.slice; + +function constant$5(x) { + return function() { + return x; + }; +} + +var pi$2 = Math.PI, + tau$2 = 2 * pi$2, + epsilon$1 = 1e-6, + tauEpsilon = tau$2 - epsilon$1; + +function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; +} + +function path() { + return new Path; +} + +Path.prototype = path.prototype = { + constructor: Path, + moveTo: function(x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function(x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function(x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon$1)); + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon$1) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function(x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau$2 + tau$2; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon$1) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function(x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function() { + return this._; + } +}; + +function defaultSource(d) { + return d.source; +} + +function defaultTarget(d) { + return d.target; +} + +function defaultRadius(d) { + return d.radius; +} + +function defaultStartAngle(d) { + return d.startAngle; +} + +function defaultEndAngle(d) { + return d.endAngle; +} + +function ribbon() { + var source = defaultSource, + target = defaultTarget, + radius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + context = null; + + function ribbon() { + var buffer, + argv = slice$2.call(arguments), + s = source.apply(this, argv), + t = target.apply(this, argv), + sr = +radius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi$1, + sa1 = endAngle.apply(this, argv) - halfPi$1, + sx0 = sr * cos(sa0), + sy0 = sr * sin(sa0), + tr = +radius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi$1, + ta1 = endAngle.apply(this, argv) - halfPi$1; + + if (!context) context = buffer = path(); + + context.moveTo(sx0, sy0); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + context.quadraticCurveTo(0, 0, sx0, sy0); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + ribbon.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius; + }; + + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle; + }; + + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; +} + +var prefix = "$"; + +function Map() {} + +Map.prototype = map$1.prototype = { + constructor: Map, + has: function(key) { + return (prefix + key) in this; + }, + get: function(key) { + return this[prefix + key]; + }, + set: function(key, value) { + this[prefix + key] = value; + return this; + }, + remove: function(key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function() { + for (var property in this) if (property[0] === prefix) delete this[property]; + }, + keys: function() { + var keys = []; + for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); + return keys; + }, + values: function() { + var values = []; + for (var property in this) if (property[0] === prefix) values.push(this[property]); + return values; + }, + entries: function() { + var entries = []; + for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]}); + return entries; + }, + size: function() { + var size = 0; + for (var property in this) if (property[0] === prefix) ++size; + return size; + }, + empty: function() { + for (var property in this) if (property[0] === prefix) return false; + return true; + }, + each: function(f) { + for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); + } +}; + +function map$1(object, f) { + var map = new Map; + + // Copy constructor. + if (object instanceof Map) object.each(function(value, key) { map.set(key, value); }); + + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; + + if (f == null) while (++i < n) map.set(i, object[i]); + else while (++i < n) map.set(f(o = object[i], i, object), o); + } + + // Convert object to map. + else if (object) for (var key in object) map.set(key, object[key]); + + return map; +} + +function nest() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) { + if (sortValues != null) array.sort(sortValues); + return rollup != null ? rollup(array) : array; + } + + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map$1(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } + + valuesByKey.each(function(values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); + + return result; + } + + function entries(map, depth) { + if (++depth > keys.length) return map; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) array = map.entries(); + else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); }); + return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array; + } + + return nest = { + object: function(array) { return apply(array, 0, createObject, setObject); }, + map: function(array) { return apply(array, 0, createMap, setMap); }, + entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); }, + key: function(d) { keys.push(d); return nest; }, + sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; }, + sortValues: function(order) { sortValues = order; return nest; }, + rollup: function(f) { rollup = f; return nest; } + }; +} + +function createObject() { + return {}; +} + +function setObject(object, key, value) { + object[key] = value; +} + +function createMap() { + return map$1(); +} + +function setMap(map, key, value) { + map.set(key, value); +} + +function Set() {} + +var proto = map$1.prototype; + +Set.prototype = set$2.prototype = { + constructor: Set, + has: proto.has, + add: function(value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each +}; + +function set$2(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) object.each(function(value) { set.add(value); }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) while (++i < n) set.add(object[i]); + else while (++i < n) set.add(f(object[i], i, object)); + } + + return set; +} + +function keys(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; +} + +function values(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; +} + +function entries(map) { + var entries = []; + for (var key in map) entries.push({key: key, value: map[key]}); + return entries; +} + +var array$2 = Array.prototype; + +var slice$3 = array$2.slice; + +function ascending$2(a, b) { + return a - b; +} + +function area(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; +} + +function constant$6(x) { + return function() { + return x; + }; +} + +function contains(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; +} + +function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; +} + +function segmentContains(a, b, c) { + var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); +} + +function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); +} + +function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; +} + +function noop$1() {} + +var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] +]; + +function contours() { + var dx = 1, + dy = 1, + threshold = thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = extent(values), start = domain[0], stop = domain[1]; + tz = tickStep(start, stop, tz); + tz = sequence(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending$2); + } + + return tz.map(function(value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function(ring) { + smooth(ring, values, value); + if (area(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function(hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function(point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), contours) : threshold; + }; + + contours.smooth = function(_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours) : smooth === smoothLinear; + }; + + return contours; +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } +} + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } +} + +function defaultX(d) { + return d[0]; +} + +function defaultY(d) { + return d[1]; +} + +function defaultWeight() { + return 1; +} + +function density() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant$6(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function(d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = max(values0); + tz = tickStep(0, stop, tz); + tz = sequence(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x; + }; + + density.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y; + }; + + density.weight = function(_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight; + }; + + density.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function(_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), density) : threshold; + }; + + density.bandwidth = function(_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; +} + +var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + +function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "]"; + }).join(",") + "}"); +} + +function customConverter(columns, f) { + var object = objectConverter(columns); + return function(row, i) { + return f(object(row), i, columns); + }; +} + +// Compute unique columns in order of discovery. +function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function(row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; +} + +function pad(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; +} + +function formatYear(year) { + return year < 0 ? "-" + pad(-year, 6) + : year > 9999 ? "+" + pad(year, 6) + : pad(year, 4); +} + +function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); +} + +function dsvFormat(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows + }; +} + +var csv = dsvFormat(","); + +var csvParse = csv.parse; +var csvParseRows = csv.parseRows; +var csvFormat = csv.format; +var csvFormatBody = csv.formatBody; +var csvFormatRows = csv.formatRows; + +var tsv = dsvFormat("\t"); + +var tsvParse = tsv.parse; +var tsvParseRows = tsv.parseRows; +var tsvFormat = tsv.format; +var tsvFormatBody = tsv.formatBody; +var tsvFormatRows = tsv.formatRows; + +function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/.test(value)) value = new Date(value); + else continue; + object[key] = value; + } + return object; +} + +function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); +} + +function blob(input, init) { + return fetch(input, init).then(responseBlob); +} + +function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); +} + +function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); +} + +function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); +} + +function text(input, init) { + return fetch(input, init).then(responseText); +} + +function dsvParse(parse) { + return function(input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function(response) { + return parse(response, row); + }); + }; +} + +function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = dsvFormat(delimiter); + return text(input, init).then(function(response) { + return format.parse(response, row); + }); +} + +var csv$1 = dsvParse(csvParse); +var tsv$1 = dsvParse(tsvParse); + +function image(input, init) { + return new Promise(function(resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function() { resolve(image); }; + image.src = input; + }); +} + +function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.json(); +} + +function json(input, init) { + return fetch(input, init).then(responseJson); +} + +function parser(type) { + return function(input, init) { + return text(input, init).then(function(text) { + return (new DOMParser).parseFromString(text, type); + }); + }; +} + +var xml = parser("application/xml"); + +var html = parser("text/html"); + +var svg = parser("image/svg+xml"); + +function center$1(x, y) { + var nodes; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function(_) { + nodes = _; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +} + +function constant$7(x) { + return function() { + return x; + }; +} + +function jiggle() { + return (Math.random() - 0.5) * 1e-6; +} + +function tree_add(d) { + var x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); +} + +function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; +} + +function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; +} + +function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: x1 = x0 + z, y1 = y0 + z; break; + case 1: x0 = x1 - z, y1 = y0 + z; break; + case 2: x1 = x0 + z, y0 = y1 - z; break; + case 3: x0 = x1 - z, y0 = y1 - z; break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} + +function tree_data() { + var data = []; + this.visit(function(node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; +} + +function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; +} + +function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +} + +function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; +} + +function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; +} + +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; +} + +function tree_root() { + return this._root; +} + +function tree_size() { + var size = 0; + this.visit(function(node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; +} + +function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; +} + +function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +} + +function defaultX$1(d) { + return d[0]; +} + +function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; +} + +function defaultY$1(d) { + return d[1]; +} + +function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; +} + +function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} + +function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; +} + +function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; +} + +var treeProto = quadtree.prototype = Quadtree.prototype; + +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; +}; + +treeProto.add = tree_add; +treeProto.addAll = addAll; +treeProto.cover = tree_cover; +treeProto.data = tree_data; +treeProto.extent = tree_extent; +treeProto.find = tree_find; +treeProto.remove = tree_remove; +treeProto.removeAll = removeAll; +treeProto.root = tree_root; +treeProto.size = tree_size; +treeProto.visit = tree_visit; +treeProto.visitAfter = tree_visitAfter; +treeProto.x = tree_x; +treeProto.y = tree_y; + +function x(d) { + return d.x + d.vx; +} + +function y(d) { + return d.y + d.vy; +} + +function collide(radius) { + var nodes, + radii, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + }; + + return force; +} + +function index(d) { + return d.index; +} + +function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("missing: " + nodeId); + return node; +} + +function link(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant$7(30), + distances, + nodes, + count, + bias, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(); + y = target.y + target.vy - source.y - source.vy || jiggle(); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = map$1(nodes, id), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function(_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength; + }; + + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance; + }; + + return force; +} + +function x$1(d) { + return d.x; +} + +function y$1(d) { + return d.y; +} + +var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + +function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = map$1(), + stepper = timer(step), + event = dispatch("tick", "end"); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.each(function (force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function() { + return stepper.restart(step), simulation; + }, + + stop: function() { + return stepper.stop(), simulation; + }, + + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + }, + + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function(x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} + +function manyBody() { + var nodes, + node, + alpha, + strength = constant$7(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; +} + +function radial(radius, x, y) { + var nodes, + strength = constant$7(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant$7(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _, initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; +} + +function x$2(x) { + var strength = constant$7(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant$7(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x; + }; + + return force; +} + +function y$2(y) { + var strength = constant$7(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant$7(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function(_) { + nodes = _; + initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y; + }; + + return force; +} + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimal(1.23) returns ["123", 0]. +function formatDecimal(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; +} + +function exponent$1(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; +} + +function formatGroup(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; +} + +function formatNumerals(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; +} + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] +var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + +function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); +} + +formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + +function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; +} + +FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; +}; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. +function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; +} + +var prefixExponent; + +function formatPrefixAuto(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! +} + +function formatRounded(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +} + +var formatTypes = { + "%": function(x, p) { return (x * 100).toFixed(p); }, + "b": function(x) { return Math.round(x).toString(2); }, + "c": function(x) { return x + ""; }, + "d": function(x) { return Math.round(x).toString(10); }, + "e": function(x, p) { return x.toExponential(p); }, + "f": function(x, p) { return x.toFixed(p); }, + "g": function(x, p) { return x.toPrecision(p); }, + "o": function(x) { return Math.round(x).toString(8); }, + "p": function(x, p) { return formatRounded(x * 100, p); }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, + "x": function(x) { return Math.round(x).toString(16); } +}; + +function identity$3(x) { + return x; +} + +var map$2 = Array.prototype.map, + prefixes = ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"]; + +function formatLocale(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity$3 : formatGroup(map$2.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity$3 : formatNumerals(map$2.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "-" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Perform the initial formatting. + var valueNegative = value < 0; + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero during formatting, treat as positive. + if (valueNegative && +value === 0) valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": value = valuePrefix + value + valueSuffix + padding; break; + case "=": value = valuePrefix + padding + value + valueSuffix; break; + case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; + default: value = padding + valuePrefix + value + valueSuffix; break; + } + + return numerals(value); + } + + format.toString = function() { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; +} + +var locale; + +defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""], + minus: "-" +}); + +function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; +} + +function precisionFixed(step) { + return Math.max(0, -exponent$1(Math.abs(step))); +} + +function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step))); +} + +function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent$1(max) - exponent$1(step)) + 1; +} + +// Adds floating point numbers with twice the normal precision. +// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and +// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) +// 305–363 (1997). +// Code adapted from GeographicLib by Charles F. F. Karney, +// http://geographiclib.sourceforge.net/ + +function adder() { + return new Adder; +} + +function Adder() { + this.reset(); +} + +Adder.prototype = { + constructor: Adder, + reset: function() { + this.s = // rounded value + this.t = 0; // exact error + }, + add: function(y) { + add$1(temp, y, this.t); + add$1(this, temp.s, this.s); + if (this.s) this.t += temp.t; + else this.s = temp.t; + }, + valueOf: function() { + return this.s; + } +}; + +var temp = new Adder; + +function add$1(adder, a, b) { + var x = adder.s = a + b, + bv = x - a, + av = x - bv; + adder.t = (a - av) + (b - bv); +} + +var epsilon$2 = 1e-6; +var epsilon2$1 = 1e-12; +var pi$3 = Math.PI; +var halfPi$2 = pi$3 / 2; +var quarterPi = pi$3 / 4; +var tau$3 = pi$3 * 2; + +var degrees$1 = 180 / pi$3; +var radians = pi$3 / 180; + +var abs = Math.abs; +var atan = Math.atan; +var atan2 = Math.atan2; +var cos$1 = Math.cos; +var ceil = Math.ceil; +var exp = Math.exp; +var log = Math.log; +var pow = Math.pow; +var sin$1 = Math.sin; +var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +var sqrt = Math.sqrt; +var tan = Math.tan; + +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x); +} + +function asin(x) { + return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x); +} + +function haversin(x) { + return (x = sin$1(x / 2)) * x; +} + +function noop$2() {} + +function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } +} + +var streamObjectType = { + Feature: function(object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function(object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } +}; + +var streamGeometryType = { + Sphere: function(object, stream) { + stream.sphere(); + }, + Point: function(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function(object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function(object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function(object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } +}; + +function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); +} + +function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); +} + +function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } +} + +var areaRingSum = adder(); + +var areaSum = adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + +var areaStream = { + point: noop$2, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: function() { + areaRingSum.reset(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function() { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop$2; + }, + sphere: function() { + areaSum.add(tau$3); + } +}; + +function areaRingStart() { + areaStream.point = areaPointFirst; +} + +function areaRingEnd() { + areaPoint(lambda00, phi00); +} + +function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi); +} + +function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos$1(phi), + sinPhi = sin$1(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos$1(adLambda), + v = k * sdLambda * sin$1(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; +} + +function area$1(object) { + areaSum.reset(); + geoStream(object, areaStream); + return areaSum * 2; +} + +function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; +} + +function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi); + return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)]; +} + +function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; +} + +// TODO return a +function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; +} + +function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; +} + +// TODO return d +function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; +} + +var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum = adder(), + ranges, + range; + +var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum.reset(); + areaStream.polygonStart(); + }, + polygonEnd: function() { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon$2) phi1 = 90; + else if (deltaSum < -epsilon$2) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function() { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } +}; + +function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; +} + +function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees$1 * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees$1; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees$1; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; +} + +function boundsLineStart() { + boundsStream.point = linePoint; +} + +function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; +} + +function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); +} + +function boundsRingStart() { + areaStream.lineStart(); +} + +function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; +} + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. +function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; +} + +function rangeCompare(a, b) { + return a[0] - b[0]; +} + +function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; +} + +function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; +} + +var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00$2, phi00$2, // first point + x0, y0, z0; // previous point + +var centroidStream = { + sphere: noop$2, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } +}; + +// Arithmetic mean of Cartesian vectors. +function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)); +} + +function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; +} + +function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; +} + +function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); +} + +function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). +function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; +} + +function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; +} + +function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos$1(phi); + x0 = cosPhi * cos$1(lambda); + y0 = cosPhi * sin$1(lambda); + z0 = sin$1(phi); + centroidPointCartesian(x0, y0, z0); +} + +function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos$1(phi), + x = cosPhi * cos$1(lambda), + y = cosPhi * sin$1(lambda), + z = sin$1(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = sqrt(cx * cx + cy * cy + cz * cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2 += v * cx; + Y2 += v * cy; + Z2 += v * cz; + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} + +function centroid(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + geoStream(object, centroidStream); + + var x = X2, + y = Y2, + z = Z2, + m = x * x + y * y + z * z; + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2$1) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon$2) x = X0, y = Y0, z = Z0; + m = x * x + y * y + z * z; + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2$1) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1]; +} + +function constant$8(x) { + return function() { + return x; + }; +} + +function compose(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; +} + +function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi]; +} + +rotationIdentity.invert = rotationIdentity; + +function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); +} + +function forwardRotationLambda(deltaLambda) { + return function(lambda, phi) { + return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi]; + }; +} + +function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; +} + +function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos$1(deltaPhi), + sinDeltaPhi = sin$1(deltaPhi), + cosDeltaGamma = cos$1(deltaGamma), + sinDeltaGamma = sin$1(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function(lambda, phi) { + var cosPhi = cos$1(phi), + x = cos$1(lambda) * cosPhi, + y = sin$1(lambda) * cosPhi, + z = sin$1(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; +} + +function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + } + + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates; + }; + + return forward; +} + +// Generates a circle centered at [0°, 0°], with a given radius and precision. +function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos$1(radius), + sinRadius = sin$1(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau$3; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]); + stream.point(point[0], point[1]); + } +} + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. +function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3; +} + +function circle() { + var center = constant$8([0, 0]), + radius = constant$8(90), + precision = constant$8(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees$1, x[1] *= degrees$1; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function(_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius; + }; + + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision; + }; + + return circle; +} + +function clipBuffer() { + var lines = [], + line; + return { + point: function(x, y) { + line.push([x, y]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop$2, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; +} + +function pointEqual(a, b) { + return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2; +} + +function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous +} + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. +function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + // If the first and last points of a segment are coincident, then treat as a + // closed ring. TODO if all rings are closed, then the winding order of the + // exterior ring should be checked. + if (pointEqual(p0, p1)) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link$1(subject); + link$1(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } +} + +function link$1(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; +} + +var sum$1 = adder(); + +function longitude(point) { + if (abs(point[0]) <= pi$3) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi$3) % tau$3 - pi$3); +} + +function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin$1(phi), + normal = [sin$1(lambda), -cos$1(lambda), 0], + angle = 0, + winding = 0; + + sum$1.reset(); + + if (sinPhi === 1) phi = halfPi$2 + epsilon$2; + else if (sinPhi === -1) phi = -halfPi$2 - epsilon$2; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin$1(phi0), + cosPhi0 = cos$1(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin$1(phi1), + cosPhi1 = cos$1(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi$3, + k = sinPhi0 * sinPhi1; + + sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta))); + angle += antimeridian ? delta + sign * tau$3 : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1); +} + +function clip(pointVisible, clipLine, interpolate, start) { + return function(sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; +} + +function validSegment(segment) { + return segment.length > 1; +} + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. +function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]); +} + +var clipAntimeridian = clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi$3, -halfPi$2] +); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. +function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function() { + stream.lineStart(); + clean = 1; + }, + point: function(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi$3 : -pi$3, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function() { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; +} + +function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin$1(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon$2 + ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1) + - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; +} + +function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi$2; + stream.point(-pi$3, phi); + stream.point(0, phi); + stream.point(pi$3, phi); + stream.point(pi$3, 0); + stream.point(pi$3, -phi); + stream.point(0, -phi); + stream.point(-pi$3, -phi); + stream.point(-pi$3, 0); + stream.point(-pi$3, phi); + } else if (abs(from[0] - to[0]) > epsilon$2) { + var lambda = from[0] < to[0] ? pi$3 : -pi$3; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } +} + +function clipCircle(radius) { + var cr = cos$1(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos$1(lambda) * cos$1(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + // Handle degeneracies. + // TODO ignore if not clipping polygons. + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { + point1[0] += epsilon$2; + point1[1] += epsilon$2; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1]); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function() { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi$3) < epsilon$2, + meridian = polar || delta < epsilon$2; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi$3 - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]); +} + +function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; +} + +var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + +function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function(stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } + else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; +} + +function extent$1() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function(_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; +} + +var lengthSum = adder(), + lambda0$2, + sinPhi0$1, + cosPhi0$1; + +var lengthStream = { + sphere: noop$2, + point: noop$2, + lineStart: lengthLineStart, + lineEnd: noop$2, + polygonStart: noop$2, + polygonEnd: noop$2 +}; + +function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; +} + +function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop$2; +} + +function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi); + lengthStream.point = lengthPoint; +} + +function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin$1(phi), + cosPhi = cos$1(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos$1(delta), + sinDelta = sin$1(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; +} + +function length$1(object) { + lengthSum.reset(); + geoStream(object, lengthStream); + return +lengthSum; +} + +var coordinates = [null, null], + object$1 = {type: "LineString", coordinates: coordinates}; + +function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length$1(object$1); +} + +var containsObjectType = { + Feature: function(object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function(object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } +}; + +var containsGeometryType = { + Sphere: function() { + return true; + }, + Point: function(object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function(object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function(object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function(object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } +}; + +function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; +} + +function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; +} + +function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2$1 * ab + ) + return true; + } + ao = bo; + } + return false; +} + +function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); +} + +function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; +} + +function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; +} + +function contains$1(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); +} + +function graticuleX(y0, y1, dy) { + var y = sequence(y0, y1 - epsilon$2, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; +} + +function graticuleY(x0, x1, dx) { + var x = sequence(x0, x1 - epsilon$2, dx).concat(x1); + return function(y) { return x.map(function(x) { return [x, y]; }); }; +} + +function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return sequence(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x)) + .concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y)); + } + + graticule.lines = function() { + return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); + }; + + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function(_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function(_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function(_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function(_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function(_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function(_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]]) + .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]); +} + +function graticule10() { + return graticule()(); +} + +function interpolate$1(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos$1(y0), + sy0 = sin$1(y0), + cy1 = cos$1(y1), + sy1 = sin$1(y1), + kx0 = cy0 * cos$1(x0), + ky0 = cy0 * sin$1(x0), + kx1 = cy1 * cos$1(x1), + ky1 = cy1 * sin$1(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin$1(d); + + var interpolate = d ? function(t) { + var B = sin$1(t *= d) / k, + A = sin$1(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees$1, + atan2(z, sqrt(x * x + y * y)) * degrees$1 + ]; + } : function() { + return [x0 * degrees$1, y0 * degrees$1]; + }; + + interpolate.distance = d; + + return interpolate; +} + +function identity$4(x) { + return x; +} + +var areaSum$1 = adder(), + areaRingSum$1 = adder(), + x00, + y00, + x0$1, + y0$1; + +var areaStream$1 = { + point: noop$2, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: function() { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function() { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$2; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1.reset(); + }, + result: function() { + var area = areaSum$1 / 2; + areaSum$1.reset(); + return area; + } +}; + +function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; +} + +function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; +} + +function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; +} + +function areaRingEnd$1() { + areaPoint$1(x00, y00); +} + +var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + +var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop$2, + lineEnd: noop$2, + polygonStart: noop$2, + polygonEnd: noop$2, + result: function() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } +}; + +function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; +} + +// TODO Enforce positive area for exterior, negative area for interior? + +var X0$1 = 0, + Y0$1 = 0, + Z0$1 = 0, + X1$1 = 0, + Y1$1 = 0, + Z1$1 = 0, + X2$1 = 0, + Y2$1 = 0, + Z2$1 = 0, + x00$1, + y00$1, + x0$3, + y0$3; + +var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function() { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function() { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function() { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } +}; + +function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; +} + +function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; +} + +function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; +} + +function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; +} + +function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); +} + +function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); +} + +function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); +} + +function PathContext(context) { + this._context = context; +} + +PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau$3); + break; + } + } + }, + result: noop$2 +}; + +var lengthSum$1 = adder(), + lengthRing, + x00$2, + y00$2, + x0$4, + y0$4; + +var lengthStream$1 = { + point: noop$2, + lineStart: function() { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function() { + if (lengthRing) lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop$2; + }, + polygonStart: function() { + lengthRing = true; + }, + polygonEnd: function() { + lengthRing = null; + }, + result: function() { + var length = +lengthSum$1; + lengthSum$1.reset(); + return length; + } +}; + +function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; +} + +function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; +} + +function PathString() { + this._string = []; +} + +PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } +}; + +function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; +} + +function index$1(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function(object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.measure = function(object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); + }; + + path.bounds = function(object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function(object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function(_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection; + }; + + path.context = function(_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); +} + +function transform(methods) { + return { + stream: transformer(methods) + }; +} + +function transformer(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; +} + +function TransformStream() {} + +TransformStream.prototype = { + constructor: TransformStream, + point: function(x, y) { this.stream.point(x, y); }, + sphere: function() { this.stream.sphere(); }, + lineStart: function() { this.stream.lineStart(); }, + lineEnd: function() { this.stream.lineEnd(); }, + polygonStart: function() { this.stream.polygonStart(); }, + polygonEnd: function() { this.stream.polygonEnd(); } +}; + +function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream$1)); + fitBounds(boundsStream$1.result()); + if (clip != null) projection.clipExtent(clip); + return projection; +} + +function fitExtent(projection, extent, object) { + return fit(projection, function(b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); +} + +function fitWidth(projection, width, object) { + return fit(projection, function(b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +function fitHeight(projection, height, object) { + return fit(projection, function(b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} + +var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance) + +function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); +} + +function resampleNone(project) { + return transformer({ + point: function(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); +} + +function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + return function(stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, + polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; +} + +var transformRadians = transformer({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } +}); + +function transformRotate(rotate) { + return transformer({ + point: function(x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); +} + +function scaleTranslate(k, dx, dy) { + function transform(x, y) { + return [dx + k * x, dy - k * y]; + } + transform.invert = function(x, y) { + return [(x - dx) / k, (dy - y) / k]; + }; + return transform; +} + +function scaleTranslateRotate(k, dx, dy, alpha) { + var cosAlpha = cos$1(alpha), + sinAlpha = sin$1(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + function transform(x, y) { + return [a * x - b * y + dx, dy - b * x - a * y]; + } + transform.invert = function(x, y) { + return [ai * x - bi * y + ci, fi - bi * x - ai * y]; + }; + return transform; +} + +function projection(project) { + return projectionMutator(function() { return project; })(); +} + +function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees$1, point[1] * degrees$1]; + } + + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function(_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1; + }; + + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function(_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function(_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function(_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1]; + }; + + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1]; + }; + + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)), + transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; +} + +function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi$3 / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1]; + }; + + return p; +} + +function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos$1(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin$1(phi) / cosPhi0]; + } + + forward.invert = function(x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; +} + +function conicEqualAreaRaw(y0, y1) { + var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin$1(y)) / n; + return [r * sin$1(x *= n), r0 - r * cos$1(x)]; + } + + project.invert = function(x, y) { + var r0y = r0 - y; + return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; +} + +function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); +} + +function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); +} + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. +function multiplex(streams) { + var n = streams.length; + return { + point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, + sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, + lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, + lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, + polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, + polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } + }; +} + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers +function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function(x, y) { point = [x, y]; }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function(width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function(height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); +} + +function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos$1(x), + cy = cos$1(y), + k = scale(cx * cy); + return [ + k * cy * sin$1(x), + k * sin$1(y) + ]; + } +} + +function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin$1(c), + cc = cos$1(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } +} + +var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt(2 / (1 + cxcy)); +}); + +azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { + return 2 * asin(z / 2); +}); + +function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); +} + +var azimuthalEquidistantRaw = azimuthalRaw(function(c) { + return (c = acos(c)) && c / sin$1(c); +}); + +azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { + return z; +}); + +function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); +} + +function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi$2 + phi) / 2))]; +} + +mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi$2]; +}; + +function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau$3); +} + +function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function(_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function(_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function(_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function(_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi$3 * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); +} + +function tany(y) { + return tan((halfPi$2 + y) / 2); +} + +function conicConformalRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; } + else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; } + var r = f / pow(tany(y), n); + return [r * sin$1(n * x), f - r * cos$1(n * x)]; + } + + project.invert = function(x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy); + return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2]; + }; + + return project; +} + +function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); +} + +function equirectangularRaw(lambda, phi) { + return [lambda, phi]; +} + +equirectangularRaw.invert = equirectangularRaw; + +function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); +} + +function conicEquidistantRaw(y0, y1) { + var cy0 = cos$1(y0), + n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon$2) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin$1(nx), g - gy * cos$1(nx)]; + } + + project.invert = function(x, y) { + var gy = g - y; + return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; +} + +function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); +} + +var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + +function equalEarthRaw(lambda, phi) { + var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; +} + +equalEarthRaw.invert = function(x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2$1) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l), + asin(sin$1(l) / M) + ]; +}; + +function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); +} + +function gnomonicRaw(x, y) { + var cy = cos$1(y), k = cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +gnomonicRaw.invert = azimuthalInvert(atan); + +function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); +} + +function scaleTranslate$1(kx, ky, tx, ty) { + return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({ + point: function(x, y) { + this.stream.point(x * kx + tx, y * ky + ty); + } + }); +} + +function identity$5() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect + x0 = null, y0, x1, y1, // clip extent + postclip = identity$4, + cache, + cacheStream, + projection; + + function reset() { + cache = cacheStream = null; + return projection; + } + + return projection = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }, + postclip: function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }, + clipExtent: function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }, + scale: function(_) { + return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k; + }, + translate: function(_) { + return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty]; + }, + reflectX: function(_) { + return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0; + }, + reflectY: function(_) { + return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0; + }, + fitExtent: function(extent, object) { + return fitExtent(projection, extent, object); + }, + fitSize: function(size, object) { + return fitSize(projection, size, object); + }, + fitWidth: function(width, object) { + return fitWidth(projection, width, object); + }, + fitHeight: function(height, object) { + return fitHeight(projection, height, object); + } + }; +} + +function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; +} + +naturalEarth1Raw.invert = function(x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon$2 && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; +}; + +function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); +} + +function orthographicRaw(x, y) { + return [cos$1(y) * sin$1(x), sin$1(y)]; +} + +orthographicRaw.invert = azimuthalInvert(asin); + +function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon$2); +} + +function stereographicRaw(x, y) { + var cy = cos$1(y), k = 1 + cos$1(x) * cy; + return [cy * sin$1(x) / k, sin$1(y) / k]; +} + +stereographicRaw.invert = azimuthalInvert(function(z) { + return 2 * atan(z); +}); + +function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); +} + +function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi$2 + phi) / 2)), -lambda]; +} + +transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi$2]; +}; + +function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function(_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function(_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); +} + +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; +} + +function meanXReduce(x, c) { + return x + c.x; +} + +function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); +} + +function maxYReduce(y, c) { + return Math.max(y, c.y); +} + +function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; +} + +function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; +} + +function cluster() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function(node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function(x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; +} + +function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; +} + +function node_count() { + return this.eachAfter(count); +} + +function node_each(callback) { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + callback(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } while (next.length); + return this; +} + +function node_eachBefore(callback) { + var node = this, nodes = [node], children, i; + while (node = nodes.pop()) { + callback(node), children = node.children; + if (children) for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + return this; +} + +function node_eachAfter(callback) { + var node = this, nodes = [node], next = [], children, i, n; + while (node = nodes.pop()) { + next.push(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + while (node = next.pop()) { + callback(node); + } + return this; +} + +function node_sum(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); +} + +function node_sort(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); +} + +function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; +} + +function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; +} + +function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; +} + +function node_descendants() { + var nodes = []; + this.each(function(node) { + nodes.push(node); + }); + return nodes; +} + +function node_leaves() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; +} + +function node_links() { + var root = this, links = []; + root.each(function(node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; +} + +function hierarchy(data, children) { + var root = new Node(data), + valued = +data.value && (root.value = data.value), + node, + nodes = [root], + child, + childs, + i, + n; + + if (children == null) children = defaultChildren; + + while (node = nodes.pop()) { + if (valued) node.value = +node.data.value; + if ((childs = children(node.data)) && (n = childs.length)) { + node.children = new Array(n); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); +} + +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} + +function defaultChildren(d) { + return d.children; +} + +function copyData(node) { + node.data = node.data.data; +} + +function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); +} + +function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; +} + +Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy +}; + +var slice$4 = Array.prototype.slice; + +function shuffle$1(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; +} + +function enclose(circles) { + var i = 0, n = (circles = shuffle$1(slice$4.call(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; +} + +function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; +} + +function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; +} + +function enclosesWeak(a, b) { + var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; +} + +function encloseBasis(B) { + switch (B.length) { + case 1: return encloseBasis1(B[0]); + case 2: return encloseBasis2(B[0], B[1]); + case 3: return encloseBasis3(B[0], B[1], B[2]); + } +} + +function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; +} + +function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; +} + +function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; +} + +function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } +} + +function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} + +function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; +} + +function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; +} + +function packEnclose(circles) { + if (!(n = circles.length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; +} + +function siblings(circles) { + packEnclose(circles); + return circles; +} + +function optional(f) { + return f == null ? null : required(f); +} + +function required(f) { + if (typeof f !== "function") throw new Error; + return f; +} + +function constantZero() { + return 0; +} + +function constant$9(x) { + return function() { + return x; + }; +} + +function defaultRadius$1(d) { + return Math.sqrt(d.value); +} + +function index$2() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius$1)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function(x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function(x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding; + }; + + return pack; +} + +function radiusLeaf(radius) { + return function(node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; +} + +function packChildren(padding, k) { + return function(node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; +} + +function translateChild(k) { + return function(node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; +} + +function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); +} + +function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } +} + +function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function(node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function(x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function(x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; +} + +var keyPrefix$1 = "$", // Protect against keys like “__proto__”. + preroot = {depth: -1}, + ambiguous = {}; + +function defaultId(d) { + return d.id; +} + +function defaultParentId(d) { + return d.parentId; +} + +function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var d, + i, + n = data.length, + root, + parent, + node, + nodes = new Array(n), + nodeId, + nodeKey, + nodeByKey = {}; + + for (i = 0; i < n; ++i) { + d = data[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = keyPrefix$1 + (node.id = nodeId); + nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i], nodeId = parentId(data[i], i, data); + if (nodeId == null || !(nodeId += "")) { + if (root) throw new Error("multiple roots"); + root = node; + } else { + parent = nodeByKey[keyPrefix$1 + nodeId]; + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function(x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function(x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; +} + +function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; +} + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. +function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; +} + +// This function works analogously to nextLeft. +function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; +} + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; +} + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). +function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } +} + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; +} + +function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number +} + +TreeNode.prototype = Object.create(Node.prototype); + +function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; +} + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm +function tree() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function(x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; +} + +function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } +} + +var phi = (1 + Math.sqrt(5)) / 2; + +function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { sumValue -= nodeValue; break; } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; +} + +var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; +})(phi); + +function index$3() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function(x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function(x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function(x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function(x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function(x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function(x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft; + }; + + return treemap; +} + +function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = (x0 * valueRight + x1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = (y0 * valueRight + y1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } +} + +function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); +} + +var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); + else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; +})(phi); + +function area$2(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; +} + +function centroid$1(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; +} + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. +function cross$1(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); +} + +function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; +} + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. +function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1], + size = 2; + + for (var i = 2; i < n; ++i) { + while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points +} + +function hull(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; +} + +function contains$2(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; +} + +function length$2(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.sqrt(xa * xa + ya * ya); + } + + return perimeter; +} + +function defaultSource$1() { + return Math.random(); +} + +var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function() { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; +})(defaultSource$1); + +var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function() { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; +})(defaultSource$1); + +var logNormal = (function sourceRandomLogNormal(source) { + function randomLogNormal() { + var randomNormal = normal.source(source).apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; +})(defaultSource$1); + +var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + return function() { + for (var sum = 0, i = 0; i < n; ++i) sum += source(); + return sum; + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; +})(defaultSource$1); + +var bates = (function sourceRandomBates(source) { + function randomBates(n) { + var randomIrwinHall = irwinHall.source(source)(n); + return function() { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; +})(defaultSource$1); + +var exponential$1 = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function() { + return -Math.log(1 - source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; +})(defaultSource$1); + +function initRange(domain, range) { + switch (arguments.length) { + case 0: break; + case 1: this.range(domain); break; + default: this.range(range).domain(domain); break; + } + return this; +} + +function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: break; + case 1: this.interpolator(domain); break; + default: this.interpolator(interpolator).domain(domain); break; + } + return this; +} + +var array$3 = Array.prototype; + +var map$3 = array$3.map; +var slice$5 = array$3.slice; + +var implicit = {name: "implicit"}; + +function ordinal() { + var index = map$1(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = map$1(); + var i = -1, n = _.length, d, key; + while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$5.call(_), scale) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range[1] < range[0], + start = range[reverse - 0], + stop = range[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = sequence(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function(_) { + return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function() { + return bandwidth; + }; + + scale.step = function() { + return step; + }; + + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function(_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function() { + return band(domain(), range) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); +} + +function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function() { + return pointish(copy()); + }; + + return scale; +} + +function point$1() { + return pointish(band.apply(null, arguments).paddingInner(1)); +} + +function constant$a(x) { + return function() { + return x; + }; +} + +function number$2(x) { + return +x; +} + +var unit = [0, 1]; + +function identity$6(x) { + return x; +} + +function normalize(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constant$a(isNaN(b) ? NaN : 0.5); +} + +function clamper(domain) { + var a = domain[0], b = domain[domain.length - 1], t; + if (a > b) t = a, a = b, b = t; + return function(x) { return Math.max(a, Math.min(b, x)); }; +} + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. +function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x) { return r0(d0(x)); }; +} + +function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function(x) { + var i = bisectRight(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; +} + +function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function transformer$1() { + var domain = unit, + range = unit, + interpolate = interpolateValue, + transform, + untransform, + unknown, + clamp = identity$6, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function(y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y))); + }; + + scale.domain = function(_) { + return arguments.length ? (domain = map$3.call(_, number$2), clamp === identity$6 || (clamp = clamper(domain)), rescale()) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function(_) { + return range = slice$5.call(_), interpolate = interpolateRound, rescale(); + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = _ ? clamper(domain) : identity$6, scale) : clamp !== identity$6; + }; + + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t, u) { + transform = t, untransform = u; + return rescale(); + }; +} + +function continuous(transform, untransform) { + return transformer$1()(transform, untransform); +} + +function tickFormat(start, stop, count, specifier) { + var step = tickStep(start, stop, count), + precision; + specifier = formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision; + return exports.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return exports.format(specifier); +} + +function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function(count) { + var d = domain(); + return ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function(count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function(count) { + if (count == null) count = 10; + + var d = domain(), + i0 = 0, + i1 = d.length - 1, + start = d[i0], + stop = d[i1], + step; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + step = tickIncrement(start, stop, count); + + if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + step = tickIncrement(start, stop, count); + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + step = tickIncrement(start, stop, count); + } + + if (step > 0) { + d[i0] = Math.floor(start / step) * step; + d[i1] = Math.ceil(stop / step) * step; + domain(d); + } else if (step < 0) { + d[i0] = Math.ceil(start * step) / step; + d[i1] = Math.floor(stop * step) / step; + domain(d); + } + + return scale; + }; + + return scale; +} + +function linear$2() { + var scale = continuous(identity$6, identity$6); + + scale.copy = function() { + return copy(scale, linear$2()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function identity$7(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = map$3.call(_, number$2), scale) : domain.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return identity$7(domain).unknown(unknown); + }; + + domain = arguments.length ? map$3.call(domain, number$2) : [0, 1]; + + return linearish(scale); +} + +function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; +} + +function transformLog(x) { + return Math.log(x); +} + +function transformExp(x) { + return Math.exp(x); +} + +function transformLogn(x) { + return -Math.log(-x); +} + +function transformExpn(x) { + return -Math.exp(-x); +} + +function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; +} + +function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; +} + +function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); +} + +function reflect(f) { + return function(x) { + return -f(-x); + }; +} + +function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + } else { + z = ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = exports.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); + }; + + return scale; +} + +function log$1() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function() { + return copy(scale, log$1()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function transformSymlog(c) { + return function(x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; +} + +function transformSymexp(c) { + return function(x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; +} + +function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function(_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); +} + +function symlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function() { + return copy(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); +} + +function transformPow(exponent) { + return function(x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; +} + +function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); +} + +function transformSquare(x) { + return x < 0 ? -x * x : x * x; +} + +function powish(transform) { + var scale = transform(identity$6, identity$6), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity$6, identity$6) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); +} + +function pow$1() { + var scale = powish(transformer$1()); + + scale.copy = function() { + return copy(scale, pow$1()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; +} + +function sqrt$1() { + return pow$1.apply(null, arguments).exponent(0.5); +} + +function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = threshold(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending); + return rescale(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$5.call(_), rescale()) : range.slice(); + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function() { + return thresholds.slice(); + }; + + scale.copy = function() { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +function quantize$1() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function(_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function(_) { + return arguments.length ? (n = (range = slice$5.call(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function() { + return domain.slice(); + }; + + scale.copy = function() { + return quantize$1() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); +} + +function threshold$1() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown; + } + + scale.domain = function(_) { + return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function(_) { + return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function() { + return threshold$1() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); +} + +var t0$1 = new Date, + t1$1 = new Date; + +function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = new Date(+date)), date; + } + + interval.floor = interval; + + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function(start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function(start, end) { + t0$1.setTime(+start), t1$1.setTime(+end); + floori(t0$1), floori(t1$1); + return Math.floor(count(t0$1, t1$1)); + }; + + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } + + return interval; +} + +var millisecond = newInterval(function() { + // noop +}, function(date, step) { + date.setTime(+date + step); +}, function(start, end) { + return end - start; +}); + +// An optimized implementation for this simple case. +millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); +}; +var milliseconds = millisecond.range; + +var durationSecond = 1e3; +var durationMinute = 6e4; +var durationHour = 36e5; +var durationDay = 864e5; +var durationWeek = 6048e5; + +var second = newInterval(function(date) { + date.setTime(date - date.getMilliseconds()); +}, function(date, step) { + date.setTime(+date + step * durationSecond); +}, function(start, end) { + return (end - start) / durationSecond; +}, function(date) { + return date.getUTCSeconds(); +}); +var seconds = second.range; + +var minute = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getMinutes(); +}); +var minutes = minute.range; + +var hour = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getHours(); +}); +var hours = hour.range; + +var day = newInterval(function(date) { + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setDate(date.getDate() + step); +}, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; +}, function(date) { + return date.getDate() - 1; +}); +var days = day.range; + +function weekday(i) { + return newInterval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); +} + +var sunday = weekday(0); +var monday = weekday(1); +var tuesday = weekday(2); +var wednesday = weekday(3); +var thursday = weekday(4); +var friday = weekday(5); +var saturday = weekday(6); + +var sundays = sunday.range; +var mondays = monday.range; +var tuesdays = tuesday.range; +var wednesdays = wednesday.range; +var thursdays = thursday.range; +var fridays = friday.range; +var saturdays = saturday.range; + +var month = newInterval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setMonth(date.getMonth() + step); +}, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; +}, function(date) { + return date.getMonth(); +}); +var months = month.range; + +var year = newInterval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setFullYear(date.getFullYear() + step); +}, function(start, end) { + return end.getFullYear() - start.getFullYear(); +}, function(date) { + return date.getFullYear(); +}); + +// An optimized implementation for this simple case. +year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); +}; +var years = year.range; + +var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getUTCMinutes(); +}); +var utcMinutes = utcMinute.range; + +var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getUTCHours(); +}); +var utcHours = utcHour.range; + +var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); +}, function(start, end) { + return (end - start) / durationDay; +}, function(date) { + return date.getUTCDate() - 1; +}); +var utcDays = utcDay.range; + +function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek; + }); +} + +var utcSunday = utcWeekday(0); +var utcMonday = utcWeekday(1); +var utcTuesday = utcWeekday(2); +var utcWednesday = utcWeekday(3); +var utcThursday = utcWeekday(4); +var utcFriday = utcWeekday(5); +var utcSaturday = utcWeekday(6); + +var utcSundays = utcSunday.range; +var utcMondays = utcMonday.range; +var utcTuesdays = utcTuesday.range; +var utcWednesdays = utcWednesday.range; +var utcThursdays = utcThursday.range; +var utcFridays = utcFriday.range; +var utcSaturdays = utcSaturday.range; + +var utcMonth = newInterval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); +}, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; +}, function(date) { + return date.getUTCMonth(); +}); +var utcMonths = utcMonth.range; + +var utcYear = newInterval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); +}, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); +}, function(date) { + return date.getUTCFullYear(); +}); + +// An optimized implementation for this simple case. +utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); +}; +var utcYears = utcYear.range; + +function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); +} + +function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); +} + +function newYear(y) { + return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0}; +} + +function formatLocale$1(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear$1, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, newDate) { + return function(string) { + var d = newYear(1900), + i = parseSpecifier(d, specifier, string += "", 0), + week, day$1; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newYear(d.y)), day$1 = week.getUTCDay(); + week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week); + week = utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = newDate(newYear(d.y)), day$1 = week.getDay(); + week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week); + week = day.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$1 + 5) % 7 : d.w + d.U * 7 - (day$1 + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return newDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", localDate); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier, utcDate); + p.toString = function() { return specifier; }; + return p; + } + }; +} + +var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + +function pad$1(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); +} + +function requote(s) { + return s.replace(requoteRe, "\\$&"); +} + +function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); +} + +function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) map[names[i].toLowerCase()] = i; + return map; +} + +function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} + +function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; +} + +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; +} + +function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; +} + +function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; +} + +function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; +} + +function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; +} + +function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; +} + +function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; +} + +function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; +} + +function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; +} + +function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; +} + +function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; +} + +function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; +} + +function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; +} + +function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; +} + +function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1; +} + +function formatDayOfMonth(d, p) { + return pad$1(d.getDate(), p, 2); +} + +function formatHour24(d, p) { + return pad$1(d.getHours(), p, 2); +} + +function formatHour12(d, p) { + return pad$1(d.getHours() % 12 || 12, p, 2); +} + +function formatDayOfYear(d, p) { + return pad$1(1 + day.count(year(d), d), p, 3); +} + +function formatMilliseconds(d, p) { + return pad$1(d.getMilliseconds(), p, 3); +} + +function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; +} + +function formatMonthNumber(d, p) { + return pad$1(d.getMonth() + 1, p, 2); +} + +function formatMinutes(d, p) { + return pad$1(d.getMinutes(), p, 2); +} + +function formatSeconds(d, p) { + return pad$1(d.getSeconds(), p, 2); +} + +function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; +} + +function formatWeekNumberSunday(d, p) { + return pad$1(sunday.count(year(d), d), p, 2); +} + +function formatWeekNumberISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d); + return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2); +} + +function formatWeekdayNumberSunday(d) { + return d.getDay(); +} + +function formatWeekNumberMonday(d, p) { + return pad$1(monday.count(year(d), d), p, 2); +} + +function formatYear$1(d, p) { + return pad$1(d.getFullYear() % 100, p, 2); +} + +function formatFullYear(d, p) { + return pad$1(d.getFullYear() % 10000, p, 4); +} + +function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad$1(z / 60 | 0, "0", 2) + + pad$1(z % 60, "0", 2); +} + +function formatUTCDayOfMonth(d, p) { + return pad$1(d.getUTCDate(), p, 2); +} + +function formatUTCHour24(d, p) { + return pad$1(d.getUTCHours(), p, 2); +} + +function formatUTCHour12(d, p) { + return pad$1(d.getUTCHours() % 12 || 12, p, 2); +} + +function formatUTCDayOfYear(d, p) { + return pad$1(1 + utcDay.count(utcYear(d), d), p, 3); +} + +function formatUTCMilliseconds(d, p) { + return pad$1(d.getUTCMilliseconds(), p, 3); +} + +function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; +} + +function formatUTCMonthNumber(d, p) { + return pad$1(d.getUTCMonth() + 1, p, 2); +} + +function formatUTCMinutes(d, p) { + return pad$1(d.getUTCMinutes(), p, 2); +} + +function formatUTCSeconds(d, p) { + return pad$1(d.getUTCSeconds(), p, 2); +} + +function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; +} + +function formatUTCWeekNumberSunday(d, p) { + return pad$1(utcSunday.count(utcYear(d), d), p, 2); +} + +function formatUTCWeekNumberISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d); + return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2); +} + +function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); +} + +function formatUTCWeekNumberMonday(d, p) { + return pad$1(utcMonday.count(utcYear(d), d), p, 2); +} + +function formatUTCYear(d, p) { + return pad$1(d.getUTCFullYear() % 100, p, 2); +} + +function formatUTCFullYear(d, p) { + return pad$1(d.getUTCFullYear() % 10000, p, 4); +} + +function formatUTCZone() { + return "+0000"; +} + +function formatLiteralPercent() { + return "%"; +} + +function formatUnixTimestamp(d) { + return +d; +} + +function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); +} + +var locale$1; + +defaultLocale$1({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +}); + +function defaultLocale$1(definition) { + locale$1 = formatLocale$1(definition); + exports.timeFormat = locale$1.format; + exports.timeParse = locale$1.parse; + exports.utcFormat = locale$1.utcFormat; + exports.utcParse = locale$1.utcParse; + return locale$1; +} + +var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + +function formatIsoNative(date) { + return date.toISOString(); +} + +var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + +function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; +} + +var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + +var durationSecond$1 = 1000, + durationMinute$1 = durationSecond$1 * 60, + durationHour$1 = durationMinute$1 * 60, + durationDay$1 = durationHour$1 * 24, + durationWeek$1 = durationDay$1 * 7, + durationMonth = durationDay$1 * 30, + durationYear = durationDay$1 * 365; + +function date$1(t) { + return new Date(t); +} + +function number$3(t) { + return t instanceof Date ? +t : +new Date(+t); +} + +function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(identity$6, identity$6), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond$1], + [second, 5, 5 * durationSecond$1], + [second, 15, 15 * durationSecond$1], + [second, 30, 30 * durationSecond$1], + [minute, 1, durationMinute$1], + [minute, 5, 5 * durationMinute$1], + [minute, 15, 15 * durationMinute$1], + [minute, 30, 30 * durationMinute$1], + [ hour, 1, durationHour$1 ], + [ hour, 3, 3 * durationHour$1 ], + [ hour, 6, 6 * durationHour$1 ], + [ hour, 12, 12 * durationHour$1 ], + [ day, 1, durationDay$1 ], + [ day, 2, 2 * durationDay$1 ], + [ week, 1, durationWeek$1 ], + [ month, 1, durationMonth ], + [ month, 3, 3 * durationMonth ], + [ year, 1, durationYear ] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = bisector(function(i) { return i[2]; }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(tickStep(start, stop, interval), 1); + interval = millisecond; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function(y) { + return new Date(invert(y)); + }; + + scale.domain = function(_) { + return arguments.length ? domain(map$3.call(_, number$3)) : domain().map(date$1); + }; + + scale.ticks = function(interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function(interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function() { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; +} + +function time() { + return initRange.apply(calendar(year, month, sunday, day, hour, minute, second, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); +} + +function utcTime() { + return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); +} + +function transformer$2() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity$6, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; +} + +function copy$1(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function sequential() { + var scale = linearish(transformer$2()(identity$6)); + + scale.copy = function() { + return copy$1(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialLog() { + var scale = loggish(transformer$2()).domain([1, 10]); + + scale.copy = function() { + return copy$1(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSymlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialPow() { + var scale = powish(transformer$2()); + + scale.copy = function() { + return copy$1(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); +} + +function sequentialQuantile() { + var domain = [], + interpolator = identity$6; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1)); + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(ascending); + return scale; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function() { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); +} + +function transformer$3() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity$6, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2]; + }; + + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1); + return scale; + }; +} + +function diverging() { + var scale = linearish(transformer$3()(identity$6)); + + scale.copy = function() { + return copy$1(scale, diverging()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingLog() { + var scale = loggish(transformer$3()).domain([0.1, 1, 10]); + + scale.copy = function() { + return copy$1(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSymlog() { + var scale = symlogish(transformer$3()); + + scale.copy = function() { + return copy$1(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingPow() { + var scale = powish(transformer$3()); + + scale.copy = function() { + return copy$1(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); +} + +function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); +} + +function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; +} + +var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + +var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + +var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + +var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + +var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + +var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + +var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + +var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + +var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + +var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + +function ramp(scheme) { + return rgbBasis(scheme[scheme.length - 1]); +} + +var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" +).map(colors); + +var BrBG = ramp(scheme); + +var scheme$1 = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" +).map(colors); + +var PRGn = ramp(scheme$1); + +var scheme$2 = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" +).map(colors); + +var PiYG = ramp(scheme$2); + +var scheme$3 = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" +).map(colors); + +var PuOr = ramp(scheme$3); + +var scheme$4 = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" +).map(colors); + +var RdBu = ramp(scheme$4); + +var scheme$5 = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" +).map(colors); + +var RdGy = ramp(scheme$5); + +var scheme$6 = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" +).map(colors); + +var RdYlBu = ramp(scheme$6); + +var scheme$7 = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" +).map(colors); + +var RdYlGn = ramp(scheme$7); + +var scheme$8 = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" +).map(colors); + +var Spectral = ramp(scheme$8); + +var scheme$9 = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" +).map(colors); + +var BuGn = ramp(scheme$9); + +var scheme$a = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" +).map(colors); + +var BuPu = ramp(scheme$a); + +var scheme$b = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" +).map(colors); + +var GnBu = ramp(scheme$b); + +var scheme$c = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" +).map(colors); + +var OrRd = ramp(scheme$c); + +var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" +).map(colors); + +var PuBuGn = ramp(scheme$d); + +var scheme$e = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" +).map(colors); + +var PuBu = ramp(scheme$e); + +var scheme$f = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" +).map(colors); + +var PuRd = ramp(scheme$f); + +var scheme$g = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" +).map(colors); + +var RdPu = ramp(scheme$g); + +var scheme$h = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" +).map(colors); + +var YlGnBu = ramp(scheme$h); + +var scheme$i = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" +).map(colors); + +var YlGn = ramp(scheme$i); + +var scheme$j = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" +).map(colors); + +var YlOrBr = ramp(scheme$j); + +var scheme$k = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" +).map(colors); + +var YlOrRd = ramp(scheme$k); + +var scheme$l = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" +).map(colors); + +var Blues = ramp(scheme$l); + +var scheme$m = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" +).map(colors); + +var Greens = ramp(scheme$m); + +var scheme$n = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" +).map(colors); + +var Greys = ramp(scheme$n); + +var scheme$o = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" +).map(colors); + +var Purples = ramp(scheme$o); + +var scheme$p = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" +).map(colors); + +var Reds = ramp(scheme$p); + +var scheme$q = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" +).map(colors); + +var Oranges = ramp(scheme$q); + +function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; +} + +var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0)); + +var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + +var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8)); + +var c = cubehelix(); + +function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; +} + +var c$1 = rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + +function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; +} + +function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; +} + +function ramp$1(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; +} + +var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + +var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + +var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + +var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + +function constant$b(x) { + return function constant() { + return x; + }; +} + +var abs$1 = Math.abs; +var atan2$1 = Math.atan2; +var cos$2 = Math.cos; +var max$2 = Math.max; +var min$1 = Math.min; +var sin$2 = Math.sin; +var sqrt$2 = Math.sqrt; + +var epsilon$3 = 1e-12; +var pi$4 = Math.PI; +var halfPi$3 = pi$4 / 2; +var tau$4 = 2 * pi$4; + +function acos$1(x) { + return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x); +} + +function asin$1(x) { + return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x); +} + +function arcInnerRadius(d) { + return d.innerRadius; +} + +function arcOuterRadius(d) { + return d.outerRadius; +} + +function arcStartAngle(d) { + return d.startAngle; +} + +function arcEndAngle(d) { + return d.endAngle; +} + +function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! +} + +function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon$3) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; +} + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html +function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} + +function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant$b(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi$3, + a1 = endAngle.apply(this, arguments) - halfPi$3, + da = abs$1(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon$3)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau$4 - epsilon$3) { + context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon$3) { + context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)), + rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon$3) { + var p0 = asin$1(rp / r0 * sin$2(ap)), + p1 = asin$1(rp / r1 * sin$2(ap)); + if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos$2(a01), + y01 = r1 * sin$2(a01), + x10 = r0 * cos$2(a10), + y10 = r0 * sin$2(a10); + + // Apply rounded corners? + if (rc > epsilon$3) { + var x11 = r1 * cos$2(a11), + y11 = r1 * sin$2(a11), + x00 = r0 * cos$2(a00), + y00 = r0 * sin$2(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2), + lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min$1(rc, (r0 - lc) / (kc - 1)); + rc1 = min$1(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon$3)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon$3) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon$3) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2; + return [cos$2(a) * r, sin$2(a) * r]; + }; + + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius; + }; + + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius; + }; + + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius; + }; + + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle; + }; + + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle; + }; + + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle; + }; + + arc.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; +} + +function Linear(context) { + this._context = context; +} + +Linear.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: this._context.lineTo(x, y); break; + } + } +}; + +function curveLinear(context) { + return new Linear(context); +} + +function x$3(p) { + return p[0]; +} + +function y$3(p) { + return p[1]; +} + +function line() { + var x = x$3, + y = y$3, + defined = constant$b(true), + context = null, + curve = curveLinear, + output = null; + + function line(data) { + var i, + n = data.length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x(d, i, data), +y(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x; + }; + + line.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y; + }; + + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined; + }; + + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; +} + +function area$3() { + var x0 = x$3, + x1 = null, + y0 = constant$b(0), + y1 = y$3, + defined = constant$b(true), + context = null, + curve = curveLinear, + output = null; + + function area(data) { + var i, + j, + k, + n = data.length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0; + }; + + area.x0 = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0; + }; + + area.x1 = function(_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1; + }; + + area.y = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0; + }; + + area.y0 = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0; + }; + + area.y1 = function(_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function() { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function() { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function() { + return arealine().x(x1).y(y0); + }; + + area.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined; + }; + + area.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; +} + +function descending$1(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} + +function identity$8(d) { + return d; +} + +function pie() { + var value = identity$8, + sortValues = descending$1, + sort = null, + startAngle = constant$b(0), + endAngle = constant$b(tau$4), + padAngle = constant$b(0); + + function pie(data) { + var i, + n = data.length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); + else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value; + }; + + pie.sortValues = function(_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function(_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle; + }; + + pie.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle; + }; + + pie.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle; + }; + + return pie; +} + +var curveRadialLinear = curveRadial(curveLinear); + +function Radial(curve) { + this._curve = curve; +} + +Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } +}; + +function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; +} + +function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; +} + +function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); +} + +function areaRadial() { + var a = area$3().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; +} + +function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +} + +var slice$6 = Array.prototype.slice; + +function linkSource(d) { + return d.source; +} + +function linkTarget(d) { + return d.target; +} + +function link$2(curve) { + var source = linkSource, + target = linkTarget, + x = x$3, + y = y$3, + context = null; + + function link() { + var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) context = buffer = path(); + curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function(_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function(_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x; + }; + + link.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y; + }; + + link.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; +} + +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} + +function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); +} + +function curveRadial$1(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); +} + +function linkHorizontal() { + return link$2(curveHorizontal); +} + +function linkVertical() { + return link$2(curveVertical); +} + +function linkRadial() { + var l = link$2(curveRadial$1); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; +} + +var circle$2 = { + draw: function(context, size) { + var r = Math.sqrt(size / pi$4); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau$4); + } +}; + +var cross$2 = { + draw: function(context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } +}; + +var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + +var diamond = { + draw: function(context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } +}; + +var ka = 0.89081309152928522810, + kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10), + kx = Math.sin(tau$4 / 10) * kr, + ky = -Math.cos(tau$4 / 10) * kr; + +var star = { + draw: function(context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau$4 * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } +}; + +var square = { + draw: function(context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } +}; + +var sqrt3 = Math.sqrt(3); + +var triangle = { + draw: function(context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } +}; + +var c$2 = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + +var wye = { + draw: function(context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0); + context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1); + context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2); + context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0); + context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1); + context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2); + context.closePath(); + } +}; + +var symbols = [ + circle$2, + cross$2, + diamond, + square, + star, + triangle, + wye +]; + +function symbol() { + var type = constant$b(circle$2), + size = constant$b(64), + context = null; + + function symbol() { + var buffer; + if (!context) context = buffer = path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type; + }; + + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size; + }; + + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; +} + +function noop$3() {} + +function point$2(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); +} + +function Basis(context) { + this._context = context; +} + +Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: point$2(this, this._x1, this._y1); // proceed + case 2: this._context.lineTo(this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basis$2(context) { + return new Basis(context); +} + +function BasisClosed(context) { + this._context = context; +} + +BasisClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisClosed$1(context) { + return new BasisClosed(context); +} + +function BasisOpen(context) { + this._context = context; +} + +BasisOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisOpen(context) { + return new BasisOpen(context); +} + +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} + +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function(beta) { + return custom(+beta); + }; + + return bundle; +})(0.85); + +function point$3(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); +} + +function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point$3(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} + +CardinalOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function(tension) { + return custom(+tension); + }; + + return cardinal; +})(0); + +function point$4(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon$3) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon$3) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +} + +function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRom.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // proceed + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$4(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function LinearClosed(context) { + this._context = context; +} + +LinearClosed.prototype = { + areaStart: noop$3, + areaEnd: noop$3, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } +}; + +function linearClosed(context) { + return new LinearClosed(context); +} + +function sign$1(x) { + return x < 0 ? -1 : 1; +} + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. +function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; +} + +// Calculate a one-sided slope. +function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; +} + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". +function point$5(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); +} + +function MonotoneX(context) { + this._context = context; +} + +MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point$5(this, this._t0, slope2(this, this._t0)); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point$5(this, this._t0, t1 = slope3(this, x, y)); break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } +}; + +function MonotoneY(context) { + this._context = new ReflectContext(context); +} + +(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); +}; + +function ReflectContext(context) { + this._context = context; +} + +ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } +}; + +function monotoneX(context) { + return new MonotoneX(context); +} + +function monotoneY(context) { + return new MonotoneY(context); +} + +function Natural(context) { + this._context = context; +} + +Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. +function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; +} + +function natural(context) { + return new Natural(context); +} + +function Step(context, t) { + this._context = context; + this._t = t; +} + +Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } +}; + +function step(context) { + return new Step(context, 0.5); +} + +function stepBefore(context) { + return new Step(context, 0); +} + +function stepAfter(context) { + return new Step(context, 1); +} + +function none$1(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } +} + +function none$2(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; +} + +function stackValue(d, key) { + return d[key]; +} + +function stack() { + var keys = constant$b([]), + order = none$2, + offset = none$1, + value = stackValue; + + function stack(data) { + var kz = keys.apply(this, arguments), + i, + m = data.length, + n = kz.length, + sz = new Array(n), + oz; + + for (i = 0; i < n; ++i) { + for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { + si[j] = sij = [0, +value(data[j], ki, j, data)]; + sij.data = data[j]; + } + si.key = ki; + } + + for (i = 0, oz = order(sz); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$6.call(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$6.call(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + }; + + return stack; +} + +function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none$1(series, order); +} + +function diverging$1(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = yp; + } + } + } +} + +function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none$1(series, order); +} + +function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none$1(series, order); +} + +function appearance(series) { + var peaks = series.map(peak); + return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); +} + +function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; +} + +function ascending$3(series) { + var sums = series.map(sum$2); + return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; }); +} + +function sum$2(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; +} + +function descending$2(series) { + return ascending$3(series).reverse(); +} + +function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum$2), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); +} + +function reverse(series) { + return none$2(series).reverse(); +} + +function constant$c(x) { + return function() { + return x; + }; +} + +function x$4(d) { + return d[0]; +} + +function y$4(d) { + return d[1]; +} + +function RedBlackTree() { + this._ = null; // root node +} + +function RedBlackNode(node) { + node.U = // parent node + node.C = // color - true for red, false for black + node.L = // left node + node.R = // right node + node.P = // previous node + node.N = null; // next node +} + +RedBlackTree.prototype = { + constructor: RedBlackTree, + + insert: function(after, node) { + var parent, grandpa, uncle; + + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = RedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + RedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + RedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + + remove: function(node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + + var parent = node.U, + sibling, + left = node.L, + right = node.R, + next, + red; + + if (!left) next = right; + else if (!right) next = left; + else next = RedBlackFirst(right); + + if (parent) { + if (parent.L === node) parent.L = next; + else parent.R = next; + } else { + this._ = next; + } + + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + + if (node) node.U = parent; + if (red) return; + if (node && node.C) { node.C = false; return; } + + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + RedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + RedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateRight(this, parent); + sibling = parent.L; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + RedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + RedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + + if (node) node.C = false; + } +}; + +function RedBlackRotateLeft(tree, node) { + var p = node, + q = node.R, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; +} + +function RedBlackRotateRight(tree, node) { + var p = node, + q = node.L, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; +} + +function RedBlackFirst(node) { + while (node.L) node = node.L; + return node; +} + +function createEdge(left, right, v0, v1) { + var edge = [null, null], + index = edges.push(edge) - 1; + edge.left = left; + edge.right = right; + if (v0) setEdgeEnd(edge, left, right, v0); + if (v1) setEdgeEnd(edge, right, left, v1); + cells[left.index].halfedges.push(index); + cells[right.index].halfedges.push(index); + return edge; +} + +function createBorderEdge(left, v0, v1) { + var edge = [v0, v1]; + edge.left = left; + return edge; +} + +function setEdgeEnd(edge, left, right, vertex) { + if (!edge[0] && !edge[1]) { + edge[0] = vertex; + edge.left = left; + edge.right = right; + } else if (edge.left === right) { + edge[1] = vertex; + } else { + edge[0] = vertex; + } +} + +// Liang–Barsky line clipping. +function clipEdge(edge, x0, y0, x1, y1) { + var a = edge[0], + b = edge[1], + ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? + + if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; + if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; + return true; +} + +function connectEdge(edge, x0, y0, x1, y1) { + var v1 = edge[1]; + if (v1) return true; + + var v0 = edge[0], + left = edge.left, + right = edge.right, + lx = left[0], + ly = left[1], + rx = right[0], + ry = right[1], + fx = (lx + rx) / 2, + fy = (ly + ry) / 2, + fm, + fb; + + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!v0) v0 = [fx, y0]; + else if (v0[1] >= y1) return; + v1 = [fx, y1]; + } else { + if (!v0) v0 = [fx, y1]; + else if (v0[1] < y0) return; + v1 = [fx, y0]; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!v0) v0 = [(y0 - fb) / fm, y0]; + else if (v0[1] >= y1) return; + v1 = [(y1 - fb) / fm, y1]; + } else { + if (!v0) v0 = [(y1 - fb) / fm, y1]; + else if (v0[1] < y0) return; + v1 = [(y0 - fb) / fm, y0]; + } + } else { + if (ly < ry) { + if (!v0) v0 = [x0, fm * x0 + fb]; + else if (v0[0] >= x1) return; + v1 = [x1, fm * x1 + fb]; + } else { + if (!v0) v0 = [x1, fm * x1 + fb]; + else if (v0[0] < x0) return; + v1 = [x0, fm * x0 + fb]; + } + } + } + + edge[0] = v0; + edge[1] = v1; + return true; +} + +function clipEdges(x0, y0, x1, y1) { + var i = edges.length, + edge; + + while (i--) { + if (!connectEdge(edge = edges[i], x0, y0, x1, y1) + || !clipEdge(edge, x0, y0, x1, y1) + || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4 + || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) { + delete edges[i]; + } + } +} + +function createCell(site) { + return cells[site.index] = { + site: site, + halfedges: [] + }; +} + +function cellHalfedgeAngle(cell, edge) { + var site = cell.site, + va = edge.left, + vb = edge.right; + if (site === vb) vb = va, va = site; + if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); + if (site === va) va = edge[1], vb = edge[0]; + else va = edge[0], vb = edge[1]; + return Math.atan2(va[0] - vb[0], vb[1] - va[1]); +} + +function cellHalfedgeStart(cell, edge) { + return edge[+(edge.left !== cell.site)]; +} + +function cellHalfedgeEnd(cell, edge) { + return edge[+(edge.left === cell.site)]; +} + +function sortCellHalfedges() { + for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { + if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { + var index = new Array(m), + array = new Array(m); + for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); + index.sort(function(i, j) { return array[j] - array[i]; }); + for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; + for (j = 0; j < m; ++j) halfedges[j] = array[j]; + } + } +} + +function clipCells(x0, y0, x1, y1) { + var nCells = cells.length, + iCell, + cell, + site, + iHalfedge, + halfedges, + nHalfedges, + start, + startX, + startY, + end, + endX, + endY, + cover = true; + + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + halfedges = cell.halfedges; + iHalfedge = halfedges.length; + + // Remove any dangling clipped edges. + while (iHalfedge--) { + if (!edges[halfedges[iHalfedge]]) { + halfedges.splice(iHalfedge, 1); + } + } + + // Insert any border edges as necessary. + iHalfedge = 0, nHalfedges = halfedges.length; + while (iHalfedge < nHalfedges) { + end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; + start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; + if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) { + halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, + Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1] + : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1] + : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0] + : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0] + : null)) - 1); + ++nHalfedges; + } + } + + if (nHalfedges) cover = false; + } + } + + // If there weren’t any edges, have the closest site cover the extent. + // It doesn’t matter which corner of the extent we measure! + if (cover) { + var dx, dy, d2, dc = Infinity; + + for (iCell = 0, cover = null; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + dx = site[0] - x0; + dy = site[1] - y0; + d2 = dx * dx + dy * dy; + if (d2 < dc) dc = d2, cover = cell; + } + } + + if (cover) { + var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; + cover.halfedges.push( + edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, + edges.push(createBorderEdge(site, v01, v11)) - 1, + edges.push(createBorderEdge(site, v11, v10)) - 1, + edges.push(createBorderEdge(site, v10, v00)) - 1 + ); + } + } + + // Lastly delete any cells with no edges; these were entirely clipped. + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + if (!cell.halfedges.length) { + delete cells[iCell]; + } + } + } +} + +var circlePool = []; + +var firstCircle; + +function Circle() { + RedBlackNode(this); + this.x = + this.y = + this.arc = + this.site = + this.cy = null; +} + +function attachCircle(arc) { + var lArc = arc.P, + rArc = arc.N; + + if (!lArc || !rArc) return; + + var lSite = lArc.site, + cSite = arc.site, + rSite = rArc.site; + + if (lSite === rSite) return; + + var bx = cSite[0], + by = cSite[1], + ax = lSite[0] - bx, + ay = lSite[1] - by, + cx = rSite[0] - bx, + cy = rSite[1] - by; + + var d = 2 * (ax * cy - ay * cx); + if (d >= -epsilon2$2) return; + + var ha = ax * ax + ay * ay, + hc = cx * cx + cy * cy, + x = (cy * ha - ay * hc) / d, + y = (ax * hc - cx * ha) / d; + + var circle = circlePool.pop() || new Circle; + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom + + arc.circle = circle; + + var before = null, + node = circles._; + + while (node) { + if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { + if (node.L) node = node.L; + else { before = node.P; break; } + } else { + if (node.R) node = node.R; + else { before = node; break; } + } + } + + circles.insert(before, circle); + if (!before) firstCircle = circle; +} + +function detachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) firstCircle = circle.N; + circles.remove(circle); + circlePool.push(circle); + RedBlackNode(circle); + arc.circle = null; + } +} + +var beachPool = []; + +function Beach() { + RedBlackNode(this); + this.edge = + this.site = + this.circle = null; +} + +function createBeach(site) { + var beach = beachPool.pop() || new Beach; + beach.site = site; + return beach; +} + +function detachBeach(beach) { + detachCircle(beach); + beaches.remove(beach); + beachPool.push(beach); + RedBlackNode(beach); +} + +function removeBeach(beach) { + var circle = beach.circle, + x = circle.x, + y = circle.cy, + vertex = [x, y], + previous = beach.P, + next = beach.N, + disappearing = [beach]; + + detachBeach(beach); + + var lArc = previous; + while (lArc.circle + && Math.abs(x - lArc.circle.x) < epsilon$4 + && Math.abs(y - lArc.circle.cy) < epsilon$4) { + previous = lArc.P; + disappearing.unshift(lArc); + detachBeach(lArc); + lArc = previous; + } + + disappearing.unshift(lArc); + detachCircle(lArc); + + var rArc = next; + while (rArc.circle + && Math.abs(x - rArc.circle.x) < epsilon$4 + && Math.abs(y - rArc.circle.cy) < epsilon$4) { + next = rArc.N; + disappearing.push(rArc); + detachBeach(rArc); + rArc = next; + } + + disappearing.push(rArc); + detachCircle(rArc); + + var nArcs = disappearing.length, + iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + + attachCircle(lArc); + attachCircle(rArc); +} + +function addBeach(site) { + var x = site[0], + directrix = site[1], + lArc, + rArc, + dxl, + dxr, + node = beaches._; + + while (node) { + dxl = leftBreakPoint(node, directrix) - x; + if (dxl > epsilon$4) node = node.L; else { + dxr = x - rightBreakPoint(node, directrix); + if (dxr > epsilon$4) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -epsilon$4) { + lArc = node.P; + rArc = node; + } else if (dxr > -epsilon$4) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + + createCell(site); + var newArc = createBeach(site); + beaches.insert(lArc, newArc); + + if (!lArc && !rArc) return; + + if (lArc === rArc) { + detachCircle(lArc); + rArc = createBeach(lArc.site); + beaches.insert(newArc, rArc); + newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); + attachCircle(lArc); + attachCircle(rArc); + return; + } + + if (!rArc) { // && lArc + newArc.edge = createEdge(lArc.site, newArc.site); + return; + } + + // else lArc !== rArc + detachCircle(lArc); + detachCircle(rArc); + + var lSite = lArc.site, + ax = lSite[0], + ay = lSite[1], + bx = site[0] - ax, + by = site[1] - ay, + rSite = rArc.site, + cx = rSite[0] - ax, + cy = rSite[1] - ay, + d = 2 * (bx * cy - by * cx), + hb = bx * bx + by * by, + hc = cx * cx + cy * cy, + vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; + + setEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = createEdge(lSite, site, null, vertex); + rArc.edge = createEdge(site, rSite, null, vertex); + attachCircle(lArc); + attachCircle(rArc); +} + +function leftBreakPoint(arc, directrix) { + var site = arc.site, + rfocx = site[0], + rfocy = site[1], + pby2 = rfocy - directrix; + + if (!pby2) return rfocx; + + var lArc = arc.P; + if (!lArc) return -Infinity; + + site = lArc.site; + var lfocx = site[0], + lfocy = site[1], + plby2 = lfocy - directrix; + + if (!plby2) return lfocx; + + var hl = lfocx - rfocx, + aby2 = 1 / pby2 - 1 / plby2, + b = hl / plby2; + + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + + return (rfocx + lfocx) / 2; +} + +function rightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return leftBreakPoint(rArc, directrix); + var site = arc.site; + return site[1] === directrix ? site[0] : Infinity; +} + +var epsilon$4 = 1e-6; +var epsilon2$2 = 1e-12; +var beaches; +var cells; +var circles; +var edges; + +function triangleArea(a, b, c) { + return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); +} + +function lexicographic(a, b) { + return b[1] - a[1] + || b[0] - a[0]; +} + +function Diagram(sites, extent) { + var site = sites.sort(lexicographic).pop(), + x, + y, + circle; + + edges = []; + cells = new Array(sites.length); + beaches = new RedBlackTree; + circles = new RedBlackTree; + + while (true) { + circle = firstCircle; + if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { + if (site[0] !== x || site[1] !== y) { + addBeach(site); + x = site[0], y = site[1]; + } + site = sites.pop(); + } else if (circle) { + removeBeach(circle.arc); + } else { + break; + } + } + + sortCellHalfedges(); + + if (extent) { + var x0 = +extent[0][0], + y0 = +extent[0][1], + x1 = +extent[1][0], + y1 = +extent[1][1]; + clipEdges(x0, y0, x1, y1); + clipCells(x0, y0, x1, y1); + } + + this.edges = edges; + this.cells = cells; + + beaches = + circles = + edges = + cells = null; +} + +Diagram.prototype = { + constructor: Diagram, + + polygons: function() { + var edges = this.edges; + + return this.cells.map(function(cell) { + var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); }); + polygon.data = cell.site.data; + return polygon; + }); + }, + + triangles: function() { + var triangles = [], + edges = this.edges; + + this.cells.forEach(function(cell, i) { + if (!(m = (halfedges = cell.halfedges).length)) return; + var site = cell.site, + halfedges, + j = -1, + m, + s0, + e1 = edges[halfedges[m - 1]], + s1 = e1.left === site ? e1.right : e1.left; + + while (++j < m) { + s0 = s1; + e1 = edges[halfedges[j]]; + s1 = e1.left === site ? e1.right : e1.left; + if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { + triangles.push([site.data, s0.data, s1.data]); + } + } + }); + + return triangles; + }, + + links: function() { + return this.edges.filter(function(edge) { + return edge.right; + }).map(function(edge) { + return { + source: edge.left.data, + target: edge.right.data + }; + }); + }, + + find: function(x, y, radius) { + var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; + + // Use the previously-found cell, or start with an arbitrary one. + while (!(cell = that.cells[i1])) if (++i1 >= n) return null; + var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; + + // Traverse the half-edges to find a closer cell, if any. + do { + cell = that.cells[i0 = i1], i1 = null; + cell.halfedges.forEach(function(e) { + var edge = that.edges[e], v = edge.left; + if ((v === cell.site || !v) && !(v = edge.right)) return; + var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; + if (v2 < d2) d2 = v2, i1 = v.index; + }); + } while (i1 !== null); + + that._found = i0; + + return radius == null || d2 <= radius * radius ? cell.site : null; + } +}; + +function voronoi() { + var x = x$4, + y = y$4, + extent = null; + + function voronoi(data) { + return new Diagram(data.map(function(d, i) { + var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4]; + s.index = i; + s.data = d; + return s; + }), extent); + } + + voronoi.polygons = function(data) { + return voronoi(data).polygons(); + }; + + voronoi.links = function(data) { + return voronoi(data).links(); + }; + + voronoi.triangles = function(data) { + return voronoi(data).triangles(); + }; + + voronoi.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x; + }; + + voronoi.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y; + }; + + voronoi.extent = function(_) { + return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; + }; + + voronoi.size = function(_) { + return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; + }; + + return voronoi; +} + +function constant$d(x) { + return function() { + return x; + }; +} + +function ZoomEvent(target, type, transform) { + this.target = target; + this.type = type; + this.transform = transform; +} + +function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; +} + +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; + +var identity$9 = new Transform(1, 0, 0); + +transform$1.prototype = Transform.prototype; + +function transform$1(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity$9; + return node.__zoom; +} + +function nopropagation$2() { + exports.event.stopImmediatePropagation(); +} + +function noevent$2() { + exports.event.preventDefault(); + exports.event.stopImmediatePropagation(); +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter$2() { + return !exports.event.ctrlKey && !exports.event.button; +} + +function defaultExtent$1() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} + +function defaultTransform() { + return this.__zoom || identity$9; +} + +function defaultWheelDelta() { + return -exports.event.deltaY * (exports.event.deltaMode === 1 ? 0.05 : exports.event.deltaMode ? 1 : 0.002); +} + +function defaultTouchable$2() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} + +function zoom() { + var filter = defaultFilter$2, + extent = defaultExtent$1, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable$2, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = interpolateZoom, + listeners = dispatch("start", "zoom", "end"), + touchstarting, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function(collection, transform, point) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point); + } else { + selection.interrupt().each(function() { + gesture(this, arguments) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection, k, p) { + zoom.scaleTo(selection, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p); + }; + + zoom.scaleTo = function(selection, k, p) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p); + }; + + zoom.translateBy = function(selection, x, y) { + zoom.transform(selection, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }); + }; + + zoom.translateTo = function(selection, x, y, p) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity$9.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point) { + transition + .on("start.zoom", function() { gesture(this, arguments).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type) { + customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function wheeled() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = mouse(this); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + interrupt(this); + g.start(); + } + + noevent$2(); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, arguments, true), + v = select(exports.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = mouse(this), + x0 = exports.event.clientX, + y0 = exports.event.clientY; + + dragDisable(exports.event.view); + nopropagation$2(); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt(this); + g.start(); + + function mousemoved() { + noevent$2(); + if (!g.moved) { + var dx = exports.event.clientX - x0, dy = exports.event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped() { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(exports.event.view, g.moved); + noevent$2(); + g.end(); + } + } + + function dblclicked() { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = mouse(this), + p1 = t0.invert(p0), + k1 = t0.k * (exports.event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); + + noevent$2(); + if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0); + else select(this).call(zoom.transform, t1); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = exports.event.touches, + n = touches.length, + g = gesture(this, arguments, exports.event.changedTouches.length === n), + started, i, t, p; + + nopropagation$2(); + for (i = 0; i < n; ++i) { + t = touches[i], p = touch(this, touches, t.identifier); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + interrupt(this); + g.start(); + } + } + + function touchmoved() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = exports.event.changedTouches, + n = touches.length, i, t, p, l; + + noevent$2(); + if (touchstarting) touchstarting = clearTimeout(touchstarting); + g.taps = 0; + for (i = 0; i < n; ++i) { + t = touches[i], p = touch(this, touches, t.identifier); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } + else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = exports.event.changedTouches, + n = touches.length, i, t; + + nopropagation$2(); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + var p = select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta; + }; + + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter; + }; + + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable; + }; + + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + return zoom; +} + +exports.FormatSpecifier = FormatSpecifier; +exports.active = active; +exports.arc = arc; +exports.area = area$3; +exports.areaRadial = areaRadial; +exports.ascending = ascending; +exports.autoType = autoType; +exports.axisBottom = axisBottom; +exports.axisLeft = axisLeft; +exports.axisRight = axisRight; +exports.axisTop = axisTop; +exports.bisect = bisectRight; +exports.bisectLeft = bisectLeft; +exports.bisectRight = bisectRight; +exports.bisector = bisector; +exports.blob = blob; +exports.brush = brush; +exports.brushSelection = brushSelection; +exports.brushX = brushX; +exports.brushY = brushY; +exports.buffer = buffer; +exports.chord = chord; +exports.clientPoint = point; +exports.cluster = cluster; +exports.color = color; +exports.contourDensity = density; +exports.contours = contours; +exports.create = create; +exports.creator = creator; +exports.cross = cross; +exports.csv = csv$1; +exports.csvFormat = csvFormat; +exports.csvFormatBody = csvFormatBody; +exports.csvFormatRows = csvFormatRows; +exports.csvParse = csvParse; +exports.csvParseRows = csvParseRows; +exports.cubehelix = cubehelix; +exports.curveBasis = basis$2; +exports.curveBasisClosed = basisClosed$1; +exports.curveBasisOpen = basisOpen; +exports.curveBundle = bundle; +exports.curveCardinal = cardinal; +exports.curveCardinalClosed = cardinalClosed; +exports.curveCardinalOpen = cardinalOpen; +exports.curveCatmullRom = catmullRom; +exports.curveCatmullRomClosed = catmullRomClosed; +exports.curveCatmullRomOpen = catmullRomOpen; +exports.curveLinear = curveLinear; +exports.curveLinearClosed = linearClosed; +exports.curveMonotoneX = monotoneX; +exports.curveMonotoneY = monotoneY; +exports.curveNatural = natural; +exports.curveStep = step; +exports.curveStepAfter = stepAfter; +exports.curveStepBefore = stepBefore; +exports.customEvent = customEvent; +exports.descending = descending; +exports.deviation = deviation; +exports.dispatch = dispatch; +exports.drag = drag; +exports.dragDisable = dragDisable; +exports.dragEnable = yesdrag; +exports.dsv = dsv; +exports.dsvFormat = dsvFormat; +exports.easeBack = backInOut; +exports.easeBackIn = backIn; +exports.easeBackInOut = backInOut; +exports.easeBackOut = backOut; +exports.easeBounce = bounceOut; +exports.easeBounceIn = bounceIn; +exports.easeBounceInOut = bounceInOut; +exports.easeBounceOut = bounceOut; +exports.easeCircle = circleInOut; +exports.easeCircleIn = circleIn; +exports.easeCircleInOut = circleInOut; +exports.easeCircleOut = circleOut; +exports.easeCubic = cubicInOut; +exports.easeCubicIn = cubicIn; +exports.easeCubicInOut = cubicInOut; +exports.easeCubicOut = cubicOut; +exports.easeElastic = elasticOut; +exports.easeElasticIn = elasticIn; +exports.easeElasticInOut = elasticInOut; +exports.easeElasticOut = elasticOut; +exports.easeExp = expInOut; +exports.easeExpIn = expIn; +exports.easeExpInOut = expInOut; +exports.easeExpOut = expOut; +exports.easeLinear = linear$1; +exports.easePoly = polyInOut; +exports.easePolyIn = polyIn; +exports.easePolyInOut = polyInOut; +exports.easePolyOut = polyOut; +exports.easeQuad = quadInOut; +exports.easeQuadIn = quadIn; +exports.easeQuadInOut = quadInOut; +exports.easeQuadOut = quadOut; +exports.easeSin = sinInOut; +exports.easeSinIn = sinIn; +exports.easeSinInOut = sinInOut; +exports.easeSinOut = sinOut; +exports.entries = entries; +exports.extent = extent; +exports.forceCenter = center$1; +exports.forceCollide = collide; +exports.forceLink = link; +exports.forceManyBody = manyBody; +exports.forceRadial = radial; +exports.forceSimulation = simulation; +exports.forceX = x$2; +exports.forceY = y$2; +exports.formatDefaultLocale = defaultLocale; +exports.formatLocale = formatLocale; +exports.formatSpecifier = formatSpecifier; +exports.geoAlbers = albers; +exports.geoAlbersUsa = albersUsa; +exports.geoArea = area$1; +exports.geoAzimuthalEqualArea = azimuthalEqualArea; +exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; +exports.geoAzimuthalEquidistant = azimuthalEquidistant; +exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; +exports.geoBounds = bounds; +exports.geoCentroid = centroid; +exports.geoCircle = circle; +exports.geoClipAntimeridian = clipAntimeridian; +exports.geoClipCircle = clipCircle; +exports.geoClipExtent = extent$1; +exports.geoClipRectangle = clipRectangle; +exports.geoConicConformal = conicConformal; +exports.geoConicConformalRaw = conicConformalRaw; +exports.geoConicEqualArea = conicEqualArea; +exports.geoConicEqualAreaRaw = conicEqualAreaRaw; +exports.geoConicEquidistant = conicEquidistant; +exports.geoConicEquidistantRaw = conicEquidistantRaw; +exports.geoContains = contains$1; +exports.geoDistance = distance; +exports.geoEqualEarth = equalEarth; +exports.geoEqualEarthRaw = equalEarthRaw; +exports.geoEquirectangular = equirectangular; +exports.geoEquirectangularRaw = equirectangularRaw; +exports.geoGnomonic = gnomonic; +exports.geoGnomonicRaw = gnomonicRaw; +exports.geoGraticule = graticule; +exports.geoGraticule10 = graticule10; +exports.geoIdentity = identity$5; +exports.geoInterpolate = interpolate$1; +exports.geoLength = length$1; +exports.geoMercator = mercator; +exports.geoMercatorRaw = mercatorRaw; +exports.geoNaturalEarth1 = naturalEarth1; +exports.geoNaturalEarth1Raw = naturalEarth1Raw; +exports.geoOrthographic = orthographic; +exports.geoOrthographicRaw = orthographicRaw; +exports.geoPath = index$1; +exports.geoProjection = projection; +exports.geoProjectionMutator = projectionMutator; +exports.geoRotation = rotation; +exports.geoStereographic = stereographic; +exports.geoStereographicRaw = stereographicRaw; +exports.geoStream = geoStream; +exports.geoTransform = transform; +exports.geoTransverseMercator = transverseMercator; +exports.geoTransverseMercatorRaw = transverseMercatorRaw; +exports.gray = gray; +exports.hcl = hcl; +exports.hierarchy = hierarchy; +exports.histogram = histogram; +exports.hsl = hsl; +exports.html = html; +exports.image = image; +exports.interpolate = interpolateValue; +exports.interpolateArray = array$1; +exports.interpolateBasis = basis$1; +exports.interpolateBasisClosed = basisClosed; +exports.interpolateBlues = Blues; +exports.interpolateBrBG = BrBG; +exports.interpolateBuGn = BuGn; +exports.interpolateBuPu = BuPu; +exports.interpolateCividis = cividis; +exports.interpolateCool = cool; +exports.interpolateCubehelix = cubehelix$2; +exports.interpolateCubehelixDefault = cubehelix$3; +exports.interpolateCubehelixLong = cubehelixLong; +exports.interpolateDate = date; +exports.interpolateDiscrete = discrete; +exports.interpolateGnBu = GnBu; +exports.interpolateGreens = Greens; +exports.interpolateGreys = Greys; +exports.interpolateHcl = hcl$2; +exports.interpolateHclLong = hclLong; +exports.interpolateHsl = hsl$2; +exports.interpolateHslLong = hslLong; +exports.interpolateHue = hue$1; +exports.interpolateInferno = inferno; +exports.interpolateLab = lab$1; +exports.interpolateMagma = magma; +exports.interpolateNumber = interpolateNumber; +exports.interpolateObject = object; +exports.interpolateOrRd = OrRd; +exports.interpolateOranges = Oranges; +exports.interpolatePRGn = PRGn; +exports.interpolatePiYG = PiYG; +exports.interpolatePlasma = plasma; +exports.interpolatePuBu = PuBu; +exports.interpolatePuBuGn = PuBuGn; +exports.interpolatePuOr = PuOr; +exports.interpolatePuRd = PuRd; +exports.interpolatePurples = Purples; +exports.interpolateRainbow = rainbow; +exports.interpolateRdBu = RdBu; +exports.interpolateRdGy = RdGy; +exports.interpolateRdPu = RdPu; +exports.interpolateRdYlBu = RdYlBu; +exports.interpolateRdYlGn = RdYlGn; +exports.interpolateReds = Reds; +exports.interpolateRgb = interpolateRgb; +exports.interpolateRgbBasis = rgbBasis; +exports.interpolateRgbBasisClosed = rgbBasisClosed; +exports.interpolateRound = interpolateRound; +exports.interpolateSinebow = sinebow; +exports.interpolateSpectral = Spectral; +exports.interpolateString = interpolateString; +exports.interpolateTransformCss = interpolateTransformCss; +exports.interpolateTransformSvg = interpolateTransformSvg; +exports.interpolateTurbo = turbo; +exports.interpolateViridis = viridis; +exports.interpolateWarm = warm; +exports.interpolateYlGn = YlGn; +exports.interpolateYlGnBu = YlGnBu; +exports.interpolateYlOrBr = YlOrBr; +exports.interpolateYlOrRd = YlOrRd; +exports.interpolateZoom = interpolateZoom; +exports.interrupt = interrupt; +exports.interval = interval$1; +exports.isoFormat = formatIso; +exports.isoParse = parseIso; +exports.json = json; +exports.keys = keys; +exports.lab = lab; +exports.lch = lch; +exports.line = line; +exports.lineRadial = lineRadial$1; +exports.linkHorizontal = linkHorizontal; +exports.linkRadial = linkRadial; +exports.linkVertical = linkVertical; +exports.local = local; +exports.map = map$1; +exports.matcher = matcher; +exports.max = max; +exports.mean = mean; +exports.median = median; +exports.merge = merge; +exports.min = min; +exports.mouse = mouse; +exports.namespace = namespace; +exports.namespaces = namespaces; +exports.nest = nest; +exports.now = now; +exports.pack = index$2; +exports.packEnclose = enclose; +exports.packSiblings = siblings; +exports.pairs = pairs; +exports.partition = partition; +exports.path = path; +exports.permute = permute; +exports.pie = pie; +exports.piecewise = piecewise; +exports.pointRadial = pointRadial; +exports.polygonArea = area$2; +exports.polygonCentroid = centroid$1; +exports.polygonContains = contains$2; +exports.polygonHull = hull; +exports.polygonLength = length$2; +exports.precisionFixed = precisionFixed; +exports.precisionPrefix = precisionPrefix; +exports.precisionRound = precisionRound; +exports.quadtree = quadtree; +exports.quantile = threshold; +exports.quantize = quantize; +exports.radialArea = areaRadial; +exports.radialLine = lineRadial$1; +exports.randomBates = bates; +exports.randomExponential = exponential$1; +exports.randomIrwinHall = irwinHall; +exports.randomLogNormal = logNormal; +exports.randomNormal = normal; +exports.randomUniform = uniform; +exports.range = sequence; +exports.rgb = rgb; +exports.ribbon = ribbon; +exports.scaleBand = band; +exports.scaleDiverging = diverging; +exports.scaleDivergingLog = divergingLog; +exports.scaleDivergingPow = divergingPow; +exports.scaleDivergingSqrt = divergingSqrt; +exports.scaleDivergingSymlog = divergingSymlog; +exports.scaleIdentity = identity$7; +exports.scaleImplicit = implicit; +exports.scaleLinear = linear$2; +exports.scaleLog = log$1; +exports.scaleOrdinal = ordinal; +exports.scalePoint = point$1; +exports.scalePow = pow$1; +exports.scaleQuantile = quantile; +exports.scaleQuantize = quantize$1; +exports.scaleSequential = sequential; +exports.scaleSequentialLog = sequentialLog; +exports.scaleSequentialPow = sequentialPow; +exports.scaleSequentialQuantile = sequentialQuantile; +exports.scaleSequentialSqrt = sequentialSqrt; +exports.scaleSequentialSymlog = sequentialSymlog; +exports.scaleSqrt = sqrt$1; +exports.scaleSymlog = symlog; +exports.scaleThreshold = threshold$1; +exports.scaleTime = time; +exports.scaleUtc = utcTime; +exports.scan = scan; +exports.schemeAccent = Accent; +exports.schemeBlues = scheme$l; +exports.schemeBrBG = scheme; +exports.schemeBuGn = scheme$9; +exports.schemeBuPu = scheme$a; +exports.schemeCategory10 = category10; +exports.schemeDark2 = Dark2; +exports.schemeGnBu = scheme$b; +exports.schemeGreens = scheme$m; +exports.schemeGreys = scheme$n; +exports.schemeOrRd = scheme$c; +exports.schemeOranges = scheme$q; +exports.schemePRGn = scheme$1; +exports.schemePaired = Paired; +exports.schemePastel1 = Pastel1; +exports.schemePastel2 = Pastel2; +exports.schemePiYG = scheme$2; +exports.schemePuBu = scheme$e; +exports.schemePuBuGn = scheme$d; +exports.schemePuOr = scheme$3; +exports.schemePuRd = scheme$f; +exports.schemePurples = scheme$o; +exports.schemeRdBu = scheme$4; +exports.schemeRdGy = scheme$5; +exports.schemeRdPu = scheme$g; +exports.schemeRdYlBu = scheme$6; +exports.schemeRdYlGn = scheme$7; +exports.schemeReds = scheme$p; +exports.schemeSet1 = Set1; +exports.schemeSet2 = Set2; +exports.schemeSet3 = Set3; +exports.schemeSpectral = scheme$8; +exports.schemeTableau10 = Tableau10; +exports.schemeYlGn = scheme$i; +exports.schemeYlGnBu = scheme$h; +exports.schemeYlOrBr = scheme$j; +exports.schemeYlOrRd = scheme$k; +exports.select = select; +exports.selectAll = selectAll; +exports.selection = selection; +exports.selector = selector; +exports.selectorAll = selectorAll; +exports.set = set$2; +exports.shuffle = shuffle; +exports.stack = stack; +exports.stackOffsetDiverging = diverging$1; +exports.stackOffsetExpand = expand; +exports.stackOffsetNone = none$1; +exports.stackOffsetSilhouette = silhouette; +exports.stackOffsetWiggle = wiggle; +exports.stackOrderAppearance = appearance; +exports.stackOrderAscending = ascending$3; +exports.stackOrderDescending = descending$2; +exports.stackOrderInsideOut = insideOut; +exports.stackOrderNone = none$2; +exports.stackOrderReverse = reverse; +exports.stratify = stratify; +exports.style = styleValue; +exports.sum = sum; +exports.svg = svg; +exports.symbol = symbol; +exports.symbolCircle = circle$2; +exports.symbolCross = cross$2; +exports.symbolDiamond = diamond; +exports.symbolSquare = square; +exports.symbolStar = star; +exports.symbolTriangle = triangle; +exports.symbolWye = wye; +exports.symbols = symbols; +exports.text = text; +exports.thresholdFreedmanDiaconis = freedmanDiaconis; +exports.thresholdScott = scott; +exports.thresholdSturges = thresholdSturges; +exports.tickFormat = tickFormat; +exports.tickIncrement = tickIncrement; +exports.tickStep = tickStep; +exports.ticks = ticks; +exports.timeDay = day; +exports.timeDays = days; +exports.timeFormatDefaultLocale = defaultLocale$1; +exports.timeFormatLocale = formatLocale$1; +exports.timeFriday = friday; +exports.timeFridays = fridays; +exports.timeHour = hour; +exports.timeHours = hours; +exports.timeInterval = newInterval; +exports.timeMillisecond = millisecond; +exports.timeMilliseconds = milliseconds; +exports.timeMinute = minute; +exports.timeMinutes = minutes; +exports.timeMonday = monday; +exports.timeMondays = mondays; +exports.timeMonth = month; +exports.timeMonths = months; +exports.timeSaturday = saturday; +exports.timeSaturdays = saturdays; +exports.timeSecond = second; +exports.timeSeconds = seconds; +exports.timeSunday = sunday; +exports.timeSundays = sundays; +exports.timeThursday = thursday; +exports.timeThursdays = thursdays; +exports.timeTuesday = tuesday; +exports.timeTuesdays = tuesdays; +exports.timeWednesday = wednesday; +exports.timeWednesdays = wednesdays; +exports.timeWeek = sunday; +exports.timeWeeks = sundays; +exports.timeYear = year; +exports.timeYears = years; +exports.timeout = timeout$1; +exports.timer = timer; +exports.timerFlush = timerFlush; +exports.touch = touch; +exports.touches = touches; +exports.transition = transition; +exports.transpose = transpose; +exports.tree = tree; +exports.treemap = index$3; +exports.treemapBinary = binary; +exports.treemapDice = treemapDice; +exports.treemapResquarify = resquarify; +exports.treemapSlice = treemapSlice; +exports.treemapSliceDice = sliceDice; +exports.treemapSquarify = squarify; +exports.tsv = tsv$1; +exports.tsvFormat = tsvFormat; +exports.tsvFormatBody = tsvFormatBody; +exports.tsvFormatRows = tsvFormatRows; +exports.tsvParse = tsvParse; +exports.tsvParseRows = tsvParseRows; +exports.utcDay = utcDay; +exports.utcDays = utcDays; +exports.utcFriday = utcFriday; +exports.utcFridays = utcFridays; +exports.utcHour = utcHour; +exports.utcHours = utcHours; +exports.utcMillisecond = millisecond; +exports.utcMilliseconds = milliseconds; +exports.utcMinute = utcMinute; +exports.utcMinutes = utcMinutes; +exports.utcMonday = utcMonday; +exports.utcMondays = utcMondays; +exports.utcMonth = utcMonth; +exports.utcMonths = utcMonths; +exports.utcSaturday = utcSaturday; +exports.utcSaturdays = utcSaturdays; +exports.utcSecond = second; +exports.utcSeconds = seconds; +exports.utcSunday = utcSunday; +exports.utcSundays = utcSundays; +exports.utcThursday = utcThursday; +exports.utcThursdays = utcThursdays; +exports.utcTuesday = utcTuesday; +exports.utcTuesdays = utcTuesdays; +exports.utcWednesday = utcWednesday; +exports.utcWednesdays = utcWednesdays; +exports.utcWeek = utcSunday; +exports.utcWeeks = utcSundays; +exports.utcYear = utcYear; +exports.utcYears = utcYears; +exports.values = values; +exports.variance = variance; +exports.version = version; +exports.voronoi = voronoi; +exports.window = defaultView; +exports.xml = xml; +exports.zip = zip; +exports.zoom = zoom; +exports.zoomIdentity = identity$9; +exports.zoomTransform = transform$1; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/panel_test_app/well_log_viz/format_template.js b/panel_test_app/well_log_viz/format_template.js new file mode 100644 index 0000000..2ebb46b --- /dev/null +++ b/panel_test_app/well_log_viz/format_template.js @@ -0,0 +1,76 @@ +function make_curve_template(data) { + console.log('setting up template') + let dataTable = data["data"]; + let columns = data["columns"]; + let config = data["config"]; + var output_data_table = []; + var output_curve_templates = []; + + for (let i = 0; i < dataTable.length; i++) { + var currentRow = {}; + for(let j = 0; j < columns.length; j++){ + currentRow[columns[j]] = dataTable[i]['items'][j] + } + output_data_table[i] = currentRow + } + var template = get_default_template(columns); + template['data'] = output_data_table; + return template +} + +function get_default_template(columns) { + let colorsList = ['black', 'red', 'blue', 'pink', 'grey', 'purple', 'green']; + var templateOutput = {}; + if (columns.length > 2) { + var multiLines = 'yes'; + } else { + var multiLines = 'no'; + } + var curvenames = []; + var colors = []; + var fills = []; + var counter = 0; + for(let i = 0; i < columns.length; i++){ + if (columns[i].toLowerCase().includes('depth')){ + var depthColName = columns[i]; + } + else { + curvenames[counter] = columns[i]; + colors[counter] = colorsList[counter]; + fills[counter] = get_fill_for_curve(columns[i]) + counter += 1; + } + } + templateOutput['multipleLines'] = multiLines; + templateOutput['curveNames'] = curvenames; + templateOutput['curveColors'] = colors; + templateOutput['fill'] = fills; + templateOutput['depth_curve_name'] = depthColName; + return templateOutput +} + +function get_fill_for_curve(curve) { + var fillObj = {}; + fillObj['curveName'] = curve; + fillObj['cutoffs'] = Array(0); + fillObj['fillDirection'] = 'left'; + fillObj['curve2'] = ""; + if(curve.toLowerCase().includes('gr')) { + console.log('GR log'); + fillObj['fill'] = "yes"; + fillObj['fillColors'] = ['orange']; + } else if(curve.toLowerCase().includes('dphi')) { + console.log('DPHI log'); + fillObj['fill'] = "no"; + fillObj['fillColors'] = Array(0); + } else if(curve.toLowerCase().includes('pef')) { + console.log('pef log'); + fillObj['fill'] = "no"; + fillObj['fillColors'] = Array(0); + } else { + console.log('Other'); + fillObj['fill'] = "no"; + fillObj['fillColors'] = Array(0); + } + return fillObj +} \ No newline at end of file diff --git a/panel_test_app/well_log_viz/single_well_log_display.js b/panel_test_app/well_log_viz/single_well_log_display.js new file mode 100644 index 0000000..adf2a75 --- /dev/null +++ b/panel_test_app/well_log_viz/single_well_log_display.js @@ -0,0 +1,48 @@ +function renderCore(sfdata) { + if ( resizing ) + { + return; + } + + console.log('Entering Render Core') + + // Extract the columns + var columns = sfdata.columns; + + // Extract the data array section + var chartdata = sfdata.data; + + // Extract the config section + var config = sfdata.config; + + // count the marked rows in the data set, needed later for marking rendering logic + var markedRows = 0; + for ( var i = 0; i < chartdata.length; i++ ) + { + if ( chartdata[i].hints.marked ) + { + markedRows = markedRows + 1; + } + } + // var width = window.innerWidth; + // var height = window.innerHeight; + singleWellDisplay("#js_chart") +} + +function makeDisplayWithJson(rootNode, jsonFile, width, height) { + d3.json(jsonFile).then(function(data){ + var template = make_curve_template(data); + // var width = window.innerWidth; + // var height = window.innerHeight; + template['width'] = width; + template['height'] = height; + template['margin'] = {top: 40, right: 3, bottom: 100, left: 40}; + return CurveBox([template], rootNode) + }); + +} + +function singleWellDisplay(rootNode, config) { + curve_template = make_curve_template(config); + CurveBox(curve_template, rootNode); +} \ No newline at end of file diff --git a/panel_test_app/well_log_viz/test_log.html b/panel_test_app/well_log_viz/test_log.html new file mode 100644 index 0000000..6cfdb8d --- /dev/null +++ b/panel_test_app/well_log_viz/test_log.html @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/panel_test_app/well_log_viz/test_log.json b/panel_test_app/well_log_viz/test_log.json new file mode 100644 index 0000000..cd48905 --- /dev/null +++ b/panel_test_app/well_log_viz/test_log.json @@ -0,0 +1,201992 @@ +{ + "columns": [ + "First([depthmd])", + "First([xpef])" + ], + "pageDataRows": false, + "pageRowSize": 10000, + "dataOnRequest": false, + "viewRowCount": 22440, + "baseTableHints": { + "rows": 22440, + "visible": 22440, + "marked": 0, + "tableName": "WellLogs (2)", + "settingName": "WellLogs" + }, + "data": [ + { + "items": [ + 530.5, + null + ], + "hints": { + "index": 0 + } + }, + { + "items": [ + 531, + null + ], + "hints": { + "index": 1 + } + }, + { + "items": [ + 531.5, + null + ], + "hints": { + "index": 2 + } + }, + { + "items": [ + 532, + null + ], + "hints": { + "index": 3 + } + }, + { + "items": [ + 532.5, + null + ], + "hints": { + "index": 4 + } + }, + { + "items": [ + 533, + null + ], + "hints": { + "index": 5 + } + }, + { + "items": [ + 533.5, + null + ], + "hints": { + "index": 6 + } + }, + { + "items": [ + 534, + null + ], + "hints": { + "index": 7 + } + }, + { + "items": [ + 534.5, + null + ], + "hints": { + "index": 8 + } + }, + { + "items": [ + 535, + null + ], + "hints": { + "index": 9 + } + }, + { + "items": [ + 535.5, + null + ], + "hints": { + "index": 10 + } + }, + { + "items": [ + 536, + null + ], + "hints": { + "index": 11 + } + }, + { + "items": [ + 536.5, + null + ], + "hints": { + "index": 12 + } + }, + { + "items": [ + 537, + null + ], + "hints": { + "index": 13 + } + }, + { + "items": [ + 537.5, + null + ], + "hints": { + "index": 14 + } + }, + { + "items": [ + 538, + null + ], + "hints": { + "index": 15 + } + }, + { + "items": [ + 538.5, + null + ], + "hints": { + "index": 16 + } + }, + { + "items": [ + 539, + null + ], + "hints": { + "index": 17 + } + }, + { + "items": [ + 539.5, + null + ], + "hints": { + "index": 18 + } + }, + { + "items": [ + 540, + null + ], + "hints": { + "index": 19 + } + }, + { + "items": [ + 540.5, + null + ], + "hints": { + "index": 20 + } + }, + { + "items": [ + 541, + null + ], + "hints": { + "index": 21 + } + }, + { + "items": [ + 541.5, + null + ], + "hints": { + "index": 22 + } + }, + { + "items": [ + 542, + null + ], + "hints": { + "index": 23 + } + }, + { + "items": [ + 542.5, + null + ], + "hints": { + "index": 24 + } + }, + { + "items": [ + 543, + null + ], + "hints": { + "index": 25 + } + }, + { + "items": [ + 543.5, + null + ], + "hints": { + "index": 26 + } + }, + { + "items": [ + 544, + null + ], + "hints": { + "index": 27 + } + }, + { + "items": [ + 544.5, + null + ], + "hints": { + "index": 28 + } + }, + { + "items": [ + 545, + null + ], + "hints": { + "index": 29 + } + }, + { + "items": [ + 545.5, + null + ], + "hints": { + "index": 30 + } + }, + { + "items": [ + 546, + null + ], + "hints": { + "index": 31 + } + }, + { + "items": [ + 546.5, + null + ], + "hints": { + "index": 32 + } + }, + { + "items": [ + 547, + null + ], + "hints": { + "index": 33 + } + }, + { + "items": [ + 547.5, + null + ], + "hints": { + "index": 34 + } + }, + { + "items": [ + 548, + null + ], + "hints": { + "index": 35 + } + }, + { + "items": [ + 548.5, + null + ], + "hints": { + "index": 36 + } + }, + { + "items": [ + 549, + null + ], + "hints": { + "index": 37 + } + }, + { + "items": [ + 549.5, + null + ], + "hints": { + "index": 38 + } + }, + { + "items": [ + 550, + null + ], + "hints": { + "index": 39 + } + }, + { + "items": [ + 550.5, + null + ], + "hints": { + "index": 40 + } + }, + { + "items": [ + 551, + null + ], + "hints": { + "index": 41 + } + }, + { + "items": [ + 551.5, + null + ], + "hints": { + "index": 42 + } + }, + { + "items": [ + 552, + null + ], + "hints": { + "index": 43 + } + }, + { + "items": [ + 552.5, + null + ], + "hints": { + "index": 44 + } + }, + { + "items": [ + 553, + null + ], + "hints": { + "index": 45 + } + }, + { + "items": [ + 553.5, + null + ], + "hints": { + "index": 46 + } + }, + { + "items": [ + 554, + null + ], + "hints": { + "index": 47 + } + }, + { + "items": [ + 554.5, + null + ], + "hints": { + "index": 48 + } + }, + { + "items": [ + 555, + null + ], + "hints": { + "index": 49 + } + }, + { + "items": [ + 555.5, + null + ], + "hints": { + "index": 50 + } + }, + { + "items": [ + 556, + null + ], + "hints": { + "index": 51 + } + }, + { + "items": [ + 556.5, + null + ], + "hints": { + "index": 52 + } + }, + { + "items": [ + 557, + null + ], + "hints": { + "index": 53 + } + }, + { + "items": [ + 557.5, + null + ], + "hints": { + "index": 54 + } + }, + { + "items": [ + 558, + null + ], + "hints": { + "index": 55 + } + }, + { + "items": [ + 558.5, + null + ], + "hints": { + "index": 56 + } + }, + { + "items": [ + 559, + null + ], + "hints": { + "index": 57 + } + }, + { + "items": [ + 559.5, + null + ], + "hints": { + "index": 58 + } + }, + { + "items": [ + 560, + null + ], + "hints": { + "index": 59 + } + }, + { + "items": [ + 560.5, + null + ], + "hints": { + "index": 60 + } + }, + { + "items": [ + 561, + null + ], + "hints": { + "index": 61 + } + }, + { + "items": [ + 561.5, + null + ], + "hints": { + "index": 62 + } + }, + { + "items": [ + 562, + null + ], + "hints": { + "index": 63 + } + }, + { + "items": [ + 562.5, + null + ], + "hints": { + "index": 64 + } + }, + { + "items": [ + 563, + null + ], + "hints": { + "index": 65 + } + }, + { + "items": [ + 563.5, + null + ], + "hints": { + "index": 66 + } + }, + { + "items": [ + 564, + null + ], + "hints": { + "index": 67 + } + }, + { + "items": [ + 564.5, + null + ], + "hints": { + "index": 68 + } + }, + { + "items": [ + 565, + null + ], + "hints": { + "index": 69 + } + }, + { + "items": [ + 565.5, + null + ], + "hints": { + "index": 70 + } + }, + { + "items": [ + 566, + null + ], + "hints": { + "index": 71 + } + }, + { + "items": [ + 566.5, + null + ], + "hints": { + "index": 72 + } + }, + { + "items": [ + 567, + null + ], + "hints": { + "index": 73 + } + }, + { + "items": [ + 567.5, + null + ], + "hints": { + "index": 74 + } + }, + { + "items": [ + 568, + null + ], + "hints": { + "index": 75 + } + }, + { + "items": [ + 568.5, + null + ], + "hints": { + "index": 76 + } + }, + { + "items": [ + 569, + null + ], + "hints": { + "index": 77 + } + }, + { + "items": [ + 569.5, + null + ], + "hints": { + "index": 78 + } + }, + { + "items": [ + 570, + null + ], + "hints": { + "index": 79 + } + }, + { + "items": [ + 570.5, + null + ], + "hints": { + "index": 80 + } + }, + { + "items": [ + 571, + null + ], + "hints": { + "index": 81 + } + }, + { + "items": [ + 571.5, + null + ], + "hints": { + "index": 82 + } + }, + { + "items": [ + 572, + null + ], + "hints": { + "index": 83 + } + }, + { + "items": [ + 572.5, + null + ], + "hints": { + "index": 84 + } + }, + { + "items": [ + 573, + null + ], + "hints": { + "index": 85 + } + }, + { + "items": [ + 573.5, + null + ], + "hints": { + "index": 86 + } + }, + { + "items": [ + 574, + null + ], + "hints": { + "index": 87 + } + }, + { + "items": [ + 574.5, + null + ], + "hints": { + "index": 88 + } + }, + { + "items": [ + 575, + null + ], + "hints": { + "index": 89 + } + }, + { + "items": [ + 575.5, + null + ], + "hints": { + "index": 90 + } + }, + { + "items": [ + 576, + null + ], + "hints": { + "index": 91 + } + }, + { + "items": [ + 576.5, + null + ], + "hints": { + "index": 92 + } + }, + { + "items": [ + 577, + null + ], + "hints": { + "index": 93 + } + }, + { + "items": [ + 577.5, + null + ], + "hints": { + "index": 94 + } + }, + { + "items": [ + 578, + null + ], + "hints": { + "index": 95 + } + }, + { + "items": [ + 578.5, + null + ], + "hints": { + "index": 96 + } + }, + { + "items": [ + 579, + null + ], + "hints": { + "index": 97 + } + }, + { + "items": [ + 579.5, + null + ], + "hints": { + "index": 98 + } + }, + { + "items": [ + 580, + null + ], + "hints": { + "index": 99 + } + }, + { + "items": [ + 580.5, + null + ], + "hints": { + "index": 100 + } + }, + { + "items": [ + 581, + null + ], + "hints": { + "index": 101 + } + }, + { + "items": [ + 581.5, + null + ], + "hints": { + "index": 102 + } + }, + { + "items": [ + 582, + null + ], + "hints": { + "index": 103 + } + }, + { + "items": [ + 582.5, + null + ], + "hints": { + "index": 104 + } + }, + { + "items": [ + 583, + null + ], + "hints": { + "index": 105 + } + }, + { + "items": [ + 583.5, + null + ], + "hints": { + "index": 106 + } + }, + { + "items": [ + 584, + null + ], + "hints": { + "index": 107 + } + }, + { + "items": [ + 584.5, + null + ], + "hints": { + "index": 108 + } + }, + { + "items": [ + 585, + null + ], + "hints": { + "index": 109 + } + }, + { + "items": [ + 585.5, + null + ], + "hints": { + "index": 110 + } + }, + { + "items": [ + 586, + null + ], + "hints": { + "index": 111 + } + }, + { + "items": [ + 586.5, + null + ], + "hints": { + "index": 112 + } + }, + { + "items": [ + 587, + null + ], + "hints": { + "index": 113 + } + }, + { + "items": [ + 587.5, + null + ], + "hints": { + "index": 114 + } + }, + { + "items": [ + 588, + null + ], + "hints": { + "index": 115 + } + }, + { + "items": [ + 588.5, + null + ], + "hints": { + "index": 116 + } + }, + { + "items": [ + 589, + null + ], + "hints": { + "index": 117 + } + }, + { + "items": [ + 589.5, + null + ], + "hints": { + "index": 118 + } + }, + { + "items": [ + 590, + null + ], + "hints": { + "index": 119 + } + }, + { + "items": [ + 590.5, + null + ], + "hints": { + "index": 120 + } + }, + { + "items": [ + 591, + null + ], + "hints": { + "index": 121 + } + }, + { + "items": [ + 591.5, + null + ], + "hints": { + "index": 122 + } + }, + { + "items": [ + 592, + null + ], + "hints": { + "index": 123 + } + }, + { + "items": [ + 592.5, + null + ], + "hints": { + "index": 124 + } + }, + { + "items": [ + 593, + null + ], + "hints": { + "index": 125 + } + }, + { + "items": [ + 593.5, + null + ], + "hints": { + "index": 126 + } + }, + { + "items": [ + 594, + null + ], + "hints": { + "index": 127 + } + }, + { + "items": [ + 594.5, + null + ], + "hints": { + "index": 128 + } + }, + { + "items": [ + 595, + null + ], + "hints": { + "index": 129 + } + }, + { + "items": [ + 595.5, + null + ], + "hints": { + "index": 130 + } + }, + { + "items": [ + 596, + null + ], + "hints": { + "index": 131 + } + }, + { + "items": [ + 596.5, + null + ], + "hints": { + "index": 132 + } + }, + { + "items": [ + 597, + null + ], + "hints": { + "index": 133 + } + }, + { + "items": [ + 597.5, + null + ], + "hints": { + "index": 134 + } + }, + { + "items": [ + 598, + null + ], + "hints": { + "index": 135 + } + }, + { + "items": [ + 598.5, + null + ], + "hints": { + "index": 136 + } + }, + { + "items": [ + 599, + null + ], + "hints": { + "index": 137 + } + }, + { + "items": [ + 599.5, + null + ], + "hints": { + "index": 138 + } + }, + { + "items": [ + 600, + null + ], + "hints": { + "index": 139 + } + }, + { + "items": [ + 600.5, + null + ], + "hints": { + "index": 140 + } + }, + { + "items": [ + 601, + null + ], + "hints": { + "index": 141 + } + }, + { + "items": [ + 601.5, + null + ], + "hints": { + "index": 142 + } + }, + { + "items": [ + 602, + null + ], + "hints": { + "index": 143 + } + }, + { + "items": [ + 602.5, + null + ], + "hints": { + "index": 144 + } + }, + { + "items": [ + 603, + null + ], + "hints": { + "index": 145 + } + }, + { + "items": [ + 603.5, + null + ], + "hints": { + "index": 146 + } + }, + { + "items": [ + 604, + null + ], + "hints": { + "index": 147 + } + }, + { + "items": [ + 604.5, + null + ], + "hints": { + "index": 148 + } + }, + { + "items": [ + 605, + null + ], + "hints": { + "index": 149 + } + }, + { + "items": [ + 605.5, + null + ], + "hints": { + "index": 150 + } + }, + { + "items": [ + 606, + null + ], + "hints": { + "index": 151 + } + }, + { + "items": [ + 606.5, + null + ], + "hints": { + "index": 152 + } + }, + { + "items": [ + 607, + null + ], + "hints": { + "index": 153 + } + }, + { + "items": [ + 607.5, + null + ], + "hints": { + "index": 154 + } + }, + { + "items": [ + 608, + null + ], + "hints": { + "index": 155 + } + }, + { + "items": [ + 608.5, + null + ], + "hints": { + "index": 156 + } + }, + { + "items": [ + 609, + null + ], + "hints": { + "index": 157 + } + }, + { + "items": [ + 609.5, + null + ], + "hints": { + "index": 158 + } + }, + { + "items": [ + 610, + null + ], + "hints": { + "index": 159 + } + }, + { + "items": [ + 610.5, + null + ], + "hints": { + "index": 160 + } + }, + { + "items": [ + 611, + null + ], + "hints": { + "index": 161 + } + }, + { + "items": [ + 611.5, + null + ], + "hints": { + "index": 162 + } + }, + { + "items": [ + 612, + null + ], + "hints": { + "index": 163 + } + }, + { + "items": [ + 612.5, + null + ], + "hints": { + "index": 164 + } + }, + { + "items": [ + 613, + null + ], + "hints": { + "index": 165 + } + }, + { + "items": [ + 613.5, + null + ], + "hints": { + "index": 166 + } + }, + { + "items": [ + 614, + null + ], + "hints": { + "index": 167 + } + }, + { + "items": [ + 614.5, + null + ], + "hints": { + "index": 168 + } + }, + { + "items": [ + 615, + null + ], + "hints": { + "index": 169 + } + }, + { + "items": [ + 615.5, + null + ], + "hints": { + "index": 170 + } + }, + { + "items": [ + 616, + null + ], + "hints": { + "index": 171 + } + }, + { + "items": [ + 616.5, + null + ], + "hints": { + "index": 172 + } + }, + { + "items": [ + 617, + null + ], + "hints": { + "index": 173 + } + }, + { + "items": [ + 617.5, + null + ], + "hints": { + "index": 174 + } + }, + { + "items": [ + 618, + null + ], + "hints": { + "index": 175 + } + }, + { + "items": [ + 618.5, + null + ], + "hints": { + "index": 176 + } + }, + { + "items": [ + 619, + null + ], + "hints": { + "index": 177 + } + }, + { + "items": [ + 619.5, + null + ], + "hints": { + "index": 178 + } + }, + { + "items": [ + 620, + null + ], + "hints": { + "index": 179 + } + }, + { + "items": [ + 620.5, + null + ], + "hints": { + "index": 180 + } + }, + { + "items": [ + 621, + null + ], + "hints": { + "index": 181 + } + }, + { + "items": [ + 621.5, + null + ], + "hints": { + "index": 182 + } + }, + { + "items": [ + 622, + null + ], + "hints": { + "index": 183 + } + }, + { + "items": [ + 622.5, + null + ], + "hints": { + "index": 184 + } + }, + { + "items": [ + 623, + null + ], + "hints": { + "index": 185 + } + }, + { + "items": [ + 623.5, + null + ], + "hints": { + "index": 186 + } + }, + { + "items": [ + 624, + null + ], + "hints": { + "index": 187 + } + }, + { + "items": [ + 624.5, + null + ], + "hints": { + "index": 188 + } + }, + { + "items": [ + 625, + null + ], + "hints": { + "index": 189 + } + }, + { + "items": [ + 625.5, + null + ], + "hints": { + "index": 190 + } + }, + { + "items": [ + 626, + null + ], + "hints": { + "index": 191 + } + }, + { + "items": [ + 626.5, + null + ], + "hints": { + "index": 192 + } + }, + { + "items": [ + 627, + null + ], + "hints": { + "index": 193 + } + }, + { + "items": [ + 627.5, + null + ], + "hints": { + "index": 194 + } + }, + { + "items": [ + 628, + null + ], + "hints": { + "index": 195 + } + }, + { + "items": [ + 628.5, + null + ], + "hints": { + "index": 196 + } + }, + { + "items": [ + 629, + null + ], + "hints": { + "index": 197 + } + }, + { + "items": [ + 629.5, + null + ], + "hints": { + "index": 198 + } + }, + { + "items": [ + 630, + null + ], + "hints": { + "index": 199 + } + }, + { + "items": [ + 630.5, + null + ], + "hints": { + "index": 200 + } + }, + { + "items": [ + 631, + null + ], + "hints": { + "index": 201 + } + }, + { + "items": [ + 631.5, + null + ], + "hints": { + "index": 202 + } + }, + { + "items": [ + 632, + null + ], + "hints": { + "index": 203 + } + }, + { + "items": [ + 632.5, + null + ], + "hints": { + "index": 204 + } + }, + { + "items": [ + 633, + null + ], + "hints": { + "index": 205 + } + }, + { + "items": [ + 633.5, + null + ], + "hints": { + "index": 206 + } + }, + { + "items": [ + 634, + null + ], + "hints": { + "index": 207 + } + }, + { + "items": [ + 634.5, + null + ], + "hints": { + "index": 208 + } + }, + { + "items": [ + 635, + null + ], + "hints": { + "index": 209 + } + }, + { + "items": [ + 635.5, + null + ], + "hints": { + "index": 210 + } + }, + { + "items": [ + 636, + null + ], + "hints": { + "index": 211 + } + }, + { + "items": [ + 636.5, + null + ], + "hints": { + "index": 212 + } + }, + { + "items": [ + 637, + null + ], + "hints": { + "index": 213 + } + }, + { + "items": [ + 637.5, + null + ], + "hints": { + "index": 214 + } + }, + { + "items": [ + 638, + null + ], + "hints": { + "index": 215 + } + }, + { + "items": [ + 638.5, + null + ], + "hints": { + "index": 216 + } + }, + { + "items": [ + 639, + null + ], + "hints": { + "index": 217 + } + }, + { + "items": [ + 639.5, + null + ], + "hints": { + "index": 218 + } + }, + { + "items": [ + 640, + null + ], + "hints": { + "index": 219 + } + }, + { + "items": [ + 640.5, + null + ], + "hints": { + "index": 220 + } + }, + { + "items": [ + 641, + null + ], + "hints": { + "index": 221 + } + }, + { + "items": [ + 641.5, + null + ], + "hints": { + "index": 222 + } + }, + { + "items": [ + 642, + null + ], + "hints": { + "index": 223 + } + }, + { + "items": [ + 642.5, + null + ], + "hints": { + "index": 224 + } + }, + { + "items": [ + 643, + null + ], + "hints": { + "index": 225 + } + }, + { + "items": [ + 643.5, + null + ], + "hints": { + "index": 226 + } + }, + { + "items": [ + 644, + null + ], + "hints": { + "index": 227 + } + }, + { + "items": [ + 644.5, + null + ], + "hints": { + "index": 228 + } + }, + { + "items": [ + 645, + null + ], + "hints": { + "index": 229 + } + }, + { + "items": [ + 645.5, + null + ], + "hints": { + "index": 230 + } + }, + { + "items": [ + 646, + null + ], + "hints": { + "index": 231 + } + }, + { + "items": [ + 646.5, + null + ], + "hints": { + "index": 232 + } + }, + { + "items": [ + 647, + null + ], + "hints": { + "index": 233 + } + }, + { + "items": [ + 647.5, + null + ], + "hints": { + "index": 234 + } + }, + { + "items": [ + 648, + null + ], + "hints": { + "index": 235 + } + }, + { + "items": [ + 648.5, + null + ], + "hints": { + "index": 236 + } + }, + { + "items": [ + 649, + null + ], + "hints": { + "index": 237 + } + }, + { + "items": [ + 649.5, + null + ], + "hints": { + "index": 238 + } + }, + { + "items": [ + 650, + null + ], + "hints": { + "index": 239 + } + }, + { + "items": [ + 650.5, + null + ], + "hints": { + "index": 240 + } + }, + { + "items": [ + 651, + null + ], + "hints": { + "index": 241 + } + }, + { + "items": [ + 651.5, + null + ], + "hints": { + "index": 242 + } + }, + { + "items": [ + 652, + null + ], + "hints": { + "index": 243 + } + }, + { + "items": [ + 652.5, + null + ], + "hints": { + "index": 244 + } + }, + { + "items": [ + 653, + null + ], + "hints": { + "index": 245 + } + }, + { + "items": [ + 653.5, + null + ], + "hints": { + "index": 246 + } + }, + { + "items": [ + 654, + null + ], + "hints": { + "index": 247 + } + }, + { + "items": [ + 654.5, + null + ], + "hints": { + "index": 248 + } + }, + { + "items": [ + 655, + null + ], + "hints": { + "index": 249 + } + }, + { + "items": [ + 655.5, + null + ], + "hints": { + "index": 250 + } + }, + { + "items": [ + 656, + null + ], + "hints": { + "index": 251 + } + }, + { + "items": [ + 656.5, + null + ], + "hints": { + "index": 252 + } + }, + { + "items": [ + 657, + null + ], + "hints": { + "index": 253 + } + }, + { + "items": [ + 657.5, + null + ], + "hints": { + "index": 254 + } + }, + { + "items": [ + 658, + null + ], + "hints": { + "index": 255 + } + }, + { + "items": [ + 658.5, + null + ], + "hints": { + "index": 256 + } + }, + { + "items": [ + 659, + null + ], + "hints": { + "index": 257 + } + }, + { + "items": [ + 659.5, + null + ], + "hints": { + "index": 258 + } + }, + { + "items": [ + 660, + null + ], + "hints": { + "index": 259 + } + }, + { + "items": [ + 660.5, + null + ], + "hints": { + "index": 260 + } + }, + { + "items": [ + 661, + null + ], + "hints": { + "index": 261 + } + }, + { + "items": [ + 661.5, + null + ], + "hints": { + "index": 262 + } + }, + { + "items": [ + 662, + null + ], + "hints": { + "index": 263 + } + }, + { + "items": [ + 662.5, + null + ], + "hints": { + "index": 264 + } + }, + { + "items": [ + 663, + null + ], + "hints": { + "index": 265 + } + }, + { + "items": [ + 663.5, + null + ], + "hints": { + "index": 266 + } + }, + { + "items": [ + 664, + null + ], + "hints": { + "index": 267 + } + }, + { + "items": [ + 664.5, + null + ], + "hints": { + "index": 268 + } + }, + { + "items": [ + 665, + null + ], + "hints": { + "index": 269 + } + }, + { + "items": [ + 665.5, + null + ], + "hints": { + "index": 270 + } + }, + { + "items": [ + 666, + null + ], + "hints": { + "index": 271 + } + }, + { + "items": [ + 666.5, + null + ], + "hints": { + "index": 272 + } + }, + { + "items": [ + 667, + null + ], + "hints": { + "index": 273 + } + }, + { + "items": [ + 667.5, + null + ], + "hints": { + "index": 274 + } + }, + { + "items": [ + 668, + null + ], + "hints": { + "index": 275 + } + }, + { + "items": [ + 668.5, + null + ], + "hints": { + "index": 276 + } + }, + { + "items": [ + 669, + null + ], + "hints": { + "index": 277 + } + }, + { + "items": [ + 669.5, + null + ], + "hints": { + "index": 278 + } + }, + { + "items": [ + 670, + null + ], + "hints": { + "index": 279 + } + }, + { + "items": [ + 670.5, + null + ], + "hints": { + "index": 280 + } + }, + { + "items": [ + 671, + null + ], + "hints": { + "index": 281 + } + }, + { + "items": [ + 671.5, + null + ], + "hints": { + "index": 282 + } + }, + { + "items": [ + 672, + null + ], + "hints": { + "index": 283 + } + }, + { + "items": [ + 672.5, + null + ], + "hints": { + "index": 284 + } + }, + { + "items": [ + 673, + null + ], + "hints": { + "index": 285 + } + }, + { + "items": [ + 673.5, + null + ], + "hints": { + "index": 286 + } + }, + { + "items": [ + 674, + null + ], + "hints": { + "index": 287 + } + }, + { + "items": [ + 674.5, + null + ], + "hints": { + "index": 288 + } + }, + { + "items": [ + 675, + null + ], + "hints": { + "index": 289 + } + }, + { + "items": [ + 675.5, + null + ], + "hints": { + "index": 290 + } + }, + { + "items": [ + 676, + null + ], + "hints": { + "index": 291 + } + }, + { + "items": [ + 676.5, + null + ], + "hints": { + "index": 292 + } + }, + { + "items": [ + 677, + null + ], + "hints": { + "index": 293 + } + }, + { + "items": [ + 677.5, + null + ], + "hints": { + "index": 294 + } + }, + { + "items": [ + 678, + null + ], + "hints": { + "index": 295 + } + }, + { + "items": [ + 678.5, + null + ], + "hints": { + "index": 296 + } + }, + { + "items": [ + 679, + null + ], + "hints": { + "index": 297 + } + }, + { + "items": [ + 679.5, + null + ], + "hints": { + "index": 298 + } + }, + { + "items": [ + 680, + null + ], + "hints": { + "index": 299 + } + }, + { + "items": [ + 680.5, + null + ], + "hints": { + "index": 300 + } + }, + { + "items": [ + 681, + null + ], + "hints": { + "index": 301 + } + }, + { + "items": [ + 681.5, + null + ], + "hints": { + "index": 302 + } + }, + { + "items": [ + 682, + null + ], + "hints": { + "index": 303 + } + }, + { + "items": [ + 682.5, + null + ], + "hints": { + "index": 304 + } + }, + { + "items": [ + 683, + null + ], + "hints": { + "index": 305 + } + }, + { + "items": [ + 683.5, + null + ], + "hints": { + "index": 306 + } + }, + { + "items": [ + 684, + null + ], + "hints": { + "index": 307 + } + }, + { + "items": [ + 684.5, + null + ], + "hints": { + "index": 308 + } + }, + { + "items": [ + 685, + null + ], + "hints": { + "index": 309 + } + }, + { + "items": [ + 685.5, + null + ], + "hints": { + "index": 310 + } + }, + { + "items": [ + 686, + null + ], + "hints": { + "index": 311 + } + }, + { + "items": [ + 686.5, + null + ], + "hints": { + "index": 312 + } + }, + { + "items": [ + 687, + null + ], + "hints": { + "index": 313 + } + }, + { + "items": [ + 687.5, + null + ], + "hints": { + "index": 314 + } + }, + { + "items": [ + 688, + null + ], + "hints": { + "index": 315 + } + }, + { + "items": [ + 688.5, + null + ], + "hints": { + "index": 316 + } + }, + { + "items": [ + 689, + null + ], + "hints": { + "index": 317 + } + }, + { + "items": [ + 689.5, + null + ], + "hints": { + "index": 318 + } + }, + { + "items": [ + 690, + null + ], + "hints": { + "index": 319 + } + }, + { + "items": [ + 690.5, + null + ], + "hints": { + "index": 320 + } + }, + { + "items": [ + 691, + null + ], + "hints": { + "index": 321 + } + }, + { + "items": [ + 691.5, + null + ], + "hints": { + "index": 322 + } + }, + { + "items": [ + 692, + null + ], + "hints": { + "index": 323 + } + }, + { + "items": [ + 692.5, + null + ], + "hints": { + "index": 324 + } + }, + { + "items": [ + 693, + null + ], + "hints": { + "index": 325 + } + }, + { + "items": [ + 693.5, + null + ], + "hints": { + "index": 326 + } + }, + { + "items": [ + 694, + null + ], + "hints": { + "index": 327 + } + }, + { + "items": [ + 694.5, + null + ], + "hints": { + "index": 328 + } + }, + { + "items": [ + 695, + null + ], + "hints": { + "index": 329 + } + }, + { + "items": [ + 695.5, + null + ], + "hints": { + "index": 330 + } + }, + { + "items": [ + 696, + null + ], + "hints": { + "index": 331 + } + }, + { + "items": [ + 696.5, + null + ], + "hints": { + "index": 332 + } + }, + { + "items": [ + 697, + null + ], + "hints": { + "index": 333 + } + }, + { + "items": [ + 697.5, + null + ], + "hints": { + "index": 334 + } + }, + { + "items": [ + 698, + null + ], + "hints": { + "index": 335 + } + }, + { + "items": [ + 698.5, + null + ], + "hints": { + "index": 336 + } + }, + { + "items": [ + 699, + null + ], + "hints": { + "index": 337 + } + }, + { + "items": [ + 699.5, + null + ], + "hints": { + "index": 338 + } + }, + { + "items": [ + 700, + null + ], + "hints": { + "index": 339 + } + }, + { + "items": [ + 700.5, + null + ], + "hints": { + "index": 340 + } + }, + { + "items": [ + 701, + null + ], + "hints": { + "index": 341 + } + }, + { + "items": [ + 701.5, + null + ], + "hints": { + "index": 342 + } + }, + { + "items": [ + 702, + null + ], + "hints": { + "index": 343 + } + }, + { + "items": [ + 702.5, + null + ], + "hints": { + "index": 344 + } + }, + { + "items": [ + 703, + null + ], + "hints": { + "index": 345 + } + }, + { + "items": [ + 703.5, + null + ], + "hints": { + "index": 346 + } + }, + { + "items": [ + 704, + null + ], + "hints": { + "index": 347 + } + }, + { + "items": [ + 704.5, + null + ], + "hints": { + "index": 348 + } + }, + { + "items": [ + 705, + null + ], + "hints": { + "index": 349 + } + }, + { + "items": [ + 705.5, + null + ], + "hints": { + "index": 350 + } + }, + { + "items": [ + 706, + null + ], + "hints": { + "index": 351 + } + }, + { + "items": [ + 706.5, + null + ], + "hints": { + "index": 352 + } + }, + { + "items": [ + 707, + null + ], + "hints": { + "index": 353 + } + }, + { + "items": [ + 707.5, + null + ], + "hints": { + "index": 354 + } + }, + { + "items": [ + 708, + null + ], + "hints": { + "index": 355 + } + }, + { + "items": [ + 708.5, + null + ], + "hints": { + "index": 356 + } + }, + { + "items": [ + 709, + null + ], + "hints": { + "index": 357 + } + }, + { + "items": [ + 709.5, + null + ], + "hints": { + "index": 358 + } + }, + { + "items": [ + 710, + null + ], + "hints": { + "index": 359 + } + }, + { + "items": [ + 710.5, + null + ], + "hints": { + "index": 360 + } + }, + { + "items": [ + 711, + null + ], + "hints": { + "index": 361 + } + }, + { + "items": [ + 711.5, + null + ], + "hints": { + "index": 362 + } + }, + { + "items": [ + 712, + null + ], + "hints": { + "index": 363 + } + }, + { + "items": [ + 712.5, + null + ], + "hints": { + "index": 364 + } + }, + { + "items": [ + 713, + null + ], + "hints": { + "index": 365 + } + }, + { + "items": [ + 713.5, + null + ], + "hints": { + "index": 366 + } + }, + { + "items": [ + 714, + null + ], + "hints": { + "index": 367 + } + }, + { + "items": [ + 714.5, + null + ], + "hints": { + "index": 368 + } + }, + { + "items": [ + 715, + null + ], + "hints": { + "index": 369 + } + }, + { + "items": [ + 715.5, + null + ], + "hints": { + "index": 370 + } + }, + { + "items": [ + 716, + null + ], + "hints": { + "index": 371 + } + }, + { + "items": [ + 716.5, + null + ], + "hints": { + "index": 372 + } + }, + { + "items": [ + 717, + null + ], + "hints": { + "index": 373 + } + }, + { + "items": [ + 717.5, + null + ], + "hints": { + "index": 374 + } + }, + { + "items": [ + 718, + null + ], + "hints": { + "index": 375 + } + }, + { + "items": [ + 718.5, + null + ], + "hints": { + "index": 376 + } + }, + { + "items": [ + 719, + null + ], + "hints": { + "index": 377 + } + }, + { + "items": [ + 719.5, + null + ], + "hints": { + "index": 378 + } + }, + { + "items": [ + 720, + null + ], + "hints": { + "index": 379 + } + }, + { + "items": [ + 720.5, + null + ], + "hints": { + "index": 380 + } + }, + { + "items": [ + 721, + null + ], + "hints": { + "index": 381 + } + }, + { + "items": [ + 721.5, + null + ], + "hints": { + "index": 382 + } + }, + { + "items": [ + 722, + null + ], + "hints": { + "index": 383 + } + }, + { + "items": [ + 722.5, + null + ], + "hints": { + "index": 384 + } + }, + { + "items": [ + 723, + null + ], + "hints": { + "index": 385 + } + }, + { + "items": [ + 723.5, + null + ], + "hints": { + "index": 386 + } + }, + { + "items": [ + 724, + null + ], + "hints": { + "index": 387 + } + }, + { + "items": [ + 724.5, + null + ], + "hints": { + "index": 388 + } + }, + { + "items": [ + 725, + null + ], + "hints": { + "index": 389 + } + }, + { + "items": [ + 725.5, + null + ], + "hints": { + "index": 390 + } + }, + { + "items": [ + 726, + null + ], + "hints": { + "index": 391 + } + }, + { + "items": [ + 726.5, + null + ], + "hints": { + "index": 392 + } + }, + { + "items": [ + 727, + null + ], + "hints": { + "index": 393 + } + }, + { + "items": [ + 727.5, + null + ], + "hints": { + "index": 394 + } + }, + { + "items": [ + 728, + null + ], + "hints": { + "index": 395 + } + }, + { + "items": [ + 728.5, + null + ], + "hints": { + "index": 396 + } + }, + { + "items": [ + 729, + null + ], + "hints": { + "index": 397 + } + }, + { + "items": [ + 729.5, + null + ], + "hints": { + "index": 398 + } + }, + { + "items": [ + 730, + null + ], + "hints": { + "index": 399 + } + }, + { + "items": [ + 730.5, + null + ], + "hints": { + "index": 400 + } + }, + { + "items": [ + 731, + null + ], + "hints": { + "index": 401 + } + }, + { + "items": [ + 731.5, + null + ], + "hints": { + "index": 402 + } + }, + { + "items": [ + 732, + null + ], + "hints": { + "index": 403 + } + }, + { + "items": [ + 732.5, + null + ], + "hints": { + "index": 404 + } + }, + { + "items": [ + 733, + null + ], + "hints": { + "index": 405 + } + }, + { + "items": [ + 733.5, + null + ], + "hints": { + "index": 406 + } + }, + { + "items": [ + 734, + null + ], + "hints": { + "index": 407 + } + }, + { + "items": [ + 734.5, + null + ], + "hints": { + "index": 408 + } + }, + { + "items": [ + 735, + null + ], + "hints": { + "index": 409 + } + }, + { + "items": [ + 735.5, + null + ], + "hints": { + "index": 410 + } + }, + { + "items": [ + 736, + null + ], + "hints": { + "index": 411 + } + }, + { + "items": [ + 736.5, + null + ], + "hints": { + "index": 412 + } + }, + { + "items": [ + 737, + null + ], + "hints": { + "index": 413 + } + }, + { + "items": [ + 737.5, + null + ], + "hints": { + "index": 414 + } + }, + { + "items": [ + 738, + null + ], + "hints": { + "index": 415 + } + }, + { + "items": [ + 738.5, + null + ], + "hints": { + "index": 416 + } + }, + { + "items": [ + 739, + null + ], + "hints": { + "index": 417 + } + }, + { + "items": [ + 739.5, + null + ], + "hints": { + "index": 418 + } + }, + { + "items": [ + 740, + null + ], + "hints": { + "index": 419 + } + }, + { + "items": [ + 740.5, + null + ], + "hints": { + "index": 420 + } + }, + { + "items": [ + 741, + null + ], + "hints": { + "index": 421 + } + }, + { + "items": [ + 741.5, + null + ], + "hints": { + "index": 422 + } + }, + { + "items": [ + 742, + null + ], + "hints": { + "index": 423 + } + }, + { + "items": [ + 742.5, + null + ], + "hints": { + "index": 424 + } + }, + { + "items": [ + 743, + null + ], + "hints": { + "index": 425 + } + }, + { + "items": [ + 743.5, + null + ], + "hints": { + "index": 426 + } + }, + { + "items": [ + 744, + null + ], + "hints": { + "index": 427 + } + }, + { + "items": [ + 744.5, + null + ], + "hints": { + "index": 428 + } + }, + { + "items": [ + 745, + null + ], + "hints": { + "index": 429 + } + }, + { + "items": [ + 745.5, + null + ], + "hints": { + "index": 430 + } + }, + { + "items": [ + 746, + null + ], + "hints": { + "index": 431 + } + }, + { + "items": [ + 746.5, + null + ], + "hints": { + "index": 432 + } + }, + { + "items": [ + 747, + null + ], + "hints": { + "index": 433 + } + }, + { + "items": [ + 747.5, + null + ], + "hints": { + "index": 434 + } + }, + { + "items": [ + 748, + null + ], + "hints": { + "index": 435 + } + }, + { + "items": [ + 748.5, + null + ], + "hints": { + "index": 436 + } + }, + { + "items": [ + 749, + null + ], + "hints": { + "index": 437 + } + }, + { + "items": [ + 749.5, + null + ], + "hints": { + "index": 438 + } + }, + { + "items": [ + 750, + null + ], + "hints": { + "index": 439 + } + }, + { + "items": [ + 750.5, + null + ], + "hints": { + "index": 440 + } + }, + { + "items": [ + 751, + null + ], + "hints": { + "index": 441 + } + }, + { + "items": [ + 751.5, + null + ], + "hints": { + "index": 442 + } + }, + { + "items": [ + 752, + null + ], + "hints": { + "index": 443 + } + }, + { + "items": [ + 752.5, + null + ], + "hints": { + "index": 444 + } + }, + { + "items": [ + 753, + null + ], + "hints": { + "index": 445 + } + }, + { + "items": [ + 753.5, + null + ], + "hints": { + "index": 446 + } + }, + { + "items": [ + 754, + null + ], + "hints": { + "index": 447 + } + }, + { + "items": [ + 754.5, + null + ], + "hints": { + "index": 448 + } + }, + { + "items": [ + 755, + null + ], + "hints": { + "index": 449 + } + }, + { + "items": [ + 755.5, + null + ], + "hints": { + "index": 450 + } + }, + { + "items": [ + 756, + null + ], + "hints": { + "index": 451 + } + }, + { + "items": [ + 756.5, + null + ], + "hints": { + "index": 452 + } + }, + { + "items": [ + 757, + null + ], + "hints": { + "index": 453 + } + }, + { + "items": [ + 757.5, + null + ], + "hints": { + "index": 454 + } + }, + { + "items": [ + 758, + null + ], + "hints": { + "index": 455 + } + }, + { + "items": [ + 758.5, + null + ], + "hints": { + "index": 456 + } + }, + { + "items": [ + 759, + null + ], + "hints": { + "index": 457 + } + }, + { + "items": [ + 759.5, + null + ], + "hints": { + "index": 458 + } + }, + { + "items": [ + 760, + null + ], + "hints": { + "index": 459 + } + }, + { + "items": [ + 760.5, + null + ], + "hints": { + "index": 460 + } + }, + { + "items": [ + 761, + null + ], + "hints": { + "index": 461 + } + }, + { + "items": [ + 761.5, + null + ], + "hints": { + "index": 462 + } + }, + { + "items": [ + 762, + null + ], + "hints": { + "index": 463 + } + }, + { + "items": [ + 762.5, + null + ], + "hints": { + "index": 464 + } + }, + { + "items": [ + 763, + null + ], + "hints": { + "index": 465 + } + }, + { + "items": [ + 763.5, + null + ], + "hints": { + "index": 466 + } + }, + { + "items": [ + 764, + null + ], + "hints": { + "index": 467 + } + }, + { + "items": [ + 764.5, + null + ], + "hints": { + "index": 468 + } + }, + { + "items": [ + 765, + null + ], + "hints": { + "index": 469 + } + }, + { + "items": [ + 765.5, + null + ], + "hints": { + "index": 470 + } + }, + { + "items": [ + 766, + null + ], + "hints": { + "index": 471 + } + }, + { + "items": [ + 766.5, + null + ], + "hints": { + "index": 472 + } + }, + { + "items": [ + 767, + null + ], + "hints": { + "index": 473 + } + }, + { + "items": [ + 767.5, + null + ], + "hints": { + "index": 474 + } + }, + { + "items": [ + 768, + null + ], + "hints": { + "index": 475 + } + }, + { + "items": [ + 768.5, + null + ], + "hints": { + "index": 476 + } + }, + { + "items": [ + 769, + null + ], + "hints": { + "index": 477 + } + }, + { + "items": [ + 769.5, + null + ], + "hints": { + "index": 478 + } + }, + { + "items": [ + 770, + null + ], + "hints": { + "index": 479 + } + }, + { + "items": [ + 770.5, + null + ], + "hints": { + "index": 480 + } + }, + { + "items": [ + 771, + null + ], + "hints": { + "index": 481 + } + }, + { + "items": [ + 771.5, + null + ], + "hints": { + "index": 482 + } + }, + { + "items": [ + 772, + null + ], + "hints": { + "index": 483 + } + }, + { + "items": [ + 772.5, + null + ], + "hints": { + "index": 484 + } + }, + { + "items": [ + 773, + null + ], + "hints": { + "index": 485 + } + }, + { + "items": [ + 773.5, + null + ], + "hints": { + "index": 486 + } + }, + { + "items": [ + 774, + null + ], + "hints": { + "index": 487 + } + }, + { + "items": [ + 774.5, + null + ], + "hints": { + "index": 488 + } + }, + { + "items": [ + 775, + null + ], + "hints": { + "index": 489 + } + }, + { + "items": [ + 775.5, + null + ], + "hints": { + "index": 490 + } + }, + { + "items": [ + 776, + null + ], + "hints": { + "index": 491 + } + }, + { + "items": [ + 776.5, + null + ], + "hints": { + "index": 492 + } + }, + { + "items": [ + 777, + null + ], + "hints": { + "index": 493 + } + }, + { + "items": [ + 777.5, + null + ], + "hints": { + "index": 494 + } + }, + { + "items": [ + 778, + null + ], + "hints": { + "index": 495 + } + }, + { + "items": [ + 778.5, + null + ], + "hints": { + "index": 496 + } + }, + { + "items": [ + 779, + null + ], + "hints": { + "index": 497 + } + }, + { + "items": [ + 779.5, + null + ], + "hints": { + "index": 498 + } + }, + { + "items": [ + 780, + null + ], + "hints": { + "index": 499 + } + }, + { + "items": [ + 780.5, + null + ], + "hints": { + "index": 500 + } + }, + { + "items": [ + 781, + null + ], + "hints": { + "index": 501 + } + }, + { + "items": [ + 781.5, + null + ], + "hints": { + "index": 502 + } + }, + { + "items": [ + 782, + null + ], + "hints": { + "index": 503 + } + }, + { + "items": [ + 782.5, + null + ], + "hints": { + "index": 504 + } + }, + { + "items": [ + 783, + null + ], + "hints": { + "index": 505 + } + }, + { + "items": [ + 783.5, + null + ], + "hints": { + "index": 506 + } + }, + { + "items": [ + 784, + null + ], + "hints": { + "index": 507 + } + }, + { + "items": [ + 784.5, + null + ], + "hints": { + "index": 508 + } + }, + { + "items": [ + 785, + null + ], + "hints": { + "index": 509 + } + }, + { + "items": [ + 785.5, + null + ], + "hints": { + "index": 510 + } + }, + { + "items": [ + 786, + null + ], + "hints": { + "index": 511 + } + }, + { + "items": [ + 786.5, + null + ], + "hints": { + "index": 512 + } + }, + { + "items": [ + 787, + null + ], + "hints": { + "index": 513 + } + }, + { + "items": [ + 787.5, + null + ], + "hints": { + "index": 514 + } + }, + { + "items": [ + 788, + null + ], + "hints": { + "index": 515 + } + }, + { + "items": [ + 788.5, + null + ], + "hints": { + "index": 516 + } + }, + { + "items": [ + 789, + null + ], + "hints": { + "index": 517 + } + }, + { + "items": [ + 789.5, + null + ], + "hints": { + "index": 518 + } + }, + { + "items": [ + 790, + null + ], + "hints": { + "index": 519 + } + }, + { + "items": [ + 790.5, + null + ], + "hints": { + "index": 520 + } + }, + { + "items": [ + 791, + null + ], + "hints": { + "index": 521 + } + }, + { + "items": [ + 791.5, + null + ], + "hints": { + "index": 522 + } + }, + { + "items": [ + 792, + null + ], + "hints": { + "index": 523 + } + }, + { + "items": [ + 792.5, + null + ], + "hints": { + "index": 524 + } + }, + { + "items": [ + 793, + null + ], + "hints": { + "index": 525 + } + }, + { + "items": [ + 793.5, + null + ], + "hints": { + "index": 526 + } + }, + { + "items": [ + 794, + null + ], + "hints": { + "index": 527 + } + }, + { + "items": [ + 794.5, + null + ], + "hints": { + "index": 528 + } + }, + { + "items": [ + 795, + null + ], + "hints": { + "index": 529 + } + }, + { + "items": [ + 795.5, + null + ], + "hints": { + "index": 530 + } + }, + { + "items": [ + 796, + null + ], + "hints": { + "index": 531 + } + }, + { + "items": [ + 796.5, + null + ], + "hints": { + "index": 532 + } + }, + { + "items": [ + 797, + null + ], + "hints": { + "index": 533 + } + }, + { + "items": [ + 797.5, + null + ], + "hints": { + "index": 534 + } + }, + { + "items": [ + 798, + null + ], + "hints": { + "index": 535 + } + }, + { + "items": [ + 798.5, + null + ], + "hints": { + "index": 536 + } + }, + { + "items": [ + 799, + null + ], + "hints": { + "index": 537 + } + }, + { + "items": [ + 799.5, + null + ], + "hints": { + "index": 538 + } + }, + { + "items": [ + 800, + null + ], + "hints": { + "index": 539 + } + }, + { + "items": [ + 800.5, + null + ], + "hints": { + "index": 540 + } + }, + { + "items": [ + 801, + null + ], + "hints": { + "index": 541 + } + }, + { + "items": [ + 801.5, + null + ], + "hints": { + "index": 542 + } + }, + { + "items": [ + 802, + null + ], + "hints": { + "index": 543 + } + }, + { + "items": [ + 802.5, + null + ], + "hints": { + "index": 544 + } + }, + { + "items": [ + 803, + null + ], + "hints": { + "index": 545 + } + }, + { + "items": [ + 803.5, + null + ], + "hints": { + "index": 546 + } + }, + { + "items": [ + 804, + null + ], + "hints": { + "index": 547 + } + }, + { + "items": [ + 804.5, + null + ], + "hints": { + "index": 548 + } + }, + { + "items": [ + 805, + null + ], + "hints": { + "index": 549 + } + }, + { + "items": [ + 805.5, + null + ], + "hints": { + "index": 550 + } + }, + { + "items": [ + 806, + null + ], + "hints": { + "index": 551 + } + }, + { + "items": [ + 806.5, + null + ], + "hints": { + "index": 552 + } + }, + { + "items": [ + 807, + null + ], + "hints": { + "index": 553 + } + }, + { + "items": [ + 807.5, + null + ], + "hints": { + "index": 554 + } + }, + { + "items": [ + 808, + null + ], + "hints": { + "index": 555 + } + }, + { + "items": [ + 808.5, + null + ], + "hints": { + "index": 556 + } + }, + { + "items": [ + 809, + null + ], + "hints": { + "index": 557 + } + }, + { + "items": [ + 809.5, + null + ], + "hints": { + "index": 558 + } + }, + { + "items": [ + 810, + null + ], + "hints": { + "index": 559 + } + }, + { + "items": [ + 810.5, + null + ], + "hints": { + "index": 560 + } + }, + { + "items": [ + 811, + null + ], + "hints": { + "index": 561 + } + }, + { + "items": [ + 811.5, + null + ], + "hints": { + "index": 562 + } + }, + { + "items": [ + 812, + null + ], + "hints": { + "index": 563 + } + }, + { + "items": [ + 812.5, + null + ], + "hints": { + "index": 564 + } + }, + { + "items": [ + 813, + null + ], + "hints": { + "index": 565 + } + }, + { + "items": [ + 813.5, + null + ], + "hints": { + "index": 566 + } + }, + { + "items": [ + 814, + null + ], + "hints": { + "index": 567 + } + }, + { + "items": [ + 814.5, + null + ], + "hints": { + "index": 568 + } + }, + { + "items": [ + 815, + null + ], + "hints": { + "index": 569 + } + }, + { + "items": [ + 815.5, + null + ], + "hints": { + "index": 570 + } + }, + { + "items": [ + 816, + null + ], + "hints": { + "index": 571 + } + }, + { + "items": [ + 816.5, + null + ], + "hints": { + "index": 572 + } + }, + { + "items": [ + 817, + null + ], + "hints": { + "index": 573 + } + }, + { + "items": [ + 817.5, + null + ], + "hints": { + "index": 574 + } + }, + { + "items": [ + 818, + null + ], + "hints": { + "index": 575 + } + }, + { + "items": [ + 818.5, + null + ], + "hints": { + "index": 576 + } + }, + { + "items": [ + 819, + null + ], + "hints": { + "index": 577 + } + }, + { + "items": [ + 819.5, + null + ], + "hints": { + "index": 578 + } + }, + { + "items": [ + 820, + null + ], + "hints": { + "index": 579 + } + }, + { + "items": [ + 820.5, + null + ], + "hints": { + "index": 580 + } + }, + { + "items": [ + 821, + null + ], + "hints": { + "index": 581 + } + }, + { + "items": [ + 821.5, + null + ], + "hints": { + "index": 582 + } + }, + { + "items": [ + 822, + null + ], + "hints": { + "index": 583 + } + }, + { + "items": [ + 822.5, + null + ], + "hints": { + "index": 584 + } + }, + { + "items": [ + 823, + null + ], + "hints": { + "index": 585 + } + }, + { + "items": [ + 823.5, + null + ], + "hints": { + "index": 586 + } + }, + { + "items": [ + 824, + null + ], + "hints": { + "index": 587 + } + }, + { + "items": [ + 824.5, + null + ], + "hints": { + "index": 588 + } + }, + { + "items": [ + 825, + null + ], + "hints": { + "index": 589 + } + }, + { + "items": [ + 825.5, + null + ], + "hints": { + "index": 590 + } + }, + { + "items": [ + 826, + null + ], + "hints": { + "index": 591 + } + }, + { + "items": [ + 826.5, + null + ], + "hints": { + "index": 592 + } + }, + { + "items": [ + 827, + null + ], + "hints": { + "index": 593 + } + }, + { + "items": [ + 827.5, + null + ], + "hints": { + "index": 594 + } + }, + { + "items": [ + 828, + null + ], + "hints": { + "index": 595 + } + }, + { + "items": [ + 828.5, + null + ], + "hints": { + "index": 596 + } + }, + { + "items": [ + 829, + null + ], + "hints": { + "index": 597 + } + }, + { + "items": [ + 829.5, + null + ], + "hints": { + "index": 598 + } + }, + { + "items": [ + 830, + null + ], + "hints": { + "index": 599 + } + }, + { + "items": [ + 830.5, + null + ], + "hints": { + "index": 600 + } + }, + { + "items": [ + 831, + null + ], + "hints": { + "index": 601 + } + }, + { + "items": [ + 831.5, + null + ], + "hints": { + "index": 602 + } + }, + { + "items": [ + 832, + null + ], + "hints": { + "index": 603 + } + }, + { + "items": [ + 832.5, + null + ], + "hints": { + "index": 604 + } + }, + { + "items": [ + 833, + null + ], + "hints": { + "index": 605 + } + }, + { + "items": [ + 833.5, + null + ], + "hints": { + "index": 606 + } + }, + { + "items": [ + 834, + null + ], + "hints": { + "index": 607 + } + }, + { + "items": [ + 834.5, + null + ], + "hints": { + "index": 608 + } + }, + { + "items": [ + 835, + null + ], + "hints": { + "index": 609 + } + }, + { + "items": [ + 835.5, + null + ], + "hints": { + "index": 610 + } + }, + { + "items": [ + 836, + null + ], + "hints": { + "index": 611 + } + }, + { + "items": [ + 836.5, + null + ], + "hints": { + "index": 612 + } + }, + { + "items": [ + 837, + null + ], + "hints": { + "index": 613 + } + }, + { + "items": [ + 837.5, + null + ], + "hints": { + "index": 614 + } + }, + { + "items": [ + 838, + null + ], + "hints": { + "index": 615 + } + }, + { + "items": [ + 838.5, + null + ], + "hints": { + "index": 616 + } + }, + { + "items": [ + 839, + null + ], + "hints": { + "index": 617 + } + }, + { + "items": [ + 839.5, + null + ], + "hints": { + "index": 618 + } + }, + { + "items": [ + 840, + null + ], + "hints": { + "index": 619 + } + }, + { + "items": [ + 840.5, + null + ], + "hints": { + "index": 620 + } + }, + { + "items": [ + 841, + null + ], + "hints": { + "index": 621 + } + }, + { + "items": [ + 841.5, + null + ], + "hints": { + "index": 622 + } + }, + { + "items": [ + 842, + null + ], + "hints": { + "index": 623 + } + }, + { + "items": [ + 842.5, + null + ], + "hints": { + "index": 624 + } + }, + { + "items": [ + 843, + null + ], + "hints": { + "index": 625 + } + }, + { + "items": [ + 843.5, + null + ], + "hints": { + "index": 626 + } + }, + { + "items": [ + 844, + null + ], + "hints": { + "index": 627 + } + }, + { + "items": [ + 844.5, + null + ], + "hints": { + "index": 628 + } + }, + { + "items": [ + 845, + null + ], + "hints": { + "index": 629 + } + }, + { + "items": [ + 845.5, + null + ], + "hints": { + "index": 630 + } + }, + { + "items": [ + 846, + null + ], + "hints": { + "index": 631 + } + }, + { + "items": [ + 846.5, + null + ], + "hints": { + "index": 632 + } + }, + { + "items": [ + 847, + null + ], + "hints": { + "index": 633 + } + }, + { + "items": [ + 847.5, + null + ], + "hints": { + "index": 634 + } + }, + { + "items": [ + 848, + null + ], + "hints": { + "index": 635 + } + }, + { + "items": [ + 848.5, + null + ], + "hints": { + "index": 636 + } + }, + { + "items": [ + 849, + null + ], + "hints": { + "index": 637 + } + }, + { + "items": [ + 849.5, + null + ], + "hints": { + "index": 638 + } + }, + { + "items": [ + 850, + null + ], + "hints": { + "index": 639 + } + }, + { + "items": [ + 850.5, + null + ], + "hints": { + "index": 640 + } + }, + { + "items": [ + 851, + null + ], + "hints": { + "index": 641 + } + }, + { + "items": [ + 851.5, + null + ], + "hints": { + "index": 642 + } + }, + { + "items": [ + 852, + null + ], + "hints": { + "index": 643 + } + }, + { + "items": [ + 852.5, + null + ], + "hints": { + "index": 644 + } + }, + { + "items": [ + 853, + null + ], + "hints": { + "index": 645 + } + }, + { + "items": [ + 853.5, + null + ], + "hints": { + "index": 646 + } + }, + { + "items": [ + 854, + null + ], + "hints": { + "index": 647 + } + }, + { + "items": [ + 854.5, + null + ], + "hints": { + "index": 648 + } + }, + { + "items": [ + 855, + null + ], + "hints": { + "index": 649 + } + }, + { + "items": [ + 855.5, + null + ], + "hints": { + "index": 650 + } + }, + { + "items": [ + 856, + null + ], + "hints": { + "index": 651 + } + }, + { + "items": [ + 856.5, + null + ], + "hints": { + "index": 652 + } + }, + { + "items": [ + 857, + null + ], + "hints": { + "index": 653 + } + }, + { + "items": [ + 857.5, + null + ], + "hints": { + "index": 654 + } + }, + { + "items": [ + 858, + null + ], + "hints": { + "index": 655 + } + }, + { + "items": [ + 858.5, + null + ], + "hints": { + "index": 656 + } + }, + { + "items": [ + 859, + null + ], + "hints": { + "index": 657 + } + }, + { + "items": [ + 859.5, + null + ], + "hints": { + "index": 658 + } + }, + { + "items": [ + 860, + null + ], + "hints": { + "index": 659 + } + }, + { + "items": [ + 860.5, + null + ], + "hints": { + "index": 660 + } + }, + { + "items": [ + 861, + null + ], + "hints": { + "index": 661 + } + }, + { + "items": [ + 861.5, + null + ], + "hints": { + "index": 662 + } + }, + { + "items": [ + 862, + null + ], + "hints": { + "index": 663 + } + }, + { + "items": [ + 862.5, + null + ], + "hints": { + "index": 664 + } + }, + { + "items": [ + 863, + null + ], + "hints": { + "index": 665 + } + }, + { + "items": [ + 863.5, + null + ], + "hints": { + "index": 666 + } + }, + { + "items": [ + 864, + null + ], + "hints": { + "index": 667 + } + }, + { + "items": [ + 864.5, + null + ], + "hints": { + "index": 668 + } + }, + { + "items": [ + 865, + null + ], + "hints": { + "index": 669 + } + }, + { + "items": [ + 865.5, + null + ], + "hints": { + "index": 670 + } + }, + { + "items": [ + 866, + null + ], + "hints": { + "index": 671 + } + }, + { + "items": [ + 866.5, + null + ], + "hints": { + "index": 672 + } + }, + { + "items": [ + 867, + null + ], + "hints": { + "index": 673 + } + }, + { + "items": [ + 867.5, + null + ], + "hints": { + "index": 674 + } + }, + { + "items": [ + 868, + null + ], + "hints": { + "index": 675 + } + }, + { + "items": [ + 868.5, + null + ], + "hints": { + "index": 676 + } + }, + { + "items": [ + 869, + null + ], + "hints": { + "index": 677 + } + }, + { + "items": [ + 869.5, + null + ], + "hints": { + "index": 678 + } + }, + { + "items": [ + 870, + null + ], + "hints": { + "index": 679 + } + }, + { + "items": [ + 870.5, + null + ], + "hints": { + "index": 680 + } + }, + { + "items": [ + 871, + null + ], + "hints": { + "index": 681 + } + }, + { + "items": [ + 871.5, + null + ], + "hints": { + "index": 682 + } + }, + { + "items": [ + 872, + null + ], + "hints": { + "index": 683 + } + }, + { + "items": [ + 872.5, + null + ], + "hints": { + "index": 684 + } + }, + { + "items": [ + 873, + null + ], + "hints": { + "index": 685 + } + }, + { + "items": [ + 873.5, + null + ], + "hints": { + "index": 686 + } + }, + { + "items": [ + 874, + null + ], + "hints": { + "index": 687 + } + }, + { + "items": [ + 874.5, + null + ], + "hints": { + "index": 688 + } + }, + { + "items": [ + 875, + null + ], + "hints": { + "index": 689 + } + }, + { + "items": [ + 875.5, + null + ], + "hints": { + "index": 690 + } + }, + { + "items": [ + 876, + null + ], + "hints": { + "index": 691 + } + }, + { + "items": [ + 876.5, + null + ], + "hints": { + "index": 692 + } + }, + { + "items": [ + 877, + null + ], + "hints": { + "index": 693 + } + }, + { + "items": [ + 877.5, + null + ], + "hints": { + "index": 694 + } + }, + { + "items": [ + 878, + null + ], + "hints": { + "index": 695 + } + }, + { + "items": [ + 878.5, + null + ], + "hints": { + "index": 696 + } + }, + { + "items": [ + 879, + null + ], + "hints": { + "index": 697 + } + }, + { + "items": [ + 879.5, + null + ], + "hints": { + "index": 698 + } + }, + { + "items": [ + 880, + null + ], + "hints": { + "index": 699 + } + }, + { + "items": [ + 880.5, + null + ], + "hints": { + "index": 700 + } + }, + { + "items": [ + 881, + null + ], + "hints": { + "index": 701 + } + }, + { + "items": [ + 881.5, + null + ], + "hints": { + "index": 702 + } + }, + { + "items": [ + 882, + null + ], + "hints": { + "index": 703 + } + }, + { + "items": [ + 882.5, + null + ], + "hints": { + "index": 704 + } + }, + { + "items": [ + 883, + null + ], + "hints": { + "index": 705 + } + }, + { + "items": [ + 883.5, + null + ], + "hints": { + "index": 706 + } + }, + { + "items": [ + 884, + null + ], + "hints": { + "index": 707 + } + }, + { + "items": [ + 884.5, + null + ], + "hints": { + "index": 708 + } + }, + { + "items": [ + 885, + null + ], + "hints": { + "index": 709 + } + }, + { + "items": [ + 885.5, + null + ], + "hints": { + "index": 710 + } + }, + { + "items": [ + 886, + null + ], + "hints": { + "index": 711 + } + }, + { + "items": [ + 886.5, + null + ], + "hints": { + "index": 712 + } + }, + { + "items": [ + 887, + null + ], + "hints": { + "index": 713 + } + }, + { + "items": [ + 887.5, + null + ], + "hints": { + "index": 714 + } + }, + { + "items": [ + 888, + null + ], + "hints": { + "index": 715 + } + }, + { + "items": [ + 888.5, + null + ], + "hints": { + "index": 716 + } + }, + { + "items": [ + 889, + null + ], + "hints": { + "index": 717 + } + }, + { + "items": [ + 889.5, + null + ], + "hints": { + "index": 718 + } + }, + { + "items": [ + 890, + null + ], + "hints": { + "index": 719 + } + }, + { + "items": [ + 890.5, + null + ], + "hints": { + "index": 720 + } + }, + { + "items": [ + 891, + null + ], + "hints": { + "index": 721 + } + }, + { + "items": [ + 891.5, + null + ], + "hints": { + "index": 722 + } + }, + { + "items": [ + 892, + null + ], + "hints": { + "index": 723 + } + }, + { + "items": [ + 892.5, + null + ], + "hints": { + "index": 724 + } + }, + { + "items": [ + 893, + null + ], + "hints": { + "index": 725 + } + }, + { + "items": [ + 893.5, + null + ], + "hints": { + "index": 726 + } + }, + { + "items": [ + 894, + null + ], + "hints": { + "index": 727 + } + }, + { + "items": [ + 894.5, + null + ], + "hints": { + "index": 728 + } + }, + { + "items": [ + 895, + null + ], + "hints": { + "index": 729 + } + }, + { + "items": [ + 895.5, + null + ], + "hints": { + "index": 730 + } + }, + { + "items": [ + 896, + null + ], + "hints": { + "index": 731 + } + }, + { + "items": [ + 896.5, + null + ], + "hints": { + "index": 732 + } + }, + { + "items": [ + 897, + null + ], + "hints": { + "index": 733 + } + }, + { + "items": [ + 897.5, + null + ], + "hints": { + "index": 734 + } + }, + { + "items": [ + 898, + null + ], + "hints": { + "index": 735 + } + }, + { + "items": [ + 898.5, + null + ], + "hints": { + "index": 736 + } + }, + { + "items": [ + 899, + null + ], + "hints": { + "index": 737 + } + }, + { + "items": [ + 899.5, + null + ], + "hints": { + "index": 738 + } + }, + { + "items": [ + 900, + null + ], + "hints": { + "index": 739 + } + }, + { + "items": [ + 900.5, + null + ], + "hints": { + "index": 740 + } + }, + { + "items": [ + 901, + null + ], + "hints": { + "index": 741 + } + }, + { + "items": [ + 901.5, + null + ], + "hints": { + "index": 742 + } + }, + { + "items": [ + 902, + null + ], + "hints": { + "index": 743 + } + }, + { + "items": [ + 902.5, + null + ], + "hints": { + "index": 744 + } + }, + { + "items": [ + 903, + null + ], + "hints": { + "index": 745 + } + }, + { + "items": [ + 903.5, + null + ], + "hints": { + "index": 746 + } + }, + { + "items": [ + 904, + null + ], + "hints": { + "index": 747 + } + }, + { + "items": [ + 904.5, + null + ], + "hints": { + "index": 748 + } + }, + { + "items": [ + 905, + null + ], + "hints": { + "index": 749 + } + }, + { + "items": [ + 905.5, + null + ], + "hints": { + "index": 750 + } + }, + { + "items": [ + 906, + null + ], + "hints": { + "index": 751 + } + }, + { + "items": [ + 906.5, + null + ], + "hints": { + "index": 752 + } + }, + { + "items": [ + 907, + null + ], + "hints": { + "index": 753 + } + }, + { + "items": [ + 907.5, + null + ], + "hints": { + "index": 754 + } + }, + { + "items": [ + 908, + null + ], + "hints": { + "index": 755 + } + }, + { + "items": [ + 908.5, + null + ], + "hints": { + "index": 756 + } + }, + { + "items": [ + 909, + null + ], + "hints": { + "index": 757 + } + }, + { + "items": [ + 909.5, + null + ], + "hints": { + "index": 758 + } + }, + { + "items": [ + 910, + null + ], + "hints": { + "index": 759 + } + }, + { + "items": [ + 910.5, + null + ], + "hints": { + "index": 760 + } + }, + { + "items": [ + 911, + null + ], + "hints": { + "index": 761 + } + }, + { + "items": [ + 911.5, + null + ], + "hints": { + "index": 762 + } + }, + { + "items": [ + 912, + null + ], + "hints": { + "index": 763 + } + }, + { + "items": [ + 912.5, + null + ], + "hints": { + "index": 764 + } + }, + { + "items": [ + 913, + null + ], + "hints": { + "index": 765 + } + }, + { + "items": [ + 913.5, + null + ], + "hints": { + "index": 766 + } + }, + { + "items": [ + 914, + null + ], + "hints": { + "index": 767 + } + }, + { + "items": [ + 914.5, + null + ], + "hints": { + "index": 768 + } + }, + { + "items": [ + 915, + null + ], + "hints": { + "index": 769 + } + }, + { + "items": [ + 915.5, + null + ], + "hints": { + "index": 770 + } + }, + { + "items": [ + 916, + null + ], + "hints": { + "index": 771 + } + }, + { + "items": [ + 916.5, + null + ], + "hints": { + "index": 772 + } + }, + { + "items": [ + 917, + null + ], + "hints": { + "index": 773 + } + }, + { + "items": [ + 917.5, + null + ], + "hints": { + "index": 774 + } + }, + { + "items": [ + 918, + null + ], + "hints": { + "index": 775 + } + }, + { + "items": [ + 918.5, + null + ], + "hints": { + "index": 776 + } + }, + { + "items": [ + 919, + null + ], + "hints": { + "index": 777 + } + }, + { + "items": [ + 919.5, + null + ], + "hints": { + "index": 778 + } + }, + { + "items": [ + 920, + null + ], + "hints": { + "index": 779 + } + }, + { + "items": [ + 920.5, + null + ], + "hints": { + "index": 780 + } + }, + { + "items": [ + 921, + null + ], + "hints": { + "index": 781 + } + }, + { + "items": [ + 921.5, + null + ], + "hints": { + "index": 782 + } + }, + { + "items": [ + 922, + null + ], + "hints": { + "index": 783 + } + }, + { + "items": [ + 922.5, + null + ], + "hints": { + "index": 784 + } + }, + { + "items": [ + 923, + null + ], + "hints": { + "index": 785 + } + }, + { + "items": [ + 923.5, + null + ], + "hints": { + "index": 786 + } + }, + { + "items": [ + 924, + null + ], + "hints": { + "index": 787 + } + }, + { + "items": [ + 924.5, + null + ], + "hints": { + "index": 788 + } + }, + { + "items": [ + 925, + null + ], + "hints": { + "index": 789 + } + }, + { + "items": [ + 925.5, + null + ], + "hints": { + "index": 790 + } + }, + { + "items": [ + 926, + null + ], + "hints": { + "index": 791 + } + }, + { + "items": [ + 926.5, + null + ], + "hints": { + "index": 792 + } + }, + { + "items": [ + 927, + null + ], + "hints": { + "index": 793 + } + }, + { + "items": [ + 927.5, + null + ], + "hints": { + "index": 794 + } + }, + { + "items": [ + 928, + null + ], + "hints": { + "index": 795 + } + }, + { + "items": [ + 928.5, + null + ], + "hints": { + "index": 796 + } + }, + { + "items": [ + 929, + null + ], + "hints": { + "index": 797 + } + }, + { + "items": [ + 929.5, + null + ], + "hints": { + "index": 798 + } + }, + { + "items": [ + 930, + null + ], + "hints": { + "index": 799 + } + }, + { + "items": [ + 930.5, + null + ], + "hints": { + "index": 800 + } + }, + { + "items": [ + 931, + null + ], + "hints": { + "index": 801 + } + }, + { + "items": [ + 931.5, + null + ], + "hints": { + "index": 802 + } + }, + { + "items": [ + 932, + null + ], + "hints": { + "index": 803 + } + }, + { + "items": [ + 932.5, + null + ], + "hints": { + "index": 804 + } + }, + { + "items": [ + 933, + null + ], + "hints": { + "index": 805 + } + }, + { + "items": [ + 933.5, + null + ], + "hints": { + "index": 806 + } + }, + { + "items": [ + 934, + null + ], + "hints": { + "index": 807 + } + }, + { + "items": [ + 934.5, + null + ], + "hints": { + "index": 808 + } + }, + { + "items": [ + 935, + null + ], + "hints": { + "index": 809 + } + }, + { + "items": [ + 935.5, + null + ], + "hints": { + "index": 810 + } + }, + { + "items": [ + 936, + null + ], + "hints": { + "index": 811 + } + }, + { + "items": [ + 936.5, + null + ], + "hints": { + "index": 812 + } + }, + { + "items": [ + 937, + null + ], + "hints": { + "index": 813 + } + }, + { + "items": [ + 937.5, + null + ], + "hints": { + "index": 814 + } + }, + { + "items": [ + 938, + null + ], + "hints": { + "index": 815 + } + }, + { + "items": [ + 938.5, + null + ], + "hints": { + "index": 816 + } + }, + { + "items": [ + 939, + null + ], + "hints": { + "index": 817 + } + }, + { + "items": [ + 939.5, + null + ], + "hints": { + "index": 818 + } + }, + { + "items": [ + 940, + null + ], + "hints": { + "index": 819 + } + }, + { + "items": [ + 940.5, + null + ], + "hints": { + "index": 820 + } + }, + { + "items": [ + 941, + null + ], + "hints": { + "index": 821 + } + }, + { + "items": [ + 941.5, + null + ], + "hints": { + "index": 822 + } + }, + { + "items": [ + 942, + null + ], + "hints": { + "index": 823 + } + }, + { + "items": [ + 942.5, + null + ], + "hints": { + "index": 824 + } + }, + { + "items": [ + 943, + null + ], + "hints": { + "index": 825 + } + }, + { + "items": [ + 943.5, + null + ], + "hints": { + "index": 826 + } + }, + { + "items": [ + 944, + null + ], + "hints": { + "index": 827 + } + }, + { + "items": [ + 944.5, + null + ], + "hints": { + "index": 828 + } + }, + { + "items": [ + 945, + null + ], + "hints": { + "index": 829 + } + }, + { + "items": [ + 945.5, + null + ], + "hints": { + "index": 830 + } + }, + { + "items": [ + 946, + null + ], + "hints": { + "index": 831 + } + }, + { + "items": [ + 946.5, + null + ], + "hints": { + "index": 832 + } + }, + { + "items": [ + 947, + null + ], + "hints": { + "index": 833 + } + }, + { + "items": [ + 947.5, + null + ], + "hints": { + "index": 834 + } + }, + { + "items": [ + 948, + null + ], + "hints": { + "index": 835 + } + }, + { + "items": [ + 948.5, + null + ], + "hints": { + "index": 836 + } + }, + { + "items": [ + 949, + null + ], + "hints": { + "index": 837 + } + }, + { + "items": [ + 949.5, + null + ], + "hints": { + "index": 838 + } + }, + { + "items": [ + 950, + null + ], + "hints": { + "index": 839 + } + }, + { + "items": [ + 950.5, + null + ], + "hints": { + "index": 840 + } + }, + { + "items": [ + 951, + null + ], + "hints": { + "index": 841 + } + }, + { + "items": [ + 951.5, + null + ], + "hints": { + "index": 842 + } + }, + { + "items": [ + 952, + null + ], + "hints": { + "index": 843 + } + }, + { + "items": [ + 952.5, + null + ], + "hints": { + "index": 844 + } + }, + { + "items": [ + 953, + null + ], + "hints": { + "index": 845 + } + }, + { + "items": [ + 953.5, + null + ], + "hints": { + "index": 846 + } + }, + { + "items": [ + 954, + null + ], + "hints": { + "index": 847 + } + }, + { + "items": [ + 954.5, + null + ], + "hints": { + "index": 848 + } + }, + { + "items": [ + 955, + null + ], + "hints": { + "index": 849 + } + }, + { + "items": [ + 955.5, + null + ], + "hints": { + "index": 850 + } + }, + { + "items": [ + 956, + null + ], + "hints": { + "index": 851 + } + }, + { + "items": [ + 956.5, + null + ], + "hints": { + "index": 852 + } + }, + { + "items": [ + 957, + null + ], + "hints": { + "index": 853 + } + }, + { + "items": [ + 957.5, + null + ], + "hints": { + "index": 854 + } + }, + { + "items": [ + 958, + null + ], + "hints": { + "index": 855 + } + }, + { + "items": [ + 958.5, + null + ], + "hints": { + "index": 856 + } + }, + { + "items": [ + 959, + null + ], + "hints": { + "index": 857 + } + }, + { + "items": [ + 959.5, + null + ], + "hints": { + "index": 858 + } + }, + { + "items": [ + 960, + null + ], + "hints": { + "index": 859 + } + }, + { + "items": [ + 960.5, + null + ], + "hints": { + "index": 860 + } + }, + { + "items": [ + 961, + null + ], + "hints": { + "index": 861 + } + }, + { + "items": [ + 961.5, + null + ], + "hints": { + "index": 862 + } + }, + { + "items": [ + 962, + null + ], + "hints": { + "index": 863 + } + }, + { + "items": [ + 962.5, + null + ], + "hints": { + "index": 864 + } + }, + { + "items": [ + 963, + null + ], + "hints": { + "index": 865 + } + }, + { + "items": [ + 963.5, + null + ], + "hints": { + "index": 866 + } + }, + { + "items": [ + 964, + null + ], + "hints": { + "index": 867 + } + }, + { + "items": [ + 964.5, + null + ], + "hints": { + "index": 868 + } + }, + { + "items": [ + 965, + null + ], + "hints": { + "index": 869 + } + }, + { + "items": [ + 965.5, + null + ], + "hints": { + "index": 870 + } + }, + { + "items": [ + 966, + null + ], + "hints": { + "index": 871 + } + }, + { + "items": [ + 966.5, + null + ], + "hints": { + "index": 872 + } + }, + { + "items": [ + 967, + null + ], + "hints": { + "index": 873 + } + }, + { + "items": [ + 967.5, + null + ], + "hints": { + "index": 874 + } + }, + { + "items": [ + 968, + null + ], + "hints": { + "index": 875 + } + }, + { + "items": [ + 968.5, + null + ], + "hints": { + "index": 876 + } + }, + { + "items": [ + 969, + null + ], + "hints": { + "index": 877 + } + }, + { + "items": [ + 969.5, + null + ], + "hints": { + "index": 878 + } + }, + { + "items": [ + 970, + null + ], + "hints": { + "index": 879 + } + }, + { + "items": [ + 970.5, + null + ], + "hints": { + "index": 880 + } + }, + { + "items": [ + 971, + null + ], + "hints": { + "index": 881 + } + }, + { + "items": [ + 971.5, + null + ], + "hints": { + "index": 882 + } + }, + { + "items": [ + 972, + null + ], + "hints": { + "index": 883 + } + }, + { + "items": [ + 972.5, + null + ], + "hints": { + "index": 884 + } + }, + { + "items": [ + 973, + null + ], + "hints": { + "index": 885 + } + }, + { + "items": [ + 973.5, + null + ], + "hints": { + "index": 886 + } + }, + { + "items": [ + 974, + null + ], + "hints": { + "index": 887 + } + }, + { + "items": [ + 974.5, + null + ], + "hints": { + "index": 888 + } + }, + { + "items": [ + 975, + null + ], + "hints": { + "index": 889 + } + }, + { + "items": [ + 975.5, + null + ], + "hints": { + "index": 890 + } + }, + { + "items": [ + 976, + null + ], + "hints": { + "index": 891 + } + }, + { + "items": [ + 976.5, + null + ], + "hints": { + "index": 892 + } + }, + { + "items": [ + 977, + null + ], + "hints": { + "index": 893 + } + }, + { + "items": [ + 977.5, + null + ], + "hints": { + "index": 894 + } + }, + { + "items": [ + 978, + null + ], + "hints": { + "index": 895 + } + }, + { + "items": [ + 978.5, + null + ], + "hints": { + "index": 896 + } + }, + { + "items": [ + 979, + null + ], + "hints": { + "index": 897 + } + }, + { + "items": [ + 979.5, + null + ], + "hints": { + "index": 898 + } + }, + { + "items": [ + 980, + null + ], + "hints": { + "index": 899 + } + }, + { + "items": [ + 980.5, + null + ], + "hints": { + "index": 900 + } + }, + { + "items": [ + 981, + null + ], + "hints": { + "index": 901 + } + }, + { + "items": [ + 981.5, + null + ], + "hints": { + "index": 902 + } + }, + { + "items": [ + 982, + null + ], + "hints": { + "index": 903 + } + }, + { + "items": [ + 982.5, + null + ], + "hints": { + "index": 904 + } + }, + { + "items": [ + 983, + null + ], + "hints": { + "index": 905 + } + }, + { + "items": [ + 983.5, + null + ], + "hints": { + "index": 906 + } + }, + { + "items": [ + 984, + null + ], + "hints": { + "index": 907 + } + }, + { + "items": [ + 984.5, + null + ], + "hints": { + "index": 908 + } + }, + { + "items": [ + 985, + null + ], + "hints": { + "index": 909 + } + }, + { + "items": [ + 985.5, + null + ], + "hints": { + "index": 910 + } + }, + { + "items": [ + 986, + null + ], + "hints": { + "index": 911 + } + }, + { + "items": [ + 986.5, + null + ], + "hints": { + "index": 912 + } + }, + { + "items": [ + 987, + null + ], + "hints": { + "index": 913 + } + }, + { + "items": [ + 987.5, + null + ], + "hints": { + "index": 914 + } + }, + { + "items": [ + 988, + null + ], + "hints": { + "index": 915 + } + }, + { + "items": [ + 988.5, + null + ], + "hints": { + "index": 916 + } + }, + { + "items": [ + 989, + null + ], + "hints": { + "index": 917 + } + }, + { + "items": [ + 989.5, + null + ], + "hints": { + "index": 918 + } + }, + { + "items": [ + 990, + null + ], + "hints": { + "index": 919 + } + }, + { + "items": [ + 990.5, + null + ], + "hints": { + "index": 920 + } + }, + { + "items": [ + 991, + null + ], + "hints": { + "index": 921 + } + }, + { + "items": [ + 991.5, + null + ], + "hints": { + "index": 922 + } + }, + { + "items": [ + 992, + null + ], + "hints": { + "index": 923 + } + }, + { + "items": [ + 992.5, + null + ], + "hints": { + "index": 924 + } + }, + { + "items": [ + 993, + null + ], + "hints": { + "index": 925 + } + }, + { + "items": [ + 993.5, + null + ], + "hints": { + "index": 926 + } + }, + { + "items": [ + 994, + null + ], + "hints": { + "index": 927 + } + }, + { + "items": [ + 994.5, + null + ], + "hints": { + "index": 928 + } + }, + { + "items": [ + 995, + null + ], + "hints": { + "index": 929 + } + }, + { + "items": [ + 995.5, + null + ], + "hints": { + "index": 930 + } + }, + { + "items": [ + 996, + null + ], + "hints": { + "index": 931 + } + }, + { + "items": [ + 996.5, + null + ], + "hints": { + "index": 932 + } + }, + { + "items": [ + 997, + null + ], + "hints": { + "index": 933 + } + }, + { + "items": [ + 997.5, + null + ], + "hints": { + "index": 934 + } + }, + { + "items": [ + 998, + null + ], + "hints": { + "index": 935 + } + }, + { + "items": [ + 998.5, + null + ], + "hints": { + "index": 936 + } + }, + { + "items": [ + 999, + null + ], + "hints": { + "index": 937 + } + }, + { + "items": [ + 999.5, + null + ], + "hints": { + "index": 938 + } + }, + { + "items": [ + 1000, + null + ], + "hints": { + "index": 939 + } + }, + { + "items": [ + 1000.5, + null + ], + "hints": { + "index": 940 + } + }, + { + "items": [ + 1001, + null + ], + "hints": { + "index": 941 + } + }, + { + "items": [ + 1001.5, + null + ], + "hints": { + "index": 942 + } + }, + { + "items": [ + 1002, + null + ], + "hints": { + "index": 943 + } + }, + { + "items": [ + 1002.5, + null + ], + "hints": { + "index": 944 + } + }, + { + "items": [ + 1003, + null + ], + "hints": { + "index": 945 + } + }, + { + "items": [ + 1003.5, + null + ], + "hints": { + "index": 946 + } + }, + { + "items": [ + 1004, + null + ], + "hints": { + "index": 947 + } + }, + { + "items": [ + 1004.5, + null + ], + "hints": { + "index": 948 + } + }, + { + "items": [ + 1005, + null + ], + "hints": { + "index": 949 + } + }, + { + "items": [ + 1005.5, + null + ], + "hints": { + "index": 950 + } + }, + { + "items": [ + 1006, + null + ], + "hints": { + "index": 951 + } + }, + { + "items": [ + 1006.5, + null + ], + "hints": { + "index": 952 + } + }, + { + "items": [ + 1007, + null + ], + "hints": { + "index": 953 + } + }, + { + "items": [ + 1007.5, + null + ], + "hints": { + "index": 954 + } + }, + { + "items": [ + 1008, + null + ], + "hints": { + "index": 955 + } + }, + { + "items": [ + 1008.5, + null + ], + "hints": { + "index": 956 + } + }, + { + "items": [ + 1009, + null + ], + "hints": { + "index": 957 + } + }, + { + "items": [ + 1009.5, + null + ], + "hints": { + "index": 958 + } + }, + { + "items": [ + 1010, + null + ], + "hints": { + "index": 959 + } + }, + { + "items": [ + 1010.5, + null + ], + "hints": { + "index": 960 + } + }, + { + "items": [ + 1011, + null + ], + "hints": { + "index": 961 + } + }, + { + "items": [ + 1011.5, + null + ], + "hints": { + "index": 962 + } + }, + { + "items": [ + 1012, + null + ], + "hints": { + "index": 963 + } + }, + { + "items": [ + 1012.5, + null + ], + "hints": { + "index": 964 + } + }, + { + "items": [ + 1013, + null + ], + "hints": { + "index": 965 + } + }, + { + "items": [ + 1013.5, + null + ], + "hints": { + "index": 966 + } + }, + { + "items": [ + 1014, + null + ], + "hints": { + "index": 967 + } + }, + { + "items": [ + 1014.5, + null + ], + "hints": { + "index": 968 + } + }, + { + "items": [ + 1015, + null + ], + "hints": { + "index": 969 + } + }, + { + "items": [ + 1015.5, + null + ], + "hints": { + "index": 970 + } + }, + { + "items": [ + 1016, + null + ], + "hints": { + "index": 971 + } + }, + { + "items": [ + 1016.5, + null + ], + "hints": { + "index": 972 + } + }, + { + "items": [ + 1017, + null + ], + "hints": { + "index": 973 + } + }, + { + "items": [ + 1017.5, + null + ], + "hints": { + "index": 974 + } + }, + { + "items": [ + 1018, + null + ], + "hints": { + "index": 975 + } + }, + { + "items": [ + 1018.5, + null + ], + "hints": { + "index": 976 + } + }, + { + "items": [ + 1019, + null + ], + "hints": { + "index": 977 + } + }, + { + "items": [ + 1019.5, + null + ], + "hints": { + "index": 978 + } + }, + { + "items": [ + 1020, + null + ], + "hints": { + "index": 979 + } + }, + { + "items": [ + 1020.5, + null + ], + "hints": { + "index": 980 + } + }, + { + "items": [ + 1021, + null + ], + "hints": { + "index": 981 + } + }, + { + "items": [ + 1021.5, + null + ], + "hints": { + "index": 982 + } + }, + { + "items": [ + 1022, + null + ], + "hints": { + "index": 983 + } + }, + { + "items": [ + 1022.5, + null + ], + "hints": { + "index": 984 + } + }, + { + "items": [ + 1023, + null + ], + "hints": { + "index": 985 + } + }, + { + "items": [ + 1023.5, + null + ], + "hints": { + "index": 986 + } + }, + { + "items": [ + 1024, + null + ], + "hints": { + "index": 987 + } + }, + { + "items": [ + 1024.5, + null + ], + "hints": { + "index": 988 + } + }, + { + "items": [ + 1025, + null + ], + "hints": { + "index": 989 + } + }, + { + "items": [ + 1025.5, + null + ], + "hints": { + "index": 990 + } + }, + { + "items": [ + 1026, + null + ], + "hints": { + "index": 991 + } + }, + { + "items": [ + 1026.5, + null + ], + "hints": { + "index": 992 + } + }, + { + "items": [ + 1027, + null + ], + "hints": { + "index": 993 + } + }, + { + "items": [ + 1027.5, + null + ], + "hints": { + "index": 994 + } + }, + { + "items": [ + 1028, + null + ], + "hints": { + "index": 995 + } + }, + { + "items": [ + 1028.5, + null + ], + "hints": { + "index": 996 + } + }, + { + "items": [ + 1029, + null + ], + "hints": { + "index": 997 + } + }, + { + "items": [ + 1029.5, + null + ], + "hints": { + "index": 998 + } + }, + { + "items": [ + 1030, + null + ], + "hints": { + "index": 999 + } + }, + { + "items": [ + 1030.5, + null + ], + "hints": { + "index": 1000 + } + }, + { + "items": [ + 1031, + null + ], + "hints": { + "index": 1001 + } + }, + { + "items": [ + 1031.5, + null + ], + "hints": { + "index": 1002 + } + }, + { + "items": [ + 1032, + null + ], + "hints": { + "index": 1003 + } + }, + { + "items": [ + 1032.5, + null + ], + "hints": { + "index": 1004 + } + }, + { + "items": [ + 1033, + null + ], + "hints": { + "index": 1005 + } + }, + { + "items": [ + 1033.5, + null + ], + "hints": { + "index": 1006 + } + }, + { + "items": [ + 1034, + null + ], + "hints": { + "index": 1007 + } + }, + { + "items": [ + 1034.5, + null + ], + "hints": { + "index": 1008 + } + }, + { + "items": [ + 1035, + null + ], + "hints": { + "index": 1009 + } + }, + { + "items": [ + 1035.5, + null + ], + "hints": { + "index": 1010 + } + }, + { + "items": [ + 1036, + null + ], + "hints": { + "index": 1011 + } + }, + { + "items": [ + 1036.5, + null + ], + "hints": { + "index": 1012 + } + }, + { + "items": [ + 1037, + null + ], + "hints": { + "index": 1013 + } + }, + { + "items": [ + 1037.5, + null + ], + "hints": { + "index": 1014 + } + }, + { + "items": [ + 1038, + null + ], + "hints": { + "index": 1015 + } + }, + { + "items": [ + 1038.5, + null + ], + "hints": { + "index": 1016 + } + }, + { + "items": [ + 1039, + null + ], + "hints": { + "index": 1017 + } + }, + { + "items": [ + 1039.5, + null + ], + "hints": { + "index": 1018 + } + }, + { + "items": [ + 1040, + null + ], + "hints": { + "index": 1019 + } + }, + { + "items": [ + 1040.5, + null + ], + "hints": { + "index": 1020 + } + }, + { + "items": [ + 1041, + null + ], + "hints": { + "index": 1021 + } + }, + { + "items": [ + 1041.5, + null + ], + "hints": { + "index": 1022 + } + }, + { + "items": [ + 1042, + null + ], + "hints": { + "index": 1023 + } + }, + { + "items": [ + 1042.5, + null + ], + "hints": { + "index": 1024 + } + }, + { + "items": [ + 1043, + null + ], + "hints": { + "index": 1025 + } + }, + { + "items": [ + 1043.5, + null + ], + "hints": { + "index": 1026 + } + }, + { + "items": [ + 1044, + null + ], + "hints": { + "index": 1027 + } + }, + { + "items": [ + 1044.5, + null + ], + "hints": { + "index": 1028 + } + }, + { + "items": [ + 1045, + null + ], + "hints": { + "index": 1029 + } + }, + { + "items": [ + 1045.5, + null + ], + "hints": { + "index": 1030 + } + }, + { + "items": [ + 1046, + null + ], + "hints": { + "index": 1031 + } + }, + { + "items": [ + 1046.5, + null + ], + "hints": { + "index": 1032 + } + }, + { + "items": [ + 1047, + null + ], + "hints": { + "index": 1033 + } + }, + { + "items": [ + 1047.5, + null + ], + "hints": { + "index": 1034 + } + }, + { + "items": [ + 1048, + null + ], + "hints": { + "index": 1035 + } + }, + { + "items": [ + 1048.5, + null + ], + "hints": { + "index": 1036 + } + }, + { + "items": [ + 1049, + null + ], + "hints": { + "index": 1037 + } + }, + { + "items": [ + 1049.5, + null + ], + "hints": { + "index": 1038 + } + }, + { + "items": [ + 1050, + null + ], + "hints": { + "index": 1039 + } + }, + { + "items": [ + 1050.5, + null + ], + "hints": { + "index": 1040 + } + }, + { + "items": [ + 1051, + null + ], + "hints": { + "index": 1041 + } + }, + { + "items": [ + 1051.5, + null + ], + "hints": { + "index": 1042 + } + }, + { + "items": [ + 1052, + null + ], + "hints": { + "index": 1043 + } + }, + { + "items": [ + 1052.5, + null + ], + "hints": { + "index": 1044 + } + }, + { + "items": [ + 1053, + null + ], + "hints": { + "index": 1045 + } + }, + { + "items": [ + 1053.5, + null + ], + "hints": { + "index": 1046 + } + }, + { + "items": [ + 1054, + null + ], + "hints": { + "index": 1047 + } + }, + { + "items": [ + 1054.5, + null + ], + "hints": { + "index": 1048 + } + }, + { + "items": [ + 1055, + null + ], + "hints": { + "index": 1049 + } + }, + { + "items": [ + 1055.5, + null + ], + "hints": { + "index": 1050 + } + }, + { + "items": [ + 1056, + null + ], + "hints": { + "index": 1051 + } + }, + { + "items": [ + 1056.5, + null + ], + "hints": { + "index": 1052 + } + }, + { + "items": [ + 1057, + null + ], + "hints": { + "index": 1053 + } + }, + { + "items": [ + 1057.5, + null + ], + "hints": { + "index": 1054 + } + }, + { + "items": [ + 1058, + null + ], + "hints": { + "index": 1055 + } + }, + { + "items": [ + 1058.5, + null + ], + "hints": { + "index": 1056 + } + }, + { + "items": [ + 1059, + null + ], + "hints": { + "index": 1057 + } + }, + { + "items": [ + 1059.5, + null + ], + "hints": { + "index": 1058 + } + }, + { + "items": [ + 1060, + null + ], + "hints": { + "index": 1059 + } + }, + { + "items": [ + 1060.5, + null + ], + "hints": { + "index": 1060 + } + }, + { + "items": [ + 1061, + null + ], + "hints": { + "index": 1061 + } + }, + { + "items": [ + 1061.5, + null + ], + "hints": { + "index": 1062 + } + }, + { + "items": [ + 1062, + null + ], + "hints": { + "index": 1063 + } + }, + { + "items": [ + 1062.5, + null + ], + "hints": { + "index": 1064 + } + }, + { + "items": [ + 1063, + null + ], + "hints": { + "index": 1065 + } + }, + { + "items": [ + 1063.5, + null + ], + "hints": { + "index": 1066 + } + }, + { + "items": [ + 1064, + null + ], + "hints": { + "index": 1067 + } + }, + { + "items": [ + 1064.5, + null + ], + "hints": { + "index": 1068 + } + }, + { + "items": [ + 1065, + null + ], + "hints": { + "index": 1069 + } + }, + { + "items": [ + 1065.5, + null + ], + "hints": { + "index": 1070 + } + }, + { + "items": [ + 1066, + null + ], + "hints": { + "index": 1071 + } + }, + { + "items": [ + 1066.5, + null + ], + "hints": { + "index": 1072 + } + }, + { + "items": [ + 1067, + null + ], + "hints": { + "index": 1073 + } + }, + { + "items": [ + 1067.5, + null + ], + "hints": { + "index": 1074 + } + }, + { + "items": [ + 1068, + null + ], + "hints": { + "index": 1075 + } + }, + { + "items": [ + 1068.5, + null + ], + "hints": { + "index": 1076 + } + }, + { + "items": [ + 1069, + null + ], + "hints": { + "index": 1077 + } + }, + { + "items": [ + 1069.5, + null + ], + "hints": { + "index": 1078 + } + }, + { + "items": [ + 1070, + null + ], + "hints": { + "index": 1079 + } + }, + { + "items": [ + 1070.5, + null + ], + "hints": { + "index": 1080 + } + }, + { + "items": [ + 1071, + null + ], + "hints": { + "index": 1081 + } + }, + { + "items": [ + 1071.5, + null + ], + "hints": { + "index": 1082 + } + }, + { + "items": [ + 1072, + null + ], + "hints": { + "index": 1083 + } + }, + { + "items": [ + 1072.5, + null + ], + "hints": { + "index": 1084 + } + }, + { + "items": [ + 1073, + null + ], + "hints": { + "index": 1085 + } + }, + { + "items": [ + 1073.5, + null + ], + "hints": { + "index": 1086 + } + }, + { + "items": [ + 1074, + null + ], + "hints": { + "index": 1087 + } + }, + { + "items": [ + 1074.5, + null + ], + "hints": { + "index": 1088 + } + }, + { + "items": [ + 1075, + null + ], + "hints": { + "index": 1089 + } + }, + { + "items": [ + 1075.5, + null + ], + "hints": { + "index": 1090 + } + }, + { + "items": [ + 1076, + null + ], + "hints": { + "index": 1091 + } + }, + { + "items": [ + 1076.5, + null + ], + "hints": { + "index": 1092 + } + }, + { + "items": [ + 1077, + null + ], + "hints": { + "index": 1093 + } + }, + { + "items": [ + 1077.5, + null + ], + "hints": { + "index": 1094 + } + }, + { + "items": [ + 1078, + null + ], + "hints": { + "index": 1095 + } + }, + { + "items": [ + 1078.5, + null + ], + "hints": { + "index": 1096 + } + }, + { + "items": [ + 1079, + null + ], + "hints": { + "index": 1097 + } + }, + { + "items": [ + 1079.5, + null + ], + "hints": { + "index": 1098 + } + }, + { + "items": [ + 1080, + null + ], + "hints": { + "index": 1099 + } + }, + { + "items": [ + 1080.5, + null + ], + "hints": { + "index": 1100 + } + }, + { + "items": [ + 1081, + null + ], + "hints": { + "index": 1101 + } + }, + { + "items": [ + 1081.5, + null + ], + "hints": { + "index": 1102 + } + }, + { + "items": [ + 1082, + null + ], + "hints": { + "index": 1103 + } + }, + { + "items": [ + 1082.5, + null + ], + "hints": { + "index": 1104 + } + }, + { + "items": [ + 1083, + null + ], + "hints": { + "index": 1105 + } + }, + { + "items": [ + 1083.5, + null + ], + "hints": { + "index": 1106 + } + }, + { + "items": [ + 1084, + null + ], + "hints": { + "index": 1107 + } + }, + { + "items": [ + 1084.5, + null + ], + "hints": { + "index": 1108 + } + }, + { + "items": [ + 1085, + null + ], + "hints": { + "index": 1109 + } + }, + { + "items": [ + 1085.5, + null + ], + "hints": { + "index": 1110 + } + }, + { + "items": [ + 1086, + null + ], + "hints": { + "index": 1111 + } + }, + { + "items": [ + 1086.5, + null + ], + "hints": { + "index": 1112 + } + }, + { + "items": [ + 1087, + null + ], + "hints": { + "index": 1113 + } + }, + { + "items": [ + 1087.5, + null + ], + "hints": { + "index": 1114 + } + }, + { + "items": [ + 1088, + null + ], + "hints": { + "index": 1115 + } + }, + { + "items": [ + 1088.5, + null + ], + "hints": { + "index": 1116 + } + }, + { + "items": [ + 1089, + null + ], + "hints": { + "index": 1117 + } + }, + { + "items": [ + 1089.5, + null + ], + "hints": { + "index": 1118 + } + }, + { + "items": [ + 1090, + null + ], + "hints": { + "index": 1119 + } + }, + { + "items": [ + 1090.5, + null + ], + "hints": { + "index": 1120 + } + }, + { + "items": [ + 1091, + null + ], + "hints": { + "index": 1121 + } + }, + { + "items": [ + 1091.5, + null + ], + "hints": { + "index": 1122 + } + }, + { + "items": [ + 1092, + null + ], + "hints": { + "index": 1123 + } + }, + { + "items": [ + 1092.5, + null + ], + "hints": { + "index": 1124 + } + }, + { + "items": [ + 1093, + null + ], + "hints": { + "index": 1125 + } + }, + { + "items": [ + 1093.5, + null + ], + "hints": { + "index": 1126 + } + }, + { + "items": [ + 1094, + null + ], + "hints": { + "index": 1127 + } + }, + { + "items": [ + 1094.5, + null + ], + "hints": { + "index": 1128 + } + }, + { + "items": [ + 1095, + null + ], + "hints": { + "index": 1129 + } + }, + { + "items": [ + 1095.5, + null + ], + "hints": { + "index": 1130 + } + }, + { + "items": [ + 1096, + null + ], + "hints": { + "index": 1131 + } + }, + { + "items": [ + 1096.5, + null + ], + "hints": { + "index": 1132 + } + }, + { + "items": [ + 1097, + null + ], + "hints": { + "index": 1133 + } + }, + { + "items": [ + 1097.5, + null + ], + "hints": { + "index": 1134 + } + }, + { + "items": [ + 1098, + null + ], + "hints": { + "index": 1135 + } + }, + { + "items": [ + 1098.5, + null + ], + "hints": { + "index": 1136 + } + }, + { + "items": [ + 1099, + null + ], + "hints": { + "index": 1137 + } + }, + { + "items": [ + 1099.5, + null + ], + "hints": { + "index": 1138 + } + }, + { + "items": [ + 1100, + null + ], + "hints": { + "index": 1139 + } + }, + { + "items": [ + 1100.5, + null + ], + "hints": { + "index": 1140 + } + }, + { + "items": [ + 1101, + null + ], + "hints": { + "index": 1141 + } + }, + { + "items": [ + 1101.5, + null + ], + "hints": { + "index": 1142 + } + }, + { + "items": [ + 1102, + null + ], + "hints": { + "index": 1143 + } + }, + { + "items": [ + 1102.5, + null + ], + "hints": { + "index": 1144 + } + }, + { + "items": [ + 1103, + null + ], + "hints": { + "index": 1145 + } + }, + { + "items": [ + 1103.5, + null + ], + "hints": { + "index": 1146 + } + }, + { + "items": [ + 1104, + null + ], + "hints": { + "index": 1147 + } + }, + { + "items": [ + 1104.5, + null + ], + "hints": { + "index": 1148 + } + }, + { + "items": [ + 1105, + null + ], + "hints": { + "index": 1149 + } + }, + { + "items": [ + 1105.5, + null + ], + "hints": { + "index": 1150 + } + }, + { + "items": [ + 1106, + null + ], + "hints": { + "index": 1151 + } + }, + { + "items": [ + 1106.5, + null + ], + "hints": { + "index": 1152 + } + }, + { + "items": [ + 1107, + null + ], + "hints": { + "index": 1153 + } + }, + { + "items": [ + 1107.5, + null + ], + "hints": { + "index": 1154 + } + }, + { + "items": [ + 1108, + null + ], + "hints": { + "index": 1155 + } + }, + { + "items": [ + 1108.5, + null + ], + "hints": { + "index": 1156 + } + }, + { + "items": [ + 1109, + null + ], + "hints": { + "index": 1157 + } + }, + { + "items": [ + 1109.5, + null + ], + "hints": { + "index": 1158 + } + }, + { + "items": [ + 1110, + null + ], + "hints": { + "index": 1159 + } + }, + { + "items": [ + 1110.5, + null + ], + "hints": { + "index": 1160 + } + }, + { + "items": [ + 1111, + null + ], + "hints": { + "index": 1161 + } + }, + { + "items": [ + 1111.5, + null + ], + "hints": { + "index": 1162 + } + }, + { + "items": [ + 1112, + null + ], + "hints": { + "index": 1163 + } + }, + { + "items": [ + 1112.5, + null + ], + "hints": { + "index": 1164 + } + }, + { + "items": [ + 1113, + null + ], + "hints": { + "index": 1165 + } + }, + { + "items": [ + 1113.5, + null + ], + "hints": { + "index": 1166 + } + }, + { + "items": [ + 1114, + null + ], + "hints": { + "index": 1167 + } + }, + { + "items": [ + 1114.5, + null + ], + "hints": { + "index": 1168 + } + }, + { + "items": [ + 1115, + null + ], + "hints": { + "index": 1169 + } + }, + { + "items": [ + 1115.5, + null + ], + "hints": { + "index": 1170 + } + }, + { + "items": [ + 1116, + null + ], + "hints": { + "index": 1171 + } + }, + { + "items": [ + 1116.5, + null + ], + "hints": { + "index": 1172 + } + }, + { + "items": [ + 1117, + null + ], + "hints": { + "index": 1173 + } + }, + { + "items": [ + 1117.5, + null + ], + "hints": { + "index": 1174 + } + }, + { + "items": [ + 1118, + null + ], + "hints": { + "index": 1175 + } + }, + { + "items": [ + 1118.5, + null + ], + "hints": { + "index": 1176 + } + }, + { + "items": [ + 1119, + null + ], + "hints": { + "index": 1177 + } + }, + { + "items": [ + 1119.5, + null + ], + "hints": { + "index": 1178 + } + }, + { + "items": [ + 1120, + null + ], + "hints": { + "index": 1179 + } + }, + { + "items": [ + 1120.5, + null + ], + "hints": { + "index": 1180 + } + }, + { + "items": [ + 1121, + null + ], + "hints": { + "index": 1181 + } + }, + { + "items": [ + 1121.5, + null + ], + "hints": { + "index": 1182 + } + }, + { + "items": [ + 1122, + null + ], + "hints": { + "index": 1183 + } + }, + { + "items": [ + 1122.5, + null + ], + "hints": { + "index": 1184 + } + }, + { + "items": [ + 1123, + null + ], + "hints": { + "index": 1185 + } + }, + { + "items": [ + 1123.5, + null + ], + "hints": { + "index": 1186 + } + }, + { + "items": [ + 1124, + null + ], + "hints": { + "index": 1187 + } + }, + { + "items": [ + 1124.5, + null + ], + "hints": { + "index": 1188 + } + }, + { + "items": [ + 1125, + null + ], + "hints": { + "index": 1189 + } + }, + { + "items": [ + 1125.5, + null + ], + "hints": { + "index": 1190 + } + }, + { + "items": [ + 1126, + null + ], + "hints": { + "index": 1191 + } + }, + { + "items": [ + 1126.5, + null + ], + "hints": { + "index": 1192 + } + }, + { + "items": [ + 1127, + null + ], + "hints": { + "index": 1193 + } + }, + { + "items": [ + 1127.5, + null + ], + "hints": { + "index": 1194 + } + }, + { + "items": [ + 1128, + null + ], + "hints": { + "index": 1195 + } + }, + { + "items": [ + 1128.5, + null + ], + "hints": { + "index": 1196 + } + }, + { + "items": [ + 1129, + null + ], + "hints": { + "index": 1197 + } + }, + { + "items": [ + 1129.5, + null + ], + "hints": { + "index": 1198 + } + }, + { + "items": [ + 1130, + null + ], + "hints": { + "index": 1199 + } + }, + { + "items": [ + 1130.5, + null + ], + "hints": { + "index": 1200 + } + }, + { + "items": [ + 1131, + null + ], + "hints": { + "index": 1201 + } + }, + { + "items": [ + 1131.5, + null + ], + "hints": { + "index": 1202 + } + }, + { + "items": [ + 1132, + null + ], + "hints": { + "index": 1203 + } + }, + { + "items": [ + 1132.5, + null + ], + "hints": { + "index": 1204 + } + }, + { + "items": [ + 1133, + null + ], + "hints": { + "index": 1205 + } + }, + { + "items": [ + 1133.5, + null + ], + "hints": { + "index": 1206 + } + }, + { + "items": [ + 1134, + null + ], + "hints": { + "index": 1207 + } + }, + { + "items": [ + 1134.5, + null + ], + "hints": { + "index": 1208 + } + }, + { + "items": [ + 1135, + null + ], + "hints": { + "index": 1209 + } + }, + { + "items": [ + 1135.5, + null + ], + "hints": { + "index": 1210 + } + }, + { + "items": [ + 1136, + null + ], + "hints": { + "index": 1211 + } + }, + { + "items": [ + 1136.5, + null + ], + "hints": { + "index": 1212 + } + }, + { + "items": [ + 1137, + null + ], + "hints": { + "index": 1213 + } + }, + { + "items": [ + 1137.5, + null + ], + "hints": { + "index": 1214 + } + }, + { + "items": [ + 1138, + null + ], + "hints": { + "index": 1215 + } + }, + { + "items": [ + 1138.5, + null + ], + "hints": { + "index": 1216 + } + }, + { + "items": [ + 1139, + null + ], + "hints": { + "index": 1217 + } + }, + { + "items": [ + 1139.5, + null + ], + "hints": { + "index": 1218 + } + }, + { + "items": [ + 1140, + null + ], + "hints": { + "index": 1219 + } + }, + { + "items": [ + 1140.5, + null + ], + "hints": { + "index": 1220 + } + }, + { + "items": [ + 1141, + null + ], + "hints": { + "index": 1221 + } + }, + { + "items": [ + 1141.5, + null + ], + "hints": { + "index": 1222 + } + }, + { + "items": [ + 1142, + null + ], + "hints": { + "index": 1223 + } + }, + { + "items": [ + 1142.5, + null + ], + "hints": { + "index": 1224 + } + }, + { + "items": [ + 1143, + null + ], + "hints": { + "index": 1225 + } + }, + { + "items": [ + 1143.5, + null + ], + "hints": { + "index": 1226 + } + }, + { + "items": [ + 1144, + null + ], + "hints": { + "index": 1227 + } + }, + { + "items": [ + 1144.5, + null + ], + "hints": { + "index": 1228 + } + }, + { + "items": [ + 1145, + null + ], + "hints": { + "index": 1229 + } + }, + { + "items": [ + 1145.5, + null + ], + "hints": { + "index": 1230 + } + }, + { + "items": [ + 1146, + null + ], + "hints": { + "index": 1231 + } + }, + { + "items": [ + 1146.5, + null + ], + "hints": { + "index": 1232 + } + }, + { + "items": [ + 1147, + null + ], + "hints": { + "index": 1233 + } + }, + { + "items": [ + 1147.5, + null + ], + "hints": { + "index": 1234 + } + }, + { + "items": [ + 1148, + null + ], + "hints": { + "index": 1235 + } + }, + { + "items": [ + 1148.5, + null + ], + "hints": { + "index": 1236 + } + }, + { + "items": [ + 1149, + null + ], + "hints": { + "index": 1237 + } + }, + { + "items": [ + 1149.5, + null + ], + "hints": { + "index": 1238 + } + }, + { + "items": [ + 1150, + null + ], + "hints": { + "index": 1239 + } + }, + { + "items": [ + 1150.5, + null + ], + "hints": { + "index": 1240 + } + }, + { + "items": [ + 1151, + null + ], + "hints": { + "index": 1241 + } + }, + { + "items": [ + 1151.5, + null + ], + "hints": { + "index": 1242 + } + }, + { + "items": [ + 1152, + null + ], + "hints": { + "index": 1243 + } + }, + { + "items": [ + 1152.5, + null + ], + "hints": { + "index": 1244 + } + }, + { + "items": [ + 1153, + null + ], + "hints": { + "index": 1245 + } + }, + { + "items": [ + 1153.5, + null + ], + "hints": { + "index": 1246 + } + }, + { + "items": [ + 1154, + null + ], + "hints": { + "index": 1247 + } + }, + { + "items": [ + 1154.5, + null + ], + "hints": { + "index": 1248 + } + }, + { + "items": [ + 1155, + null + ], + "hints": { + "index": 1249 + } + }, + { + "items": [ + 1155.5, + null + ], + "hints": { + "index": 1250 + } + }, + { + "items": [ + 1156, + null + ], + "hints": { + "index": 1251 + } + }, + { + "items": [ + 1156.5, + null + ], + "hints": { + "index": 1252 + } + }, + { + "items": [ + 1157, + null + ], + "hints": { + "index": 1253 + } + }, + { + "items": [ + 1157.5, + null + ], + "hints": { + "index": 1254 + } + }, + { + "items": [ + 1158, + null + ], + "hints": { + "index": 1255 + } + }, + { + "items": [ + 1158.5, + null + ], + "hints": { + "index": 1256 + } + }, + { + "items": [ + 1159, + null + ], + "hints": { + "index": 1257 + } + }, + { + "items": [ + 1159.5, + null + ], + "hints": { + "index": 1258 + } + }, + { + "items": [ + 1160, + null + ], + "hints": { + "index": 1259 + } + }, + { + "items": [ + 1160.5, + null + ], + "hints": { + "index": 1260 + } + }, + { + "items": [ + 1161, + null + ], + "hints": { + "index": 1261 + } + }, + { + "items": [ + 1161.5, + null + ], + "hints": { + "index": 1262 + } + }, + { + "items": [ + 1162, + null + ], + "hints": { + "index": 1263 + } + }, + { + "items": [ + 1162.5, + null + ], + "hints": { + "index": 1264 + } + }, + { + "items": [ + 1163, + null + ], + "hints": { + "index": 1265 + } + }, + { + "items": [ + 1163.5, + null + ], + "hints": { + "index": 1266 + } + }, + { + "items": [ + 1164, + null + ], + "hints": { + "index": 1267 + } + }, + { + "items": [ + 1164.5, + null + ], + "hints": { + "index": 1268 + } + }, + { + "items": [ + 1165, + null + ], + "hints": { + "index": 1269 + } + }, + { + "items": [ + 1165.5, + null + ], + "hints": { + "index": 1270 + } + }, + { + "items": [ + 1166, + null + ], + "hints": { + "index": 1271 + } + }, + { + "items": [ + 1166.5, + null + ], + "hints": { + "index": 1272 + } + }, + { + "items": [ + 1167, + null + ], + "hints": { + "index": 1273 + } + }, + { + "items": [ + 1167.5, + null + ], + "hints": { + "index": 1274 + } + }, + { + "items": [ + 1168, + null + ], + "hints": { + "index": 1275 + } + }, + { + "items": [ + 1168.5, + null + ], + "hints": { + "index": 1276 + } + }, + { + "items": [ + 1169, + null + ], + "hints": { + "index": 1277 + } + }, + { + "items": [ + 1169.5, + null + ], + "hints": { + "index": 1278 + } + }, + { + "items": [ + 1170, + null + ], + "hints": { + "index": 1279 + } + }, + { + "items": [ + 1170.5, + null + ], + "hints": { + "index": 1280 + } + }, + { + "items": [ + 1171, + null + ], + "hints": { + "index": 1281 + } + }, + { + "items": [ + 1171.5, + null + ], + "hints": { + "index": 1282 + } + }, + { + "items": [ + 1172, + null + ], + "hints": { + "index": 1283 + } + }, + { + "items": [ + 1172.5, + null + ], + "hints": { + "index": 1284 + } + }, + { + "items": [ + 1173, + null + ], + "hints": { + "index": 1285 + } + }, + { + "items": [ + 1173.5, + null + ], + "hints": { + "index": 1286 + } + }, + { + "items": [ + 1174, + null + ], + "hints": { + "index": 1287 + } + }, + { + "items": [ + 1174.5, + null + ], + "hints": { + "index": 1288 + } + }, + { + "items": [ + 1175, + null + ], + "hints": { + "index": 1289 + } + }, + { + "items": [ + 1175.5, + null + ], + "hints": { + "index": 1290 + } + }, + { + "items": [ + 1176, + null + ], + "hints": { + "index": 1291 + } + }, + { + "items": [ + 1176.5, + null + ], + "hints": { + "index": 1292 + } + }, + { + "items": [ + 1177, + null + ], + "hints": { + "index": 1293 + } + }, + { + "items": [ + 1177.5, + null + ], + "hints": { + "index": 1294 + } + }, + { + "items": [ + 1178, + null + ], + "hints": { + "index": 1295 + } + }, + { + "items": [ + 1178.5, + null + ], + "hints": { + "index": 1296 + } + }, + { + "items": [ + 1179, + null + ], + "hints": { + "index": 1297 + } + }, + { + "items": [ + 1179.5, + null + ], + "hints": { + "index": 1298 + } + }, + { + "items": [ + 1180, + null + ], + "hints": { + "index": 1299 + } + }, + { + "items": [ + 1180.5, + null + ], + "hints": { + "index": 1300 + } + }, + { + "items": [ + 1181, + null + ], + "hints": { + "index": 1301 + } + }, + { + "items": [ + 1181.5, + null + ], + "hints": { + "index": 1302 + } + }, + { + "items": [ + 1182, + null + ], + "hints": { + "index": 1303 + } + }, + { + "items": [ + 1182.5, + null + ], + "hints": { + "index": 1304 + } + }, + { + "items": [ + 1183, + null + ], + "hints": { + "index": 1305 + } + }, + { + "items": [ + 1183.5, + null + ], + "hints": { + "index": 1306 + } + }, + { + "items": [ + 1184, + null + ], + "hints": { + "index": 1307 + } + }, + { + "items": [ + 1184.5, + null + ], + "hints": { + "index": 1308 + } + }, + { + "items": [ + 1185, + null + ], + "hints": { + "index": 1309 + } + }, + { + "items": [ + 1185.5, + null + ], + "hints": { + "index": 1310 + } + }, + { + "items": [ + 1186, + null + ], + "hints": { + "index": 1311 + } + }, + { + "items": [ + 1186.5, + null + ], + "hints": { + "index": 1312 + } + }, + { + "items": [ + 1187, + null + ], + "hints": { + "index": 1313 + } + }, + { + "items": [ + 1187.5, + null + ], + "hints": { + "index": 1314 + } + }, + { + "items": [ + 1188, + null + ], + "hints": { + "index": 1315 + } + }, + { + "items": [ + 1188.5, + null + ], + "hints": { + "index": 1316 + } + }, + { + "items": [ + 1189, + null + ], + "hints": { + "index": 1317 + } + }, + { + "items": [ + 1189.5, + null + ], + "hints": { + "index": 1318 + } + }, + { + "items": [ + 1190, + null + ], + "hints": { + "index": 1319 + } + }, + { + "items": [ + 1190.5, + null + ], + "hints": { + "index": 1320 + } + }, + { + "items": [ + 1191, + null + ], + "hints": { + "index": 1321 + } + }, + { + "items": [ + 1191.5, + null + ], + "hints": { + "index": 1322 + } + }, + { + "items": [ + 1192, + null + ], + "hints": { + "index": 1323 + } + }, + { + "items": [ + 1192.5, + null + ], + "hints": { + "index": 1324 + } + }, + { + "items": [ + 1193, + null + ], + "hints": { + "index": 1325 + } + }, + { + "items": [ + 1193.5, + null + ], + "hints": { + "index": 1326 + } + }, + { + "items": [ + 1194, + null + ], + "hints": { + "index": 1327 + } + }, + { + "items": [ + 1194.5, + null + ], + "hints": { + "index": 1328 + } + }, + { + "items": [ + 1195, + null + ], + "hints": { + "index": 1329 + } + }, + { + "items": [ + 1195.5, + null + ], + "hints": { + "index": 1330 + } + }, + { + "items": [ + 1196, + null + ], + "hints": { + "index": 1331 + } + }, + { + "items": [ + 1196.5, + null + ], + "hints": { + "index": 1332 + } + }, + { + "items": [ + 1197, + null + ], + "hints": { + "index": 1333 + } + }, + { + "items": [ + 1197.5, + null + ], + "hints": { + "index": 1334 + } + }, + { + "items": [ + 1198, + null + ], + "hints": { + "index": 1335 + } + }, + { + "items": [ + 1198.5, + null + ], + "hints": { + "index": 1336 + } + }, + { + "items": [ + 1199, + null + ], + "hints": { + "index": 1337 + } + }, + { + "items": [ + 1199.5, + null + ], + "hints": { + "index": 1338 + } + }, + { + "items": [ + 1200, + null + ], + "hints": { + "index": 1339 + } + }, + { + "items": [ + 1200.5, + null + ], + "hints": { + "index": 1340 + } + }, + { + "items": [ + 1201, + null + ], + "hints": { + "index": 1341 + } + }, + { + "items": [ + 1201.5, + null + ], + "hints": { + "index": 1342 + } + }, + { + "items": [ + 1202, + null + ], + "hints": { + "index": 1343 + } + }, + { + "items": [ + 1202.5, + null + ], + "hints": { + "index": 1344 + } + }, + { + "items": [ + 1203, + null + ], + "hints": { + "index": 1345 + } + }, + { + "items": [ + 1203.5, + null + ], + "hints": { + "index": 1346 + } + }, + { + "items": [ + 1204, + null + ], + "hints": { + "index": 1347 + } + }, + { + "items": [ + 1204.5, + null + ], + "hints": { + "index": 1348 + } + }, + { + "items": [ + 1205, + null + ], + "hints": { + "index": 1349 + } + }, + { + "items": [ + 1205.5, + null + ], + "hints": { + "index": 1350 + } + }, + { + "items": [ + 1206, + null + ], + "hints": { + "index": 1351 + } + }, + { + "items": [ + 1206.5, + null + ], + "hints": { + "index": 1352 + } + }, + { + "items": [ + 1207, + null + ], + "hints": { + "index": 1353 + } + }, + { + "items": [ + 1207.5, + null + ], + "hints": { + "index": 1354 + } + }, + { + "items": [ + 1208, + null + ], + "hints": { + "index": 1355 + } + }, + { + "items": [ + 1208.5, + null + ], + "hints": { + "index": 1356 + } + }, + { + "items": [ + 1209, + null + ], + "hints": { + "index": 1357 + } + }, + { + "items": [ + 1209.5, + null + ], + "hints": { + "index": 1358 + } + }, + { + "items": [ + 1210, + null + ], + "hints": { + "index": 1359 + } + }, + { + "items": [ + 1210.5, + null + ], + "hints": { + "index": 1360 + } + }, + { + "items": [ + 1211, + null + ], + "hints": { + "index": 1361 + } + }, + { + "items": [ + 1211.5, + null + ], + "hints": { + "index": 1362 + } + }, + { + "items": [ + 1212, + null + ], + "hints": { + "index": 1363 + } + }, + { + "items": [ + 1212.5, + null + ], + "hints": { + "index": 1364 + } + }, + { + "items": [ + 1213, + null + ], + "hints": { + "index": 1365 + } + }, + { + "items": [ + 1213.5, + null + ], + "hints": { + "index": 1366 + } + }, + { + "items": [ + 1214, + null + ], + "hints": { + "index": 1367 + } + }, + { + "items": [ + 1214.5, + null + ], + "hints": { + "index": 1368 + } + }, + { + "items": [ + 1215, + null + ], + "hints": { + "index": 1369 + } + }, + { + "items": [ + 1215.5, + null + ], + "hints": { + "index": 1370 + } + }, + { + "items": [ + 1216, + null + ], + "hints": { + "index": 1371 + } + }, + { + "items": [ + 1216.5, + null + ], + "hints": { + "index": 1372 + } + }, + { + "items": [ + 1217, + null + ], + "hints": { + "index": 1373 + } + }, + { + "items": [ + 1217.5, + null + ], + "hints": { + "index": 1374 + } + }, + { + "items": [ + 1218, + null + ], + "hints": { + "index": 1375 + } + }, + { + "items": [ + 1218.5, + null + ], + "hints": { + "index": 1376 + } + }, + { + "items": [ + 1219, + null + ], + "hints": { + "index": 1377 + } + }, + { + "items": [ + 1219.5, + null + ], + "hints": { + "index": 1378 + } + }, + { + "items": [ + 1220, + null + ], + "hints": { + "index": 1379 + } + }, + { + "items": [ + 1220.5, + null + ], + "hints": { + "index": 1380 + } + }, + { + "items": [ + 1221, + null + ], + "hints": { + "index": 1381 + } + }, + { + "items": [ + 1221.5, + null + ], + "hints": { + "index": 1382 + } + }, + { + "items": [ + 1222, + null + ], + "hints": { + "index": 1383 + } + }, + { + "items": [ + 1222.5, + null + ], + "hints": { + "index": 1384 + } + }, + { + "items": [ + 1223, + null + ], + "hints": { + "index": 1385 + } + }, + { + "items": [ + 1223.5, + null + ], + "hints": { + "index": 1386 + } + }, + { + "items": [ + 1224, + null + ], + "hints": { + "index": 1387 + } + }, + { + "items": [ + 1224.5, + null + ], + "hints": { + "index": 1388 + } + }, + { + "items": [ + 1225, + null + ], + "hints": { + "index": 1389 + } + }, + { + "items": [ + 1225.5, + null + ], + "hints": { + "index": 1390 + } + }, + { + "items": [ + 1226, + null + ], + "hints": { + "index": 1391 + } + }, + { + "items": [ + 1226.5, + null + ], + "hints": { + "index": 1392 + } + }, + { + "items": [ + 1227, + null + ], + "hints": { + "index": 1393 + } + }, + { + "items": [ + 1227.5, + null + ], + "hints": { + "index": 1394 + } + }, + { + "items": [ + 1228, + null + ], + "hints": { + "index": 1395 + } + }, + { + "items": [ + 1228.5, + null + ], + "hints": { + "index": 1396 + } + }, + { + "items": [ + 1229, + null + ], + "hints": { + "index": 1397 + } + }, + { + "items": [ + 1229.5, + null + ], + "hints": { + "index": 1398 + } + }, + { + "items": [ + 1230, + null + ], + "hints": { + "index": 1399 + } + }, + { + "items": [ + 1230.5, + null + ], + "hints": { + "index": 1400 + } + }, + { + "items": [ + 1231, + null + ], + "hints": { + "index": 1401 + } + }, + { + "items": [ + 1231.5, + null + ], + "hints": { + "index": 1402 + } + }, + { + "items": [ + 1232, + null + ], + "hints": { + "index": 1403 + } + }, + { + "items": [ + 1232.5, + null + ], + "hints": { + "index": 1404 + } + }, + { + "items": [ + 1233, + null + ], + "hints": { + "index": 1405 + } + }, + { + "items": [ + 1233.5, + null + ], + "hints": { + "index": 1406 + } + }, + { + "items": [ + 1234, + null + ], + "hints": { + "index": 1407 + } + }, + { + "items": [ + 1234.5, + null + ], + "hints": { + "index": 1408 + } + }, + { + "items": [ + 1235, + null + ], + "hints": { + "index": 1409 + } + }, + { + "items": [ + 1235.5, + null + ], + "hints": { + "index": 1410 + } + }, + { + "items": [ + 1236, + null + ], + "hints": { + "index": 1411 + } + }, + { + "items": [ + 1236.5, + null + ], + "hints": { + "index": 1412 + } + }, + { + "items": [ + 1237, + null + ], + "hints": { + "index": 1413 + } + }, + { + "items": [ + 1237.5, + null + ], + "hints": { + "index": 1414 + } + }, + { + "items": [ + 1238, + null + ], + "hints": { + "index": 1415 + } + }, + { + "items": [ + 1238.5, + null + ], + "hints": { + "index": 1416 + } + }, + { + "items": [ + 1239, + null + ], + "hints": { + "index": 1417 + } + }, + { + "items": [ + 1239.5, + null + ], + "hints": { + "index": 1418 + } + }, + { + "items": [ + 1240, + null + ], + "hints": { + "index": 1419 + } + }, + { + "items": [ + 1240.5, + null + ], + "hints": { + "index": 1420 + } + }, + { + "items": [ + 1241, + null + ], + "hints": { + "index": 1421 + } + }, + { + "items": [ + 1241.5, + null + ], + "hints": { + "index": 1422 + } + }, + { + "items": [ + 1242, + null + ], + "hints": { + "index": 1423 + } + }, + { + "items": [ + 1242.5, + null + ], + "hints": { + "index": 1424 + } + }, + { + "items": [ + 1243, + null + ], + "hints": { + "index": 1425 + } + }, + { + "items": [ + 1243.5, + null + ], + "hints": { + "index": 1426 + } + }, + { + "items": [ + 1244, + null + ], + "hints": { + "index": 1427 + } + }, + { + "items": [ + 1244.5, + null + ], + "hints": { + "index": 1428 + } + }, + { + "items": [ + 1245, + null + ], + "hints": { + "index": 1429 + } + }, + { + "items": [ + 1245.5, + null + ], + "hints": { + "index": 1430 + } + }, + { + "items": [ + 1246, + null + ], + "hints": { + "index": 1431 + } + }, + { + "items": [ + 1246.5, + null + ], + "hints": { + "index": 1432 + } + }, + { + "items": [ + 1247, + null + ], + "hints": { + "index": 1433 + } + }, + { + "items": [ + 1247.5, + null + ], + "hints": { + "index": 1434 + } + }, + { + "items": [ + 1248, + null + ], + "hints": { + "index": 1435 + } + }, + { + "items": [ + 1248.5, + null + ], + "hints": { + "index": 1436 + } + }, + { + "items": [ + 1249, + null + ], + "hints": { + "index": 1437 + } + }, + { + "items": [ + 1249.5, + null + ], + "hints": { + "index": 1438 + } + }, + { + "items": [ + 1250, + null + ], + "hints": { + "index": 1439 + } + }, + { + "items": [ + 1250.5, + null + ], + "hints": { + "index": 1440 + } + }, + { + "items": [ + 1251, + null + ], + "hints": { + "index": 1441 + } + }, + { + "items": [ + 1251.5, + null + ], + "hints": { + "index": 1442 + } + }, + { + "items": [ + 1252, + null + ], + "hints": { + "index": 1443 + } + }, + { + "items": [ + 1252.5, + null + ], + "hints": { + "index": 1444 + } + }, + { + "items": [ + 1253, + null + ], + "hints": { + "index": 1445 + } + }, + { + "items": [ + 1253.5, + null + ], + "hints": { + "index": 1446 + } + }, + { + "items": [ + 1254, + null + ], + "hints": { + "index": 1447 + } + }, + { + "items": [ + 1254.5, + null + ], + "hints": { + "index": 1448 + } + }, + { + "items": [ + 1255, + null + ], + "hints": { + "index": 1449 + } + }, + { + "items": [ + 1255.5, + null + ], + "hints": { + "index": 1450 + } + }, + { + "items": [ + 1256, + null + ], + "hints": { + "index": 1451 + } + }, + { + "items": [ + 1256.5, + null + ], + "hints": { + "index": 1452 + } + }, + { + "items": [ + 1257, + null + ], + "hints": { + "index": 1453 + } + }, + { + "items": [ + 1257.5, + null + ], + "hints": { + "index": 1454 + } + }, + { + "items": [ + 1258, + null + ], + "hints": { + "index": 1455 + } + }, + { + "items": [ + 1258.5, + null + ], + "hints": { + "index": 1456 + } + }, + { + "items": [ + 1259, + null + ], + "hints": { + "index": 1457 + } + }, + { + "items": [ + 1259.5, + null + ], + "hints": { + "index": 1458 + } + }, + { + "items": [ + 1260, + null + ], + "hints": { + "index": 1459 + } + }, + { + "items": [ + 1260.5, + null + ], + "hints": { + "index": 1460 + } + }, + { + "items": [ + 1261, + null + ], + "hints": { + "index": 1461 + } + }, + { + "items": [ + 1261.5, + null + ], + "hints": { + "index": 1462 + } + }, + { + "items": [ + 1262, + null + ], + "hints": { + "index": 1463 + } + }, + { + "items": [ + 1262.5, + null + ], + "hints": { + "index": 1464 + } + }, + { + "items": [ + 1263, + null + ], + "hints": { + "index": 1465 + } + }, + { + "items": [ + 1263.5, + null + ], + "hints": { + "index": 1466 + } + }, + { + "items": [ + 1264, + null + ], + "hints": { + "index": 1467 + } + }, + { + "items": [ + 1264.5, + null + ], + "hints": { + "index": 1468 + } + }, + { + "items": [ + 1265, + null + ], + "hints": { + "index": 1469 + } + }, + { + "items": [ + 1265.5, + null + ], + "hints": { + "index": 1470 + } + }, + { + "items": [ + 1266, + null + ], + "hints": { + "index": 1471 + } + }, + { + "items": [ + 1266.5, + null + ], + "hints": { + "index": 1472 + } + }, + { + "items": [ + 1267, + null + ], + "hints": { + "index": 1473 + } + }, + { + "items": [ + 1267.5, + null + ], + "hints": { + "index": 1474 + } + }, + { + "items": [ + 1268, + null + ], + "hints": { + "index": 1475 + } + }, + { + "items": [ + 1268.5, + null + ], + "hints": { + "index": 1476 + } + }, + { + "items": [ + 1269, + null + ], + "hints": { + "index": 1477 + } + }, + { + "items": [ + 1269.5, + null + ], + "hints": { + "index": 1478 + } + }, + { + "items": [ + 1270, + null + ], + "hints": { + "index": 1479 + } + }, + { + "items": [ + 1270.5, + null + ], + "hints": { + "index": 1480 + } + }, + { + "items": [ + 1271, + null + ], + "hints": { + "index": 1481 + } + }, + { + "items": [ + 1271.5, + null + ], + "hints": { + "index": 1482 + } + }, + { + "items": [ + 1272, + null + ], + "hints": { + "index": 1483 + } + }, + { + "items": [ + 1272.5, + null + ], + "hints": { + "index": 1484 + } + }, + { + "items": [ + 1273, + null + ], + "hints": { + "index": 1485 + } + }, + { + "items": [ + 1273.5, + null + ], + "hints": { + "index": 1486 + } + }, + { + "items": [ + 1274, + null + ], + "hints": { + "index": 1487 + } + }, + { + "items": [ + 1274.5, + null + ], + "hints": { + "index": 1488 + } + }, + { + "items": [ + 1275, + null + ], + "hints": { + "index": 1489 + } + }, + { + "items": [ + 1275.5, + null + ], + "hints": { + "index": 1490 + } + }, + { + "items": [ + 1276, + null + ], + "hints": { + "index": 1491 + } + }, + { + "items": [ + 1276.5, + null + ], + "hints": { + "index": 1492 + } + }, + { + "items": [ + 1277, + null + ], + "hints": { + "index": 1493 + } + }, + { + "items": [ + 1277.5, + null + ], + "hints": { + "index": 1494 + } + }, + { + "items": [ + 1278, + null + ], + "hints": { + "index": 1495 + } + }, + { + "items": [ + 1278.5, + null + ], + "hints": { + "index": 1496 + } + }, + { + "items": [ + 1279, + null + ], + "hints": { + "index": 1497 + } + }, + { + "items": [ + 1279.5, + null + ], + "hints": { + "index": 1498 + } + }, + { + "items": [ + 1280, + null + ], + "hints": { + "index": 1499 + } + }, + { + "items": [ + 1280.5, + null + ], + "hints": { + "index": 1500 + } + }, + { + "items": [ + 1281, + null + ], + "hints": { + "index": 1501 + } + }, + { + "items": [ + 1281.5, + null + ], + "hints": { + "index": 1502 + } + }, + { + "items": [ + 1282, + null + ], + "hints": { + "index": 1503 + } + }, + { + "items": [ + 1282.5, + null + ], + "hints": { + "index": 1504 + } + }, + { + "items": [ + 1283, + null + ], + "hints": { + "index": 1505 + } + }, + { + "items": [ + 1283.5, + null + ], + "hints": { + "index": 1506 + } + }, + { + "items": [ + 1284, + null + ], + "hints": { + "index": 1507 + } + }, + { + "items": [ + 1284.5, + null + ], + "hints": { + "index": 1508 + } + }, + { + "items": [ + 1285, + null + ], + "hints": { + "index": 1509 + } + }, + { + "items": [ + 1285.5, + null + ], + "hints": { + "index": 1510 + } + }, + { + "items": [ + 1286, + null + ], + "hints": { + "index": 1511 + } + }, + { + "items": [ + 1286.5, + null + ], + "hints": { + "index": 1512 + } + }, + { + "items": [ + 1287, + null + ], + "hints": { + "index": 1513 + } + }, + { + "items": [ + 1287.5, + null + ], + "hints": { + "index": 1514 + } + }, + { + "items": [ + 1288, + null + ], + "hints": { + "index": 1515 + } + }, + { + "items": [ + 1288.5, + null + ], + "hints": { + "index": 1516 + } + }, + { + "items": [ + 1289, + null + ], + "hints": { + "index": 1517 + } + }, + { + "items": [ + 1289.5, + null + ], + "hints": { + "index": 1518 + } + }, + { + "items": [ + 1290, + null + ], + "hints": { + "index": 1519 + } + }, + { + "items": [ + 1290.5, + null + ], + "hints": { + "index": 1520 + } + }, + { + "items": [ + 1291, + null + ], + "hints": { + "index": 1521 + } + }, + { + "items": [ + 1291.5, + null + ], + "hints": { + "index": 1522 + } + }, + { + "items": [ + 1292, + null + ], + "hints": { + "index": 1523 + } + }, + { + "items": [ + 1292.5, + null + ], + "hints": { + "index": 1524 + } + }, + { + "items": [ + 1293, + null + ], + "hints": { + "index": 1525 + } + }, + { + "items": [ + 1293.5, + null + ], + "hints": { + "index": 1526 + } + }, + { + "items": [ + 1294, + null + ], + "hints": { + "index": 1527 + } + }, + { + "items": [ + 1294.5, + null + ], + "hints": { + "index": 1528 + } + }, + { + "items": [ + 1295, + null + ], + "hints": { + "index": 1529 + } + }, + { + "items": [ + 1295.5, + null + ], + "hints": { + "index": 1530 + } + }, + { + "items": [ + 1296, + null + ], + "hints": { + "index": 1531 + } + }, + { + "items": [ + 1296.5, + null + ], + "hints": { + "index": 1532 + } + }, + { + "items": [ + 1297, + null + ], + "hints": { + "index": 1533 + } + }, + { + "items": [ + 1297.5, + null + ], + "hints": { + "index": 1534 + } + }, + { + "items": [ + 1298, + null + ], + "hints": { + "index": 1535 + } + }, + { + "items": [ + 1298.5, + null + ], + "hints": { + "index": 1536 + } + }, + { + "items": [ + 1299, + null + ], + "hints": { + "index": 1537 + } + }, + { + "items": [ + 1299.5, + null + ], + "hints": { + "index": 1538 + } + }, + { + "items": [ + 1300, + null + ], + "hints": { + "index": 1539 + } + }, + { + "items": [ + 1300.5, + null + ], + "hints": { + "index": 1540 + } + }, + { + "items": [ + 1301, + null + ], + "hints": { + "index": 1541 + } + }, + { + "items": [ + 1301.5, + null + ], + "hints": { + "index": 1542 + } + }, + { + "items": [ + 1302, + null + ], + "hints": { + "index": 1543 + } + }, + { + "items": [ + 1302.5, + null + ], + "hints": { + "index": 1544 + } + }, + { + "items": [ + 1303, + null + ], + "hints": { + "index": 1545 + } + }, + { + "items": [ + 1303.5, + null + ], + "hints": { + "index": 1546 + } + }, + { + "items": [ + 1304, + null + ], + "hints": { + "index": 1547 + } + }, + { + "items": [ + 1304.5, + null + ], + "hints": { + "index": 1548 + } + }, + { + "items": [ + 1305, + null + ], + "hints": { + "index": 1549 + } + }, + { + "items": [ + 1305.5, + null + ], + "hints": { + "index": 1550 + } + }, + { + "items": [ + 1306, + null + ], + "hints": { + "index": 1551 + } + }, + { + "items": [ + 1306.5, + null + ], + "hints": { + "index": 1552 + } + }, + { + "items": [ + 1307, + null + ], + "hints": { + "index": 1553 + } + }, + { + "items": [ + 1307.5, + null + ], + "hints": { + "index": 1554 + } + }, + { + "items": [ + 1308, + null + ], + "hints": { + "index": 1555 + } + }, + { + "items": [ + 1308.5, + null + ], + "hints": { + "index": 1556 + } + }, + { + "items": [ + 1309, + null + ], + "hints": { + "index": 1557 + } + }, + { + "items": [ + 1309.5, + null + ], + "hints": { + "index": 1558 + } + }, + { + "items": [ + 1310, + null + ], + "hints": { + "index": 1559 + } + }, + { + "items": [ + 1310.5, + null + ], + "hints": { + "index": 1560 + } + }, + { + "items": [ + 1311, + null + ], + "hints": { + "index": 1561 + } + }, + { + "items": [ + 1311.5, + null + ], + "hints": { + "index": 1562 + } + }, + { + "items": [ + 1312, + null + ], + "hints": { + "index": 1563 + } + }, + { + "items": [ + 1312.5, + null + ], + "hints": { + "index": 1564 + } + }, + { + "items": [ + 1313, + null + ], + "hints": { + "index": 1565 + } + }, + { + "items": [ + 1313.5, + null + ], + "hints": { + "index": 1566 + } + }, + { + "items": [ + 1314, + null + ], + "hints": { + "index": 1567 + } + }, + { + "items": [ + 1314.5, + null + ], + "hints": { + "index": 1568 + } + }, + { + "items": [ + 1315, + null + ], + "hints": { + "index": 1569 + } + }, + { + "items": [ + 1315.5, + null + ], + "hints": { + "index": 1570 + } + }, + { + "items": [ + 1316, + null + ], + "hints": { + "index": 1571 + } + }, + { + "items": [ + 1316.5, + null + ], + "hints": { + "index": 1572 + } + }, + { + "items": [ + 1317, + null + ], + "hints": { + "index": 1573 + } + }, + { + "items": [ + 1317.5, + null + ], + "hints": { + "index": 1574 + } + }, + { + "items": [ + 1318, + null + ], + "hints": { + "index": 1575 + } + }, + { + "items": [ + 1318.5, + null + ], + "hints": { + "index": 1576 + } + }, + { + "items": [ + 1319, + null + ], + "hints": { + "index": 1577 + } + }, + { + "items": [ + 1319.5, + null + ], + "hints": { + "index": 1578 + } + }, + { + "items": [ + 1320, + null + ], + "hints": { + "index": 1579 + } + }, + { + "items": [ + 1320.5, + null + ], + "hints": { + "index": 1580 + } + }, + { + "items": [ + 1321, + null + ], + "hints": { + "index": 1581 + } + }, + { + "items": [ + 1321.5, + null + ], + "hints": { + "index": 1582 + } + }, + { + "items": [ + 1322, + null + ], + "hints": { + "index": 1583 + } + }, + { + "items": [ + 1322.5, + null + ], + "hints": { + "index": 1584 + } + }, + { + "items": [ + 1323, + null + ], + "hints": { + "index": 1585 + } + }, + { + "items": [ + 1323.5, + null + ], + "hints": { + "index": 1586 + } + }, + { + "items": [ + 1324, + null + ], + "hints": { + "index": 1587 + } + }, + { + "items": [ + 1324.5, + null + ], + "hints": { + "index": 1588 + } + }, + { + "items": [ + 1325, + null + ], + "hints": { + "index": 1589 + } + }, + { + "items": [ + 1325.5, + null + ], + "hints": { + "index": 1590 + } + }, + { + "items": [ + 1326, + null + ], + "hints": { + "index": 1591 + } + }, + { + "items": [ + 1326.5, + null + ], + "hints": { + "index": 1592 + } + }, + { + "items": [ + 1327, + null + ], + "hints": { + "index": 1593 + } + }, + { + "items": [ + 1327.5, + null + ], + "hints": { + "index": 1594 + } + }, + { + "items": [ + 1328, + null + ], + "hints": { + "index": 1595 + } + }, + { + "items": [ + 1328.5, + null + ], + "hints": { + "index": 1596 + } + }, + { + "items": [ + 1329, + null + ], + "hints": { + "index": 1597 + } + }, + { + "items": [ + 1329.5, + null + ], + "hints": { + "index": 1598 + } + }, + { + "items": [ + 1330, + null + ], + "hints": { + "index": 1599 + } + }, + { + "items": [ + 1330.5, + null + ], + "hints": { + "index": 1600 + } + }, + { + "items": [ + 1331, + null + ], + "hints": { + "index": 1601 + } + }, + { + "items": [ + 1331.5, + null + ], + "hints": { + "index": 1602 + } + }, + { + "items": [ + 1332, + null + ], + "hints": { + "index": 1603 + } + }, + { + "items": [ + 1332.5, + null + ], + "hints": { + "index": 1604 + } + }, + { + "items": [ + 1333, + null + ], + "hints": { + "index": 1605 + } + }, + { + "items": [ + 1333.5, + null + ], + "hints": { + "index": 1606 + } + }, + { + "items": [ + 1334, + null + ], + "hints": { + "index": 1607 + } + }, + { + "items": [ + 1334.5, + null + ], + "hints": { + "index": 1608 + } + }, + { + "items": [ + 1335, + null + ], + "hints": { + "index": 1609 + } + }, + { + "items": [ + 1335.5, + null + ], + "hints": { + "index": 1610 + } + }, + { + "items": [ + 1336, + null + ], + "hints": { + "index": 1611 + } + }, + { + "items": [ + 1336.5, + null + ], + "hints": { + "index": 1612 + } + }, + { + "items": [ + 1337, + null + ], + "hints": { + "index": 1613 + } + }, + { + "items": [ + 1337.5, + null + ], + "hints": { + "index": 1614 + } + }, + { + "items": [ + 1338, + null + ], + "hints": { + "index": 1615 + } + }, + { + "items": [ + 1338.5, + null + ], + "hints": { + "index": 1616 + } + }, + { + "items": [ + 1339, + null + ], + "hints": { + "index": 1617 + } + }, + { + "items": [ + 1339.5, + null + ], + "hints": { + "index": 1618 + } + }, + { + "items": [ + 1340, + null + ], + "hints": { + "index": 1619 + } + }, + { + "items": [ + 1340.5, + null + ], + "hints": { + "index": 1620 + } + }, + { + "items": [ + 1341, + null + ], + "hints": { + "index": 1621 + } + }, + { + "items": [ + 1341.5, + null + ], + "hints": { + "index": 1622 + } + }, + { + "items": [ + 1342, + null + ], + "hints": { + "index": 1623 + } + }, + { + "items": [ + 1342.5, + null + ], + "hints": { + "index": 1624 + } + }, + { + "items": [ + 1343, + null + ], + "hints": { + "index": 1625 + } + }, + { + "items": [ + 1343.5, + null + ], + "hints": { + "index": 1626 + } + }, + { + "items": [ + 1344, + null + ], + "hints": { + "index": 1627 + } + }, + { + "items": [ + 1344.5, + null + ], + "hints": { + "index": 1628 + } + }, + { + "items": [ + 1345, + null + ], + "hints": { + "index": 1629 + } + }, + { + "items": [ + 1345.5, + null + ], + "hints": { + "index": 1630 + } + }, + { + "items": [ + 1346, + null + ], + "hints": { + "index": 1631 + } + }, + { + "items": [ + 1346.5, + null + ], + "hints": { + "index": 1632 + } + }, + { + "items": [ + 1347, + null + ], + "hints": { + "index": 1633 + } + }, + { + "items": [ + 1347.5, + null + ], + "hints": { + "index": 1634 + } + }, + { + "items": [ + 1348, + null + ], + "hints": { + "index": 1635 + } + }, + { + "items": [ + 1348.5, + null + ], + "hints": { + "index": 1636 + } + }, + { + "items": [ + 1349, + null + ], + "hints": { + "index": 1637 + } + }, + { + "items": [ + 1349.5, + null + ], + "hints": { + "index": 1638 + } + }, + { + "items": [ + 1350, + null + ], + "hints": { + "index": 1639 + } + }, + { + "items": [ + 1350.5, + null + ], + "hints": { + "index": 1640 + } + }, + { + "items": [ + 1351, + null + ], + "hints": { + "index": 1641 + } + }, + { + "items": [ + 1351.5, + null + ], + "hints": { + "index": 1642 + } + }, + { + "items": [ + 1352, + null + ], + "hints": { + "index": 1643 + } + }, + { + "items": [ + 1352.5, + null + ], + "hints": { + "index": 1644 + } + }, + { + "items": [ + 1353, + null + ], + "hints": { + "index": 1645 + } + }, + { + "items": [ + 1353.5, + null + ], + "hints": { + "index": 1646 + } + }, + { + "items": [ + 1354, + null + ], + "hints": { + "index": 1647 + } + }, + { + "items": [ + 1354.5, + null + ], + "hints": { + "index": 1648 + } + }, + { + "items": [ + 1355, + null + ], + "hints": { + "index": 1649 + } + }, + { + "items": [ + 1355.5, + null + ], + "hints": { + "index": 1650 + } + }, + { + "items": [ + 1356, + null + ], + "hints": { + "index": 1651 + } + }, + { + "items": [ + 1356.5, + null + ], + "hints": { + "index": 1652 + } + }, + { + "items": [ + 1357, + null + ], + "hints": { + "index": 1653 + } + }, + { + "items": [ + 1357.5, + null + ], + "hints": { + "index": 1654 + } + }, + { + "items": [ + 1358, + null + ], + "hints": { + "index": 1655 + } + }, + { + "items": [ + 1358.5, + null + ], + "hints": { + "index": 1656 + } + }, + { + "items": [ + 1359, + null + ], + "hints": { + "index": 1657 + } + }, + { + "items": [ + 1359.5, + null + ], + "hints": { + "index": 1658 + } + }, + { + "items": [ + 1360, + null + ], + "hints": { + "index": 1659 + } + }, + { + "items": [ + 1360.5, + null + ], + "hints": { + "index": 1660 + } + }, + { + "items": [ + 1361, + null + ], + "hints": { + "index": 1661 + } + }, + { + "items": [ + 1361.5, + null + ], + "hints": { + "index": 1662 + } + }, + { + "items": [ + 1362, + null + ], + "hints": { + "index": 1663 + } + }, + { + "items": [ + 1362.5, + null + ], + "hints": { + "index": 1664 + } + }, + { + "items": [ + 1363, + null + ], + "hints": { + "index": 1665 + } + }, + { + "items": [ + 1363.5, + null + ], + "hints": { + "index": 1666 + } + }, + { + "items": [ + 1364, + null + ], + "hints": { + "index": 1667 + } + }, + { + "items": [ + 1364.5, + null + ], + "hints": { + "index": 1668 + } + }, + { + "items": [ + 1365, + null + ], + "hints": { + "index": 1669 + } + }, + { + "items": [ + 1365.5, + null + ], + "hints": { + "index": 1670 + } + }, + { + "items": [ + 1366, + null + ], + "hints": { + "index": 1671 + } + }, + { + "items": [ + 1366.5, + null + ], + "hints": { + "index": 1672 + } + }, + { + "items": [ + 1367, + null + ], + "hints": { + "index": 1673 + } + }, + { + "items": [ + 1367.5, + null + ], + "hints": { + "index": 1674 + } + }, + { + "items": [ + 1368, + null + ], + "hints": { + "index": 1675 + } + }, + { + "items": [ + 1368.5, + null + ], + "hints": { + "index": 1676 + } + }, + { + "items": [ + 1369, + null + ], + "hints": { + "index": 1677 + } + }, + { + "items": [ + 1369.5, + null + ], + "hints": { + "index": 1678 + } + }, + { + "items": [ + 1370, + null + ], + "hints": { + "index": 1679 + } + }, + { + "items": [ + 1370.5, + null + ], + "hints": { + "index": 1680 + } + }, + { + "items": [ + 1371, + null + ], + "hints": { + "index": 1681 + } + }, + { + "items": [ + 1371.5, + null + ], + "hints": { + "index": 1682 + } + }, + { + "items": [ + 1372, + null + ], + "hints": { + "index": 1683 + } + }, + { + "items": [ + 1372.5, + null + ], + "hints": { + "index": 1684 + } + }, + { + "items": [ + 1373, + null + ], + "hints": { + "index": 1685 + } + }, + { + "items": [ + 1373.5, + null + ], + "hints": { + "index": 1686 + } + }, + { + "items": [ + 1374, + null + ], + "hints": { + "index": 1687 + } + }, + { + "items": [ + 1374.5, + null + ], + "hints": { + "index": 1688 + } + }, + { + "items": [ + 1375, + null + ], + "hints": { + "index": 1689 + } + }, + { + "items": [ + 1375.5, + null + ], + "hints": { + "index": 1690 + } + }, + { + "items": [ + 1376, + null + ], + "hints": { + "index": 1691 + } + }, + { + "items": [ + 1376.5, + null + ], + "hints": { + "index": 1692 + } + }, + { + "items": [ + 1377, + null + ], + "hints": { + "index": 1693 + } + }, + { + "items": [ + 1377.5, + null + ], + "hints": { + "index": 1694 + } + }, + { + "items": [ + 1378, + null + ], + "hints": { + "index": 1695 + } + }, + { + "items": [ + 1378.5, + null + ], + "hints": { + "index": 1696 + } + }, + { + "items": [ + 1379, + null + ], + "hints": { + "index": 1697 + } + }, + { + "items": [ + 1379.5, + null + ], + "hints": { + "index": 1698 + } + }, + { + "items": [ + 1380, + null + ], + "hints": { + "index": 1699 + } + }, + { + "items": [ + 1380.5, + null + ], + "hints": { + "index": 1700 + } + }, + { + "items": [ + 1381, + null + ], + "hints": { + "index": 1701 + } + }, + { + "items": [ + 1381.5, + null + ], + "hints": { + "index": 1702 + } + }, + { + "items": [ + 1382, + null + ], + "hints": { + "index": 1703 + } + }, + { + "items": [ + 1382.5, + null + ], + "hints": { + "index": 1704 + } + }, + { + "items": [ + 1383, + null + ], + "hints": { + "index": 1705 + } + }, + { + "items": [ + 1383.5, + null + ], + "hints": { + "index": 1706 + } + }, + { + "items": [ + 1384, + null + ], + "hints": { + "index": 1707 + } + }, + { + "items": [ + 1384.5, + null + ], + "hints": { + "index": 1708 + } + }, + { + "items": [ + 1385, + null + ], + "hints": { + "index": 1709 + } + }, + { + "items": [ + 1385.5, + null + ], + "hints": { + "index": 1710 + } + }, + { + "items": [ + 1386, + null + ], + "hints": { + "index": 1711 + } + }, + { + "items": [ + 1386.5, + null + ], + "hints": { + "index": 1712 + } + }, + { + "items": [ + 1387, + null + ], + "hints": { + "index": 1713 + } + }, + { + "items": [ + 1387.5, + null + ], + "hints": { + "index": 1714 + } + }, + { + "items": [ + 1388, + null + ], + "hints": { + "index": 1715 + } + }, + { + "items": [ + 1388.5, + null + ], + "hints": { + "index": 1716 + } + }, + { + "items": [ + 1389, + null + ], + "hints": { + "index": 1717 + } + }, + { + "items": [ + 1389.5, + null + ], + "hints": { + "index": 1718 + } + }, + { + "items": [ + 1390, + null + ], + "hints": { + "index": 1719 + } + }, + { + "items": [ + 1390.5, + null + ], + "hints": { + "index": 1720 + } + }, + { + "items": [ + 1391, + null + ], + "hints": { + "index": 1721 + } + }, + { + "items": [ + 1391.5, + null + ], + "hints": { + "index": 1722 + } + }, + { + "items": [ + 1392, + null + ], + "hints": { + "index": 1723 + } + }, + { + "items": [ + 1392.5, + null + ], + "hints": { + "index": 1724 + } + }, + { + "items": [ + 1393, + null + ], + "hints": { + "index": 1725 + } + }, + { + "items": [ + 1393.5, + null + ], + "hints": { + "index": 1726 + } + }, + { + "items": [ + 1394, + null + ], + "hints": { + "index": 1727 + } + }, + { + "items": [ + 1394.5, + null + ], + "hints": { + "index": 1728 + } + }, + { + "items": [ + 1395, + null + ], + "hints": { + "index": 1729 + } + }, + { + "items": [ + 1395.5, + null + ], + "hints": { + "index": 1730 + } + }, + { + "items": [ + 1396, + null + ], + "hints": { + "index": 1731 + } + }, + { + "items": [ + 1396.5, + null + ], + "hints": { + "index": 1732 + } + }, + { + "items": [ + 1397, + null + ], + "hints": { + "index": 1733 + } + }, + { + "items": [ + 1397.5, + null + ], + "hints": { + "index": 1734 + } + }, + { + "items": [ + 1398, + null + ], + "hints": { + "index": 1735 + } + }, + { + "items": [ + 1398.5, + null + ], + "hints": { + "index": 1736 + } + }, + { + "items": [ + 1399, + null + ], + "hints": { + "index": 1737 + } + }, + { + "items": [ + 1399.5, + null + ], + "hints": { + "index": 1738 + } + }, + { + "items": [ + 1400, + null + ], + "hints": { + "index": 1739 + } + }, + { + "items": [ + 1400.5, + null + ], + "hints": { + "index": 1740 + } + }, + { + "items": [ + 1401, + null + ], + "hints": { + "index": 1741 + } + }, + { + "items": [ + 1401.5, + null + ], + "hints": { + "index": 1742 + } + }, + { + "items": [ + 1402, + null + ], + "hints": { + "index": 1743 + } + }, + { + "items": [ + 1402.5, + null + ], + "hints": { + "index": 1744 + } + }, + { + "items": [ + 1403, + null + ], + "hints": { + "index": 1745 + } + }, + { + "items": [ + 1403.5, + null + ], + "hints": { + "index": 1746 + } + }, + { + "items": [ + 1404, + null + ], + "hints": { + "index": 1747 + } + }, + { + "items": [ + 1404.5, + null + ], + "hints": { + "index": 1748 + } + }, + { + "items": [ + 1405, + null + ], + "hints": { + "index": 1749 + } + }, + { + "items": [ + 1405.5, + null + ], + "hints": { + "index": 1750 + } + }, + { + "items": [ + 1406, + null + ], + "hints": { + "index": 1751 + } + }, + { + "items": [ + 1406.5, + null + ], + "hints": { + "index": 1752 + } + }, + { + "items": [ + 1407, + null + ], + "hints": { + "index": 1753 + } + }, + { + "items": [ + 1407.5, + null + ], + "hints": { + "index": 1754 + } + }, + { + "items": [ + 1408, + null + ], + "hints": { + "index": 1755 + } + }, + { + "items": [ + 1408.5, + null + ], + "hints": { + "index": 1756 + } + }, + { + "items": [ + 1409, + null + ], + "hints": { + "index": 1757 + } + }, + { + "items": [ + 1409.5, + null + ], + "hints": { + "index": 1758 + } + }, + { + "items": [ + 1410, + null + ], + "hints": { + "index": 1759 + } + }, + { + "items": [ + 1410.5, + null + ], + "hints": { + "index": 1760 + } + }, + { + "items": [ + 1411, + null + ], + "hints": { + "index": 1761 + } + }, + { + "items": [ + 1411.5, + null + ], + "hints": { + "index": 1762 + } + }, + { + "items": [ + 1412, + null + ], + "hints": { + "index": 1763 + } + }, + { + "items": [ + 1412.5, + null + ], + "hints": { + "index": 1764 + } + }, + { + "items": [ + 1413, + null + ], + "hints": { + "index": 1765 + } + }, + { + "items": [ + 1413.5, + null + ], + "hints": { + "index": 1766 + } + }, + { + "items": [ + 1414, + null + ], + "hints": { + "index": 1767 + } + }, + { + "items": [ + 1414.5, + null + ], + "hints": { + "index": 1768 + } + }, + { + "items": [ + 1415, + null + ], + "hints": { + "index": 1769 + } + }, + { + "items": [ + 1415.5, + null + ], + "hints": { + "index": 1770 + } + }, + { + "items": [ + 1416, + null + ], + "hints": { + "index": 1771 + } + }, + { + "items": [ + 1416.5, + null + ], + "hints": { + "index": 1772 + } + }, + { + "items": [ + 1417, + null + ], + "hints": { + "index": 1773 + } + }, + { + "items": [ + 1417.5, + null + ], + "hints": { + "index": 1774 + } + }, + { + "items": [ + 1418, + null + ], + "hints": { + "index": 1775 + } + }, + { + "items": [ + 1418.5, + null + ], + "hints": { + "index": 1776 + } + }, + { + "items": [ + 1419, + null + ], + "hints": { + "index": 1777 + } + }, + { + "items": [ + 1419.5, + null + ], + "hints": { + "index": 1778 + } + }, + { + "items": [ + 1420, + null + ], + "hints": { + "index": 1779 + } + }, + { + "items": [ + 1420.5, + null + ], + "hints": { + "index": 1780 + } + }, + { + "items": [ + 1421, + null + ], + "hints": { + "index": 1781 + } + }, + { + "items": [ + 1421.5, + null + ], + "hints": { + "index": 1782 + } + }, + { + "items": [ + 1422, + null + ], + "hints": { + "index": 1783 + } + }, + { + "items": [ + 1422.5, + null + ], + "hints": { + "index": 1784 + } + }, + { + "items": [ + 1423, + null + ], + "hints": { + "index": 1785 + } + }, + { + "items": [ + 1423.5, + null + ], + "hints": { + "index": 1786 + } + }, + { + "items": [ + 1424, + null + ], + "hints": { + "index": 1787 + } + }, + { + "items": [ + 1424.5, + null + ], + "hints": { + "index": 1788 + } + }, + { + "items": [ + 1425, + null + ], + "hints": { + "index": 1789 + } + }, + { + "items": [ + 1425.5, + null + ], + "hints": { + "index": 1790 + } + }, + { + "items": [ + 1426, + null + ], + "hints": { + "index": 1791 + } + }, + { + "items": [ + 1426.5, + null + ], + "hints": { + "index": 1792 + } + }, + { + "items": [ + 1427, + null + ], + "hints": { + "index": 1793 + } + }, + { + "items": [ + 1427.5, + null + ], + "hints": { + "index": 1794 + } + }, + { + "items": [ + 1428, + null + ], + "hints": { + "index": 1795 + } + }, + { + "items": [ + 1428.5, + null + ], + "hints": { + "index": 1796 + } + }, + { + "items": [ + 1429, + null + ], + "hints": { + "index": 1797 + } + }, + { + "items": [ + 1429.5, + null + ], + "hints": { + "index": 1798 + } + }, + { + "items": [ + 1430, + null + ], + "hints": { + "index": 1799 + } + }, + { + "items": [ + 1430.5, + null + ], + "hints": { + "index": 1800 + } + }, + { + "items": [ + 1431, + null + ], + "hints": { + "index": 1801 + } + }, + { + "items": [ + 1431.5, + null + ], + "hints": { + "index": 1802 + } + }, + { + "items": [ + 1432, + null + ], + "hints": { + "index": 1803 + } + }, + { + "items": [ + 1432.5, + null + ], + "hints": { + "index": 1804 + } + }, + { + "items": [ + 1433, + null + ], + "hints": { + "index": 1805 + } + }, + { + "items": [ + 1433.5, + null + ], + "hints": { + "index": 1806 + } + }, + { + "items": [ + 1434, + null + ], + "hints": { + "index": 1807 + } + }, + { + "items": [ + 1434.5, + null + ], + "hints": { + "index": 1808 + } + }, + { + "items": [ + 1435, + null + ], + "hints": { + "index": 1809 + } + }, + { + "items": [ + 1435.5, + null + ], + "hints": { + "index": 1810 + } + }, + { + "items": [ + 1436, + null + ], + "hints": { + "index": 1811 + } + }, + { + "items": [ + 1436.5, + null + ], + "hints": { + "index": 1812 + } + }, + { + "items": [ + 1437, + null + ], + "hints": { + "index": 1813 + } + }, + { + "items": [ + 1437.5, + null + ], + "hints": { + "index": 1814 + } + }, + { + "items": [ + 1438, + null + ], + "hints": { + "index": 1815 + } + }, + { + "items": [ + 1438.5, + null + ], + "hints": { + "index": 1816 + } + }, + { + "items": [ + 1439, + null + ], + "hints": { + "index": 1817 + } + }, + { + "items": [ + 1439.5, + null + ], + "hints": { + "index": 1818 + } + }, + { + "items": [ + 1440, + null + ], + "hints": { + "index": 1819 + } + }, + { + "items": [ + 1440.5, + null + ], + "hints": { + "index": 1820 + } + }, + { + "items": [ + 1441, + null + ], + "hints": { + "index": 1821 + } + }, + { + "items": [ + 1441.5, + null + ], + "hints": { + "index": 1822 + } + }, + { + "items": [ + 1442, + null + ], + "hints": { + "index": 1823 + } + }, + { + "items": [ + 1442.5, + null + ], + "hints": { + "index": 1824 + } + }, + { + "items": [ + 1443, + null + ], + "hints": { + "index": 1825 + } + }, + { + "items": [ + 1443.5, + null + ], + "hints": { + "index": 1826 + } + }, + { + "items": [ + 1444, + null + ], + "hints": { + "index": 1827 + } + }, + { + "items": [ + 1444.5, + null + ], + "hints": { + "index": 1828 + } + }, + { + "items": [ + 1445, + null + ], + "hints": { + "index": 1829 + } + }, + { + "items": [ + 1445.5, + null + ], + "hints": { + "index": 1830 + } + }, + { + "items": [ + 1446, + null + ], + "hints": { + "index": 1831 + } + }, + { + "items": [ + 1446.5, + null + ], + "hints": { + "index": 1832 + } + }, + { + "items": [ + 1447, + null + ], + "hints": { + "index": 1833 + } + }, + { + "items": [ + 1447.5, + null + ], + "hints": { + "index": 1834 + } + }, + { + "items": [ + 1448, + null + ], + "hints": { + "index": 1835 + } + }, + { + "items": [ + 1448.5, + null + ], + "hints": { + "index": 1836 + } + }, + { + "items": [ + 1449, + null + ], + "hints": { + "index": 1837 + } + }, + { + "items": [ + 1449.5, + null + ], + "hints": { + "index": 1838 + } + }, + { + "items": [ + 1450, + null + ], + "hints": { + "index": 1839 + } + }, + { + "items": [ + 1450.5, + null + ], + "hints": { + "index": 1840 + } + }, + { + "items": [ + 1451, + null + ], + "hints": { + "index": 1841 + } + }, + { + "items": [ + 1451.5, + null + ], + "hints": { + "index": 1842 + } + }, + { + "items": [ + 1452, + null + ], + "hints": { + "index": 1843 + } + }, + { + "items": [ + 1452.5, + null + ], + "hints": { + "index": 1844 + } + }, + { + "items": [ + 1453, + null + ], + "hints": { + "index": 1845 + } + }, + { + "items": [ + 1453.5, + null + ], + "hints": { + "index": 1846 + } + }, + { + "items": [ + 1454, + null + ], + "hints": { + "index": 1847 + } + }, + { + "items": [ + 1454.5, + null + ], + "hints": { + "index": 1848 + } + }, + { + "items": [ + 1455, + null + ], + "hints": { + "index": 1849 + } + }, + { + "items": [ + 1455.5, + null + ], + "hints": { + "index": 1850 + } + }, + { + "items": [ + 1456, + null + ], + "hints": { + "index": 1851 + } + }, + { + "items": [ + 1456.5, + null + ], + "hints": { + "index": 1852 + } + }, + { + "items": [ + 1457, + null + ], + "hints": { + "index": 1853 + } + }, + { + "items": [ + 1457.5, + null + ], + "hints": { + "index": 1854 + } + }, + { + "items": [ + 1458, + null + ], + "hints": { + "index": 1855 + } + }, + { + "items": [ + 1458.5, + null + ], + "hints": { + "index": 1856 + } + }, + { + "items": [ + 1459, + null + ], + "hints": { + "index": 1857 + } + }, + { + "items": [ + 1459.5, + null + ], + "hints": { + "index": 1858 + } + }, + { + "items": [ + 1460, + null + ], + "hints": { + "index": 1859 + } + }, + { + "items": [ + 1460.5, + null + ], + "hints": { + "index": 1860 + } + }, + { + "items": [ + 1461, + null + ], + "hints": { + "index": 1861 + } + }, + { + "items": [ + 1461.5, + null + ], + "hints": { + "index": 1862 + } + }, + { + "items": [ + 1462, + null + ], + "hints": { + "index": 1863 + } + }, + { + "items": [ + 1462.5, + null + ], + "hints": { + "index": 1864 + } + }, + { + "items": [ + 1463, + null + ], + "hints": { + "index": 1865 + } + }, + { + "items": [ + 1463.5, + null + ], + "hints": { + "index": 1866 + } + }, + { + "items": [ + 1464, + null + ], + "hints": { + "index": 1867 + } + }, + { + "items": [ + 1464.5, + null + ], + "hints": { + "index": 1868 + } + }, + { + "items": [ + 1465, + null + ], + "hints": { + "index": 1869 + } + }, + { + "items": [ + 1465.5, + null + ], + "hints": { + "index": 1870 + } + }, + { + "items": [ + 1466, + null + ], + "hints": { + "index": 1871 + } + }, + { + "items": [ + 1466.5, + null + ], + "hints": { + "index": 1872 + } + }, + { + "items": [ + 1467, + null + ], + "hints": { + "index": 1873 + } + }, + { + "items": [ + 1467.5, + null + ], + "hints": { + "index": 1874 + } + }, + { + "items": [ + 1468, + null + ], + "hints": { + "index": 1875 + } + }, + { + "items": [ + 1468.5, + null + ], + "hints": { + "index": 1876 + } + }, + { + "items": [ + 1469, + null + ], + "hints": { + "index": 1877 + } + }, + { + "items": [ + 1469.5, + null + ], + "hints": { + "index": 1878 + } + }, + { + "items": [ + 1470, + null + ], + "hints": { + "index": 1879 + } + }, + { + "items": [ + 1470.5, + null + ], + "hints": { + "index": 1880 + } + }, + { + "items": [ + 1471, + null + ], + "hints": { + "index": 1881 + } + }, + { + "items": [ + 1471.5, + null + ], + "hints": { + "index": 1882 + } + }, + { + "items": [ + 1472, + null + ], + "hints": { + "index": 1883 + } + }, + { + "items": [ + 1472.5, + null + ], + "hints": { + "index": 1884 + } + }, + { + "items": [ + 1473, + null + ], + "hints": { + "index": 1885 + } + }, + { + "items": [ + 1473.5, + null + ], + "hints": { + "index": 1886 + } + }, + { + "items": [ + 1474, + null + ], + "hints": { + "index": 1887 + } + }, + { + "items": [ + 1474.5, + null + ], + "hints": { + "index": 1888 + } + }, + { + "items": [ + 1475, + null + ], + "hints": { + "index": 1889 + } + }, + { + "items": [ + 1475.5, + null + ], + "hints": { + "index": 1890 + } + }, + { + "items": [ + 1476, + null + ], + "hints": { + "index": 1891 + } + }, + { + "items": [ + 1476.5, + null + ], + "hints": { + "index": 1892 + } + }, + { + "items": [ + 1477, + null + ], + "hints": { + "index": 1893 + } + }, + { + "items": [ + 1477.5, + null + ], + "hints": { + "index": 1894 + } + }, + { + "items": [ + 1478, + null + ], + "hints": { + "index": 1895 + } + }, + { + "items": [ + 1478.5, + null + ], + "hints": { + "index": 1896 + } + }, + { + "items": [ + 1479, + null + ], + "hints": { + "index": 1897 + } + }, + { + "items": [ + 1479.5, + null + ], + "hints": { + "index": 1898 + } + }, + { + "items": [ + 1480, + null + ], + "hints": { + "index": 1899 + } + }, + { + "items": [ + 1480.5, + null + ], + "hints": { + "index": 1900 + } + }, + { + "items": [ + 1481, + null + ], + "hints": { + "index": 1901 + } + }, + { + "items": [ + 1481.5, + null + ], + "hints": { + "index": 1902 + } + }, + { + "items": [ + 1482, + null + ], + "hints": { + "index": 1903 + } + }, + { + "items": [ + 1482.5, + null + ], + "hints": { + "index": 1904 + } + }, + { + "items": [ + 1483, + null + ], + "hints": { + "index": 1905 + } + }, + { + "items": [ + 1483.5, + null + ], + "hints": { + "index": 1906 + } + }, + { + "items": [ + 1484, + null + ], + "hints": { + "index": 1907 + } + }, + { + "items": [ + 1484.5, + null + ], + "hints": { + "index": 1908 + } + }, + { + "items": [ + 1485, + null + ], + "hints": { + "index": 1909 + } + }, + { + "items": [ + 1485.5, + null + ], + "hints": { + "index": 1910 + } + }, + { + "items": [ + 1486, + null + ], + "hints": { + "index": 1911 + } + }, + { + "items": [ + 1486.5, + null + ], + "hints": { + "index": 1912 + } + }, + { + "items": [ + 1487, + null + ], + "hints": { + "index": 1913 + } + }, + { + "items": [ + 1487.5, + null + ], + "hints": { + "index": 1914 + } + }, + { + "items": [ + 1488, + null + ], + "hints": { + "index": 1915 + } + }, + { + "items": [ + 1488.5, + null + ], + "hints": { + "index": 1916 + } + }, + { + "items": [ + 1489, + null + ], + "hints": { + "index": 1917 + } + }, + { + "items": [ + 1489.5, + null + ], + "hints": { + "index": 1918 + } + }, + { + "items": [ + 1490, + null + ], + "hints": { + "index": 1919 + } + }, + { + "items": [ + 1490.5, + null + ], + "hints": { + "index": 1920 + } + }, + { + "items": [ + 1491, + null + ], + "hints": { + "index": 1921 + } + }, + { + "items": [ + 1491.5, + null + ], + "hints": { + "index": 1922 + } + }, + { + "items": [ + 1492, + null + ], + "hints": { + "index": 1923 + } + }, + { + "items": [ + 1492.5, + null + ], + "hints": { + "index": 1924 + } + }, + { + "items": [ + 1493, + null + ], + "hints": { + "index": 1925 + } + }, + { + "items": [ + 1493.5, + null + ], + "hints": { + "index": 1926 + } + }, + { + "items": [ + 1494, + null + ], + "hints": { + "index": 1927 + } + }, + { + "items": [ + 1494.5, + null + ], + "hints": { + "index": 1928 + } + }, + { + "items": [ + 1495, + null + ], + "hints": { + "index": 1929 + } + }, + { + "items": [ + 1495.5, + null + ], + "hints": { + "index": 1930 + } + }, + { + "items": [ + 1496, + null + ], + "hints": { + "index": 1931 + } + }, + { + "items": [ + 1496.5, + null + ], + "hints": { + "index": 1932 + } + }, + { + "items": [ + 1497, + null + ], + "hints": { + "index": 1933 + } + }, + { + "items": [ + 1497.5, + null + ], + "hints": { + "index": 1934 + } + }, + { + "items": [ + 1498, + null + ], + "hints": { + "index": 1935 + } + }, + { + "items": [ + 1498.5, + null + ], + "hints": { + "index": 1936 + } + }, + { + "items": [ + 1499, + null + ], + "hints": { + "index": 1937 + } + }, + { + "items": [ + 1499.5, + null + ], + "hints": { + "index": 1938 + } + }, + { + "items": [ + 1500, + null + ], + "hints": { + "index": 1939 + } + }, + { + "items": [ + 1500.5, + null + ], + "hints": { + "index": 1940 + } + }, + { + "items": [ + 1501, + null + ], + "hints": { + "index": 1941 + } + }, + { + "items": [ + 1501.5, + null + ], + "hints": { + "index": 1942 + } + }, + { + "items": [ + 1502, + null + ], + "hints": { + "index": 1943 + } + }, + { + "items": [ + 1502.5, + null + ], + "hints": { + "index": 1944 + } + }, + { + "items": [ + 1503, + null + ], + "hints": { + "index": 1945 + } + }, + { + "items": [ + 1503.5, + null + ], + "hints": { + "index": 1946 + } + }, + { + "items": [ + 1504, + null + ], + "hints": { + "index": 1947 + } + }, + { + "items": [ + 1504.5, + null + ], + "hints": { + "index": 1948 + } + }, + { + "items": [ + 1505, + null + ], + "hints": { + "index": 1949 + } + }, + { + "items": [ + 1505.5, + null + ], + "hints": { + "index": 1950 + } + }, + { + "items": [ + 1506, + null + ], + "hints": { + "index": 1951 + } + }, + { + "items": [ + 1506.5, + null + ], + "hints": { + "index": 1952 + } + }, + { + "items": [ + 1507, + null + ], + "hints": { + "index": 1953 + } + }, + { + "items": [ + 1507.5, + null + ], + "hints": { + "index": 1954 + } + }, + { + "items": [ + 1508, + null + ], + "hints": { + "index": 1955 + } + }, + { + "items": [ + 1508.5, + null + ], + "hints": { + "index": 1956 + } + }, + { + "items": [ + 1509, + null + ], + "hints": { + "index": 1957 + } + }, + { + "items": [ + 1509.5, + null + ], + "hints": { + "index": 1958 + } + }, + { + "items": [ + 1510, + null + ], + "hints": { + "index": 1959 + } + }, + { + "items": [ + 1510.5, + null + ], + "hints": { + "index": 1960 + } + }, + { + "items": [ + 1511, + null + ], + "hints": { + "index": 1961 + } + }, + { + "items": [ + 1511.5, + null + ], + "hints": { + "index": 1962 + } + }, + { + "items": [ + 1512, + null + ], + "hints": { + "index": 1963 + } + }, + { + "items": [ + 1512.5, + null + ], + "hints": { + "index": 1964 + } + }, + { + "items": [ + 1513, + null + ], + "hints": { + "index": 1965 + } + }, + { + "items": [ + 1513.5, + null + ], + "hints": { + "index": 1966 + } + }, + { + "items": [ + 1514, + null + ], + "hints": { + "index": 1967 + } + }, + { + "items": [ + 1514.5, + null + ], + "hints": { + "index": 1968 + } + }, + { + "items": [ + 1515, + null + ], + "hints": { + "index": 1969 + } + }, + { + "items": [ + 1515.5, + null + ], + "hints": { + "index": 1970 + } + }, + { + "items": [ + 1516, + null + ], + "hints": { + "index": 1971 + } + }, + { + "items": [ + 1516.5, + null + ], + "hints": { + "index": 1972 + } + }, + { + "items": [ + 1517, + null + ], + "hints": { + "index": 1973 + } + }, + { + "items": [ + 1517.5, + null + ], + "hints": { + "index": 1974 + } + }, + { + "items": [ + 1518, + null + ], + "hints": { + "index": 1975 + } + }, + { + "items": [ + 1518.5, + null + ], + "hints": { + "index": 1976 + } + }, + { + "items": [ + 1519, + null + ], + "hints": { + "index": 1977 + } + }, + { + "items": [ + 1519.5, + null + ], + "hints": { + "index": 1978 + } + }, + { + "items": [ + 1520, + null + ], + "hints": { + "index": 1979 + } + }, + { + "items": [ + 1520.5, + null + ], + "hints": { + "index": 1980 + } + }, + { + "items": [ + 1521, + null + ], + "hints": { + "index": 1981 + } + }, + { + "items": [ + 1521.5, + null + ], + "hints": { + "index": 1982 + } + }, + { + "items": [ + 1522, + null + ], + "hints": { + "index": 1983 + } + }, + { + "items": [ + 1522.5, + null + ], + "hints": { + "index": 1984 + } + }, + { + "items": [ + 1523, + null + ], + "hints": { + "index": 1985 + } + }, + { + "items": [ + 1523.5, + null + ], + "hints": { + "index": 1986 + } + }, + { + "items": [ + 1524, + null + ], + "hints": { + "index": 1987 + } + }, + { + "items": [ + 1524.5, + null + ], + "hints": { + "index": 1988 + } + }, + { + "items": [ + 1525, + null + ], + "hints": { + "index": 1989 + } + }, + { + "items": [ + 1525.5, + null + ], + "hints": { + "index": 1990 + } + }, + { + "items": [ + 1526, + null + ], + "hints": { + "index": 1991 + } + }, + { + "items": [ + 1526.5, + null + ], + "hints": { + "index": 1992 + } + }, + { + "items": [ + 1527, + null + ], + "hints": { + "index": 1993 + } + }, + { + "items": [ + 1527.5, + null + ], + "hints": { + "index": 1994 + } + }, + { + "items": [ + 1528, + null + ], + "hints": { + "index": 1995 + } + }, + { + "items": [ + 1528.5, + null + ], + "hints": { + "index": 1996 + } + }, + { + "items": [ + 1529, + null + ], + "hints": { + "index": 1997 + } + }, + { + "items": [ + 1529.5, + null + ], + "hints": { + "index": 1998 + } + }, + { + "items": [ + 1530, + null + ], + "hints": { + "index": 1999 + } + }, + { + "items": [ + 1530.5, + null + ], + "hints": { + "index": 2000 + } + }, + { + "items": [ + 1531, + null + ], + "hints": { + "index": 2001 + } + }, + { + "items": [ + 1531.5, + null + ], + "hints": { + "index": 2002 + } + }, + { + "items": [ + 1532, + null + ], + "hints": { + "index": 2003 + } + }, + { + "items": [ + 1532.5, + null + ], + "hints": { + "index": 2004 + } + }, + { + "items": [ + 1533, + null + ], + "hints": { + "index": 2005 + } + }, + { + "items": [ + 1533.5, + null + ], + "hints": { + "index": 2006 + } + }, + { + "items": [ + 1534, + null + ], + "hints": { + "index": 2007 + } + }, + { + "items": [ + 1534.5, + null + ], + "hints": { + "index": 2008 + } + }, + { + "items": [ + 1535, + null + ], + "hints": { + "index": 2009 + } + }, + { + "items": [ + 1535.5, + null + ], + "hints": { + "index": 2010 + } + }, + { + "items": [ + 1536, + null + ], + "hints": { + "index": 2011 + } + }, + { + "items": [ + 1536.5, + null + ], + "hints": { + "index": 2012 + } + }, + { + "items": [ + 1537, + null + ], + "hints": { + "index": 2013 + } + }, + { + "items": [ + 1537.5, + null + ], + "hints": { + "index": 2014 + } + }, + { + "items": [ + 1538, + null + ], + "hints": { + "index": 2015 + } + }, + { + "items": [ + 1538.5, + null + ], + "hints": { + "index": 2016 + } + }, + { + "items": [ + 1539, + null + ], + "hints": { + "index": 2017 + } + }, + { + "items": [ + 1539.5, + null + ], + "hints": { + "index": 2018 + } + }, + { + "items": [ + 1540, + null + ], + "hints": { + "index": 2019 + } + }, + { + "items": [ + 1540.5, + null + ], + "hints": { + "index": 2020 + } + }, + { + "items": [ + 1541, + null + ], + "hints": { + "index": 2021 + } + }, + { + "items": [ + 1541.5, + null + ], + "hints": { + "index": 2022 + } + }, + { + "items": [ + 1542, + null + ], + "hints": { + "index": 2023 + } + }, + { + "items": [ + 1542.5, + null + ], + "hints": { + "index": 2024 + } + }, + { + "items": [ + 1543, + null + ], + "hints": { + "index": 2025 + } + }, + { + "items": [ + 1543.5, + null + ], + "hints": { + "index": 2026 + } + }, + { + "items": [ + 1544, + null + ], + "hints": { + "index": 2027 + } + }, + { + "items": [ + 1544.5, + null + ], + "hints": { + "index": 2028 + } + }, + { + "items": [ + 1545, + null + ], + "hints": { + "index": 2029 + } + }, + { + "items": [ + 1545.5, + null + ], + "hints": { + "index": 2030 + } + }, + { + "items": [ + 1546, + null + ], + "hints": { + "index": 2031 + } + }, + { + "items": [ + 1546.5, + null + ], + "hints": { + "index": 2032 + } + }, + { + "items": [ + 1547, + null + ], + "hints": { + "index": 2033 + } + }, + { + "items": [ + 1547.5, + null + ], + "hints": { + "index": 2034 + } + }, + { + "items": [ + 1548, + null + ], + "hints": { + "index": 2035 + } + }, + { + "items": [ + 1548.5, + null + ], + "hints": { + "index": 2036 + } + }, + { + "items": [ + 1549, + null + ], + "hints": { + "index": 2037 + } + }, + { + "items": [ + 1549.5, + null + ], + "hints": { + "index": 2038 + } + }, + { + "items": [ + 1550, + null + ], + "hints": { + "index": 2039 + } + }, + { + "items": [ + 1550.5, + null + ], + "hints": { + "index": 2040 + } + }, + { + "items": [ + 1551, + null + ], + "hints": { + "index": 2041 + } + }, + { + "items": [ + 1551.5, + null + ], + "hints": { + "index": 2042 + } + }, + { + "items": [ + 1552, + null + ], + "hints": { + "index": 2043 + } + }, + { + "items": [ + 1552.5, + null + ], + "hints": { + "index": 2044 + } + }, + { + "items": [ + 1553, + null + ], + "hints": { + "index": 2045 + } + }, + { + "items": [ + 1553.5, + null + ], + "hints": { + "index": 2046 + } + }, + { + "items": [ + 1554, + null + ], + "hints": { + "index": 2047 + } + }, + { + "items": [ + 1554.5, + null + ], + "hints": { + "index": 2048 + } + }, + { + "items": [ + 1555, + null + ], + "hints": { + "index": 2049 + } + }, + { + "items": [ + 1555.5, + null + ], + "hints": { + "index": 2050 + } + }, + { + "items": [ + 1556, + null + ], + "hints": { + "index": 2051 + } + }, + { + "items": [ + 1556.5, + null + ], + "hints": { + "index": 2052 + } + }, + { + "items": [ + 1557, + null + ], + "hints": { + "index": 2053 + } + }, + { + "items": [ + 1557.5, + null + ], + "hints": { + "index": 2054 + } + }, + { + "items": [ + 1558, + null + ], + "hints": { + "index": 2055 + } + }, + { + "items": [ + 1558.5, + null + ], + "hints": { + "index": 2056 + } + }, + { + "items": [ + 1559, + null + ], + "hints": { + "index": 2057 + } + }, + { + "items": [ + 1559.5, + null + ], + "hints": { + "index": 2058 + } + }, + { + "items": [ + 1560, + null + ], + "hints": { + "index": 2059 + } + }, + { + "items": [ + 1560.5, + null + ], + "hints": { + "index": 2060 + } + }, + { + "items": [ + 1561, + null + ], + "hints": { + "index": 2061 + } + }, + { + "items": [ + 1561.5, + null + ], + "hints": { + "index": 2062 + } + }, + { + "items": [ + 1562, + null + ], + "hints": { + "index": 2063 + } + }, + { + "items": [ + 1562.5, + null + ], + "hints": { + "index": 2064 + } + }, + { + "items": [ + 1563, + null + ], + "hints": { + "index": 2065 + } + }, + { + "items": [ + 1563.5, + null + ], + "hints": { + "index": 2066 + } + }, + { + "items": [ + 1564, + null + ], + "hints": { + "index": 2067 + } + }, + { + "items": [ + 1564.5, + null + ], + "hints": { + "index": 2068 + } + }, + { + "items": [ + 1565, + null + ], + "hints": { + "index": 2069 + } + }, + { + "items": [ + 1565.5, + null + ], + "hints": { + "index": 2070 + } + }, + { + "items": [ + 1566, + null + ], + "hints": { + "index": 2071 + } + }, + { + "items": [ + 1566.5, + null + ], + "hints": { + "index": 2072 + } + }, + { + "items": [ + 1567, + null + ], + "hints": { + "index": 2073 + } + }, + { + "items": [ + 1567.5, + null + ], + "hints": { + "index": 2074 + } + }, + { + "items": [ + 1568, + null + ], + "hints": { + "index": 2075 + } + }, + { + "items": [ + 1568.5, + null + ], + "hints": { + "index": 2076 + } + }, + { + "items": [ + 1569, + null + ], + "hints": { + "index": 2077 + } + }, + { + "items": [ + 1569.5, + null + ], + "hints": { + "index": 2078 + } + }, + { + "items": [ + 1570, + null + ], + "hints": { + "index": 2079 + } + }, + { + "items": [ + 1570.5, + null + ], + "hints": { + "index": 2080 + } + }, + { + "items": [ + 1571, + null + ], + "hints": { + "index": 2081 + } + }, + { + "items": [ + 1571.5, + null + ], + "hints": { + "index": 2082 + } + }, + { + "items": [ + 1572, + null + ], + "hints": { + "index": 2083 + } + }, + { + "items": [ + 1572.5, + null + ], + "hints": { + "index": 2084 + } + }, + { + "items": [ + 1573, + null + ], + "hints": { + "index": 2085 + } + }, + { + "items": [ + 1573.5, + null + ], + "hints": { + "index": 2086 + } + }, + { + "items": [ + 1574, + null + ], + "hints": { + "index": 2087 + } + }, + { + "items": [ + 1574.5, + null + ], + "hints": { + "index": 2088 + } + }, + { + "items": [ + 1575, + null + ], + "hints": { + "index": 2089 + } + }, + { + "items": [ + 1575.5, + null + ], + "hints": { + "index": 2090 + } + }, + { + "items": [ + 1576, + null + ], + "hints": { + "index": 2091 + } + }, + { + "items": [ + 1576.5, + null + ], + "hints": { + "index": 2092 + } + }, + { + "items": [ + 1577, + null + ], + "hints": { + "index": 2093 + } + }, + { + "items": [ + 1577.5, + null + ], + "hints": { + "index": 2094 + } + }, + { + "items": [ + 1578, + null + ], + "hints": { + "index": 2095 + } + }, + { + "items": [ + 1578.5, + null + ], + "hints": { + "index": 2096 + } + }, + { + "items": [ + 1579, + null + ], + "hints": { + "index": 2097 + } + }, + { + "items": [ + 1579.5, + null + ], + "hints": { + "index": 2098 + } + }, + { + "items": [ + 1580, + null + ], + "hints": { + "index": 2099 + } + }, + { + "items": [ + 1580.5, + null + ], + "hints": { + "index": 2100 + } + }, + { + "items": [ + 1581, + null + ], + "hints": { + "index": 2101 + } + }, + { + "items": [ + 1581.5, + null + ], + "hints": { + "index": 2102 + } + }, + { + "items": [ + 1582, + null + ], + "hints": { + "index": 2103 + } + }, + { + "items": [ + 1582.5, + null + ], + "hints": { + "index": 2104 + } + }, + { + "items": [ + 1583, + null + ], + "hints": { + "index": 2105 + } + }, + { + "items": [ + 1583.5, + null + ], + "hints": { + "index": 2106 + } + }, + { + "items": [ + 1584, + null + ], + "hints": { + "index": 2107 + } + }, + { + "items": [ + 1584.5, + null + ], + "hints": { + "index": 2108 + } + }, + { + "items": [ + 1585, + null + ], + "hints": { + "index": 2109 + } + }, + { + "items": [ + 1585.5, + null + ], + "hints": { + "index": 2110 + } + }, + { + "items": [ + 1586, + null + ], + "hints": { + "index": 2111 + } + }, + { + "items": [ + 1586.5, + null + ], + "hints": { + "index": 2112 + } + }, + { + "items": [ + 1587, + null + ], + "hints": { + "index": 2113 + } + }, + { + "items": [ + 1587.5, + null + ], + "hints": { + "index": 2114 + } + }, + { + "items": [ + 1588, + null + ], + "hints": { + "index": 2115 + } + }, + { + "items": [ + 1588.5, + null + ], + "hints": { + "index": 2116 + } + }, + { + "items": [ + 1589, + null + ], + "hints": { + "index": 2117 + } + }, + { + "items": [ + 1589.5, + null + ], + "hints": { + "index": 2118 + } + }, + { + "items": [ + 1590, + null + ], + "hints": { + "index": 2119 + } + }, + { + "items": [ + 1590.5, + null + ], + "hints": { + "index": 2120 + } + }, + { + "items": [ + 1591, + null + ], + "hints": { + "index": 2121 + } + }, + { + "items": [ + 1591.5, + null + ], + "hints": { + "index": 2122 + } + }, + { + "items": [ + 1592, + null + ], + "hints": { + "index": 2123 + } + }, + { + "items": [ + 1592.5, + null + ], + "hints": { + "index": 2124 + } + }, + { + "items": [ + 1593, + null + ], + "hints": { + "index": 2125 + } + }, + { + "items": [ + 1593.5, + null + ], + "hints": { + "index": 2126 + } + }, + { + "items": [ + 1594, + null + ], + "hints": { + "index": 2127 + } + }, + { + "items": [ + 1594.5, + null + ], + "hints": { + "index": 2128 + } + }, + { + "items": [ + 1595, + null + ], + "hints": { + "index": 2129 + } + }, + { + "items": [ + 1595.5, + null + ], + "hints": { + "index": 2130 + } + }, + { + "items": [ + 1596, + null + ], + "hints": { + "index": 2131 + } + }, + { + "items": [ + 1596.5, + null + ], + "hints": { + "index": 2132 + } + }, + { + "items": [ + 1597, + null + ], + "hints": { + "index": 2133 + } + }, + { + "items": [ + 1597.5, + null + ], + "hints": { + "index": 2134 + } + }, + { + "items": [ + 1598, + null + ], + "hints": { + "index": 2135 + } + }, + { + "items": [ + 1598.5, + null + ], + "hints": { + "index": 2136 + } + }, + { + "items": [ + 1599, + null + ], + "hints": { + "index": 2137 + } + }, + { + "items": [ + 1599.5, + null + ], + "hints": { + "index": 2138 + } + }, + { + "items": [ + 1600, + null + ], + "hints": { + "index": 2139 + } + }, + { + "items": [ + 1600.5, + null + ], + "hints": { + "index": 2140 + } + }, + { + "items": [ + 1601, + null + ], + "hints": { + "index": 2141 + } + }, + { + "items": [ + 1601.5, + null + ], + "hints": { + "index": 2142 + } + }, + { + "items": [ + 1602, + null + ], + "hints": { + "index": 2143 + } + }, + { + "items": [ + 1602.5, + null + ], + "hints": { + "index": 2144 + } + }, + { + "items": [ + 1603, + null + ], + "hints": { + "index": 2145 + } + }, + { + "items": [ + 1603.5, + null + ], + "hints": { + "index": 2146 + } + }, + { + "items": [ + 1604, + null + ], + "hints": { + "index": 2147 + } + }, + { + "items": [ + 1604.5, + null + ], + "hints": { + "index": 2148 + } + }, + { + "items": [ + 1605, + null + ], + "hints": { + "index": 2149 + } + }, + { + "items": [ + 1605.5, + null + ], + "hints": { + "index": 2150 + } + }, + { + "items": [ + 1606, + null + ], + "hints": { + "index": 2151 + } + }, + { + "items": [ + 1606.5, + null + ], + "hints": { + "index": 2152 + } + }, + { + "items": [ + 1607, + null + ], + "hints": { + "index": 2153 + } + }, + { + "items": [ + 1607.5, + null + ], + "hints": { + "index": 2154 + } + }, + { + "items": [ + 1608, + null + ], + "hints": { + "index": 2155 + } + }, + { + "items": [ + 1608.5, + null + ], + "hints": { + "index": 2156 + } + }, + { + "items": [ + 1609, + null + ], + "hints": { + "index": 2157 + } + }, + { + "items": [ + 1609.5, + null + ], + "hints": { + "index": 2158 + } + }, + { + "items": [ + 1610, + null + ], + "hints": { + "index": 2159 + } + }, + { + "items": [ + 1610.5, + null + ], + "hints": { + "index": 2160 + } + }, + { + "items": [ + 1611, + null + ], + "hints": { + "index": 2161 + } + }, + { + "items": [ + 1611.5, + null + ], + "hints": { + "index": 2162 + } + }, + { + "items": [ + 1612, + null + ], + "hints": { + "index": 2163 + } + }, + { + "items": [ + 1612.5, + null + ], + "hints": { + "index": 2164 + } + }, + { + "items": [ + 1613, + null + ], + "hints": { + "index": 2165 + } + }, + { + "items": [ + 1613.5, + null + ], + "hints": { + "index": 2166 + } + }, + { + "items": [ + 1614, + null + ], + "hints": { + "index": 2167 + } + }, + { + "items": [ + 1614.5, + null + ], + "hints": { + "index": 2168 + } + }, + { + "items": [ + 1615, + null + ], + "hints": { + "index": 2169 + } + }, + { + "items": [ + 1615.5, + null + ], + "hints": { + "index": 2170 + } + }, + { + "items": [ + 1616, + null + ], + "hints": { + "index": 2171 + } + }, + { + "items": [ + 1616.5, + null + ], + "hints": { + "index": 2172 + } + }, + { + "items": [ + 1617, + null + ], + "hints": { + "index": 2173 + } + }, + { + "items": [ + 1617.5, + null + ], + "hints": { + "index": 2174 + } + }, + { + "items": [ + 1618, + null + ], + "hints": { + "index": 2175 + } + }, + { + "items": [ + 1618.5, + null + ], + "hints": { + "index": 2176 + } + }, + { + "items": [ + 1619, + null + ], + "hints": { + "index": 2177 + } + }, + { + "items": [ + 1619.5, + null + ], + "hints": { + "index": 2178 + } + }, + { + "items": [ + 1620, + null + ], + "hints": { + "index": 2179 + } + }, + { + "items": [ + 1620.5, + null + ], + "hints": { + "index": 2180 + } + }, + { + "items": [ + 1621, + null + ], + "hints": { + "index": 2181 + } + }, + { + "items": [ + 1621.5, + null + ], + "hints": { + "index": 2182 + } + }, + { + "items": [ + 1622, + null + ], + "hints": { + "index": 2183 + } + }, + { + "items": [ + 1622.5, + null + ], + "hints": { + "index": 2184 + } + }, + { + "items": [ + 1623, + null + ], + "hints": { + "index": 2185 + } + }, + { + "items": [ + 1623.5, + null + ], + "hints": { + "index": 2186 + } + }, + { + "items": [ + 1624, + null + ], + "hints": { + "index": 2187 + } + }, + { + "items": [ + 1624.5, + null + ], + "hints": { + "index": 2188 + } + }, + { + "items": [ + 1625, + null + ], + "hints": { + "index": 2189 + } + }, + { + "items": [ + 1625.5, + null + ], + "hints": { + "index": 2190 + } + }, + { + "items": [ + 1626, + null + ], + "hints": { + "index": 2191 + } + }, + { + "items": [ + 1626.5, + null + ], + "hints": { + "index": 2192 + } + }, + { + "items": [ + 1627, + null + ], + "hints": { + "index": 2193 + } + }, + { + "items": [ + 1627.5, + null + ], + "hints": { + "index": 2194 + } + }, + { + "items": [ + 1628, + null + ], + "hints": { + "index": 2195 + } + }, + { + "items": [ + 1628.5, + null + ], + "hints": { + "index": 2196 + } + }, + { + "items": [ + 1629, + null + ], + "hints": { + "index": 2197 + } + }, + { + "items": [ + 1629.5, + null + ], + "hints": { + "index": 2198 + } + }, + { + "items": [ + 1630, + null + ], + "hints": { + "index": 2199 + } + }, + { + "items": [ + 1630.5, + null + ], + "hints": { + "index": 2200 + } + }, + { + "items": [ + 1631, + null + ], + "hints": { + "index": 2201 + } + }, + { + "items": [ + 1631.5, + null + ], + "hints": { + "index": 2202 + } + }, + { + "items": [ + 1632, + null + ], + "hints": { + "index": 2203 + } + }, + { + "items": [ + 1632.5, + null + ], + "hints": { + "index": 2204 + } + }, + { + "items": [ + 1633, + null + ], + "hints": { + "index": 2205 + } + }, + { + "items": [ + 1633.5, + null + ], + "hints": { + "index": 2206 + } + }, + { + "items": [ + 1634, + null + ], + "hints": { + "index": 2207 + } + }, + { + "items": [ + 1634.5, + null + ], + "hints": { + "index": 2208 + } + }, + { + "items": [ + 1635, + null + ], + "hints": { + "index": 2209 + } + }, + { + "items": [ + 1635.5, + null + ], + "hints": { + "index": 2210 + } + }, + { + "items": [ + 1636, + null + ], + "hints": { + "index": 2211 + } + }, + { + "items": [ + 1636.5, + null + ], + "hints": { + "index": 2212 + } + }, + { + "items": [ + 1637, + null + ], + "hints": { + "index": 2213 + } + }, + { + "items": [ + 1637.5, + null + ], + "hints": { + "index": 2214 + } + }, + { + "items": [ + 1638, + null + ], + "hints": { + "index": 2215 + } + }, + { + "items": [ + 1638.5, + null + ], + "hints": { + "index": 2216 + } + }, + { + "items": [ + 1639, + null + ], + "hints": { + "index": 2217 + } + }, + { + "items": [ + 1639.5, + null + ], + "hints": { + "index": 2218 + } + }, + { + "items": [ + 1640, + null + ], + "hints": { + "index": 2219 + } + }, + { + "items": [ + 1640.5, + null + ], + "hints": { + "index": 2220 + } + }, + { + "items": [ + 1641, + null + ], + "hints": { + "index": 2221 + } + }, + { + "items": [ + 1641.5, + null + ], + "hints": { + "index": 2222 + } + }, + { + "items": [ + 1642, + null + ], + "hints": { + "index": 2223 + } + }, + { + "items": [ + 1642.5, + null + ], + "hints": { + "index": 2224 + } + }, + { + "items": [ + 1643, + null + ], + "hints": { + "index": 2225 + } + }, + { + "items": [ + 1643.5, + null + ], + "hints": { + "index": 2226 + } + }, + { + "items": [ + 1644, + null + ], + "hints": { + "index": 2227 + } + }, + { + "items": [ + 1644.5, + null + ], + "hints": { + "index": 2228 + } + }, + { + "items": [ + 1645, + null + ], + "hints": { + "index": 2229 + } + }, + { + "items": [ + 1645.5, + null + ], + "hints": { + "index": 2230 + } + }, + { + "items": [ + 1646, + null + ], + "hints": { + "index": 2231 + } + }, + { + "items": [ + 1646.5, + null + ], + "hints": { + "index": 2232 + } + }, + { + "items": [ + 1647, + null + ], + "hints": { + "index": 2233 + } + }, + { + "items": [ + 1647.5, + null + ], + "hints": { + "index": 2234 + } + }, + { + "items": [ + 1648, + null + ], + "hints": { + "index": 2235 + } + }, + { + "items": [ + 1648.5, + null + ], + "hints": { + "index": 2236 + } + }, + { + "items": [ + 1649, + null + ], + "hints": { + "index": 2237 + } + }, + { + "items": [ + 1649.5, + null + ], + "hints": { + "index": 2238 + } + }, + { + "items": [ + 1650, + null + ], + "hints": { + "index": 2239 + } + }, + { + "items": [ + 1650.5, + null + ], + "hints": { + "index": 2240 + } + }, + { + "items": [ + 1651, + null + ], + "hints": { + "index": 2241 + } + }, + { + "items": [ + 1651.5, + null + ], + "hints": { + "index": 2242 + } + }, + { + "items": [ + 1652, + null + ], + "hints": { + "index": 2243 + } + }, + { + "items": [ + 1652.5, + null + ], + "hints": { + "index": 2244 + } + }, + { + "items": [ + 1653, + null + ], + "hints": { + "index": 2245 + } + }, + { + "items": [ + 1653.5, + null + ], + "hints": { + "index": 2246 + } + }, + { + "items": [ + 1654, + null + ], + "hints": { + "index": 2247 + } + }, + { + "items": [ + 1654.5, + null + ], + "hints": { + "index": 2248 + } + }, + { + "items": [ + 1655, + null + ], + "hints": { + "index": 2249 + } + }, + { + "items": [ + 1655.5, + null + ], + "hints": { + "index": 2250 + } + }, + { + "items": [ + 1656, + null + ], + "hints": { + "index": 2251 + } + }, + { + "items": [ + 1656.5, + null + ], + "hints": { + "index": 2252 + } + }, + { + "items": [ + 1657, + null + ], + "hints": { + "index": 2253 + } + }, + { + "items": [ + 1657.5, + null + ], + "hints": { + "index": 2254 + } + }, + { + "items": [ + 1658, + null + ], + "hints": { + "index": 2255 + } + }, + { + "items": [ + 1658.5, + null + ], + "hints": { + "index": 2256 + } + }, + { + "items": [ + 1659, + null + ], + "hints": { + "index": 2257 + } + }, + { + "items": [ + 1659.5, + null + ], + "hints": { + "index": 2258 + } + }, + { + "items": [ + 1660, + null + ], + "hints": { + "index": 2259 + } + }, + { + "items": [ + 1660.5, + null + ], + "hints": { + "index": 2260 + } + }, + { + "items": [ + 1661, + null + ], + "hints": { + "index": 2261 + } + }, + { + "items": [ + 1661.5, + null + ], + "hints": { + "index": 2262 + } + }, + { + "items": [ + 1662, + null + ], + "hints": { + "index": 2263 + } + }, + { + "items": [ + 1662.5, + null + ], + "hints": { + "index": 2264 + } + }, + { + "items": [ + 1663, + null + ], + "hints": { + "index": 2265 + } + }, + { + "items": [ + 1663.5, + null + ], + "hints": { + "index": 2266 + } + }, + { + "items": [ + 1664, + null + ], + "hints": { + "index": 2267 + } + }, + { + "items": [ + 1664.5, + null + ], + "hints": { + "index": 2268 + } + }, + { + "items": [ + 1665, + null + ], + "hints": { + "index": 2269 + } + }, + { + "items": [ + 1665.5, + null + ], + "hints": { + "index": 2270 + } + }, + { + "items": [ + 1666, + null + ], + "hints": { + "index": 2271 + } + }, + { + "items": [ + 1666.5, + null + ], + "hints": { + "index": 2272 + } + }, + { + "items": [ + 1667, + null + ], + "hints": { + "index": 2273 + } + }, + { + "items": [ + 1667.5, + null + ], + "hints": { + "index": 2274 + } + }, + { + "items": [ + 1668, + null + ], + "hints": { + "index": 2275 + } + }, + { + "items": [ + 1668.5, + null + ], + "hints": { + "index": 2276 + } + }, + { + "items": [ + 1669, + null + ], + "hints": { + "index": 2277 + } + }, + { + "items": [ + 1669.5, + null + ], + "hints": { + "index": 2278 + } + }, + { + "items": [ + 1670, + null + ], + "hints": { + "index": 2279 + } + }, + { + "items": [ + 1670.5, + null + ], + "hints": { + "index": 2280 + } + }, + { + "items": [ + 1671, + null + ], + "hints": { + "index": 2281 + } + }, + { + "items": [ + 1671.5, + null + ], + "hints": { + "index": 2282 + } + }, + { + "items": [ + 1672, + null + ], + "hints": { + "index": 2283 + } + }, + { + "items": [ + 1672.5, + null + ], + "hints": { + "index": 2284 + } + }, + { + "items": [ + 1673, + null + ], + "hints": { + "index": 2285 + } + }, + { + "items": [ + 1673.5, + null + ], + "hints": { + "index": 2286 + } + }, + { + "items": [ + 1674, + null + ], + "hints": { + "index": 2287 + } + }, + { + "items": [ + 1674.5, + null + ], + "hints": { + "index": 2288 + } + }, + { + "items": [ + 1675, + null + ], + "hints": { + "index": 2289 + } + }, + { + "items": [ + 1675.5, + null + ], + "hints": { + "index": 2290 + } + }, + { + "items": [ + 1676, + null + ], + "hints": { + "index": 2291 + } + }, + { + "items": [ + 1676.5, + null + ], + "hints": { + "index": 2292 + } + }, + { + "items": [ + 1677, + null + ], + "hints": { + "index": 2293 + } + }, + { + "items": [ + 1677.5, + null + ], + "hints": { + "index": 2294 + } + }, + { + "items": [ + 1678, + null + ], + "hints": { + "index": 2295 + } + }, + { + "items": [ + 1678.5, + null + ], + "hints": { + "index": 2296 + } + }, + { + "items": [ + 1679, + null + ], + "hints": { + "index": 2297 + } + }, + { + "items": [ + 1679.5, + null + ], + "hints": { + "index": 2298 + } + }, + { + "items": [ + 1680, + null + ], + "hints": { + "index": 2299 + } + }, + { + "items": [ + 1680.5, + null + ], + "hints": { + "index": 2300 + } + }, + { + "items": [ + 1681, + null + ], + "hints": { + "index": 2301 + } + }, + { + "items": [ + 1681.5, + null + ], + "hints": { + "index": 2302 + } + }, + { + "items": [ + 1682, + null + ], + "hints": { + "index": 2303 + } + }, + { + "items": [ + 1682.5, + null + ], + "hints": { + "index": 2304 + } + }, + { + "items": [ + 1683, + null + ], + "hints": { + "index": 2305 + } + }, + { + "items": [ + 1683.5, + null + ], + "hints": { + "index": 2306 + } + }, + { + "items": [ + 1684, + null + ], + "hints": { + "index": 2307 + } + }, + { + "items": [ + 1684.5, + null + ], + "hints": { + "index": 2308 + } + }, + { + "items": [ + 1685, + null + ], + "hints": { + "index": 2309 + } + }, + { + "items": [ + 1685.5, + null + ], + "hints": { + "index": 2310 + } + }, + { + "items": [ + 1686, + null + ], + "hints": { + "index": 2311 + } + }, + { + "items": [ + 1686.5, + null + ], + "hints": { + "index": 2312 + } + }, + { + "items": [ + 1687, + null + ], + "hints": { + "index": 2313 + } + }, + { + "items": [ + 1687.5, + null + ], + "hints": { + "index": 2314 + } + }, + { + "items": [ + 1688, + null + ], + "hints": { + "index": 2315 + } + }, + { + "items": [ + 1688.5, + null + ], + "hints": { + "index": 2316 + } + }, + { + "items": [ + 1689, + null + ], + "hints": { + "index": 2317 + } + }, + { + "items": [ + 1689.5, + null + ], + "hints": { + "index": 2318 + } + }, + { + "items": [ + 1690, + null + ], + "hints": { + "index": 2319 + } + }, + { + "items": [ + 1690.5, + null + ], + "hints": { + "index": 2320 + } + }, + { + "items": [ + 1691, + null + ], + "hints": { + "index": 2321 + } + }, + { + "items": [ + 1691.5, + null + ], + "hints": { + "index": 2322 + } + }, + { + "items": [ + 1692, + null + ], + "hints": { + "index": 2323 + } + }, + { + "items": [ + 1692.5, + null + ], + "hints": { + "index": 2324 + } + }, + { + "items": [ + 1693, + null + ], + "hints": { + "index": 2325 + } + }, + { + "items": [ + 1693.5, + null + ], + "hints": { + "index": 2326 + } + }, + { + "items": [ + 1694, + null + ], + "hints": { + "index": 2327 + } + }, + { + "items": [ + 1694.5, + null + ], + "hints": { + "index": 2328 + } + }, + { + "items": [ + 1695, + null + ], + "hints": { + "index": 2329 + } + }, + { + "items": [ + 1695.5, + null + ], + "hints": { + "index": 2330 + } + }, + { + "items": [ + 1696, + null + ], + "hints": { + "index": 2331 + } + }, + { + "items": [ + 1696.5, + null + ], + "hints": { + "index": 2332 + } + }, + { + "items": [ + 1697, + null + ], + "hints": { + "index": 2333 + } + }, + { + "items": [ + 1697.5, + null + ], + "hints": { + "index": 2334 + } + }, + { + "items": [ + 1698, + null + ], + "hints": { + "index": 2335 + } + }, + { + "items": [ + 1698.5, + null + ], + "hints": { + "index": 2336 + } + }, + { + "items": [ + 1699, + null + ], + "hints": { + "index": 2337 + } + }, + { + "items": [ + 1699.5, + null + ], + "hints": { + "index": 2338 + } + }, + { + "items": [ + 1700, + null + ], + "hints": { + "index": 2339 + } + }, + { + "items": [ + 1700.5, + null + ], + "hints": { + "index": 2340 + } + }, + { + "items": [ + 1701, + null + ], + "hints": { + "index": 2341 + } + }, + { + "items": [ + 1701.5, + null + ], + "hints": { + "index": 2342 + } + }, + { + "items": [ + 1702, + null + ], + "hints": { + "index": 2343 + } + }, + { + "items": [ + 1702.5, + null + ], + "hints": { + "index": 2344 + } + }, + { + "items": [ + 1703, + null + ], + "hints": { + "index": 2345 + } + }, + { + "items": [ + 1703.5, + null + ], + "hints": { + "index": 2346 + } + }, + { + "items": [ + 1704, + null + ], + "hints": { + "index": 2347 + } + }, + { + "items": [ + 1704.5, + null + ], + "hints": { + "index": 2348 + } + }, + { + "items": [ + 1705, + null + ], + "hints": { + "index": 2349 + } + }, + { + "items": [ + 1705.5, + null + ], + "hints": { + "index": 2350 + } + }, + { + "items": [ + 1706, + null + ], + "hints": { + "index": 2351 + } + }, + { + "items": [ + 1706.5, + null + ], + "hints": { + "index": 2352 + } + }, + { + "items": [ + 1707, + null + ], + "hints": { + "index": 2353 + } + }, + { + "items": [ + 1707.5, + null + ], + "hints": { + "index": 2354 + } + }, + { + "items": [ + 1708, + null + ], + "hints": { + "index": 2355 + } + }, + { + "items": [ + 1708.5, + null + ], + "hints": { + "index": 2356 + } + }, + { + "items": [ + 1709, + null + ], + "hints": { + "index": 2357 + } + }, + { + "items": [ + 1709.5, + null + ], + "hints": { + "index": 2358 + } + }, + { + "items": [ + 1710, + null + ], + "hints": { + "index": 2359 + } + }, + { + "items": [ + 1710.5, + null + ], + "hints": { + "index": 2360 + } + }, + { + "items": [ + 1711, + null + ], + "hints": { + "index": 2361 + } + }, + { + "items": [ + 1711.5, + null + ], + "hints": { + "index": 2362 + } + }, + { + "items": [ + 1712, + null + ], + "hints": { + "index": 2363 + } + }, + { + "items": [ + 1712.5, + null + ], + "hints": { + "index": 2364 + } + }, + { + "items": [ + 1713, + null + ], + "hints": { + "index": 2365 + } + }, + { + "items": [ + 1713.5, + null + ], + "hints": { + "index": 2366 + } + }, + { + "items": [ + 1714, + null + ], + "hints": { + "index": 2367 + } + }, + { + "items": [ + 1714.5, + null + ], + "hints": { + "index": 2368 + } + }, + { + "items": [ + 1715, + null + ], + "hints": { + "index": 2369 + } + }, + { + "items": [ + 1715.5, + null + ], + "hints": { + "index": 2370 + } + }, + { + "items": [ + 1716, + null + ], + "hints": { + "index": 2371 + } + }, + { + "items": [ + 1716.5, + null + ], + "hints": { + "index": 2372 + } + }, + { + "items": [ + 1717, + null + ], + "hints": { + "index": 2373 + } + }, + { + "items": [ + 1717.5, + null + ], + "hints": { + "index": 2374 + } + }, + { + "items": [ + 1718, + null + ], + "hints": { + "index": 2375 + } + }, + { + "items": [ + 1718.5, + null + ], + "hints": { + "index": 2376 + } + }, + { + "items": [ + 1719, + null + ], + "hints": { + "index": 2377 + } + }, + { + "items": [ + 1719.5, + null + ], + "hints": { + "index": 2378 + } + }, + { + "items": [ + 1720, + null + ], + "hints": { + "index": 2379 + } + }, + { + "items": [ + 1720.5, + null + ], + "hints": { + "index": 2380 + } + }, + { + "items": [ + 1721, + null + ], + "hints": { + "index": 2381 + } + }, + { + "items": [ + 1721.5, + null + ], + "hints": { + "index": 2382 + } + }, + { + "items": [ + 1722, + null + ], + "hints": { + "index": 2383 + } + }, + { + "items": [ + 1722.5, + null + ], + "hints": { + "index": 2384 + } + }, + { + "items": [ + 1723, + null + ], + "hints": { + "index": 2385 + } + }, + { + "items": [ + 1723.5, + null + ], + "hints": { + "index": 2386 + } + }, + { + "items": [ + 1724, + null + ], + "hints": { + "index": 2387 + } + }, + { + "items": [ + 1724.5, + null + ], + "hints": { + "index": 2388 + } + }, + { + "items": [ + 1725, + null + ], + "hints": { + "index": 2389 + } + }, + { + "items": [ + 1725.5, + null + ], + "hints": { + "index": 2390 + } + }, + { + "items": [ + 1726, + null + ], + "hints": { + "index": 2391 + } + }, + { + "items": [ + 1726.5, + null + ], + "hints": { + "index": 2392 + } + }, + { + "items": [ + 1727, + null + ], + "hints": { + "index": 2393 + } + }, + { + "items": [ + 1727.5, + null + ], + "hints": { + "index": 2394 + } + }, + { + "items": [ + 1728, + null + ], + "hints": { + "index": 2395 + } + }, + { + "items": [ + 1728.5, + null + ], + "hints": { + "index": 2396 + } + }, + { + "items": [ + 1729, + null + ], + "hints": { + "index": 2397 + } + }, + { + "items": [ + 1729.5, + null + ], + "hints": { + "index": 2398 + } + }, + { + "items": [ + 1730, + null + ], + "hints": { + "index": 2399 + } + }, + { + "items": [ + 1730.5, + null + ], + "hints": { + "index": 2400 + } + }, + { + "items": [ + 1731, + null + ], + "hints": { + "index": 2401 + } + }, + { + "items": [ + 1731.5, + null + ], + "hints": { + "index": 2402 + } + }, + { + "items": [ + 1732, + null + ], + "hints": { + "index": 2403 + } + }, + { + "items": [ + 1732.5, + null + ], + "hints": { + "index": 2404 + } + }, + { + "items": [ + 1733, + null + ], + "hints": { + "index": 2405 + } + }, + { + "items": [ + 1733.5, + null + ], + "hints": { + "index": 2406 + } + }, + { + "items": [ + 1734, + null + ], + "hints": { + "index": 2407 + } + }, + { + "items": [ + 1734.5, + null + ], + "hints": { + "index": 2408 + } + }, + { + "items": [ + 1735, + null + ], + "hints": { + "index": 2409 + } + }, + { + "items": [ + 1735.5, + null + ], + "hints": { + "index": 2410 + } + }, + { + "items": [ + 1736, + null + ], + "hints": { + "index": 2411 + } + }, + { + "items": [ + 1736.5, + null + ], + "hints": { + "index": 2412 + } + }, + { + "items": [ + 1737, + null + ], + "hints": { + "index": 2413 + } + }, + { + "items": [ + 1737.5, + null + ], + "hints": { + "index": 2414 + } + }, + { + "items": [ + 1738, + null + ], + "hints": { + "index": 2415 + } + }, + { + "items": [ + 1738.5, + null + ], + "hints": { + "index": 2416 + } + }, + { + "items": [ + 1739, + null + ], + "hints": { + "index": 2417 + } + }, + { + "items": [ + 1739.5, + null + ], + "hints": { + "index": 2418 + } + }, + { + "items": [ + 1740, + null + ], + "hints": { + "index": 2419 + } + }, + { + "items": [ + 1740.5, + null + ], + "hints": { + "index": 2420 + } + }, + { + "items": [ + 1741, + null + ], + "hints": { + "index": 2421 + } + }, + { + "items": [ + 1741.5, + null + ], + "hints": { + "index": 2422 + } + }, + { + "items": [ + 1742, + null + ], + "hints": { + "index": 2423 + } + }, + { + "items": [ + 1742.5, + null + ], + "hints": { + "index": 2424 + } + }, + { + "items": [ + 1743, + null + ], + "hints": { + "index": 2425 + } + }, + { + "items": [ + 1743.5, + null + ], + "hints": { + "index": 2426 + } + }, + { + "items": [ + 1744, + null + ], + "hints": { + "index": 2427 + } + }, + { + "items": [ + 1744.5, + null + ], + "hints": { + "index": 2428 + } + }, + { + "items": [ + 1745, + null + ], + "hints": { + "index": 2429 + } + }, + { + "items": [ + 1745.5, + null + ], + "hints": { + "index": 2430 + } + }, + { + "items": [ + 1746, + null + ], + "hints": { + "index": 2431 + } + }, + { + "items": [ + 1746.5, + null + ], + "hints": { + "index": 2432 + } + }, + { + "items": [ + 1747, + null + ], + "hints": { + "index": 2433 + } + }, + { + "items": [ + 1747.5, + null + ], + "hints": { + "index": 2434 + } + }, + { + "items": [ + 1748, + null + ], + "hints": { + "index": 2435 + } + }, + { + "items": [ + 1748.5, + null + ], + "hints": { + "index": 2436 + } + }, + { + "items": [ + 1749, + null + ], + "hints": { + "index": 2437 + } + }, + { + "items": [ + 1749.5, + null + ], + "hints": { + "index": 2438 + } + }, + { + "items": [ + 1750, + null + ], + "hints": { + "index": 2439 + } + }, + { + "items": [ + 1750.5, + null + ], + "hints": { + "index": 2440 + } + }, + { + "items": [ + 1751, + null + ], + "hints": { + "index": 2441 + } + }, + { + "items": [ + 1751.5, + null + ], + "hints": { + "index": 2442 + } + }, + { + "items": [ + 1752, + null + ], + "hints": { + "index": 2443 + } + }, + { + "items": [ + 1752.5, + null + ], + "hints": { + "index": 2444 + } + }, + { + "items": [ + 1753, + null + ], + "hints": { + "index": 2445 + } + }, + { + "items": [ + 1753.5, + null + ], + "hints": { + "index": 2446 + } + }, + { + "items": [ + 1754, + null + ], + "hints": { + "index": 2447 + } + }, + { + "items": [ + 1754.5, + null + ], + "hints": { + "index": 2448 + } + }, + { + "items": [ + 1755, + null + ], + "hints": { + "index": 2449 + } + }, + { + "items": [ + 1755.5, + null + ], + "hints": { + "index": 2450 + } + }, + { + "items": [ + 1756, + null + ], + "hints": { + "index": 2451 + } + }, + { + "items": [ + 1756.5, + null + ], + "hints": { + "index": 2452 + } + }, + { + "items": [ + 1757, + null + ], + "hints": { + "index": 2453 + } + }, + { + "items": [ + 1757.5, + null + ], + "hints": { + "index": 2454 + } + }, + { + "items": [ + 1758, + null + ], + "hints": { + "index": 2455 + } + }, + { + "items": [ + 1758.5, + null + ], + "hints": { + "index": 2456 + } + }, + { + "items": [ + 1759, + null + ], + "hints": { + "index": 2457 + } + }, + { + "items": [ + 1759.5, + null + ], + "hints": { + "index": 2458 + } + }, + { + "items": [ + 1760, + null + ], + "hints": { + "index": 2459 + } + }, + { + "items": [ + 1760.5, + null + ], + "hints": { + "index": 2460 + } + }, + { + "items": [ + 1761, + null + ], + "hints": { + "index": 2461 + } + }, + { + "items": [ + 1761.5, + null + ], + "hints": { + "index": 2462 + } + }, + { + "items": [ + 1762, + null + ], + "hints": { + "index": 2463 + } + }, + { + "items": [ + 1762.5, + null + ], + "hints": { + "index": 2464 + } + }, + { + "items": [ + 1763, + null + ], + "hints": { + "index": 2465 + } + }, + { + "items": [ + 1763.5, + null + ], + "hints": { + "index": 2466 + } + }, + { + "items": [ + 1764, + null + ], + "hints": { + "index": 2467 + } + }, + { + "items": [ + 1764.5, + null + ], + "hints": { + "index": 2468 + } + }, + { + "items": [ + 1765, + null + ], + "hints": { + "index": 2469 + } + }, + { + "items": [ + 1765.5, + null + ], + "hints": { + "index": 2470 + } + }, + { + "items": [ + 1766, + null + ], + "hints": { + "index": 2471 + } + }, + { + "items": [ + 1766.5, + null + ], + "hints": { + "index": 2472 + } + }, + { + "items": [ + 1767, + null + ], + "hints": { + "index": 2473 + } + }, + { + "items": [ + 1767.5, + null + ], + "hints": { + "index": 2474 + } + }, + { + "items": [ + 1768, + null + ], + "hints": { + "index": 2475 + } + }, + { + "items": [ + 1768.5, + null + ], + "hints": { + "index": 2476 + } + }, + { + "items": [ + 1769, + null + ], + "hints": { + "index": 2477 + } + }, + { + "items": [ + 1769.5, + null + ], + "hints": { + "index": 2478 + } + }, + { + "items": [ + 1770, + null + ], + "hints": { + "index": 2479 + } + }, + { + "items": [ + 1770.5, + null + ], + "hints": { + "index": 2480 + } + }, + { + "items": [ + 1771, + null + ], + "hints": { + "index": 2481 + } + }, + { + "items": [ + 1771.5, + null + ], + "hints": { + "index": 2482 + } + }, + { + "items": [ + 1772, + null + ], + "hints": { + "index": 2483 + } + }, + { + "items": [ + 1772.5, + null + ], + "hints": { + "index": 2484 + } + }, + { + "items": [ + 1773, + null + ], + "hints": { + "index": 2485 + } + }, + { + "items": [ + 1773.5, + null + ], + "hints": { + "index": 2486 + } + }, + { + "items": [ + 1774, + null + ], + "hints": { + "index": 2487 + } + }, + { + "items": [ + 1774.5, + null + ], + "hints": { + "index": 2488 + } + }, + { + "items": [ + 1775, + null + ], + "hints": { + "index": 2489 + } + }, + { + "items": [ + 1775.5, + null + ], + "hints": { + "index": 2490 + } + }, + { + "items": [ + 1776, + null + ], + "hints": { + "index": 2491 + } + }, + { + "items": [ + 1776.5, + null + ], + "hints": { + "index": 2492 + } + }, + { + "items": [ + 1777, + null + ], + "hints": { + "index": 2493 + } + }, + { + "items": [ + 1777.5, + null + ], + "hints": { + "index": 2494 + } + }, + { + "items": [ + 1778, + null + ], + "hints": { + "index": 2495 + } + }, + { + "items": [ + 1778.5, + null + ], + "hints": { + "index": 2496 + } + }, + { + "items": [ + 1779, + null + ], + "hints": { + "index": 2497 + } + }, + { + "items": [ + 1779.5, + null + ], + "hints": { + "index": 2498 + } + }, + { + "items": [ + 1780, + null + ], + "hints": { + "index": 2499 + } + }, + { + "items": [ + 1780.5, + null + ], + "hints": { + "index": 2500 + } + }, + { + "items": [ + 1781, + null + ], + "hints": { + "index": 2501 + } + }, + { + "items": [ + 1781.5, + null + ], + "hints": { + "index": 2502 + } + }, + { + "items": [ + 1782, + null + ], + "hints": { + "index": 2503 + } + }, + { + "items": [ + 1782.5, + null + ], + "hints": { + "index": 2504 + } + }, + { + "items": [ + 1783, + null + ], + "hints": { + "index": 2505 + } + }, + { + "items": [ + 1783.5, + null + ], + "hints": { + "index": 2506 + } + }, + { + "items": [ + 1784, + null + ], + "hints": { + "index": 2507 + } + }, + { + "items": [ + 1784.5, + null + ], + "hints": { + "index": 2508 + } + }, + { + "items": [ + 1785, + null + ], + "hints": { + "index": 2509 + } + }, + { + "items": [ + 1785.5, + null + ], + "hints": { + "index": 2510 + } + }, + { + "items": [ + 1786, + null + ], + "hints": { + "index": 2511 + } + }, + { + "items": [ + 1786.5, + null + ], + "hints": { + "index": 2512 + } + }, + { + "items": [ + 1787, + null + ], + "hints": { + "index": 2513 + } + }, + { + "items": [ + 1787.5, + null + ], + "hints": { + "index": 2514 + } + }, + { + "items": [ + 1788, + null + ], + "hints": { + "index": 2515 + } + }, + { + "items": [ + 1788.5, + null + ], + "hints": { + "index": 2516 + } + }, + { + "items": [ + 1789, + null + ], + "hints": { + "index": 2517 + } + }, + { + "items": [ + 1789.5, + null + ], + "hints": { + "index": 2518 + } + }, + { + "items": [ + 1790, + null + ], + "hints": { + "index": 2519 + } + }, + { + "items": [ + 1790.5, + null + ], + "hints": { + "index": 2520 + } + }, + { + "items": [ + 1791, + null + ], + "hints": { + "index": 2521 + } + }, + { + "items": [ + 1791.5, + null + ], + "hints": { + "index": 2522 + } + }, + { + "items": [ + 1792, + null + ], + "hints": { + "index": 2523 + } + }, + { + "items": [ + 1792.5, + null + ], + "hints": { + "index": 2524 + } + }, + { + "items": [ + 1793, + null + ], + "hints": { + "index": 2525 + } + }, + { + "items": [ + 1793.5, + null + ], + "hints": { + "index": 2526 + } + }, + { + "items": [ + 1794, + null + ], + "hints": { + "index": 2527 + } + }, + { + "items": [ + 1794.5, + null + ], + "hints": { + "index": 2528 + } + }, + { + "items": [ + 1795, + null + ], + "hints": { + "index": 2529 + } + }, + { + "items": [ + 1795.5, + null + ], + "hints": { + "index": 2530 + } + }, + { + "items": [ + 1796, + null + ], + "hints": { + "index": 2531 + } + }, + { + "items": [ + 1796.5, + null + ], + "hints": { + "index": 2532 + } + }, + { + "items": [ + 1797, + null + ], + "hints": { + "index": 2533 + } + }, + { + "items": [ + 1797.5, + null + ], + "hints": { + "index": 2534 + } + }, + { + "items": [ + 1798, + null + ], + "hints": { + "index": 2535 + } + }, + { + "items": [ + 1798.5, + null + ], + "hints": { + "index": 2536 + } + }, + { + "items": [ + 1799, + null + ], + "hints": { + "index": 2537 + } + }, + { + "items": [ + 1799.5, + null + ], + "hints": { + "index": 2538 + } + }, + { + "items": [ + 1800, + null + ], + "hints": { + "index": 2539 + } + }, + { + "items": [ + 1800.5, + null + ], + "hints": { + "index": 2540 + } + }, + { + "items": [ + 1801, + null + ], + "hints": { + "index": 2541 + } + }, + { + "items": [ + 1801.5, + null + ], + "hints": { + "index": 2542 + } + }, + { + "items": [ + 1802, + null + ], + "hints": { + "index": 2543 + } + }, + { + "items": [ + 1802.5, + null + ], + "hints": { + "index": 2544 + } + }, + { + "items": [ + 1803, + null + ], + "hints": { + "index": 2545 + } + }, + { + "items": [ + 1803.5, + null + ], + "hints": { + "index": 2546 + } + }, + { + "items": [ + 1804, + null + ], + "hints": { + "index": 2547 + } + }, + { + "items": [ + 1804.5, + null + ], + "hints": { + "index": 2548 + } + }, + { + "items": [ + 1805, + null + ], + "hints": { + "index": 2549 + } + }, + { + "items": [ + 1805.5, + null + ], + "hints": { + "index": 2550 + } + }, + { + "items": [ + 1806, + null + ], + "hints": { + "index": 2551 + } + }, + { + "items": [ + 1806.5, + null + ], + "hints": { + "index": 2552 + } + }, + { + "items": [ + 1807, + null + ], + "hints": { + "index": 2553 + } + }, + { + "items": [ + 1807.5, + null + ], + "hints": { + "index": 2554 + } + }, + { + "items": [ + 1808, + null + ], + "hints": { + "index": 2555 + } + }, + { + "items": [ + 1808.5, + null + ], + "hints": { + "index": 2556 + } + }, + { + "items": [ + 1809, + null + ], + "hints": { + "index": 2557 + } + }, + { + "items": [ + 1809.5, + null + ], + "hints": { + "index": 2558 + } + }, + { + "items": [ + 1810, + null + ], + "hints": { + "index": 2559 + } + }, + { + "items": [ + 1810.5, + null + ], + "hints": { + "index": 2560 + } + }, + { + "items": [ + 1811, + null + ], + "hints": { + "index": 2561 + } + }, + { + "items": [ + 1811.5, + null + ], + "hints": { + "index": 2562 + } + }, + { + "items": [ + 1812, + null + ], + "hints": { + "index": 2563 + } + }, + { + "items": [ + 1812.5, + null + ], + "hints": { + "index": 2564 + } + }, + { + "items": [ + 1813, + null + ], + "hints": { + "index": 2565 + } + }, + { + "items": [ + 1813.5, + null + ], + "hints": { + "index": 2566 + } + }, + { + "items": [ + 1814, + null + ], + "hints": { + "index": 2567 + } + }, + { + "items": [ + 1814.5, + null + ], + "hints": { + "index": 2568 + } + }, + { + "items": [ + 1815, + null + ], + "hints": { + "index": 2569 + } + }, + { + "items": [ + 1815.5, + null + ], + "hints": { + "index": 2570 + } + }, + { + "items": [ + 1816, + null + ], + "hints": { + "index": 2571 + } + }, + { + "items": [ + 1816.5, + null + ], + "hints": { + "index": 2572 + } + }, + { + "items": [ + 1817, + null + ], + "hints": { + "index": 2573 + } + }, + { + "items": [ + 1817.5, + null + ], + "hints": { + "index": 2574 + } + }, + { + "items": [ + 1818, + null + ], + "hints": { + "index": 2575 + } + }, + { + "items": [ + 1818.5, + null + ], + "hints": { + "index": 2576 + } + }, + { + "items": [ + 1819, + null + ], + "hints": { + "index": 2577 + } + }, + { + "items": [ + 1819.5, + null + ], + "hints": { + "index": 2578 + } + }, + { + "items": [ + 1820, + null + ], + "hints": { + "index": 2579 + } + }, + { + "items": [ + 1820.5, + null + ], + "hints": { + "index": 2580 + } + }, + { + "items": [ + 1821, + null + ], + "hints": { + "index": 2581 + } + }, + { + "items": [ + 1821.5, + null + ], + "hints": { + "index": 2582 + } + }, + { + "items": [ + 1822, + null + ], + "hints": { + "index": 2583 + } + }, + { + "items": [ + 1822.5, + null + ], + "hints": { + "index": 2584 + } + }, + { + "items": [ + 1823, + null + ], + "hints": { + "index": 2585 + } + }, + { + "items": [ + 1823.5, + null + ], + "hints": { + "index": 2586 + } + }, + { + "items": [ + 1824, + null + ], + "hints": { + "index": 2587 + } + }, + { + "items": [ + 1824.5, + null + ], + "hints": { + "index": 2588 + } + }, + { + "items": [ + 1825, + null + ], + "hints": { + "index": 2589 + } + }, + { + "items": [ + 1825.5, + null + ], + "hints": { + "index": 2590 + } + }, + { + "items": [ + 1826, + null + ], + "hints": { + "index": 2591 + } + }, + { + "items": [ + 1826.5, + null + ], + "hints": { + "index": 2592 + } + }, + { + "items": [ + 1827, + null + ], + "hints": { + "index": 2593 + } + }, + { + "items": [ + 1827.5, + null + ], + "hints": { + "index": 2594 + } + }, + { + "items": [ + 1828, + null + ], + "hints": { + "index": 2595 + } + }, + { + "items": [ + 1828.5, + null + ], + "hints": { + "index": 2596 + } + }, + { + "items": [ + 1829, + null + ], + "hints": { + "index": 2597 + } + }, + { + "items": [ + 1829.5, + null + ], + "hints": { + "index": 2598 + } + }, + { + "items": [ + 1830, + null + ], + "hints": { + "index": 2599 + } + }, + { + "items": [ + 1830.5, + null + ], + "hints": { + "index": 2600 + } + }, + { + "items": [ + 1831, + null + ], + "hints": { + "index": 2601 + } + }, + { + "items": [ + 1831.5, + null + ], + "hints": { + "index": 2602 + } + }, + { + "items": [ + 1832, + null + ], + "hints": { + "index": 2603 + } + }, + { + "items": [ + 1832.5, + null + ], + "hints": { + "index": 2604 + } + }, + { + "items": [ + 1833, + null + ], + "hints": { + "index": 2605 + } + }, + { + "items": [ + 1833.5, + null + ], + "hints": { + "index": 2606 + } + }, + { + "items": [ + 1834, + null + ], + "hints": { + "index": 2607 + } + }, + { + "items": [ + 1834.5, + null + ], + "hints": { + "index": 2608 + } + }, + { + "items": [ + 1835, + null + ], + "hints": { + "index": 2609 + } + }, + { + "items": [ + 1835.5, + null + ], + "hints": { + "index": 2610 + } + }, + { + "items": [ + 1836, + null + ], + "hints": { + "index": 2611 + } + }, + { + "items": [ + 1836.5, + null + ], + "hints": { + "index": 2612 + } + }, + { + "items": [ + 1837, + null + ], + "hints": { + "index": 2613 + } + }, + { + "items": [ + 1837.5, + null + ], + "hints": { + "index": 2614 + } + }, + { + "items": [ + 1838, + null + ], + "hints": { + "index": 2615 + } + }, + { + "items": [ + 1838.5, + null + ], + "hints": { + "index": 2616 + } + }, + { + "items": [ + 1839, + null + ], + "hints": { + "index": 2617 + } + }, + { + "items": [ + 1839.5, + null + ], + "hints": { + "index": 2618 + } + }, + { + "items": [ + 1840, + null + ], + "hints": { + "index": 2619 + } + }, + { + "items": [ + 1840.5, + null + ], + "hints": { + "index": 2620 + } + }, + { + "items": [ + 1841, + null + ], + "hints": { + "index": 2621 + } + }, + { + "items": [ + 1841.5, + null + ], + "hints": { + "index": 2622 + } + }, + { + "items": [ + 1842, + null + ], + "hints": { + "index": 2623 + } + }, + { + "items": [ + 1842.5, + null + ], + "hints": { + "index": 2624 + } + }, + { + "items": [ + 1843, + null + ], + "hints": { + "index": 2625 + } + }, + { + "items": [ + 1843.5, + null + ], + "hints": { + "index": 2626 + } + }, + { + "items": [ + 1844, + null + ], + "hints": { + "index": 2627 + } + }, + { + "items": [ + 1844.5, + null + ], + "hints": { + "index": 2628 + } + }, + { + "items": [ + 1845, + null + ], + "hints": { + "index": 2629 + } + }, + { + "items": [ + 1845.5, + null + ], + "hints": { + "index": 2630 + } + }, + { + "items": [ + 1846, + null + ], + "hints": { + "index": 2631 + } + }, + { + "items": [ + 1846.5, + null + ], + "hints": { + "index": 2632 + } + }, + { + "items": [ + 1847, + null + ], + "hints": { + "index": 2633 + } + }, + { + "items": [ + 1847.5, + null + ], + "hints": { + "index": 2634 + } + }, + { + "items": [ + 1848, + null + ], + "hints": { + "index": 2635 + } + }, + { + "items": [ + 1848.5, + null + ], + "hints": { + "index": 2636 + } + }, + { + "items": [ + 1849, + null + ], + "hints": { + "index": 2637 + } + }, + { + "items": [ + 1849.5, + null + ], + "hints": { + "index": 2638 + } + }, + { + "items": [ + 1850, + null + ], + "hints": { + "index": 2639 + } + }, + { + "items": [ + 1850.5, + null + ], + "hints": { + "index": 2640 + } + }, + { + "items": [ + 1851, + null + ], + "hints": { + "index": 2641 + } + }, + { + "items": [ + 1851.5, + null + ], + "hints": { + "index": 2642 + } + }, + { + "items": [ + 1852, + null + ], + "hints": { + "index": 2643 + } + }, + { + "items": [ + 1852.5, + null + ], + "hints": { + "index": 2644 + } + }, + { + "items": [ + 1853, + null + ], + "hints": { + "index": 2645 + } + }, + { + "items": [ + 1853.5, + null + ], + "hints": { + "index": 2646 + } + }, + { + "items": [ + 1854, + null + ], + "hints": { + "index": 2647 + } + }, + { + "items": [ + 1854.5, + null + ], + "hints": { + "index": 2648 + } + }, + { + "items": [ + 1855, + null + ], + "hints": { + "index": 2649 + } + }, + { + "items": [ + 1855.5, + null + ], + "hints": { + "index": 2650 + } + }, + { + "items": [ + 1856, + null + ], + "hints": { + "index": 2651 + } + }, + { + "items": [ + 1856.5, + null + ], + "hints": { + "index": 2652 + } + }, + { + "items": [ + 1857, + null + ], + "hints": { + "index": 2653 + } + }, + { + "items": [ + 1857.5, + null + ], + "hints": { + "index": 2654 + } + }, + { + "items": [ + 1858, + null + ], + "hints": { + "index": 2655 + } + }, + { + "items": [ + 1858.5, + null + ], + "hints": { + "index": 2656 + } + }, + { + "items": [ + 1859, + null + ], + "hints": { + "index": 2657 + } + }, + { + "items": [ + 1859.5, + null + ], + "hints": { + "index": 2658 + } + }, + { + "items": [ + 1860, + null + ], + "hints": { + "index": 2659 + } + }, + { + "items": [ + 1860.5, + null + ], + "hints": { + "index": 2660 + } + }, + { + "items": [ + 1861, + null + ], + "hints": { + "index": 2661 + } + }, + { + "items": [ + 1861.5, + null + ], + "hints": { + "index": 2662 + } + }, + { + "items": [ + 1862, + null + ], + "hints": { + "index": 2663 + } + }, + { + "items": [ + 1862.5, + null + ], + "hints": { + "index": 2664 + } + }, + { + "items": [ + 1863, + null + ], + "hints": { + "index": 2665 + } + }, + { + "items": [ + 1863.5, + null + ], + "hints": { + "index": 2666 + } + }, + { + "items": [ + 1864, + null + ], + "hints": { + "index": 2667 + } + }, + { + "items": [ + 1864.5, + null + ], + "hints": { + "index": 2668 + } + }, + { + "items": [ + 1865, + null + ], + "hints": { + "index": 2669 + } + }, + { + "items": [ + 1865.5, + null + ], + "hints": { + "index": 2670 + } + }, + { + "items": [ + 1866, + null + ], + "hints": { + "index": 2671 + } + }, + { + "items": [ + 1866.5, + null + ], + "hints": { + "index": 2672 + } + }, + { + "items": [ + 1867, + null + ], + "hints": { + "index": 2673 + } + }, + { + "items": [ + 1867.5, + null + ], + "hints": { + "index": 2674 + } + }, + { + "items": [ + 1868, + null + ], + "hints": { + "index": 2675 + } + }, + { + "items": [ + 1868.5, + null + ], + "hints": { + "index": 2676 + } + }, + { + "items": [ + 1869, + null + ], + "hints": { + "index": 2677 + } + }, + { + "items": [ + 1869.5, + null + ], + "hints": { + "index": 2678 + } + }, + { + "items": [ + 1870, + null + ], + "hints": { + "index": 2679 + } + }, + { + "items": [ + 1870.5, + null + ], + "hints": { + "index": 2680 + } + }, + { + "items": [ + 1871, + null + ], + "hints": { + "index": 2681 + } + }, + { + "items": [ + 1871.5, + null + ], + "hints": { + "index": 2682 + } + }, + { + "items": [ + 1872, + null + ], + "hints": { + "index": 2683 + } + }, + { + "items": [ + 1872.5, + null + ], + "hints": { + "index": 2684 + } + }, + { + "items": [ + 1873, + null + ], + "hints": { + "index": 2685 + } + }, + { + "items": [ + 1873.5, + null + ], + "hints": { + "index": 2686 + } + }, + { + "items": [ + 1874, + null + ], + "hints": { + "index": 2687 + } + }, + { + "items": [ + 1874.5, + null + ], + "hints": { + "index": 2688 + } + }, + { + "items": [ + 1875, + null + ], + "hints": { + "index": 2689 + } + }, + { + "items": [ + 1875.5, + null + ], + "hints": { + "index": 2690 + } + }, + { + "items": [ + 1876, + null + ], + "hints": { + "index": 2691 + } + }, + { + "items": [ + 1876.5, + null + ], + "hints": { + "index": 2692 + } + }, + { + "items": [ + 1877, + null + ], + "hints": { + "index": 2693 + } + }, + { + "items": [ + 1877.5, + null + ], + "hints": { + "index": 2694 + } + }, + { + "items": [ + 1878, + null + ], + "hints": { + "index": 2695 + } + }, + { + "items": [ + 1878.5, + null + ], + "hints": { + "index": 2696 + } + }, + { + "items": [ + 1879, + null + ], + "hints": { + "index": 2697 + } + }, + { + "items": [ + 1879.5, + null + ], + "hints": { + "index": 2698 + } + }, + { + "items": [ + 1880, + null + ], + "hints": { + "index": 2699 + } + }, + { + "items": [ + 1880.5, + null + ], + "hints": { + "index": 2700 + } + }, + { + "items": [ + 1881, + null + ], + "hints": { + "index": 2701 + } + }, + { + "items": [ + 1881.5, + null + ], + "hints": { + "index": 2702 + } + }, + { + "items": [ + 1882, + null + ], + "hints": { + "index": 2703 + } + }, + { + "items": [ + 1882.5, + null + ], + "hints": { + "index": 2704 + } + }, + { + "items": [ + 1883, + null + ], + "hints": { + "index": 2705 + } + }, + { + "items": [ + 1883.5, + null + ], + "hints": { + "index": 2706 + } + }, + { + "items": [ + 1884, + null + ], + "hints": { + "index": 2707 + } + }, + { + "items": [ + 1884.5, + null + ], + "hints": { + "index": 2708 + } + }, + { + "items": [ + 1885, + null + ], + "hints": { + "index": 2709 + } + }, + { + "items": [ + 1885.5, + null + ], + "hints": { + "index": 2710 + } + }, + { + "items": [ + 1886, + null + ], + "hints": { + "index": 2711 + } + }, + { + "items": [ + 1886.5, + null + ], + "hints": { + "index": 2712 + } + }, + { + "items": [ + 1887, + null + ], + "hints": { + "index": 2713 + } + }, + { + "items": [ + 1887.5, + null + ], + "hints": { + "index": 2714 + } + }, + { + "items": [ + 1888, + null + ], + "hints": { + "index": 2715 + } + }, + { + "items": [ + 1888.5, + null + ], + "hints": { + "index": 2716 + } + }, + { + "items": [ + 1889, + null + ], + "hints": { + "index": 2717 + } + }, + { + "items": [ + 1889.5, + null + ], + "hints": { + "index": 2718 + } + }, + { + "items": [ + 1890, + null + ], + "hints": { + "index": 2719 + } + }, + { + "items": [ + 1890.5, + null + ], + "hints": { + "index": 2720 + } + }, + { + "items": [ + 1891, + null + ], + "hints": { + "index": 2721 + } + }, + { + "items": [ + 1891.5, + null + ], + "hints": { + "index": 2722 + } + }, + { + "items": [ + 1892, + null + ], + "hints": { + "index": 2723 + } + }, + { + "items": [ + 1892.5, + null + ], + "hints": { + "index": 2724 + } + }, + { + "items": [ + 1893, + null + ], + "hints": { + "index": 2725 + } + }, + { + "items": [ + 1893.5, + null + ], + "hints": { + "index": 2726 + } + }, + { + "items": [ + 1894, + null + ], + "hints": { + "index": 2727 + } + }, + { + "items": [ + 1894.5, + null + ], + "hints": { + "index": 2728 + } + }, + { + "items": [ + 1895, + null + ], + "hints": { + "index": 2729 + } + }, + { + "items": [ + 1895.5, + null + ], + "hints": { + "index": 2730 + } + }, + { + "items": [ + 1896, + null + ], + "hints": { + "index": 2731 + } + }, + { + "items": [ + 1896.5, + null + ], + "hints": { + "index": 2732 + } + }, + { + "items": [ + 1897, + null + ], + "hints": { + "index": 2733 + } + }, + { + "items": [ + 1897.5, + null + ], + "hints": { + "index": 2734 + } + }, + { + "items": [ + 1898, + null + ], + "hints": { + "index": 2735 + } + }, + { + "items": [ + 1898.5, + null + ], + "hints": { + "index": 2736 + } + }, + { + "items": [ + 1899, + null + ], + "hints": { + "index": 2737 + } + }, + { + "items": [ + 1899.5, + null + ], + "hints": { + "index": 2738 + } + }, + { + "items": [ + 1900, + null + ], + "hints": { + "index": 2739 + } + }, + { + "items": [ + 1900.5, + null + ], + "hints": { + "index": 2740 + } + }, + { + "items": [ + 1901, + null + ], + "hints": { + "index": 2741 + } + }, + { + "items": [ + 1901.5, + null + ], + "hints": { + "index": 2742 + } + }, + { + "items": [ + 1902, + null + ], + "hints": { + "index": 2743 + } + }, + { + "items": [ + 1902.5, + null + ], + "hints": { + "index": 2744 + } + }, + { + "items": [ + 1903, + null + ], + "hints": { + "index": 2745 + } + }, + { + "items": [ + 1903.5, + null + ], + "hints": { + "index": 2746 + } + }, + { + "items": [ + 1904, + null + ], + "hints": { + "index": 2747 + } + }, + { + "items": [ + 1904.5, + null + ], + "hints": { + "index": 2748 + } + }, + { + "items": [ + 1905, + null + ], + "hints": { + "index": 2749 + } + }, + { + "items": [ + 1905.5, + null + ], + "hints": { + "index": 2750 + } + }, + { + "items": [ + 1906, + null + ], + "hints": { + "index": 2751 + } + }, + { + "items": [ + 1906.5, + null + ], + "hints": { + "index": 2752 + } + }, + { + "items": [ + 1907, + null + ], + "hints": { + "index": 2753 + } + }, + { + "items": [ + 1907.5, + null + ], + "hints": { + "index": 2754 + } + }, + { + "items": [ + 1908, + null + ], + "hints": { + "index": 2755 + } + }, + { + "items": [ + 1908.5, + null + ], + "hints": { + "index": 2756 + } + }, + { + "items": [ + 1909, + null + ], + "hints": { + "index": 2757 + } + }, + { + "items": [ + 1909.5, + null + ], + "hints": { + "index": 2758 + } + }, + { + "items": [ + 1910, + null + ], + "hints": { + "index": 2759 + } + }, + { + "items": [ + 1910.5, + null + ], + "hints": { + "index": 2760 + } + }, + { + "items": [ + 1911, + null + ], + "hints": { + "index": 2761 + } + }, + { + "items": [ + 1911.5, + null + ], + "hints": { + "index": 2762 + } + }, + { + "items": [ + 1912, + null + ], + "hints": { + "index": 2763 + } + }, + { + "items": [ + 1912.5, + null + ], + "hints": { + "index": 2764 + } + }, + { + "items": [ + 1913, + null + ], + "hints": { + "index": 2765 + } + }, + { + "items": [ + 1913.5, + null + ], + "hints": { + "index": 2766 + } + }, + { + "items": [ + 1914, + null + ], + "hints": { + "index": 2767 + } + }, + { + "items": [ + 1914.5, + null + ], + "hints": { + "index": 2768 + } + }, + { + "items": [ + 1915, + null + ], + "hints": { + "index": 2769 + } + }, + { + "items": [ + 1915.5, + null + ], + "hints": { + "index": 2770 + } + }, + { + "items": [ + 1916, + null + ], + "hints": { + "index": 2771 + } + }, + { + "items": [ + 1916.5, + null + ], + "hints": { + "index": 2772 + } + }, + { + "items": [ + 1917, + null + ], + "hints": { + "index": 2773 + } + }, + { + "items": [ + 1917.5, + null + ], + "hints": { + "index": 2774 + } + }, + { + "items": [ + 1918, + null + ], + "hints": { + "index": 2775 + } + }, + { + "items": [ + 1918.5, + null + ], + "hints": { + "index": 2776 + } + }, + { + "items": [ + 1919, + null + ], + "hints": { + "index": 2777 + } + }, + { + "items": [ + 1919.5, + null + ], + "hints": { + "index": 2778 + } + }, + { + "items": [ + 1920, + null + ], + "hints": { + "index": 2779 + } + }, + { + "items": [ + 1920.5, + null + ], + "hints": { + "index": 2780 + } + }, + { + "items": [ + 1921, + null + ], + "hints": { + "index": 2781 + } + }, + { + "items": [ + 1921.5, + null + ], + "hints": { + "index": 2782 + } + }, + { + "items": [ + 1922, + null + ], + "hints": { + "index": 2783 + } + }, + { + "items": [ + 1922.5, + null + ], + "hints": { + "index": 2784 + } + }, + { + "items": [ + 1923, + null + ], + "hints": { + "index": 2785 + } + }, + { + "items": [ + 1923.5, + null + ], + "hints": { + "index": 2786 + } + }, + { + "items": [ + 1924, + null + ], + "hints": { + "index": 2787 + } + }, + { + "items": [ + 1924.5, + null + ], + "hints": { + "index": 2788 + } + }, + { + "items": [ + 1925, + null + ], + "hints": { + "index": 2789 + } + }, + { + "items": [ + 1925.5, + null + ], + "hints": { + "index": 2790 + } + }, + { + "items": [ + 1926, + null + ], + "hints": { + "index": 2791 + } + }, + { + "items": [ + 1926.5, + null + ], + "hints": { + "index": 2792 + } + }, + { + "items": [ + 1927, + null + ], + "hints": { + "index": 2793 + } + }, + { + "items": [ + 1927.5, + null + ], + "hints": { + "index": 2794 + } + }, + { + "items": [ + 1928, + null + ], + "hints": { + "index": 2795 + } + }, + { + "items": [ + 1928.5, + null + ], + "hints": { + "index": 2796 + } + }, + { + "items": [ + 1929, + null + ], + "hints": { + "index": 2797 + } + }, + { + "items": [ + 1929.5, + null + ], + "hints": { + "index": 2798 + } + }, + { + "items": [ + 1930, + null + ], + "hints": { + "index": 2799 + } + }, + { + "items": [ + 1930.5, + null + ], + "hints": { + "index": 2800 + } + }, + { + "items": [ + 1931, + null + ], + "hints": { + "index": 2801 + } + }, + { + "items": [ + 1931.5, + null + ], + "hints": { + "index": 2802 + } + }, + { + "items": [ + 1932, + null + ], + "hints": { + "index": 2803 + } + }, + { + "items": [ + 1932.5, + null + ], + "hints": { + "index": 2804 + } + }, + { + "items": [ + 1933, + null + ], + "hints": { + "index": 2805 + } + }, + { + "items": [ + 1933.5, + null + ], + "hints": { + "index": 2806 + } + }, + { + "items": [ + 1934, + null + ], + "hints": { + "index": 2807 + } + }, + { + "items": [ + 1934.5, + null + ], + "hints": { + "index": 2808 + } + }, + { + "items": [ + 1935, + null + ], + "hints": { + "index": 2809 + } + }, + { + "items": [ + 1935.5, + null + ], + "hints": { + "index": 2810 + } + }, + { + "items": [ + 1936, + null + ], + "hints": { + "index": 2811 + } + }, + { + "items": [ + 1936.5, + null + ], + "hints": { + "index": 2812 + } + }, + { + "items": [ + 1937, + null + ], + "hints": { + "index": 2813 + } + }, + { + "items": [ + 1937.5, + null + ], + "hints": { + "index": 2814 + } + }, + { + "items": [ + 1938, + null + ], + "hints": { + "index": 2815 + } + }, + { + "items": [ + 1938.5, + null + ], + "hints": { + "index": 2816 + } + }, + { + "items": [ + 1939, + null + ], + "hints": { + "index": 2817 + } + }, + { + "items": [ + 1939.5, + null + ], + "hints": { + "index": 2818 + } + }, + { + "items": [ + 1940, + null + ], + "hints": { + "index": 2819 + } + }, + { + "items": [ + 1940.5, + null + ], + "hints": { + "index": 2820 + } + }, + { + "items": [ + 1941, + null + ], + "hints": { + "index": 2821 + } + }, + { + "items": [ + 1941.5, + null + ], + "hints": { + "index": 2822 + } + }, + { + "items": [ + 1942, + null + ], + "hints": { + "index": 2823 + } + }, + { + "items": [ + 1942.5, + null + ], + "hints": { + "index": 2824 + } + }, + { + "items": [ + 1943, + null + ], + "hints": { + "index": 2825 + } + }, + { + "items": [ + 1943.5, + null + ], + "hints": { + "index": 2826 + } + }, + { + "items": [ + 1944, + null + ], + "hints": { + "index": 2827 + } + }, + { + "items": [ + 1944.5, + null + ], + "hints": { + "index": 2828 + } + }, + { + "items": [ + 1945, + null + ], + "hints": { + "index": 2829 + } + }, + { + "items": [ + 1945.5, + null + ], + "hints": { + "index": 2830 + } + }, + { + "items": [ + 1946, + null + ], + "hints": { + "index": 2831 + } + }, + { + "items": [ + 1946.5, + null + ], + "hints": { + "index": 2832 + } + }, + { + "items": [ + 1947, + null + ], + "hints": { + "index": 2833 + } + }, + { + "items": [ + 1947.5, + null + ], + "hints": { + "index": 2834 + } + }, + { + "items": [ + 1948, + null + ], + "hints": { + "index": 2835 + } + }, + { + "items": [ + 1948.5, + null + ], + "hints": { + "index": 2836 + } + }, + { + "items": [ + 1949, + null + ], + "hints": { + "index": 2837 + } + }, + { + "items": [ + 1949.5, + null + ], + "hints": { + "index": 2838 + } + }, + { + "items": [ + 1950, + null + ], + "hints": { + "index": 2839 + } + }, + { + "items": [ + 1950.5, + null + ], + "hints": { + "index": 2840 + } + }, + { + "items": [ + 1951, + null + ], + "hints": { + "index": 2841 + } + }, + { + "items": [ + 1951.5, + null + ], + "hints": { + "index": 2842 + } + }, + { + "items": [ + 1952, + null + ], + "hints": { + "index": 2843 + } + }, + { + "items": [ + 1952.5, + null + ], + "hints": { + "index": 2844 + } + }, + { + "items": [ + 1953, + null + ], + "hints": { + "index": 2845 + } + }, + { + "items": [ + 1953.5, + null + ], + "hints": { + "index": 2846 + } + }, + { + "items": [ + 1954, + null + ], + "hints": { + "index": 2847 + } + }, + { + "items": [ + 1954.5, + null + ], + "hints": { + "index": 2848 + } + }, + { + "items": [ + 1955, + null + ], + "hints": { + "index": 2849 + } + }, + { + "items": [ + 1955.5, + null + ], + "hints": { + "index": 2850 + } + }, + { + "items": [ + 1956, + null + ], + "hints": { + "index": 2851 + } + }, + { + "items": [ + 1956.5, + null + ], + "hints": { + "index": 2852 + } + }, + { + "items": [ + 1957, + null + ], + "hints": { + "index": 2853 + } + }, + { + "items": [ + 1957.5, + null + ], + "hints": { + "index": 2854 + } + }, + { + "items": [ + 1958, + null + ], + "hints": { + "index": 2855 + } + }, + { + "items": [ + 1958.5, + null + ], + "hints": { + "index": 2856 + } + }, + { + "items": [ + 1959, + null + ], + "hints": { + "index": 2857 + } + }, + { + "items": [ + 1959.5, + null + ], + "hints": { + "index": 2858 + } + }, + { + "items": [ + 1960, + null + ], + "hints": { + "index": 2859 + } + }, + { + "items": [ + 1960.5, + null + ], + "hints": { + "index": 2860 + } + }, + { + "items": [ + 1961, + null + ], + "hints": { + "index": 2861 + } + }, + { + "items": [ + 1961.5, + null + ], + "hints": { + "index": 2862 + } + }, + { + "items": [ + 1962, + null + ], + "hints": { + "index": 2863 + } + }, + { + "items": [ + 1962.5, + null + ], + "hints": { + "index": 2864 + } + }, + { + "items": [ + 1963, + null + ], + "hints": { + "index": 2865 + } + }, + { + "items": [ + 1963.5, + null + ], + "hints": { + "index": 2866 + } + }, + { + "items": [ + 1964, + null + ], + "hints": { + "index": 2867 + } + }, + { + "items": [ + 1964.5, + null + ], + "hints": { + "index": 2868 + } + }, + { + "items": [ + 1965, + null + ], + "hints": { + "index": 2869 + } + }, + { + "items": [ + 1965.5, + null + ], + "hints": { + "index": 2870 + } + }, + { + "items": [ + 1966, + null + ], + "hints": { + "index": 2871 + } + }, + { + "items": [ + 1966.5, + null + ], + "hints": { + "index": 2872 + } + }, + { + "items": [ + 1967, + null + ], + "hints": { + "index": 2873 + } + }, + { + "items": [ + 1967.5, + null + ], + "hints": { + "index": 2874 + } + }, + { + "items": [ + 1968, + null + ], + "hints": { + "index": 2875 + } + }, + { + "items": [ + 1968.5, + null + ], + "hints": { + "index": 2876 + } + }, + { + "items": [ + 1969, + null + ], + "hints": { + "index": 2877 + } + }, + { + "items": [ + 1969.5, + null + ], + "hints": { + "index": 2878 + } + }, + { + "items": [ + 1970, + null + ], + "hints": { + "index": 2879 + } + }, + { + "items": [ + 1970.5, + null + ], + "hints": { + "index": 2880 + } + }, + { + "items": [ + 1971, + null + ], + "hints": { + "index": 2881 + } + }, + { + "items": [ + 1971.5, + null + ], + "hints": { + "index": 2882 + } + }, + { + "items": [ + 1972, + null + ], + "hints": { + "index": 2883 + } + }, + { + "items": [ + 1972.5, + null + ], + "hints": { + "index": 2884 + } + }, + { + "items": [ + 1973, + null + ], + "hints": { + "index": 2885 + } + }, + { + "items": [ + 1973.5, + null + ], + "hints": { + "index": 2886 + } + }, + { + "items": [ + 1974, + null + ], + "hints": { + "index": 2887 + } + }, + { + "items": [ + 1974.5, + null + ], + "hints": { + "index": 2888 + } + }, + { + "items": [ + 1975, + null + ], + "hints": { + "index": 2889 + } + }, + { + "items": [ + 1975.5, + null + ], + "hints": { + "index": 2890 + } + }, + { + "items": [ + 1976, + null + ], + "hints": { + "index": 2891 + } + }, + { + "items": [ + 1976.5, + null + ], + "hints": { + "index": 2892 + } + }, + { + "items": [ + 1977, + null + ], + "hints": { + "index": 2893 + } + }, + { + "items": [ + 1977.5, + null + ], + "hints": { + "index": 2894 + } + }, + { + "items": [ + 1978, + null + ], + "hints": { + "index": 2895 + } + }, + { + "items": [ + 1978.5, + null + ], + "hints": { + "index": 2896 + } + }, + { + "items": [ + 1979, + null + ], + "hints": { + "index": 2897 + } + }, + { + "items": [ + 1979.5, + null + ], + "hints": { + "index": 2898 + } + }, + { + "items": [ + 1980, + null + ], + "hints": { + "index": 2899 + } + }, + { + "items": [ + 1980.5, + null + ], + "hints": { + "index": 2900 + } + }, + { + "items": [ + 1981, + null + ], + "hints": { + "index": 2901 + } + }, + { + "items": [ + 1981.5, + null + ], + "hints": { + "index": 2902 + } + }, + { + "items": [ + 1982, + null + ], + "hints": { + "index": 2903 + } + }, + { + "items": [ + 1982.5, + null + ], + "hints": { + "index": 2904 + } + }, + { + "items": [ + 1983, + null + ], + "hints": { + "index": 2905 + } + }, + { + "items": [ + 1983.5, + null + ], + "hints": { + "index": 2906 + } + }, + { + "items": [ + 1984, + null + ], + "hints": { + "index": 2907 + } + }, + { + "items": [ + 1984.5, + null + ], + "hints": { + "index": 2908 + } + }, + { + "items": [ + 1985, + null + ], + "hints": { + "index": 2909 + } + }, + { + "items": [ + 1985.5, + null + ], + "hints": { + "index": 2910 + } + }, + { + "items": [ + 1986, + null + ], + "hints": { + "index": 2911 + } + }, + { + "items": [ + 1986.5, + null + ], + "hints": { + "index": 2912 + } + }, + { + "items": [ + 1987, + null + ], + "hints": { + "index": 2913 + } + }, + { + "items": [ + 1987.5, + null + ], + "hints": { + "index": 2914 + } + }, + { + "items": [ + 1988, + null + ], + "hints": { + "index": 2915 + } + }, + { + "items": [ + 1988.5, + null + ], + "hints": { + "index": 2916 + } + }, + { + "items": [ + 1989, + null + ], + "hints": { + "index": 2917 + } + }, + { + "items": [ + 1989.5, + null + ], + "hints": { + "index": 2918 + } + }, + { + "items": [ + 1990, + null + ], + "hints": { + "index": 2919 + } + }, + { + "items": [ + 1990.5, + null + ], + "hints": { + "index": 2920 + } + }, + { + "items": [ + 1991, + null + ], + "hints": { + "index": 2921 + } + }, + { + "items": [ + 1991.5, + null + ], + "hints": { + "index": 2922 + } + }, + { + "items": [ + 1992, + null + ], + "hints": { + "index": 2923 + } + }, + { + "items": [ + 1992.5, + null + ], + "hints": { + "index": 2924 + } + }, + { + "items": [ + 1993, + null + ], + "hints": { + "index": 2925 + } + }, + { + "items": [ + 1993.5, + null + ], + "hints": { + "index": 2926 + } + }, + { + "items": [ + 1994, + null + ], + "hints": { + "index": 2927 + } + }, + { + "items": [ + 1994.5, + null + ], + "hints": { + "index": 2928 + } + }, + { + "items": [ + 1995, + null + ], + "hints": { + "index": 2929 + } + }, + { + "items": [ + 1995.5, + null + ], + "hints": { + "index": 2930 + } + }, + { + "items": [ + 1996, + null + ], + "hints": { + "index": 2931 + } + }, + { + "items": [ + 1996.5, + null + ], + "hints": { + "index": 2932 + } + }, + { + "items": [ + 1997, + null + ], + "hints": { + "index": 2933 + } + }, + { + "items": [ + 1997.5, + null + ], + "hints": { + "index": 2934 + } + }, + { + "items": [ + 1998, + null + ], + "hints": { + "index": 2935 + } + }, + { + "items": [ + 1998.5, + null + ], + "hints": { + "index": 2936 + } + }, + { + "items": [ + 1999, + null + ], + "hints": { + "index": 2937 + } + }, + { + "items": [ + 1999.5, + null + ], + "hints": { + "index": 2938 + } + }, + { + "items": [ + 2000, + null + ], + "hints": { + "index": 2939 + } + }, + { + "items": [ + 2000.5, + null + ], + "hints": { + "index": 2940 + } + }, + { + "items": [ + 2001, + null + ], + "hints": { + "index": 2941 + } + }, + { + "items": [ + 2001.5, + null + ], + "hints": { + "index": 2942 + } + }, + { + "items": [ + 2002, + null + ], + "hints": { + "index": 2943 + } + }, + { + "items": [ + 2002.5, + null + ], + "hints": { + "index": 2944 + } + }, + { + "items": [ + 2003, + null + ], + "hints": { + "index": 2945 + } + }, + { + "items": [ + 2003.5, + null + ], + "hints": { + "index": 2946 + } + }, + { + "items": [ + 2004, + null + ], + "hints": { + "index": 2947 + } + }, + { + "items": [ + 2004.5, + null + ], + "hints": { + "index": 2948 + } + }, + { + "items": [ + 2005, + null + ], + "hints": { + "index": 2949 + } + }, + { + "items": [ + 2005.5, + null + ], + "hints": { + "index": 2950 + } + }, + { + "items": [ + 2006, + null + ], + "hints": { + "index": 2951 + } + }, + { + "items": [ + 2006.5, + null + ], + "hints": { + "index": 2952 + } + }, + { + "items": [ + 2007, + null + ], + "hints": { + "index": 2953 + } + }, + { + "items": [ + 2007.5, + null + ], + "hints": { + "index": 2954 + } + }, + { + "items": [ + 2008, + null + ], + "hints": { + "index": 2955 + } + }, + { + "items": [ + 2008.5, + null + ], + "hints": { + "index": 2956 + } + }, + { + "items": [ + 2009, + null + ], + "hints": { + "index": 2957 + } + }, + { + "items": [ + 2009.5, + null + ], + "hints": { + "index": 2958 + } + }, + { + "items": [ + 2010, + null + ], + "hints": { + "index": 2959 + } + }, + { + "items": [ + 2010.5, + null + ], + "hints": { + "index": 2960 + } + }, + { + "items": [ + 2011, + null + ], + "hints": { + "index": 2961 + } + }, + { + "items": [ + 2011.5, + null + ], + "hints": { + "index": 2962 + } + }, + { + "items": [ + 2012, + null + ], + "hints": { + "index": 2963 + } + }, + { + "items": [ + 2012.5, + null + ], + "hints": { + "index": 2964 + } + }, + { + "items": [ + 2013, + null + ], + "hints": { + "index": 2965 + } + }, + { + "items": [ + 2013.5, + null + ], + "hints": { + "index": 2966 + } + }, + { + "items": [ + 2014, + null + ], + "hints": { + "index": 2967 + } + }, + { + "items": [ + 2014.5, + null + ], + "hints": { + "index": 2968 + } + }, + { + "items": [ + 2015, + null + ], + "hints": { + "index": 2969 + } + }, + { + "items": [ + 2015.5, + null + ], + "hints": { + "index": 2970 + } + }, + { + "items": [ + 2016, + null + ], + "hints": { + "index": 2971 + } + }, + { + "items": [ + 2016.5, + null + ], + "hints": { + "index": 2972 + } + }, + { + "items": [ + 2017, + null + ], + "hints": { + "index": 2973 + } + }, + { + "items": [ + 2017.5, + null + ], + "hints": { + "index": 2974 + } + }, + { + "items": [ + 2018, + null + ], + "hints": { + "index": 2975 + } + }, + { + "items": [ + 2018.5, + null + ], + "hints": { + "index": 2976 + } + }, + { + "items": [ + 2019, + null + ], + "hints": { + "index": 2977 + } + }, + { + "items": [ + 2019.5, + null + ], + "hints": { + "index": 2978 + } + }, + { + "items": [ + 2020, + null + ], + "hints": { + "index": 2979 + } + }, + { + "items": [ + 2020.5, + null + ], + "hints": { + "index": 2980 + } + }, + { + "items": [ + 2021, + null + ], + "hints": { + "index": 2981 + } + }, + { + "items": [ + 2021.5, + null + ], + "hints": { + "index": 2982 + } + }, + { + "items": [ + 2022, + null + ], + "hints": { + "index": 2983 + } + }, + { + "items": [ + 2022.5, + null + ], + "hints": { + "index": 2984 + } + }, + { + "items": [ + 2023, + null + ], + "hints": { + "index": 2985 + } + }, + { + "items": [ + 2023.5, + null + ], + "hints": { + "index": 2986 + } + }, + { + "items": [ + 2024, + null + ], + "hints": { + "index": 2987 + } + }, + { + "items": [ + 2024.5, + null + ], + "hints": { + "index": 2988 + } + }, + { + "items": [ + 2025, + null + ], + "hints": { + "index": 2989 + } + }, + { + "items": [ + 2025.5, + null + ], + "hints": { + "index": 2990 + } + }, + { + "items": [ + 2026, + null + ], + "hints": { + "index": 2991 + } + }, + { + "items": [ + 2026.5, + null + ], + "hints": { + "index": 2992 + } + }, + { + "items": [ + 2027, + null + ], + "hints": { + "index": 2993 + } + }, + { + "items": [ + 2027.5, + null + ], + "hints": { + "index": 2994 + } + }, + { + "items": [ + 2028, + null + ], + "hints": { + "index": 2995 + } + }, + { + "items": [ + 2028.5, + null + ], + "hints": { + "index": 2996 + } + }, + { + "items": [ + 2029, + null + ], + "hints": { + "index": 2997 + } + }, + { + "items": [ + 2029.5, + null + ], + "hints": { + "index": 2998 + } + }, + { + "items": [ + 2030, + null + ], + "hints": { + "index": 2999 + } + }, + { + "items": [ + 2030.5, + null + ], + "hints": { + "index": 3000 + } + }, + { + "items": [ + 2031, + null + ], + "hints": { + "index": 3001 + } + }, + { + "items": [ + 2031.5, + null + ], + "hints": { + "index": 3002 + } + }, + { + "items": [ + 2032, + null + ], + "hints": { + "index": 3003 + } + }, + { + "items": [ + 2032.5, + null + ], + "hints": { + "index": 3004 + } + }, + { + "items": [ + 2033, + null + ], + "hints": { + "index": 3005 + } + }, + { + "items": [ + 2033.5, + null + ], + "hints": { + "index": 3006 + } + }, + { + "items": [ + 2034, + null + ], + "hints": { + "index": 3007 + } + }, + { + "items": [ + 2034.5, + null + ], + "hints": { + "index": 3008 + } + }, + { + "items": [ + 2035, + null + ], + "hints": { + "index": 3009 + } + }, + { + "items": [ + 2035.5, + null + ], + "hints": { + "index": 3010 + } + }, + { + "items": [ + 2036, + null + ], + "hints": { + "index": 3011 + } + }, + { + "items": [ + 2036.5, + null + ], + "hints": { + "index": 3012 + } + }, + { + "items": [ + 2037, + null + ], + "hints": { + "index": 3013 + } + }, + { + "items": [ + 2037.5, + null + ], + "hints": { + "index": 3014 + } + }, + { + "items": [ + 2038, + null + ], + "hints": { + "index": 3015 + } + }, + { + "items": [ + 2038.5, + null + ], + "hints": { + "index": 3016 + } + }, + { + "items": [ + 2039, + null + ], + "hints": { + "index": 3017 + } + }, + { + "items": [ + 2039.5, + null + ], + "hints": { + "index": 3018 + } + }, + { + "items": [ + 2040, + null + ], + "hints": { + "index": 3019 + } + }, + { + "items": [ + 2040.5, + null + ], + "hints": { + "index": 3020 + } + }, + { + "items": [ + 2041, + null + ], + "hints": { + "index": 3021 + } + }, + { + "items": [ + 2041.5, + null + ], + "hints": { + "index": 3022 + } + }, + { + "items": [ + 2042, + null + ], + "hints": { + "index": 3023 + } + }, + { + "items": [ + 2042.5, + null + ], + "hints": { + "index": 3024 + } + }, + { + "items": [ + 2043, + null + ], + "hints": { + "index": 3025 + } + }, + { + "items": [ + 2043.5, + null + ], + "hints": { + "index": 3026 + } + }, + { + "items": [ + 2044, + null + ], + "hints": { + "index": 3027 + } + }, + { + "items": [ + 2044.5, + null + ], + "hints": { + "index": 3028 + } + }, + { + "items": [ + 2045, + null + ], + "hints": { + "index": 3029 + } + }, + { + "items": [ + 2045.5, + null + ], + "hints": { + "index": 3030 + } + }, + { + "items": [ + 2046, + null + ], + "hints": { + "index": 3031 + } + }, + { + "items": [ + 2046.5, + null + ], + "hints": { + "index": 3032 + } + }, + { + "items": [ + 2047, + null + ], + "hints": { + "index": 3033 + } + }, + { + "items": [ + 2047.5, + null + ], + "hints": { + "index": 3034 + } + }, + { + "items": [ + 2048, + null + ], + "hints": { + "index": 3035 + } + }, + { + "items": [ + 2048.5, + null + ], + "hints": { + "index": 3036 + } + }, + { + "items": [ + 2049, + null + ], + "hints": { + "index": 3037 + } + }, + { + "items": [ + 2049.5, + null + ], + "hints": { + "index": 3038 + } + }, + { + "items": [ + 2050, + null + ], + "hints": { + "index": 3039 + } + }, + { + "items": [ + 2050.5, + null + ], + "hints": { + "index": 3040 + } + }, + { + "items": [ + 2051, + null + ], + "hints": { + "index": 3041 + } + }, + { + "items": [ + 2051.5, + null + ], + "hints": { + "index": 3042 + } + }, + { + "items": [ + 2052, + null + ], + "hints": { + "index": 3043 + } + }, + { + "items": [ + 2052.5, + null + ], + "hints": { + "index": 3044 + } + }, + { + "items": [ + 2053, + null + ], + "hints": { + "index": 3045 + } + }, + { + "items": [ + 2053.5, + null + ], + "hints": { + "index": 3046 + } + }, + { + "items": [ + 2054, + null + ], + "hints": { + "index": 3047 + } + }, + { + "items": [ + 2054.5, + null + ], + "hints": { + "index": 3048 + } + }, + { + "items": [ + 2055, + null + ], + "hints": { + "index": 3049 + } + }, + { + "items": [ + 2055.5, + null + ], + "hints": { + "index": 3050 + } + }, + { + "items": [ + 2056, + null + ], + "hints": { + "index": 3051 + } + }, + { + "items": [ + 2056.5, + null + ], + "hints": { + "index": 3052 + } + }, + { + "items": [ + 2057, + null + ], + "hints": { + "index": 3053 + } + }, + { + "items": [ + 2057.5, + null + ], + "hints": { + "index": 3054 + } + }, + { + "items": [ + 2058, + null + ], + "hints": { + "index": 3055 + } + }, + { + "items": [ + 2058.5, + null + ], + "hints": { + "index": 3056 + } + }, + { + "items": [ + 2059, + null + ], + "hints": { + "index": 3057 + } + }, + { + "items": [ + 2059.5, + null + ], + "hints": { + "index": 3058 + } + }, + { + "items": [ + 2060, + null + ], + "hints": { + "index": 3059 + } + }, + { + "items": [ + 2060.5, + null + ], + "hints": { + "index": 3060 + } + }, + { + "items": [ + 2061, + null + ], + "hints": { + "index": 3061 + } + }, + { + "items": [ + 2061.5, + null + ], + "hints": { + "index": 3062 + } + }, + { + "items": [ + 2062, + null + ], + "hints": { + "index": 3063 + } + }, + { + "items": [ + 2062.5, + null + ], + "hints": { + "index": 3064 + } + }, + { + "items": [ + 2063, + null + ], + "hints": { + "index": 3065 + } + }, + { + "items": [ + 2063.5, + null + ], + "hints": { + "index": 3066 + } + }, + { + "items": [ + 2064, + null + ], + "hints": { + "index": 3067 + } + }, + { + "items": [ + 2064.5, + null + ], + "hints": { + "index": 3068 + } + }, + { + "items": [ + 2065, + null + ], + "hints": { + "index": 3069 + } + }, + { + "items": [ + 2065.5, + null + ], + "hints": { + "index": 3070 + } + }, + { + "items": [ + 2066, + null + ], + "hints": { + "index": 3071 + } + }, + { + "items": [ + 2066.5, + null + ], + "hints": { + "index": 3072 + } + }, + { + "items": [ + 2067, + null + ], + "hints": { + "index": 3073 + } + }, + { + "items": [ + 2067.5, + null + ], + "hints": { + "index": 3074 + } + }, + { + "items": [ + 2068, + null + ], + "hints": { + "index": 3075 + } + }, + { + "items": [ + 2068.5, + null + ], + "hints": { + "index": 3076 + } + }, + { + "items": [ + 2069, + null + ], + "hints": { + "index": 3077 + } + }, + { + "items": [ + 2069.5, + null + ], + "hints": { + "index": 3078 + } + }, + { + "items": [ + 2070, + null + ], + "hints": { + "index": 3079 + } + }, + { + "items": [ + 2070.5, + null + ], + "hints": { + "index": 3080 + } + }, + { + "items": [ + 2071, + null + ], + "hints": { + "index": 3081 + } + }, + { + "items": [ + 2071.5, + null + ], + "hints": { + "index": 3082 + } + }, + { + "items": [ + 2072, + null + ], + "hints": { + "index": 3083 + } + }, + { + "items": [ + 2072.5, + null + ], + "hints": { + "index": 3084 + } + }, + { + "items": [ + 2073, + null + ], + "hints": { + "index": 3085 + } + }, + { + "items": [ + 2073.5, + null + ], + "hints": { + "index": 3086 + } + }, + { + "items": [ + 2074, + null + ], + "hints": { + "index": 3087 + } + }, + { + "items": [ + 2074.5, + null + ], + "hints": { + "index": 3088 + } + }, + { + "items": [ + 2075, + null + ], + "hints": { + "index": 3089 + } + }, + { + "items": [ + 2075.5, + null + ], + "hints": { + "index": 3090 + } + }, + { + "items": [ + 2076, + null + ], + "hints": { + "index": 3091 + } + }, + { + "items": [ + 2076.5, + null + ], + "hints": { + "index": 3092 + } + }, + { + "items": [ + 2077, + null + ], + "hints": { + "index": 3093 + } + }, + { + "items": [ + 2077.5, + null + ], + "hints": { + "index": 3094 + } + }, + { + "items": [ + 2078, + null + ], + "hints": { + "index": 3095 + } + }, + { + "items": [ + 2078.5, + null + ], + "hints": { + "index": 3096 + } + }, + { + "items": [ + 2079, + null + ], + "hints": { + "index": 3097 + } + }, + { + "items": [ + 2079.5, + null + ], + "hints": { + "index": 3098 + } + }, + { + "items": [ + 2080, + null + ], + "hints": { + "index": 3099 + } + }, + { + "items": [ + 2080.5, + null + ], + "hints": { + "index": 3100 + } + }, + { + "items": [ + 2081, + null + ], + "hints": { + "index": 3101 + } + }, + { + "items": [ + 2081.5, + null + ], + "hints": { + "index": 3102 + } + }, + { + "items": [ + 2082, + null + ], + "hints": { + "index": 3103 + } + }, + { + "items": [ + 2082.5, + null + ], + "hints": { + "index": 3104 + } + }, + { + "items": [ + 2083, + null + ], + "hints": { + "index": 3105 + } + }, + { + "items": [ + 2083.5, + null + ], + "hints": { + "index": 3106 + } + }, + { + "items": [ + 2084, + null + ], + "hints": { + "index": 3107 + } + }, + { + "items": [ + 2084.5, + null + ], + "hints": { + "index": 3108 + } + }, + { + "items": [ + 2085, + null + ], + "hints": { + "index": 3109 + } + }, + { + "items": [ + 2085.5, + null + ], + "hints": { + "index": 3110 + } + }, + { + "items": [ + 2086, + null + ], + "hints": { + "index": 3111 + } + }, + { + "items": [ + 2086.5, + null + ], + "hints": { + "index": 3112 + } + }, + { + "items": [ + 2087, + null + ], + "hints": { + "index": 3113 + } + }, + { + "items": [ + 2087.5, + null + ], + "hints": { + "index": 3114 + } + }, + { + "items": [ + 2088, + null + ], + "hints": { + "index": 3115 + } + }, + { + "items": [ + 2088.5, + null + ], + "hints": { + "index": 3116 + } + }, + { + "items": [ + 2089, + null + ], + "hints": { + "index": 3117 + } + }, + { + "items": [ + 2089.5, + null + ], + "hints": { + "index": 3118 + } + }, + { + "items": [ + 2090, + null + ], + "hints": { + "index": 3119 + } + }, + { + "items": [ + 2090.5, + null + ], + "hints": { + "index": 3120 + } + }, + { + "items": [ + 2091, + null + ], + "hints": { + "index": 3121 + } + }, + { + "items": [ + 2091.5, + null + ], + "hints": { + "index": 3122 + } + }, + { + "items": [ + 2092, + null + ], + "hints": { + "index": 3123 + } + }, + { + "items": [ + 2092.5, + null + ], + "hints": { + "index": 3124 + } + }, + { + "items": [ + 2093, + null + ], + "hints": { + "index": 3125 + } + }, + { + "items": [ + 2093.5, + null + ], + "hints": { + "index": 3126 + } + }, + { + "items": [ + 2094, + null + ], + "hints": { + "index": 3127 + } + }, + { + "items": [ + 2094.5, + null + ], + "hints": { + "index": 3128 + } + }, + { + "items": [ + 2095, + null + ], + "hints": { + "index": 3129 + } + }, + { + "items": [ + 2095.5, + null + ], + "hints": { + "index": 3130 + } + }, + { + "items": [ + 2096, + null + ], + "hints": { + "index": 3131 + } + }, + { + "items": [ + 2096.5, + null + ], + "hints": { + "index": 3132 + } + }, + { + "items": [ + 2097, + null + ], + "hints": { + "index": 3133 + } + }, + { + "items": [ + 2097.5, + null + ], + "hints": { + "index": 3134 + } + }, + { + "items": [ + 2098, + null + ], + "hints": { + "index": 3135 + } + }, + { + "items": [ + 2098.5, + null + ], + "hints": { + "index": 3136 + } + }, + { + "items": [ + 2099, + null + ], + "hints": { + "index": 3137 + } + }, + { + "items": [ + 2099.5, + null + ], + "hints": { + "index": 3138 + } + }, + { + "items": [ + 2100, + null + ], + "hints": { + "index": 3139 + } + }, + { + "items": [ + 2100.5, + null + ], + "hints": { + "index": 3140 + } + }, + { + "items": [ + 2101, + null + ], + "hints": { + "index": 3141 + } + }, + { + "items": [ + 2101.5, + null + ], + "hints": { + "index": 3142 + } + }, + { + "items": [ + 2102, + null + ], + "hints": { + "index": 3143 + } + }, + { + "items": [ + 2102.5, + null + ], + "hints": { + "index": 3144 + } + }, + { + "items": [ + 2103, + null + ], + "hints": { + "index": 3145 + } + }, + { + "items": [ + 2103.5, + null + ], + "hints": { + "index": 3146 + } + }, + { + "items": [ + 2104, + null + ], + "hints": { + "index": 3147 + } + }, + { + "items": [ + 2104.5, + null + ], + "hints": { + "index": 3148 + } + }, + { + "items": [ + 2105, + null + ], + "hints": { + "index": 3149 + } + }, + { + "items": [ + 2105.5, + null + ], + "hints": { + "index": 3150 + } + }, + { + "items": [ + 2106, + null + ], + "hints": { + "index": 3151 + } + }, + { + "items": [ + 2106.5, + null + ], + "hints": { + "index": 3152 + } + }, + { + "items": [ + 2107, + null + ], + "hints": { + "index": 3153 + } + }, + { + "items": [ + 2107.5, + null + ], + "hints": { + "index": 3154 + } + }, + { + "items": [ + 2108, + null + ], + "hints": { + "index": 3155 + } + }, + { + "items": [ + 2108.5, + null + ], + "hints": { + "index": 3156 + } + }, + { + "items": [ + 2109, + null + ], + "hints": { + "index": 3157 + } + }, + { + "items": [ + 2109.5, + null + ], + "hints": { + "index": 3158 + } + }, + { + "items": [ + 2110, + null + ], + "hints": { + "index": 3159 + } + }, + { + "items": [ + 2110.5, + null + ], + "hints": { + "index": 3160 + } + }, + { + "items": [ + 2111, + null + ], + "hints": { + "index": 3161 + } + }, + { + "items": [ + 2111.5, + null + ], + "hints": { + "index": 3162 + } + }, + { + "items": [ + 2112, + null + ], + "hints": { + "index": 3163 + } + }, + { + "items": [ + 2112.5, + null + ], + "hints": { + "index": 3164 + } + }, + { + "items": [ + 2113, + null + ], + "hints": { + "index": 3165 + } + }, + { + "items": [ + 2113.5, + null + ], + "hints": { + "index": 3166 + } + }, + { + "items": [ + 2114, + null + ], + "hints": { + "index": 3167 + } + }, + { + "items": [ + 2114.5, + null + ], + "hints": { + "index": 3168 + } + }, + { + "items": [ + 2115, + null + ], + "hints": { + "index": 3169 + } + }, + { + "items": [ + 2115.5, + null + ], + "hints": { + "index": 3170 + } + }, + { + "items": [ + 2116, + null + ], + "hints": { + "index": 3171 + } + }, + { + "items": [ + 2116.5, + null + ], + "hints": { + "index": 3172 + } + }, + { + "items": [ + 2117, + null + ], + "hints": { + "index": 3173 + } + }, + { + "items": [ + 2117.5, + null + ], + "hints": { + "index": 3174 + } + }, + { + "items": [ + 2118, + null + ], + "hints": { + "index": 3175 + } + }, + { + "items": [ + 2118.5, + null + ], + "hints": { + "index": 3176 + } + }, + { + "items": [ + 2119, + null + ], + "hints": { + "index": 3177 + } + }, + { + "items": [ + 2119.5, + null + ], + "hints": { + "index": 3178 + } + }, + { + "items": [ + 2120, + null + ], + "hints": { + "index": 3179 + } + }, + { + "items": [ + 2120.5, + null + ], + "hints": { + "index": 3180 + } + }, + { + "items": [ + 2121, + null + ], + "hints": { + "index": 3181 + } + }, + { + "items": [ + 2121.5, + null + ], + "hints": { + "index": 3182 + } + }, + { + "items": [ + 2122, + null + ], + "hints": { + "index": 3183 + } + }, + { + "items": [ + 2122.5, + null + ], + "hints": { + "index": 3184 + } + }, + { + "items": [ + 2123, + null + ], + "hints": { + "index": 3185 + } + }, + { + "items": [ + 2123.5, + null + ], + "hints": { + "index": 3186 + } + }, + { + "items": [ + 2124, + null + ], + "hints": { + "index": 3187 + } + }, + { + "items": [ + 2124.5, + null + ], + "hints": { + "index": 3188 + } + }, + { + "items": [ + 2125, + null + ], + "hints": { + "index": 3189 + } + }, + { + "items": [ + 2125.5, + null + ], + "hints": { + "index": 3190 + } + }, + { + "items": [ + 2126, + null + ], + "hints": { + "index": 3191 + } + }, + { + "items": [ + 2126.5, + null + ], + "hints": { + "index": 3192 + } + }, + { + "items": [ + 2127, + null + ], + "hints": { + "index": 3193 + } + }, + { + "items": [ + 2127.5, + null + ], + "hints": { + "index": 3194 + } + }, + { + "items": [ + 2128, + null + ], + "hints": { + "index": 3195 + } + }, + { + "items": [ + 2128.5, + null + ], + "hints": { + "index": 3196 + } + }, + { + "items": [ + 2129, + null + ], + "hints": { + "index": 3197 + } + }, + { + "items": [ + 2129.5, + null + ], + "hints": { + "index": 3198 + } + }, + { + "items": [ + 2130, + null + ], + "hints": { + "index": 3199 + } + }, + { + "items": [ + 2130.5, + null + ], + "hints": { + "index": 3200 + } + }, + { + "items": [ + 2131, + null + ], + "hints": { + "index": 3201 + } + }, + { + "items": [ + 2131.5, + null + ], + "hints": { + "index": 3202 + } + }, + { + "items": [ + 2132, + null + ], + "hints": { + "index": 3203 + } + }, + { + "items": [ + 2132.5, + null + ], + "hints": { + "index": 3204 + } + }, + { + "items": [ + 2133, + null + ], + "hints": { + "index": 3205 + } + }, + { + "items": [ + 2133.5, + null + ], + "hints": { + "index": 3206 + } + }, + { + "items": [ + 2134, + null + ], + "hints": { + "index": 3207 + } + }, + { + "items": [ + 2134.5, + null + ], + "hints": { + "index": 3208 + } + }, + { + "items": [ + 2135, + null + ], + "hints": { + "index": 3209 + } + }, + { + "items": [ + 2135.5, + null + ], + "hints": { + "index": 3210 + } + }, + { + "items": [ + 2136, + null + ], + "hints": { + "index": 3211 + } + }, + { + "items": [ + 2136.5, + null + ], + "hints": { + "index": 3212 + } + }, + { + "items": [ + 2137, + null + ], + "hints": { + "index": 3213 + } + }, + { + "items": [ + 2137.5, + null + ], + "hints": { + "index": 3214 + } + }, + { + "items": [ + 2138, + null + ], + "hints": { + "index": 3215 + } + }, + { + "items": [ + 2138.5, + null + ], + "hints": { + "index": 3216 + } + }, + { + "items": [ + 2139, + null + ], + "hints": { + "index": 3217 + } + }, + { + "items": [ + 2139.5, + null + ], + "hints": { + "index": 3218 + } + }, + { + "items": [ + 2140, + null + ], + "hints": { + "index": 3219 + } + }, + { + "items": [ + 2140.5, + null + ], + "hints": { + "index": 3220 + } + }, + { + "items": [ + 2141, + null + ], + "hints": { + "index": 3221 + } + }, + { + "items": [ + 2141.5, + null + ], + "hints": { + "index": 3222 + } + }, + { + "items": [ + 2142, + null + ], + "hints": { + "index": 3223 + } + }, + { + "items": [ + 2142.5, + null + ], + "hints": { + "index": 3224 + } + }, + { + "items": [ + 2143, + null + ], + "hints": { + "index": 3225 + } + }, + { + "items": [ + 2143.5, + null + ], + "hints": { + "index": 3226 + } + }, + { + "items": [ + 2144, + null + ], + "hints": { + "index": 3227 + } + }, + { + "items": [ + 2144.5, + null + ], + "hints": { + "index": 3228 + } + }, + { + "items": [ + 2145, + null + ], + "hints": { + "index": 3229 + } + }, + { + "items": [ + 2145.5, + null + ], + "hints": { + "index": 3230 + } + }, + { + "items": [ + 2146, + null + ], + "hints": { + "index": 3231 + } + }, + { + "items": [ + 2146.5, + null + ], + "hints": { + "index": 3232 + } + }, + { + "items": [ + 2147, + null + ], + "hints": { + "index": 3233 + } + }, + { + "items": [ + 2147.5, + null + ], + "hints": { + "index": 3234 + } + }, + { + "items": [ + 2148, + null + ], + "hints": { + "index": 3235 + } + }, + { + "items": [ + 2148.5, + null + ], + "hints": { + "index": 3236 + } + }, + { + "items": [ + 2149, + null + ], + "hints": { + "index": 3237 + } + }, + { + "items": [ + 2149.5, + null + ], + "hints": { + "index": 3238 + } + }, + { + "items": [ + 2150, + null + ], + "hints": { + "index": 3239 + } + }, + { + "items": [ + 2150.5, + null + ], + "hints": { + "index": 3240 + } + }, + { + "items": [ + 2151, + null + ], + "hints": { + "index": 3241 + } + }, + { + "items": [ + 2151.5, + null + ], + "hints": { + "index": 3242 + } + }, + { + "items": [ + 2152, + null + ], + "hints": { + "index": 3243 + } + }, + { + "items": [ + 2152.5, + null + ], + "hints": { + "index": 3244 + } + }, + { + "items": [ + 2153, + null + ], + "hints": { + "index": 3245 + } + }, + { + "items": [ + 2153.5, + null + ], + "hints": { + "index": 3246 + } + }, + { + "items": [ + 2154, + null + ], + "hints": { + "index": 3247 + } + }, + { + "items": [ + 2154.5, + null + ], + "hints": { + "index": 3248 + } + }, + { + "items": [ + 2155, + null + ], + "hints": { + "index": 3249 + } + }, + { + "items": [ + 2155.5, + null + ], + "hints": { + "index": 3250 + } + }, + { + "items": [ + 2156, + null + ], + "hints": { + "index": 3251 + } + }, + { + "items": [ + 2156.5, + null + ], + "hints": { + "index": 3252 + } + }, + { + "items": [ + 2157, + null + ], + "hints": { + "index": 3253 + } + }, + { + "items": [ + 2157.5, + null + ], + "hints": { + "index": 3254 + } + }, + { + "items": [ + 2158, + null + ], + "hints": { + "index": 3255 + } + }, + { + "items": [ + 2158.5, + null + ], + "hints": { + "index": 3256 + } + }, + { + "items": [ + 2159, + null + ], + "hints": { + "index": 3257 + } + }, + { + "items": [ + 2159.5, + null + ], + "hints": { + "index": 3258 + } + }, + { + "items": [ + 2160, + null + ], + "hints": { + "index": 3259 + } + }, + { + "items": [ + 2160.5, + null + ], + "hints": { + "index": 3260 + } + }, + { + "items": [ + 2161, + null + ], + "hints": { + "index": 3261 + } + }, + { + "items": [ + 2161.5, + null + ], + "hints": { + "index": 3262 + } + }, + { + "items": [ + 2162, + null + ], + "hints": { + "index": 3263 + } + }, + { + "items": [ + 2162.5, + null + ], + "hints": { + "index": 3264 + } + }, + { + "items": [ + 2163, + null + ], + "hints": { + "index": 3265 + } + }, + { + "items": [ + 2163.5, + null + ], + "hints": { + "index": 3266 + } + }, + { + "items": [ + 2164, + null + ], + "hints": { + "index": 3267 + } + }, + { + "items": [ + 2164.5, + null + ], + "hints": { + "index": 3268 + } + }, + { + "items": [ + 2165, + null + ], + "hints": { + "index": 3269 + } + }, + { + "items": [ + 2165.5, + null + ], + "hints": { + "index": 3270 + } + }, + { + "items": [ + 2166, + null + ], + "hints": { + "index": 3271 + } + }, + { + "items": [ + 2166.5, + null + ], + "hints": { + "index": 3272 + } + }, + { + "items": [ + 2167, + null + ], + "hints": { + "index": 3273 + } + }, + { + "items": [ + 2167.5, + null + ], + "hints": { + "index": 3274 + } + }, + { + "items": [ + 2168, + null + ], + "hints": { + "index": 3275 + } + }, + { + "items": [ + 2168.5, + null + ], + "hints": { + "index": 3276 + } + }, + { + "items": [ + 2169, + null + ], + "hints": { + "index": 3277 + } + }, + { + "items": [ + 2169.5, + null + ], + "hints": { + "index": 3278 + } + }, + { + "items": [ + 2170, + null + ], + "hints": { + "index": 3279 + } + }, + { + "items": [ + 2170.5, + null + ], + "hints": { + "index": 3280 + } + }, + { + "items": [ + 2171, + null + ], + "hints": { + "index": 3281 + } + }, + { + "items": [ + 2171.5, + null + ], + "hints": { + "index": 3282 + } + }, + { + "items": [ + 2172, + null + ], + "hints": { + "index": 3283 + } + }, + { + "items": [ + 2172.5, + null + ], + "hints": { + "index": 3284 + } + }, + { + "items": [ + 2173, + null + ], + "hints": { + "index": 3285 + } + }, + { + "items": [ + 2173.5, + null + ], + "hints": { + "index": 3286 + } + }, + { + "items": [ + 2174, + null + ], + "hints": { + "index": 3287 + } + }, + { + "items": [ + 2174.5, + null + ], + "hints": { + "index": 3288 + } + }, + { + "items": [ + 2175, + null + ], + "hints": { + "index": 3289 + } + }, + { + "items": [ + 2175.5, + null + ], + "hints": { + "index": 3290 + } + }, + { + "items": [ + 2176, + null + ], + "hints": { + "index": 3291 + } + }, + { + "items": [ + 2176.5, + null + ], + "hints": { + "index": 3292 + } + }, + { + "items": [ + 2177, + null + ], + "hints": { + "index": 3293 + } + }, + { + "items": [ + 2177.5, + null + ], + "hints": { + "index": 3294 + } + }, + { + "items": [ + 2178, + null + ], + "hints": { + "index": 3295 + } + }, + { + "items": [ + 2178.5, + null + ], + "hints": { + "index": 3296 + } + }, + { + "items": [ + 2179, + null + ], + "hints": { + "index": 3297 + } + }, + { + "items": [ + 2179.5, + null + ], + "hints": { + "index": 3298 + } + }, + { + "items": [ + 2180, + null + ], + "hints": { + "index": 3299 + } + }, + { + "items": [ + 2180.5, + null + ], + "hints": { + "index": 3300 + } + }, + { + "items": [ + 2181, + null + ], + "hints": { + "index": 3301 + } + }, + { + "items": [ + 2181.5, + null + ], + "hints": { + "index": 3302 + } + }, + { + "items": [ + 2182, + null + ], + "hints": { + "index": 3303 + } + }, + { + "items": [ + 2182.5, + null + ], + "hints": { + "index": 3304 + } + }, + { + "items": [ + 2183, + null + ], + "hints": { + "index": 3305 + } + }, + { + "items": [ + 2183.5, + null + ], + "hints": { + "index": 3306 + } + }, + { + "items": [ + 2184, + null + ], + "hints": { + "index": 3307 + } + }, + { + "items": [ + 2184.5, + null + ], + "hints": { + "index": 3308 + } + }, + { + "items": [ + 2185, + null + ], + "hints": { + "index": 3309 + } + }, + { + "items": [ + 2185.5, + null + ], + "hints": { + "index": 3310 + } + }, + { + "items": [ + 2186, + null + ], + "hints": { + "index": 3311 + } + }, + { + "items": [ + 2186.5, + null + ], + "hints": { + "index": 3312 + } + }, + { + "items": [ + 2187, + null + ], + "hints": { + "index": 3313 + } + }, + { + "items": [ + 2187.5, + null + ], + "hints": { + "index": 3314 + } + }, + { + "items": [ + 2188, + null + ], + "hints": { + "index": 3315 + } + }, + { + "items": [ + 2188.5, + null + ], + "hints": { + "index": 3316 + } + }, + { + "items": [ + 2189, + null + ], + "hints": { + "index": 3317 + } + }, + { + "items": [ + 2189.5, + null + ], + "hints": { + "index": 3318 + } + }, + { + "items": [ + 2190, + null + ], + "hints": { + "index": 3319 + } + }, + { + "items": [ + 2190.5, + null + ], + "hints": { + "index": 3320 + } + }, + { + "items": [ + 2191, + null + ], + "hints": { + "index": 3321 + } + }, + { + "items": [ + 2191.5, + null + ], + "hints": { + "index": 3322 + } + }, + { + "items": [ + 2192, + null + ], + "hints": { + "index": 3323 + } + }, + { + "items": [ + 2192.5, + null + ], + "hints": { + "index": 3324 + } + }, + { + "items": [ + 2193, + null + ], + "hints": { + "index": 3325 + } + }, + { + "items": [ + 2193.5, + null + ], + "hints": { + "index": 3326 + } + }, + { + "items": [ + 2194, + null + ], + "hints": { + "index": 3327 + } + }, + { + "items": [ + 2194.5, + null + ], + "hints": { + "index": 3328 + } + }, + { + "items": [ + 2195, + null + ], + "hints": { + "index": 3329 + } + }, + { + "items": [ + 2195.5, + null + ], + "hints": { + "index": 3330 + } + }, + { + "items": [ + 2196, + null + ], + "hints": { + "index": 3331 + } + }, + { + "items": [ + 2196.5, + null + ], + "hints": { + "index": 3332 + } + }, + { + "items": [ + 2197, + null + ], + "hints": { + "index": 3333 + } + }, + { + "items": [ + 2197.5, + null + ], + "hints": { + "index": 3334 + } + }, + { + "items": [ + 2198, + null + ], + "hints": { + "index": 3335 + } + }, + { + "items": [ + 2198.5, + null + ], + "hints": { + "index": 3336 + } + }, + { + "items": [ + 2199, + null + ], + "hints": { + "index": 3337 + } + }, + { + "items": [ + 2199.5, + null + ], + "hints": { + "index": 3338 + } + }, + { + "items": [ + 2200, + null + ], + "hints": { + "index": 3339 + } + }, + { + "items": [ + 2200.5, + null + ], + "hints": { + "index": 3340 + } + }, + { + "items": [ + 2201, + null + ], + "hints": { + "index": 3341 + } + }, + { + "items": [ + 2201.5, + null + ], + "hints": { + "index": 3342 + } + }, + { + "items": [ + 2202, + null + ], + "hints": { + "index": 3343 + } + }, + { + "items": [ + 2202.5, + null + ], + "hints": { + "index": 3344 + } + }, + { + "items": [ + 2203, + null + ], + "hints": { + "index": 3345 + } + }, + { + "items": [ + 2203.5, + null + ], + "hints": { + "index": 3346 + } + }, + { + "items": [ + 2204, + null + ], + "hints": { + "index": 3347 + } + }, + { + "items": [ + 2204.5, + null + ], + "hints": { + "index": 3348 + } + }, + { + "items": [ + 2205, + null + ], + "hints": { + "index": 3349 + } + }, + { + "items": [ + 2205.5, + null + ], + "hints": { + "index": 3350 + } + }, + { + "items": [ + 2206, + null + ], + "hints": { + "index": 3351 + } + }, + { + "items": [ + 2206.5, + null + ], + "hints": { + "index": 3352 + } + }, + { + "items": [ + 2207, + null + ], + "hints": { + "index": 3353 + } + }, + { + "items": [ + 2207.5, + null + ], + "hints": { + "index": 3354 + } + }, + { + "items": [ + 2208, + null + ], + "hints": { + "index": 3355 + } + }, + { + "items": [ + 2208.5, + null + ], + "hints": { + "index": 3356 + } + }, + { + "items": [ + 2209, + null + ], + "hints": { + "index": 3357 + } + }, + { + "items": [ + 2209.5, + null + ], + "hints": { + "index": 3358 + } + }, + { + "items": [ + 2210, + null + ], + "hints": { + "index": 3359 + } + }, + { + "items": [ + 2210.5, + null + ], + "hints": { + "index": 3360 + } + }, + { + "items": [ + 2211, + null + ], + "hints": { + "index": 3361 + } + }, + { + "items": [ + 2211.5, + null + ], + "hints": { + "index": 3362 + } + }, + { + "items": [ + 2212, + null + ], + "hints": { + "index": 3363 + } + }, + { + "items": [ + 2212.5, + null + ], + "hints": { + "index": 3364 + } + }, + { + "items": [ + 2213, + null + ], + "hints": { + "index": 3365 + } + }, + { + "items": [ + 2213.5, + null + ], + "hints": { + "index": 3366 + } + }, + { + "items": [ + 2214, + null + ], + "hints": { + "index": 3367 + } + }, + { + "items": [ + 2214.5, + null + ], + "hints": { + "index": 3368 + } + }, + { + "items": [ + 2215, + null + ], + "hints": { + "index": 3369 + } + }, + { + "items": [ + 2215.5, + null + ], + "hints": { + "index": 3370 + } + }, + { + "items": [ + 2216, + null + ], + "hints": { + "index": 3371 + } + }, + { + "items": [ + 2216.5, + null + ], + "hints": { + "index": 3372 + } + }, + { + "items": [ + 2217, + null + ], + "hints": { + "index": 3373 + } + }, + { + "items": [ + 2217.5, + null + ], + "hints": { + "index": 3374 + } + }, + { + "items": [ + 2218, + null + ], + "hints": { + "index": 3375 + } + }, + { + "items": [ + 2218.5, + null + ], + "hints": { + "index": 3376 + } + }, + { + "items": [ + 2219, + null + ], + "hints": { + "index": 3377 + } + }, + { + "items": [ + 2219.5, + null + ], + "hints": { + "index": 3378 + } + }, + { + "items": [ + 2220, + null + ], + "hints": { + "index": 3379 + } + }, + { + "items": [ + 2220.5, + null + ], + "hints": { + "index": 3380 + } + }, + { + "items": [ + 2221, + null + ], + "hints": { + "index": 3381 + } + }, + { + "items": [ + 2221.5, + null + ], + "hints": { + "index": 3382 + } + }, + { + "items": [ + 2222, + null + ], + "hints": { + "index": 3383 + } + }, + { + "items": [ + 2222.5, + null + ], + "hints": { + "index": 3384 + } + }, + { + "items": [ + 2223, + null + ], + "hints": { + "index": 3385 + } + }, + { + "items": [ + 2223.5, + null + ], + "hints": { + "index": 3386 + } + }, + { + "items": [ + 2224, + null + ], + "hints": { + "index": 3387 + } + }, + { + "items": [ + 2224.5, + null + ], + "hints": { + "index": 3388 + } + }, + { + "items": [ + 2225, + null + ], + "hints": { + "index": 3389 + } + }, + { + "items": [ + 2225.5, + null + ], + "hints": { + "index": 3390 + } + }, + { + "items": [ + 2226, + null + ], + "hints": { + "index": 3391 + } + }, + { + "items": [ + 2226.5, + null + ], + "hints": { + "index": 3392 + } + }, + { + "items": [ + 2227, + null + ], + "hints": { + "index": 3393 + } + }, + { + "items": [ + 2227.5, + null + ], + "hints": { + "index": 3394 + } + }, + { + "items": [ + 2228, + null + ], + "hints": { + "index": 3395 + } + }, + { + "items": [ + 2228.5, + null + ], + "hints": { + "index": 3396 + } + }, + { + "items": [ + 2229, + null + ], + "hints": { + "index": 3397 + } + }, + { + "items": [ + 2229.5, + null + ], + "hints": { + "index": 3398 + } + }, + { + "items": [ + 2230, + null + ], + "hints": { + "index": 3399 + } + }, + { + "items": [ + 2230.5, + null + ], + "hints": { + "index": 3400 + } + }, + { + "items": [ + 2231, + null + ], + "hints": { + "index": 3401 + } + }, + { + "items": [ + 2231.5, + null + ], + "hints": { + "index": 3402 + } + }, + { + "items": [ + 2232, + null + ], + "hints": { + "index": 3403 + } + }, + { + "items": [ + 2232.5, + null + ], + "hints": { + "index": 3404 + } + }, + { + "items": [ + 2233, + null + ], + "hints": { + "index": 3405 + } + }, + { + "items": [ + 2233.5, + null + ], + "hints": { + "index": 3406 + } + }, + { + "items": [ + 2234, + null + ], + "hints": { + "index": 3407 + } + }, + { + "items": [ + 2234.5, + null + ], + "hints": { + "index": 3408 + } + }, + { + "items": [ + 2235, + null + ], + "hints": { + "index": 3409 + } + }, + { + "items": [ + 2235.5, + null + ], + "hints": { + "index": 3410 + } + }, + { + "items": [ + 2236, + null + ], + "hints": { + "index": 3411 + } + }, + { + "items": [ + 2236.5, + null + ], + "hints": { + "index": 3412 + } + }, + { + "items": [ + 2237, + null + ], + "hints": { + "index": 3413 + } + }, + { + "items": [ + 2237.5, + null + ], + "hints": { + "index": 3414 + } + }, + { + "items": [ + 2238, + null + ], + "hints": { + "index": 3415 + } + }, + { + "items": [ + 2238.5, + null + ], + "hints": { + "index": 3416 + } + }, + { + "items": [ + 2239, + null + ], + "hints": { + "index": 3417 + } + }, + { + "items": [ + 2239.5, + null + ], + "hints": { + "index": 3418 + } + }, + { + "items": [ + 2240, + null + ], + "hints": { + "index": 3419 + } + }, + { + "items": [ + 2240.5, + null + ], + "hints": { + "index": 3420 + } + }, + { + "items": [ + 2241, + null + ], + "hints": { + "index": 3421 + } + }, + { + "items": [ + 2241.5, + null + ], + "hints": { + "index": 3422 + } + }, + { + "items": [ + 2242, + null + ], + "hints": { + "index": 3423 + } + }, + { + "items": [ + 2242.5, + null + ], + "hints": { + "index": 3424 + } + }, + { + "items": [ + 2243, + null + ], + "hints": { + "index": 3425 + } + }, + { + "items": [ + 2243.5, + null + ], + "hints": { + "index": 3426 + } + }, + { + "items": [ + 2244, + null + ], + "hints": { + "index": 3427 + } + }, + { + "items": [ + 2244.5, + null + ], + "hints": { + "index": 3428 + } + }, + { + "items": [ + 2245, + null + ], + "hints": { + "index": 3429 + } + }, + { + "items": [ + 2245.5, + null + ], + "hints": { + "index": 3430 + } + }, + { + "items": [ + 2246, + null + ], + "hints": { + "index": 3431 + } + }, + { + "items": [ + 2246.5, + null + ], + "hints": { + "index": 3432 + } + }, + { + "items": [ + 2247, + null + ], + "hints": { + "index": 3433 + } + }, + { + "items": [ + 2247.5, + null + ], + "hints": { + "index": 3434 + } + }, + { + "items": [ + 2248, + null + ], + "hints": { + "index": 3435 + } + }, + { + "items": [ + 2248.5, + null + ], + "hints": { + "index": 3436 + } + }, + { + "items": [ + 2249, + null + ], + "hints": { + "index": 3437 + } + }, + { + "items": [ + 2249.5, + null + ], + "hints": { + "index": 3438 + } + }, + { + "items": [ + 2250, + null + ], + "hints": { + "index": 3439 + } + }, + { + "items": [ + 2250.5, + null + ], + "hints": { + "index": 3440 + } + }, + { + "items": [ + 2251, + null + ], + "hints": { + "index": 3441 + } + }, + { + "items": [ + 2251.5, + null + ], + "hints": { + "index": 3442 + } + }, + { + "items": [ + 2252, + null + ], + "hints": { + "index": 3443 + } + }, + { + "items": [ + 2252.5, + null + ], + "hints": { + "index": 3444 + } + }, + { + "items": [ + 2253, + null + ], + "hints": { + "index": 3445 + } + }, + { + "items": [ + 2253.5, + null + ], + "hints": { + "index": 3446 + } + }, + { + "items": [ + 2254, + null + ], + "hints": { + "index": 3447 + } + }, + { + "items": [ + 2254.5, + null + ], + "hints": { + "index": 3448 + } + }, + { + "items": [ + 2255, + null + ], + "hints": { + "index": 3449 + } + }, + { + "items": [ + 2255.5, + null + ], + "hints": { + "index": 3450 + } + }, + { + "items": [ + 2256, + null + ], + "hints": { + "index": 3451 + } + }, + { + "items": [ + 2256.5, + null + ], + "hints": { + "index": 3452 + } + }, + { + "items": [ + 2257, + null + ], + "hints": { + "index": 3453 + } + }, + { + "items": [ + 2257.5, + null + ], + "hints": { + "index": 3454 + } + }, + { + "items": [ + 2258, + null + ], + "hints": { + "index": 3455 + } + }, + { + "items": [ + 2258.5, + null + ], + "hints": { + "index": 3456 + } + }, + { + "items": [ + 2259, + null + ], + "hints": { + "index": 3457 + } + }, + { + "items": [ + 2259.5, + null + ], + "hints": { + "index": 3458 + } + }, + { + "items": [ + 2260, + null + ], + "hints": { + "index": 3459 + } + }, + { + "items": [ + 2260.5, + null + ], + "hints": { + "index": 3460 + } + }, + { + "items": [ + 2261, + null + ], + "hints": { + "index": 3461 + } + }, + { + "items": [ + 2261.5, + null + ], + "hints": { + "index": 3462 + } + }, + { + "items": [ + 2262, + null + ], + "hints": { + "index": 3463 + } + }, + { + "items": [ + 2262.5, + null + ], + "hints": { + "index": 3464 + } + }, + { + "items": [ + 2263, + null + ], + "hints": { + "index": 3465 + } + }, + { + "items": [ + 2263.5, + null + ], + "hints": { + "index": 3466 + } + }, + { + "items": [ + 2264, + null + ], + "hints": { + "index": 3467 + } + }, + { + "items": [ + 2264.5, + null + ], + "hints": { + "index": 3468 + } + }, + { + "items": [ + 2265, + null + ], + "hints": { + "index": 3469 + } + }, + { + "items": [ + 2265.5, + null + ], + "hints": { + "index": 3470 + } + }, + { + "items": [ + 2266, + null + ], + "hints": { + "index": 3471 + } + }, + { + "items": [ + 2266.5, + null + ], + "hints": { + "index": 3472 + } + }, + { + "items": [ + 2267, + null + ], + "hints": { + "index": 3473 + } + }, + { + "items": [ + 2267.5, + null + ], + "hints": { + "index": 3474 + } + }, + { + "items": [ + 2268, + null + ], + "hints": { + "index": 3475 + } + }, + { + "items": [ + 2268.5, + null + ], + "hints": { + "index": 3476 + } + }, + { + "items": [ + 2269, + null + ], + "hints": { + "index": 3477 + } + }, + { + "items": [ + 2269.5, + null + ], + "hints": { + "index": 3478 + } + }, + { + "items": [ + 2270, + null + ], + "hints": { + "index": 3479 + } + }, + { + "items": [ + 2270.5, + null + ], + "hints": { + "index": 3480 + } + }, + { + "items": [ + 2271, + null + ], + "hints": { + "index": 3481 + } + }, + { + "items": [ + 2271.5, + null + ], + "hints": { + "index": 3482 + } + }, + { + "items": [ + 2272, + null + ], + "hints": { + "index": 3483 + } + }, + { + "items": [ + 2272.5, + null + ], + "hints": { + "index": 3484 + } + }, + { + "items": [ + 2273, + null + ], + "hints": { + "index": 3485 + } + }, + { + "items": [ + 2273.5, + null + ], + "hints": { + "index": 3486 + } + }, + { + "items": [ + 2274, + null + ], + "hints": { + "index": 3487 + } + }, + { + "items": [ + 2274.5, + null + ], + "hints": { + "index": 3488 + } + }, + { + "items": [ + 2275, + null + ], + "hints": { + "index": 3489 + } + }, + { + "items": [ + 2275.5, + null + ], + "hints": { + "index": 3490 + } + }, + { + "items": [ + 2276, + null + ], + "hints": { + "index": 3491 + } + }, + { + "items": [ + 2276.5, + null + ], + "hints": { + "index": 3492 + } + }, + { + "items": [ + 2277, + null + ], + "hints": { + "index": 3493 + } + }, + { + "items": [ + 2277.5, + null + ], + "hints": { + "index": 3494 + } + }, + { + "items": [ + 2278, + null + ], + "hints": { + "index": 3495 + } + }, + { + "items": [ + 2278.5, + null + ], + "hints": { + "index": 3496 + } + }, + { + "items": [ + 2279, + null + ], + "hints": { + "index": 3497 + } + }, + { + "items": [ + 2279.5, + null + ], + "hints": { + "index": 3498 + } + }, + { + "items": [ + 2280, + null + ], + "hints": { + "index": 3499 + } + }, + { + "items": [ + 2280.5, + null + ], + "hints": { + "index": 3500 + } + }, + { + "items": [ + 2281, + null + ], + "hints": { + "index": 3501 + } + }, + { + "items": [ + 2281.5, + null + ], + "hints": { + "index": 3502 + } + }, + { + "items": [ + 2282, + null + ], + "hints": { + "index": 3503 + } + }, + { + "items": [ + 2282.5, + null + ], + "hints": { + "index": 3504 + } + }, + { + "items": [ + 2283, + null + ], + "hints": { + "index": 3505 + } + }, + { + "items": [ + 2283.5, + null + ], + "hints": { + "index": 3506 + } + }, + { + "items": [ + 2284, + null + ], + "hints": { + "index": 3507 + } + }, + { + "items": [ + 2284.5, + null + ], + "hints": { + "index": 3508 + } + }, + { + "items": [ + 2285, + null + ], + "hints": { + "index": 3509 + } + }, + { + "items": [ + 2285.5, + null + ], + "hints": { + "index": 3510 + } + }, + { + "items": [ + 2286, + null + ], + "hints": { + "index": 3511 + } + }, + { + "items": [ + 2286.5, + null + ], + "hints": { + "index": 3512 + } + }, + { + "items": [ + 2287, + null + ], + "hints": { + "index": 3513 + } + }, + { + "items": [ + 2287.5, + null + ], + "hints": { + "index": 3514 + } + }, + { + "items": [ + 2288, + null + ], + "hints": { + "index": 3515 + } + }, + { + "items": [ + 2288.5, + null + ], + "hints": { + "index": 3516 + } + }, + { + "items": [ + 2289, + null + ], + "hints": { + "index": 3517 + } + }, + { + "items": [ + 2289.5, + null + ], + "hints": { + "index": 3518 + } + }, + { + "items": [ + 2290, + null + ], + "hints": { + "index": 3519 + } + }, + { + "items": [ + 2290.5, + null + ], + "hints": { + "index": 3520 + } + }, + { + "items": [ + 2291, + null + ], + "hints": { + "index": 3521 + } + }, + { + "items": [ + 2291.5, + null + ], + "hints": { + "index": 3522 + } + }, + { + "items": [ + 2292, + null + ], + "hints": { + "index": 3523 + } + }, + { + "items": [ + 2292.5, + null + ], + "hints": { + "index": 3524 + } + }, + { + "items": [ + 2293, + null + ], + "hints": { + "index": 3525 + } + }, + { + "items": [ + 2293.5, + null + ], + "hints": { + "index": 3526 + } + }, + { + "items": [ + 2294, + null + ], + "hints": { + "index": 3527 + } + }, + { + "items": [ + 2294.5, + null + ], + "hints": { + "index": 3528 + } + }, + { + "items": [ + 2295, + null + ], + "hints": { + "index": 3529 + } + }, + { + "items": [ + 2295.5, + null + ], + "hints": { + "index": 3530 + } + }, + { + "items": [ + 2296, + null + ], + "hints": { + "index": 3531 + } + }, + { + "items": [ + 2296.5, + null + ], + "hints": { + "index": 3532 + } + }, + { + "items": [ + 2297, + null + ], + "hints": { + "index": 3533 + } + }, + { + "items": [ + 2297.5, + null + ], + "hints": { + "index": 3534 + } + }, + { + "items": [ + 2298, + null + ], + "hints": { + "index": 3535 + } + }, + { + "items": [ + 2298.5, + null + ], + "hints": { + "index": 3536 + } + }, + { + "items": [ + 2299, + null + ], + "hints": { + "index": 3537 + } + }, + { + "items": [ + 2299.5, + null + ], + "hints": { + "index": 3538 + } + }, + { + "items": [ + 2300, + null + ], + "hints": { + "index": 3539 + } + }, + { + "items": [ + 2300.5, + null + ], + "hints": { + "index": 3540 + } + }, + { + "items": [ + 2301, + null + ], + "hints": { + "index": 3541 + } + }, + { + "items": [ + 2301.5, + null + ], + "hints": { + "index": 3542 + } + }, + { + "items": [ + 2302, + null + ], + "hints": { + "index": 3543 + } + }, + { + "items": [ + 2302.5, + null + ], + "hints": { + "index": 3544 + } + }, + { + "items": [ + 2303, + null + ], + "hints": { + "index": 3545 + } + }, + { + "items": [ + 2303.5, + null + ], + "hints": { + "index": 3546 + } + }, + { + "items": [ + 2304, + null + ], + "hints": { + "index": 3547 + } + }, + { + "items": [ + 2304.5, + null + ], + "hints": { + "index": 3548 + } + }, + { + "items": [ + 2305, + null + ], + "hints": { + "index": 3549 + } + }, + { + "items": [ + 2305.5, + null + ], + "hints": { + "index": 3550 + } + }, + { + "items": [ + 2306, + null + ], + "hints": { + "index": 3551 + } + }, + { + "items": [ + 2306.5, + null + ], + "hints": { + "index": 3552 + } + }, + { + "items": [ + 2307, + null + ], + "hints": { + "index": 3553 + } + }, + { + "items": [ + 2307.5, + null + ], + "hints": { + "index": 3554 + } + }, + { + "items": [ + 2308, + null + ], + "hints": { + "index": 3555 + } + }, + { + "items": [ + 2308.5, + null + ], + "hints": { + "index": 3556 + } + }, + { + "items": [ + 2309, + null + ], + "hints": { + "index": 3557 + } + }, + { + "items": [ + 2309.5, + null + ], + "hints": { + "index": 3558 + } + }, + { + "items": [ + 2310, + null + ], + "hints": { + "index": 3559 + } + }, + { + "items": [ + 2310.5, + null + ], + "hints": { + "index": 3560 + } + }, + { + "items": [ + 2311, + null + ], + "hints": { + "index": 3561 + } + }, + { + "items": [ + 2311.5, + null + ], + "hints": { + "index": 3562 + } + }, + { + "items": [ + 2312, + null + ], + "hints": { + "index": 3563 + } + }, + { + "items": [ + 2312.5, + null + ], + "hints": { + "index": 3564 + } + }, + { + "items": [ + 2313, + null + ], + "hints": { + "index": 3565 + } + }, + { + "items": [ + 2313.5, + null + ], + "hints": { + "index": 3566 + } + }, + { + "items": [ + 2314, + null + ], + "hints": { + "index": 3567 + } + }, + { + "items": [ + 2314.5, + null + ], + "hints": { + "index": 3568 + } + }, + { + "items": [ + 2315, + null + ], + "hints": { + "index": 3569 + } + }, + { + "items": [ + 2315.5, + null + ], + "hints": { + "index": 3570 + } + }, + { + "items": [ + 2316, + null + ], + "hints": { + "index": 3571 + } + }, + { + "items": [ + 2316.5, + null + ], + "hints": { + "index": 3572 + } + }, + { + "items": [ + 2317, + null + ], + "hints": { + "index": 3573 + } + }, + { + "items": [ + 2317.5, + null + ], + "hints": { + "index": 3574 + } + }, + { + "items": [ + 2318, + null + ], + "hints": { + "index": 3575 + } + }, + { + "items": [ + 2318.5, + null + ], + "hints": { + "index": 3576 + } + }, + { + "items": [ + 2319, + null + ], + "hints": { + "index": 3577 + } + }, + { + "items": [ + 2319.5, + null + ], + "hints": { + "index": 3578 + } + }, + { + "items": [ + 2320, + null + ], + "hints": { + "index": 3579 + } + }, + { + "items": [ + 2320.5, + null + ], + "hints": { + "index": 3580 + } + }, + { + "items": [ + 2321, + null + ], + "hints": { + "index": 3581 + } + }, + { + "items": [ + 2321.5, + null + ], + "hints": { + "index": 3582 + } + }, + { + "items": [ + 2322, + null + ], + "hints": { + "index": 3583 + } + }, + { + "items": [ + 2322.5, + null + ], + "hints": { + "index": 3584 + } + }, + { + "items": [ + 2323, + null + ], + "hints": { + "index": 3585 + } + }, + { + "items": [ + 2323.5, + null + ], + "hints": { + "index": 3586 + } + }, + { + "items": [ + 2324, + null + ], + "hints": { + "index": 3587 + } + }, + { + "items": [ + 2324.5, + null + ], + "hints": { + "index": 3588 + } + }, + { + "items": [ + 2325, + null + ], + "hints": { + "index": 3589 + } + }, + { + "items": [ + 2325.5, + null + ], + "hints": { + "index": 3590 + } + }, + { + "items": [ + 2326, + null + ], + "hints": { + "index": 3591 + } + }, + { + "items": [ + 2326.5, + null + ], + "hints": { + "index": 3592 + } + }, + { + "items": [ + 2327, + null + ], + "hints": { + "index": 3593 + } + }, + { + "items": [ + 2327.5, + null + ], + "hints": { + "index": 3594 + } + }, + { + "items": [ + 2328, + null + ], + "hints": { + "index": 3595 + } + }, + { + "items": [ + 2328.5, + null + ], + "hints": { + "index": 3596 + } + }, + { + "items": [ + 2329, + null + ], + "hints": { + "index": 3597 + } + }, + { + "items": [ + 2329.5, + null + ], + "hints": { + "index": 3598 + } + }, + { + "items": [ + 2330, + null + ], + "hints": { + "index": 3599 + } + }, + { + "items": [ + 2330.5, + null + ], + "hints": { + "index": 3600 + } + }, + { + "items": [ + 2331, + null + ], + "hints": { + "index": 3601 + } + }, + { + "items": [ + 2331.5, + null + ], + "hints": { + "index": 3602 + } + }, + { + "items": [ + 2332, + null + ], + "hints": { + "index": 3603 + } + }, + { + "items": [ + 2332.5, + null + ], + "hints": { + "index": 3604 + } + }, + { + "items": [ + 2333, + null + ], + "hints": { + "index": 3605 + } + }, + { + "items": [ + 2333.5, + null + ], + "hints": { + "index": 3606 + } + }, + { + "items": [ + 2334, + null + ], + "hints": { + "index": 3607 + } + }, + { + "items": [ + 2334.5, + null + ], + "hints": { + "index": 3608 + } + }, + { + "items": [ + 2335, + null + ], + "hints": { + "index": 3609 + } + }, + { + "items": [ + 2335.5, + null + ], + "hints": { + "index": 3610 + } + }, + { + "items": [ + 2336, + null + ], + "hints": { + "index": 3611 + } + }, + { + "items": [ + 2336.5, + null + ], + "hints": { + "index": 3612 + } + }, + { + "items": [ + 2337, + null + ], + "hints": { + "index": 3613 + } + }, + { + "items": [ + 2337.5, + null + ], + "hints": { + "index": 3614 + } + }, + { + "items": [ + 2338, + null + ], + "hints": { + "index": 3615 + } + }, + { + "items": [ + 2338.5, + null + ], + "hints": { + "index": 3616 + } + }, + { + "items": [ + 2339, + null + ], + "hints": { + "index": 3617 + } + }, + { + "items": [ + 2339.5, + null + ], + "hints": { + "index": 3618 + } + }, + { + "items": [ + 2340, + null + ], + "hints": { + "index": 3619 + } + }, + { + "items": [ + 2340.5, + null + ], + "hints": { + "index": 3620 + } + }, + { + "items": [ + 2341, + null + ], + "hints": { + "index": 3621 + } + }, + { + "items": [ + 2341.5, + null + ], + "hints": { + "index": 3622 + } + }, + { + "items": [ + 2342, + null + ], + "hints": { + "index": 3623 + } + }, + { + "items": [ + 2342.5, + null + ], + "hints": { + "index": 3624 + } + }, + { + "items": [ + 2343, + null + ], + "hints": { + "index": 3625 + } + }, + { + "items": [ + 2343.5, + null + ], + "hints": { + "index": 3626 + } + }, + { + "items": [ + 2344, + null + ], + "hints": { + "index": 3627 + } + }, + { + "items": [ + 2344.5, + null + ], + "hints": { + "index": 3628 + } + }, + { + "items": [ + 2345, + null + ], + "hints": { + "index": 3629 + } + }, + { + "items": [ + 2345.5, + null + ], + "hints": { + "index": 3630 + } + }, + { + "items": [ + 2346, + null + ], + "hints": { + "index": 3631 + } + }, + { + "items": [ + 2346.5, + null + ], + "hints": { + "index": 3632 + } + }, + { + "items": [ + 2347, + null + ], + "hints": { + "index": 3633 + } + }, + { + "items": [ + 2347.5, + null + ], + "hints": { + "index": 3634 + } + }, + { + "items": [ + 2348, + null + ], + "hints": { + "index": 3635 + } + }, + { + "items": [ + 2348.5, + null + ], + "hints": { + "index": 3636 + } + }, + { + "items": [ + 2349, + null + ], + "hints": { + "index": 3637 + } + }, + { + "items": [ + 2349.5, + null + ], + "hints": { + "index": 3638 + } + }, + { + "items": [ + 2350, + null + ], + "hints": { + "index": 3639 + } + }, + { + "items": [ + 2350.5, + null + ], + "hints": { + "index": 3640 + } + }, + { + "items": [ + 2351, + null + ], + "hints": { + "index": 3641 + } + }, + { + "items": [ + 2351.5, + null + ], + "hints": { + "index": 3642 + } + }, + { + "items": [ + 2352, + null + ], + "hints": { + "index": 3643 + } + }, + { + "items": [ + 2352.5, + null + ], + "hints": { + "index": 3644 + } + }, + { + "items": [ + 2353, + null + ], + "hints": { + "index": 3645 + } + }, + { + "items": [ + 2353.5, + null + ], + "hints": { + "index": 3646 + } + }, + { + "items": [ + 2354, + null + ], + "hints": { + "index": 3647 + } + }, + { + "items": [ + 2354.5, + null + ], + "hints": { + "index": 3648 + } + }, + { + "items": [ + 2355, + null + ], + "hints": { + "index": 3649 + } + }, + { + "items": [ + 2355.5, + null + ], + "hints": { + "index": 3650 + } + }, + { + "items": [ + 2356, + null + ], + "hints": { + "index": 3651 + } + }, + { + "items": [ + 2356.5, + null + ], + "hints": { + "index": 3652 + } + }, + { + "items": [ + 2357, + null + ], + "hints": { + "index": 3653 + } + }, + { + "items": [ + 2357.5, + null + ], + "hints": { + "index": 3654 + } + }, + { + "items": [ + 2358, + null + ], + "hints": { + "index": 3655 + } + }, + { + "items": [ + 2358.5, + null + ], + "hints": { + "index": 3656 + } + }, + { + "items": [ + 2359, + null + ], + "hints": { + "index": 3657 + } + }, + { + "items": [ + 2359.5, + null + ], + "hints": { + "index": 3658 + } + }, + { + "items": [ + 2360, + null + ], + "hints": { + "index": 3659 + } + }, + { + "items": [ + 2360.5, + null + ], + "hints": { + "index": 3660 + } + }, + { + "items": [ + 2361, + null + ], + "hints": { + "index": 3661 + } + }, + { + "items": [ + 2361.5, + null + ], + "hints": { + "index": 3662 + } + }, + { + "items": [ + 2362, + null + ], + "hints": { + "index": 3663 + } + }, + { + "items": [ + 2362.5, + null + ], + "hints": { + "index": 3664 + } + }, + { + "items": [ + 2363, + null + ], + "hints": { + "index": 3665 + } + }, + { + "items": [ + 2363.5, + null + ], + "hints": { + "index": 3666 + } + }, + { + "items": [ + 2364, + null + ], + "hints": { + "index": 3667 + } + }, + { + "items": [ + 2364.5, + null + ], + "hints": { + "index": 3668 + } + }, + { + "items": [ + 2365, + null + ], + "hints": { + "index": 3669 + } + }, + { + "items": [ + 2365.5, + null + ], + "hints": { + "index": 3670 + } + }, + { + "items": [ + 2366, + null + ], + "hints": { + "index": 3671 + } + }, + { + "items": [ + 2366.5, + null + ], + "hints": { + "index": 3672 + } + }, + { + "items": [ + 2367, + null + ], + "hints": { + "index": 3673 + } + }, + { + "items": [ + 2367.5, + null + ], + "hints": { + "index": 3674 + } + }, + { + "items": [ + 2368, + null + ], + "hints": { + "index": 3675 + } + }, + { + "items": [ + 2368.5, + null + ], + "hints": { + "index": 3676 + } + }, + { + "items": [ + 2369, + null + ], + "hints": { + "index": 3677 + } + }, + { + "items": [ + 2369.5, + null + ], + "hints": { + "index": 3678 + } + }, + { + "items": [ + 2370, + null + ], + "hints": { + "index": 3679 + } + }, + { + "items": [ + 2370.5, + null + ], + "hints": { + "index": 3680 + } + }, + { + "items": [ + 2371, + null + ], + "hints": { + "index": 3681 + } + }, + { + "items": [ + 2371.5, + null + ], + "hints": { + "index": 3682 + } + }, + { + "items": [ + 2372, + null + ], + "hints": { + "index": 3683 + } + }, + { + "items": [ + 2372.5, + null + ], + "hints": { + "index": 3684 + } + }, + { + "items": [ + 2373, + null + ], + "hints": { + "index": 3685 + } + }, + { + "items": [ + 2373.5, + null + ], + "hints": { + "index": 3686 + } + }, + { + "items": [ + 2374, + null + ], + "hints": { + "index": 3687 + } + }, + { + "items": [ + 2374.5, + null + ], + "hints": { + "index": 3688 + } + }, + { + "items": [ + 2375, + null + ], + "hints": { + "index": 3689 + } + }, + { + "items": [ + 2375.5, + null + ], + "hints": { + "index": 3690 + } + }, + { + "items": [ + 2376, + null + ], + "hints": { + "index": 3691 + } + }, + { + "items": [ + 2376.5, + null + ], + "hints": { + "index": 3692 + } + }, + { + "items": [ + 2377, + null + ], + "hints": { + "index": 3693 + } + }, + { + "items": [ + 2377.5, + null + ], + "hints": { + "index": 3694 + } + }, + { + "items": [ + 2378, + null + ], + "hints": { + "index": 3695 + } + }, + { + "items": [ + 2378.5, + null + ], + "hints": { + "index": 3696 + } + }, + { + "items": [ + 2379, + null + ], + "hints": { + "index": 3697 + } + }, + { + "items": [ + 2379.5, + null + ], + "hints": { + "index": 3698 + } + }, + { + "items": [ + 2380, + null + ], + "hints": { + "index": 3699 + } + }, + { + "items": [ + 2380.5, + null + ], + "hints": { + "index": 3700 + } + }, + { + "items": [ + 2381, + null + ], + "hints": { + "index": 3701 + } + }, + { + "items": [ + 2381.5, + null + ], + "hints": { + "index": 3702 + } + }, + { + "items": [ + 2382, + null + ], + "hints": { + "index": 3703 + } + }, + { + "items": [ + 2382.5, + null + ], + "hints": { + "index": 3704 + } + }, + { + "items": [ + 2383, + null + ], + "hints": { + "index": 3705 + } + }, + { + "items": [ + 2383.5, + null + ], + "hints": { + "index": 3706 + } + }, + { + "items": [ + 2384, + null + ], + "hints": { + "index": 3707 + } + }, + { + "items": [ + 2384.5, + null + ], + "hints": { + "index": 3708 + } + }, + { + "items": [ + 2385, + null + ], + "hints": { + "index": 3709 + } + }, + { + "items": [ + 2385.5, + null + ], + "hints": { + "index": 3710 + } + }, + { + "items": [ + 2386, + null + ], + "hints": { + "index": 3711 + } + }, + { + "items": [ + 2386.5, + null + ], + "hints": { + "index": 3712 + } + }, + { + "items": [ + 2387, + null + ], + "hints": { + "index": 3713 + } + }, + { + "items": [ + 2387.5, + null + ], + "hints": { + "index": 3714 + } + }, + { + "items": [ + 2388, + null + ], + "hints": { + "index": 3715 + } + }, + { + "items": [ + 2388.5, + null + ], + "hints": { + "index": 3716 + } + }, + { + "items": [ + 2389, + null + ], + "hints": { + "index": 3717 + } + }, + { + "items": [ + 2389.5, + null + ], + "hints": { + "index": 3718 + } + }, + { + "items": [ + 2390, + null + ], + "hints": { + "index": 3719 + } + }, + { + "items": [ + 2390.5, + null + ], + "hints": { + "index": 3720 + } + }, + { + "items": [ + 2391, + null + ], + "hints": { + "index": 3721 + } + }, + { + "items": [ + 2391.5, + null + ], + "hints": { + "index": 3722 + } + }, + { + "items": [ + 2392, + null + ], + "hints": { + "index": 3723 + } + }, + { + "items": [ + 2392.5, + null + ], + "hints": { + "index": 3724 + } + }, + { + "items": [ + 2393, + null + ], + "hints": { + "index": 3725 + } + }, + { + "items": [ + 2393.5, + null + ], + "hints": { + "index": 3726 + } + }, + { + "items": [ + 2394, + null + ], + "hints": { + "index": 3727 + } + }, + { + "items": [ + 2394.5, + null + ], + "hints": { + "index": 3728 + } + }, + { + "items": [ + 2395, + null + ], + "hints": { + "index": 3729 + } + }, + { + "items": [ + 2395.5, + null + ], + "hints": { + "index": 3730 + } + }, + { + "items": [ + 2396, + null + ], + "hints": { + "index": 3731 + } + }, + { + "items": [ + 2396.5, + null + ], + "hints": { + "index": 3732 + } + }, + { + "items": [ + 2397, + null + ], + "hints": { + "index": 3733 + } + }, + { + "items": [ + 2397.5, + null + ], + "hints": { + "index": 3734 + } + }, + { + "items": [ + 2398, + null + ], + "hints": { + "index": 3735 + } + }, + { + "items": [ + 2398.5, + null + ], + "hints": { + "index": 3736 + } + }, + { + "items": [ + 2399, + null + ], + "hints": { + "index": 3737 + } + }, + { + "items": [ + 2399.5, + null + ], + "hints": { + "index": 3738 + } + }, + { + "items": [ + 2400, + null + ], + "hints": { + "index": 3739 + } + }, + { + "items": [ + 2400.5, + null + ], + "hints": { + "index": 3740 + } + }, + { + "items": [ + 2401, + null + ], + "hints": { + "index": 3741 + } + }, + { + "items": [ + 2401.5, + null + ], + "hints": { + "index": 3742 + } + }, + { + "items": [ + 2402, + null + ], + "hints": { + "index": 3743 + } + }, + { + "items": [ + 2402.5, + null + ], + "hints": { + "index": 3744 + } + }, + { + "items": [ + 2403, + null + ], + "hints": { + "index": 3745 + } + }, + { + "items": [ + 2403.5, + null + ], + "hints": { + "index": 3746 + } + }, + { + "items": [ + 2404, + null + ], + "hints": { + "index": 3747 + } + }, + { + "items": [ + 2404.5, + null + ], + "hints": { + "index": 3748 + } + }, + { + "items": [ + 2405, + null + ], + "hints": { + "index": 3749 + } + }, + { + "items": [ + 2405.5, + null + ], + "hints": { + "index": 3750 + } + }, + { + "items": [ + 2406, + null + ], + "hints": { + "index": 3751 + } + }, + { + "items": [ + 2406.5, + null + ], + "hints": { + "index": 3752 + } + }, + { + "items": [ + 2407, + null + ], + "hints": { + "index": 3753 + } + }, + { + "items": [ + 2407.5, + null + ], + "hints": { + "index": 3754 + } + }, + { + "items": [ + 2408, + null + ], + "hints": { + "index": 3755 + } + }, + { + "items": [ + 2408.5, + null + ], + "hints": { + "index": 3756 + } + }, + { + "items": [ + 2409, + null + ], + "hints": { + "index": 3757 + } + }, + { + "items": [ + 2409.5, + null + ], + "hints": { + "index": 3758 + } + }, + { + "items": [ + 2410, + null + ], + "hints": { + "index": 3759 + } + }, + { + "items": [ + 2410.5, + null + ], + "hints": { + "index": 3760 + } + }, + { + "items": [ + 2411, + null + ], + "hints": { + "index": 3761 + } + }, + { + "items": [ + 2411.5, + null + ], + "hints": { + "index": 3762 + } + }, + { + "items": [ + 2412, + null + ], + "hints": { + "index": 3763 + } + }, + { + "items": [ + 2412.5, + null + ], + "hints": { + "index": 3764 + } + }, + { + "items": [ + 2413, + null + ], + "hints": { + "index": 3765 + } + }, + { + "items": [ + 2413.5, + null + ], + "hints": { + "index": 3766 + } + }, + { + "items": [ + 2414, + null + ], + "hints": { + "index": 3767 + } + }, + { + "items": [ + 2414.5, + null + ], + "hints": { + "index": 3768 + } + }, + { + "items": [ + 2415, + null + ], + "hints": { + "index": 3769 + } + }, + { + "items": [ + 2415.5, + null + ], + "hints": { + "index": 3770 + } + }, + { + "items": [ + 2416, + null + ], + "hints": { + "index": 3771 + } + }, + { + "items": [ + 2416.5, + null + ], + "hints": { + "index": 3772 + } + }, + { + "items": [ + 2417, + null + ], + "hints": { + "index": 3773 + } + }, + { + "items": [ + 2417.5, + null + ], + "hints": { + "index": 3774 + } + }, + { + "items": [ + 2418, + null + ], + "hints": { + "index": 3775 + } + }, + { + "items": [ + 2418.5, + null + ], + "hints": { + "index": 3776 + } + }, + { + "items": [ + 2419, + null + ], + "hints": { + "index": 3777 + } + }, + { + "items": [ + 2419.5, + null + ], + "hints": { + "index": 3778 + } + }, + { + "items": [ + 2420, + null + ], + "hints": { + "index": 3779 + } + }, + { + "items": [ + 2420.5, + null + ], + "hints": { + "index": 3780 + } + }, + { + "items": [ + 2421, + null + ], + "hints": { + "index": 3781 + } + }, + { + "items": [ + 2421.5, + null + ], + "hints": { + "index": 3782 + } + }, + { + "items": [ + 2422, + null + ], + "hints": { + "index": 3783 + } + }, + { + "items": [ + 2422.5, + null + ], + "hints": { + "index": 3784 + } + }, + { + "items": [ + 2423, + null + ], + "hints": { + "index": 3785 + } + }, + { + "items": [ + 2423.5, + null + ], + "hints": { + "index": 3786 + } + }, + { + "items": [ + 2424, + null + ], + "hints": { + "index": 3787 + } + }, + { + "items": [ + 2424.5, + null + ], + "hints": { + "index": 3788 + } + }, + { + "items": [ + 2425, + null + ], + "hints": { + "index": 3789 + } + }, + { + "items": [ + 2425.5, + null + ], + "hints": { + "index": 3790 + } + }, + { + "items": [ + 2426, + null + ], + "hints": { + "index": 3791 + } + }, + { + "items": [ + 2426.5, + null + ], + "hints": { + "index": 3792 + } + }, + { + "items": [ + 2427, + null + ], + "hints": { + "index": 3793 + } + }, + { + "items": [ + 2427.5, + null + ], + "hints": { + "index": 3794 + } + }, + { + "items": [ + 2428, + null + ], + "hints": { + "index": 3795 + } + }, + { + "items": [ + 2428.5, + null + ], + "hints": { + "index": 3796 + } + }, + { + "items": [ + 2429, + null + ], + "hints": { + "index": 3797 + } + }, + { + "items": [ + 2429.5, + null + ], + "hints": { + "index": 3798 + } + }, + { + "items": [ + 2430, + null + ], + "hints": { + "index": 3799 + } + }, + { + "items": [ + 2430.5, + null + ], + "hints": { + "index": 3800 + } + }, + { + "items": [ + 2431, + null + ], + "hints": { + "index": 3801 + } + }, + { + "items": [ + 2431.5, + null + ], + "hints": { + "index": 3802 + } + }, + { + "items": [ + 2432, + null + ], + "hints": { + "index": 3803 + } + }, + { + "items": [ + 2432.5, + null + ], + "hints": { + "index": 3804 + } + }, + { + "items": [ + 2433, + null + ], + "hints": { + "index": 3805 + } + }, + { + "items": [ + 2433.5, + null + ], + "hints": { + "index": 3806 + } + }, + { + "items": [ + 2434, + null + ], + "hints": { + "index": 3807 + } + }, + { + "items": [ + 2434.5, + null + ], + "hints": { + "index": 3808 + } + }, + { + "items": [ + 2435, + null + ], + "hints": { + "index": 3809 + } + }, + { + "items": [ + 2435.5, + null + ], + "hints": { + "index": 3810 + } + }, + { + "items": [ + 2436, + null + ], + "hints": { + "index": 3811 + } + }, + { + "items": [ + 2436.5, + null + ], + "hints": { + "index": 3812 + } + }, + { + "items": [ + 2437, + null + ], + "hints": { + "index": 3813 + } + }, + { + "items": [ + 2437.5, + null + ], + "hints": { + "index": 3814 + } + }, + { + "items": [ + 2438, + null + ], + "hints": { + "index": 3815 + } + }, + { + "items": [ + 2438.5, + null + ], + "hints": { + "index": 3816 + } + }, + { + "items": [ + 2439, + null + ], + "hints": { + "index": 3817 + } + }, + { + "items": [ + 2439.5, + null + ], + "hints": { + "index": 3818 + } + }, + { + "items": [ + 2440, + null + ], + "hints": { + "index": 3819 + } + }, + { + "items": [ + 2440.5, + null + ], + "hints": { + "index": 3820 + } + }, + { + "items": [ + 2441, + null + ], + "hints": { + "index": 3821 + } + }, + { + "items": [ + 2441.5, + null + ], + "hints": { + "index": 3822 + } + }, + { + "items": [ + 2442, + null + ], + "hints": { + "index": 3823 + } + }, + { + "items": [ + 2442.5, + null + ], + "hints": { + "index": 3824 + } + }, + { + "items": [ + 2443, + null + ], + "hints": { + "index": 3825 + } + }, + { + "items": [ + 2443.5, + null + ], + "hints": { + "index": 3826 + } + }, + { + "items": [ + 2444, + null + ], + "hints": { + "index": 3827 + } + }, + { + "items": [ + 2444.5, + null + ], + "hints": { + "index": 3828 + } + }, + { + "items": [ + 2445, + null + ], + "hints": { + "index": 3829 + } + }, + { + "items": [ + 2445.5, + null + ], + "hints": { + "index": 3830 + } + }, + { + "items": [ + 2446, + null + ], + "hints": { + "index": 3831 + } + }, + { + "items": [ + 2446.5, + null + ], + "hints": { + "index": 3832 + } + }, + { + "items": [ + 2447, + null + ], + "hints": { + "index": 3833 + } + }, + { + "items": [ + 2447.5, + null + ], + "hints": { + "index": 3834 + } + }, + { + "items": [ + 2448, + null + ], + "hints": { + "index": 3835 + } + }, + { + "items": [ + 2448.5, + null + ], + "hints": { + "index": 3836 + } + }, + { + "items": [ + 2449, + null + ], + "hints": { + "index": 3837 + } + }, + { + "items": [ + 2449.5, + null + ], + "hints": { + "index": 3838 + } + }, + { + "items": [ + 2450, + null + ], + "hints": { + "index": 3839 + } + }, + { + "items": [ + 2450.5, + null + ], + "hints": { + "index": 3840 + } + }, + { + "items": [ + 2451, + null + ], + "hints": { + "index": 3841 + } + }, + { + "items": [ + 2451.5, + null + ], + "hints": { + "index": 3842 + } + }, + { + "items": [ + 2452, + null + ], + "hints": { + "index": 3843 + } + }, + { + "items": [ + 2452.5, + null + ], + "hints": { + "index": 3844 + } + }, + { + "items": [ + 2453, + null + ], + "hints": { + "index": 3845 + } + }, + { + "items": [ + 2453.5, + null + ], + "hints": { + "index": 3846 + } + }, + { + "items": [ + 2454, + null + ], + "hints": { + "index": 3847 + } + }, + { + "items": [ + 2454.5, + null + ], + "hints": { + "index": 3848 + } + }, + { + "items": [ + 2455, + null + ], + "hints": { + "index": 3849 + } + }, + { + "items": [ + 2455.5, + null + ], + "hints": { + "index": 3850 + } + }, + { + "items": [ + 2456, + null + ], + "hints": { + "index": 3851 + } + }, + { + "items": [ + 2456.5, + null + ], + "hints": { + "index": 3852 + } + }, + { + "items": [ + 2457, + null + ], + "hints": { + "index": 3853 + } + }, + { + "items": [ + 2457.5, + null + ], + "hints": { + "index": 3854 + } + }, + { + "items": [ + 2458, + null + ], + "hints": { + "index": 3855 + } + }, + { + "items": [ + 2458.5, + null + ], + "hints": { + "index": 3856 + } + }, + { + "items": [ + 2459, + null + ], + "hints": { + "index": 3857 + } + }, + { + "items": [ + 2459.5, + null + ], + "hints": { + "index": 3858 + } + }, + { + "items": [ + 2460, + null + ], + "hints": { + "index": 3859 + } + }, + { + "items": [ + 2460.5, + null + ], + "hints": { + "index": 3860 + } + }, + { + "items": [ + 2461, + null + ], + "hints": { + "index": 3861 + } + }, + { + "items": [ + 2461.5, + null + ], + "hints": { + "index": 3862 + } + }, + { + "items": [ + 2462, + null + ], + "hints": { + "index": 3863 + } + }, + { + "items": [ + 2462.5, + null + ], + "hints": { + "index": 3864 + } + }, + { + "items": [ + 2463, + null + ], + "hints": { + "index": 3865 + } + }, + { + "items": [ + 2463.5, + null + ], + "hints": { + "index": 3866 + } + }, + { + "items": [ + 2464, + null + ], + "hints": { + "index": 3867 + } + }, + { + "items": [ + 2464.5, + null + ], + "hints": { + "index": 3868 + } + }, + { + "items": [ + 2465, + null + ], + "hints": { + "index": 3869 + } + }, + { + "items": [ + 2465.5, + null + ], + "hints": { + "index": 3870 + } + }, + { + "items": [ + 2466, + null + ], + "hints": { + "index": 3871 + } + }, + { + "items": [ + 2466.5, + null + ], + "hints": { + "index": 3872 + } + }, + { + "items": [ + 2467, + null + ], + "hints": { + "index": 3873 + } + }, + { + "items": [ + 2467.5, + null + ], + "hints": { + "index": 3874 + } + }, + { + "items": [ + 2468, + null + ], + "hints": { + "index": 3875 + } + }, + { + "items": [ + 2468.5, + null + ], + "hints": { + "index": 3876 + } + }, + { + "items": [ + 2469, + null + ], + "hints": { + "index": 3877 + } + }, + { + "items": [ + 2469.5, + null + ], + "hints": { + "index": 3878 + } + }, + { + "items": [ + 2470, + null + ], + "hints": { + "index": 3879 + } + }, + { + "items": [ + 2470.5, + null + ], + "hints": { + "index": 3880 + } + }, + { + "items": [ + 2471, + null + ], + "hints": { + "index": 3881 + } + }, + { + "items": [ + 2471.5, + null + ], + "hints": { + "index": 3882 + } + }, + { + "items": [ + 2472, + null + ], + "hints": { + "index": 3883 + } + }, + { + "items": [ + 2472.5, + null + ], + "hints": { + "index": 3884 + } + }, + { + "items": [ + 2473, + null + ], + "hints": { + "index": 3885 + } + }, + { + "items": [ + 2473.5, + null + ], + "hints": { + "index": 3886 + } + }, + { + "items": [ + 2474, + null + ], + "hints": { + "index": 3887 + } + }, + { + "items": [ + 2474.5, + null + ], + "hints": { + "index": 3888 + } + }, + { + "items": [ + 2475, + null + ], + "hints": { + "index": 3889 + } + }, + { + "items": [ + 2475.5, + null + ], + "hints": { + "index": 3890 + } + }, + { + "items": [ + 2476, + null + ], + "hints": { + "index": 3891 + } + }, + { + "items": [ + 2476.5, + null + ], + "hints": { + "index": 3892 + } + }, + { + "items": [ + 2477, + null + ], + "hints": { + "index": 3893 + } + }, + { + "items": [ + 2477.5, + null + ], + "hints": { + "index": 3894 + } + }, + { + "items": [ + 2478, + null + ], + "hints": { + "index": 3895 + } + }, + { + "items": [ + 2478.5, + null + ], + "hints": { + "index": 3896 + } + }, + { + "items": [ + 2479, + null + ], + "hints": { + "index": 3897 + } + }, + { + "items": [ + 2479.5, + null + ], + "hints": { + "index": 3898 + } + }, + { + "items": [ + 2480, + null + ], + "hints": { + "index": 3899 + } + }, + { + "items": [ + 2480.5, + null + ], + "hints": { + "index": 3900 + } + }, + { + "items": [ + 2481, + null + ], + "hints": { + "index": 3901 + } + }, + { + "items": [ + 2481.5, + null + ], + "hints": { + "index": 3902 + } + }, + { + "items": [ + 2482, + null + ], + "hints": { + "index": 3903 + } + }, + { + "items": [ + 2482.5, + null + ], + "hints": { + "index": 3904 + } + }, + { + "items": [ + 2483, + null + ], + "hints": { + "index": 3905 + } + }, + { + "items": [ + 2483.5, + null + ], + "hints": { + "index": 3906 + } + }, + { + "items": [ + 2484, + null + ], + "hints": { + "index": 3907 + } + }, + { + "items": [ + 2484.5, + null + ], + "hints": { + "index": 3908 + } + }, + { + "items": [ + 2485, + null + ], + "hints": { + "index": 3909 + } + }, + { + "items": [ + 2485.5, + null + ], + "hints": { + "index": 3910 + } + }, + { + "items": [ + 2486, + null + ], + "hints": { + "index": 3911 + } + }, + { + "items": [ + 2486.5, + null + ], + "hints": { + "index": 3912 + } + }, + { + "items": [ + 2487, + null + ], + "hints": { + "index": 3913 + } + }, + { + "items": [ + 2487.5, + null + ], + "hints": { + "index": 3914 + } + }, + { + "items": [ + 2488, + null + ], + "hints": { + "index": 3915 + } + }, + { + "items": [ + 2488.5, + null + ], + "hints": { + "index": 3916 + } + }, + { + "items": [ + 2489, + null + ], + "hints": { + "index": 3917 + } + }, + { + "items": [ + 2489.5, + null + ], + "hints": { + "index": 3918 + } + }, + { + "items": [ + 2490, + null + ], + "hints": { + "index": 3919 + } + }, + { + "items": [ + 2490.5, + null + ], + "hints": { + "index": 3920 + } + }, + { + "items": [ + 2491, + null + ], + "hints": { + "index": 3921 + } + }, + { + "items": [ + 2491.5, + null + ], + "hints": { + "index": 3922 + } + }, + { + "items": [ + 2492, + null + ], + "hints": { + "index": 3923 + } + }, + { + "items": [ + 2492.5, + null + ], + "hints": { + "index": 3924 + } + }, + { + "items": [ + 2493, + null + ], + "hints": { + "index": 3925 + } + }, + { + "items": [ + 2493.5, + null + ], + "hints": { + "index": 3926 + } + }, + { + "items": [ + 2494, + null + ], + "hints": { + "index": 3927 + } + }, + { + "items": [ + 2494.5, + null + ], + "hints": { + "index": 3928 + } + }, + { + "items": [ + 2495, + null + ], + "hints": { + "index": 3929 + } + }, + { + "items": [ + 2495.5, + null + ], + "hints": { + "index": 3930 + } + }, + { + "items": [ + 2496, + null + ], + "hints": { + "index": 3931 + } + }, + { + "items": [ + 2496.5, + null + ], + "hints": { + "index": 3932 + } + }, + { + "items": [ + 2497, + null + ], + "hints": { + "index": 3933 + } + }, + { + "items": [ + 2497.5, + null + ], + "hints": { + "index": 3934 + } + }, + { + "items": [ + 2498, + null + ], + "hints": { + "index": 3935 + } + }, + { + "items": [ + 2498.5, + null + ], + "hints": { + "index": 3936 + } + }, + { + "items": [ + 2499, + null + ], + "hints": { + "index": 3937 + } + }, + { + "items": [ + 2499.5, + null + ], + "hints": { + "index": 3938 + } + }, + { + "items": [ + 2500, + null + ], + "hints": { + "index": 3939 + } + }, + { + "items": [ + 2500.5, + null + ], + "hints": { + "index": 3940 + } + }, + { + "items": [ + 2501, + null + ], + "hints": { + "index": 3941 + } + }, + { + "items": [ + 2501.5, + null + ], + "hints": { + "index": 3942 + } + }, + { + "items": [ + 2502, + null + ], + "hints": { + "index": 3943 + } + }, + { + "items": [ + 2502.5, + null + ], + "hints": { + "index": 3944 + } + }, + { + "items": [ + 2503, + null + ], + "hints": { + "index": 3945 + } + }, + { + "items": [ + 2503.5, + null + ], + "hints": { + "index": 3946 + } + }, + { + "items": [ + 2504, + null + ], + "hints": { + "index": 3947 + } + }, + { + "items": [ + 2504.5, + null + ], + "hints": { + "index": 3948 + } + }, + { + "items": [ + 2505, + null + ], + "hints": { + "index": 3949 + } + }, + { + "items": [ + 2505.5, + null + ], + "hints": { + "index": 3950 + } + }, + { + "items": [ + 2506, + null + ], + "hints": { + "index": 3951 + } + }, + { + "items": [ + 2506.5, + null + ], + "hints": { + "index": 3952 + } + }, + { + "items": [ + 2507, + null + ], + "hints": { + "index": 3953 + } + }, + { + "items": [ + 2507.5, + null + ], + "hints": { + "index": 3954 + } + }, + { + "items": [ + 2508, + null + ], + "hints": { + "index": 3955 + } + }, + { + "items": [ + 2508.5, + null + ], + "hints": { + "index": 3956 + } + }, + { + "items": [ + 2509, + null + ], + "hints": { + "index": 3957 + } + }, + { + "items": [ + 2509.5, + null + ], + "hints": { + "index": 3958 + } + }, + { + "items": [ + 2510, + null + ], + "hints": { + "index": 3959 + } + }, + { + "items": [ + 2510.5, + null + ], + "hints": { + "index": 3960 + } + }, + { + "items": [ + 2511, + null + ], + "hints": { + "index": 3961 + } + }, + { + "items": [ + 2511.5, + null + ], + "hints": { + "index": 3962 + } + }, + { + "items": [ + 2512, + null + ], + "hints": { + "index": 3963 + } + }, + { + "items": [ + 2512.5, + null + ], + "hints": { + "index": 3964 + } + }, + { + "items": [ + 2513, + null + ], + "hints": { + "index": 3965 + } + }, + { + "items": [ + 2513.5, + null + ], + "hints": { + "index": 3966 + } + }, + { + "items": [ + 2514, + null + ], + "hints": { + "index": 3967 + } + }, + { + "items": [ + 2514.5, + null + ], + "hints": { + "index": 3968 + } + }, + { + "items": [ + 2515, + null + ], + "hints": { + "index": 3969 + } + }, + { + "items": [ + 2515.5, + null + ], + "hints": { + "index": 3970 + } + }, + { + "items": [ + 2516, + null + ], + "hints": { + "index": 3971 + } + }, + { + "items": [ + 2516.5, + null + ], + "hints": { + "index": 3972 + } + }, + { + "items": [ + 2517, + null + ], + "hints": { + "index": 3973 + } + }, + { + "items": [ + 2517.5, + null + ], + "hints": { + "index": 3974 + } + }, + { + "items": [ + 2518, + null + ], + "hints": { + "index": 3975 + } + }, + { + "items": [ + 2518.5, + null + ], + "hints": { + "index": 3976 + } + }, + { + "items": [ + 2519, + null + ], + "hints": { + "index": 3977 + } + }, + { + "items": [ + 2519.5, + null + ], + "hints": { + "index": 3978 + } + }, + { + "items": [ + 2520, + null + ], + "hints": { + "index": 3979 + } + }, + { + "items": [ + 2520.5, + null + ], + "hints": { + "index": 3980 + } + }, + { + "items": [ + 2521, + null + ], + "hints": { + "index": 3981 + } + }, + { + "items": [ + 2521.5, + null + ], + "hints": { + "index": 3982 + } + }, + { + "items": [ + 2522, + null + ], + "hints": { + "index": 3983 + } + }, + { + "items": [ + 2522.5, + null + ], + "hints": { + "index": 3984 + } + }, + { + "items": [ + 2523, + null + ], + "hints": { + "index": 3985 + } + }, + { + "items": [ + 2523.5, + null + ], + "hints": { + "index": 3986 + } + }, + { + "items": [ + 2524, + null + ], + "hints": { + "index": 3987 + } + }, + { + "items": [ + 2524.5, + null + ], + "hints": { + "index": 3988 + } + }, + { + "items": [ + 2525, + null + ], + "hints": { + "index": 3989 + } + }, + { + "items": [ + 2525.5, + null + ], + "hints": { + "index": 3990 + } + }, + { + "items": [ + 2526, + null + ], + "hints": { + "index": 3991 + } + }, + { + "items": [ + 2526.5, + null + ], + "hints": { + "index": 3992 + } + }, + { + "items": [ + 2527, + null + ], + "hints": { + "index": 3993 + } + }, + { + "items": [ + 2527.5, + null + ], + "hints": { + "index": 3994 + } + }, + { + "items": [ + 2528, + null + ], + "hints": { + "index": 3995 + } + }, + { + "items": [ + 2528.5, + null + ], + "hints": { + "index": 3996 + } + }, + { + "items": [ + 2529, + null + ], + "hints": { + "index": 3997 + } + }, + { + "items": [ + 2529.5, + null + ], + "hints": { + "index": 3998 + } + }, + { + "items": [ + 2530, + null + ], + "hints": { + "index": 3999 + } + }, + { + "items": [ + 2530.5, + null + ], + "hints": { + "index": 4000 + } + }, + { + "items": [ + 2531, + null + ], + "hints": { + "index": 4001 + } + }, + { + "items": [ + 2531.5, + null + ], + "hints": { + "index": 4002 + } + }, + { + "items": [ + 2532, + null + ], + "hints": { + "index": 4003 + } + }, + { + "items": [ + 2532.5, + null + ], + "hints": { + "index": 4004 + } + }, + { + "items": [ + 2533, + null + ], + "hints": { + "index": 4005 + } + }, + { + "items": [ + 2533.5, + null + ], + "hints": { + "index": 4006 + } + }, + { + "items": [ + 2534, + null + ], + "hints": { + "index": 4007 + } + }, + { + "items": [ + 2534.5, + null + ], + "hints": { + "index": 4008 + } + }, + { + "items": [ + 2535, + null + ], + "hints": { + "index": 4009 + } + }, + { + "items": [ + 2535.5, + null + ], + "hints": { + "index": 4010 + } + }, + { + "items": [ + 2536, + null + ], + "hints": { + "index": 4011 + } + }, + { + "items": [ + 2536.5, + null + ], + "hints": { + "index": 4012 + } + }, + { + "items": [ + 2537, + null + ], + "hints": { + "index": 4013 + } + }, + { + "items": [ + 2537.5, + null + ], + "hints": { + "index": 4014 + } + }, + { + "items": [ + 2538, + null + ], + "hints": { + "index": 4015 + } + }, + { + "items": [ + 2538.5, + null + ], + "hints": { + "index": 4016 + } + }, + { + "items": [ + 2539, + null + ], + "hints": { + "index": 4017 + } + }, + { + "items": [ + 2539.5, + null + ], + "hints": { + "index": 4018 + } + }, + { + "items": [ + 2540, + null + ], + "hints": { + "index": 4019 + } + }, + { + "items": [ + 2540.5, + null + ], + "hints": { + "index": 4020 + } + }, + { + "items": [ + 2541, + null + ], + "hints": { + "index": 4021 + } + }, + { + "items": [ + 2541.5, + null + ], + "hints": { + "index": 4022 + } + }, + { + "items": [ + 2542, + null + ], + "hints": { + "index": 4023 + } + }, + { + "items": [ + 2542.5, + null + ], + "hints": { + "index": 4024 + } + }, + { + "items": [ + 2543, + null + ], + "hints": { + "index": 4025 + } + }, + { + "items": [ + 2543.5, + null + ], + "hints": { + "index": 4026 + } + }, + { + "items": [ + 2544, + null + ], + "hints": { + "index": 4027 + } + }, + { + "items": [ + 2544.5, + null + ], + "hints": { + "index": 4028 + } + }, + { + "items": [ + 2545, + null + ], + "hints": { + "index": 4029 + } + }, + { + "items": [ + 2545.5, + null + ], + "hints": { + "index": 4030 + } + }, + { + "items": [ + 2546, + null + ], + "hints": { + "index": 4031 + } + }, + { + "items": [ + 2546.5, + null + ], + "hints": { + "index": 4032 + } + }, + { + "items": [ + 2547, + null + ], + "hints": { + "index": 4033 + } + }, + { + "items": [ + 2547.5, + null + ], + "hints": { + "index": 4034 + } + }, + { + "items": [ + 2548, + null + ], + "hints": { + "index": 4035 + } + }, + { + "items": [ + 2548.5, + null + ], + "hints": { + "index": 4036 + } + }, + { + "items": [ + 2549, + null + ], + "hints": { + "index": 4037 + } + }, + { + "items": [ + 2549.5, + null + ], + "hints": { + "index": 4038 + } + }, + { + "items": [ + 2550, + null + ], + "hints": { + "index": 4039 + } + }, + { + "items": [ + 2550.5, + null + ], + "hints": { + "index": 4040 + } + }, + { + "items": [ + 2551, + null + ], + "hints": { + "index": 4041 + } + }, + { + "items": [ + 2551.5, + null + ], + "hints": { + "index": 4042 + } + }, + { + "items": [ + 2552, + null + ], + "hints": { + "index": 4043 + } + }, + { + "items": [ + 2552.5, + null + ], + "hints": { + "index": 4044 + } + }, + { + "items": [ + 2553, + null + ], + "hints": { + "index": 4045 + } + }, + { + "items": [ + 2553.5, + null + ], + "hints": { + "index": 4046 + } + }, + { + "items": [ + 2554, + null + ], + "hints": { + "index": 4047 + } + }, + { + "items": [ + 2554.5, + null + ], + "hints": { + "index": 4048 + } + }, + { + "items": [ + 2555, + null + ], + "hints": { + "index": 4049 + } + }, + { + "items": [ + 2555.5, + null + ], + "hints": { + "index": 4050 + } + }, + { + "items": [ + 2556, + null + ], + "hints": { + "index": 4051 + } + }, + { + "items": [ + 2556.5, + null + ], + "hints": { + "index": 4052 + } + }, + { + "items": [ + 2557, + null + ], + "hints": { + "index": 4053 + } + }, + { + "items": [ + 2557.5, + null + ], + "hints": { + "index": 4054 + } + }, + { + "items": [ + 2558, + null + ], + "hints": { + "index": 4055 + } + }, + { + "items": [ + 2558.5, + null + ], + "hints": { + "index": 4056 + } + }, + { + "items": [ + 2559, + null + ], + "hints": { + "index": 4057 + } + }, + { + "items": [ + 2559.5, + null + ], + "hints": { + "index": 4058 + } + }, + { + "items": [ + 2560, + null + ], + "hints": { + "index": 4059 + } + }, + { + "items": [ + 2560.5, + null + ], + "hints": { + "index": 4060 + } + }, + { + "items": [ + 2561, + null + ], + "hints": { + "index": 4061 + } + }, + { + "items": [ + 2561.5, + null + ], + "hints": { + "index": 4062 + } + }, + { + "items": [ + 2562, + null + ], + "hints": { + "index": 4063 + } + }, + { + "items": [ + 2562.5, + null + ], + "hints": { + "index": 4064 + } + }, + { + "items": [ + 2563, + null + ], + "hints": { + "index": 4065 + } + }, + { + "items": [ + 2563.5, + null + ], + "hints": { + "index": 4066 + } + }, + { + "items": [ + 2564, + null + ], + "hints": { + "index": 4067 + } + }, + { + "items": [ + 2564.5, + null + ], + "hints": { + "index": 4068 + } + }, + { + "items": [ + 2565, + null + ], + "hints": { + "index": 4069 + } + }, + { + "items": [ + 2565.5, + null + ], + "hints": { + "index": 4070 + } + }, + { + "items": [ + 2566, + null + ], + "hints": { + "index": 4071 + } + }, + { + "items": [ + 2566.5, + null + ], + "hints": { + "index": 4072 + } + }, + { + "items": [ + 2567, + null + ], + "hints": { + "index": 4073 + } + }, + { + "items": [ + 2567.5, + null + ], + "hints": { + "index": 4074 + } + }, + { + "items": [ + 2568, + null + ], + "hints": { + "index": 4075 + } + }, + { + "items": [ + 2568.5, + null + ], + "hints": { + "index": 4076 + } + }, + { + "items": [ + 2569, + null + ], + "hints": { + "index": 4077 + } + }, + { + "items": [ + 2569.5, + null + ], + "hints": { + "index": 4078 + } + }, + { + "items": [ + 2570, + null + ], + "hints": { + "index": 4079 + } + }, + { + "items": [ + 2570.5, + null + ], + "hints": { + "index": 4080 + } + }, + { + "items": [ + 2571, + null + ], + "hints": { + "index": 4081 + } + }, + { + "items": [ + 2571.5, + null + ], + "hints": { + "index": 4082 + } + }, + { + "items": [ + 2572, + null + ], + "hints": { + "index": 4083 + } + }, + { + "items": [ + 2572.5, + null + ], + "hints": { + "index": 4084 + } + }, + { + "items": [ + 2573, + null + ], + "hints": { + "index": 4085 + } + }, + { + "items": [ + 2573.5, + null + ], + "hints": { + "index": 4086 + } + }, + { + "items": [ + 2574, + null + ], + "hints": { + "index": 4087 + } + }, + { + "items": [ + 2574.5, + null + ], + "hints": { + "index": 4088 + } + }, + { + "items": [ + 2575, + null + ], + "hints": { + "index": 4089 + } + }, + { + "items": [ + 2575.5, + null + ], + "hints": { + "index": 4090 + } + }, + { + "items": [ + 2576, + null + ], + "hints": { + "index": 4091 + } + }, + { + "items": [ + 2576.5, + null + ], + "hints": { + "index": 4092 + } + }, + { + "items": [ + 2577, + null + ], + "hints": { + "index": 4093 + } + }, + { + "items": [ + 2577.5, + null + ], + "hints": { + "index": 4094 + } + }, + { + "items": [ + 2578, + null + ], + "hints": { + "index": 4095 + } + }, + { + "items": [ + 2578.5, + null + ], + "hints": { + "index": 4096 + } + }, + { + "items": [ + 2579, + null + ], + "hints": { + "index": 4097 + } + }, + { + "items": [ + 2579.5, + null + ], + "hints": { + "index": 4098 + } + }, + { + "items": [ + 2580, + null + ], + "hints": { + "index": 4099 + } + }, + { + "items": [ + 2580.5, + null + ], + "hints": { + "index": 4100 + } + }, + { + "items": [ + 2581, + null + ], + "hints": { + "index": 4101 + } + }, + { + "items": [ + 2581.5, + null + ], + "hints": { + "index": 4102 + } + }, + { + "items": [ + 2582, + null + ], + "hints": { + "index": 4103 + } + }, + { + "items": [ + 2582.5, + null + ], + "hints": { + "index": 4104 + } + }, + { + "items": [ + 2583, + null + ], + "hints": { + "index": 4105 + } + }, + { + "items": [ + 2583.5, + null + ], + "hints": { + "index": 4106 + } + }, + { + "items": [ + 2584, + null + ], + "hints": { + "index": 4107 + } + }, + { + "items": [ + 2584.5, + null + ], + "hints": { + "index": 4108 + } + }, + { + "items": [ + 2585, + null + ], + "hints": { + "index": 4109 + } + }, + { + "items": [ + 2585.5, + null + ], + "hints": { + "index": 4110 + } + }, + { + "items": [ + 2586, + null + ], + "hints": { + "index": 4111 + } + }, + { + "items": [ + 2586.5, + null + ], + "hints": { + "index": 4112 + } + }, + { + "items": [ + 2587, + null + ], + "hints": { + "index": 4113 + } + }, + { + "items": [ + 2587.5, + null + ], + "hints": { + "index": 4114 + } + }, + { + "items": [ + 2588, + null + ], + "hints": { + "index": 4115 + } + }, + { + "items": [ + 2588.5, + null + ], + "hints": { + "index": 4116 + } + }, + { + "items": [ + 2589, + null + ], + "hints": { + "index": 4117 + } + }, + { + "items": [ + 2589.5, + null + ], + "hints": { + "index": 4118 + } + }, + { + "items": [ + 2590, + null + ], + "hints": { + "index": 4119 + } + }, + { + "items": [ + 2590.5, + null + ], + "hints": { + "index": 4120 + } + }, + { + "items": [ + 2591, + null + ], + "hints": { + "index": 4121 + } + }, + { + "items": [ + 2591.5, + null + ], + "hints": { + "index": 4122 + } + }, + { + "items": [ + 2592, + null + ], + "hints": { + "index": 4123 + } + }, + { + "items": [ + 2592.5, + null + ], + "hints": { + "index": 4124 + } + }, + { + "items": [ + 2593, + null + ], + "hints": { + "index": 4125 + } + }, + { + "items": [ + 2593.5, + null + ], + "hints": { + "index": 4126 + } + }, + { + "items": [ + 2594, + null + ], + "hints": { + "index": 4127 + } + }, + { + "items": [ + 2594.5, + null + ], + "hints": { + "index": 4128 + } + }, + { + "items": [ + 2595, + null + ], + "hints": { + "index": 4129 + } + }, + { + "items": [ + 2595.5, + null + ], + "hints": { + "index": 4130 + } + }, + { + "items": [ + 2596, + null + ], + "hints": { + "index": 4131 + } + }, + { + "items": [ + 2596.5, + null + ], + "hints": { + "index": 4132 + } + }, + { + "items": [ + 2597, + null + ], + "hints": { + "index": 4133 + } + }, + { + "items": [ + 2597.5, + null + ], + "hints": { + "index": 4134 + } + }, + { + "items": [ + 2598, + null + ], + "hints": { + "index": 4135 + } + }, + { + "items": [ + 2598.5, + null + ], + "hints": { + "index": 4136 + } + }, + { + "items": [ + 2599, + null + ], + "hints": { + "index": 4137 + } + }, + { + "items": [ + 2599.5, + null + ], + "hints": { + "index": 4138 + } + }, + { + "items": [ + 2600, + null + ], + "hints": { + "index": 4139 + } + }, + { + "items": [ + 2600.5, + null + ], + "hints": { + "index": 4140 + } + }, + { + "items": [ + 2601, + null + ], + "hints": { + "index": 4141 + } + }, + { + "items": [ + 2601.5, + null + ], + "hints": { + "index": 4142 + } + }, + { + "items": [ + 2602, + null + ], + "hints": { + "index": 4143 + } + }, + { + "items": [ + 2602.5, + null + ], + "hints": { + "index": 4144 + } + }, + { + "items": [ + 2603, + null + ], + "hints": { + "index": 4145 + } + }, + { + "items": [ + 2603.5, + null + ], + "hints": { + "index": 4146 + } + }, + { + "items": [ + 2604, + null + ], + "hints": { + "index": 4147 + } + }, + { + "items": [ + 2604.5, + null + ], + "hints": { + "index": 4148 + } + }, + { + "items": [ + 2605, + null + ], + "hints": { + "index": 4149 + } + }, + { + "items": [ + 2605.5, + null + ], + "hints": { + "index": 4150 + } + }, + { + "items": [ + 2606, + null + ], + "hints": { + "index": 4151 + } + }, + { + "items": [ + 2606.5, + null + ], + "hints": { + "index": 4152 + } + }, + { + "items": [ + 2607, + null + ], + "hints": { + "index": 4153 + } + }, + { + "items": [ + 2607.5, + null + ], + "hints": { + "index": 4154 + } + }, + { + "items": [ + 2608, + null + ], + "hints": { + "index": 4155 + } + }, + { + "items": [ + 2608.5, + null + ], + "hints": { + "index": 4156 + } + }, + { + "items": [ + 2609, + null + ], + "hints": { + "index": 4157 + } + }, + { + "items": [ + 2609.5, + null + ], + "hints": { + "index": 4158 + } + }, + { + "items": [ + 2610, + null + ], + "hints": { + "index": 4159 + } + }, + { + "items": [ + 2610.5, + null + ], + "hints": { + "index": 4160 + } + }, + { + "items": [ + 2611, + null + ], + "hints": { + "index": 4161 + } + }, + { + "items": [ + 2611.5, + null + ], + "hints": { + "index": 4162 + } + }, + { + "items": [ + 2612, + null + ], + "hints": { + "index": 4163 + } + }, + { + "items": [ + 2612.5, + null + ], + "hints": { + "index": 4164 + } + }, + { + "items": [ + 2613, + null + ], + "hints": { + "index": 4165 + } + }, + { + "items": [ + 2613.5, + null + ], + "hints": { + "index": 4166 + } + }, + { + "items": [ + 2614, + null + ], + "hints": { + "index": 4167 + } + }, + { + "items": [ + 2614.5, + null + ], + "hints": { + "index": 4168 + } + }, + { + "items": [ + 2615, + null + ], + "hints": { + "index": 4169 + } + }, + { + "items": [ + 2615.5, + null + ], + "hints": { + "index": 4170 + } + }, + { + "items": [ + 2616, + null + ], + "hints": { + "index": 4171 + } + }, + { + "items": [ + 2616.5, + null + ], + "hints": { + "index": 4172 + } + }, + { + "items": [ + 2617, + null + ], + "hints": { + "index": 4173 + } + }, + { + "items": [ + 2617.5, + null + ], + "hints": { + "index": 4174 + } + }, + { + "items": [ + 2618, + null + ], + "hints": { + "index": 4175 + } + }, + { + "items": [ + 2618.5, + null + ], + "hints": { + "index": 4176 + } + }, + { + "items": [ + 2619, + null + ], + "hints": { + "index": 4177 + } + }, + { + "items": [ + 2619.5, + null + ], + "hints": { + "index": 4178 + } + }, + { + "items": [ + 2620, + null + ], + "hints": { + "index": 4179 + } + }, + { + "items": [ + 2620.5, + null + ], + "hints": { + "index": 4180 + } + }, + { + "items": [ + 2621, + null + ], + "hints": { + "index": 4181 + } + }, + { + "items": [ + 2621.5, + null + ], + "hints": { + "index": 4182 + } + }, + { + "items": [ + 2622, + null + ], + "hints": { + "index": 4183 + } + }, + { + "items": [ + 2622.5, + null + ], + "hints": { + "index": 4184 + } + }, + { + "items": [ + 2623, + null + ], + "hints": { + "index": 4185 + } + }, + { + "items": [ + 2623.5, + null + ], + "hints": { + "index": 4186 + } + }, + { + "items": [ + 2624, + null + ], + "hints": { + "index": 4187 + } + }, + { + "items": [ + 2624.5, + null + ], + "hints": { + "index": 4188 + } + }, + { + "items": [ + 2625, + null + ], + "hints": { + "index": 4189 + } + }, + { + "items": [ + 2625.5, + null + ], + "hints": { + "index": 4190 + } + }, + { + "items": [ + 2626, + null + ], + "hints": { + "index": 4191 + } + }, + { + "items": [ + 2626.5, + null + ], + "hints": { + "index": 4192 + } + }, + { + "items": [ + 2627, + null + ], + "hints": { + "index": 4193 + } + }, + { + "items": [ + 2627.5, + null + ], + "hints": { + "index": 4194 + } + }, + { + "items": [ + 2628, + null + ], + "hints": { + "index": 4195 + } + }, + { + "items": [ + 2628.5, + null + ], + "hints": { + "index": 4196 + } + }, + { + "items": [ + 2629, + null + ], + "hints": { + "index": 4197 + } + }, + { + "items": [ + 2629.5, + null + ], + "hints": { + "index": 4198 + } + }, + { + "items": [ + 2630, + null + ], + "hints": { + "index": 4199 + } + }, + { + "items": [ + 2630.5, + null + ], + "hints": { + "index": 4200 + } + }, + { + "items": [ + 2631, + null + ], + "hints": { + "index": 4201 + } + }, + { + "items": [ + 2631.5, + null + ], + "hints": { + "index": 4202 + } + }, + { + "items": [ + 2632, + null + ], + "hints": { + "index": 4203 + } + }, + { + "items": [ + 2632.5, + null + ], + "hints": { + "index": 4204 + } + }, + { + "items": [ + 2633, + null + ], + "hints": { + "index": 4205 + } + }, + { + "items": [ + 2633.5, + null + ], + "hints": { + "index": 4206 + } + }, + { + "items": [ + 2634, + null + ], + "hints": { + "index": 4207 + } + }, + { + "items": [ + 2634.5, + null + ], + "hints": { + "index": 4208 + } + }, + { + "items": [ + 2635, + null + ], + "hints": { + "index": 4209 + } + }, + { + "items": [ + 2635.5, + null + ], + "hints": { + "index": 4210 + } + }, + { + "items": [ + 2636, + null + ], + "hints": { + "index": 4211 + } + }, + { + "items": [ + 2636.5, + null + ], + "hints": { + "index": 4212 + } + }, + { + "items": [ + 2637, + null + ], + "hints": { + "index": 4213 + } + }, + { + "items": [ + 2637.5, + null + ], + "hints": { + "index": 4214 + } + }, + { + "items": [ + 2638, + null + ], + "hints": { + "index": 4215 + } + }, + { + "items": [ + 2638.5, + null + ], + "hints": { + "index": 4216 + } + }, + { + "items": [ + 2639, + null + ], + "hints": { + "index": 4217 + } + }, + { + "items": [ + 2639.5, + null + ], + "hints": { + "index": 4218 + } + }, + { + "items": [ + 2640, + null + ], + "hints": { + "index": 4219 + } + }, + { + "items": [ + 2640.5, + null + ], + "hints": { + "index": 4220 + } + }, + { + "items": [ + 2641, + null + ], + "hints": { + "index": 4221 + } + }, + { + "items": [ + 2641.5, + null + ], + "hints": { + "index": 4222 + } + }, + { + "items": [ + 2642, + null + ], + "hints": { + "index": 4223 + } + }, + { + "items": [ + 2642.5, + null + ], + "hints": { + "index": 4224 + } + }, + { + "items": [ + 2643, + null + ], + "hints": { + "index": 4225 + } + }, + { + "items": [ + 2643.5, + null + ], + "hints": { + "index": 4226 + } + }, + { + "items": [ + 2644, + null + ], + "hints": { + "index": 4227 + } + }, + { + "items": [ + 2644.5, + null + ], + "hints": { + "index": 4228 + } + }, + { + "items": [ + 2645, + null + ], + "hints": { + "index": 4229 + } + }, + { + "items": [ + 2645.5, + null + ], + "hints": { + "index": 4230 + } + }, + { + "items": [ + 2646, + null + ], + "hints": { + "index": 4231 + } + }, + { + "items": [ + 2646.5, + null + ], + "hints": { + "index": 4232 + } + }, + { + "items": [ + 2647, + null + ], + "hints": { + "index": 4233 + } + }, + { + "items": [ + 2647.5, + null + ], + "hints": { + "index": 4234 + } + }, + { + "items": [ + 2648, + null + ], + "hints": { + "index": 4235 + } + }, + { + "items": [ + 2648.5, + null + ], + "hints": { + "index": 4236 + } + }, + { + "items": [ + 2649, + null + ], + "hints": { + "index": 4237 + } + }, + { + "items": [ + 2649.5, + null + ], + "hints": { + "index": 4238 + } + }, + { + "items": [ + 2650, + null + ], + "hints": { + "index": 4239 + } + }, + { + "items": [ + 2650.5, + null + ], + "hints": { + "index": 4240 + } + }, + { + "items": [ + 2651, + null + ], + "hints": { + "index": 4241 + } + }, + { + "items": [ + 2651.5, + null + ], + "hints": { + "index": 4242 + } + }, + { + "items": [ + 2652, + null + ], + "hints": { + "index": 4243 + } + }, + { + "items": [ + 2652.5, + null + ], + "hints": { + "index": 4244 + } + }, + { + "items": [ + 2653, + null + ], + "hints": { + "index": 4245 + } + }, + { + "items": [ + 2653.5, + null + ], + "hints": { + "index": 4246 + } + }, + { + "items": [ + 2654, + null + ], + "hints": { + "index": 4247 + } + }, + { + "items": [ + 2654.5, + null + ], + "hints": { + "index": 4248 + } + }, + { + "items": [ + 2655, + null + ], + "hints": { + "index": 4249 + } + }, + { + "items": [ + 2655.5, + null + ], + "hints": { + "index": 4250 + } + }, + { + "items": [ + 2656, + null + ], + "hints": { + "index": 4251 + } + }, + { + "items": [ + 2656.5, + null + ], + "hints": { + "index": 4252 + } + }, + { + "items": [ + 2657, + null + ], + "hints": { + "index": 4253 + } + }, + { + "items": [ + 2657.5, + null + ], + "hints": { + "index": 4254 + } + }, + { + "items": [ + 2658, + null + ], + "hints": { + "index": 4255 + } + }, + { + "items": [ + 2658.5, + null + ], + "hints": { + "index": 4256 + } + }, + { + "items": [ + 2659, + null + ], + "hints": { + "index": 4257 + } + }, + { + "items": [ + 2659.5, + null + ], + "hints": { + "index": 4258 + } + }, + { + "items": [ + 2660, + null + ], + "hints": { + "index": 4259 + } + }, + { + "items": [ + 2660.5, + null + ], + "hints": { + "index": 4260 + } + }, + { + "items": [ + 2661, + null + ], + "hints": { + "index": 4261 + } + }, + { + "items": [ + 2661.5, + null + ], + "hints": { + "index": 4262 + } + }, + { + "items": [ + 2662, + null + ], + "hints": { + "index": 4263 + } + }, + { + "items": [ + 2662.5, + null + ], + "hints": { + "index": 4264 + } + }, + { + "items": [ + 2663, + null + ], + "hints": { + "index": 4265 + } + }, + { + "items": [ + 2663.5, + null + ], + "hints": { + "index": 4266 + } + }, + { + "items": [ + 2664, + null + ], + "hints": { + "index": 4267 + } + }, + { + "items": [ + 2664.5, + null + ], + "hints": { + "index": 4268 + } + }, + { + "items": [ + 2665, + null + ], + "hints": { + "index": 4269 + } + }, + { + "items": [ + 2665.5, + null + ], + "hints": { + "index": 4270 + } + }, + { + "items": [ + 2666, + null + ], + "hints": { + "index": 4271 + } + }, + { + "items": [ + 2666.5, + null + ], + "hints": { + "index": 4272 + } + }, + { + "items": [ + 2667, + null + ], + "hints": { + "index": 4273 + } + }, + { + "items": [ + 2667.5, + null + ], + "hints": { + "index": 4274 + } + }, + { + "items": [ + 2668, + null + ], + "hints": { + "index": 4275 + } + }, + { + "items": [ + 2668.5, + null + ], + "hints": { + "index": 4276 + } + }, + { + "items": [ + 2669, + null + ], + "hints": { + "index": 4277 + } + }, + { + "items": [ + 2669.5, + null + ], + "hints": { + "index": 4278 + } + }, + { + "items": [ + 2670, + null + ], + "hints": { + "index": 4279 + } + }, + { + "items": [ + 2670.5, + null + ], + "hints": { + "index": 4280 + } + }, + { + "items": [ + 2671, + null + ], + "hints": { + "index": 4281 + } + }, + { + "items": [ + 2671.5, + null + ], + "hints": { + "index": 4282 + } + }, + { + "items": [ + 2672, + null + ], + "hints": { + "index": 4283 + } + }, + { + "items": [ + 2672.5, + null + ], + "hints": { + "index": 4284 + } + }, + { + "items": [ + 2673, + null + ], + "hints": { + "index": 4285 + } + }, + { + "items": [ + 2673.5, + null + ], + "hints": { + "index": 4286 + } + }, + { + "items": [ + 2674, + null + ], + "hints": { + "index": 4287 + } + }, + { + "items": [ + 2674.5, + null + ], + "hints": { + "index": 4288 + } + }, + { + "items": [ + 2675, + null + ], + "hints": { + "index": 4289 + } + }, + { + "items": [ + 2675.5, + null + ], + "hints": { + "index": 4290 + } + }, + { + "items": [ + 2676, + null + ], + "hints": { + "index": 4291 + } + }, + { + "items": [ + 2676.5, + null + ], + "hints": { + "index": 4292 + } + }, + { + "items": [ + 2677, + null + ], + "hints": { + "index": 4293 + } + }, + { + "items": [ + 2677.5, + null + ], + "hints": { + "index": 4294 + } + }, + { + "items": [ + 2678, + null + ], + "hints": { + "index": 4295 + } + }, + { + "items": [ + 2678.5, + null + ], + "hints": { + "index": 4296 + } + }, + { + "items": [ + 2679, + null + ], + "hints": { + "index": 4297 + } + }, + { + "items": [ + 2679.5, + null + ], + "hints": { + "index": 4298 + } + }, + { + "items": [ + 2680, + null + ], + "hints": { + "index": 4299 + } + }, + { + "items": [ + 2680.5, + null + ], + "hints": { + "index": 4300 + } + }, + { + "items": [ + 2681, + null + ], + "hints": { + "index": 4301 + } + }, + { + "items": [ + 2681.5, + null + ], + "hints": { + "index": 4302 + } + }, + { + "items": [ + 2682, + null + ], + "hints": { + "index": 4303 + } + }, + { + "items": [ + 2682.5, + null + ], + "hints": { + "index": 4304 + } + }, + { + "items": [ + 2683, + null + ], + "hints": { + "index": 4305 + } + }, + { + "items": [ + 2683.5, + null + ], + "hints": { + "index": 4306 + } + }, + { + "items": [ + 2684, + null + ], + "hints": { + "index": 4307 + } + }, + { + "items": [ + 2684.5, + null + ], + "hints": { + "index": 4308 + } + }, + { + "items": [ + 2685, + null + ], + "hints": { + "index": 4309 + } + }, + { + "items": [ + 2685.5, + null + ], + "hints": { + "index": 4310 + } + }, + { + "items": [ + 2686, + null + ], + "hints": { + "index": 4311 + } + }, + { + "items": [ + 2686.5, + null + ], + "hints": { + "index": 4312 + } + }, + { + "items": [ + 2687, + null + ], + "hints": { + "index": 4313 + } + }, + { + "items": [ + 2687.5, + null + ], + "hints": { + "index": 4314 + } + }, + { + "items": [ + 2688, + null + ], + "hints": { + "index": 4315 + } + }, + { + "items": [ + 2688.5, + null + ], + "hints": { + "index": 4316 + } + }, + { + "items": [ + 2689, + null + ], + "hints": { + "index": 4317 + } + }, + { + "items": [ + 2689.5, + null + ], + "hints": { + "index": 4318 + } + }, + { + "items": [ + 2690, + null + ], + "hints": { + "index": 4319 + } + }, + { + "items": [ + 2690.5, + null + ], + "hints": { + "index": 4320 + } + }, + { + "items": [ + 2691, + null + ], + "hints": { + "index": 4321 + } + }, + { + "items": [ + 2691.5, + null + ], + "hints": { + "index": 4322 + } + }, + { + "items": [ + 2692, + null + ], + "hints": { + "index": 4323 + } + }, + { + "items": [ + 2692.5, + null + ], + "hints": { + "index": 4324 + } + }, + { + "items": [ + 2693, + null + ], + "hints": { + "index": 4325 + } + }, + { + "items": [ + 2693.5, + null + ], + "hints": { + "index": 4326 + } + }, + { + "items": [ + 2694, + null + ], + "hints": { + "index": 4327 + } + }, + { + "items": [ + 2694.5, + null + ], + "hints": { + "index": 4328 + } + }, + { + "items": [ + 2695, + null + ], + "hints": { + "index": 4329 + } + }, + { + "items": [ + 2695.5, + null + ], + "hints": { + "index": 4330 + } + }, + { + "items": [ + 2696, + null + ], + "hints": { + "index": 4331 + } + }, + { + "items": [ + 2696.5, + null + ], + "hints": { + "index": 4332 + } + }, + { + "items": [ + 2697, + null + ], + "hints": { + "index": 4333 + } + }, + { + "items": [ + 2697.5, + null + ], + "hints": { + "index": 4334 + } + }, + { + "items": [ + 2698, + null + ], + "hints": { + "index": 4335 + } + }, + { + "items": [ + 2698.5, + null + ], + "hints": { + "index": 4336 + } + }, + { + "items": [ + 2699, + null + ], + "hints": { + "index": 4337 + } + }, + { + "items": [ + 2699.5, + null + ], + "hints": { + "index": 4338 + } + }, + { + "items": [ + 2700, + null + ], + "hints": { + "index": 4339 + } + }, + { + "items": [ + 2700.5, + null + ], + "hints": { + "index": 4340 + } + }, + { + "items": [ + 2701, + null + ], + "hints": { + "index": 4341 + } + }, + { + "items": [ + 2701.5, + null + ], + "hints": { + "index": 4342 + } + }, + { + "items": [ + 2702, + null + ], + "hints": { + "index": 4343 + } + }, + { + "items": [ + 2702.5, + null + ], + "hints": { + "index": 4344 + } + }, + { + "items": [ + 2703, + null + ], + "hints": { + "index": 4345 + } + }, + { + "items": [ + 2703.5, + null + ], + "hints": { + "index": 4346 + } + }, + { + "items": [ + 2704, + null + ], + "hints": { + "index": 4347 + } + }, + { + "items": [ + 2704.5, + null + ], + "hints": { + "index": 4348 + } + }, + { + "items": [ + 2705, + null + ], + "hints": { + "index": 4349 + } + }, + { + "items": [ + 2705.5, + null + ], + "hints": { + "index": 4350 + } + }, + { + "items": [ + 2706, + null + ], + "hints": { + "index": 4351 + } + }, + { + "items": [ + 2706.5, + null + ], + "hints": { + "index": 4352 + } + }, + { + "items": [ + 2707, + null + ], + "hints": { + "index": 4353 + } + }, + { + "items": [ + 2707.5, + null + ], + "hints": { + "index": 4354 + } + }, + { + "items": [ + 2708, + null + ], + "hints": { + "index": 4355 + } + }, + { + "items": [ + 2708.5, + null + ], + "hints": { + "index": 4356 + } + }, + { + "items": [ + 2709, + null + ], + "hints": { + "index": 4357 + } + }, + { + "items": [ + 2709.5, + null + ], + "hints": { + "index": 4358 + } + }, + { + "items": [ + 2710, + null + ], + "hints": { + "index": 4359 + } + }, + { + "items": [ + 2710.5, + null + ], + "hints": { + "index": 4360 + } + }, + { + "items": [ + 2711, + null + ], + "hints": { + "index": 4361 + } + }, + { + "items": [ + 2711.5, + null + ], + "hints": { + "index": 4362 + } + }, + { + "items": [ + 2712, + null + ], + "hints": { + "index": 4363 + } + }, + { + "items": [ + 2712.5, + null + ], + "hints": { + "index": 4364 + } + }, + { + "items": [ + 2713, + null + ], + "hints": { + "index": 4365 + } + }, + { + "items": [ + 2713.5, + null + ], + "hints": { + "index": 4366 + } + }, + { + "items": [ + 2714, + null + ], + "hints": { + "index": 4367 + } + }, + { + "items": [ + 2714.5, + null + ], + "hints": { + "index": 4368 + } + }, + { + "items": [ + 2715, + null + ], + "hints": { + "index": 4369 + } + }, + { + "items": [ + 2715.5, + null + ], + "hints": { + "index": 4370 + } + }, + { + "items": [ + 2716, + null + ], + "hints": { + "index": 4371 + } + }, + { + "items": [ + 2716.5, + null + ], + "hints": { + "index": 4372 + } + }, + { + "items": [ + 2717, + null + ], + "hints": { + "index": 4373 + } + }, + { + "items": [ + 2717.5, + null + ], + "hints": { + "index": 4374 + } + }, + { + "items": [ + 2718, + null + ], + "hints": { + "index": 4375 + } + }, + { + "items": [ + 2718.5, + null + ], + "hints": { + "index": 4376 + } + }, + { + "items": [ + 2719, + null + ], + "hints": { + "index": 4377 + } + }, + { + "items": [ + 2719.5, + null + ], + "hints": { + "index": 4378 + } + }, + { + "items": [ + 2720, + null + ], + "hints": { + "index": 4379 + } + }, + { + "items": [ + 2720.5, + null + ], + "hints": { + "index": 4380 + } + }, + { + "items": [ + 2721, + null + ], + "hints": { + "index": 4381 + } + }, + { + "items": [ + 2721.5, + null + ], + "hints": { + "index": 4382 + } + }, + { + "items": [ + 2722, + null + ], + "hints": { + "index": 4383 + } + }, + { + "items": [ + 2722.5, + null + ], + "hints": { + "index": 4384 + } + }, + { + "items": [ + 2723, + null + ], + "hints": { + "index": 4385 + } + }, + { + "items": [ + 2723.5, + null + ], + "hints": { + "index": 4386 + } + }, + { + "items": [ + 2724, + null + ], + "hints": { + "index": 4387 + } + }, + { + "items": [ + 2724.5, + null + ], + "hints": { + "index": 4388 + } + }, + { + "items": [ + 2725, + null + ], + "hints": { + "index": 4389 + } + }, + { + "items": [ + 2725.5, + null + ], + "hints": { + "index": 4390 + } + }, + { + "items": [ + 2726, + null + ], + "hints": { + "index": 4391 + } + }, + { + "items": [ + 2726.5, + null + ], + "hints": { + "index": 4392 + } + }, + { + "items": [ + 2727, + null + ], + "hints": { + "index": 4393 + } + }, + { + "items": [ + 2727.5, + null + ], + "hints": { + "index": 4394 + } + }, + { + "items": [ + 2728, + null + ], + "hints": { + "index": 4395 + } + }, + { + "items": [ + 2728.5, + null + ], + "hints": { + "index": 4396 + } + }, + { + "items": [ + 2729, + null + ], + "hints": { + "index": 4397 + } + }, + { + "items": [ + 2729.5, + null + ], + "hints": { + "index": 4398 + } + }, + { + "items": [ + 2730, + null + ], + "hints": { + "index": 4399 + } + }, + { + "items": [ + 2730.5, + null + ], + "hints": { + "index": 4400 + } + }, + { + "items": [ + 2731, + null + ], + "hints": { + "index": 4401 + } + }, + { + "items": [ + 2731.5, + null + ], + "hints": { + "index": 4402 + } + }, + { + "items": [ + 2732, + null + ], + "hints": { + "index": 4403 + } + }, + { + "items": [ + 2732.5, + null + ], + "hints": { + "index": 4404 + } + }, + { + "items": [ + 2733, + null + ], + "hints": { + "index": 4405 + } + }, + { + "items": [ + 2733.5, + null + ], + "hints": { + "index": 4406 + } + }, + { + "items": [ + 2734, + null + ], + "hints": { + "index": 4407 + } + }, + { + "items": [ + 2734.5, + null + ], + "hints": { + "index": 4408 + } + }, + { + "items": [ + 2735, + null + ], + "hints": { + "index": 4409 + } + }, + { + "items": [ + 2735.5, + null + ], + "hints": { + "index": 4410 + } + }, + { + "items": [ + 2736, + null + ], + "hints": { + "index": 4411 + } + }, + { + "items": [ + 2736.5, + null + ], + "hints": { + "index": 4412 + } + }, + { + "items": [ + 2737, + null + ], + "hints": { + "index": 4413 + } + }, + { + "items": [ + 2737.5, + null + ], + "hints": { + "index": 4414 + } + }, + { + "items": [ + 2738, + null + ], + "hints": { + "index": 4415 + } + }, + { + "items": [ + 2738.5, + null + ], + "hints": { + "index": 4416 + } + }, + { + "items": [ + 2739, + null + ], + "hints": { + "index": 4417 + } + }, + { + "items": [ + 2739.5, + null + ], + "hints": { + "index": 4418 + } + }, + { + "items": [ + 2740, + null + ], + "hints": { + "index": 4419 + } + }, + { + "items": [ + 2740.5, + null + ], + "hints": { + "index": 4420 + } + }, + { + "items": [ + 2741, + null + ], + "hints": { + "index": 4421 + } + }, + { + "items": [ + 2741.5, + null + ], + "hints": { + "index": 4422 + } + }, + { + "items": [ + 2742, + null + ], + "hints": { + "index": 4423 + } + }, + { + "items": [ + 2742.5, + null + ], + "hints": { + "index": 4424 + } + }, + { + "items": [ + 2743, + null + ], + "hints": { + "index": 4425 + } + }, + { + "items": [ + 2743.5, + null + ], + "hints": { + "index": 4426 + } + }, + { + "items": [ + 2744, + null + ], + "hints": { + "index": 4427 + } + }, + { + "items": [ + 2744.5, + null + ], + "hints": { + "index": 4428 + } + }, + { + "items": [ + 2745, + null + ], + "hints": { + "index": 4429 + } + }, + { + "items": [ + 2745.5, + null + ], + "hints": { + "index": 4430 + } + }, + { + "items": [ + 2746, + null + ], + "hints": { + "index": 4431 + } + }, + { + "items": [ + 2746.5, + null + ], + "hints": { + "index": 4432 + } + }, + { + "items": [ + 2747, + null + ], + "hints": { + "index": 4433 + } + }, + { + "items": [ + 2747.5, + null + ], + "hints": { + "index": 4434 + } + }, + { + "items": [ + 2748, + null + ], + "hints": { + "index": 4435 + } + }, + { + "items": [ + 2748.5, + null + ], + "hints": { + "index": 4436 + } + }, + { + "items": [ + 2749, + null + ], + "hints": { + "index": 4437 + } + }, + { + "items": [ + 2749.5, + null + ], + "hints": { + "index": 4438 + } + }, + { + "items": [ + 2750, + null + ], + "hints": { + "index": 4439 + } + }, + { + "items": [ + 2750.5, + null + ], + "hints": { + "index": 4440 + } + }, + { + "items": [ + 2751, + null + ], + "hints": { + "index": 4441 + } + }, + { + "items": [ + 2751.5, + null + ], + "hints": { + "index": 4442 + } + }, + { + "items": [ + 2752, + null + ], + "hints": { + "index": 4443 + } + }, + { + "items": [ + 2752.5, + null + ], + "hints": { + "index": 4444 + } + }, + { + "items": [ + 2753, + null + ], + "hints": { + "index": 4445 + } + }, + { + "items": [ + 2753.5, + null + ], + "hints": { + "index": 4446 + } + }, + { + "items": [ + 2754, + null + ], + "hints": { + "index": 4447 + } + }, + { + "items": [ + 2754.5, + null + ], + "hints": { + "index": 4448 + } + }, + { + "items": [ + 2755, + null + ], + "hints": { + "index": 4449 + } + }, + { + "items": [ + 2755.5, + null + ], + "hints": { + "index": 4450 + } + }, + { + "items": [ + 2756, + null + ], + "hints": { + "index": 4451 + } + }, + { + "items": [ + 2756.5, + null + ], + "hints": { + "index": 4452 + } + }, + { + "items": [ + 2757, + null + ], + "hints": { + "index": 4453 + } + }, + { + "items": [ + 2757.5, + null + ], + "hints": { + "index": 4454 + } + }, + { + "items": [ + 2758, + null + ], + "hints": { + "index": 4455 + } + }, + { + "items": [ + 2758.5, + null + ], + "hints": { + "index": 4456 + } + }, + { + "items": [ + 2759, + null + ], + "hints": { + "index": 4457 + } + }, + { + "items": [ + 2759.5, + null + ], + "hints": { + "index": 4458 + } + }, + { + "items": [ + 2760, + null + ], + "hints": { + "index": 4459 + } + }, + { + "items": [ + 2760.5, + null + ], + "hints": { + "index": 4460 + } + }, + { + "items": [ + 2761, + null + ], + "hints": { + "index": 4461 + } + }, + { + "items": [ + 2761.5, + null + ], + "hints": { + "index": 4462 + } + }, + { + "items": [ + 2762, + null + ], + "hints": { + "index": 4463 + } + }, + { + "items": [ + 2762.5, + null + ], + "hints": { + "index": 4464 + } + }, + { + "items": [ + 2763, + null + ], + "hints": { + "index": 4465 + } + }, + { + "items": [ + 2763.5, + null + ], + "hints": { + "index": 4466 + } + }, + { + "items": [ + 2764, + null + ], + "hints": { + "index": 4467 + } + }, + { + "items": [ + 2764.5, + null + ], + "hints": { + "index": 4468 + } + }, + { + "items": [ + 2765, + null + ], + "hints": { + "index": 4469 + } + }, + { + "items": [ + 2765.5, + null + ], + "hints": { + "index": 4470 + } + }, + { + "items": [ + 2766, + null + ], + "hints": { + "index": 4471 + } + }, + { + "items": [ + 2766.5, + null + ], + "hints": { + "index": 4472 + } + }, + { + "items": [ + 2767, + null + ], + "hints": { + "index": 4473 + } + }, + { + "items": [ + 2767.5, + null + ], + "hints": { + "index": 4474 + } + }, + { + "items": [ + 2768, + null + ], + "hints": { + "index": 4475 + } + }, + { + "items": [ + 2768.5, + null + ], + "hints": { + "index": 4476 + } + }, + { + "items": [ + 2769, + null + ], + "hints": { + "index": 4477 + } + }, + { + "items": [ + 2769.5, + null + ], + "hints": { + "index": 4478 + } + }, + { + "items": [ + 2770, + null + ], + "hints": { + "index": 4479 + } + }, + { + "items": [ + 2770.5, + null + ], + "hints": { + "index": 4480 + } + }, + { + "items": [ + 2771, + null + ], + "hints": { + "index": 4481 + } + }, + { + "items": [ + 2771.5, + null + ], + "hints": { + "index": 4482 + } + }, + { + "items": [ + 2772, + null + ], + "hints": { + "index": 4483 + } + }, + { + "items": [ + 2772.5, + null + ], + "hints": { + "index": 4484 + } + }, + { + "items": [ + 2773, + null + ], + "hints": { + "index": 4485 + } + }, + { + "items": [ + 2773.5, + null + ], + "hints": { + "index": 4486 + } + }, + { + "items": [ + 2774, + null + ], + "hints": { + "index": 4487 + } + }, + { + "items": [ + 2774.5, + null + ], + "hints": { + "index": 4488 + } + }, + { + "items": [ + 2775, + null + ], + "hints": { + "index": 4489 + } + }, + { + "items": [ + 2775.5, + null + ], + "hints": { + "index": 4490 + } + }, + { + "items": [ + 2776, + null + ], + "hints": { + "index": 4491 + } + }, + { + "items": [ + 2776.5, + null + ], + "hints": { + "index": 4492 + } + }, + { + "items": [ + 2777, + null + ], + "hints": { + "index": 4493 + } + }, + { + "items": [ + 2777.5, + null + ], + "hints": { + "index": 4494 + } + }, + { + "items": [ + 2778, + null + ], + "hints": { + "index": 4495 + } + }, + { + "items": [ + 2778.5, + null + ], + "hints": { + "index": 4496 + } + }, + { + "items": [ + 2779, + null + ], + "hints": { + "index": 4497 + } + }, + { + "items": [ + 2779.5, + null + ], + "hints": { + "index": 4498 + } + }, + { + "items": [ + 2780, + null + ], + "hints": { + "index": 4499 + } + }, + { + "items": [ + 2780.5, + null + ], + "hints": { + "index": 4500 + } + }, + { + "items": [ + 2781, + null + ], + "hints": { + "index": 4501 + } + }, + { + "items": [ + 2781.5, + null + ], + "hints": { + "index": 4502 + } + }, + { + "items": [ + 2782, + null + ], + "hints": { + "index": 4503 + } + }, + { + "items": [ + 2782.5, + null + ], + "hints": { + "index": 4504 + } + }, + { + "items": [ + 2783, + null + ], + "hints": { + "index": 4505 + } + }, + { + "items": [ + 2783.5, + null + ], + "hints": { + "index": 4506 + } + }, + { + "items": [ + 2784, + null + ], + "hints": { + "index": 4507 + } + }, + { + "items": [ + 2784.5, + null + ], + "hints": { + "index": 4508 + } + }, + { + "items": [ + 2785, + null + ], + "hints": { + "index": 4509 + } + }, + { + "items": [ + 2785.5, + null + ], + "hints": { + "index": 4510 + } + }, + { + "items": [ + 2786, + null + ], + "hints": { + "index": 4511 + } + }, + { + "items": [ + 2786.5, + null + ], + "hints": { + "index": 4512 + } + }, + { + "items": [ + 2787, + null + ], + "hints": { + "index": 4513 + } + }, + { + "items": [ + 2787.5, + null + ], + "hints": { + "index": 4514 + } + }, + { + "items": [ + 2788, + null + ], + "hints": { + "index": 4515 + } + }, + { + "items": [ + 2788.5, + null + ], + "hints": { + "index": 4516 + } + }, + { + "items": [ + 2789, + null + ], + "hints": { + "index": 4517 + } + }, + { + "items": [ + 2789.5, + null + ], + "hints": { + "index": 4518 + } + }, + { + "items": [ + 2790, + null + ], + "hints": { + "index": 4519 + } + }, + { + "items": [ + 2790.5, + null + ], + "hints": { + "index": 4520 + } + }, + { + "items": [ + 2791, + null + ], + "hints": { + "index": 4521 + } + }, + { + "items": [ + 2791.5, + null + ], + "hints": { + "index": 4522 + } + }, + { + "items": [ + 2792, + null + ], + "hints": { + "index": 4523 + } + }, + { + "items": [ + 2792.5, + null + ], + "hints": { + "index": 4524 + } + }, + { + "items": [ + 2793, + null + ], + "hints": { + "index": 4525 + } + }, + { + "items": [ + 2793.5, + null + ], + "hints": { + "index": 4526 + } + }, + { + "items": [ + 2794, + null + ], + "hints": { + "index": 4527 + } + }, + { + "items": [ + 2794.5, + null + ], + "hints": { + "index": 4528 + } + }, + { + "items": [ + 2795, + null + ], + "hints": { + "index": 4529 + } + }, + { + "items": [ + 2795.5, + null + ], + "hints": { + "index": 4530 + } + }, + { + "items": [ + 2796, + null + ], + "hints": { + "index": 4531 + } + }, + { + "items": [ + 2796.5, + null + ], + "hints": { + "index": 4532 + } + }, + { + "items": [ + 2797, + null + ], + "hints": { + "index": 4533 + } + }, + { + "items": [ + 2797.5, + null + ], + "hints": { + "index": 4534 + } + }, + { + "items": [ + 2798, + null + ], + "hints": { + "index": 4535 + } + }, + { + "items": [ + 2798.5, + null + ], + "hints": { + "index": 4536 + } + }, + { + "items": [ + 2799, + null + ], + "hints": { + "index": 4537 + } + }, + { + "items": [ + 2799.5, + null + ], + "hints": { + "index": 4538 + } + }, + { + "items": [ + 2800, + null + ], + "hints": { + "index": 4539 + } + }, + { + "items": [ + 2800.5, + null + ], + "hints": { + "index": 4540 + } + }, + { + "items": [ + 2801, + null + ], + "hints": { + "index": 4541 + } + }, + { + "items": [ + 2801.5, + null + ], + "hints": { + "index": 4542 + } + }, + { + "items": [ + 2802, + null + ], + "hints": { + "index": 4543 + } + }, + { + "items": [ + 2802.5, + null + ], + "hints": { + "index": 4544 + } + }, + { + "items": [ + 2803, + null + ], + "hints": { + "index": 4545 + } + }, + { + "items": [ + 2803.5, + null + ], + "hints": { + "index": 4546 + } + }, + { + "items": [ + 2804, + null + ], + "hints": { + "index": 4547 + } + }, + { + "items": [ + 2804.5, + null + ], + "hints": { + "index": 4548 + } + }, + { + "items": [ + 2805, + null + ], + "hints": { + "index": 4549 + } + }, + { + "items": [ + 2805.5, + null + ], + "hints": { + "index": 4550 + } + }, + { + "items": [ + 2806, + null + ], + "hints": { + "index": 4551 + } + }, + { + "items": [ + 2806.5, + null + ], + "hints": { + "index": 4552 + } + }, + { + "items": [ + 2807, + null + ], + "hints": { + "index": 4553 + } + }, + { + "items": [ + 2807.5, + null + ], + "hints": { + "index": 4554 + } + }, + { + "items": [ + 2808, + null + ], + "hints": { + "index": 4555 + } + }, + { + "items": [ + 2808.5, + null + ], + "hints": { + "index": 4556 + } + }, + { + "items": [ + 2809, + null + ], + "hints": { + "index": 4557 + } + }, + { + "items": [ + 2809.5, + null + ], + "hints": { + "index": 4558 + } + }, + { + "items": [ + 2810, + null + ], + "hints": { + "index": 4559 + } + }, + { + "items": [ + 2810.5, + null + ], + "hints": { + "index": 4560 + } + }, + { + "items": [ + 2811, + null + ], + "hints": { + "index": 4561 + } + }, + { + "items": [ + 2811.5, + null + ], + "hints": { + "index": 4562 + } + }, + { + "items": [ + 2812, + null + ], + "hints": { + "index": 4563 + } + }, + { + "items": [ + 2812.5, + null + ], + "hints": { + "index": 4564 + } + }, + { + "items": [ + 2813, + null + ], + "hints": { + "index": 4565 + } + }, + { + "items": [ + 2813.5, + null + ], + "hints": { + "index": 4566 + } + }, + { + "items": [ + 2814, + null + ], + "hints": { + "index": 4567 + } + }, + { + "items": [ + 2814.5, + null + ], + "hints": { + "index": 4568 + } + }, + { + "items": [ + 2815, + null + ], + "hints": { + "index": 4569 + } + }, + { + "items": [ + 2815.5, + null + ], + "hints": { + "index": 4570 + } + }, + { + "items": [ + 2816, + null + ], + "hints": { + "index": 4571 + } + }, + { + "items": [ + 2816.5, + null + ], + "hints": { + "index": 4572 + } + }, + { + "items": [ + 2817, + null + ], + "hints": { + "index": 4573 + } + }, + { + "items": [ + 2817.5, + null + ], + "hints": { + "index": 4574 + } + }, + { + "items": [ + 2818, + null + ], + "hints": { + "index": 4575 + } + }, + { + "items": [ + 2818.5, + null + ], + "hints": { + "index": 4576 + } + }, + { + "items": [ + 2819, + null + ], + "hints": { + "index": 4577 + } + }, + { + "items": [ + 2819.5, + null + ], + "hints": { + "index": 4578 + } + }, + { + "items": [ + 2820, + null + ], + "hints": { + "index": 4579 + } + }, + { + "items": [ + 2820.5, + null + ], + "hints": { + "index": 4580 + } + }, + { + "items": [ + 2821, + null + ], + "hints": { + "index": 4581 + } + }, + { + "items": [ + 2821.5, + null + ], + "hints": { + "index": 4582 + } + }, + { + "items": [ + 2822, + null + ], + "hints": { + "index": 4583 + } + }, + { + "items": [ + 2822.5, + null + ], + "hints": { + "index": 4584 + } + }, + { + "items": [ + 2823, + null + ], + "hints": { + "index": 4585 + } + }, + { + "items": [ + 2823.5, + null + ], + "hints": { + "index": 4586 + } + }, + { + "items": [ + 2824, + null + ], + "hints": { + "index": 4587 + } + }, + { + "items": [ + 2824.5, + null + ], + "hints": { + "index": 4588 + } + }, + { + "items": [ + 2825, + null + ], + "hints": { + "index": 4589 + } + }, + { + "items": [ + 2825.5, + null + ], + "hints": { + "index": 4590 + } + }, + { + "items": [ + 2826, + null + ], + "hints": { + "index": 4591 + } + }, + { + "items": [ + 2826.5, + null + ], + "hints": { + "index": 4592 + } + }, + { + "items": [ + 2827, + null + ], + "hints": { + "index": 4593 + } + }, + { + "items": [ + 2827.5, + null + ], + "hints": { + "index": 4594 + } + }, + { + "items": [ + 2828, + null + ], + "hints": { + "index": 4595 + } + }, + { + "items": [ + 2828.5, + null + ], + "hints": { + "index": 4596 + } + }, + { + "items": [ + 2829, + null + ], + "hints": { + "index": 4597 + } + }, + { + "items": [ + 2829.5, + null + ], + "hints": { + "index": 4598 + } + }, + { + "items": [ + 2830, + null + ], + "hints": { + "index": 4599 + } + }, + { + "items": [ + 2830.5, + null + ], + "hints": { + "index": 4600 + } + }, + { + "items": [ + 2831, + null + ], + "hints": { + "index": 4601 + } + }, + { + "items": [ + 2831.5, + null + ], + "hints": { + "index": 4602 + } + }, + { + "items": [ + 2832, + null + ], + "hints": { + "index": 4603 + } + }, + { + "items": [ + 2832.5, + null + ], + "hints": { + "index": 4604 + } + }, + { + "items": [ + 2833, + null + ], + "hints": { + "index": 4605 + } + }, + { + "items": [ + 2833.5, + null + ], + "hints": { + "index": 4606 + } + }, + { + "items": [ + 2834, + null + ], + "hints": { + "index": 4607 + } + }, + { + "items": [ + 2834.5, + null + ], + "hints": { + "index": 4608 + } + }, + { + "items": [ + 2835, + null + ], + "hints": { + "index": 4609 + } + }, + { + "items": [ + 2835.5, + null + ], + "hints": { + "index": 4610 + } + }, + { + "items": [ + 2836, + null + ], + "hints": { + "index": 4611 + } + }, + { + "items": [ + 2836.5, + null + ], + "hints": { + "index": 4612 + } + }, + { + "items": [ + 2837, + null + ], + "hints": { + "index": 4613 + } + }, + { + "items": [ + 2837.5, + null + ], + "hints": { + "index": 4614 + } + }, + { + "items": [ + 2838, + null + ], + "hints": { + "index": 4615 + } + }, + { + "items": [ + 2838.5, + null + ], + "hints": { + "index": 4616 + } + }, + { + "items": [ + 2839, + null + ], + "hints": { + "index": 4617 + } + }, + { + "items": [ + 2839.5, + null + ], + "hints": { + "index": 4618 + } + }, + { + "items": [ + 2840, + null + ], + "hints": { + "index": 4619 + } + }, + { + "items": [ + 2840.5, + null + ], + "hints": { + "index": 4620 + } + }, + { + "items": [ + 2841, + null + ], + "hints": { + "index": 4621 + } + }, + { + "items": [ + 2841.5, + null + ], + "hints": { + "index": 4622 + } + }, + { + "items": [ + 2842, + null + ], + "hints": { + "index": 4623 + } + }, + { + "items": [ + 2842.5, + null + ], + "hints": { + "index": 4624 + } + }, + { + "items": [ + 2843, + null + ], + "hints": { + "index": 4625 + } + }, + { + "items": [ + 2843.5, + null + ], + "hints": { + "index": 4626 + } + }, + { + "items": [ + 2844, + null + ], + "hints": { + "index": 4627 + } + }, + { + "items": [ + 2844.5, + null + ], + "hints": { + "index": 4628 + } + }, + { + "items": [ + 2845, + null + ], + "hints": { + "index": 4629 + } + }, + { + "items": [ + 2845.5, + null + ], + "hints": { + "index": 4630 + } + }, + { + "items": [ + 2846, + null + ], + "hints": { + "index": 4631 + } + }, + { + "items": [ + 2846.5, + null + ], + "hints": { + "index": 4632 + } + }, + { + "items": [ + 2847, + null + ], + "hints": { + "index": 4633 + } + }, + { + "items": [ + 2847.5, + null + ], + "hints": { + "index": 4634 + } + }, + { + "items": [ + 2848, + null + ], + "hints": { + "index": 4635 + } + }, + { + "items": [ + 2848.5, + null + ], + "hints": { + "index": 4636 + } + }, + { + "items": [ + 2849, + null + ], + "hints": { + "index": 4637 + } + }, + { + "items": [ + 2849.5, + null + ], + "hints": { + "index": 4638 + } + }, + { + "items": [ + 2850, + null + ], + "hints": { + "index": 4639 + } + }, + { + "items": [ + 2850.5, + null + ], + "hints": { + "index": 4640 + } + }, + { + "items": [ + 2851, + null + ], + "hints": { + "index": 4641 + } + }, + { + "items": [ + 2851.5, + null + ], + "hints": { + "index": 4642 + } + }, + { + "items": [ + 2852, + null + ], + "hints": { + "index": 4643 + } + }, + { + "items": [ + 2852.5, + null + ], + "hints": { + "index": 4644 + } + }, + { + "items": [ + 2853, + null + ], + "hints": { + "index": 4645 + } + }, + { + "items": [ + 2853.5, + null + ], + "hints": { + "index": 4646 + } + }, + { + "items": [ + 2854, + null + ], + "hints": { + "index": 4647 + } + }, + { + "items": [ + 2854.5, + null + ], + "hints": { + "index": 4648 + } + }, + { + "items": [ + 2855, + null + ], + "hints": { + "index": 4649 + } + }, + { + "items": [ + 2855.5, + null + ], + "hints": { + "index": 4650 + } + }, + { + "items": [ + 2856, + null + ], + "hints": { + "index": 4651 + } + }, + { + "items": [ + 2856.5, + null + ], + "hints": { + "index": 4652 + } + }, + { + "items": [ + 2857, + null + ], + "hints": { + "index": 4653 + } + }, + { + "items": [ + 2857.5, + null + ], + "hints": { + "index": 4654 + } + }, + { + "items": [ + 2858, + null + ], + "hints": { + "index": 4655 + } + }, + { + "items": [ + 2858.5, + null + ], + "hints": { + "index": 4656 + } + }, + { + "items": [ + 2859, + null + ], + "hints": { + "index": 4657 + } + }, + { + "items": [ + 2859.5, + null + ], + "hints": { + "index": 4658 + } + }, + { + "items": [ + 2860, + null + ], + "hints": { + "index": 4659 + } + }, + { + "items": [ + 2860.5, + null + ], + "hints": { + "index": 4660 + } + }, + { + "items": [ + 2861, + null + ], + "hints": { + "index": 4661 + } + }, + { + "items": [ + 2861.5, + null + ], + "hints": { + "index": 4662 + } + }, + { + "items": [ + 2862, + null + ], + "hints": { + "index": 4663 + } + }, + { + "items": [ + 2862.5, + null + ], + "hints": { + "index": 4664 + } + }, + { + "items": [ + 2863, + null + ], + "hints": { + "index": 4665 + } + }, + { + "items": [ + 2863.5, + null + ], + "hints": { + "index": 4666 + } + }, + { + "items": [ + 2864, + null + ], + "hints": { + "index": 4667 + } + }, + { + "items": [ + 2864.5, + null + ], + "hints": { + "index": 4668 + } + }, + { + "items": [ + 2865, + null + ], + "hints": { + "index": 4669 + } + }, + { + "items": [ + 2865.5, + null + ], + "hints": { + "index": 4670 + } + }, + { + "items": [ + 2866, + null + ], + "hints": { + "index": 4671 + } + }, + { + "items": [ + 2866.5, + null + ], + "hints": { + "index": 4672 + } + }, + { + "items": [ + 2867, + null + ], + "hints": { + "index": 4673 + } + }, + { + "items": [ + 2867.5, + null + ], + "hints": { + "index": 4674 + } + }, + { + "items": [ + 2868, + null + ], + "hints": { + "index": 4675 + } + }, + { + "items": [ + 2868.5, + null + ], + "hints": { + "index": 4676 + } + }, + { + "items": [ + 2869, + null + ], + "hints": { + "index": 4677 + } + }, + { + "items": [ + 2869.5, + null + ], + "hints": { + "index": 4678 + } + }, + { + "items": [ + 2870, + null + ], + "hints": { + "index": 4679 + } + }, + { + "items": [ + 2870.5, + null + ], + "hints": { + "index": 4680 + } + }, + { + "items": [ + 2871, + null + ], + "hints": { + "index": 4681 + } + }, + { + "items": [ + 2871.5, + null + ], + "hints": { + "index": 4682 + } + }, + { + "items": [ + 2872, + null + ], + "hints": { + "index": 4683 + } + }, + { + "items": [ + 2872.5, + null + ], + "hints": { + "index": 4684 + } + }, + { + "items": [ + 2873, + null + ], + "hints": { + "index": 4685 + } + }, + { + "items": [ + 2873.5, + null + ], + "hints": { + "index": 4686 + } + }, + { + "items": [ + 2874, + null + ], + "hints": { + "index": 4687 + } + }, + { + "items": [ + 2874.5, + null + ], + "hints": { + "index": 4688 + } + }, + { + "items": [ + 2875, + null + ], + "hints": { + "index": 4689 + } + }, + { + "items": [ + 2875.5, + null + ], + "hints": { + "index": 4690 + } + }, + { + "items": [ + 2876, + null + ], + "hints": { + "index": 4691 + } + }, + { + "items": [ + 2876.5, + null + ], + "hints": { + "index": 4692 + } + }, + { + "items": [ + 2877, + null + ], + "hints": { + "index": 4693 + } + }, + { + "items": [ + 2877.5, + null + ], + "hints": { + "index": 4694 + } + }, + { + "items": [ + 2878, + null + ], + "hints": { + "index": 4695 + } + }, + { + "items": [ + 2878.5, + null + ], + "hints": { + "index": 4696 + } + }, + { + "items": [ + 2879, + null + ], + "hints": { + "index": 4697 + } + }, + { + "items": [ + 2879.5, + null + ], + "hints": { + "index": 4698 + } + }, + { + "items": [ + 2880, + null + ], + "hints": { + "index": 4699 + } + }, + { + "items": [ + 2880.5, + null + ], + "hints": { + "index": 4700 + } + }, + { + "items": [ + 2881, + null + ], + "hints": { + "index": 4701 + } + }, + { + "items": [ + 2881.5, + null + ], + "hints": { + "index": 4702 + } + }, + { + "items": [ + 2882, + null + ], + "hints": { + "index": 4703 + } + }, + { + "items": [ + 2882.5, + null + ], + "hints": { + "index": 4704 + } + }, + { + "items": [ + 2883, + null + ], + "hints": { + "index": 4705 + } + }, + { + "items": [ + 2883.5, + null + ], + "hints": { + "index": 4706 + } + }, + { + "items": [ + 2884, + null + ], + "hints": { + "index": 4707 + } + }, + { + "items": [ + 2884.5, + null + ], + "hints": { + "index": 4708 + } + }, + { + "items": [ + 2885, + null + ], + "hints": { + "index": 4709 + } + }, + { + "items": [ + 2885.5, + null + ], + "hints": { + "index": 4710 + } + }, + { + "items": [ + 2886, + null + ], + "hints": { + "index": 4711 + } + }, + { + "items": [ + 2886.5, + null + ], + "hints": { + "index": 4712 + } + }, + { + "items": [ + 2887, + null + ], + "hints": { + "index": 4713 + } + }, + { + "items": [ + 2887.5, + null + ], + "hints": { + "index": 4714 + } + }, + { + "items": [ + 2888, + null + ], + "hints": { + "index": 4715 + } + }, + { + "items": [ + 2888.5, + null + ], + "hints": { + "index": 4716 + } + }, + { + "items": [ + 2889, + null + ], + "hints": { + "index": 4717 + } + }, + { + "items": [ + 2889.5, + null + ], + "hints": { + "index": 4718 + } + }, + { + "items": [ + 2890, + null + ], + "hints": { + "index": 4719 + } + }, + { + "items": [ + 2890.5, + null + ], + "hints": { + "index": 4720 + } + }, + { + "items": [ + 2891, + null + ], + "hints": { + "index": 4721 + } + }, + { + "items": [ + 2891.5, + null + ], + "hints": { + "index": 4722 + } + }, + { + "items": [ + 2892, + null + ], + "hints": { + "index": 4723 + } + }, + { + "items": [ + 2892.5, + null + ], + "hints": { + "index": 4724 + } + }, + { + "items": [ + 2893, + null + ], + "hints": { + "index": 4725 + } + }, + { + "items": [ + 2893.5, + null + ], + "hints": { + "index": 4726 + } + }, + { + "items": [ + 2894, + null + ], + "hints": { + "index": 4727 + } + }, + { + "items": [ + 2894.5, + null + ], + "hints": { + "index": 4728 + } + }, + { + "items": [ + 2895, + null + ], + "hints": { + "index": 4729 + } + }, + { + "items": [ + 2895.5, + null + ], + "hints": { + "index": 4730 + } + }, + { + "items": [ + 2896, + null + ], + "hints": { + "index": 4731 + } + }, + { + "items": [ + 2896.5, + null + ], + "hints": { + "index": 4732 + } + }, + { + "items": [ + 2897, + null + ], + "hints": { + "index": 4733 + } + }, + { + "items": [ + 2897.5, + null + ], + "hints": { + "index": 4734 + } + }, + { + "items": [ + 2898, + null + ], + "hints": { + "index": 4735 + } + }, + { + "items": [ + 2898.5, + null + ], + "hints": { + "index": 4736 + } + }, + { + "items": [ + 2899, + null + ], + "hints": { + "index": 4737 + } + }, + { + "items": [ + 2899.5, + null + ], + "hints": { + "index": 4738 + } + }, + { + "items": [ + 2900, + null + ], + "hints": { + "index": 4739 + } + }, + { + "items": [ + 2900.5, + null + ], + "hints": { + "index": 4740 + } + }, + { + "items": [ + 2901, + null + ], + "hints": { + "index": 4741 + } + }, + { + "items": [ + 2901.5, + null + ], + "hints": { + "index": 4742 + } + }, + { + "items": [ + 2902, + null + ], + "hints": { + "index": 4743 + } + }, + { + "items": [ + 2902.5, + null + ], + "hints": { + "index": 4744 + } + }, + { + "items": [ + 2903, + null + ], + "hints": { + "index": 4745 + } + }, + { + "items": [ + 2903.5, + null + ], + "hints": { + "index": 4746 + } + }, + { + "items": [ + 2904, + null + ], + "hints": { + "index": 4747 + } + }, + { + "items": [ + 2904.5, + null + ], + "hints": { + "index": 4748 + } + }, + { + "items": [ + 2905, + null + ], + "hints": { + "index": 4749 + } + }, + { + "items": [ + 2905.5, + null + ], + "hints": { + "index": 4750 + } + }, + { + "items": [ + 2906, + null + ], + "hints": { + "index": 4751 + } + }, + { + "items": [ + 2906.5, + null + ], + "hints": { + "index": 4752 + } + }, + { + "items": [ + 2907, + null + ], + "hints": { + "index": 4753 + } + }, + { + "items": [ + 2907.5, + null + ], + "hints": { + "index": 4754 + } + }, + { + "items": [ + 2908, + null + ], + "hints": { + "index": 4755 + } + }, + { + "items": [ + 2908.5, + null + ], + "hints": { + "index": 4756 + } + }, + { + "items": [ + 2909, + null + ], + "hints": { + "index": 4757 + } + }, + { + "items": [ + 2909.5, + null + ], + "hints": { + "index": 4758 + } + }, + { + "items": [ + 2910, + null + ], + "hints": { + "index": 4759 + } + }, + { + "items": [ + 2910.5, + null + ], + "hints": { + "index": 4760 + } + }, + { + "items": [ + 2911, + null + ], + "hints": { + "index": 4761 + } + }, + { + "items": [ + 2911.5, + null + ], + "hints": { + "index": 4762 + } + }, + { + "items": [ + 2912, + null + ], + "hints": { + "index": 4763 + } + }, + { + "items": [ + 2912.5, + null + ], + "hints": { + "index": 4764 + } + }, + { + "items": [ + 2913, + null + ], + "hints": { + "index": 4765 + } + }, + { + "items": [ + 2913.5, + null + ], + "hints": { + "index": 4766 + } + }, + { + "items": [ + 2914, + null + ], + "hints": { + "index": 4767 + } + }, + { + "items": [ + 2914.5, + null + ], + "hints": { + "index": 4768 + } + }, + { + "items": [ + 2915, + null + ], + "hints": { + "index": 4769 + } + }, + { + "items": [ + 2915.5, + null + ], + "hints": { + "index": 4770 + } + }, + { + "items": [ + 2916, + null + ], + "hints": { + "index": 4771 + } + }, + { + "items": [ + 2916.5, + null + ], + "hints": { + "index": 4772 + } + }, + { + "items": [ + 2917, + null + ], + "hints": { + "index": 4773 + } + }, + { + "items": [ + 2917.5, + null + ], + "hints": { + "index": 4774 + } + }, + { + "items": [ + 2918, + null + ], + "hints": { + "index": 4775 + } + }, + { + "items": [ + 2918.5, + null + ], + "hints": { + "index": 4776 + } + }, + { + "items": [ + 2919, + null + ], + "hints": { + "index": 4777 + } + }, + { + "items": [ + 2919.5, + null + ], + "hints": { + "index": 4778 + } + }, + { + "items": [ + 2920, + null + ], + "hints": { + "index": 4779 + } + }, + { + "items": [ + 2920.5, + null + ], + "hints": { + "index": 4780 + } + }, + { + "items": [ + 2921, + null + ], + "hints": { + "index": 4781 + } + }, + { + "items": [ + 2921.5, + null + ], + "hints": { + "index": 4782 + } + }, + { + "items": [ + 2922, + null + ], + "hints": { + "index": 4783 + } + }, + { + "items": [ + 2922.5, + null + ], + "hints": { + "index": 4784 + } + }, + { + "items": [ + 2923, + null + ], + "hints": { + "index": 4785 + } + }, + { + "items": [ + 2923.5, + null + ], + "hints": { + "index": 4786 + } + }, + { + "items": [ + 2924, + null + ], + "hints": { + "index": 4787 + } + }, + { + "items": [ + 2924.5, + null + ], + "hints": { + "index": 4788 + } + }, + { + "items": [ + 2925, + null + ], + "hints": { + "index": 4789 + } + }, + { + "items": [ + 2925.5, + null + ], + "hints": { + "index": 4790 + } + }, + { + "items": [ + 2926, + null + ], + "hints": { + "index": 4791 + } + }, + { + "items": [ + 2926.5, + null + ], + "hints": { + "index": 4792 + } + }, + { + "items": [ + 2927, + null + ], + "hints": { + "index": 4793 + } + }, + { + "items": [ + 2927.5, + null + ], + "hints": { + "index": 4794 + } + }, + { + "items": [ + 2928, + null + ], + "hints": { + "index": 4795 + } + }, + { + "items": [ + 2928.5, + null + ], + "hints": { + "index": 4796 + } + }, + { + "items": [ + 2929, + null + ], + "hints": { + "index": 4797 + } + }, + { + "items": [ + 2929.5, + null + ], + "hints": { + "index": 4798 + } + }, + { + "items": [ + 2930, + null + ], + "hints": { + "index": 4799 + } + }, + { + "items": [ + 2930.5, + null + ], + "hints": { + "index": 4800 + } + }, + { + "items": [ + 2931, + null + ], + "hints": { + "index": 4801 + } + }, + { + "items": [ + 2931.5, + null + ], + "hints": { + "index": 4802 + } + }, + { + "items": [ + 2932, + null + ], + "hints": { + "index": 4803 + } + }, + { + "items": [ + 2932.5, + null + ], + "hints": { + "index": 4804 + } + }, + { + "items": [ + 2933, + null + ], + "hints": { + "index": 4805 + } + }, + { + "items": [ + 2933.5, + null + ], + "hints": { + "index": 4806 + } + }, + { + "items": [ + 2934, + null + ], + "hints": { + "index": 4807 + } + }, + { + "items": [ + 2934.5, + null + ], + "hints": { + "index": 4808 + } + }, + { + "items": [ + 2935, + null + ], + "hints": { + "index": 4809 + } + }, + { + "items": [ + 2935.5, + null + ], + "hints": { + "index": 4810 + } + }, + { + "items": [ + 2936, + null + ], + "hints": { + "index": 4811 + } + }, + { + "items": [ + 2936.5, + null + ], + "hints": { + "index": 4812 + } + }, + { + "items": [ + 2937, + null + ], + "hints": { + "index": 4813 + } + }, + { + "items": [ + 2937.5, + null + ], + "hints": { + "index": 4814 + } + }, + { + "items": [ + 2938, + null + ], + "hints": { + "index": 4815 + } + }, + { + "items": [ + 2938.5, + null + ], + "hints": { + "index": 4816 + } + }, + { + "items": [ + 2939, + null + ], + "hints": { + "index": 4817 + } + }, + { + "items": [ + 2939.5, + null + ], + "hints": { + "index": 4818 + } + }, + { + "items": [ + 2940, + null + ], + "hints": { + "index": 4819 + } + }, + { + "items": [ + 2940.5, + null + ], + "hints": { + "index": 4820 + } + }, + { + "items": [ + 2941, + null + ], + "hints": { + "index": 4821 + } + }, + { + "items": [ + 2941.5, + null + ], + "hints": { + "index": 4822 + } + }, + { + "items": [ + 2942, + null + ], + "hints": { + "index": 4823 + } + }, + { + "items": [ + 2942.5, + null + ], + "hints": { + "index": 4824 + } + }, + { + "items": [ + 2943, + null + ], + "hints": { + "index": 4825 + } + }, + { + "items": [ + 2943.5, + null + ], + "hints": { + "index": 4826 + } + }, + { + "items": [ + 2944, + null + ], + "hints": { + "index": 4827 + } + }, + { + "items": [ + 2944.5, + null + ], + "hints": { + "index": 4828 + } + }, + { + "items": [ + 2945, + null + ], + "hints": { + "index": 4829 + } + }, + { + "items": [ + 2945.5, + null + ], + "hints": { + "index": 4830 + } + }, + { + "items": [ + 2946, + null + ], + "hints": { + "index": 4831 + } + }, + { + "items": [ + 2946.5, + null + ], + "hints": { + "index": 4832 + } + }, + { + "items": [ + 2947, + null + ], + "hints": { + "index": 4833 + } + }, + { + "items": [ + 2947.5, + null + ], + "hints": { + "index": 4834 + } + }, + { + "items": [ + 2948, + null + ], + "hints": { + "index": 4835 + } + }, + { + "items": [ + 2948.5, + null + ], + "hints": { + "index": 4836 + } + }, + { + "items": [ + 2949, + null + ], + "hints": { + "index": 4837 + } + }, + { + "items": [ + 2949.5, + null + ], + "hints": { + "index": 4838 + } + }, + { + "items": [ + 2950, + null + ], + "hints": { + "index": 4839 + } + }, + { + "items": [ + 2950.5, + null + ], + "hints": { + "index": 4840 + } + }, + { + "items": [ + 2951, + null + ], + "hints": { + "index": 4841 + } + }, + { + "items": [ + 2951.5, + null + ], + "hints": { + "index": 4842 + } + }, + { + "items": [ + 2952, + null + ], + "hints": { + "index": 4843 + } + }, + { + "items": [ + 2952.5, + null + ], + "hints": { + "index": 4844 + } + }, + { + "items": [ + 2953, + null + ], + "hints": { + "index": 4845 + } + }, + { + "items": [ + 2953.5, + null + ], + "hints": { + "index": 4846 + } + }, + { + "items": [ + 2954, + null + ], + "hints": { + "index": 4847 + } + }, + { + "items": [ + 2954.5, + null + ], + "hints": { + "index": 4848 + } + }, + { + "items": [ + 2955, + null + ], + "hints": { + "index": 4849 + } + }, + { + "items": [ + 2955.5, + null + ], + "hints": { + "index": 4850 + } + }, + { + "items": [ + 2956, + null + ], + "hints": { + "index": 4851 + } + }, + { + "items": [ + 2956.5, + null + ], + "hints": { + "index": 4852 + } + }, + { + "items": [ + 2957, + null + ], + "hints": { + "index": 4853 + } + }, + { + "items": [ + 2957.5, + null + ], + "hints": { + "index": 4854 + } + }, + { + "items": [ + 2958, + null + ], + "hints": { + "index": 4855 + } + }, + { + "items": [ + 2958.5, + null + ], + "hints": { + "index": 4856 + } + }, + { + "items": [ + 2959, + null + ], + "hints": { + "index": 4857 + } + }, + { + "items": [ + 2959.5, + null + ], + "hints": { + "index": 4858 + } + }, + { + "items": [ + 2960, + null + ], + "hints": { + "index": 4859 + } + }, + { + "items": [ + 2960.5, + null + ], + "hints": { + "index": 4860 + } + }, + { + "items": [ + 2961, + null + ], + "hints": { + "index": 4861 + } + }, + { + "items": [ + 2961.5, + null + ], + "hints": { + "index": 4862 + } + }, + { + "items": [ + 2962, + null + ], + "hints": { + "index": 4863 + } + }, + { + "items": [ + 2962.5, + null + ], + "hints": { + "index": 4864 + } + }, + { + "items": [ + 2963, + null + ], + "hints": { + "index": 4865 + } + }, + { + "items": [ + 2963.5, + null + ], + "hints": { + "index": 4866 + } + }, + { + "items": [ + 2964, + null + ], + "hints": { + "index": 4867 + } + }, + { + "items": [ + 2964.5, + null + ], + "hints": { + "index": 4868 + } + }, + { + "items": [ + 2965, + null + ], + "hints": { + "index": 4869 + } + }, + { + "items": [ + 2965.5, + null + ], + "hints": { + "index": 4870 + } + }, + { + "items": [ + 2966, + null + ], + "hints": { + "index": 4871 + } + }, + { + "items": [ + 2966.5, + null + ], + "hints": { + "index": 4872 + } + }, + { + "items": [ + 2967, + null + ], + "hints": { + "index": 4873 + } + }, + { + "items": [ + 2967.5, + null + ], + "hints": { + "index": 4874 + } + }, + { + "items": [ + 2968, + null + ], + "hints": { + "index": 4875 + } + }, + { + "items": [ + 2968.5, + null + ], + "hints": { + "index": 4876 + } + }, + { + "items": [ + 2969, + null + ], + "hints": { + "index": 4877 + } + }, + { + "items": [ + 2969.5, + null + ], + "hints": { + "index": 4878 + } + }, + { + "items": [ + 2970, + null + ], + "hints": { + "index": 4879 + } + }, + { + "items": [ + 2970.5, + null + ], + "hints": { + "index": 4880 + } + }, + { + "items": [ + 2971, + null + ], + "hints": { + "index": 4881 + } + }, + { + "items": [ + 2971.5, + null + ], + "hints": { + "index": 4882 + } + }, + { + "items": [ + 2972, + null + ], + "hints": { + "index": 4883 + } + }, + { + "items": [ + 2972.5, + null + ], + "hints": { + "index": 4884 + } + }, + { + "items": [ + 2973, + null + ], + "hints": { + "index": 4885 + } + }, + { + "items": [ + 2973.5, + null + ], + "hints": { + "index": 4886 + } + }, + { + "items": [ + 2974, + null + ], + "hints": { + "index": 4887 + } + }, + { + "items": [ + 2974.5, + null + ], + "hints": { + "index": 4888 + } + }, + { + "items": [ + 2975, + null + ], + "hints": { + "index": 4889 + } + }, + { + "items": [ + 2975.5, + null + ], + "hints": { + "index": 4890 + } + }, + { + "items": [ + 2976, + null + ], + "hints": { + "index": 4891 + } + }, + { + "items": [ + 2976.5, + null + ], + "hints": { + "index": 4892 + } + }, + { + "items": [ + 2977, + null + ], + "hints": { + "index": 4893 + } + }, + { + "items": [ + 2977.5, + null + ], + "hints": { + "index": 4894 + } + }, + { + "items": [ + 2978, + null + ], + "hints": { + "index": 4895 + } + }, + { + "items": [ + 2978.5, + null + ], + "hints": { + "index": 4896 + } + }, + { + "items": [ + 2979, + null + ], + "hints": { + "index": 4897 + } + }, + { + "items": [ + 2979.5, + null + ], + "hints": { + "index": 4898 + } + }, + { + "items": [ + 2980, + null + ], + "hints": { + "index": 4899 + } + }, + { + "items": [ + 2980.5, + null + ], + "hints": { + "index": 4900 + } + }, + { + "items": [ + 2981, + null + ], + "hints": { + "index": 4901 + } + }, + { + "items": [ + 2981.5, + null + ], + "hints": { + "index": 4902 + } + }, + { + "items": [ + 2982, + null + ], + "hints": { + "index": 4903 + } + }, + { + "items": [ + 2982.5, + null + ], + "hints": { + "index": 4904 + } + }, + { + "items": [ + 2983, + null + ], + "hints": { + "index": 4905 + } + }, + { + "items": [ + 2983.5, + null + ], + "hints": { + "index": 4906 + } + }, + { + "items": [ + 2984, + null + ], + "hints": { + "index": 4907 + } + }, + { + "items": [ + 2984.5, + null + ], + "hints": { + "index": 4908 + } + }, + { + "items": [ + 2985, + null + ], + "hints": { + "index": 4909 + } + }, + { + "items": [ + 2985.5, + null + ], + "hints": { + "index": 4910 + } + }, + { + "items": [ + 2986, + null + ], + "hints": { + "index": 4911 + } + }, + { + "items": [ + 2986.5, + null + ], + "hints": { + "index": 4912 + } + }, + { + "items": [ + 2987, + null + ], + "hints": { + "index": 4913 + } + }, + { + "items": [ + 2987.5, + null + ], + "hints": { + "index": 4914 + } + }, + { + "items": [ + 2988, + null + ], + "hints": { + "index": 4915 + } + }, + { + "items": [ + 2988.5, + null + ], + "hints": { + "index": 4916 + } + }, + { + "items": [ + 2989, + null + ], + "hints": { + "index": 4917 + } + }, + { + "items": [ + 2989.5, + null + ], + "hints": { + "index": 4918 + } + }, + { + "items": [ + 2990, + null + ], + "hints": { + "index": 4919 + } + }, + { + "items": [ + 2990.5, + null + ], + "hints": { + "index": 4920 + } + }, + { + "items": [ + 2991, + null + ], + "hints": { + "index": 4921 + } + }, + { + "items": [ + 2991.5, + null + ], + "hints": { + "index": 4922 + } + }, + { + "items": [ + 2992, + null + ], + "hints": { + "index": 4923 + } + }, + { + "items": [ + 2992.5, + null + ], + "hints": { + "index": 4924 + } + }, + { + "items": [ + 2993, + null + ], + "hints": { + "index": 4925 + } + }, + { + "items": [ + 2993.5, + null + ], + "hints": { + "index": 4926 + } + }, + { + "items": [ + 2994, + null + ], + "hints": { + "index": 4927 + } + }, + { + "items": [ + 2994.5, + null + ], + "hints": { + "index": 4928 + } + }, + { + "items": [ + 2995, + null + ], + "hints": { + "index": 4929 + } + }, + { + "items": [ + 2995.5, + null + ], + "hints": { + "index": 4930 + } + }, + { + "items": [ + 2996, + null + ], + "hints": { + "index": 4931 + } + }, + { + "items": [ + 2996.5, + null + ], + "hints": { + "index": 4932 + } + }, + { + "items": [ + 2997, + null + ], + "hints": { + "index": 4933 + } + }, + { + "items": [ + 2997.5, + null + ], + "hints": { + "index": 4934 + } + }, + { + "items": [ + 2998, + null + ], + "hints": { + "index": 4935 + } + }, + { + "items": [ + 2998.5, + null + ], + "hints": { + "index": 4936 + } + }, + { + "items": [ + 2999, + null + ], + "hints": { + "index": 4937 + } + }, + { + "items": [ + 2999.5, + null + ], + "hints": { + "index": 4938 + } + }, + { + "items": [ + 3000, + null + ], + "hints": { + "index": 4939 + } + }, + { + "items": [ + 3000.5, + null + ], + "hints": { + "index": 4940 + } + }, + { + "items": [ + 3001, + null + ], + "hints": { + "index": 4941 + } + }, + { + "items": [ + 3001.5, + null + ], + "hints": { + "index": 4942 + } + }, + { + "items": [ + 3002, + null + ], + "hints": { + "index": 4943 + } + }, + { + "items": [ + 3002.5, + null + ], + "hints": { + "index": 4944 + } + }, + { + "items": [ + 3003, + null + ], + "hints": { + "index": 4945 + } + }, + { + "items": [ + 3003.5, + null + ], + "hints": { + "index": 4946 + } + }, + { + "items": [ + 3004, + null + ], + "hints": { + "index": 4947 + } + }, + { + "items": [ + 3004.5, + null + ], + "hints": { + "index": 4948 + } + }, + { + "items": [ + 3005, + null + ], + "hints": { + "index": 4949 + } + }, + { + "items": [ + 3005.5, + null + ], + "hints": { + "index": 4950 + } + }, + { + "items": [ + 3006, + null + ], + "hints": { + "index": 4951 + } + }, + { + "items": [ + 3006.5, + null + ], + "hints": { + "index": 4952 + } + }, + { + "items": [ + 3007, + null + ], + "hints": { + "index": 4953 + } + }, + { + "items": [ + 3007.5, + null + ], + "hints": { + "index": 4954 + } + }, + { + "items": [ + 3008, + null + ], + "hints": { + "index": 4955 + } + }, + { + "items": [ + 3008.5, + null + ], + "hints": { + "index": 4956 + } + }, + { + "items": [ + 3009, + null + ], + "hints": { + "index": 4957 + } + }, + { + "items": [ + 3009.5, + null + ], + "hints": { + "index": 4958 + } + }, + { + "items": [ + 3010, + null + ], + "hints": { + "index": 4959 + } + }, + { + "items": [ + 3010.5, + null + ], + "hints": { + "index": 4960 + } + }, + { + "items": [ + 3011, + null + ], + "hints": { + "index": 4961 + } + }, + { + "items": [ + 3011.5, + null + ], + "hints": { + "index": 4962 + } + }, + { + "items": [ + 3012, + null + ], + "hints": { + "index": 4963 + } + }, + { + "items": [ + 3012.5, + null + ], + "hints": { + "index": 4964 + } + }, + { + "items": [ + 3013, + null + ], + "hints": { + "index": 4965 + } + }, + { + "items": [ + 3013.5, + null + ], + "hints": { + "index": 4966 + } + }, + { + "items": [ + 3014, + null + ], + "hints": { + "index": 4967 + } + }, + { + "items": [ + 3014.5, + null + ], + "hints": { + "index": 4968 + } + }, + { + "items": [ + 3015, + null + ], + "hints": { + "index": 4969 + } + }, + { + "items": [ + 3015.5, + null + ], + "hints": { + "index": 4970 + } + }, + { + "items": [ + 3016, + null + ], + "hints": { + "index": 4971 + } + }, + { + "items": [ + 3016.5, + null + ], + "hints": { + "index": 4972 + } + }, + { + "items": [ + 3017, + null + ], + "hints": { + "index": 4973 + } + }, + { + "items": [ + 3017.5, + null + ], + "hints": { + "index": 4974 + } + }, + { + "items": [ + 3018, + null + ], + "hints": { + "index": 4975 + } + }, + { + "items": [ + 3018.5, + null + ], + "hints": { + "index": 4976 + } + }, + { + "items": [ + 3019, + null + ], + "hints": { + "index": 4977 + } + }, + { + "items": [ + 3019.5, + null + ], + "hints": { + "index": 4978 + } + }, + { + "items": [ + 3020, + null + ], + "hints": { + "index": 4979 + } + }, + { + "items": [ + 3020.5, + null + ], + "hints": { + "index": 4980 + } + }, + { + "items": [ + 3021, + null + ], + "hints": { + "index": 4981 + } + }, + { + "items": [ + 3021.5, + null + ], + "hints": { + "index": 4982 + } + }, + { + "items": [ + 3022, + null + ], + "hints": { + "index": 4983 + } + }, + { + "items": [ + 3022.5, + null + ], + "hints": { + "index": 4984 + } + }, + { + "items": [ + 3023, + null + ], + "hints": { + "index": 4985 + } + }, + { + "items": [ + 3023.5, + null + ], + "hints": { + "index": 4986 + } + }, + { + "items": [ + 3024, + null + ], + "hints": { + "index": 4987 + } + }, + { + "items": [ + 3024.5, + null + ], + "hints": { + "index": 4988 + } + }, + { + "items": [ + 3025, + null + ], + "hints": { + "index": 4989 + } + }, + { + "items": [ + 3025.5, + null + ], + "hints": { + "index": 4990 + } + }, + { + "items": [ + 3026, + null + ], + "hints": { + "index": 4991 + } + }, + { + "items": [ + 3026.5, + null + ], + "hints": { + "index": 4992 + } + }, + { + "items": [ + 3027, + null + ], + "hints": { + "index": 4993 + } + }, + { + "items": [ + 3027.5, + null + ], + "hints": { + "index": 4994 + } + }, + { + "items": [ + 3028, + null + ], + "hints": { + "index": 4995 + } + }, + { + "items": [ + 3028.5, + null + ], + "hints": { + "index": 4996 + } + }, + { + "items": [ + 3029, + null + ], + "hints": { + "index": 4997 + } + }, + { + "items": [ + 3029.5, + null + ], + "hints": { + "index": 4998 + } + }, + { + "items": [ + 3030, + null + ], + "hints": { + "index": 4999 + } + }, + { + "items": [ + 3030.5, + null + ], + "hints": { + "index": 5000 + } + }, + { + "items": [ + 3031, + null + ], + "hints": { + "index": 5001 + } + }, + { + "items": [ + 3031.5, + null + ], + "hints": { + "index": 5002 + } + }, + { + "items": [ + 3032, + null + ], + "hints": { + "index": 5003 + } + }, + { + "items": [ + 3032.5, + null + ], + "hints": { + "index": 5004 + } + }, + { + "items": [ + 3033, + null + ], + "hints": { + "index": 5005 + } + }, + { + "items": [ + 3033.5, + null + ], + "hints": { + "index": 5006 + } + }, + { + "items": [ + 3034, + null + ], + "hints": { + "index": 5007 + } + }, + { + "items": [ + 3034.5, + null + ], + "hints": { + "index": 5008 + } + }, + { + "items": [ + 3035, + null + ], + "hints": { + "index": 5009 + } + }, + { + "items": [ + 3035.5, + null + ], + "hints": { + "index": 5010 + } + }, + { + "items": [ + 3036, + null + ], + "hints": { + "index": 5011 + } + }, + { + "items": [ + 3036.5, + null + ], + "hints": { + "index": 5012 + } + }, + { + "items": [ + 3037, + null + ], + "hints": { + "index": 5013 + } + }, + { + "items": [ + 3037.5, + null + ], + "hints": { + "index": 5014 + } + }, + { + "items": [ + 3038, + null + ], + "hints": { + "index": 5015 + } + }, + { + "items": [ + 3038.5, + null + ], + "hints": { + "index": 5016 + } + }, + { + "items": [ + 3039, + null + ], + "hints": { + "index": 5017 + } + }, + { + "items": [ + 3039.5, + null + ], + "hints": { + "index": 5018 + } + }, + { + "items": [ + 3040, + null + ], + "hints": { + "index": 5019 + } + }, + { + "items": [ + 3040.5, + null + ], + "hints": { + "index": 5020 + } + }, + { + "items": [ + 3041, + null + ], + "hints": { + "index": 5021 + } + }, + { + "items": [ + 3041.5, + null + ], + "hints": { + "index": 5022 + } + }, + { + "items": [ + 3042, + null + ], + "hints": { + "index": 5023 + } + }, + { + "items": [ + 3042.5, + null + ], + "hints": { + "index": 5024 + } + }, + { + "items": [ + 3043, + null + ], + "hints": { + "index": 5025 + } + }, + { + "items": [ + 3043.5, + null + ], + "hints": { + "index": 5026 + } + }, + { + "items": [ + 3044, + null + ], + "hints": { + "index": 5027 + } + }, + { + "items": [ + 3044.5, + null + ], + "hints": { + "index": 5028 + } + }, + { + "items": [ + 3045, + null + ], + "hints": { + "index": 5029 + } + }, + { + "items": [ + 3045.5, + null + ], + "hints": { + "index": 5030 + } + }, + { + "items": [ + 3046, + null + ], + "hints": { + "index": 5031 + } + }, + { + "items": [ + 3046.5, + null + ], + "hints": { + "index": 5032 + } + }, + { + "items": [ + 3047, + null + ], + "hints": { + "index": 5033 + } + }, + { + "items": [ + 3047.5, + null + ], + "hints": { + "index": 5034 + } + }, + { + "items": [ + 3048, + null + ], + "hints": { + "index": 5035 + } + }, + { + "items": [ + 3048.5, + null + ], + "hints": { + "index": 5036 + } + }, + { + "items": [ + 3049, + null + ], + "hints": { + "index": 5037 + } + }, + { + "items": [ + 3049.5, + null + ], + "hints": { + "index": 5038 + } + }, + { + "items": [ + 3050, + null + ], + "hints": { + "index": 5039 + } + }, + { + "items": [ + 3050.5, + null + ], + "hints": { + "index": 5040 + } + }, + { + "items": [ + 3051, + null + ], + "hints": { + "index": 5041 + } + }, + { + "items": [ + 3051.5, + null + ], + "hints": { + "index": 5042 + } + }, + { + "items": [ + 3052, + null + ], + "hints": { + "index": 5043 + } + }, + { + "items": [ + 3052.5, + null + ], + "hints": { + "index": 5044 + } + }, + { + "items": [ + 3053, + null + ], + "hints": { + "index": 5045 + } + }, + { + "items": [ + 3053.5, + null + ], + "hints": { + "index": 5046 + } + }, + { + "items": [ + 3054, + null + ], + "hints": { + "index": 5047 + } + }, + { + "items": [ + 3054.5, + null + ], + "hints": { + "index": 5048 + } + }, + { + "items": [ + 3055, + null + ], + "hints": { + "index": 5049 + } + }, + { + "items": [ + 3055.5, + null + ], + "hints": { + "index": 5050 + } + }, + { + "items": [ + 3056, + null + ], + "hints": { + "index": 5051 + } + }, + { + "items": [ + 3056.5, + null + ], + "hints": { + "index": 5052 + } + }, + { + "items": [ + 3057, + null + ], + "hints": { + "index": 5053 + } + }, + { + "items": [ + 3057.5, + null + ], + "hints": { + "index": 5054 + } + }, + { + "items": [ + 3058, + null + ], + "hints": { + "index": 5055 + } + }, + { + "items": [ + 3058.5, + null + ], + "hints": { + "index": 5056 + } + }, + { + "items": [ + 3059, + null + ], + "hints": { + "index": 5057 + } + }, + { + "items": [ + 3059.5, + null + ], + "hints": { + "index": 5058 + } + }, + { + "items": [ + 3060, + null + ], + "hints": { + "index": 5059 + } + }, + { + "items": [ + 3060.5, + null + ], + "hints": { + "index": 5060 + } + }, + { + "items": [ + 3061, + null + ], + "hints": { + "index": 5061 + } + }, + { + "items": [ + 3061.5, + null + ], + "hints": { + "index": 5062 + } + }, + { + "items": [ + 3062, + null + ], + "hints": { + "index": 5063 + } + }, + { + "items": [ + 3062.5, + null + ], + "hints": { + "index": 5064 + } + }, + { + "items": [ + 3063, + null + ], + "hints": { + "index": 5065 + } + }, + { + "items": [ + 3063.5, + null + ], + "hints": { + "index": 5066 + } + }, + { + "items": [ + 3064, + null + ], + "hints": { + "index": 5067 + } + }, + { + "items": [ + 3064.5, + null + ], + "hints": { + "index": 5068 + } + }, + { + "items": [ + 3065, + null + ], + "hints": { + "index": 5069 + } + }, + { + "items": [ + 3065.5, + null + ], + "hints": { + "index": 5070 + } + }, + { + "items": [ + 3066, + null + ], + "hints": { + "index": 5071 + } + }, + { + "items": [ + 3066.5, + null + ], + "hints": { + "index": 5072 + } + }, + { + "items": [ + 3067, + null + ], + "hints": { + "index": 5073 + } + }, + { + "items": [ + 3067.5, + null + ], + "hints": { + "index": 5074 + } + }, + { + "items": [ + 3068, + null + ], + "hints": { + "index": 5075 + } + }, + { + "items": [ + 3068.5, + null + ], + "hints": { + "index": 5076 + } + }, + { + "items": [ + 3069, + null + ], + "hints": { + "index": 5077 + } + }, + { + "items": [ + 3069.5, + null + ], + "hints": { + "index": 5078 + } + }, + { + "items": [ + 3070, + null + ], + "hints": { + "index": 5079 + } + }, + { + "items": [ + 3070.5, + null + ], + "hints": { + "index": 5080 + } + }, + { + "items": [ + 3071, + null + ], + "hints": { + "index": 5081 + } + }, + { + "items": [ + 3071.5, + null + ], + "hints": { + "index": 5082 + } + }, + { + "items": [ + 3072, + null + ], + "hints": { + "index": 5083 + } + }, + { + "items": [ + 3072.5, + null + ], + "hints": { + "index": 5084 + } + }, + { + "items": [ + 3073, + null + ], + "hints": { + "index": 5085 + } + }, + { + "items": [ + 3073.5, + null + ], + "hints": { + "index": 5086 + } + }, + { + "items": [ + 3074, + null + ], + "hints": { + "index": 5087 + } + }, + { + "items": [ + 3074.5, + null + ], + "hints": { + "index": 5088 + } + }, + { + "items": [ + 3075, + null + ], + "hints": { + "index": 5089 + } + }, + { + "items": [ + 3075.5, + null + ], + "hints": { + "index": 5090 + } + }, + { + "items": [ + 3076, + null + ], + "hints": { + "index": 5091 + } + }, + { + "items": [ + 3076.5, + null + ], + "hints": { + "index": 5092 + } + }, + { + "items": [ + 3077, + null + ], + "hints": { + "index": 5093 + } + }, + { + "items": [ + 3077.5, + null + ], + "hints": { + "index": 5094 + } + }, + { + "items": [ + 3078, + null + ], + "hints": { + "index": 5095 + } + }, + { + "items": [ + 3078.5, + null + ], + "hints": { + "index": 5096 + } + }, + { + "items": [ + 3079, + null + ], + "hints": { + "index": 5097 + } + }, + { + "items": [ + 3079.5, + null + ], + "hints": { + "index": 5098 + } + }, + { + "items": [ + 3080, + null + ], + "hints": { + "index": 5099 + } + }, + { + "items": [ + 3080.5, + null + ], + "hints": { + "index": 5100 + } + }, + { + "items": [ + 3081, + null + ], + "hints": { + "index": 5101 + } + }, + { + "items": [ + 3081.5, + null + ], + "hints": { + "index": 5102 + } + }, + { + "items": [ + 3082, + null + ], + "hints": { + "index": 5103 + } + }, + { + "items": [ + 3082.5, + null + ], + "hints": { + "index": 5104 + } + }, + { + "items": [ + 3083, + null + ], + "hints": { + "index": 5105 + } + }, + { + "items": [ + 3083.5, + null + ], + "hints": { + "index": 5106 + } + }, + { + "items": [ + 3084, + null + ], + "hints": { + "index": 5107 + } + }, + { + "items": [ + 3084.5, + null + ], + "hints": { + "index": 5108 + } + }, + { + "items": [ + 3085, + null + ], + "hints": { + "index": 5109 + } + }, + { + "items": [ + 3085.5, + null + ], + "hints": { + "index": 5110 + } + }, + { + "items": [ + 3086, + null + ], + "hints": { + "index": 5111 + } + }, + { + "items": [ + 3086.5, + null + ], + "hints": { + "index": 5112 + } + }, + { + "items": [ + 3087, + null + ], + "hints": { + "index": 5113 + } + }, + { + "items": [ + 3087.5, + null + ], + "hints": { + "index": 5114 + } + }, + { + "items": [ + 3088, + null + ], + "hints": { + "index": 5115 + } + }, + { + "items": [ + 3088.5, + null + ], + "hints": { + "index": 5116 + } + }, + { + "items": [ + 3089, + null + ], + "hints": { + "index": 5117 + } + }, + { + "items": [ + 3089.5, + null + ], + "hints": { + "index": 5118 + } + }, + { + "items": [ + 3090, + null + ], + "hints": { + "index": 5119 + } + }, + { + "items": [ + 3090.5, + null + ], + "hints": { + "index": 5120 + } + }, + { + "items": [ + 3091, + null + ], + "hints": { + "index": 5121 + } + }, + { + "items": [ + 3091.5, + null + ], + "hints": { + "index": 5122 + } + }, + { + "items": [ + 3092, + null + ], + "hints": { + "index": 5123 + } + }, + { + "items": [ + 3092.5, + null + ], + "hints": { + "index": 5124 + } + }, + { + "items": [ + 3093, + null + ], + "hints": { + "index": 5125 + } + }, + { + "items": [ + 3093.5, + null + ], + "hints": { + "index": 5126 + } + }, + { + "items": [ + 3094, + null + ], + "hints": { + "index": 5127 + } + }, + { + "items": [ + 3094.5, + null + ], + "hints": { + "index": 5128 + } + }, + { + "items": [ + 3095, + null + ], + "hints": { + "index": 5129 + } + }, + { + "items": [ + 3095.5, + null + ], + "hints": { + "index": 5130 + } + }, + { + "items": [ + 3096, + null + ], + "hints": { + "index": 5131 + } + }, + { + "items": [ + 3096.5, + null + ], + "hints": { + "index": 5132 + } + }, + { + "items": [ + 3097, + null + ], + "hints": { + "index": 5133 + } + }, + { + "items": [ + 3097.5, + null + ], + "hints": { + "index": 5134 + } + }, + { + "items": [ + 3098, + null + ], + "hints": { + "index": 5135 + } + }, + { + "items": [ + 3098.5, + null + ], + "hints": { + "index": 5136 + } + }, + { + "items": [ + 3099, + null + ], + "hints": { + "index": 5137 + } + }, + { + "items": [ + 3099.5, + null + ], + "hints": { + "index": 5138 + } + }, + { + "items": [ + 3100, + null + ], + "hints": { + "index": 5139 + } + }, + { + "items": [ + 3100.5, + null + ], + "hints": { + "index": 5140 + } + }, + { + "items": [ + 3101, + null + ], + "hints": { + "index": 5141 + } + }, + { + "items": [ + 3101.5, + null + ], + "hints": { + "index": 5142 + } + }, + { + "items": [ + 3102, + null + ], + "hints": { + "index": 5143 + } + }, + { + "items": [ + 3102.5, + null + ], + "hints": { + "index": 5144 + } + }, + { + "items": [ + 3103, + null + ], + "hints": { + "index": 5145 + } + }, + { + "items": [ + 3103.5, + null + ], + "hints": { + "index": 5146 + } + }, + { + "items": [ + 3104, + null + ], + "hints": { + "index": 5147 + } + }, + { + "items": [ + 3104.5, + null + ], + "hints": { + "index": 5148 + } + }, + { + "items": [ + 3105, + null + ], + "hints": { + "index": 5149 + } + }, + { + "items": [ + 3105.5, + null + ], + "hints": { + "index": 5150 + } + }, + { + "items": [ + 3106, + null + ], + "hints": { + "index": 5151 + } + }, + { + "items": [ + 3106.5, + null + ], + "hints": { + "index": 5152 + } + }, + { + "items": [ + 3107, + null + ], + "hints": { + "index": 5153 + } + }, + { + "items": [ + 3107.5, + null + ], + "hints": { + "index": 5154 + } + }, + { + "items": [ + 3108, + null + ], + "hints": { + "index": 5155 + } + }, + { + "items": [ + 3108.5, + null + ], + "hints": { + "index": 5156 + } + }, + { + "items": [ + 3109, + null + ], + "hints": { + "index": 5157 + } + }, + { + "items": [ + 3109.5, + null + ], + "hints": { + "index": 5158 + } + }, + { + "items": [ + 3110, + null + ], + "hints": { + "index": 5159 + } + }, + { + "items": [ + 3110.5, + null + ], + "hints": { + "index": 5160 + } + }, + { + "items": [ + 3111, + null + ], + "hints": { + "index": 5161 + } + }, + { + "items": [ + 3111.5, + null + ], + "hints": { + "index": 5162 + } + }, + { + "items": [ + 3112, + null + ], + "hints": { + "index": 5163 + } + }, + { + "items": [ + 3112.5, + null + ], + "hints": { + "index": 5164 + } + }, + { + "items": [ + 3113, + null + ], + "hints": { + "index": 5165 + } + }, + { + "items": [ + 3113.5, + null + ], + "hints": { + "index": 5166 + } + }, + { + "items": [ + 3114, + null + ], + "hints": { + "index": 5167 + } + }, + { + "items": [ + 3114.5, + null + ], + "hints": { + "index": 5168 + } + }, + { + "items": [ + 3115, + null + ], + "hints": { + "index": 5169 + } + }, + { + "items": [ + 3115.5, + null + ], + "hints": { + "index": 5170 + } + }, + { + "items": [ + 3116, + null + ], + "hints": { + "index": 5171 + } + }, + { + "items": [ + 3116.5, + null + ], + "hints": { + "index": 5172 + } + }, + { + "items": [ + 3117, + null + ], + "hints": { + "index": 5173 + } + }, + { + "items": [ + 3117.5, + null + ], + "hints": { + "index": 5174 + } + }, + { + "items": [ + 3118, + null + ], + "hints": { + "index": 5175 + } + }, + { + "items": [ + 3118.5, + null + ], + "hints": { + "index": 5176 + } + }, + { + "items": [ + 3119, + null + ], + "hints": { + "index": 5177 + } + }, + { + "items": [ + 3119.5, + null + ], + "hints": { + "index": 5178 + } + }, + { + "items": [ + 3120, + null + ], + "hints": { + "index": 5179 + } + }, + { + "items": [ + 3120.5, + null + ], + "hints": { + "index": 5180 + } + }, + { + "items": [ + 3121, + null + ], + "hints": { + "index": 5181 + } + }, + { + "items": [ + 3121.5, + null + ], + "hints": { + "index": 5182 + } + }, + { + "items": [ + 3122, + null + ], + "hints": { + "index": 5183 + } + }, + { + "items": [ + 3122.5, + null + ], + "hints": { + "index": 5184 + } + }, + { + "items": [ + 3123, + null + ], + "hints": { + "index": 5185 + } + }, + { + "items": [ + 3123.5, + null + ], + "hints": { + "index": 5186 + } + }, + { + "items": [ + 3124, + null + ], + "hints": { + "index": 5187 + } + }, + { + "items": [ + 3124.5, + null + ], + "hints": { + "index": 5188 + } + }, + { + "items": [ + 3125, + null + ], + "hints": { + "index": 5189 + } + }, + { + "items": [ + 3125.5, + null + ], + "hints": { + "index": 5190 + } + }, + { + "items": [ + 3126, + null + ], + "hints": { + "index": 5191 + } + }, + { + "items": [ + 3126.5, + null + ], + "hints": { + "index": 5192 + } + }, + { + "items": [ + 3127, + null + ], + "hints": { + "index": 5193 + } + }, + { + "items": [ + 3127.5, + null + ], + "hints": { + "index": 5194 + } + }, + { + "items": [ + 3128, + null + ], + "hints": { + "index": 5195 + } + }, + { + "items": [ + 3128.5, + null + ], + "hints": { + "index": 5196 + } + }, + { + "items": [ + 3129, + null + ], + "hints": { + "index": 5197 + } + }, + { + "items": [ + 3129.5, + null + ], + "hints": { + "index": 5198 + } + }, + { + "items": [ + 3130, + null + ], + "hints": { + "index": 5199 + } + }, + { + "items": [ + 3130.5, + null + ], + "hints": { + "index": 5200 + } + }, + { + "items": [ + 3131, + null + ], + "hints": { + "index": 5201 + } + }, + { + "items": [ + 3131.5, + null + ], + "hints": { + "index": 5202 + } + }, + { + "items": [ + 3132, + null + ], + "hints": { + "index": 5203 + } + }, + { + "items": [ + 3132.5, + null + ], + "hints": { + "index": 5204 + } + }, + { + "items": [ + 3133, + null + ], + "hints": { + "index": 5205 + } + }, + { + "items": [ + 3133.5, + null + ], + "hints": { + "index": 5206 + } + }, + { + "items": [ + 3134, + null + ], + "hints": { + "index": 5207 + } + }, + { + "items": [ + 3134.5, + null + ], + "hints": { + "index": 5208 + } + }, + { + "items": [ + 3135, + null + ], + "hints": { + "index": 5209 + } + }, + { + "items": [ + 3135.5, + null + ], + "hints": { + "index": 5210 + } + }, + { + "items": [ + 3136, + null + ], + "hints": { + "index": 5211 + } + }, + { + "items": [ + 3136.5, + null + ], + "hints": { + "index": 5212 + } + }, + { + "items": [ + 3137, + null + ], + "hints": { + "index": 5213 + } + }, + { + "items": [ + 3137.5, + null + ], + "hints": { + "index": 5214 + } + }, + { + "items": [ + 3138, + null + ], + "hints": { + "index": 5215 + } + }, + { + "items": [ + 3138.5, + null + ], + "hints": { + "index": 5216 + } + }, + { + "items": [ + 3139, + null + ], + "hints": { + "index": 5217 + } + }, + { + "items": [ + 3139.5, + null + ], + "hints": { + "index": 5218 + } + }, + { + "items": [ + 3140, + null + ], + "hints": { + "index": 5219 + } + }, + { + "items": [ + 3140.5, + null + ], + "hints": { + "index": 5220 + } + }, + { + "items": [ + 3141, + null + ], + "hints": { + "index": 5221 + } + }, + { + "items": [ + 3141.5, + null + ], + "hints": { + "index": 5222 + } + }, + { + "items": [ + 3142, + null + ], + "hints": { + "index": 5223 + } + }, + { + "items": [ + 3142.5, + null + ], + "hints": { + "index": 5224 + } + }, + { + "items": [ + 3143, + null + ], + "hints": { + "index": 5225 + } + }, + { + "items": [ + 3143.5, + null + ], + "hints": { + "index": 5226 + } + }, + { + "items": [ + 3144, + null + ], + "hints": { + "index": 5227 + } + }, + { + "items": [ + 3144.5, + null + ], + "hints": { + "index": 5228 + } + }, + { + "items": [ + 3145, + null + ], + "hints": { + "index": 5229 + } + }, + { + "items": [ + 3145.5, + null + ], + "hints": { + "index": 5230 + } + }, + { + "items": [ + 3146, + null + ], + "hints": { + "index": 5231 + } + }, + { + "items": [ + 3146.5, + null + ], + "hints": { + "index": 5232 + } + }, + { + "items": [ + 3147, + null + ], + "hints": { + "index": 5233 + } + }, + { + "items": [ + 3147.5, + null + ], + "hints": { + "index": 5234 + } + }, + { + "items": [ + 3148, + null + ], + "hints": { + "index": 5235 + } + }, + { + "items": [ + 3148.5, + null + ], + "hints": { + "index": 5236 + } + }, + { + "items": [ + 3149, + null + ], + "hints": { + "index": 5237 + } + }, + { + "items": [ + 3149.5, + null + ], + "hints": { + "index": 5238 + } + }, + { + "items": [ + 3150, + null + ], + "hints": { + "index": 5239 + } + }, + { + "items": [ + 3150.5, + null + ], + "hints": { + "index": 5240 + } + }, + { + "items": [ + 3151, + null + ], + "hints": { + "index": 5241 + } + }, + { + "items": [ + 3151.5, + null + ], + "hints": { + "index": 5242 + } + }, + { + "items": [ + 3152, + null + ], + "hints": { + "index": 5243 + } + }, + { + "items": [ + 3152.5, + null + ], + "hints": { + "index": 5244 + } + }, + { + "items": [ + 3153, + null + ], + "hints": { + "index": 5245 + } + }, + { + "items": [ + 3153.5, + null + ], + "hints": { + "index": 5246 + } + }, + { + "items": [ + 3154, + null + ], + "hints": { + "index": 5247 + } + }, + { + "items": [ + 3154.5, + null + ], + "hints": { + "index": 5248 + } + }, + { + "items": [ + 3155, + null + ], + "hints": { + "index": 5249 + } + }, + { + "items": [ + 3155.5, + null + ], + "hints": { + "index": 5250 + } + }, + { + "items": [ + 3156, + null + ], + "hints": { + "index": 5251 + } + }, + { + "items": [ + 3156.5, + null + ], + "hints": { + "index": 5252 + } + }, + { + "items": [ + 3157, + null + ], + "hints": { + "index": 5253 + } + }, + { + "items": [ + 3157.5, + null + ], + "hints": { + "index": 5254 + } + }, + { + "items": [ + 3158, + null + ], + "hints": { + "index": 5255 + } + }, + { + "items": [ + 3158.5, + null + ], + "hints": { + "index": 5256 + } + }, + { + "items": [ + 3159, + null + ], + "hints": { + "index": 5257 + } + }, + { + "items": [ + 3159.5, + null + ], + "hints": { + "index": 5258 + } + }, + { + "items": [ + 3160, + null + ], + "hints": { + "index": 5259 + } + }, + { + "items": [ + 3160.5, + null + ], + "hints": { + "index": 5260 + } + }, + { + "items": [ + 3161, + null + ], + "hints": { + "index": 5261 + } + }, + { + "items": [ + 3161.5, + null + ], + "hints": { + "index": 5262 + } + }, + { + "items": [ + 3162, + null + ], + "hints": { + "index": 5263 + } + }, + { + "items": [ + 3162.5, + null + ], + "hints": { + "index": 5264 + } + }, + { + "items": [ + 3163, + null + ], + "hints": { + "index": 5265 + } + }, + { + "items": [ + 3163.5, + null + ], + "hints": { + "index": 5266 + } + }, + { + "items": [ + 3164, + null + ], + "hints": { + "index": 5267 + } + }, + { + "items": [ + 3164.5, + null + ], + "hints": { + "index": 5268 + } + }, + { + "items": [ + 3165, + null + ], + "hints": { + "index": 5269 + } + }, + { + "items": [ + 3165.5, + null + ], + "hints": { + "index": 5270 + } + }, + { + "items": [ + 3166, + null + ], + "hints": { + "index": 5271 + } + }, + { + "items": [ + 3166.5, + null + ], + "hints": { + "index": 5272 + } + }, + { + "items": [ + 3167, + null + ], + "hints": { + "index": 5273 + } + }, + { + "items": [ + 3167.5, + null + ], + "hints": { + "index": 5274 + } + }, + { + "items": [ + 3168, + null + ], + "hints": { + "index": 5275 + } + }, + { + "items": [ + 3168.5, + null + ], + "hints": { + "index": 5276 + } + }, + { + "items": [ + 3169, + null + ], + "hints": { + "index": 5277 + } + }, + { + "items": [ + 3169.5, + null + ], + "hints": { + "index": 5278 + } + }, + { + "items": [ + 3170, + null + ], + "hints": { + "index": 5279 + } + }, + { + "items": [ + 3170.5, + null + ], + "hints": { + "index": 5280 + } + }, + { + "items": [ + 3171, + null + ], + "hints": { + "index": 5281 + } + }, + { + "items": [ + 3171.5, + null + ], + "hints": { + "index": 5282 + } + }, + { + "items": [ + 3172, + null + ], + "hints": { + "index": 5283 + } + }, + { + "items": [ + 3172.5, + null + ], + "hints": { + "index": 5284 + } + }, + { + "items": [ + 3173, + null + ], + "hints": { + "index": 5285 + } + }, + { + "items": [ + 3173.5, + null + ], + "hints": { + "index": 5286 + } + }, + { + "items": [ + 3174, + null + ], + "hints": { + "index": 5287 + } + }, + { + "items": [ + 3174.5, + null + ], + "hints": { + "index": 5288 + } + }, + { + "items": [ + 3175, + null + ], + "hints": { + "index": 5289 + } + }, + { + "items": [ + 3175.5, + null + ], + "hints": { + "index": 5290 + } + }, + { + "items": [ + 3176, + null + ], + "hints": { + "index": 5291 + } + }, + { + "items": [ + 3176.5, + null + ], + "hints": { + "index": 5292 + } + }, + { + "items": [ + 3177, + null + ], + "hints": { + "index": 5293 + } + }, + { + "items": [ + 3177.5, + null + ], + "hints": { + "index": 5294 + } + }, + { + "items": [ + 3178, + null + ], + "hints": { + "index": 5295 + } + }, + { + "items": [ + 3178.5, + null + ], + "hints": { + "index": 5296 + } + }, + { + "items": [ + 3179, + null + ], + "hints": { + "index": 5297 + } + }, + { + "items": [ + 3179.5, + null + ], + "hints": { + "index": 5298 + } + }, + { + "items": [ + 3180, + null + ], + "hints": { + "index": 5299 + } + }, + { + "items": [ + 3180.5, + null + ], + "hints": { + "index": 5300 + } + }, + { + "items": [ + 3181, + null + ], + "hints": { + "index": 5301 + } + }, + { + "items": [ + 3181.5, + null + ], + "hints": { + "index": 5302 + } + }, + { + "items": [ + 3182, + null + ], + "hints": { + "index": 5303 + } + }, + { + "items": [ + 3182.5, + null + ], + "hints": { + "index": 5304 + } + }, + { + "items": [ + 3183, + null + ], + "hints": { + "index": 5305 + } + }, + { + "items": [ + 3183.5, + null + ], + "hints": { + "index": 5306 + } + }, + { + "items": [ + 3184, + null + ], + "hints": { + "index": 5307 + } + }, + { + "items": [ + 3184.5, + null + ], + "hints": { + "index": 5308 + } + }, + { + "items": [ + 3185, + null + ], + "hints": { + "index": 5309 + } + }, + { + "items": [ + 3185.5, + null + ], + "hints": { + "index": 5310 + } + }, + { + "items": [ + 3186, + null + ], + "hints": { + "index": 5311 + } + }, + { + "items": [ + 3186.5, + null + ], + "hints": { + "index": 5312 + } + }, + { + "items": [ + 3187, + null + ], + "hints": { + "index": 5313 + } + }, + { + "items": [ + 3187.5, + null + ], + "hints": { + "index": 5314 + } + }, + { + "items": [ + 3188, + null + ], + "hints": { + "index": 5315 + } + }, + { + "items": [ + 3188.5, + null + ], + "hints": { + "index": 5316 + } + }, + { + "items": [ + 3189, + null + ], + "hints": { + "index": 5317 + } + }, + { + "items": [ + 3189.5, + null + ], + "hints": { + "index": 5318 + } + }, + { + "items": [ + 3190, + null + ], + "hints": { + "index": 5319 + } + }, + { + "items": [ + 3190.5, + null + ], + "hints": { + "index": 5320 + } + }, + { + "items": [ + 3191, + null + ], + "hints": { + "index": 5321 + } + }, + { + "items": [ + 3191.5, + null + ], + "hints": { + "index": 5322 + } + }, + { + "items": [ + 3192, + null + ], + "hints": { + "index": 5323 + } + }, + { + "items": [ + 3192.5, + null + ], + "hints": { + "index": 5324 + } + }, + { + "items": [ + 3193, + null + ], + "hints": { + "index": 5325 + } + }, + { + "items": [ + 3193.5, + null + ], + "hints": { + "index": 5326 + } + }, + { + "items": [ + 3194, + null + ], + "hints": { + "index": 5327 + } + }, + { + "items": [ + 3194.5, + null + ], + "hints": { + "index": 5328 + } + }, + { + "items": [ + 3195, + null + ], + "hints": { + "index": 5329 + } + }, + { + "items": [ + 3195.5, + null + ], + "hints": { + "index": 5330 + } + }, + { + "items": [ + 3196, + null + ], + "hints": { + "index": 5331 + } + }, + { + "items": [ + 3196.5, + null + ], + "hints": { + "index": 5332 + } + }, + { + "items": [ + 3197, + null + ], + "hints": { + "index": 5333 + } + }, + { + "items": [ + 3197.5, + null + ], + "hints": { + "index": 5334 + } + }, + { + "items": [ + 3198, + null + ], + "hints": { + "index": 5335 + } + }, + { + "items": [ + 3198.5, + null + ], + "hints": { + "index": 5336 + } + }, + { + "items": [ + 3199, + null + ], + "hints": { + "index": 5337 + } + }, + { + "items": [ + 3199.5, + null + ], + "hints": { + "index": 5338 + } + }, + { + "items": [ + 3200, + null + ], + "hints": { + "index": 5339 + } + }, + { + "items": [ + 3200.5, + null + ], + "hints": { + "index": 5340 + } + }, + { + "items": [ + 3201, + null + ], + "hints": { + "index": 5341 + } + }, + { + "items": [ + 3201.5, + null + ], + "hints": { + "index": 5342 + } + }, + { + "items": [ + 3202, + null + ], + "hints": { + "index": 5343 + } + }, + { + "items": [ + 3202.5, + null + ], + "hints": { + "index": 5344 + } + }, + { + "items": [ + 3203, + null + ], + "hints": { + "index": 5345 + } + }, + { + "items": [ + 3203.5, + null + ], + "hints": { + "index": 5346 + } + }, + { + "items": [ + 3204, + null + ], + "hints": { + "index": 5347 + } + }, + { + "items": [ + 3204.5, + null + ], + "hints": { + "index": 5348 + } + }, + { + "items": [ + 3205, + null + ], + "hints": { + "index": 5349 + } + }, + { + "items": [ + 3205.5, + null + ], + "hints": { + "index": 5350 + } + }, + { + "items": [ + 3206, + null + ], + "hints": { + "index": 5351 + } + }, + { + "items": [ + 3206.5, + null + ], + "hints": { + "index": 5352 + } + }, + { + "items": [ + 3207, + null + ], + "hints": { + "index": 5353 + } + }, + { + "items": [ + 3207.5, + null + ], + "hints": { + "index": 5354 + } + }, + { + "items": [ + 3208, + null + ], + "hints": { + "index": 5355 + } + }, + { + "items": [ + 3208.5, + null + ], + "hints": { + "index": 5356 + } + }, + { + "items": [ + 3209, + null + ], + "hints": { + "index": 5357 + } + }, + { + "items": [ + 3209.5, + null + ], + "hints": { + "index": 5358 + } + }, + { + "items": [ + 3210, + null + ], + "hints": { + "index": 5359 + } + }, + { + "items": [ + 3210.5, + null + ], + "hints": { + "index": 5360 + } + }, + { + "items": [ + 3211, + null + ], + "hints": { + "index": 5361 + } + }, + { + "items": [ + 3211.5, + null + ], + "hints": { + "index": 5362 + } + }, + { + "items": [ + 3212, + null + ], + "hints": { + "index": 5363 + } + }, + { + "items": [ + 3212.5, + null + ], + "hints": { + "index": 5364 + } + }, + { + "items": [ + 3213, + null + ], + "hints": { + "index": 5365 + } + }, + { + "items": [ + 3213.5, + null + ], + "hints": { + "index": 5366 + } + }, + { + "items": [ + 3214, + null + ], + "hints": { + "index": 5367 + } + }, + { + "items": [ + 3214.5, + null + ], + "hints": { + "index": 5368 + } + }, + { + "items": [ + 3215, + null + ], + "hints": { + "index": 5369 + } + }, + { + "items": [ + 3215.5, + null + ], + "hints": { + "index": 5370 + } + }, + { + "items": [ + 3216, + null + ], + "hints": { + "index": 5371 + } + }, + { + "items": [ + 3216.5, + null + ], + "hints": { + "index": 5372 + } + }, + { + "items": [ + 3217, + null + ], + "hints": { + "index": 5373 + } + }, + { + "items": [ + 3217.5, + null + ], + "hints": { + "index": 5374 + } + }, + { + "items": [ + 3218, + null + ], + "hints": { + "index": 5375 + } + }, + { + "items": [ + 3218.5, + null + ], + "hints": { + "index": 5376 + } + }, + { + "items": [ + 3219, + null + ], + "hints": { + "index": 5377 + } + }, + { + "items": [ + 3219.5, + null + ], + "hints": { + "index": 5378 + } + }, + { + "items": [ + 3220, + null + ], + "hints": { + "index": 5379 + } + }, + { + "items": [ + 3220.5, + null + ], + "hints": { + "index": 5380 + } + }, + { + "items": [ + 3221, + null + ], + "hints": { + "index": 5381 + } + }, + { + "items": [ + 3221.5, + null + ], + "hints": { + "index": 5382 + } + }, + { + "items": [ + 3222, + null + ], + "hints": { + "index": 5383 + } + }, + { + "items": [ + 3222.5, + null + ], + "hints": { + "index": 5384 + } + }, + { + "items": [ + 3223, + null + ], + "hints": { + "index": 5385 + } + }, + { + "items": [ + 3223.5, + null + ], + "hints": { + "index": 5386 + } + }, + { + "items": [ + 3224, + null + ], + "hints": { + "index": 5387 + } + }, + { + "items": [ + 3224.5, + null + ], + "hints": { + "index": 5388 + } + }, + { + "items": [ + 3225, + null + ], + "hints": { + "index": 5389 + } + }, + { + "items": [ + 3225.5, + null + ], + "hints": { + "index": 5390 + } + }, + { + "items": [ + 3226, + null + ], + "hints": { + "index": 5391 + } + }, + { + "items": [ + 3226.5, + null + ], + "hints": { + "index": 5392 + } + }, + { + "items": [ + 3227, + null + ], + "hints": { + "index": 5393 + } + }, + { + "items": [ + 3227.5, + null + ], + "hints": { + "index": 5394 + } + }, + { + "items": [ + 3228, + null + ], + "hints": { + "index": 5395 + } + }, + { + "items": [ + 3228.5, + null + ], + "hints": { + "index": 5396 + } + }, + { + "items": [ + 3229, + null + ], + "hints": { + "index": 5397 + } + }, + { + "items": [ + 3229.5, + null + ], + "hints": { + "index": 5398 + } + }, + { + "items": [ + 3230, + null + ], + "hints": { + "index": 5399 + } + }, + { + "items": [ + 3230.5, + null + ], + "hints": { + "index": 5400 + } + }, + { + "items": [ + 3231, + null + ], + "hints": { + "index": 5401 + } + }, + { + "items": [ + 3231.5, + null + ], + "hints": { + "index": 5402 + } + }, + { + "items": [ + 3232, + null + ], + "hints": { + "index": 5403 + } + }, + { + "items": [ + 3232.5, + null + ], + "hints": { + "index": 5404 + } + }, + { + "items": [ + 3233, + null + ], + "hints": { + "index": 5405 + } + }, + { + "items": [ + 3233.5, + null + ], + "hints": { + "index": 5406 + } + }, + { + "items": [ + 3234, + null + ], + "hints": { + "index": 5407 + } + }, + { + "items": [ + 3234.5, + null + ], + "hints": { + "index": 5408 + } + }, + { + "items": [ + 3235, + null + ], + "hints": { + "index": 5409 + } + }, + { + "items": [ + 3235.5, + null + ], + "hints": { + "index": 5410 + } + }, + { + "items": [ + 3236, + null + ], + "hints": { + "index": 5411 + } + }, + { + "items": [ + 3236.5, + null + ], + "hints": { + "index": 5412 + } + }, + { + "items": [ + 3237, + null + ], + "hints": { + "index": 5413 + } + }, + { + "items": [ + 3237.5, + null + ], + "hints": { + "index": 5414 + } + }, + { + "items": [ + 3238, + null + ], + "hints": { + "index": 5415 + } + }, + { + "items": [ + 3238.5, + null + ], + "hints": { + "index": 5416 + } + }, + { + "items": [ + 3239, + null + ], + "hints": { + "index": 5417 + } + }, + { + "items": [ + 3239.5, + null + ], + "hints": { + "index": 5418 + } + }, + { + "items": [ + 3240, + null + ], + "hints": { + "index": 5419 + } + }, + { + "items": [ + 3240.5, + null + ], + "hints": { + "index": 5420 + } + }, + { + "items": [ + 3241, + null + ], + "hints": { + "index": 5421 + } + }, + { + "items": [ + 3241.5, + null + ], + "hints": { + "index": 5422 + } + }, + { + "items": [ + 3242, + null + ], + "hints": { + "index": 5423 + } + }, + { + "items": [ + 3242.5, + null + ], + "hints": { + "index": 5424 + } + }, + { + "items": [ + 3243, + null + ], + "hints": { + "index": 5425 + } + }, + { + "items": [ + 3243.5, + null + ], + "hints": { + "index": 5426 + } + }, + { + "items": [ + 3244, + null + ], + "hints": { + "index": 5427 + } + }, + { + "items": [ + 3244.5, + null + ], + "hints": { + "index": 5428 + } + }, + { + "items": [ + 3245, + null + ], + "hints": { + "index": 5429 + } + }, + { + "items": [ + 3245.5, + null + ], + "hints": { + "index": 5430 + } + }, + { + "items": [ + 3246, + null + ], + "hints": { + "index": 5431 + } + }, + { + "items": [ + 3246.5, + null + ], + "hints": { + "index": 5432 + } + }, + { + "items": [ + 3247, + null + ], + "hints": { + "index": 5433 + } + }, + { + "items": [ + 3247.5, + null + ], + "hints": { + "index": 5434 + } + }, + { + "items": [ + 3248, + null + ], + "hints": { + "index": 5435 + } + }, + { + "items": [ + 3248.5, + null + ], + "hints": { + "index": 5436 + } + }, + { + "items": [ + 3249, + null + ], + "hints": { + "index": 5437 + } + }, + { + "items": [ + 3249.5, + null + ], + "hints": { + "index": 5438 + } + }, + { + "items": [ + 3250, + null + ], + "hints": { + "index": 5439 + } + }, + { + "items": [ + 3250.5, + null + ], + "hints": { + "index": 5440 + } + }, + { + "items": [ + 3251, + null + ], + "hints": { + "index": 5441 + } + }, + { + "items": [ + 3251.5, + null + ], + "hints": { + "index": 5442 + } + }, + { + "items": [ + 3252, + null + ], + "hints": { + "index": 5443 + } + }, + { + "items": [ + 3252.5, + null + ], + "hints": { + "index": 5444 + } + }, + { + "items": [ + 3253, + null + ], + "hints": { + "index": 5445 + } + }, + { + "items": [ + 3253.5, + null + ], + "hints": { + "index": 5446 + } + }, + { + "items": [ + 3254, + null + ], + "hints": { + "index": 5447 + } + }, + { + "items": [ + 3254.5, + null + ], + "hints": { + "index": 5448 + } + }, + { + "items": [ + 3255, + null + ], + "hints": { + "index": 5449 + } + }, + { + "items": [ + 3255.5, + null + ], + "hints": { + "index": 5450 + } + }, + { + "items": [ + 3256, + null + ], + "hints": { + "index": 5451 + } + }, + { + "items": [ + 3256.5, + null + ], + "hints": { + "index": 5452 + } + }, + { + "items": [ + 3257, + null + ], + "hints": { + "index": 5453 + } + }, + { + "items": [ + 3257.5, + null + ], + "hints": { + "index": 5454 + } + }, + { + "items": [ + 3258, + null + ], + "hints": { + "index": 5455 + } + }, + { + "items": [ + 3258.5, + null + ], + "hints": { + "index": 5456 + } + }, + { + "items": [ + 3259, + null + ], + "hints": { + "index": 5457 + } + }, + { + "items": [ + 3259.5, + null + ], + "hints": { + "index": 5458 + } + }, + { + "items": [ + 3260, + null + ], + "hints": { + "index": 5459 + } + }, + { + "items": [ + 3260.5, + null + ], + "hints": { + "index": 5460 + } + }, + { + "items": [ + 3261, + null + ], + "hints": { + "index": 5461 + } + }, + { + "items": [ + 3261.5, + null + ], + "hints": { + "index": 5462 + } + }, + { + "items": [ + 3262, + null + ], + "hints": { + "index": 5463 + } + }, + { + "items": [ + 3262.5, + null + ], + "hints": { + "index": 5464 + } + }, + { + "items": [ + 3263, + null + ], + "hints": { + "index": 5465 + } + }, + { + "items": [ + 3263.5, + null + ], + "hints": { + "index": 5466 + } + }, + { + "items": [ + 3264, + null + ], + "hints": { + "index": 5467 + } + }, + { + "items": [ + 3264.5, + null + ], + "hints": { + "index": 5468 + } + }, + { + "items": [ + 3265, + null + ], + "hints": { + "index": 5469 + } + }, + { + "items": [ + 3265.5, + null + ], + "hints": { + "index": 5470 + } + }, + { + "items": [ + 3266, + null + ], + "hints": { + "index": 5471 + } + }, + { + "items": [ + 3266.5, + null + ], + "hints": { + "index": 5472 + } + }, + { + "items": [ + 3267, + null + ], + "hints": { + "index": 5473 + } + }, + { + "items": [ + 3267.5, + null + ], + "hints": { + "index": 5474 + } + }, + { + "items": [ + 3268, + null + ], + "hints": { + "index": 5475 + } + }, + { + "items": [ + 3268.5, + null + ], + "hints": { + "index": 5476 + } + }, + { + "items": [ + 3269, + null + ], + "hints": { + "index": 5477 + } + }, + { + "items": [ + 3269.5, + null + ], + "hints": { + "index": 5478 + } + }, + { + "items": [ + 3270, + null + ], + "hints": { + "index": 5479 + } + }, + { + "items": [ + 3270.5, + null + ], + "hints": { + "index": 5480 + } + }, + { + "items": [ + 3271, + null + ], + "hints": { + "index": 5481 + } + }, + { + "items": [ + 3271.5, + null + ], + "hints": { + "index": 5482 + } + }, + { + "items": [ + 3272, + null + ], + "hints": { + "index": 5483 + } + }, + { + "items": [ + 3272.5, + null + ], + "hints": { + "index": 5484 + } + }, + { + "items": [ + 3273, + null + ], + "hints": { + "index": 5485 + } + }, + { + "items": [ + 3273.5, + null + ], + "hints": { + "index": 5486 + } + }, + { + "items": [ + 3274, + null + ], + "hints": { + "index": 5487 + } + }, + { + "items": [ + 3274.5, + null + ], + "hints": { + "index": 5488 + } + }, + { + "items": [ + 3275, + null + ], + "hints": { + "index": 5489 + } + }, + { + "items": [ + 3275.5, + null + ], + "hints": { + "index": 5490 + } + }, + { + "items": [ + 3276, + null + ], + "hints": { + "index": 5491 + } + }, + { + "items": [ + 3276.5, + null + ], + "hints": { + "index": 5492 + } + }, + { + "items": [ + 3277, + null + ], + "hints": { + "index": 5493 + } + }, + { + "items": [ + 3277.5, + null + ], + "hints": { + "index": 5494 + } + }, + { + "items": [ + 3278, + null + ], + "hints": { + "index": 5495 + } + }, + { + "items": [ + 3278.5, + null + ], + "hints": { + "index": 5496 + } + }, + { + "items": [ + 3279, + null + ], + "hints": { + "index": 5497 + } + }, + { + "items": [ + 3279.5, + null + ], + "hints": { + "index": 5498 + } + }, + { + "items": [ + 3280, + null + ], + "hints": { + "index": 5499 + } + }, + { + "items": [ + 3280.5, + null + ], + "hints": { + "index": 5500 + } + }, + { + "items": [ + 3281, + null + ], + "hints": { + "index": 5501 + } + }, + { + "items": [ + 3281.5, + null + ], + "hints": { + "index": 5502 + } + }, + { + "items": [ + 3282, + null + ], + "hints": { + "index": 5503 + } + }, + { + "items": [ + 3282.5, + null + ], + "hints": { + "index": 5504 + } + }, + { + "items": [ + 3283, + null + ], + "hints": { + "index": 5505 + } + }, + { + "items": [ + 3283.5, + null + ], + "hints": { + "index": 5506 + } + }, + { + "items": [ + 3284, + null + ], + "hints": { + "index": 5507 + } + }, + { + "items": [ + 3284.5, + null + ], + "hints": { + "index": 5508 + } + }, + { + "items": [ + 3285, + null + ], + "hints": { + "index": 5509 + } + }, + { + "items": [ + 3285.5, + null + ], + "hints": { + "index": 5510 + } + }, + { + "items": [ + 3286, + null + ], + "hints": { + "index": 5511 + } + }, + { + "items": [ + 3286.5, + null + ], + "hints": { + "index": 5512 + } + }, + { + "items": [ + 3287, + null + ], + "hints": { + "index": 5513 + } + }, + { + "items": [ + 3287.5, + null + ], + "hints": { + "index": 5514 + } + }, + { + "items": [ + 3288, + null + ], + "hints": { + "index": 5515 + } + }, + { + "items": [ + 3288.5, + null + ], + "hints": { + "index": 5516 + } + }, + { + "items": [ + 3289, + null + ], + "hints": { + "index": 5517 + } + }, + { + "items": [ + 3289.5, + null + ], + "hints": { + "index": 5518 + } + }, + { + "items": [ + 3290, + null + ], + "hints": { + "index": 5519 + } + }, + { + "items": [ + 3290.5, + null + ], + "hints": { + "index": 5520 + } + }, + { + "items": [ + 3291, + null + ], + "hints": { + "index": 5521 + } + }, + { + "items": [ + 3291.5, + null + ], + "hints": { + "index": 5522 + } + }, + { + "items": [ + 3292, + null + ], + "hints": { + "index": 5523 + } + }, + { + "items": [ + 3292.5, + null + ], + "hints": { + "index": 5524 + } + }, + { + "items": [ + 3293, + null + ], + "hints": { + "index": 5525 + } + }, + { + "items": [ + 3293.5, + null + ], + "hints": { + "index": 5526 + } + }, + { + "items": [ + 3294, + null + ], + "hints": { + "index": 5527 + } + }, + { + "items": [ + 3294.5, + null + ], + "hints": { + "index": 5528 + } + }, + { + "items": [ + 3295, + null + ], + "hints": { + "index": 5529 + } + }, + { + "items": [ + 3295.5, + null + ], + "hints": { + "index": 5530 + } + }, + { + "items": [ + 3296, + null + ], + "hints": { + "index": 5531 + } + }, + { + "items": [ + 3296.5, + null + ], + "hints": { + "index": 5532 + } + }, + { + "items": [ + 3297, + null + ], + "hints": { + "index": 5533 + } + }, + { + "items": [ + 3297.5, + null + ], + "hints": { + "index": 5534 + } + }, + { + "items": [ + 3298, + null + ], + "hints": { + "index": 5535 + } + }, + { + "items": [ + 3298.5, + null + ], + "hints": { + "index": 5536 + } + }, + { + "items": [ + 3299, + null + ], + "hints": { + "index": 5537 + } + }, + { + "items": [ + 3299.5, + null + ], + "hints": { + "index": 5538 + } + }, + { + "items": [ + 3300, + null + ], + "hints": { + "index": 5539 + } + }, + { + "items": [ + 3300.5, + null + ], + "hints": { + "index": 5540 + } + }, + { + "items": [ + 3301, + null + ], + "hints": { + "index": 5541 + } + }, + { + "items": [ + 3301.5, + null + ], + "hints": { + "index": 5542 + } + }, + { + "items": [ + 3302, + null + ], + "hints": { + "index": 5543 + } + }, + { + "items": [ + 3302.5, + null + ], + "hints": { + "index": 5544 + } + }, + { + "items": [ + 3303, + null + ], + "hints": { + "index": 5545 + } + }, + { + "items": [ + 3303.5, + null + ], + "hints": { + "index": 5546 + } + }, + { + "items": [ + 3304, + null + ], + "hints": { + "index": 5547 + } + }, + { + "items": [ + 3304.5, + null + ], + "hints": { + "index": 5548 + } + }, + { + "items": [ + 3305, + null + ], + "hints": { + "index": 5549 + } + }, + { + "items": [ + 3305.5, + null + ], + "hints": { + "index": 5550 + } + }, + { + "items": [ + 3306, + null + ], + "hints": { + "index": 5551 + } + }, + { + "items": [ + 3306.5, + null + ], + "hints": { + "index": 5552 + } + }, + { + "items": [ + 3307, + null + ], + "hints": { + "index": 5553 + } + }, + { + "items": [ + 3307.5, + null + ], + "hints": { + "index": 5554 + } + }, + { + "items": [ + 3308, + null + ], + "hints": { + "index": 5555 + } + }, + { + "items": [ + 3308.5, + null + ], + "hints": { + "index": 5556 + } + }, + { + "items": [ + 3309, + null + ], + "hints": { + "index": 5557 + } + }, + { + "items": [ + 3309.5, + null + ], + "hints": { + "index": 5558 + } + }, + { + "items": [ + 3310, + null + ], + "hints": { + "index": 5559 + } + }, + { + "items": [ + 3310.5, + null + ], + "hints": { + "index": 5560 + } + }, + { + "items": [ + 3311, + null + ], + "hints": { + "index": 5561 + } + }, + { + "items": [ + 3311.5, + null + ], + "hints": { + "index": 5562 + } + }, + { + "items": [ + 3312, + null + ], + "hints": { + "index": 5563 + } + }, + { + "items": [ + 3312.5, + null + ], + "hints": { + "index": 5564 + } + }, + { + "items": [ + 3313, + null + ], + "hints": { + "index": 5565 + } + }, + { + "items": [ + 3313.5, + null + ], + "hints": { + "index": 5566 + } + }, + { + "items": [ + 3314, + null + ], + "hints": { + "index": 5567 + } + }, + { + "items": [ + 3314.5, + null + ], + "hints": { + "index": 5568 + } + }, + { + "items": [ + 3315, + null + ], + "hints": { + "index": 5569 + } + }, + { + "items": [ + 3315.5, + null + ], + "hints": { + "index": 5570 + } + }, + { + "items": [ + 3316, + null + ], + "hints": { + "index": 5571 + } + }, + { + "items": [ + 3316.5, + null + ], + "hints": { + "index": 5572 + } + }, + { + "items": [ + 3317, + null + ], + "hints": { + "index": 5573 + } + }, + { + "items": [ + 3317.5, + null + ], + "hints": { + "index": 5574 + } + }, + { + "items": [ + 3318, + null + ], + "hints": { + "index": 5575 + } + }, + { + "items": [ + 3318.5, + null + ], + "hints": { + "index": 5576 + } + }, + { + "items": [ + 3319, + null + ], + "hints": { + "index": 5577 + } + }, + { + "items": [ + 3319.5, + null + ], + "hints": { + "index": 5578 + } + }, + { + "items": [ + 3320, + null + ], + "hints": { + "index": 5579 + } + }, + { + "items": [ + 3320.5, + null + ], + "hints": { + "index": 5580 + } + }, + { + "items": [ + 3321, + null + ], + "hints": { + "index": 5581 + } + }, + { + "items": [ + 3321.5, + null + ], + "hints": { + "index": 5582 + } + }, + { + "items": [ + 3322, + null + ], + "hints": { + "index": 5583 + } + }, + { + "items": [ + 3322.5, + null + ], + "hints": { + "index": 5584 + } + }, + { + "items": [ + 3323, + null + ], + "hints": { + "index": 5585 + } + }, + { + "items": [ + 3323.5, + null + ], + "hints": { + "index": 5586 + } + }, + { + "items": [ + 3324, + null + ], + "hints": { + "index": 5587 + } + }, + { + "items": [ + 3324.5, + null + ], + "hints": { + "index": 5588 + } + }, + { + "items": [ + 3325, + null + ], + "hints": { + "index": 5589 + } + }, + { + "items": [ + 3325.5, + null + ], + "hints": { + "index": 5590 + } + }, + { + "items": [ + 3326, + null + ], + "hints": { + "index": 5591 + } + }, + { + "items": [ + 3326.5, + null + ], + "hints": { + "index": 5592 + } + }, + { + "items": [ + 3327, + null + ], + "hints": { + "index": 5593 + } + }, + { + "items": [ + 3327.5, + null + ], + "hints": { + "index": 5594 + } + }, + { + "items": [ + 3328, + null + ], + "hints": { + "index": 5595 + } + }, + { + "items": [ + 3328.5, + null + ], + "hints": { + "index": 5596 + } + }, + { + "items": [ + 3329, + null + ], + "hints": { + "index": 5597 + } + }, + { + "items": [ + 3329.5, + null + ], + "hints": { + "index": 5598 + } + }, + { + "items": [ + 3330, + null + ], + "hints": { + "index": 5599 + } + }, + { + "items": [ + 3330.5, + null + ], + "hints": { + "index": 5600 + } + }, + { + "items": [ + 3331, + null + ], + "hints": { + "index": 5601 + } + }, + { + "items": [ + 3331.5, + null + ], + "hints": { + "index": 5602 + } + }, + { + "items": [ + 3332, + null + ], + "hints": { + "index": 5603 + } + }, + { + "items": [ + 3332.5, + null + ], + "hints": { + "index": 5604 + } + }, + { + "items": [ + 3333, + null + ], + "hints": { + "index": 5605 + } + }, + { + "items": [ + 3333.5, + null + ], + "hints": { + "index": 5606 + } + }, + { + "items": [ + 3334, + null + ], + "hints": { + "index": 5607 + } + }, + { + "items": [ + 3334.5, + null + ], + "hints": { + "index": 5608 + } + }, + { + "items": [ + 3335, + null + ], + "hints": { + "index": 5609 + } + }, + { + "items": [ + 3335.5, + null + ], + "hints": { + "index": 5610 + } + }, + { + "items": [ + 3336, + null + ], + "hints": { + "index": 5611 + } + }, + { + "items": [ + 3336.5, + null + ], + "hints": { + "index": 5612 + } + }, + { + "items": [ + 3337, + null + ], + "hints": { + "index": 5613 + } + }, + { + "items": [ + 3337.5, + null + ], + "hints": { + "index": 5614 + } + }, + { + "items": [ + 3338, + null + ], + "hints": { + "index": 5615 + } + }, + { + "items": [ + 3338.5, + null + ], + "hints": { + "index": 5616 + } + }, + { + "items": [ + 3339, + null + ], + "hints": { + "index": 5617 + } + }, + { + "items": [ + 3339.5, + null + ], + "hints": { + "index": 5618 + } + }, + { + "items": [ + 3340, + null + ], + "hints": { + "index": 5619 + } + }, + { + "items": [ + 3340.5, + null + ], + "hints": { + "index": 5620 + } + }, + { + "items": [ + 3341, + null + ], + "hints": { + "index": 5621 + } + }, + { + "items": [ + 3341.5, + null + ], + "hints": { + "index": 5622 + } + }, + { + "items": [ + 3342, + null + ], + "hints": { + "index": 5623 + } + }, + { + "items": [ + 3342.5, + null + ], + "hints": { + "index": 5624 + } + }, + { + "items": [ + 3343, + null + ], + "hints": { + "index": 5625 + } + }, + { + "items": [ + 3343.5, + null + ], + "hints": { + "index": 5626 + } + }, + { + "items": [ + 3344, + null + ], + "hints": { + "index": 5627 + } + }, + { + "items": [ + 3344.5, + null + ], + "hints": { + "index": 5628 + } + }, + { + "items": [ + 3345, + null + ], + "hints": { + "index": 5629 + } + }, + { + "items": [ + 3345.5, + null + ], + "hints": { + "index": 5630 + } + }, + { + "items": [ + 3346, + null + ], + "hints": { + "index": 5631 + } + }, + { + "items": [ + 3346.5, + null + ], + "hints": { + "index": 5632 + } + }, + { + "items": [ + 3347, + null + ], + "hints": { + "index": 5633 + } + }, + { + "items": [ + 3347.5, + null + ], + "hints": { + "index": 5634 + } + }, + { + "items": [ + 3348, + null + ], + "hints": { + "index": 5635 + } + }, + { + "items": [ + 3348.5, + null + ], + "hints": { + "index": 5636 + } + }, + { + "items": [ + 3349, + null + ], + "hints": { + "index": 5637 + } + }, + { + "items": [ + 3349.5, + null + ], + "hints": { + "index": 5638 + } + }, + { + "items": [ + 3350, + null + ], + "hints": { + "index": 5639 + } + }, + { + "items": [ + 3350.5, + null + ], + "hints": { + "index": 5640 + } + }, + { + "items": [ + 3351, + null + ], + "hints": { + "index": 5641 + } + }, + { + "items": [ + 3351.5, + null + ], + "hints": { + "index": 5642 + } + }, + { + "items": [ + 3352, + null + ], + "hints": { + "index": 5643 + } + }, + { + "items": [ + 3352.5, + null + ], + "hints": { + "index": 5644 + } + }, + { + "items": [ + 3353, + null + ], + "hints": { + "index": 5645 + } + }, + { + "items": [ + 3353.5, + null + ], + "hints": { + "index": 5646 + } + }, + { + "items": [ + 3354, + null + ], + "hints": { + "index": 5647 + } + }, + { + "items": [ + 3354.5, + null + ], + "hints": { + "index": 5648 + } + }, + { + "items": [ + 3355, + null + ], + "hints": { + "index": 5649 + } + }, + { + "items": [ + 3355.5, + null + ], + "hints": { + "index": 5650 + } + }, + { + "items": [ + 3356, + null + ], + "hints": { + "index": 5651 + } + }, + { + "items": [ + 3356.5, + null + ], + "hints": { + "index": 5652 + } + }, + { + "items": [ + 3357, + null + ], + "hints": { + "index": 5653 + } + }, + { + "items": [ + 3357.5, + null + ], + "hints": { + "index": 5654 + } + }, + { + "items": [ + 3358, + null + ], + "hints": { + "index": 5655 + } + }, + { + "items": [ + 3358.5, + null + ], + "hints": { + "index": 5656 + } + }, + { + "items": [ + 3359, + null + ], + "hints": { + "index": 5657 + } + }, + { + "items": [ + 3359.5, + null + ], + "hints": { + "index": 5658 + } + }, + { + "items": [ + 3360, + null + ], + "hints": { + "index": 5659 + } + }, + { + "items": [ + 3360.5, + null + ], + "hints": { + "index": 5660 + } + }, + { + "items": [ + 3361, + null + ], + "hints": { + "index": 5661 + } + }, + { + "items": [ + 3361.5, + null + ], + "hints": { + "index": 5662 + } + }, + { + "items": [ + 3362, + null + ], + "hints": { + "index": 5663 + } + }, + { + "items": [ + 3362.5, + null + ], + "hints": { + "index": 5664 + } + }, + { + "items": [ + 3363, + null + ], + "hints": { + "index": 5665 + } + }, + { + "items": [ + 3363.5, + null + ], + "hints": { + "index": 5666 + } + }, + { + "items": [ + 3364, + null + ], + "hints": { + "index": 5667 + } + }, + { + "items": [ + 3364.5, + null + ], + "hints": { + "index": 5668 + } + }, + { + "items": [ + 3365, + null + ], + "hints": { + "index": 5669 + } + }, + { + "items": [ + 3365.5, + null + ], + "hints": { + "index": 5670 + } + }, + { + "items": [ + 3366, + null + ], + "hints": { + "index": 5671 + } + }, + { + "items": [ + 3366.5, + null + ], + "hints": { + "index": 5672 + } + }, + { + "items": [ + 3367, + null + ], + "hints": { + "index": 5673 + } + }, + { + "items": [ + 3367.5, + null + ], + "hints": { + "index": 5674 + } + }, + { + "items": [ + 3368, + null + ], + "hints": { + "index": 5675 + } + }, + { + "items": [ + 3368.5, + null + ], + "hints": { + "index": 5676 + } + }, + { + "items": [ + 3369, + null + ], + "hints": { + "index": 5677 + } + }, + { + "items": [ + 3369.5, + null + ], + "hints": { + "index": 5678 + } + }, + { + "items": [ + 3370, + null + ], + "hints": { + "index": 5679 + } + }, + { + "items": [ + 3370.5, + null + ], + "hints": { + "index": 5680 + } + }, + { + "items": [ + 3371, + null + ], + "hints": { + "index": 5681 + } + }, + { + "items": [ + 3371.5, + null + ], + "hints": { + "index": 5682 + } + }, + { + "items": [ + 3372, + null + ], + "hints": { + "index": 5683 + } + }, + { + "items": [ + 3372.5, + null + ], + "hints": { + "index": 5684 + } + }, + { + "items": [ + 3373, + null + ], + "hints": { + "index": 5685 + } + }, + { + "items": [ + 3373.5, + null + ], + "hints": { + "index": 5686 + } + }, + { + "items": [ + 3374, + null + ], + "hints": { + "index": 5687 + } + }, + { + "items": [ + 3374.5, + null + ], + "hints": { + "index": 5688 + } + }, + { + "items": [ + 3375, + null + ], + "hints": { + "index": 5689 + } + }, + { + "items": [ + 3375.5, + null + ], + "hints": { + "index": 5690 + } + }, + { + "items": [ + 3376, + null + ], + "hints": { + "index": 5691 + } + }, + { + "items": [ + 3376.5, + null + ], + "hints": { + "index": 5692 + } + }, + { + "items": [ + 3377, + null + ], + "hints": { + "index": 5693 + } + }, + { + "items": [ + 3377.5, + null + ], + "hints": { + "index": 5694 + } + }, + { + "items": [ + 3378, + null + ], + "hints": { + "index": 5695 + } + }, + { + "items": [ + 3378.5, + null + ], + "hints": { + "index": 5696 + } + }, + { + "items": [ + 3379, + null + ], + "hints": { + "index": 5697 + } + }, + { + "items": [ + 3379.5, + null + ], + "hints": { + "index": 5698 + } + }, + { + "items": [ + 3380, + null + ], + "hints": { + "index": 5699 + } + }, + { + "items": [ + 3380.5, + null + ], + "hints": { + "index": 5700 + } + }, + { + "items": [ + 3381, + null + ], + "hints": { + "index": 5701 + } + }, + { + "items": [ + 3381.5, + null + ], + "hints": { + "index": 5702 + } + }, + { + "items": [ + 3382, + null + ], + "hints": { + "index": 5703 + } + }, + { + "items": [ + 3382.5, + null + ], + "hints": { + "index": 5704 + } + }, + { + "items": [ + 3383, + null + ], + "hints": { + "index": 5705 + } + }, + { + "items": [ + 3383.5, + null + ], + "hints": { + "index": 5706 + } + }, + { + "items": [ + 3384, + null + ], + "hints": { + "index": 5707 + } + }, + { + "items": [ + 3384.5, + null + ], + "hints": { + "index": 5708 + } + }, + { + "items": [ + 3385, + null + ], + "hints": { + "index": 5709 + } + }, + { + "items": [ + 3385.5, + null + ], + "hints": { + "index": 5710 + } + }, + { + "items": [ + 3386, + null + ], + "hints": { + "index": 5711 + } + }, + { + "items": [ + 3386.5, + null + ], + "hints": { + "index": 5712 + } + }, + { + "items": [ + 3387, + null + ], + "hints": { + "index": 5713 + } + }, + { + "items": [ + 3387.5, + null + ], + "hints": { + "index": 5714 + } + }, + { + "items": [ + 3388, + null + ], + "hints": { + "index": 5715 + } + }, + { + "items": [ + 3388.5, + null + ], + "hints": { + "index": 5716 + } + }, + { + "items": [ + 3389, + null + ], + "hints": { + "index": 5717 + } + }, + { + "items": [ + 3389.5, + null + ], + "hints": { + "index": 5718 + } + }, + { + "items": [ + 3390, + null + ], + "hints": { + "index": 5719 + } + }, + { + "items": [ + 3390.5, + null + ], + "hints": { + "index": 5720 + } + }, + { + "items": [ + 3391, + null + ], + "hints": { + "index": 5721 + } + }, + { + "items": [ + 3391.5, + null + ], + "hints": { + "index": 5722 + } + }, + { + "items": [ + 3392, + null + ], + "hints": { + "index": 5723 + } + }, + { + "items": [ + 3392.5, + null + ], + "hints": { + "index": 5724 + } + }, + { + "items": [ + 3393, + null + ], + "hints": { + "index": 5725 + } + }, + { + "items": [ + 3393.5, + null + ], + "hints": { + "index": 5726 + } + }, + { + "items": [ + 3394, + null + ], + "hints": { + "index": 5727 + } + }, + { + "items": [ + 3394.5, + null + ], + "hints": { + "index": 5728 + } + }, + { + "items": [ + 3395, + null + ], + "hints": { + "index": 5729 + } + }, + { + "items": [ + 3395.5, + null + ], + "hints": { + "index": 5730 + } + }, + { + "items": [ + 3396, + null + ], + "hints": { + "index": 5731 + } + }, + { + "items": [ + 3396.5, + null + ], + "hints": { + "index": 5732 + } + }, + { + "items": [ + 3397, + null + ], + "hints": { + "index": 5733 + } + }, + { + "items": [ + 3397.5, + null + ], + "hints": { + "index": 5734 + } + }, + { + "items": [ + 3398, + null + ], + "hints": { + "index": 5735 + } + }, + { + "items": [ + 3398.5, + null + ], + "hints": { + "index": 5736 + } + }, + { + "items": [ + 3399, + null + ], + "hints": { + "index": 5737 + } + }, + { + "items": [ + 3399.5, + null + ], + "hints": { + "index": 5738 + } + }, + { + "items": [ + 3400, + null + ], + "hints": { + "index": 5739 + } + }, + { + "items": [ + 3400.5, + null + ], + "hints": { + "index": 5740 + } + }, + { + "items": [ + 3401, + null + ], + "hints": { + "index": 5741 + } + }, + { + "items": [ + 3401.5, + null + ], + "hints": { + "index": 5742 + } + }, + { + "items": [ + 3402, + null + ], + "hints": { + "index": 5743 + } + }, + { + "items": [ + 3402.5, + null + ], + "hints": { + "index": 5744 + } + }, + { + "items": [ + 3403, + null + ], + "hints": { + "index": 5745 + } + }, + { + "items": [ + 3403.5, + null + ], + "hints": { + "index": 5746 + } + }, + { + "items": [ + 3404, + null + ], + "hints": { + "index": 5747 + } + }, + { + "items": [ + 3404.5, + null + ], + "hints": { + "index": 5748 + } + }, + { + "items": [ + 3405, + null + ], + "hints": { + "index": 5749 + } + }, + { + "items": [ + 3405.5, + null + ], + "hints": { + "index": 5750 + } + }, + { + "items": [ + 3406, + null + ], + "hints": { + "index": 5751 + } + }, + { + "items": [ + 3406.5, + null + ], + "hints": { + "index": 5752 + } + }, + { + "items": [ + 3407, + null + ], + "hints": { + "index": 5753 + } + }, + { + "items": [ + 3407.5, + null + ], + "hints": { + "index": 5754 + } + }, + { + "items": [ + 3408, + null + ], + "hints": { + "index": 5755 + } + }, + { + "items": [ + 3408.5, + null + ], + "hints": { + "index": 5756 + } + }, + { + "items": [ + 3409, + null + ], + "hints": { + "index": 5757 + } + }, + { + "items": [ + 3409.5, + null + ], + "hints": { + "index": 5758 + } + }, + { + "items": [ + 3410, + null + ], + "hints": { + "index": 5759 + } + }, + { + "items": [ + 3410.5, + null + ], + "hints": { + "index": 5760 + } + }, + { + "items": [ + 3411, + null + ], + "hints": { + "index": 5761 + } + }, + { + "items": [ + 3411.5, + null + ], + "hints": { + "index": 5762 + } + }, + { + "items": [ + 3412, + null + ], + "hints": { + "index": 5763 + } + }, + { + "items": [ + 3412.5, + null + ], + "hints": { + "index": 5764 + } + }, + { + "items": [ + 3413, + null + ], + "hints": { + "index": 5765 + } + }, + { + "items": [ + 3413.5, + null + ], + "hints": { + "index": 5766 + } + }, + { + "items": [ + 3414, + null + ], + "hints": { + "index": 5767 + } + }, + { + "items": [ + 3414.5, + null + ], + "hints": { + "index": 5768 + } + }, + { + "items": [ + 3415, + null + ], + "hints": { + "index": 5769 + } + }, + { + "items": [ + 3415.5, + null + ], + "hints": { + "index": 5770 + } + }, + { + "items": [ + 3416, + null + ], + "hints": { + "index": 5771 + } + }, + { + "items": [ + 3416.5, + null + ], + "hints": { + "index": 5772 + } + }, + { + "items": [ + 3417, + null + ], + "hints": { + "index": 5773 + } + }, + { + "items": [ + 3417.5, + null + ], + "hints": { + "index": 5774 + } + }, + { + "items": [ + 3418, + null + ], + "hints": { + "index": 5775 + } + }, + { + "items": [ + 3418.5, + null + ], + "hints": { + "index": 5776 + } + }, + { + "items": [ + 3419, + null + ], + "hints": { + "index": 5777 + } + }, + { + "items": [ + 3419.5, + null + ], + "hints": { + "index": 5778 + } + }, + { + "items": [ + 3420, + null + ], + "hints": { + "index": 5779 + } + }, + { + "items": [ + 3420.5, + null + ], + "hints": { + "index": 5780 + } + }, + { + "items": [ + 3421, + null + ], + "hints": { + "index": 5781 + } + }, + { + "items": [ + 3421.5, + null + ], + "hints": { + "index": 5782 + } + }, + { + "items": [ + 3422, + null + ], + "hints": { + "index": 5783 + } + }, + { + "items": [ + 3422.5, + null + ], + "hints": { + "index": 5784 + } + }, + { + "items": [ + 3423, + null + ], + "hints": { + "index": 5785 + } + }, + { + "items": [ + 3423.5, + null + ], + "hints": { + "index": 5786 + } + }, + { + "items": [ + 3424, + null + ], + "hints": { + "index": 5787 + } + }, + { + "items": [ + 3424.5, + null + ], + "hints": { + "index": 5788 + } + }, + { + "items": [ + 3425, + null + ], + "hints": { + "index": 5789 + } + }, + { + "items": [ + 3425.5, + null + ], + "hints": { + "index": 5790 + } + }, + { + "items": [ + 3426, + null + ], + "hints": { + "index": 5791 + } + }, + { + "items": [ + 3426.5, + null + ], + "hints": { + "index": 5792 + } + }, + { + "items": [ + 3427, + null + ], + "hints": { + "index": 5793 + } + }, + { + "items": [ + 3427.5, + null + ], + "hints": { + "index": 5794 + } + }, + { + "items": [ + 3428, + null + ], + "hints": { + "index": 5795 + } + }, + { + "items": [ + 3428.5, + null + ], + "hints": { + "index": 5796 + } + }, + { + "items": [ + 3429, + null + ], + "hints": { + "index": 5797 + } + }, + { + "items": [ + 3429.5, + null + ], + "hints": { + "index": 5798 + } + }, + { + "items": [ + 3430, + null + ], + "hints": { + "index": 5799 + } + }, + { + "items": [ + 3430.5, + null + ], + "hints": { + "index": 5800 + } + }, + { + "items": [ + 3431, + null + ], + "hints": { + "index": 5801 + } + }, + { + "items": [ + 3431.5, + null + ], + "hints": { + "index": 5802 + } + }, + { + "items": [ + 3432, + null + ], + "hints": { + "index": 5803 + } + }, + { + "items": [ + 3432.5, + null + ], + "hints": { + "index": 5804 + } + }, + { + "items": [ + 3433, + null + ], + "hints": { + "index": 5805 + } + }, + { + "items": [ + 3433.5, + null + ], + "hints": { + "index": 5806 + } + }, + { + "items": [ + 3434, + null + ], + "hints": { + "index": 5807 + } + }, + { + "items": [ + 3434.5, + null + ], + "hints": { + "index": 5808 + } + }, + { + "items": [ + 3435, + null + ], + "hints": { + "index": 5809 + } + }, + { + "items": [ + 3435.5, + null + ], + "hints": { + "index": 5810 + } + }, + { + "items": [ + 3436, + null + ], + "hints": { + "index": 5811 + } + }, + { + "items": [ + 3436.5, + null + ], + "hints": { + "index": 5812 + } + }, + { + "items": [ + 3437, + null + ], + "hints": { + "index": 5813 + } + }, + { + "items": [ + 3437.5, + null + ], + "hints": { + "index": 5814 + } + }, + { + "items": [ + 3438, + null + ], + "hints": { + "index": 5815 + } + }, + { + "items": [ + 3438.5, + null + ], + "hints": { + "index": 5816 + } + }, + { + "items": [ + 3439, + null + ], + "hints": { + "index": 5817 + } + }, + { + "items": [ + 3439.5, + null + ], + "hints": { + "index": 5818 + } + }, + { + "items": [ + 3440, + null + ], + "hints": { + "index": 5819 + } + }, + { + "items": [ + 3440.5, + null + ], + "hints": { + "index": 5820 + } + }, + { + "items": [ + 3441, + null + ], + "hints": { + "index": 5821 + } + }, + { + "items": [ + 3441.5, + null + ], + "hints": { + "index": 5822 + } + }, + { + "items": [ + 3442, + null + ], + "hints": { + "index": 5823 + } + }, + { + "items": [ + 3442.5, + null + ], + "hints": { + "index": 5824 + } + }, + { + "items": [ + 3443, + null + ], + "hints": { + "index": 5825 + } + }, + { + "items": [ + 3443.5, + null + ], + "hints": { + "index": 5826 + } + }, + { + "items": [ + 3444, + null + ], + "hints": { + "index": 5827 + } + }, + { + "items": [ + 3444.5, + null + ], + "hints": { + "index": 5828 + } + }, + { + "items": [ + 3445, + null + ], + "hints": { + "index": 5829 + } + }, + { + "items": [ + 3445.5, + null + ], + "hints": { + "index": 5830 + } + }, + { + "items": [ + 3446, + null + ], + "hints": { + "index": 5831 + } + }, + { + "items": [ + 3446.5, + null + ], + "hints": { + "index": 5832 + } + }, + { + "items": [ + 3447, + null + ], + "hints": { + "index": 5833 + } + }, + { + "items": [ + 3447.5, + null + ], + "hints": { + "index": 5834 + } + }, + { + "items": [ + 3448, + null + ], + "hints": { + "index": 5835 + } + }, + { + "items": [ + 3448.5, + null + ], + "hints": { + "index": 5836 + } + }, + { + "items": [ + 3449, + null + ], + "hints": { + "index": 5837 + } + }, + { + "items": [ + 3449.5, + null + ], + "hints": { + "index": 5838 + } + }, + { + "items": [ + 3450, + null + ], + "hints": { + "index": 5839 + } + }, + { + "items": [ + 3450.5, + null + ], + "hints": { + "index": 5840 + } + }, + { + "items": [ + 3451, + null + ], + "hints": { + "index": 5841 + } + }, + { + "items": [ + 3451.5, + null + ], + "hints": { + "index": 5842 + } + }, + { + "items": [ + 3452, + null + ], + "hints": { + "index": 5843 + } + }, + { + "items": [ + 3452.5, + null + ], + "hints": { + "index": 5844 + } + }, + { + "items": [ + 3453, + null + ], + "hints": { + "index": 5845 + } + }, + { + "items": [ + 3453.5, + null + ], + "hints": { + "index": 5846 + } + }, + { + "items": [ + 3454, + null + ], + "hints": { + "index": 5847 + } + }, + { + "items": [ + 3454.5, + null + ], + "hints": { + "index": 5848 + } + }, + { + "items": [ + 3455, + null + ], + "hints": { + "index": 5849 + } + }, + { + "items": [ + 3455.5, + null + ], + "hints": { + "index": 5850 + } + }, + { + "items": [ + 3456, + null + ], + "hints": { + "index": 5851 + } + }, + { + "items": [ + 3456.5, + null + ], + "hints": { + "index": 5852 + } + }, + { + "items": [ + 3457, + null + ], + "hints": { + "index": 5853 + } + }, + { + "items": [ + 3457.5, + null + ], + "hints": { + "index": 5854 + } + }, + { + "items": [ + 3458, + null + ], + "hints": { + "index": 5855 + } + }, + { + "items": [ + 3458.5, + null + ], + "hints": { + "index": 5856 + } + }, + { + "items": [ + 3459, + null + ], + "hints": { + "index": 5857 + } + }, + { + "items": [ + 3459.5, + null + ], + "hints": { + "index": 5858 + } + }, + { + "items": [ + 3460, + null + ], + "hints": { + "index": 5859 + } + }, + { + "items": [ + 3460.5, + null + ], + "hints": { + "index": 5860 + } + }, + { + "items": [ + 3461, + null + ], + "hints": { + "index": 5861 + } + }, + { + "items": [ + 3461.5, + null + ], + "hints": { + "index": 5862 + } + }, + { + "items": [ + 3462, + null + ], + "hints": { + "index": 5863 + } + }, + { + "items": [ + 3462.5, + null + ], + "hints": { + "index": 5864 + } + }, + { + "items": [ + 3463, + null + ], + "hints": { + "index": 5865 + } + }, + { + "items": [ + 3463.5, + null + ], + "hints": { + "index": 5866 + } + }, + { + "items": [ + 3464, + null + ], + "hints": { + "index": 5867 + } + }, + { + "items": [ + 3464.5, + null + ], + "hints": { + "index": 5868 + } + }, + { + "items": [ + 3465, + null + ], + "hints": { + "index": 5869 + } + }, + { + "items": [ + 3465.5, + null + ], + "hints": { + "index": 5870 + } + }, + { + "items": [ + 3466, + null + ], + "hints": { + "index": 5871 + } + }, + { + "items": [ + 3466.5, + null + ], + "hints": { + "index": 5872 + } + }, + { + "items": [ + 3467, + null + ], + "hints": { + "index": 5873 + } + }, + { + "items": [ + 3467.5, + null + ], + "hints": { + "index": 5874 + } + }, + { + "items": [ + 3468, + null + ], + "hints": { + "index": 5875 + } + }, + { + "items": [ + 3468.5, + null + ], + "hints": { + "index": 5876 + } + }, + { + "items": [ + 3469, + null + ], + "hints": { + "index": 5877 + } + }, + { + "items": [ + 3469.5, + null + ], + "hints": { + "index": 5878 + } + }, + { + "items": [ + 3470, + null + ], + "hints": { + "index": 5879 + } + }, + { + "items": [ + 3470.5, + null + ], + "hints": { + "index": 5880 + } + }, + { + "items": [ + 3471, + null + ], + "hints": { + "index": 5881 + } + }, + { + "items": [ + 3471.5, + null + ], + "hints": { + "index": 5882 + } + }, + { + "items": [ + 3472, + null + ], + "hints": { + "index": 5883 + } + }, + { + "items": [ + 3472.5, + null + ], + "hints": { + "index": 5884 + } + }, + { + "items": [ + 3473, + null + ], + "hints": { + "index": 5885 + } + }, + { + "items": [ + 3473.5, + null + ], + "hints": { + "index": 5886 + } + }, + { + "items": [ + 3474, + null + ], + "hints": { + "index": 5887 + } + }, + { + "items": [ + 3474.5, + null + ], + "hints": { + "index": 5888 + } + }, + { + "items": [ + 3475, + null + ], + "hints": { + "index": 5889 + } + }, + { + "items": [ + 3475.5, + null + ], + "hints": { + "index": 5890 + } + }, + { + "items": [ + 3476, + null + ], + "hints": { + "index": 5891 + } + }, + { + "items": [ + 3476.5, + null + ], + "hints": { + "index": 5892 + } + }, + { + "items": [ + 3477, + null + ], + "hints": { + "index": 5893 + } + }, + { + "items": [ + 3477.5, + null + ], + "hints": { + "index": 5894 + } + }, + { + "items": [ + 3478, + null + ], + "hints": { + "index": 5895 + } + }, + { + "items": [ + 3478.5, + null + ], + "hints": { + "index": 5896 + } + }, + { + "items": [ + 3479, + null + ], + "hints": { + "index": 5897 + } + }, + { + "items": [ + 3479.5, + null + ], + "hints": { + "index": 5898 + } + }, + { + "items": [ + 3480, + null + ], + "hints": { + "index": 5899 + } + }, + { + "items": [ + 3480.5, + null + ], + "hints": { + "index": 5900 + } + }, + { + "items": [ + 3481, + null + ], + "hints": { + "index": 5901 + } + }, + { + "items": [ + 3481.5, + null + ], + "hints": { + "index": 5902 + } + }, + { + "items": [ + 3482, + null + ], + "hints": { + "index": 5903 + } + }, + { + "items": [ + 3482.5, + null + ], + "hints": { + "index": 5904 + } + }, + { + "items": [ + 3483, + null + ], + "hints": { + "index": 5905 + } + }, + { + "items": [ + 3483.5, + null + ], + "hints": { + "index": 5906 + } + }, + { + "items": [ + 3484, + null + ], + "hints": { + "index": 5907 + } + }, + { + "items": [ + 3484.5, + null + ], + "hints": { + "index": 5908 + } + }, + { + "items": [ + 3485, + null + ], + "hints": { + "index": 5909 + } + }, + { + "items": [ + 3485.5, + null + ], + "hints": { + "index": 5910 + } + }, + { + "items": [ + 3486, + null + ], + "hints": { + "index": 5911 + } + }, + { + "items": [ + 3486.5, + null + ], + "hints": { + "index": 5912 + } + }, + { + "items": [ + 3487, + null + ], + "hints": { + "index": 5913 + } + }, + { + "items": [ + 3487.5, + null + ], + "hints": { + "index": 5914 + } + }, + { + "items": [ + 3488, + null + ], + "hints": { + "index": 5915 + } + }, + { + "items": [ + 3488.5, + null + ], + "hints": { + "index": 5916 + } + }, + { + "items": [ + 3489, + null + ], + "hints": { + "index": 5917 + } + }, + { + "items": [ + 3489.5, + null + ], + "hints": { + "index": 5918 + } + }, + { + "items": [ + 3490, + null + ], + "hints": { + "index": 5919 + } + }, + { + "items": [ + 3490.5, + null + ], + "hints": { + "index": 5920 + } + }, + { + "items": [ + 3491, + null + ], + "hints": { + "index": 5921 + } + }, + { + "items": [ + 3491.5, + null + ], + "hints": { + "index": 5922 + } + }, + { + "items": [ + 3492, + null + ], + "hints": { + "index": 5923 + } + }, + { + "items": [ + 3492.5, + null + ], + "hints": { + "index": 5924 + } + }, + { + "items": [ + 3493, + null + ], + "hints": { + "index": 5925 + } + }, + { + "items": [ + 3493.5, + null + ], + "hints": { + "index": 5926 + } + }, + { + "items": [ + 3494, + null + ], + "hints": { + "index": 5927 + } + }, + { + "items": [ + 3494.5, + null + ], + "hints": { + "index": 5928 + } + }, + { + "items": [ + 3495, + null + ], + "hints": { + "index": 5929 + } + }, + { + "items": [ + 3495.5, + null + ], + "hints": { + "index": 5930 + } + }, + { + "items": [ + 3496, + null + ], + "hints": { + "index": 5931 + } + }, + { + "items": [ + 3496.5, + null + ], + "hints": { + "index": 5932 + } + }, + { + "items": [ + 3497, + null + ], + "hints": { + "index": 5933 + } + }, + { + "items": [ + 3497.5, + null + ], + "hints": { + "index": 5934 + } + }, + { + "items": [ + 3498, + null + ], + "hints": { + "index": 5935 + } + }, + { + "items": [ + 3498.5, + null + ], + "hints": { + "index": 5936 + } + }, + { + "items": [ + 3499, + null + ], + "hints": { + "index": 5937 + } + }, + { + "items": [ + 3499.5, + null + ], + "hints": { + "index": 5938 + } + }, + { + "items": [ + 3500, + null + ], + "hints": { + "index": 5939 + } + }, + { + "items": [ + 3500.5, + 23.3958 + ], + "hints": { + "index": 5940 + } + }, + { + "items": [ + 3501, + 24.6078 + ], + "hints": { + "index": 5941 + } + }, + { + "items": [ + 3501.5, + 26.2598 + ], + "hints": { + "index": 5942 + } + }, + { + "items": [ + 3502, + 28.4345 + ], + "hints": { + "index": 5943 + } + }, + { + "items": [ + 3502.5, + 25.8762 + ], + "hints": { + "index": 5944 + } + }, + { + "items": [ + 3503, + 28.034 + ], + "hints": { + "index": 5945 + } + }, + { + "items": [ + 3503.5, + 27.2623 + ], + "hints": { + "index": 5946 + } + }, + { + "items": [ + 3504, + 32.0477 + ], + "hints": { + "index": 5947 + } + }, + { + "items": [ + 3504.5, + 32.3419 + ], + "hints": { + "index": 5948 + } + }, + { + "items": [ + 3505, + 31.1743 + ], + "hints": { + "index": 5949 + } + }, + { + "items": [ + 3505.5, + 30.2418 + ], + "hints": { + "index": 5950 + } + }, + { + "items": [ + 3506, + 23.1206 + ], + "hints": { + "index": 5951 + } + }, + { + "items": [ + 3506.5, + 22.3709 + ], + "hints": { + "index": 5952 + } + }, + { + "items": [ + 3507, + 22.5355 + ], + "hints": { + "index": 5953 + } + }, + { + "items": [ + 3507.5, + 28.7572 + ], + "hints": { + "index": 5954 + } + }, + { + "items": [ + 3508, + 30.5223 + ], + "hints": { + "index": 5955 + } + }, + { + "items": [ + 3508.5, + 27.2167 + ], + "hints": { + "index": 5956 + } + }, + { + "items": [ + 3509, + 27.6878 + ], + "hints": { + "index": 5957 + } + }, + { + "items": [ + 3509.5, + 29.6934 + ], + "hints": { + "index": 5958 + } + }, + { + "items": [ + 3510, + 30.1392 + ], + "hints": { + "index": 5959 + } + }, + { + "items": [ + 3510.5, + 26.0807 + ], + "hints": { + "index": 5960 + } + }, + { + "items": [ + 3511, + 21.5046 + ], + "hints": { + "index": 5961 + } + }, + { + "items": [ + 3511.5, + 25.505 + ], + "hints": { + "index": 5962 + } + }, + { + "items": [ + 3512, + 27.0011 + ], + "hints": { + "index": 5963 + } + }, + { + "items": [ + 3512.5, + 30.5469 + ], + "hints": { + "index": 5964 + } + }, + { + "items": [ + 3513, + 23.6138 + ], + "hints": { + "index": 5965 + } + }, + { + "items": [ + 3513.5, + 22.2453 + ], + "hints": { + "index": 5966 + } + }, + { + "items": [ + 3514, + 23.4946 + ], + "hints": { + "index": 5967 + } + }, + { + "items": [ + 3514.5, + 30.4547 + ], + "hints": { + "index": 5968 + } + }, + { + "items": [ + 3515, + 47.8422 + ], + "hints": { + "index": 5969 + } + }, + { + "items": [ + 3515.5, + 75.957 + ], + "hints": { + "index": 5970 + } + }, + { + "items": [ + 3516, + 36.4275 + ], + "hints": { + "index": 5971 + } + }, + { + "items": [ + 3516.5, + 28.6338 + ], + "hints": { + "index": 5972 + } + }, + { + "items": [ + 3517, + 18.3231 + ], + "hints": { + "index": 5973 + } + }, + { + "items": [ + 3517.5, + 10.2859 + ], + "hints": { + "index": 5974 + } + }, + { + "items": [ + 3518, + 6.6806 + ], + "hints": { + "index": 5975 + } + }, + { + "items": [ + 3518.5, + 5.468900203704834 + ], + "hints": { + "index": 5976 + } + }, + { + "items": [ + 3519, + 5.8654999732971191 + ], + "hints": { + "index": 5977 + } + }, + { + "items": [ + 3519.5, + 7.427299976348877 + ], + "hints": { + "index": 5978 + } + }, + { + "items": [ + 3520, + 11.244500160217283 + ], + "hints": { + "index": 5979 + } + }, + { + "items": [ + 3520.5, + 17.306600570678711 + ], + "hints": { + "index": 5980 + } + }, + { + "items": [ + 3521, + 23.19529914855957 + ], + "hints": { + "index": 5981 + } + }, + { + "items": [ + 3521.5, + 28.017799377441406 + ], + "hints": { + "index": 5982 + } + }, + { + "items": [ + 3522, + 30.739099502563477 + ], + "hints": { + "index": 5983 + } + }, + { + "items": [ + 3522.5, + 32.0675 + ], + "hints": { + "index": 5984 + } + }, + { + "items": [ + 3523, + 29.687400817871097 + ], + "hints": { + "index": 5985 + } + }, + { + "items": [ + 3523.5, + 31.6233 + ], + "hints": { + "index": 5986 + } + }, + { + "items": [ + 3524, + 29.654800415039063 + ], + "hints": { + "index": 5987 + } + }, + { + "items": [ + 3524.5, + 26.638200759887695 + ], + "hints": { + "index": 5988 + } + }, + { + "items": [ + 3525, + 21.388599395751953 + ], + "hints": { + "index": 5989 + } + }, + { + "items": [ + 3525.5, + 20.7731 + ], + "hints": { + "index": 5990 + } + }, + { + "items": [ + 3526, + 24.013399124145508 + ], + "hints": { + "index": 5991 + } + }, + { + "items": [ + 3526.5, + 31.172300338745117 + ], + "hints": { + "index": 5992 + } + }, + { + "items": [ + 3527, + 32.5179 + ], + "hints": { + "index": 5993 + } + }, + { + "items": [ + 3527.5, + 32.867099761962891 + ], + "hints": { + "index": 5994 + } + }, + { + "items": [ + 3528, + 31.819000244140625 + ], + "hints": { + "index": 5995 + } + }, + { + "items": [ + 3528.5, + 39.052299499511719 + ], + "hints": { + "index": 5996 + } + }, + { + "items": [ + 3529, + 38.489498138427734 + ], + "hints": { + "index": 5997 + } + }, + { + "items": [ + 3529.5, + 40.2384 + ], + "hints": { + "index": 5998 + } + }, + { + "items": [ + 3530, + 30.63279914855957 + ], + "hints": { + "index": 5999 + } + }, + { + "items": [ + 3530.5, + 32.924900054931641 + ], + "hints": { + "index": 6000 + } + }, + { + "items": [ + 3531, + 33.181800842285156 + ], + "hints": { + "index": 6001 + } + }, + { + "items": [ + 3531.5, + 32.102699279785156 + ], + "hints": { + "index": 6002 + } + }, + { + "items": [ + 3532, + 17.6336 + ], + "hints": { + "index": 6003 + } + }, + { + "items": [ + 3532.5, + 12.961799621582031 + ], + "hints": { + "index": 6004 + } + }, + { + "items": [ + 3533, + 12.7322 + ], + "hints": { + "index": 6005 + } + }, + { + "items": [ + 3533.5, + 16.590099334716797 + ], + "hints": { + "index": 6006 + } + }, + { + "items": [ + 3534, + 23.5863 + ], + "hints": { + "index": 6007 + } + }, + { + "items": [ + 3534.5, + 27.732099533081055 + ], + "hints": { + "index": 6008 + } + }, + { + "items": [ + 3535, + 18.8128 + ], + "hints": { + "index": 6009 + } + }, + { + "items": [ + 3535.5, + 10.69760036468506 + ], + "hints": { + "index": 6010 + } + }, + { + "items": [ + 3536, + 9.3265 + ], + "hints": { + "index": 6011 + } + }, + { + "items": [ + 3536.5, + 10.210599899291992 + ], + "hints": { + "index": 6012 + } + }, + { + "items": [ + 3537, + 14.496 + ], + "hints": { + "index": 6013 + } + }, + { + "items": [ + 3537.5, + 10.948399543762209 + ], + "hints": { + "index": 6014 + } + }, + { + "items": [ + 3538, + 10.5542 + ], + "hints": { + "index": 6015 + } + }, + { + "items": [ + 3538.5, + 10.5639 + ], + "hints": { + "index": 6016 + } + }, + { + "items": [ + 3539, + 17.1843 + ], + "hints": { + "index": 6017 + } + }, + { + "items": [ + 3539.5, + 18.545799255371097 + ], + "hints": { + "index": 6018 + } + }, + { + "items": [ + 3540, + 15.17990016937256 + ], + "hints": { + "index": 6019 + } + }, + { + "items": [ + 3540.5, + 13.4368 + ], + "hints": { + "index": 6020 + } + }, + { + "items": [ + 3541, + 11.0076 + ], + "hints": { + "index": 6021 + } + }, + { + "items": [ + 3541.5, + 10.8383 + ], + "hints": { + "index": 6022 + } + }, + { + "items": [ + 3542, + 11.520700454711914 + ], + "hints": { + "index": 6023 + } + }, + { + "items": [ + 3542.5, + 10.331 + ], + "hints": { + "index": 6024 + } + }, + { + "items": [ + 3543, + 8.4677000045776367 + ], + "hints": { + "index": 6025 + } + }, + { + "items": [ + 3543.5, + 7.1290998458862305 + ], + "hints": { + "index": 6026 + } + }, + { + "items": [ + 3544, + 6.9973998069763184 + ], + "hints": { + "index": 6027 + } + }, + { + "items": [ + 3544.5, + 8.5403003692626953 + ], + "hints": { + "index": 6028 + } + }, + { + "items": [ + 3545, + 9.3762998580932617 + ], + "hints": { + "index": 6029 + } + }, + { + "items": [ + 3545.5, + 10.2012 + ], + "hints": { + "index": 6030 + } + }, + { + "items": [ + 3546, + 9.87440013885498 + ], + "hints": { + "index": 6031 + } + }, + { + "items": [ + 3546.5, + 9.2072 + ], + "hints": { + "index": 6032 + } + }, + { + "items": [ + 3547, + 9.8392000198364258 + ], + "hints": { + "index": 6033 + } + }, + { + "items": [ + 3547.5, + 9.5829 + ], + "hints": { + "index": 6034 + } + }, + { + "items": [ + 3548, + 11.138199806213381 + ], + "hints": { + "index": 6035 + } + }, + { + "items": [ + 3548.5, + 13.48289966583252 + ], + "hints": { + "index": 6036 + } + }, + { + "items": [ + 3549, + 13.708100318908691 + ], + "hints": { + "index": 6037 + } + }, + { + "items": [ + 3549.5, + 10.242 + ], + "hints": { + "index": 6038 + } + }, + { + "items": [ + 3550, + 8.8089 + ], + "hints": { + "index": 6039 + } + }, + { + "items": [ + 3550.5, + 8.3928 + ], + "hints": { + "index": 6040 + } + }, + { + "items": [ + 3551, + 10.436100006103516 + ], + "hints": { + "index": 6041 + } + }, + { + "items": [ + 3551.5, + 11.5162 + ], + "hints": { + "index": 6042 + } + }, + { + "items": [ + 3552, + 13.0021 + ], + "hints": { + "index": 6043 + } + }, + { + "items": [ + 3552.5, + 11.253700256347656 + ], + "hints": { + "index": 6044 + } + }, + { + "items": [ + 3553, + 10.686 + ], + "hints": { + "index": 6045 + } + }, + { + "items": [ + 3553.5, + 10.0386 + ], + "hints": { + "index": 6046 + } + }, + { + "items": [ + 3554, + 10.856800079345703 + ], + "hints": { + "index": 6047 + } + }, + { + "items": [ + 3554.5, + 9.4988 + ], + "hints": { + "index": 6048 + } + }, + { + "items": [ + 3555, + 8.7248001098632813 + ], + "hints": { + "index": 6049 + } + }, + { + "items": [ + 3555.5, + 9.1837 + ], + "hints": { + "index": 6050 + } + }, + { + "items": [ + 3556, + 9.8928003311157227 + ], + "hints": { + "index": 6051 + } + }, + { + "items": [ + 3556.5, + 10.6468 + ], + "hints": { + "index": 6052 + } + }, + { + "items": [ + 3557, + 11.5813 + ], + "hints": { + "index": 6053 + } + }, + { + "items": [ + 3557.5, + 13.5423002243042 + ], + "hints": { + "index": 6054 + } + }, + { + "items": [ + 3558, + 16.9893 + ], + "hints": { + "index": 6055 + } + }, + { + "items": [ + 3558.5, + 19.518100738525391 + ], + "hints": { + "index": 6056 + } + }, + { + "items": [ + 3559, + 23.3453 + ], + "hints": { + "index": 6057 + } + }, + { + "items": [ + 3559.5, + 23.6704 + ], + "hints": { + "index": 6058 + } + }, + { + "items": [ + 3560, + 19.1402 + ], + "hints": { + "index": 6059 + } + }, + { + "items": [ + 3560.5, + 14.709500312805176 + ], + "hints": { + "index": 6060 + } + }, + { + "items": [ + 3561, + 10.1707 + ], + "hints": { + "index": 6061 + } + }, + { + "items": [ + 3561.5, + 8.5544 + ], + "hints": { + "index": 6062 + } + }, + { + "items": [ + 3562, + 8.3221 + ], + "hints": { + "index": 6063 + } + }, + { + "items": [ + 3562.5, + 9.3368 + ], + "hints": { + "index": 6064 + } + }, + { + "items": [ + 3563, + 10.3076 + ], + "hints": { + "index": 6065 + } + }, + { + "items": [ + 3563.5, + 10.8594 + ], + "hints": { + "index": 6066 + } + }, + { + "items": [ + 3564, + 12.165 + ], + "hints": { + "index": 6067 + } + }, + { + "items": [ + 3564.5, + 12.3559 + ], + "hints": { + "index": 6068 + } + }, + { + "items": [ + 3565, + 12.74 + ], + "hints": { + "index": 6069 + } + }, + { + "items": [ + 3565.5, + 11.2654 + ], + "hints": { + "index": 6070 + } + }, + { + "items": [ + 3566, + 11.652299880981444 + ], + "hints": { + "index": 6071 + } + }, + { + "items": [ + 3566.5, + 13.23330020904541 + ], + "hints": { + "index": 6072 + } + }, + { + "items": [ + 3567, + 16.9537 + ], + "hints": { + "index": 6073 + } + }, + { + "items": [ + 3567.5, + 17.5939 + ], + "hints": { + "index": 6074 + } + }, + { + "items": [ + 3568, + 16.15 + ], + "hints": { + "index": 6075 + } + }, + { + "items": [ + 3568.5, + 16.0611 + ], + "hints": { + "index": 6076 + } + }, + { + "items": [ + 3569, + 18.4515 + ], + "hints": { + "index": 6077 + } + }, + { + "items": [ + 3569.5, + 14.988499641418455 + ], + "hints": { + "index": 6078 + } + }, + { + "items": [ + 3570, + 11.68809986114502 + ], + "hints": { + "index": 6079 + } + }, + { + "items": [ + 3570.5, + 10.146400451660156 + ], + "hints": { + "index": 6080 + } + }, + { + "items": [ + 3571, + 10.7529 + ], + "hints": { + "index": 6081 + } + }, + { + "items": [ + 3571.5, + 12.3306 + ], + "hints": { + "index": 6082 + } + }, + { + "items": [ + 3572, + 13.701299667358398 + ], + "hints": { + "index": 6083 + } + }, + { + "items": [ + 3572.5, + 15.288100242614746 + ], + "hints": { + "index": 6084 + } + }, + { + "items": [ + 3573, + 17.446300506591797 + ], + "hints": { + "index": 6085 + } + }, + { + "items": [ + 3573.5, + 16.946399688720703 + ], + "hints": { + "index": 6086 + } + }, + { + "items": [ + 3574, + 14.95699977874756 + ], + "hints": { + "index": 6087 + } + }, + { + "items": [ + 3574.5, + 12.290900230407717 + ], + "hints": { + "index": 6088 + } + }, + { + "items": [ + 3575, + 14.112199783325195 + ], + "hints": { + "index": 6089 + } + }, + { + "items": [ + 3575.5, + 17.0849 + ], + "hints": { + "index": 6090 + } + }, + { + "items": [ + 3576, + 20.898500442504883 + ], + "hints": { + "index": 6091 + } + }, + { + "items": [ + 3576.5, + 16.138900756835938 + ], + "hints": { + "index": 6092 + } + }, + { + "items": [ + 3577, + 11.124500274658203 + ], + "hints": { + "index": 6093 + } + }, + { + "items": [ + 3577.5, + 11.674699783325195 + ], + "hints": { + "index": 6094 + } + }, + { + "items": [ + 3578, + 14.159799575805664 + ], + "hints": { + "index": 6095 + } + }, + { + "items": [ + 3578.5, + 19.6384 + ], + "hints": { + "index": 6096 + } + }, + { + "items": [ + 3579, + 18.303800582885746 + ], + "hints": { + "index": 6097 + } + }, + { + "items": [ + 3579.5, + 13.7939 + ], + "hints": { + "index": 6098 + } + }, + { + "items": [ + 3580, + 13.191100120544434 + ], + "hints": { + "index": 6099 + } + }, + { + "items": [ + 3580.5, + 11.28909969329834 + ], + "hints": { + "index": 6100 + } + }, + { + "items": [ + 3581, + 11.0063 + ], + "hints": { + "index": 6101 + } + }, + { + "items": [ + 3581.5, + 10.7465 + ], + "hints": { + "index": 6102 + } + }, + { + "items": [ + 3582, + 10.996100425720217 + ], + "hints": { + "index": 6103 + } + }, + { + "items": [ + 3582.5, + 9.0158996582031232 + ], + "hints": { + "index": 6104 + } + }, + { + "items": [ + 3583, + 6.5876 + ], + "hints": { + "index": 6105 + } + }, + { + "items": [ + 3583.5, + 6.2482 + ], + "hints": { + "index": 6106 + } + }, + { + "items": [ + 3584, + 7.8980998992919922 + ], + "hints": { + "index": 6107 + } + }, + { + "items": [ + 3584.5, + 12.300700187683104 + ], + "hints": { + "index": 6108 + } + }, + { + "items": [ + 3585, + 18.8373 + ], + "hints": { + "index": 6109 + } + }, + { + "items": [ + 3585.5, + 20.8395 + ], + "hints": { + "index": 6110 + } + }, + { + "items": [ + 3586, + 20.985799789428711 + ], + "hints": { + "index": 6111 + } + }, + { + "items": [ + 3586.5, + 21.3026 + ], + "hints": { + "index": 6112 + } + }, + { + "items": [ + 3587, + 26.5576 + ], + "hints": { + "index": 6113 + } + }, + { + "items": [ + 3587.5, + 31.926599502563477 + ], + "hints": { + "index": 6114 + } + }, + { + "items": [ + 3588, + 38.189300537109375 + ], + "hints": { + "index": 6115 + } + }, + { + "items": [ + 3588.5, + 42.9665 + ], + "hints": { + "index": 6116 + } + }, + { + "items": [ + 3589, + 41.767898559570313 + ], + "hints": { + "index": 6117 + } + }, + { + "items": [ + 3589.5, + 38.7543 + ], + "hints": { + "index": 6118 + } + }, + { + "items": [ + 3590, + 33.1974983215332 + ], + "hints": { + "index": 6119 + } + }, + { + "items": [ + 3590.5, + 29.781700134277344 + ], + "hints": { + "index": 6120 + } + }, + { + "items": [ + 3591, + 29.520700454711911 + ], + "hints": { + "index": 6121 + } + }, + { + "items": [ + 3591.5, + 30.527000427246097 + ], + "hints": { + "index": 6122 + } + }, + { + "items": [ + 3592, + 34.2239 + ], + "hints": { + "index": 6123 + } + }, + { + "items": [ + 3592.5, + 25.11090087890625 + ], + "hints": { + "index": 6124 + } + }, + { + "items": [ + 3593, + 13.7055 + ], + "hints": { + "index": 6125 + } + }, + { + "items": [ + 3593.5, + 9.7729 + ], + "hints": { + "index": 6126 + } + }, + { + "items": [ + 3594, + 7.0363001823425293 + ], + "hints": { + "index": 6127 + } + }, + { + "items": [ + 3594.5, + 6.0928 + ], + "hints": { + "index": 6128 + } + }, + { + "items": [ + 3595, + 4.8534998893737793 + ], + "hints": { + "index": 6129 + } + }, + { + "items": [ + 3595.5, + 4.648900032043457 + ], + "hints": { + "index": 6130 + } + }, + { + "items": [ + 3596, + 5.329 + ], + "hints": { + "index": 6131 + } + }, + { + "items": [ + 3596.5, + 7.2553000450134268 + ], + "hints": { + "index": 6132 + } + }, + { + "items": [ + 3597, + 7.7154998779296884 + ], + "hints": { + "index": 6133 + } + }, + { + "items": [ + 3597.5, + 7.9096999168396 + ], + "hints": { + "index": 6134 + } + }, + { + "items": [ + 3598, + 8.6532 + ], + "hints": { + "index": 6135 + } + }, + { + "items": [ + 3598.5, + 12.093600273132324 + ], + "hints": { + "index": 6136 + } + }, + { + "items": [ + 3599, + 13.0597 + ], + "hints": { + "index": 6137 + } + }, + { + "items": [ + 3599.5, + 11.5109 + ], + "hints": { + "index": 6138 + } + }, + { + "items": [ + 3600, + 8.5680999755859375 + ], + "hints": { + "index": 6139 + } + }, + { + "items": [ + 3600.5, + 6.4352998733520508 + ], + "hints": { + "index": 6140 + } + }, + { + "items": [ + 3601, + 5.1816000938415527 + ], + "hints": { + "index": 6141 + } + }, + { + "items": [ + 3601.5, + 4.9840998649597168 + ], + "hints": { + "index": 6142 + } + }, + { + "items": [ + 3602, + 4.8948001861572266 + ], + "hints": { + "index": 6143 + } + }, + { + "items": [ + 3602.5, + 5.1170997619628906 + ], + "hints": { + "index": 6144 + } + }, + { + "items": [ + 3603, + 6.2811999320983887 + ], + "hints": { + "index": 6145 + } + }, + { + "items": [ + 3603.5, + 8.0785 + ], + "hints": { + "index": 6146 + } + }, + { + "items": [ + 3604, + 9.2959 + ], + "hints": { + "index": 6147 + } + }, + { + "items": [ + 3604.5, + 7.8190999031066895 + ], + "hints": { + "index": 6148 + } + }, + { + "items": [ + 3605, + 10.0367 + ], + "hints": { + "index": 6149 + } + }, + { + "items": [ + 3605.5, + 15.919 + ], + "hints": { + "index": 6150 + } + }, + { + "items": [ + 3606, + 29.553699493408203 + ], + "hints": { + "index": 6151 + } + }, + { + "items": [ + 3606.5, + 29.8174991607666 + ], + "hints": { + "index": 6152 + } + }, + { + "items": [ + 3607, + 32.0938 + ], + "hints": { + "index": 6153 + } + }, + { + "items": [ + 3607.5, + 33.8364 + ], + "hints": { + "index": 6154 + } + }, + { + "items": [ + 3608, + 37.858699798583984 + ], + "hints": { + "index": 6155 + } + }, + { + "items": [ + 3608.5, + 31.623699188232425 + ], + "hints": { + "index": 6156 + } + }, + { + "items": [ + 3609, + 20.4005 + ], + "hints": { + "index": 6157 + } + }, + { + "items": [ + 3609.5, + 16.2615 + ], + "hints": { + "index": 6158 + } + }, + { + "items": [ + 3610, + 14.765800476074221 + ], + "hints": { + "index": 6159 + } + }, + { + "items": [ + 3610.5, + 11.7946 + ], + "hints": { + "index": 6160 + } + }, + { + "items": [ + 3611, + 10.6768 + ], + "hints": { + "index": 6161 + } + }, + { + "items": [ + 3611.5, + 9.01259994506836 + ], + "hints": { + "index": 6162 + } + }, + { + "items": [ + 3612, + 8.4207000732421875 + ], + "hints": { + "index": 6163 + } + }, + { + "items": [ + 3612.5, + 7.4084 + ], + "hints": { + "index": 6164 + } + }, + { + "items": [ + 3613, + 7.311500072479248 + ], + "hints": { + "index": 6165 + } + }, + { + "items": [ + 3613.5, + 8.8168 + ], + "hints": { + "index": 6166 + } + }, + { + "items": [ + 3614, + 9.3331003189086914 + ], + "hints": { + "index": 6167 + } + }, + { + "items": [ + 3614.5, + 9.5372 + ], + "hints": { + "index": 6168 + } + }, + { + "items": [ + 3615, + 8.3962001800537109 + ], + "hints": { + "index": 6169 + } + }, + { + "items": [ + 3615.5, + 6.4271998405456543 + ], + "hints": { + "index": 6170 + } + }, + { + "items": [ + 3616, + 4.8831000328063965 + ], + "hints": { + "index": 6171 + } + }, + { + "items": [ + 3616.5, + 4.0486 + ], + "hints": { + "index": 6172 + } + }, + { + "items": [ + 3617, + 3.9691 + ], + "hints": { + "index": 6173 + } + }, + { + "items": [ + 3617.5, + 4.0432 + ], + "hints": { + "index": 6174 + } + }, + { + "items": [ + 3618, + 4.31689977645874 + ], + "hints": { + "index": 6175 + } + }, + { + "items": [ + 3618.5, + 4.3580999374389648 + ], + "hints": { + "index": 6176 + } + }, + { + "items": [ + 3619, + 4.01170015335083 + ], + "hints": { + "index": 6177 + } + }, + { + "items": [ + 3619.5, + 4.3249001502990723 + ], + "hints": { + "index": 6178 + } + }, + { + "items": [ + 3620, + 5.8484997749328613 + ], + "hints": { + "index": 6179 + } + }, + { + "items": [ + 3620.5, + 8.979100227355957 + ], + "hints": { + "index": 6180 + } + }, + { + "items": [ + 3621, + 11.963399887084959 + ], + "hints": { + "index": 6181 + } + }, + { + "items": [ + 3621.5, + 6.7390999794006348 + ], + "hints": { + "index": 6182 + } + }, + { + "items": [ + 3622, + 4.8369998931884766 + ], + "hints": { + "index": 6183 + } + }, + { + "items": [ + 3622.5, + 4.0587 + ], + "hints": { + "index": 6184 + } + }, + { + "items": [ + 3623, + 4.2407999038696289 + ], + "hints": { + "index": 6185 + } + }, + { + "items": [ + 3623.5, + 4.4834 + ], + "hints": { + "index": 6186 + } + }, + { + "items": [ + 3624, + 4.0472002029418945 + ], + "hints": { + "index": 6187 + } + }, + { + "items": [ + 3624.5, + 4.5365 + ], + "hints": { + "index": 6188 + } + }, + { + "items": [ + 3625, + 5.3643999099731445 + ], + "hints": { + "index": 6189 + } + }, + { + "items": [ + 3625.5, + 6.2298 + ], + "hints": { + "index": 6190 + } + }, + { + "items": [ + 3626, + 5.3565001487731934 + ], + "hints": { + "index": 6191 + } + }, + { + "items": [ + 3626.5, + 4.4958000183105469 + ], + "hints": { + "index": 6192 + } + }, + { + "items": [ + 3627, + 4.5079998970031738 + ], + "hints": { + "index": 6193 + } + }, + { + "items": [ + 3627.5, + 4.9028000831604 + ], + "hints": { + "index": 6194 + } + }, + { + "items": [ + 3628, + 5.8891000747680664 + ], + "hints": { + "index": 6195 + } + }, + { + "items": [ + 3628.5, + 6.6125998497009277 + ], + "hints": { + "index": 6196 + } + }, + { + "items": [ + 3629, + 6.4916000366210938 + ], + "hints": { + "index": 6197 + } + }, + { + "items": [ + 3629.5, + 6.005000114440918 + ], + "hints": { + "index": 6198 + } + }, + { + "items": [ + 3630, + 5.1080999374389648 + ], + "hints": { + "index": 6199 + } + }, + { + "items": [ + 3630.5, + 5.3972997665405273 + ], + "hints": { + "index": 6200 + } + }, + { + "items": [ + 3631, + 5.7262001037597656 + ], + "hints": { + "index": 6201 + } + }, + { + "items": [ + 3631.5, + 7.2520999908447266 + ], + "hints": { + "index": 6202 + } + }, + { + "items": [ + 3632, + 7.8916001319885245 + ], + "hints": { + "index": 6203 + } + }, + { + "items": [ + 3632.5, + 7.0163 + ], + "hints": { + "index": 6204 + } + }, + { + "items": [ + 3633, + 5.9310998916625977 + ], + "hints": { + "index": 6205 + } + }, + { + "items": [ + 3633.5, + 5.5175 + ], + "hints": { + "index": 6206 + } + }, + { + "items": [ + 3634, + 5.185999870300293 + ], + "hints": { + "index": 6207 + } + }, + { + "items": [ + 3634.5, + 4.5954 + ], + "hints": { + "index": 6208 + } + }, + { + "items": [ + 3635, + 4.6848 + ], + "hints": { + "index": 6209 + } + }, + { + "items": [ + 3635.5, + 6.0156002044677734 + ], + "hints": { + "index": 6210 + } + }, + { + "items": [ + 3636, + 8.7967 + ], + "hints": { + "index": 6211 + } + }, + { + "items": [ + 3636.5, + 9.6785 + ], + "hints": { + "index": 6212 + } + }, + { + "items": [ + 3637, + 8.8269 + ], + "hints": { + "index": 6213 + } + }, + { + "items": [ + 3637.5, + 7.176 + ], + "hints": { + "index": 6214 + } + }, + { + "items": [ + 3638, + 6.0186 + ], + "hints": { + "index": 6215 + } + }, + { + "items": [ + 3638.5, + 5.236 + ], + "hints": { + "index": 6216 + } + }, + { + "items": [ + 3639, + 4.8743 + ], + "hints": { + "index": 6217 + } + }, + { + "items": [ + 3639.5, + 4.6369 + ], + "hints": { + "index": 6218 + } + }, + { + "items": [ + 3640, + 4.3673 + ], + "hints": { + "index": 6219 + } + }, + { + "items": [ + 3640.5, + 4.8309 + ], + "hints": { + "index": 6220 + } + }, + { + "items": [ + 3641, + 5.0406 + ], + "hints": { + "index": 6221 + } + }, + { + "items": [ + 3641.5, + 5.2867 + ], + "hints": { + "index": 6222 + } + }, + { + "items": [ + 3642, + 4.60860013961792 + ], + "hints": { + "index": 6223 + } + }, + { + "items": [ + 3642.5, + 4.680300235748291 + ], + "hints": { + "index": 6224 + } + }, + { + "items": [ + 3643, + 4.5258 + ], + "hints": { + "index": 6225 + } + }, + { + "items": [ + 3643.5, + 4.6283 + ], + "hints": { + "index": 6226 + } + }, + { + "items": [ + 3644, + 4.443 + ], + "hints": { + "index": 6227 + } + }, + { + "items": [ + 3644.5, + 4.5753002166748047 + ], + "hints": { + "index": 6228 + } + }, + { + "items": [ + 3645, + 4.5553998947143555 + ], + "hints": { + "index": 6229 + } + }, + { + "items": [ + 3645.5, + 4.6739997863769531 + ], + "hints": { + "index": 6230 + } + }, + { + "items": [ + 3646, + 4.7582001686096191 + ], + "hints": { + "index": 6231 + } + }, + { + "items": [ + 3646.5, + 5.56689977645874 + ], + "hints": { + "index": 6232 + } + }, + { + "items": [ + 3647, + 6.0296998023986816 + ], + "hints": { + "index": 6233 + } + }, + { + "items": [ + 3647.5, + 5.8294000625610352 + ], + "hints": { + "index": 6234 + } + }, + { + "items": [ + 3648, + 4.7754001617431641 + ], + "hints": { + "index": 6235 + } + }, + { + "items": [ + 3648.5, + 4.703700065612793 + ], + "hints": { + "index": 6236 + } + }, + { + "items": [ + 3649, + 5.4991 + ], + "hints": { + "index": 6237 + } + }, + { + "items": [ + 3649.5, + 7.1244001388549805 + ], + "hints": { + "index": 6238 + } + }, + { + "items": [ + 3650, + 7.873499870300293 + ], + "hints": { + "index": 6239 + } + }, + { + "items": [ + 3650.5, + 6.5555000305175781 + ], + "hints": { + "index": 6240 + } + }, + { + "items": [ + 3651, + 6.0419998168945313 + ], + "hints": { + "index": 6241 + } + }, + { + "items": [ + 3651.5, + 5.0027 + ], + "hints": { + "index": 6242 + } + }, + { + "items": [ + 3652, + 4.6881 + ], + "hints": { + "index": 6243 + } + }, + { + "items": [ + 3652.5, + 4.3242998123168945 + ], + "hints": { + "index": 6244 + } + }, + { + "items": [ + 3653, + 4.3036 + ], + "hints": { + "index": 6245 + } + }, + { + "items": [ + 3653.5, + 4.3345 + ], + "hints": { + "index": 6246 + } + }, + { + "items": [ + 3654, + 4.3611998558044434 + ], + "hints": { + "index": 6247 + } + }, + { + "items": [ + 3654.5, + 4.6547999382019043 + ], + "hints": { + "index": 6248 + } + }, + { + "items": [ + 3655, + 4.5635 + ], + "hints": { + "index": 6249 + } + }, + { + "items": [ + 3655.5, + 4.3376 + ], + "hints": { + "index": 6250 + } + }, + { + "items": [ + 3656, + 4.1273999214172363 + ], + "hints": { + "index": 6251 + } + }, + { + "items": [ + 3656.5, + 3.9256999492645264 + ], + "hints": { + "index": 6252 + } + }, + { + "items": [ + 3657, + 3.7955 + ], + "hints": { + "index": 6253 + } + }, + { + "items": [ + 3657.5, + 3.9465 + ], + "hints": { + "index": 6254 + } + }, + { + "items": [ + 3658, + 4.2107000350952148 + ], + "hints": { + "index": 6255 + } + }, + { + "items": [ + 3658.5, + 4.7084 + ], + "hints": { + "index": 6256 + } + }, + { + "items": [ + 3659, + 4.4684000015258789 + ], + "hints": { + "index": 6257 + } + }, + { + "items": [ + 3659.5, + 4.8849000930786133 + ], + "hints": { + "index": 6258 + } + }, + { + "items": [ + 3660, + 4.516200065612793 + ], + "hints": { + "index": 6259 + } + }, + { + "items": [ + 3660.5, + 4.9028 + ], + "hints": { + "index": 6260 + } + }, + { + "items": [ + 3661, + 4.5824 + ], + "hints": { + "index": 6261 + } + }, + { + "items": [ + 3661.5, + 5.0469 + ], + "hints": { + "index": 6262 + } + }, + { + "items": [ + 3662, + 5.0875 + ], + "hints": { + "index": 6263 + } + }, + { + "items": [ + 3662.5, + 5.1598000526428223 + ], + "hints": { + "index": 6264 + } + }, + { + "items": [ + 3663, + 4.9240999221801758 + ], + "hints": { + "index": 6265 + } + }, + { + "items": [ + 3663.5, + 4.6077 + ], + "hints": { + "index": 6266 + } + }, + { + "items": [ + 3664, + 4.3783 + ], + "hints": { + "index": 6267 + } + }, + { + "items": [ + 3664.5, + 4.30079984664917 + ], + "hints": { + "index": 6268 + } + }, + { + "items": [ + 3665, + 4.6002001762390137 + ], + "hints": { + "index": 6269 + } + }, + { + "items": [ + 3665.5, + 4.7669 + ], + "hints": { + "index": 6270 + } + }, + { + "items": [ + 3666, + 4.87470006942749 + ], + "hints": { + "index": 6271 + } + }, + { + "items": [ + 3666.5, + 4.4755 + ], + "hints": { + "index": 6272 + } + }, + { + "items": [ + 3667, + 4.40910005569458 + ], + "hints": { + "index": 6273 + } + }, + { + "items": [ + 3667.5, + 4.0247001647949219 + ], + "hints": { + "index": 6274 + } + }, + { + "items": [ + 3668, + 4.01800012588501 + ], + "hints": { + "index": 6275 + } + }, + { + "items": [ + 3668.5, + 3.9331998825073242 + ], + "hints": { + "index": 6276 + } + }, + { + "items": [ + 3669, + 3.9746 + ], + "hints": { + "index": 6277 + } + }, + { + "items": [ + 3669.5, + 3.9800999164581294 + ], + "hints": { + "index": 6278 + } + }, + { + "items": [ + 3670, + 4.0967 + ], + "hints": { + "index": 6279 + } + }, + { + "items": [ + 3670.5, + 4.1732 + ], + "hints": { + "index": 6280 + } + }, + { + "items": [ + 3671, + 4.2544 + ], + "hints": { + "index": 6281 + } + }, + { + "items": [ + 3671.5, + 4.0876002311706543 + ], + "hints": { + "index": 6282 + } + }, + { + "items": [ + 3672, + 4.1606998443603516 + ], + "hints": { + "index": 6283 + } + }, + { + "items": [ + 3672.5, + 4.0981998443603516 + ], + "hints": { + "index": 6284 + } + }, + { + "items": [ + 3673, + 3.9955 + ], + "hints": { + "index": 6285 + } + }, + { + "items": [ + 3673.5, + 3.8299000263214111 + ], + "hints": { + "index": 6286 + } + }, + { + "items": [ + 3674, + 3.8452999591827393 + ], + "hints": { + "index": 6287 + } + }, + { + "items": [ + 3674.5, + 3.9802 + ], + "hints": { + "index": 6288 + } + }, + { + "items": [ + 3675, + 4.1486 + ], + "hints": { + "index": 6289 + } + }, + { + "items": [ + 3675.5, + 4.1630001068115234 + ], + "hints": { + "index": 6290 + } + }, + { + "items": [ + 3676, + 4.36359977722168 + ], + "hints": { + "index": 6291 + } + }, + { + "items": [ + 3676.5, + 4.3349 + ], + "hints": { + "index": 6292 + } + }, + { + "items": [ + 3677, + 4.2162 + ], + "hints": { + "index": 6293 + } + }, + { + "items": [ + 3677.5, + 4.0127 + ], + "hints": { + "index": 6294 + } + }, + { + "items": [ + 3678, + 4.0331997871398926 + ], + "hints": { + "index": 6295 + } + }, + { + "items": [ + 3678.5, + 4.0931000709533691 + ], + "hints": { + "index": 6296 + } + }, + { + "items": [ + 3679, + 3.9304 + ], + "hints": { + "index": 6297 + } + }, + { + "items": [ + 3679.5, + 3.6071000099182129 + ], + "hints": { + "index": 6298 + } + }, + { + "items": [ + 3680, + 3.3951 + ], + "hints": { + "index": 6299 + } + }, + { + "items": [ + 3680.5, + 3.4494 + ], + "hints": { + "index": 6300 + } + }, + { + "items": [ + 3681, + 3.6065 + ], + "hints": { + "index": 6301 + } + }, + { + "items": [ + 3681.5, + 3.7727 + ], + "hints": { + "index": 6302 + } + }, + { + "items": [ + 3682, + 3.6526 + ], + "hints": { + "index": 6303 + } + }, + { + "items": [ + 3682.5, + 3.7335 + ], + "hints": { + "index": 6304 + } + }, + { + "items": [ + 3683, + 3.6706 + ], + "hints": { + "index": 6305 + } + }, + { + "items": [ + 3683.5, + 3.9365999698638912 + ], + "hints": { + "index": 6306 + } + }, + { + "items": [ + 3684, + 4.0440998077392578 + ], + "hints": { + "index": 6307 + } + }, + { + "items": [ + 3684.5, + 4.1948 + ], + "hints": { + "index": 6308 + } + }, + { + "items": [ + 3685, + 4.1757 + ], + "hints": { + "index": 6309 + } + }, + { + "items": [ + 3685.5, + 4.0704002380371094 + ], + "hints": { + "index": 6310 + } + }, + { + "items": [ + 3686, + 4.1565 + ], + "hints": { + "index": 6311 + } + }, + { + "items": [ + 3686.5, + 4.1957998275756836 + ], + "hints": { + "index": 6312 + } + }, + { + "items": [ + 3687, + 4.3316 + ], + "hints": { + "index": 6313 + } + }, + { + "items": [ + 3687.5, + 4.209 + ], + "hints": { + "index": 6314 + } + }, + { + "items": [ + 3688, + 4.0367999076843262 + ], + "hints": { + "index": 6315 + } + }, + { + "items": [ + 3688.5, + 3.6263 + ], + "hints": { + "index": 6316 + } + }, + { + "items": [ + 3689, + 3.4895000457763672 + ], + "hints": { + "index": 6317 + } + }, + { + "items": [ + 3689.5, + 3.7074 + ], + "hints": { + "index": 6318 + } + }, + { + "items": [ + 3690, + 4.4794 + ], + "hints": { + "index": 6319 + } + }, + { + "items": [ + 3690.5, + 4.739 + ], + "hints": { + "index": 6320 + } + }, + { + "items": [ + 3691, + 4.4349 + ], + "hints": { + "index": 6321 + } + }, + { + "items": [ + 3691.5, + 3.819 + ], + "hints": { + "index": 6322 + } + }, + { + "items": [ + 3692, + 3.5893 + ], + "hints": { + "index": 6323 + } + }, + { + "items": [ + 3692.5, + 3.6225 + ], + "hints": { + "index": 6324 + } + }, + { + "items": [ + 3693, + 3.4612 + ], + "hints": { + "index": 6325 + } + }, + { + "items": [ + 3693.5, + 3.3879 + ], + "hints": { + "index": 6326 + } + }, + { + "items": [ + 3694, + 3.4389 + ], + "hints": { + "index": 6327 + } + }, + { + "items": [ + 3694.5, + 3.7694 + ], + "hints": { + "index": 6328 + } + }, + { + "items": [ + 3695, + 4.1107 + ], + "hints": { + "index": 6329 + } + }, + { + "items": [ + 3695.5, + 3.8593 + ], + "hints": { + "index": 6330 + } + }, + { + "items": [ + 3696, + 3.7675 + ], + "hints": { + "index": 6331 + } + }, + { + "items": [ + 3696.5, + 3.6405000686645503 + ], + "hints": { + "index": 6332 + } + }, + { + "items": [ + 3697, + 3.7595 + ], + "hints": { + "index": 6333 + } + }, + { + "items": [ + 3697.5, + 3.8664999008178711 + ], + "hints": { + "index": 6334 + } + }, + { + "items": [ + 3698, + 3.9604 + ], + "hints": { + "index": 6335 + } + }, + { + "items": [ + 3698.5, + 4.0665 + ], + "hints": { + "index": 6336 + } + }, + { + "items": [ + 3699, + 4.2608 + ], + "hints": { + "index": 6337 + } + }, + { + "items": [ + 3699.5, + 4.2350997924804688 + ], + "hints": { + "index": 6338 + } + }, + { + "items": [ + 3700, + 4.2652 + ], + "hints": { + "index": 6339 + } + }, + { + "items": [ + 3700.5, + 3.9269 + ], + "hints": { + "index": 6340 + } + }, + { + "items": [ + 3701, + 3.7225 + ], + "hints": { + "index": 6341 + } + }, + { + "items": [ + 3701.5, + 3.4914 + ], + "hints": { + "index": 6342 + } + }, + { + "items": [ + 3702, + 3.5281 + ], + "hints": { + "index": 6343 + } + }, + { + "items": [ + 3702.5, + 3.6541 + ], + "hints": { + "index": 6344 + } + }, + { + "items": [ + 3703, + 3.8808 + ], + "hints": { + "index": 6345 + } + }, + { + "items": [ + 3703.5, + 3.8434998989105225 + ], + "hints": { + "index": 6346 + } + }, + { + "items": [ + 3704, + 3.9502 + ], + "hints": { + "index": 6347 + } + }, + { + "items": [ + 3704.5, + 3.9212 + ], + "hints": { + "index": 6348 + } + }, + { + "items": [ + 3705, + 3.9291 + ], + "hints": { + "index": 6349 + } + }, + { + "items": [ + 3705.5, + 3.8184 + ], + "hints": { + "index": 6350 + } + }, + { + "items": [ + 3706, + 3.857 + ], + "hints": { + "index": 6351 + } + }, + { + "items": [ + 3706.5, + 4.1619 + ], + "hints": { + "index": 6352 + } + }, + { + "items": [ + 3707, + 4.1679 + ], + "hints": { + "index": 6353 + } + }, + { + "items": [ + 3707.5, + 3.9766 + ], + "hints": { + "index": 6354 + } + }, + { + "items": [ + 3708, + 3.7874999046325679 + ], + "hints": { + "index": 6355 + } + }, + { + "items": [ + 3708.5, + 3.7034 + ], + "hints": { + "index": 6356 + } + }, + { + "items": [ + 3709, + 3.5595 + ], + "hints": { + "index": 6357 + } + }, + { + "items": [ + 3709.5, + 3.4533 + ], + "hints": { + "index": 6358 + } + }, + { + "items": [ + 3710, + 3.5523 + ], + "hints": { + "index": 6359 + } + }, + { + "items": [ + 3710.5, + 3.7259 + ], + "hints": { + "index": 6360 + } + }, + { + "items": [ + 3711, + 3.6885 + ], + "hints": { + "index": 6361 + } + }, + { + "items": [ + 3711.5, + 3.8324999809265137 + ], + "hints": { + "index": 6362 + } + }, + { + "items": [ + 3712, + 4.0865 + ], + "hints": { + "index": 6363 + } + }, + { + "items": [ + 3712.5, + 4.6124000549316406 + ], + "hints": { + "index": 6364 + } + }, + { + "items": [ + 3713, + 4.5858001708984375 + ], + "hints": { + "index": 6365 + } + }, + { + "items": [ + 3713.5, + 4.4574 + ], + "hints": { + "index": 6366 + } + }, + { + "items": [ + 3714, + 4.0141000747680664 + ], + "hints": { + "index": 6367 + } + }, + { + "items": [ + 3714.5, + 3.739799976348877 + ], + "hints": { + "index": 6368 + } + }, + { + "items": [ + 3715, + 3.5020999908447266 + ], + "hints": { + "index": 6369 + } + }, + { + "items": [ + 3715.5, + 3.3735001087188721 + ], + "hints": { + "index": 6370 + } + }, + { + "items": [ + 3716, + 3.4342999458312988 + ], + "hints": { + "index": 6371 + } + }, + { + "items": [ + 3716.5, + 3.4744000434875488 + ], + "hints": { + "index": 6372 + } + }, + { + "items": [ + 3717, + 3.5006000995635982 + ], + "hints": { + "index": 6373 + } + }, + { + "items": [ + 3717.5, + 3.5690999031066895 + ], + "hints": { + "index": 6374 + } + }, + { + "items": [ + 3718, + 3.4471 + ], + "hints": { + "index": 6375 + } + }, + { + "items": [ + 3718.5, + 3.4629 + ], + "hints": { + "index": 6376 + } + }, + { + "items": [ + 3719, + 3.4267 + ], + "hints": { + "index": 6377 + } + }, + { + "items": [ + 3719.5, + 3.4775 + ], + "hints": { + "index": 6378 + } + }, + { + "items": [ + 3720, + 3.5416 + ], + "hints": { + "index": 6379 + } + }, + { + "items": [ + 3720.5, + 3.4147 + ], + "hints": { + "index": 6380 + } + }, + { + "items": [ + 3721, + 3.4675 + ], + "hints": { + "index": 6381 + } + }, + { + "items": [ + 3721.5, + 3.4956 + ], + "hints": { + "index": 6382 + } + }, + { + "items": [ + 3722, + 3.574 + ], + "hints": { + "index": 6383 + } + }, + { + "items": [ + 3722.5, + 3.5997 + ], + "hints": { + "index": 6384 + } + }, + { + "items": [ + 3723, + 3.5942 + ], + "hints": { + "index": 6385 + } + }, + { + "items": [ + 3723.5, + 4.0048 + ], + "hints": { + "index": 6386 + } + }, + { + "items": [ + 3724, + 4.4387 + ], + "hints": { + "index": 6387 + } + }, + { + "items": [ + 3724.5, + 5.0954 + ], + "hints": { + "index": 6388 + } + }, + { + "items": [ + 3725, + 5.1971 + ], + "hints": { + "index": 6389 + } + }, + { + "items": [ + 3725.5, + 4.9559 + ], + "hints": { + "index": 6390 + } + }, + { + "items": [ + 3726, + 4.6405 + ], + "hints": { + "index": 6391 + } + }, + { + "items": [ + 3726.5, + 4.2792 + ], + "hints": { + "index": 6392 + } + }, + { + "items": [ + 3727, + 4.2302 + ], + "hints": { + "index": 6393 + } + }, + { + "items": [ + 3727.5, + 4.0532999038696289 + ], + "hints": { + "index": 6394 + } + }, + { + "items": [ + 3728, + 3.9914000034332271 + ], + "hints": { + "index": 6395 + } + }, + { + "items": [ + 3728.5, + 3.7342 + ], + "hints": { + "index": 6396 + } + }, + { + "items": [ + 3729, + 3.5875999927520752 + ], + "hints": { + "index": 6397 + } + }, + { + "items": [ + 3729.5, + 3.5497 + ], + "hints": { + "index": 6398 + } + }, + { + "items": [ + 3730, + 3.7072000503540039 + ], + "hints": { + "index": 6399 + } + }, + { + "items": [ + 3730.5, + 3.8520998954772954 + ], + "hints": { + "index": 6400 + } + }, + { + "items": [ + 3731, + 3.8208999633789063 + ], + "hints": { + "index": 6401 + } + }, + { + "items": [ + 3731.5, + 3.7204999923706055 + ], + "hints": { + "index": 6402 + } + }, + { + "items": [ + 3732, + 3.6085000038146977 + ], + "hints": { + "index": 6403 + } + }, + { + "items": [ + 3732.5, + 3.595099925994873 + ], + "hints": { + "index": 6404 + } + }, + { + "items": [ + 3733, + 3.6182000637054439 + ], + "hints": { + "index": 6405 + } + }, + { + "items": [ + 3733.5, + 3.7452 + ], + "hints": { + "index": 6406 + } + }, + { + "items": [ + 3734, + 3.9124 + ], + "hints": { + "index": 6407 + } + }, + { + "items": [ + 3734.5, + 4.0846 + ], + "hints": { + "index": 6408 + } + }, + { + "items": [ + 3735, + 4.1189 + ], + "hints": { + "index": 6409 + } + }, + { + "items": [ + 3735.5, + 4.2335 + ], + "hints": { + "index": 6410 + } + }, + { + "items": [ + 3736, + 4.2426 + ], + "hints": { + "index": 6411 + } + }, + { + "items": [ + 3736.5, + 4.2656 + ], + "hints": { + "index": 6412 + } + }, + { + "items": [ + 3737, + 3.9621 + ], + "hints": { + "index": 6413 + } + }, + { + "items": [ + 3737.5, + 3.8503000736236577 + ], + "hints": { + "index": 6414 + } + }, + { + "items": [ + 3738, + 3.9302000999450688 + ], + "hints": { + "index": 6415 + } + }, + { + "items": [ + 3738.5, + 4.1739997863769531 + ], + "hints": { + "index": 6416 + } + }, + { + "items": [ + 3739, + 4.4268999099731445 + ], + "hints": { + "index": 6417 + } + }, + { + "items": [ + 3739.5, + 4.4141998291015625 + ], + "hints": { + "index": 6418 + } + }, + { + "items": [ + 3740, + 4.4337 + ], + "hints": { + "index": 6419 + } + }, + { + "items": [ + 3740.5, + 4.4238 + ], + "hints": { + "index": 6420 + } + }, + { + "items": [ + 3741, + 4.2880001068115234 + ], + "hints": { + "index": 6421 + } + }, + { + "items": [ + 3741.5, + 4.0085 + ], + "hints": { + "index": 6422 + } + }, + { + "items": [ + 3742, + 3.7077 + ], + "hints": { + "index": 6423 + } + }, + { + "items": [ + 3742.5, + 3.7005 + ], + "hints": { + "index": 6424 + } + }, + { + "items": [ + 3743, + 3.8049 + ], + "hints": { + "index": 6425 + } + }, + { + "items": [ + 3743.5, + 4.0149 + ], + "hints": { + "index": 6426 + } + }, + { + "items": [ + 3744, + 3.9662001132965088 + ], + "hints": { + "index": 6427 + } + }, + { + "items": [ + 3744.5, + 4.0156002044677734 + ], + "hints": { + "index": 6428 + } + }, + { + "items": [ + 3745, + 3.9109001159667969 + ], + "hints": { + "index": 6429 + } + }, + { + "items": [ + 3745.5, + 3.9319999217987065 + ], + "hints": { + "index": 6430 + } + }, + { + "items": [ + 3746, + 3.8501999378204346 + ], + "hints": { + "index": 6431 + } + }, + { + "items": [ + 3746.5, + 3.9309000968933105 + ], + "hints": { + "index": 6432 + } + }, + { + "items": [ + 3747, + 4.0862998962402344 + ], + "hints": { + "index": 6433 + } + }, + { + "items": [ + 3747.5, + 4.1346 + ], + "hints": { + "index": 6434 + } + }, + { + "items": [ + 3748, + 4.0928 + ], + "hints": { + "index": 6435 + } + }, + { + "items": [ + 3748.5, + 3.9552 + ], + "hints": { + "index": 6436 + } + }, + { + "items": [ + 3749, + 4.0190000534057617 + ], + "hints": { + "index": 6437 + } + }, + { + "items": [ + 3749.5, + 4.1154 + ], + "hints": { + "index": 6438 + } + }, + { + "items": [ + 3750, + 4.3138999938964844 + ], + "hints": { + "index": 6439 + } + }, + { + "items": [ + 3750.5, + 4.2354001998901367 + ], + "hints": { + "index": 6440 + } + }, + { + "items": [ + 3751, + 4.2137 + ], + "hints": { + "index": 6441 + } + }, + { + "items": [ + 3751.5, + 3.9203999042510982 + ], + "hints": { + "index": 6442 + } + }, + { + "items": [ + 3752, + 3.8117001056671143 + ], + "hints": { + "index": 6443 + } + }, + { + "items": [ + 3752.5, + 3.5592000484466553 + ], + "hints": { + "index": 6444 + } + }, + { + "items": [ + 3753, + 3.8090000152587886 + ], + "hints": { + "index": 6445 + } + }, + { + "items": [ + 3753.5, + 4.0162 + ], + "hints": { + "index": 6446 + } + }, + { + "items": [ + 3754, + 4.3761 + ], + "hints": { + "index": 6447 + } + }, + { + "items": [ + 3754.5, + 4.3484001159667969 + ], + "hints": { + "index": 6448 + } + }, + { + "items": [ + 3755, + 4.5118999481201172 + ], + "hints": { + "index": 6449 + } + }, + { + "items": [ + 3755.5, + 4.5476999282836914 + ], + "hints": { + "index": 6450 + } + }, + { + "items": [ + 3756, + 4.5977001190185547 + ], + "hints": { + "index": 6451 + } + }, + { + "items": [ + 3756.5, + 4.6729001998901367 + ], + "hints": { + "index": 6452 + } + }, + { + "items": [ + 3757, + 4.8055 + ], + "hints": { + "index": 6453 + } + }, + { + "items": [ + 3757.5, + 5.1867 + ], + "hints": { + "index": 6454 + } + }, + { + "items": [ + 3758, + 5.3461 + ], + "hints": { + "index": 6455 + } + }, + { + "items": [ + 3758.5, + 5.708899974822998 + ], + "hints": { + "index": 6456 + } + }, + { + "items": [ + 3759, + 5.5370001792907715 + ], + "hints": { + "index": 6457 + } + }, + { + "items": [ + 3759.5, + 5.541 + ], + "hints": { + "index": 6458 + } + }, + { + "items": [ + 3760, + 5.2773 + ], + "hints": { + "index": 6459 + } + }, + { + "items": [ + 3760.5, + 5.407 + ], + "hints": { + "index": 6460 + } + }, + { + "items": [ + 3761, + 5.3558998107910156 + ], + "hints": { + "index": 6461 + } + }, + { + "items": [ + 3761.5, + 5.6615 + ], + "hints": { + "index": 6462 + } + }, + { + "items": [ + 3762, + 5.6081 + ], + "hints": { + "index": 6463 + } + }, + { + "items": [ + 3762.5, + 5.5128998756408691 + ], + "hints": { + "index": 6464 + } + }, + { + "items": [ + 3763, + 5.1538000106811523 + ], + "hints": { + "index": 6465 + } + }, + { + "items": [ + 3763.5, + 4.9484 + ], + "hints": { + "index": 6466 + } + }, + { + "items": [ + 3764, + 4.9215998649597168 + ], + "hints": { + "index": 6467 + } + }, + { + "items": [ + 3764.5, + 4.9185 + ], + "hints": { + "index": 6468 + } + }, + { + "items": [ + 3765, + 4.8471 + ], + "hints": { + "index": 6469 + } + }, + { + "items": [ + 3765.5, + 4.8417000770568848 + ], + "hints": { + "index": 6470 + } + }, + { + "items": [ + 3766, + 4.7410998344421387 + ], + "hints": { + "index": 6471 + } + }, + { + "items": [ + 3766.5, + 4.7767000198364258 + ], + "hints": { + "index": 6472 + } + }, + { + "items": [ + 3767, + 4.5135002136230469 + ], + "hints": { + "index": 6473 + } + }, + { + "items": [ + 3767.5, + 4.51039981842041 + ], + "hints": { + "index": 6474 + } + }, + { + "items": [ + 3768, + 4.4057998657226563 + ], + "hints": { + "index": 6475 + } + }, + { + "items": [ + 3768.5, + 4.5447998046875 + ], + "hints": { + "index": 6476 + } + }, + { + "items": [ + 3769, + 4.6153998374938965 + ], + "hints": { + "index": 6477 + } + }, + { + "items": [ + 3769.5, + 4.9008 + ], + "hints": { + "index": 6478 + } + }, + { + "items": [ + 3770, + 4.8136000633239746 + ], + "hints": { + "index": 6479 + } + }, + { + "items": [ + 3770.5, + 4.7371001243591309 + ], + "hints": { + "index": 6480 + } + }, + { + "items": [ + 3771, + 4.4099001884460449 + ], + "hints": { + "index": 6481 + } + }, + { + "items": [ + 3771.5, + 4.221099853515625 + ], + "hints": { + "index": 6482 + } + }, + { + "items": [ + 3772, + 4.1849 + ], + "hints": { + "index": 6483 + } + }, + { + "items": [ + 3772.5, + 4.2801 + ], + "hints": { + "index": 6484 + } + }, + { + "items": [ + 3773, + 4.58650016784668 + ], + "hints": { + "index": 6485 + } + }, + { + "items": [ + 3773.5, + 4.7266998291015625 + ], + "hints": { + "index": 6486 + } + }, + { + "items": [ + 3774, + 4.7670998573303223 + ], + "hints": { + "index": 6487 + } + }, + { + "items": [ + 3774.5, + 4.563 + ], + "hints": { + "index": 6488 + } + }, + { + "items": [ + 3775, + 4.23960018157959 + ], + "hints": { + "index": 6489 + } + }, + { + "items": [ + 3775.5, + 3.9277999401092529 + ], + "hints": { + "index": 6490 + } + }, + { + "items": [ + 3776, + 3.8766000270843506 + ], + "hints": { + "index": 6491 + } + }, + { + "items": [ + 3776.5, + 3.6966 + ], + "hints": { + "index": 6492 + } + }, + { + "items": [ + 3777, + 3.7899999618530273 + ], + "hints": { + "index": 6493 + } + }, + { + "items": [ + 3777.5, + 3.801399946212769 + ], + "hints": { + "index": 6494 + } + }, + { + "items": [ + 3778, + 4.003699779510498 + ], + "hints": { + "index": 6495 + } + }, + { + "items": [ + 3778.5, + 4.0037 + ], + "hints": { + "index": 6496 + } + }, + { + "items": [ + 3779, + 3.9572 + ], + "hints": { + "index": 6497 + } + }, + { + "items": [ + 3779.5, + 3.9040999412536626 + ], + "hints": { + "index": 6498 + } + }, + { + "items": [ + 3780, + 3.9493999481201167 + ], + "hints": { + "index": 6499 + } + }, + { + "items": [ + 3780.5, + 3.83270001411438 + ], + "hints": { + "index": 6500 + } + }, + { + "items": [ + 3781, + 3.7225 + ], + "hints": { + "index": 6501 + } + }, + { + "items": [ + 3781.5, + 3.5727999210357666 + ], + "hints": { + "index": 6502 + } + }, + { + "items": [ + 3782, + 3.644399881362915 + ], + "hints": { + "index": 6503 + } + }, + { + "items": [ + 3782.5, + 3.8898999691009521 + ], + "hints": { + "index": 6504 + } + }, + { + "items": [ + 3783, + 4.0934 + ], + "hints": { + "index": 6505 + } + }, + { + "items": [ + 3783.5, + 4.305300235748291 + ], + "hints": { + "index": 6506 + } + }, + { + "items": [ + 3784, + 4.2111001014709473 + ], + "hints": { + "index": 6507 + } + }, + { + "items": [ + 3784.5, + 4.2708001136779785 + ], + "hints": { + "index": 6508 + } + }, + { + "items": [ + 3785, + 4.4099001884460449 + ], + "hints": { + "index": 6509 + } + }, + { + "items": [ + 3785.5, + 4.4563999176025391 + ], + "hints": { + "index": 6510 + } + }, + { + "items": [ + 3786, + 4.5185999870300293 + ], + "hints": { + "index": 6511 + } + }, + { + "items": [ + 3786.5, + 4.2554998397827148 + ], + "hints": { + "index": 6512 + } + }, + { + "items": [ + 3787, + 4.2785000801086426 + ], + "hints": { + "index": 6513 + } + }, + { + "items": [ + 3787.5, + 4.0920000076293945 + ], + "hints": { + "index": 6514 + } + }, + { + "items": [ + 3788, + 3.9131999015808105 + ], + "hints": { + "index": 6515 + } + }, + { + "items": [ + 3788.5, + 3.8880000114440918 + ], + "hints": { + "index": 6516 + } + }, + { + "items": [ + 3789, + 3.9396998882293706 + ], + "hints": { + "index": 6517 + } + }, + { + "items": [ + 3789.5, + 3.9939999580383305 + ], + "hints": { + "index": 6518 + } + }, + { + "items": [ + 3790, + 3.970099925994873 + ], + "hints": { + "index": 6519 + } + }, + { + "items": [ + 3790.5, + 4.0784001350402832 + ], + "hints": { + "index": 6520 + } + }, + { + "items": [ + 3791, + 4.1739997863769531 + ], + "hints": { + "index": 6521 + } + }, + { + "items": [ + 3791.5, + 4.1518001556396484 + ], + "hints": { + "index": 6522 + } + }, + { + "items": [ + 3792, + 4.0637001991271973 + ], + "hints": { + "index": 6523 + } + }, + { + "items": [ + 3792.5, + 4.079899787902832 + ], + "hints": { + "index": 6524 + } + }, + { + "items": [ + 3793, + 4.1500000953674316 + ], + "hints": { + "index": 6525 + } + }, + { + "items": [ + 3793.5, + 4.164100170135498 + ], + "hints": { + "index": 6526 + } + }, + { + "items": [ + 3794, + 4.1996002197265625 + ], + "hints": { + "index": 6527 + } + }, + { + "items": [ + 3794.5, + 4.1901998519897461 + ], + "hints": { + "index": 6528 + } + }, + { + "items": [ + 3795, + 4.2232999801635742 + ], + "hints": { + "index": 6529 + } + }, + { + "items": [ + 3795.5, + 4.220099925994873 + ], + "hints": { + "index": 6530 + } + }, + { + "items": [ + 3796, + 4.20359992980957 + ], + "hints": { + "index": 6531 + } + }, + { + "items": [ + 3796.5, + 4.0774998664855957 + ], + "hints": { + "index": 6532 + } + }, + { + "items": [ + 3797, + 4.1343998908996582 + ], + "hints": { + "index": 6533 + } + }, + { + "items": [ + 3797.5, + 4.1080999374389648 + ], + "hints": { + "index": 6534 + } + }, + { + "items": [ + 3798, + 4.1045999526977539 + ], + "hints": { + "index": 6535 + } + }, + { + "items": [ + 3798.5, + 3.9546999931335449 + ], + "hints": { + "index": 6536 + } + }, + { + "items": [ + 3799, + 4.05049991607666 + ], + "hints": { + "index": 6537 + } + }, + { + "items": [ + 3799.5, + 4.2430000305175781 + ], + "hints": { + "index": 6538 + } + }, + { + "items": [ + 3800, + 4.3502998352050781 + ], + "hints": { + "index": 6539 + } + }, + { + "items": [ + 3800.5, + 4.2230000495910645 + ], + "hints": { + "index": 6540 + } + }, + { + "items": [ + 3801, + 4.0531001091003418 + ], + "hints": { + "index": 6541 + } + }, + { + "items": [ + 3801.5, + 4.01140022277832 + ], + "hints": { + "index": 6542 + } + }, + { + "items": [ + 3802, + 4.0235 + ], + "hints": { + "index": 6543 + } + }, + { + "items": [ + 3802.5, + 4.2568001747131348 + ], + "hints": { + "index": 6544 + } + }, + { + "items": [ + 3803, + 4.6503000259399414 + ], + "hints": { + "index": 6545 + } + }, + { + "items": [ + 3803.5, + 4.9331998825073242 + ], + "hints": { + "index": 6546 + } + }, + { + "items": [ + 3804, + 4.8284001350402832 + ], + "hints": { + "index": 6547 + } + }, + { + "items": [ + 3804.5, + 4.4503998756408691 + ], + "hints": { + "index": 6548 + } + }, + { + "items": [ + 3805, + 4.1493000984191895 + ], + "hints": { + "index": 6549 + } + }, + { + "items": [ + 3805.5, + 4.210899829864502 + ], + "hints": { + "index": 6550 + } + }, + { + "items": [ + 3806, + 4.0110998153686523 + ], + "hints": { + "index": 6551 + } + }, + { + "items": [ + 3806.5, + 3.9356999397277832 + ], + "hints": { + "index": 6552 + } + }, + { + "items": [ + 3807, + 3.7100000381469727 + ], + "hints": { + "index": 6553 + } + }, + { + "items": [ + 3807.5, + 3.7632999420166016 + ], + "hints": { + "index": 6554 + } + }, + { + "items": [ + 3808, + 3.9224998950958256 + ], + "hints": { + "index": 6555 + } + }, + { + "items": [ + 3808.5, + 3.6375000476837158 + ], + "hints": { + "index": 6556 + } + }, + { + "items": [ + 3809, + 3.39520001411438 + ], + "hints": { + "index": 6557 + } + }, + { + "items": [ + 3809.5, + 3.1603999137878418 + ], + "hints": { + "index": 6558 + } + }, + { + "items": [ + 3810, + 3.2225000858306885 + ], + "hints": { + "index": 6559 + } + }, + { + "items": [ + 3810.5, + 3.2678999900817871 + ], + "hints": { + "index": 6560 + } + }, + { + "items": [ + 3811, + 3.3617000579833984 + ], + "hints": { + "index": 6561 + } + }, + { + "items": [ + 3811.5, + 3.5011000633239746 + ], + "hints": { + "index": 6562 + } + }, + { + "items": [ + 3812, + 3.7156999111175537 + ], + "hints": { + "index": 6563 + } + }, + { + "items": [ + 3812.5, + 3.9956998825073242 + ], + "hints": { + "index": 6564 + } + }, + { + "items": [ + 3813, + 4.1452999114990234 + ], + "hints": { + "index": 6565 + } + }, + { + "items": [ + 3813.5, + 4.41379976272583 + ], + "hints": { + "index": 6566 + } + }, + { + "items": [ + 3814, + 4.2790999412536621 + ], + "hints": { + "index": 6567 + } + }, + { + "items": [ + 3814.5, + 4.31689977645874 + ], + "hints": { + "index": 6568 + } + }, + { + "items": [ + 3815, + 4.2207999229431152 + ], + "hints": { + "index": 6569 + } + }, + { + "items": [ + 3815.5, + 4.3442001342773438 + ], + "hints": { + "index": 6570 + } + }, + { + "items": [ + 3816, + 4.2576999664306641 + ], + "hints": { + "index": 6571 + } + }, + { + "items": [ + 3816.5, + 4.4763998985290527 + ], + "hints": { + "index": 6572 + } + }, + { + "items": [ + 3817, + 4.7470002174377441 + ], + "hints": { + "index": 6573 + } + }, + { + "items": [ + 3817.5, + 5.0553998947143555 + ], + "hints": { + "index": 6574 + } + }, + { + "items": [ + 3818, + 4.9617 + ], + "hints": { + "index": 6575 + } + }, + { + "items": [ + 3818.5, + 4.9727001190185547 + ], + "hints": { + "index": 6576 + } + }, + { + "items": [ + 3819, + 4.8372998237609863 + ], + "hints": { + "index": 6577 + } + }, + { + "items": [ + 3819.5, + 4.7523999214172363 + ], + "hints": { + "index": 6578 + } + }, + { + "items": [ + 3820, + 4.6331000328063965 + ], + "hints": { + "index": 6579 + } + }, + { + "items": [ + 3820.5, + 4.5918002128601074 + ], + "hints": { + "index": 6580 + } + }, + { + "items": [ + 3821, + 4.9059000015258789 + ], + "hints": { + "index": 6581 + } + }, + { + "items": [ + 3821.5, + 5.2599000930786133 + ], + "hints": { + "index": 6582 + } + }, + { + "items": [ + 3822, + 5.7074999809265137 + ], + "hints": { + "index": 6583 + } + }, + { + "items": [ + 3822.5, + 5.7488999366760254 + ], + "hints": { + "index": 6584 + } + }, + { + "items": [ + 3823, + 5.7600002288818359 + ], + "hints": { + "index": 6585 + } + }, + { + "items": [ + 3823.5, + 5.9450998306274414 + ], + "hints": { + "index": 6586 + } + }, + { + "items": [ + 3824, + 6.0041999816894531 + ], + "hints": { + "index": 6587 + } + }, + { + "items": [ + 3824.5, + 6.0443000793457031 + ], + "hints": { + "index": 6588 + } + }, + { + "items": [ + 3825, + 5.7648000717163086 + ], + "hints": { + "index": 6589 + } + }, + { + "items": [ + 3825.5, + 5.7558999061584473 + ], + "hints": { + "index": 6590 + } + }, + { + "items": [ + 3826, + 5.6691999435424805 + ], + "hints": { + "index": 6591 + } + }, + { + "items": [ + 3826.5, + 5.9756999015808105 + ], + "hints": { + "index": 6592 + } + }, + { + "items": [ + 3827, + 5.8848 + ], + "hints": { + "index": 6593 + } + }, + { + "items": [ + 3827.5, + 5.5258998870849609 + ], + "hints": { + "index": 6594 + } + }, + { + "items": [ + 3828, + 5.0383000373840332 + ], + "hints": { + "index": 6595 + } + }, + { + "items": [ + 3828.5, + 4.7940998077392578 + ], + "hints": { + "index": 6596 + } + }, + { + "items": [ + 3829, + 4.7744 + ], + "hints": { + "index": 6597 + } + }, + { + "items": [ + 3829.5, + 4.7712998390197754 + ], + "hints": { + "index": 6598 + } + }, + { + "items": [ + 3830, + 4.7892 + ], + "hints": { + "index": 6599 + } + }, + { + "items": [ + 3830.5, + 4.7100000381469727 + ], + "hints": { + "index": 6600 + } + }, + { + "items": [ + 3831, + 4.54010009765625 + ], + "hints": { + "index": 6601 + } + }, + { + "items": [ + 3831.5, + 4.2961 + ], + "hints": { + "index": 6602 + } + }, + { + "items": [ + 3832, + 4.1174 + ], + "hints": { + "index": 6603 + } + }, + { + "items": [ + 3832.5, + 3.8989999294281006 + ], + "hints": { + "index": 6604 + } + }, + { + "items": [ + 3833, + 3.7751998901367183 + ], + "hints": { + "index": 6605 + } + }, + { + "items": [ + 3833.5, + 3.6923000812530522 + ], + "hints": { + "index": 6606 + } + }, + { + "items": [ + 3834, + 3.8066999912261958 + ], + "hints": { + "index": 6607 + } + }, + { + "items": [ + 3834.5, + 3.9049 + ], + "hints": { + "index": 6608 + } + }, + { + "items": [ + 3835, + 3.9089999198913574 + ], + "hints": { + "index": 6609 + } + }, + { + "items": [ + 3835.5, + 3.7938 + ], + "hints": { + "index": 6610 + } + }, + { + "items": [ + 3836, + 3.7026998996734615 + ], + "hints": { + "index": 6611 + } + }, + { + "items": [ + 3836.5, + 3.6239 + ], + "hints": { + "index": 6612 + } + }, + { + "items": [ + 3837, + 3.5876998901367188 + ], + "hints": { + "index": 6613 + } + }, + { + "items": [ + 3837.5, + 3.5913999080657959 + ], + "hints": { + "index": 6614 + } + }, + { + "items": [ + 3838, + 3.5873000621795654 + ], + "hints": { + "index": 6615 + } + }, + { + "items": [ + 3838.5, + 3.6201 + ], + "hints": { + "index": 6616 + } + }, + { + "items": [ + 3839, + 3.593 + ], + "hints": { + "index": 6617 + } + }, + { + "items": [ + 3839.5, + 3.6308000087738042 + ], + "hints": { + "index": 6618 + } + }, + { + "items": [ + 3840, + 3.7894001007080078 + ], + "hints": { + "index": 6619 + } + }, + { + "items": [ + 3840.5, + 3.9549999237060542 + ], + "hints": { + "index": 6620 + } + }, + { + "items": [ + 3841, + 4.0792999267578125 + ], + "hints": { + "index": 6621 + } + }, + { + "items": [ + 3841.5, + 4.0872001647949219 + ], + "hints": { + "index": 6622 + } + }, + { + "items": [ + 3842, + 4.1955 + ], + "hints": { + "index": 6623 + } + }, + { + "items": [ + 3842.5, + 4.3996000289916992 + ], + "hints": { + "index": 6624 + } + }, + { + "items": [ + 3843, + 4.3611998558044434 + ], + "hints": { + "index": 6625 + } + }, + { + "items": [ + 3843.5, + 4.1167998313903809 + ], + "hints": { + "index": 6626 + } + }, + { + "items": [ + 3844, + 4.0101 + ], + "hints": { + "index": 6627 + } + }, + { + "items": [ + 3844.5, + 4.0288000106811523 + ], + "hints": { + "index": 6628 + } + }, + { + "items": [ + 3845, + 4.11870002746582 + ], + "hints": { + "index": 6629 + } + }, + { + "items": [ + 3845.5, + 4.01200008392334 + ], + "hints": { + "index": 6630 + } + }, + { + "items": [ + 3846, + 3.9103999137878418 + ], + "hints": { + "index": 6631 + } + }, + { + "items": [ + 3846.5, + 3.8264999389648442 + ], + "hints": { + "index": 6632 + } + }, + { + "items": [ + 3847, + 3.82229995727539 + ], + "hints": { + "index": 6633 + } + }, + { + "items": [ + 3847.5, + 3.8529999256134033 + ], + "hints": { + "index": 6634 + } + }, + { + "items": [ + 3848, + 3.9711999893188481 + ], + "hints": { + "index": 6635 + } + }, + { + "items": [ + 3848.5, + 4.1350002288818359 + ], + "hints": { + "index": 6636 + } + }, + { + "items": [ + 3849, + 4.2680997848510742 + ], + "hints": { + "index": 6637 + } + }, + { + "items": [ + 3849.5, + 4.4015998840332031 + ], + "hints": { + "index": 6638 + } + }, + { + "items": [ + 3850, + 4.1984 + ], + "hints": { + "index": 6639 + } + }, + { + "items": [ + 3850.5, + 4.101099967956543 + ], + "hints": { + "index": 6640 + } + }, + { + "items": [ + 3851, + 3.91729998588562 + ], + "hints": { + "index": 6641 + } + }, + { + "items": [ + 3851.5, + 4.037600040435791 + ], + "hints": { + "index": 6642 + } + }, + { + "items": [ + 3852, + 4.028 + ], + "hints": { + "index": 6643 + } + }, + { + "items": [ + 3852.5, + 4.0784997940063477 + ], + "hints": { + "index": 6644 + } + }, + { + "items": [ + 3853, + 4.1950998306274414 + ], + "hints": { + "index": 6645 + } + }, + { + "items": [ + 3853.5, + 4.20550012588501 + ], + "hints": { + "index": 6646 + } + }, + { + "items": [ + 3854, + 4.1903 + ], + "hints": { + "index": 6647 + } + }, + { + "items": [ + 3854.5, + 4.0774998664855957 + ], + "hints": { + "index": 6648 + } + }, + { + "items": [ + 3855, + 4.2343001365661621 + ], + "hints": { + "index": 6649 + } + }, + { + "items": [ + 3855.5, + 4.159599781036377 + ], + "hints": { + "index": 6650 + } + }, + { + "items": [ + 3856, + 4.1513 + ], + "hints": { + "index": 6651 + } + }, + { + "items": [ + 3856.5, + 4.0181999206542969 + ], + "hints": { + "index": 6652 + } + }, + { + "items": [ + 3857, + 4.148399829864502 + ], + "hints": { + "index": 6653 + } + }, + { + "items": [ + 3857.5, + 4.2024998664855957 + ], + "hints": { + "index": 6654 + } + }, + { + "items": [ + 3858, + 4.1663 + ], + "hints": { + "index": 6655 + } + }, + { + "items": [ + 3858.5, + 4.1637001037597656 + ], + "hints": { + "index": 6656 + } + }, + { + "items": [ + 3859, + 4.27269983291626 + ], + "hints": { + "index": 6657 + } + }, + { + "items": [ + 3859.5, + 4.5550999641418457 + ], + "hints": { + "index": 6658 + } + }, + { + "items": [ + 3860, + 4.7505 + ], + "hints": { + "index": 6659 + } + }, + { + "items": [ + 3860.5, + 4.5756001472473145 + ], + "hints": { + "index": 6660 + } + }, + { + "items": [ + 3861, + 4.3614001274108887 + ], + "hints": { + "index": 6661 + } + }, + { + "items": [ + 3861.5, + 4.1628999710083008 + ], + "hints": { + "index": 6662 + } + }, + { + "items": [ + 3862, + 4.1484999656677246 + ], + "hints": { + "index": 6663 + } + }, + { + "items": [ + 3862.5, + 3.969 + ], + "hints": { + "index": 6664 + } + }, + { + "items": [ + 3863, + 3.7784 + ], + "hints": { + "index": 6665 + } + }, + { + "items": [ + 3863.5, + 3.462 + ], + "hints": { + "index": 6666 + } + }, + { + "items": [ + 3864, + 3.3329999446868896 + ], + "hints": { + "index": 6667 + } + }, + { + "items": [ + 3864.5, + 3.2795 + ], + "hints": { + "index": 6668 + } + }, + { + "items": [ + 3865, + 3.16759991645813 + ], + "hints": { + "index": 6669 + } + }, + { + "items": [ + 3865.5, + 3.155 + ], + "hints": { + "index": 6670 + } + }, + { + "items": [ + 3866, + 3.0884 + ], + "hints": { + "index": 6671 + } + }, + { + "items": [ + 3866.5, + 3.1672 + ], + "hints": { + "index": 6672 + } + }, + { + "items": [ + 3867, + 3.1033 + ], + "hints": { + "index": 6673 + } + }, + { + "items": [ + 3867.5, + 3.1049 + ], + "hints": { + "index": 6674 + } + }, + { + "items": [ + 3868, + 3.0977 + ], + "hints": { + "index": 6675 + } + }, + { + "items": [ + 3868.5, + 3.0799 + ], + "hints": { + "index": 6676 + } + }, + { + "items": [ + 3869, + 3.0701 + ], + "hints": { + "index": 6677 + } + }, + { + "items": [ + 3869.5, + 3.1661 + ], + "hints": { + "index": 6678 + } + }, + { + "items": [ + 3870, + 3.3235 + ], + "hints": { + "index": 6679 + } + }, + { + "items": [ + 3870.5, + 3.2957 + ], + "hints": { + "index": 6680 + } + }, + { + "items": [ + 3871, + 3.2548 + ], + "hints": { + "index": 6681 + } + }, + { + "items": [ + 3871.5, + 3.2578 + ], + "hints": { + "index": 6682 + } + }, + { + "items": [ + 3872, + 3.4848001003265381 + ], + "hints": { + "index": 6683 + } + }, + { + "items": [ + 3872.5, + 3.5013 + ], + "hints": { + "index": 6684 + } + }, + { + "items": [ + 3873, + 3.4757 + ], + "hints": { + "index": 6685 + } + }, + { + "items": [ + 3873.5, + 3.3944 + ], + "hints": { + "index": 6686 + } + }, + { + "items": [ + 3874, + 3.4666 + ], + "hints": { + "index": 6687 + } + }, + { + "items": [ + 3874.5, + 3.5174 + ], + "hints": { + "index": 6688 + } + }, + { + "items": [ + 3875, + 3.4985 + ], + "hints": { + "index": 6689 + } + }, + { + "items": [ + 3875.5, + 3.5608 + ], + "hints": { + "index": 6690 + } + }, + { + "items": [ + 3876, + 3.6854 + ], + "hints": { + "index": 6691 + } + }, + { + "items": [ + 3876.5, + 3.7493 + ], + "hints": { + "index": 6692 + } + }, + { + "items": [ + 3877, + 3.873 + ], + "hints": { + "index": 6693 + } + }, + { + "items": [ + 3877.5, + 3.8567 + ], + "hints": { + "index": 6694 + } + }, + { + "items": [ + 3878, + 4.0346 + ], + "hints": { + "index": 6695 + } + }, + { + "items": [ + 3878.5, + 4.0404 + ], + "hints": { + "index": 6696 + } + }, + { + "items": [ + 3879, + 4.2135 + ], + "hints": { + "index": 6697 + } + }, + { + "items": [ + 3879.5, + 4.2508 + ], + "hints": { + "index": 6698 + } + }, + { + "items": [ + 3880, + 4.1594 + ], + "hints": { + "index": 6699 + } + }, + { + "items": [ + 3880.5, + 4.2213997840881348 + ], + "hints": { + "index": 6700 + } + }, + { + "items": [ + 3881, + 4.1655998229980469 + ], + "hints": { + "index": 6701 + } + }, + { + "items": [ + 3881.5, + 4.1962 + ], + "hints": { + "index": 6702 + } + }, + { + "items": [ + 3882, + 3.9542 + ], + "hints": { + "index": 6703 + } + }, + { + "items": [ + 3882.5, + 3.957 + ], + "hints": { + "index": 6704 + } + }, + { + "items": [ + 3883, + 3.8971 + ], + "hints": { + "index": 6705 + } + }, + { + "items": [ + 3883.5, + 4.156 + ], + "hints": { + "index": 6706 + } + }, + { + "items": [ + 3884, + 4.214 + ], + "hints": { + "index": 6707 + } + }, + { + "items": [ + 3884.5, + 4.3919 + ], + "hints": { + "index": 6708 + } + }, + { + "items": [ + 3885, + 4.4985 + ], + "hints": { + "index": 6709 + } + }, + { + "items": [ + 3885.5, + 4.5961 + ], + "hints": { + "index": 6710 + } + }, + { + "items": [ + 3886, + 4.675 + ], + "hints": { + "index": 6711 + } + }, + { + "items": [ + 3886.5, + 4.617 + ], + "hints": { + "index": 6712 + } + }, + { + "items": [ + 3887, + 4.7036 + ], + "hints": { + "index": 6713 + } + }, + { + "items": [ + 3887.5, + 4.9088 + ], + "hints": { + "index": 6714 + } + }, + { + "items": [ + 3888, + 4.8256 + ], + "hints": { + "index": 6715 + } + }, + { + "items": [ + 3888.5, + 4.7347 + ], + "hints": { + "index": 6716 + } + }, + { + "items": [ + 3889, + 4.5753002166748047 + ], + "hints": { + "index": 6717 + } + }, + { + "items": [ + 3889.5, + 4.4927 + ], + "hints": { + "index": 6718 + } + }, + { + "items": [ + 3890, + 4.3763 + ], + "hints": { + "index": 6719 + } + }, + { + "items": [ + 3890.5, + 4.3774 + ], + "hints": { + "index": 6720 + } + }, + { + "items": [ + 3891, + 4.3885 + ], + "hints": { + "index": 6721 + } + }, + { + "items": [ + 3891.5, + 4.3562 + ], + "hints": { + "index": 6722 + } + }, + { + "items": [ + 3892, + 4.0072 + ], + "hints": { + "index": 6723 + } + }, + { + "items": [ + 3892.5, + 3.7844 + ], + "hints": { + "index": 6724 + } + }, + { + "items": [ + 3893, + 3.614399909973145 + ], + "hints": { + "index": 6725 + } + }, + { + "items": [ + 3893.5, + 3.5813 + ], + "hints": { + "index": 6726 + } + }, + { + "items": [ + 3894, + 3.5378 + ], + "hints": { + "index": 6727 + } + }, + { + "items": [ + 3894.5, + 3.4285 + ], + "hints": { + "index": 6728 + } + }, + { + "items": [ + 3895, + 3.3059 + ], + "hints": { + "index": 6729 + } + }, + { + "items": [ + 3895.5, + 3.2185 + ], + "hints": { + "index": 6730 + } + }, + { + "items": [ + 3896, + 3.2399001121520996 + ], + "hints": { + "index": 6731 + } + }, + { + "items": [ + 3896.5, + 3.375 + ], + "hints": { + "index": 6732 + } + }, + { + "items": [ + 3897, + 3.5285999774932861 + ], + "hints": { + "index": 6733 + } + }, + { + "items": [ + 3897.5, + 3.6305999755859375 + ], + "hints": { + "index": 6734 + } + }, + { + "items": [ + 3898, + 3.678800106048584 + ], + "hints": { + "index": 6735 + } + }, + { + "items": [ + 3898.5, + 3.6440000534057617 + ], + "hints": { + "index": 6736 + } + }, + { + "items": [ + 3899, + 3.6898 + ], + "hints": { + "index": 6737 + } + }, + { + "items": [ + 3899.5, + 3.8313999176025391 + ], + "hints": { + "index": 6738 + } + }, + { + "items": [ + 3900, + 3.7741999626159664 + ], + "hints": { + "index": 6739 + } + }, + { + "items": [ + 3900.5, + 3.6752998828887935 + ], + "hints": { + "index": 6740 + } + }, + { + "items": [ + 3901, + 3.6007 + ], + "hints": { + "index": 6741 + } + }, + { + "items": [ + 3901.5, + 3.7234 + ], + "hints": { + "index": 6742 + } + }, + { + "items": [ + 3902, + 3.8039 + ], + "hints": { + "index": 6743 + } + }, + { + "items": [ + 3902.5, + 3.9121999740600586 + ], + "hints": { + "index": 6744 + } + }, + { + "items": [ + 3903, + 4.076 + ], + "hints": { + "index": 6745 + } + }, + { + "items": [ + 3903.5, + 4.3130002021789551 + ], + "hints": { + "index": 6746 + } + }, + { + "items": [ + 3904, + 4.307 + ], + "hints": { + "index": 6747 + } + }, + { + "items": [ + 3904.5, + 4.377500057220459 + ], + "hints": { + "index": 6748 + } + }, + { + "items": [ + 3905, + 4.4552001953125 + ], + "hints": { + "index": 6749 + } + }, + { + "items": [ + 3905.5, + 4.6870999336242676 + ], + "hints": { + "index": 6750 + } + }, + { + "items": [ + 3906, + 4.7955 + ], + "hints": { + "index": 6751 + } + }, + { + "items": [ + 3906.5, + 5.0813999176025391 + ], + "hints": { + "index": 6752 + } + }, + { + "items": [ + 3907, + 5.4598 + ], + "hints": { + "index": 6753 + } + }, + { + "items": [ + 3907.5, + 5.5416998863220215 + ], + "hints": { + "index": 6754 + } + }, + { + "items": [ + 3908, + 5.6061 + ], + "hints": { + "index": 6755 + } + }, + { + "items": [ + 3908.5, + 5.5188999176025391 + ], + "hints": { + "index": 6756 + } + }, + { + "items": [ + 3909, + 5.8558 + ], + "hints": { + "index": 6757 + } + }, + { + "items": [ + 3909.5, + 5.9586000442504883 + ], + "hints": { + "index": 6758 + } + }, + { + "items": [ + 3910, + 5.8202 + ], + "hints": { + "index": 6759 + } + }, + { + "items": [ + 3910.5, + 5.2038002014160156 + ], + "hints": { + "index": 6760 + } + }, + { + "items": [ + 3911, + 5.04580020904541 + ], + "hints": { + "index": 6761 + } + }, + { + "items": [ + 3911.5, + 5.2161002159118652 + ], + "hints": { + "index": 6762 + } + }, + { + "items": [ + 3912, + 5.5894 + ], + "hints": { + "index": 6763 + } + }, + { + "items": [ + 3912.5, + 5.4429998397827148 + ], + "hints": { + "index": 6764 + } + }, + { + "items": [ + 3913, + 5.0992 + ], + "hints": { + "index": 6765 + } + }, + { + "items": [ + 3913.5, + 5.2095 + ], + "hints": { + "index": 6766 + } + }, + { + "items": [ + 3914, + 5.327 + ], + "hints": { + "index": 6767 + } + }, + { + "items": [ + 3914.5, + 5.8055 + ], + "hints": { + "index": 6768 + } + }, + { + "items": [ + 3915, + 5.9878997802734375 + ], + "hints": { + "index": 6769 + } + }, + { + "items": [ + 3915.5, + 6.2586 + ], + "hints": { + "index": 6770 + } + }, + { + "items": [ + 3916, + 6.2526 + ], + "hints": { + "index": 6771 + } + }, + { + "items": [ + 3916.5, + 5.972599983215332 + ], + "hints": { + "index": 6772 + } + }, + { + "items": [ + 3917, + 5.85099983215332 + ], + "hints": { + "index": 6773 + } + }, + { + "items": [ + 3917.5, + 5.72760009765625 + ], + "hints": { + "index": 6774 + } + }, + { + "items": [ + 3918, + 5.7954 + ], + "hints": { + "index": 6775 + } + }, + { + "items": [ + 3918.5, + 5.72730016708374 + ], + "hints": { + "index": 6776 + } + }, + { + "items": [ + 3919, + 5.4931998252868652 + ], + "hints": { + "index": 6777 + } + }, + { + "items": [ + 3919.5, + 5.8671998977661133 + ], + "hints": { + "index": 6778 + } + }, + { + "items": [ + 3920, + 6.2748 + ], + "hints": { + "index": 6779 + } + }, + { + "items": [ + 3920.5, + 6.3902 + ], + "hints": { + "index": 6780 + } + }, + { + "items": [ + 3921, + 5.9999 + ], + "hints": { + "index": 6781 + } + }, + { + "items": [ + 3921.5, + 5.7023 + ], + "hints": { + "index": 6782 + } + }, + { + "items": [ + 3922, + 5.8799 + ], + "hints": { + "index": 6783 + } + }, + { + "items": [ + 3922.5, + 5.3373 + ], + "hints": { + "index": 6784 + } + }, + { + "items": [ + 3923, + 4.7765 + ], + "hints": { + "index": 6785 + } + }, + { + "items": [ + 3923.5, + 4.3501 + ], + "hints": { + "index": 6786 + } + }, + { + "items": [ + 3924, + 4.3818 + ], + "hints": { + "index": 6787 + } + }, + { + "items": [ + 3924.5, + 4.7173 + ], + "hints": { + "index": 6788 + } + }, + { + "items": [ + 3925, + 4.7916 + ], + "hints": { + "index": 6789 + } + }, + { + "items": [ + 3925.5, + 4.9308 + ], + "hints": { + "index": 6790 + } + }, + { + "items": [ + 3926, + 4.6225 + ], + "hints": { + "index": 6791 + } + }, + { + "items": [ + 3926.5, + 4.6307 + ], + "hints": { + "index": 6792 + } + }, + { + "items": [ + 3927, + 4.6342 + ], + "hints": { + "index": 6793 + } + }, + { + "items": [ + 3927.5, + 4.8649 + ], + "hints": { + "index": 6794 + } + }, + { + "items": [ + 3928, + 4.8438 + ], + "hints": { + "index": 6795 + } + }, + { + "items": [ + 3928.5, + 4.645 + ], + "hints": { + "index": 6796 + } + }, + { + "items": [ + 3929, + 4.3562 + ], + "hints": { + "index": 6797 + } + }, + { + "items": [ + 3929.5, + 4.1181 + ], + "hints": { + "index": 6798 + } + }, + { + "items": [ + 3930, + 4.0216 + ], + "hints": { + "index": 6799 + } + }, + { + "items": [ + 3930.5, + 4.1733 + ], + "hints": { + "index": 6800 + } + }, + { + "items": [ + 3931, + 4.612 + ], + "hints": { + "index": 6801 + } + }, + { + "items": [ + 3931.5, + 5.0589 + ], + "hints": { + "index": 6802 + } + }, + { + "items": [ + 3932, + 5.3164000511169434 + ], + "hints": { + "index": 6803 + } + }, + { + "items": [ + 3932.5, + 4.9355998039245605 + ], + "hints": { + "index": 6804 + } + }, + { + "items": [ + 3933, + 4.8000001907348633 + ], + "hints": { + "index": 6805 + } + }, + { + "items": [ + 3933.5, + 4.5219001770019531 + ], + "hints": { + "index": 6806 + } + }, + { + "items": [ + 3934, + 4.5138998031616211 + ], + "hints": { + "index": 6807 + } + }, + { + "items": [ + 3934.5, + 4.197199821472168 + ], + "hints": { + "index": 6808 + } + }, + { + "items": [ + 3935, + 4.0988998413085938 + ], + "hints": { + "index": 6809 + } + }, + { + "items": [ + 3935.5, + 3.6421000957489018 + ], + "hints": { + "index": 6810 + } + }, + { + "items": [ + 3936, + 3.6372001171112065 + ], + "hints": { + "index": 6811 + } + }, + { + "items": [ + 3936.5, + 3.5961000919342041 + ], + "hints": { + "index": 6812 + } + }, + { + "items": [ + 3937, + 4.2269001007080078 + ], + "hints": { + "index": 6813 + } + }, + { + "items": [ + 3937.5, + 4.60860013961792 + ], + "hints": { + "index": 6814 + } + }, + { + "items": [ + 3938, + 5.3213000297546387 + ], + "hints": { + "index": 6815 + } + }, + { + "items": [ + 3938.5, + 5.4225001335144043 + ], + "hints": { + "index": 6816 + } + }, + { + "items": [ + 3939, + 5.55810022354126 + ], + "hints": { + "index": 6817 + } + }, + { + "items": [ + 3939.5, + 5.166600227355957 + ], + "hints": { + "index": 6818 + } + }, + { + "items": [ + 3940, + 4.8425998687744141 + ], + "hints": { + "index": 6819 + } + }, + { + "items": [ + 3940.5, + 4.74459981918335 + ], + "hints": { + "index": 6820 + } + }, + { + "items": [ + 3941, + 4.5665998458862305 + ], + "hints": { + "index": 6821 + } + }, + { + "items": [ + 3941.5, + 4.4137001037597656 + ], + "hints": { + "index": 6822 + } + }, + { + "items": [ + 3942, + 4.0371999740600586 + ], + "hints": { + "index": 6823 + } + }, + { + "items": [ + 3942.5, + 4.0166 + ], + "hints": { + "index": 6824 + } + }, + { + "items": [ + 3943, + 4.1104001998901367 + ], + "hints": { + "index": 6825 + } + }, + { + "items": [ + 3943.5, + 4.3064 + ], + "hints": { + "index": 6826 + } + }, + { + "items": [ + 3944, + 4.4342 + ], + "hints": { + "index": 6827 + } + }, + { + "items": [ + 3944.5, + 4.6864 + ], + "hints": { + "index": 6828 + } + }, + { + "items": [ + 3945, + 4.8824 + ], + "hints": { + "index": 6829 + } + }, + { + "items": [ + 3945.5, + 4.9563999176025391 + ], + "hints": { + "index": 6830 + } + }, + { + "items": [ + 3946, + 4.6996 + ], + "hints": { + "index": 6831 + } + }, + { + "items": [ + 3946.5, + 4.6605000495910645 + ], + "hints": { + "index": 6832 + } + }, + { + "items": [ + 3947, + 4.6452 + ], + "hints": { + "index": 6833 + } + }, + { + "items": [ + 3947.5, + 4.9026 + ], + "hints": { + "index": 6834 + } + }, + { + "items": [ + 3948, + 5.1039 + ], + "hints": { + "index": 6835 + } + }, + { + "items": [ + 3948.5, + 5.0883 + ], + "hints": { + "index": 6836 + } + }, + { + "items": [ + 3949, + 4.83620023727417 + ], + "hints": { + "index": 6837 + } + }, + { + "items": [ + 3949.5, + 4.4724 + ], + "hints": { + "index": 6838 + } + }, + { + "items": [ + 3950, + 4.4689998626708984 + ], + "hints": { + "index": 6839 + } + }, + { + "items": [ + 3950.5, + 4.4881000518798828 + ], + "hints": { + "index": 6840 + } + }, + { + "items": [ + 3951, + 4.4022998809814453 + ], + "hints": { + "index": 6841 + } + }, + { + "items": [ + 3951.5, + 4.3847 + ], + "hints": { + "index": 6842 + } + }, + { + "items": [ + 3952, + 4.5292000770568848 + ], + "hints": { + "index": 6843 + } + }, + { + "items": [ + 3952.5, + 4.9718 + ], + "hints": { + "index": 6844 + } + }, + { + "items": [ + 3953, + 5.1833 + ], + "hints": { + "index": 6845 + } + }, + { + "items": [ + 3953.5, + 5.3698000907897949 + ], + "hints": { + "index": 6846 + } + }, + { + "items": [ + 3954, + 5.4241 + ], + "hints": { + "index": 6847 + } + }, + { + "items": [ + 3954.5, + 5.6883997917175293 + ], + "hints": { + "index": 6848 + } + }, + { + "items": [ + 3955, + 5.3951001167297363 + ], + "hints": { + "index": 6849 + } + }, + { + "items": [ + 3955.5, + 4.8681 + ], + "hints": { + "index": 6850 + } + }, + { + "items": [ + 3956, + 4.2816 + ], + "hints": { + "index": 6851 + } + }, + { + "items": [ + 3956.5, + 4.0563998222351074 + ], + "hints": { + "index": 6852 + } + }, + { + "items": [ + 3957, + 4.1886000633239746 + ], + "hints": { + "index": 6853 + } + }, + { + "items": [ + 3957.5, + 4.4807000160217285 + ], + "hints": { + "index": 6854 + } + }, + { + "items": [ + 3958, + 4.8245 + ], + "hints": { + "index": 6855 + } + }, + { + "items": [ + 3958.5, + 4.845 + ], + "hints": { + "index": 6856 + } + }, + { + "items": [ + 3959, + 4.7255997657775879 + ], + "hints": { + "index": 6857 + } + }, + { + "items": [ + 3959.5, + 4.2656998634338379 + ], + "hints": { + "index": 6858 + } + }, + { + "items": [ + 3960, + 3.83929991722107 + ], + "hints": { + "index": 6859 + } + }, + { + "items": [ + 3960.5, + 3.6419000625610352 + ], + "hints": { + "index": 6860 + } + }, + { + "items": [ + 3961, + 3.7613 + ], + "hints": { + "index": 6861 + } + }, + { + "items": [ + 3961.5, + 4.1212 + ], + "hints": { + "index": 6862 + } + }, + { + "items": [ + 3962, + 4.3241000175476074 + ], + "hints": { + "index": 6863 + } + }, + { + "items": [ + 3962.5, + 4.55 + ], + "hints": { + "index": 6864 + } + }, + { + "items": [ + 3963, + 4.4246001243591309 + ], + "hints": { + "index": 6865 + } + }, + { + "items": [ + 3963.5, + 4.2859001159667969 + ], + "hints": { + "index": 6866 + } + }, + { + "items": [ + 3964, + 4.1698 + ], + "hints": { + "index": 6867 + } + }, + { + "items": [ + 3964.5, + 4.3801999092102051 + ], + "hints": { + "index": 6868 + } + }, + { + "items": [ + 3965, + 4.5928997993469238 + ], + "hints": { + "index": 6869 + } + }, + { + "items": [ + 3965.5, + 4.7919 + ], + "hints": { + "index": 6870 + } + }, + { + "items": [ + 3966, + 5.5798001289367676 + ], + "hints": { + "index": 6871 + } + }, + { + "items": [ + 3966.5, + 6.5536999702453613 + ], + "hints": { + "index": 6872 + } + }, + { + "items": [ + 3967, + 6.462 + ], + "hints": { + "index": 6873 + } + }, + { + "items": [ + 3967.5, + 5.6819000244140625 + ], + "hints": { + "index": 6874 + } + }, + { + "items": [ + 3968, + 5.1708 + ], + "hints": { + "index": 6875 + } + }, + { + "items": [ + 3968.5, + 5.1135001182556152 + ], + "hints": { + "index": 6876 + } + }, + { + "items": [ + 3969, + 4.4969 + ], + "hints": { + "index": 6877 + } + }, + { + "items": [ + 3969.5, + 4.2555999755859375 + ], + "hints": { + "index": 6878 + } + }, + { + "items": [ + 3970, + 4.3681 + ], + "hints": { + "index": 6879 + } + }, + { + "items": [ + 3970.5, + 4.9153 + ], + "hints": { + "index": 6880 + } + }, + { + "items": [ + 3971, + 5.2179 + ], + "hints": { + "index": 6881 + } + }, + { + "items": [ + 3971.5, + 5.5331001281738281 + ], + "hints": { + "index": 6882 + } + }, + { + "items": [ + 3972, + 5.4861001968383789 + ], + "hints": { + "index": 6883 + } + }, + { + "items": [ + 3972.5, + 5.2902 + ], + "hints": { + "index": 6884 + } + }, + { + "items": [ + 3973, + 4.7347 + ], + "hints": { + "index": 6885 + } + }, + { + "items": [ + 3973.5, + 4.7256999015808105 + ], + "hints": { + "index": 6886 + } + }, + { + "items": [ + 3974, + 4.887700080871582 + ], + "hints": { + "index": 6887 + } + }, + { + "items": [ + 3974.5, + 5.197199821472168 + ], + "hints": { + "index": 6888 + } + }, + { + "items": [ + 3975, + 4.9912 + ], + "hints": { + "index": 6889 + } + }, + { + "items": [ + 3975.5, + 4.5722999572753906 + ], + "hints": { + "index": 6890 + } + }, + { + "items": [ + 3976, + 4.4601 + ], + "hints": { + "index": 6891 + } + }, + { + "items": [ + 3976.5, + 4.3751001358032227 + ], + "hints": { + "index": 6892 + } + }, + { + "items": [ + 3977, + 4.3102 + ], + "hints": { + "index": 6893 + } + }, + { + "items": [ + 3977.5, + 4.091400146484375 + ], + "hints": { + "index": 6894 + } + }, + { + "items": [ + 3978, + 3.7918000221252441 + ], + "hints": { + "index": 6895 + } + }, + { + "items": [ + 3978.5, + 3.6308000087738042 + ], + "hints": { + "index": 6896 + } + }, + { + "items": [ + 3979, + 3.6215999126434326 + ], + "hints": { + "index": 6897 + } + }, + { + "items": [ + 3979.5, + 3.9403 + ], + "hints": { + "index": 6898 + } + }, + { + "items": [ + 3980, + 4.4904 + ], + "hints": { + "index": 6899 + } + }, + { + "items": [ + 3980.5, + 5.0056 + ], + "hints": { + "index": 6900 + } + }, + { + "items": [ + 3981, + 5.39459991455078 + ], + "hints": { + "index": 6901 + } + }, + { + "items": [ + 3981.5, + 5.0796999931335449 + ], + "hints": { + "index": 6902 + } + }, + { + "items": [ + 3982, + 4.509 + ], + "hints": { + "index": 6903 + } + }, + { + "items": [ + 3982.5, + 4.018 + ], + "hints": { + "index": 6904 + } + }, + { + "items": [ + 3983, + 3.8085999488830566 + ], + "hints": { + "index": 6905 + } + }, + { + "items": [ + 3983.5, + 3.8316 + ], + "hints": { + "index": 6906 + } + }, + { + "items": [ + 3984, + 3.8256 + ], + "hints": { + "index": 6907 + } + }, + { + "items": [ + 3984.5, + 3.8675000667572026 + ], + "hints": { + "index": 6908 + } + }, + { + "items": [ + 3985, + 3.7049000263214111 + ], + "hints": { + "index": 6909 + } + }, + { + "items": [ + 3985.5, + 3.6261 + ], + "hints": { + "index": 6910 + } + }, + { + "items": [ + 3986, + 3.5072 + ], + "hints": { + "index": 6911 + } + }, + { + "items": [ + 3986.5, + 3.5216999053955078 + ], + "hints": { + "index": 6912 + } + }, + { + "items": [ + 3987, + 3.3478999137878418 + ], + "hints": { + "index": 6913 + } + }, + { + "items": [ + 3987.5, + 3.3831 + ], + "hints": { + "index": 6914 + } + }, + { + "items": [ + 3988, + 3.2722 + ], + "hints": { + "index": 6915 + } + }, + { + "items": [ + 3988.5, + 3.314 + ], + "hints": { + "index": 6916 + } + }, + { + "items": [ + 3989, + 3.2092 + ], + "hints": { + "index": 6917 + } + }, + { + "items": [ + 3989.5, + 3.1858 + ], + "hints": { + "index": 6918 + } + }, + { + "items": [ + 3990, + 3.1598999500274658 + ], + "hints": { + "index": 6919 + } + }, + { + "items": [ + 3990.5, + 3.0943000316619873 + ], + "hints": { + "index": 6920 + } + }, + { + "items": [ + 3991, + 3.0561 + ], + "hints": { + "index": 6921 + } + }, + { + "items": [ + 3991.5, + 3.0761 + ], + "hints": { + "index": 6922 + } + }, + { + "items": [ + 3992, + 3.0631 + ], + "hints": { + "index": 6923 + } + }, + { + "items": [ + 3992.5, + 3.1456 + ], + "hints": { + "index": 6924 + } + }, + { + "items": [ + 3993, + 3.0608000755310059 + ], + "hints": { + "index": 6925 + } + }, + { + "items": [ + 3993.5, + 3.0852 + ], + "hints": { + "index": 6926 + } + }, + { + "items": [ + 3994, + 2.9316 + ], + "hints": { + "index": 6927 + } + }, + { + "items": [ + 3994.5, + 2.9811 + ], + "hints": { + "index": 6928 + } + }, + { + "items": [ + 3995, + 3.1507000923156734 + ], + "hints": { + "index": 6929 + } + }, + { + "items": [ + 3995.5, + 3.4733 + ], + "hints": { + "index": 6930 + } + }, + { + "items": [ + 3996, + 3.587 + ], + "hints": { + "index": 6931 + } + }, + { + "items": [ + 3996.5, + 3.4926 + ], + "hints": { + "index": 6932 + } + }, + { + "items": [ + 3997, + 3.3029 + ], + "hints": { + "index": 6933 + } + }, + { + "items": [ + 3997.5, + 3.3454 + ], + "hints": { + "index": 6934 + } + }, + { + "items": [ + 3998, + 3.4749999046325684 + ], + "hints": { + "index": 6935 + } + }, + { + "items": [ + 3998.5, + 3.725100040435791 + ], + "hints": { + "index": 6936 + } + }, + { + "items": [ + 3999, + 3.6710999011993408 + ], + "hints": { + "index": 6937 + } + }, + { + "items": [ + 3999.5, + 3.7432 + ], + "hints": { + "index": 6938 + } + }, + { + "items": [ + 4000, + 3.9235 + ], + "hints": { + "index": 6939 + } + }, + { + "items": [ + 4000.5, + 4.3996 + ], + "hints": { + "index": 6940 + } + }, + { + "items": [ + 4001, + 4.8677 + ], + "hints": { + "index": 6941 + } + }, + { + "items": [ + 4001.5, + 4.9298000335693359 + ], + "hints": { + "index": 6942 + } + }, + { + "items": [ + 4002, + 4.9581 + ], + "hints": { + "index": 6943 + } + }, + { + "items": [ + 4002.5, + 4.4354 + ], + "hints": { + "index": 6944 + } + }, + { + "items": [ + 4003, + 4.16540002822876 + ], + "hints": { + "index": 6945 + } + }, + { + "items": [ + 4003.5, + 3.845599889755249 + ], + "hints": { + "index": 6946 + } + }, + { + "items": [ + 4004, + 3.7283999919891362 + ], + "hints": { + "index": 6947 + } + }, + { + "items": [ + 4004.5, + 3.4959 + ], + "hints": { + "index": 6948 + } + }, + { + "items": [ + 4005, + 3.3526 + ], + "hints": { + "index": 6949 + } + }, + { + "items": [ + 4005.5, + 3.4075000286102295 + ], + "hints": { + "index": 6950 + } + }, + { + "items": [ + 4006, + 3.4872000217437744 + ], + "hints": { + "index": 6951 + } + }, + { + "items": [ + 4006.5, + 3.6008 + ], + "hints": { + "index": 6952 + } + }, + { + "items": [ + 4007, + 3.6141 + ], + "hints": { + "index": 6953 + } + }, + { + "items": [ + 4007.5, + 3.5354 + ], + "hints": { + "index": 6954 + } + }, + { + "items": [ + 4008, + 3.527400016784668 + ], + "hints": { + "index": 6955 + } + }, + { + "items": [ + 4008.5, + 3.4870998859405522 + ], + "hints": { + "index": 6956 + } + }, + { + "items": [ + 4009, + 3.6475999355316162 + ], + "hints": { + "index": 6957 + } + }, + { + "items": [ + 4009.5, + 3.5155999660491943 + ], + "hints": { + "index": 6958 + } + }, + { + "items": [ + 4010, + 3.4832000732421875 + ], + "hints": { + "index": 6959 + } + }, + { + "items": [ + 4010.5, + 3.5589 + ], + "hints": { + "index": 6960 + } + }, + { + "items": [ + 4011, + 3.5962 + ], + "hints": { + "index": 6961 + } + }, + { + "items": [ + 4011.5, + 3.5399 + ], + "hints": { + "index": 6962 + } + }, + { + "items": [ + 4012, + 3.357 + ], + "hints": { + "index": 6963 + } + }, + { + "items": [ + 4012.5, + 3.4616 + ], + "hints": { + "index": 6964 + } + }, + { + "items": [ + 4013, + 3.5351 + ], + "hints": { + "index": 6965 + } + }, + { + "items": [ + 4013.5, + 3.5148 + ], + "hints": { + "index": 6966 + } + }, + { + "items": [ + 4014, + 3.3298 + ], + "hints": { + "index": 6967 + } + }, + { + "items": [ + 4014.5, + 3.2163 + ], + "hints": { + "index": 6968 + } + }, + { + "items": [ + 4015, + 3.2687 + ], + "hints": { + "index": 6969 + } + }, + { + "items": [ + 4015.5, + 3.3287999629974365 + ], + "hints": { + "index": 6970 + } + }, + { + "items": [ + 4016, + 3.3085 + ], + "hints": { + "index": 6971 + } + }, + { + "items": [ + 4016.5, + 3.2914 + ], + "hints": { + "index": 6972 + } + }, + { + "items": [ + 4017, + 3.4784 + ], + "hints": { + "index": 6973 + } + }, + { + "items": [ + 4017.5, + 3.5772 + ], + "hints": { + "index": 6974 + } + }, + { + "items": [ + 4018, + 3.4916 + ], + "hints": { + "index": 6975 + } + }, + { + "items": [ + 4018.5, + 3.3449 + ], + "hints": { + "index": 6976 + } + }, + { + "items": [ + 4019, + 3.2949 + ], + "hints": { + "index": 6977 + } + }, + { + "items": [ + 4019.5, + 3.3791999816894531 + ], + "hints": { + "index": 6978 + } + }, + { + "items": [ + 4020, + 3.2572000026702881 + ], + "hints": { + "index": 6979 + } + }, + { + "items": [ + 4020.5, + 3.2039999961853027 + ], + "hints": { + "index": 6980 + } + }, + { + "items": [ + 4021, + 3.0241999626159668 + ], + "hints": { + "index": 6981 + } + }, + { + "items": [ + 4021.5, + 2.9985001087188721 + ], + "hints": { + "index": 6982 + } + }, + { + "items": [ + 4022, + 2.9809999465942383 + ], + "hints": { + "index": 6983 + } + }, + { + "items": [ + 4022.5, + 3.0666000843048096 + ], + "hints": { + "index": 6984 + } + }, + { + "items": [ + 4023, + 3.0717000961303711 + ], + "hints": { + "index": 6985 + } + }, + { + "items": [ + 4023.5, + 3.016200065612793 + ], + "hints": { + "index": 6986 + } + }, + { + "items": [ + 4024, + 2.9505000114440918 + ], + "hints": { + "index": 6987 + } + }, + { + "items": [ + 4024.5, + 2.8545999526977539 + ], + "hints": { + "index": 6988 + } + }, + { + "items": [ + 4025, + 2.8617000579833984 + ], + "hints": { + "index": 6989 + } + }, + { + "items": [ + 4025.5, + 2.8687999248504639 + ], + "hints": { + "index": 6990 + } + }, + { + "items": [ + 4026, + 2.9899001121520996 + ], + "hints": { + "index": 6991 + } + }, + { + "items": [ + 4026.5, + 3.1079 + ], + "hints": { + "index": 6992 + } + }, + { + "items": [ + 4027, + 3.2273 + ], + "hints": { + "index": 6993 + } + }, + { + "items": [ + 4027.5, + 3.1416 + ], + "hints": { + "index": 6994 + } + }, + { + "items": [ + 4028, + 3.1348 + ], + "hints": { + "index": 6995 + } + }, + { + "items": [ + 4028.5, + 3.162 + ], + "hints": { + "index": 6996 + } + }, + { + "items": [ + 4029, + 3.3078 + ], + "hints": { + "index": 6997 + } + }, + { + "items": [ + 4029.5, + 3.1906 + ], + "hints": { + "index": 6998 + } + }, + { + "items": [ + 4030, + 3.1070001125335693 + ], + "hints": { + "index": 6999 + } + }, + { + "items": [ + 4030.5, + 3.0418999195098877 + ], + "hints": { + "index": 7000 + } + }, + { + "items": [ + 4031, + 3.1233999729156494 + ], + "hints": { + "index": 7001 + } + }, + { + "items": [ + 4031.5, + 3.015700101852417 + ], + "hints": { + "index": 7002 + } + }, + { + "items": [ + 4032, + 3.0803000926971436 + ], + "hints": { + "index": 7003 + } + }, + { + "items": [ + 4032.5, + 3.2144999504089355 + ], + "hints": { + "index": 7004 + } + }, + { + "items": [ + 4033, + 3.551399946212769 + ], + "hints": { + "index": 7005 + } + }, + { + "items": [ + 4033.5, + 3.7202999591827393 + ], + "hints": { + "index": 7006 + } + }, + { + "items": [ + 4034, + 3.8510000705718994 + ], + "hints": { + "index": 7007 + } + }, + { + "items": [ + 4034.5, + 3.8336000442504878 + ], + "hints": { + "index": 7008 + } + }, + { + "items": [ + 4035, + 3.7787 + ], + "hints": { + "index": 7009 + } + }, + { + "items": [ + 4035.5, + 3.6508 + ], + "hints": { + "index": 7010 + } + }, + { + "items": [ + 4036, + 3.794 + ], + "hints": { + "index": 7011 + } + }, + { + "items": [ + 4036.5, + 4.271399974822998 + ], + "hints": { + "index": 7012 + } + }, + { + "items": [ + 4037, + 4.6081 + ], + "hints": { + "index": 7013 + } + }, + { + "items": [ + 4037.5, + 4.284 + ], + "hints": { + "index": 7014 + } + }, + { + "items": [ + 4038, + 3.8054 + ], + "hints": { + "index": 7015 + } + }, + { + "items": [ + 4038.5, + 3.6656 + ], + "hints": { + "index": 7016 + } + }, + { + "items": [ + 4039, + 3.7269 + ], + "hints": { + "index": 7017 + } + }, + { + "items": [ + 4039.5, + 3.908 + ], + "hints": { + "index": 7018 + } + }, + { + "items": [ + 4040, + 4.0613 + ], + "hints": { + "index": 7019 + } + }, + { + "items": [ + 4040.5, + 4.2265 + ], + "hints": { + "index": 7020 + } + }, + { + "items": [ + 4041, + 4.2985 + ], + "hints": { + "index": 7021 + } + }, + { + "items": [ + 4041.5, + 4.2518 + ], + "hints": { + "index": 7022 + } + }, + { + "items": [ + 4042, + 4.3675 + ], + "hints": { + "index": 7023 + } + }, + { + "items": [ + 4042.5, + 4.4234 + ], + "hints": { + "index": 7024 + } + }, + { + "items": [ + 4043, + 4.539 + ], + "hints": { + "index": 7025 + } + }, + { + "items": [ + 4043.5, + 4.4788 + ], + "hints": { + "index": 7026 + } + }, + { + "items": [ + 4044, + 4.2718 + ], + "hints": { + "index": 7027 + } + }, + { + "items": [ + 4044.5, + 4.1012 + ], + "hints": { + "index": 7028 + } + }, + { + "items": [ + 4045, + 3.9279 + ], + "hints": { + "index": 7029 + } + }, + { + "items": [ + 4045.5, + 4.0708 + ], + "hints": { + "index": 7030 + } + }, + { + "items": [ + 4046, + 4.3588 + ], + "hints": { + "index": 7031 + } + }, + { + "items": [ + 4046.5, + 4.7621 + ], + "hints": { + "index": 7032 + } + }, + { + "items": [ + 4047, + 4.5759 + ], + "hints": { + "index": 7033 + } + }, + { + "items": [ + 4047.5, + 4.2366 + ], + "hints": { + "index": 7034 + } + }, + { + "items": [ + 4048, + 4.1998 + ], + "hints": { + "index": 7035 + } + }, + { + "items": [ + 4048.5, + 4.334 + ], + "hints": { + "index": 7036 + } + }, + { + "items": [ + 4049, + 4.397 + ], + "hints": { + "index": 7037 + } + }, + { + "items": [ + 4049.5, + 4.3478 + ], + "hints": { + "index": 7038 + } + }, + { + "items": [ + 4050, + 4.2134 + ], + "hints": { + "index": 7039 + } + }, + { + "items": [ + 4050.5, + 4.1542 + ], + "hints": { + "index": 7040 + } + }, + { + "items": [ + 4051, + 3.9022998809814458 + ], + "hints": { + "index": 7041 + } + }, + { + "items": [ + 4051.5, + 3.83049988746643 + ], + "hints": { + "index": 7042 + } + }, + { + "items": [ + 4052, + 3.7711999416351318 + ], + "hints": { + "index": 7043 + } + }, + { + "items": [ + 4052.5, + 3.6919999122619633 + ], + "hints": { + "index": 7044 + } + }, + { + "items": [ + 4053, + 3.58459997177124 + ], + "hints": { + "index": 7045 + } + }, + { + "items": [ + 4053.5, + 3.4428000450134277 + ], + "hints": { + "index": 7046 + } + }, + { + "items": [ + 4054, + 3.3954999446868896 + ], + "hints": { + "index": 7047 + } + }, + { + "items": [ + 4054.5, + 3.311500072479248 + ], + "hints": { + "index": 7048 + } + }, + { + "items": [ + 4055, + 3.2639000415802 + ], + "hints": { + "index": 7049 + } + }, + { + "items": [ + 4055.5, + 3.1703999042510982 + ], + "hints": { + "index": 7050 + } + }, + { + "items": [ + 4056, + 3.2862000465393062 + ], + "hints": { + "index": 7051 + } + }, + { + "items": [ + 4056.5, + 3.287100076675415 + ], + "hints": { + "index": 7052 + } + }, + { + "items": [ + 4057, + 3.2685999870300293 + ], + "hints": { + "index": 7053 + } + }, + { + "items": [ + 4057.5, + 3.1886999607086186 + ], + "hints": { + "index": 7054 + } + }, + { + "items": [ + 4058, + 3.2063000202178955 + ], + "hints": { + "index": 7055 + } + }, + { + "items": [ + 4058.5, + 3.2623000144958496 + ], + "hints": { + "index": 7056 + } + }, + { + "items": [ + 4059, + 3.2832999229431152 + ], + "hints": { + "index": 7057 + } + }, + { + "items": [ + 4059.5, + 3.3977000713348389 + ], + "hints": { + "index": 7058 + } + }, + { + "items": [ + 4060, + 3.6229000091552734 + ], + "hints": { + "index": 7059 + } + }, + { + "items": [ + 4060.5, + 3.6791999340057377 + ], + "hints": { + "index": 7060 + } + }, + { + "items": [ + 4061, + 3.7067000865936279 + ], + "hints": { + "index": 7061 + } + }, + { + "items": [ + 4061.5, + 3.7221000194549561 + ], + "hints": { + "index": 7062 + } + }, + { + "items": [ + 4062, + 3.7883999347686768 + ], + "hints": { + "index": 7063 + } + }, + { + "items": [ + 4062.5, + 3.6403999328613281 + ], + "hints": { + "index": 7064 + } + }, + { + "items": [ + 4063, + 3.5962998867034912 + ], + "hints": { + "index": 7065 + } + }, + { + "items": [ + 4063.5, + 3.8519999980926514 + ], + "hints": { + "index": 7066 + } + }, + { + "items": [ + 4064, + 4.7979998588562012 + ], + "hints": { + "index": 7067 + } + }, + { + "items": [ + 4064.5, + 5.6177 + ], + "hints": { + "index": 7068 + } + }, + { + "items": [ + 4065, + 6.3941998481750488 + ], + "hints": { + "index": 7069 + } + }, + { + "items": [ + 4065.5, + 6.6108999252319336 + ], + "hints": { + "index": 7070 + } + }, + { + "items": [ + 4066, + 6.6318001747131348 + ], + "hints": { + "index": 7071 + } + }, + { + "items": [ + 4066.5, + 5.952 + ], + "hints": { + "index": 7072 + } + }, + { + "items": [ + 4067, + 5.318699836730957 + ], + "hints": { + "index": 7073 + } + }, + { + "items": [ + 4067.5, + 4.7638 + ], + "hints": { + "index": 7074 + } + }, + { + "items": [ + 4068, + 4.4485998153686523 + ], + "hints": { + "index": 7075 + } + }, + { + "items": [ + 4068.5, + 4.263700008392334 + ], + "hints": { + "index": 7076 + } + }, + { + "items": [ + 4069, + 4.6013998985290527 + ], + "hints": { + "index": 7077 + } + }, + { + "items": [ + 4069.5, + 5.3356 + ], + "hints": { + "index": 7078 + } + }, + { + "items": [ + 4070, + 5.7041001319885254 + ], + "hints": { + "index": 7079 + } + }, + { + "items": [ + 4070.5, + 4.9625000953674316 + ], + "hints": { + "index": 7080 + } + }, + { + "items": [ + 4071, + 4.1547999382019043 + ], + "hints": { + "index": 7081 + } + }, + { + "items": [ + 4071.5, + 3.6965000629425049 + ], + "hints": { + "index": 7082 + } + }, + { + "items": [ + 4072, + 3.6233000755310054 + ], + "hints": { + "index": 7083 + } + }, + { + "items": [ + 4072.5, + 3.7242000102996826 + ], + "hints": { + "index": 7084 + } + }, + { + "items": [ + 4073, + 3.9823 + ], + "hints": { + "index": 7085 + } + }, + { + "items": [ + 4073.5, + 4.3815 + ], + "hints": { + "index": 7086 + } + }, + { + "items": [ + 4074, + 4.6415 + ], + "hints": { + "index": 7087 + } + }, + { + "items": [ + 4074.5, + 4.5759 + ], + "hints": { + "index": 7088 + } + }, + { + "items": [ + 4075, + 4.5366 + ], + "hints": { + "index": 7089 + } + }, + { + "items": [ + 4075.5, + 4.5729 + ], + "hints": { + "index": 7090 + } + }, + { + "items": [ + 4076, + 4.8493 + ], + "hints": { + "index": 7091 + } + }, + { + "items": [ + 4076.5, + 4.6950998306274414 + ], + "hints": { + "index": 7092 + } + }, + { + "items": [ + 4077, + 4.5759 + ], + "hints": { + "index": 7093 + } + }, + { + "items": [ + 4077.5, + 4.3007 + ], + "hints": { + "index": 7094 + } + }, + { + "items": [ + 4078, + 3.9171 + ], + "hints": { + "index": 7095 + } + }, + { + "items": [ + 4078.5, + 3.6275999546051025 + ], + "hints": { + "index": 7096 + } + }, + { + "items": [ + 4079, + 3.4615 + ], + "hints": { + "index": 7097 + } + }, + { + "items": [ + 4079.5, + 3.7343 + ], + "hints": { + "index": 7098 + } + }, + { + "items": [ + 4080, + 4.1967 + ], + "hints": { + "index": 7099 + } + }, + { + "items": [ + 4080.5, + 4.5987000465393066 + ], + "hints": { + "index": 7100 + } + }, + { + "items": [ + 4081, + 4.9279 + ], + "hints": { + "index": 7101 + } + }, + { + "items": [ + 4081.5, + 4.9454 + ], + "hints": { + "index": 7102 + } + }, + { + "items": [ + 4082, + 4.754 + ], + "hints": { + "index": 7103 + } + }, + { + "items": [ + 4082.5, + 4.3299 + ], + "hints": { + "index": 7104 + } + }, + { + "items": [ + 4083, + 3.7762 + ], + "hints": { + "index": 7105 + } + }, + { + "items": [ + 4083.5, + 3.9634 + ], + "hints": { + "index": 7106 + } + }, + { + "items": [ + 4084, + 3.7944 + ], + "hints": { + "index": 7107 + } + }, + { + "items": [ + 4084.5, + 3.8793001174926758 + ], + "hints": { + "index": 7108 + } + }, + { + "items": [ + 4085, + 3.8905 + ], + "hints": { + "index": 7109 + } + }, + { + "items": [ + 4085.5, + 4.3581 + ], + "hints": { + "index": 7110 + } + }, + { + "items": [ + 4086, + 4.8224 + ], + "hints": { + "index": 7111 + } + }, + { + "items": [ + 4086.5, + 4.6173000335693359 + ], + "hints": { + "index": 7112 + } + }, + { + "items": [ + 4087, + 4.0664 + ], + "hints": { + "index": 7113 + } + }, + { + "items": [ + 4087.5, + 3.6383 + ], + "hints": { + "index": 7114 + } + }, + { + "items": [ + 4088, + 3.265 + ], + "hints": { + "index": 7115 + } + }, + { + "items": [ + 4088.5, + 3.2791 + ], + "hints": { + "index": 7116 + } + }, + { + "items": [ + 4089, + 3.4987 + ], + "hints": { + "index": 7117 + } + }, + { + "items": [ + 4089.5, + 4.681 + ], + "hints": { + "index": 7118 + } + }, + { + "items": [ + 4090, + 5.605 + ], + "hints": { + "index": 7119 + } + }, + { + "items": [ + 4090.5, + 5.4022 + ], + "hints": { + "index": 7120 + } + }, + { + "items": [ + 4091, + 4.3669 + ], + "hints": { + "index": 7121 + } + }, + { + "items": [ + 4091.5, + 3.6641 + ], + "hints": { + "index": 7122 + } + }, + { + "items": [ + 4092, + 3.4556999206542969 + ], + "hints": { + "index": 7123 + } + }, + { + "items": [ + 4092.5, + 3.1228 + ], + "hints": { + "index": 7124 + } + }, + { + "items": [ + 4093, + 3.1952 + ], + "hints": { + "index": 7125 + } + }, + { + "items": [ + 4093.5, + 3.327 + ], + "hints": { + "index": 7126 + } + }, + { + "items": [ + 4094, + 3.5148000717163086 + ], + "hints": { + "index": 7127 + } + }, + { + "items": [ + 4094.5, + 3.7879 + ], + "hints": { + "index": 7128 + } + }, + { + "items": [ + 4095, + 4.3896 + ], + "hints": { + "index": 7129 + } + }, + { + "items": [ + 4095.5, + 4.6188 + ], + "hints": { + "index": 7130 + } + }, + { + "items": [ + 4096, + 4.7487001419067383 + ], + "hints": { + "index": 7131 + } + }, + { + "items": [ + 4096.5, + 4.5224 + ], + "hints": { + "index": 7132 + } + }, + { + "items": [ + 4097, + 5.1276 + ], + "hints": { + "index": 7133 + } + }, + { + "items": [ + 4097.5, + 5.5884 + ], + "hints": { + "index": 7134 + } + }, + { + "items": [ + 4098, + 5.2007 + ], + "hints": { + "index": 7135 + } + }, + { + "items": [ + 4098.5, + 4.5275 + ], + "hints": { + "index": 7136 + } + }, + { + "items": [ + 4099, + 4.1281 + ], + "hints": { + "index": 7137 + } + }, + { + "items": [ + 4099.5, + 4.0684 + ], + "hints": { + "index": 7138 + } + }, + { + "items": [ + 4100, + 3.8081 + ], + "hints": { + "index": 7139 + } + }, + { + "items": [ + 4100.5, + 3.5229 + ], + "hints": { + "index": 7140 + } + }, + { + "items": [ + 4101, + 3.5148 + ], + "hints": { + "index": 7141 + } + }, + { + "items": [ + 4101.5, + 3.6141 + ], + "hints": { + "index": 7142 + } + }, + { + "items": [ + 4102, + 3.5642 + ], + "hints": { + "index": 7143 + } + }, + { + "items": [ + 4102.5, + 3.3766 + ], + "hints": { + "index": 7144 + } + }, + { + "items": [ + 4103, + 3.3073 + ], + "hints": { + "index": 7145 + } + }, + { + "items": [ + 4103.5, + 3.3495 + ], + "hints": { + "index": 7146 + } + }, + { + "items": [ + 4104, + 3.3626 + ], + "hints": { + "index": 7147 + } + }, + { + "items": [ + 4104.5, + 3.2316 + ], + "hints": { + "index": 7148 + } + }, + { + "items": [ + 4105, + 3.0277 + ], + "hints": { + "index": 7149 + } + }, + { + "items": [ + 4105.5, + 2.926 + ], + "hints": { + "index": 7150 + } + }, + { + "items": [ + 4106, + 3.0367 + ], + "hints": { + "index": 7151 + } + }, + { + "items": [ + 4106.5, + 3.3538 + ], + "hints": { + "index": 7152 + } + }, + { + "items": [ + 4107, + 3.689 + ], + "hints": { + "index": 7153 + } + }, + { + "items": [ + 4107.5, + 3.6277 + ], + "hints": { + "index": 7154 + } + }, + { + "items": [ + 4108, + 3.4153 + ], + "hints": { + "index": 7155 + } + }, + { + "items": [ + 4108.5, + 3.1577 + ], + "hints": { + "index": 7156 + } + }, + { + "items": [ + 4109, + 3.2452 + ], + "hints": { + "index": 7157 + } + }, + { + "items": [ + 4109.5, + 3.3877 + ], + "hints": { + "index": 7158 + } + }, + { + "items": [ + 4110, + 3.8095 + ], + "hints": { + "index": 7159 + } + }, + { + "items": [ + 4110.5, + 3.6664 + ], + "hints": { + "index": 7160 + } + }, + { + "items": [ + 4111, + 3.633 + ], + "hints": { + "index": 7161 + } + }, + { + "items": [ + 4111.5, + 3.2668 + ], + "hints": { + "index": 7162 + } + }, + { + "items": [ + 4112, + 3.3258 + ], + "hints": { + "index": 7163 + } + }, + { + "items": [ + 4112.5, + 3.2393 + ], + "hints": { + "index": 7164 + } + }, + { + "items": [ + 4113, + 3.4034 + ], + "hints": { + "index": 7165 + } + }, + { + "items": [ + 4113.5, + 3.5788 + ], + "hints": { + "index": 7166 + } + }, + { + "items": [ + 4114, + 3.6283 + ], + "hints": { + "index": 7167 + } + }, + { + "items": [ + 4114.5, + 3.3368 + ], + "hints": { + "index": 7168 + } + }, + { + "items": [ + 4115, + 3.0322999954223633 + ], + "hints": { + "index": 7169 + } + }, + { + "items": [ + 4115.5, + 2.9124000072479248 + ], + "hints": { + "index": 7170 + } + }, + { + "items": [ + 4116, + 2.973599910736084 + ], + "hints": { + "index": 7171 + } + }, + { + "items": [ + 4116.5, + 3.0148999691009521 + ], + "hints": { + "index": 7172 + } + }, + { + "items": [ + 4117, + 2.962899923324585 + ], + "hints": { + "index": 7173 + } + }, + { + "items": [ + 4117.5, + 3.117 + ], + "hints": { + "index": 7174 + } + }, + { + "items": [ + 4118, + 3.1997 + ], + "hints": { + "index": 7175 + } + }, + { + "items": [ + 4118.5, + 3.6956 + ], + "hints": { + "index": 7176 + } + }, + { + "items": [ + 4119, + 4.1206 + ], + "hints": { + "index": 7177 + } + }, + { + "items": [ + 4119.5, + 4.8784 + ], + "hints": { + "index": 7178 + } + }, + { + "items": [ + 4120, + 4.8506 + ], + "hints": { + "index": 7179 + } + }, + { + "items": [ + 4120.5, + 4.4675 + ], + "hints": { + "index": 7180 + } + }, + { + "items": [ + 4121, + 3.962 + ], + "hints": { + "index": 7181 + } + }, + { + "items": [ + 4121.5, + 3.6346 + ], + "hints": { + "index": 7182 + } + }, + { + "items": [ + 4122, + 3.2934 + ], + "hints": { + "index": 7183 + } + }, + { + "items": [ + 4122.5, + 3.1069 + ], + "hints": { + "index": 7184 + } + }, + { + "items": [ + 4123, + 3.0852 + ], + "hints": { + "index": 7185 + } + }, + { + "items": [ + 4123.5, + 3.2218 + ], + "hints": { + "index": 7186 + } + }, + { + "items": [ + 4124, + 3.285 + ], + "hints": { + "index": 7187 + } + }, + { + "items": [ + 4124.5, + 3.3246 + ], + "hints": { + "index": 7188 + } + }, + { + "items": [ + 4125, + 3.3344 + ], + "hints": { + "index": 7189 + } + }, + { + "items": [ + 4125.5, + 3.4168 + ], + "hints": { + "index": 7190 + } + }, + { + "items": [ + 4126, + 3.5961 + ], + "hints": { + "index": 7191 + } + }, + { + "items": [ + 4126.5, + 3.6822 + ], + "hints": { + "index": 7192 + } + }, + { + "items": [ + 4127, + 3.8732 + ], + "hints": { + "index": 7193 + } + }, + { + "items": [ + 4127.5, + 3.6374 + ], + "hints": { + "index": 7194 + } + }, + { + "items": [ + 4128, + 3.5548 + ], + "hints": { + "index": 7195 + } + }, + { + "items": [ + 4128.5, + 3.4498 + ], + "hints": { + "index": 7196 + } + }, + { + "items": [ + 4129, + 3.5542 + ], + "hints": { + "index": 7197 + } + }, + { + "items": [ + 4129.5, + 3.6517 + ], + "hints": { + "index": 7198 + } + }, + { + "items": [ + 4130, + 3.853 + ], + "hints": { + "index": 7199 + } + }, + { + "items": [ + 4130.5, + 3.9141 + ], + "hints": { + "index": 7200 + } + }, + { + "items": [ + 4131, + 3.8389 + ], + "hints": { + "index": 7201 + } + }, + { + "items": [ + 4131.5, + 3.5918 + ], + "hints": { + "index": 7202 + } + }, + { + "items": [ + 4132, + 3.4472 + ], + "hints": { + "index": 7203 + } + }, + { + "items": [ + 4132.5, + 3.7099 + ], + "hints": { + "index": 7204 + } + }, + { + "items": [ + 4133, + 4.047 + ], + "hints": { + "index": 7205 + } + }, + { + "items": [ + 4133.5, + 4.3934 + ], + "hints": { + "index": 7206 + } + }, + { + "items": [ + 4134, + 4.4859 + ], + "hints": { + "index": 7207 + } + }, + { + "items": [ + 4134.5, + 4.6056 + ], + "hints": { + "index": 7208 + } + }, + { + "items": [ + 4135, + 4.8203 + ], + "hints": { + "index": 7209 + } + }, + { + "items": [ + 4135.5, + 4.9015 + ], + "hints": { + "index": 7210 + } + }, + { + "items": [ + 4136, + 4.5405 + ], + "hints": { + "index": 7211 + } + }, + { + "items": [ + 4136.5, + 3.9378 + ], + "hints": { + "index": 7212 + } + }, + { + "items": [ + 4137, + 3.6682 + ], + "hints": { + "index": 7213 + } + }, + { + "items": [ + 4137.5, + 3.5828 + ], + "hints": { + "index": 7214 + } + }, + { + "items": [ + 4138, + 4.0899 + ], + "hints": { + "index": 7215 + } + }, + { + "items": [ + 4138.5, + 4.1282 + ], + "hints": { + "index": 7216 + } + }, + { + "items": [ + 4139, + 4.0367 + ], + "hints": { + "index": 7217 + } + }, + { + "items": [ + 4139.5, + 3.538 + ], + "hints": { + "index": 7218 + } + }, + { + "items": [ + 4140, + 3.3208 + ], + "hints": { + "index": 7219 + } + }, + { + "items": [ + 4140.5, + 3.2254 + ], + "hints": { + "index": 7220 + } + }, + { + "items": [ + 4141, + 3.3924 + ], + "hints": { + "index": 7221 + } + }, + { + "items": [ + 4141.5, + 3.5916 + ], + "hints": { + "index": 7222 + } + }, + { + "items": [ + 4142, + 3.9284 + ], + "hints": { + "index": 7223 + } + }, + { + "items": [ + 4142.5, + 4.2808 + ], + "hints": { + "index": 7224 + } + }, + { + "items": [ + 4143, + 4.7353 + ], + "hints": { + "index": 7225 + } + }, + { + "items": [ + 4143.5, + 4.7535 + ], + "hints": { + "index": 7226 + } + }, + { + "items": [ + 4144, + 4.3947 + ], + "hints": { + "index": 7227 + } + }, + { + "items": [ + 4144.5, + 4.1419 + ], + "hints": { + "index": 7228 + } + }, + { + "items": [ + 4145, + 4.2804 + ], + "hints": { + "index": 7229 + } + }, + { + "items": [ + 4145.5, + 4.3984 + ], + "hints": { + "index": 7230 + } + }, + { + "items": [ + 4146, + 4.2132 + ], + "hints": { + "index": 7231 + } + }, + { + "items": [ + 4146.5, + 3.7954 + ], + "hints": { + "index": 7232 + } + }, + { + "items": [ + 4147, + 3.6087 + ], + "hints": { + "index": 7233 + } + }, + { + "items": [ + 4147.5, + 3.429 + ], + "hints": { + "index": 7234 + } + }, + { + "items": [ + 4148, + 3.5028 + ], + "hints": { + "index": 7235 + } + }, + { + "items": [ + 4148.5, + 3.3013 + ], + "hints": { + "index": 7236 + } + }, + { + "items": [ + 4149, + 3.3921 + ], + "hints": { + "index": 7237 + } + }, + { + "items": [ + 4149.5, + 3.3115 + ], + "hints": { + "index": 7238 + } + }, + { + "items": [ + 4150, + 3.4529 + ], + "hints": { + "index": 7239 + } + }, + { + "items": [ + 4150.5, + 3.3348 + ], + "hints": { + "index": 7240 + } + }, + { + "items": [ + 4151, + 3.2039 + ], + "hints": { + "index": 7241 + } + }, + { + "items": [ + 4151.5, + 3.2557 + ], + "hints": { + "index": 7242 + } + }, + { + "items": [ + 4152, + 3.5935 + ], + "hints": { + "index": 7243 + } + }, + { + "items": [ + 4152.5, + 4.0792 + ], + "hints": { + "index": 7244 + } + }, + { + "items": [ + 4153, + 4.407 + ], + "hints": { + "index": 7245 + } + }, + { + "items": [ + 4153.5, + 4.1066 + ], + "hints": { + "index": 7246 + } + }, + { + "items": [ + 4154, + 4.0593 + ], + "hints": { + "index": 7247 + } + }, + { + "items": [ + 4154.5, + 3.8894 + ], + "hints": { + "index": 7248 + } + }, + { + "items": [ + 4155, + 4.1745 + ], + "hints": { + "index": 7249 + } + }, + { + "items": [ + 4155.5, + 4.1098 + ], + "hints": { + "index": 7250 + } + }, + { + "items": [ + 4156, + 4.2666001319885254 + ], + "hints": { + "index": 7251 + } + }, + { + "items": [ + 4156.5, + 4.6326999664306641 + ], + "hints": { + "index": 7252 + } + }, + { + "items": [ + 4157, + 4.7181000709533691 + ], + "hints": { + "index": 7253 + } + }, + { + "items": [ + 4157.5, + 4.5563998222351074 + ], + "hints": { + "index": 7254 + } + }, + { + "items": [ + 4158, + 4.3407001495361328 + ], + "hints": { + "index": 7255 + } + }, + { + "items": [ + 4158.5, + 4.6552000045776367 + ], + "hints": { + "index": 7256 + } + }, + { + "items": [ + 4159, + 4.7578001022338867 + ], + "hints": { + "index": 7257 + } + }, + { + "items": [ + 4159.5, + 4.634699821472168 + ], + "hints": { + "index": 7258 + } + }, + { + "items": [ + 4160, + 5.0166001319885254 + ], + "hints": { + "index": 7259 + } + }, + { + "items": [ + 4160.5, + 6.6611 + ], + "hints": { + "index": 7260 + } + }, + { + "items": [ + 4161, + 9.2988004684448242 + ], + "hints": { + "index": 7261 + } + }, + { + "items": [ + 4161.5, + 10.493 + ], + "hints": { + "index": 7262 + } + }, + { + "items": [ + 4162, + 11.540300369262695 + ], + "hints": { + "index": 7263 + } + }, + { + "items": [ + 4162.5, + 9.6165 + ], + "hints": { + "index": 7264 + } + }, + { + "items": [ + 4163, + 6.9092 + ], + "hints": { + "index": 7265 + } + }, + { + "items": [ + 4163.5, + 5.3424 + ], + "hints": { + "index": 7266 + } + }, + { + "items": [ + 4164, + 4.9040999412536621 + ], + "hints": { + "index": 7267 + } + }, + { + "items": [ + 4164.5, + 5.1908998489379883 + ], + "hints": { + "index": 7268 + } + }, + { + "items": [ + 4165, + 4.9643998146057129 + ], + "hints": { + "index": 7269 + } + }, + { + "items": [ + 4165.5, + 4.4104 + ], + "hints": { + "index": 7270 + } + }, + { + "items": [ + 4166, + 3.8208 + ], + "hints": { + "index": 7271 + } + }, + { + "items": [ + 4166.5, + 3.5788 + ], + "hints": { + "index": 7272 + } + }, + { + "items": [ + 4167, + 4.0245 + ], + "hints": { + "index": 7273 + } + }, + { + "items": [ + 4167.5, + 4.4605998992919922 + ], + "hints": { + "index": 7274 + } + }, + { + "items": [ + 4168, + 6.89139986038208 + ], + "hints": { + "index": 7275 + } + }, + { + "items": [ + 4168.5, + 10.285099983215332 + ], + "hints": { + "index": 7276 + } + }, + { + "items": [ + 4169, + 21.3805 + ], + "hints": { + "index": 7277 + } + }, + { + "items": [ + 4169.5, + 22.422599792480469 + ], + "hints": { + "index": 7278 + } + }, + { + "items": [ + 4170, + 21.9682 + ], + "hints": { + "index": 7279 + } + }, + { + "items": [ + 4170.5, + 22.4772 + ], + "hints": { + "index": 7280 + } + }, + { + "items": [ + 4171, + 22.0243 + ], + "hints": { + "index": 7281 + } + }, + { + "items": [ + 4171.5, + 19.681999206542969 + ], + "hints": { + "index": 7282 + } + }, + { + "items": [ + 4172, + 11.7917 + ], + "hints": { + "index": 7283 + } + }, + { + "items": [ + 4172.5, + 8.4769001007080078 + ], + "hints": { + "index": 7284 + } + }, + { + "items": [ + 4173, + 6.3853001594543457 + ], + "hints": { + "index": 7285 + } + }, + { + "items": [ + 4173.5, + 5.56279993057251 + ], + "hints": { + "index": 7286 + } + }, + { + "items": [ + 4174, + 5.01 + ], + "hints": { + "index": 7287 + } + }, + { + "items": [ + 4174.5, + 5.0524 + ], + "hints": { + "index": 7288 + } + }, + { + "items": [ + 4175, + 5.5921998023986816 + ], + "hints": { + "index": 7289 + } + }, + { + "items": [ + 4175.5, + 5.7569 + ], + "hints": { + "index": 7290 + } + }, + { + "items": [ + 4176, + 5.2888998985290527 + ], + "hints": { + "index": 7291 + } + }, + { + "items": [ + 4176.5, + 6.0971 + ], + "hints": { + "index": 7292 + } + }, + { + "items": [ + 4177, + 7.6425 + ], + "hints": { + "index": 7293 + } + }, + { + "items": [ + 4177.5, + 10.202799797058104 + ], + "hints": { + "index": 7294 + } + }, + { + "items": [ + 4178, + 10.4421 + ], + "hints": { + "index": 7295 + } + }, + { + "items": [ + 4178.5, + 11.9698 + ], + "hints": { + "index": 7296 + } + }, + { + "items": [ + 4179, + 11.67 + ], + "hints": { + "index": 7297 + } + }, + { + "items": [ + 4179.5, + 7.9249 + ], + "hints": { + "index": 7298 + } + }, + { + "items": [ + 4180, + 5.2635 + ], + "hints": { + "index": 7299 + } + }, + { + "items": [ + 4180.5, + 4.2957000732421875 + ], + "hints": { + "index": 7300 + } + }, + { + "items": [ + 4181, + 4.6297 + ], + "hints": { + "index": 7301 + } + }, + { + "items": [ + 4181.5, + 4.9174 + ], + "hints": { + "index": 7302 + } + }, + { + "items": [ + 4182, + 5.0235 + ], + "hints": { + "index": 7303 + } + }, + { + "items": [ + 4182.5, + 4.2941 + ], + "hints": { + "index": 7304 + } + }, + { + "items": [ + 4183, + 3.8203 + ], + "hints": { + "index": 7305 + } + }, + { + "items": [ + 4183.5, + 3.7277 + ], + "hints": { + "index": 7306 + } + }, + { + "items": [ + 4184, + 3.6173 + ], + "hints": { + "index": 7307 + } + }, + { + "items": [ + 4184.5, + 3.8266 + ], + "hints": { + "index": 7308 + } + }, + { + "items": [ + 4185, + 3.769 + ], + "hints": { + "index": 7309 + } + }, + { + "items": [ + 4185.5, + 4.0146999359130859 + ], + "hints": { + "index": 7310 + } + }, + { + "items": [ + 4186, + 4.2079 + ], + "hints": { + "index": 7311 + } + }, + { + "items": [ + 4186.5, + 4.9959001541137695 + ], + "hints": { + "index": 7312 + } + }, + { + "items": [ + 4187, + 6.8409 + ], + "hints": { + "index": 7313 + } + }, + { + "items": [ + 4187.5, + 7.6234002113342285 + ], + "hints": { + "index": 7314 + } + }, + { + "items": [ + 4188, + 7.7926 + ], + "hints": { + "index": 7315 + } + }, + { + "items": [ + 4188.5, + 8.75 + ], + "hints": { + "index": 7316 + } + }, + { + "items": [ + 4189, + 13.3199 + ], + "hints": { + "index": 7317 + } + }, + { + "items": [ + 4189.5, + 21.4473 + ], + "hints": { + "index": 7318 + } + }, + { + "items": [ + 4190, + 16.6516 + ], + "hints": { + "index": 7319 + } + }, + { + "items": [ + 4190.5, + 13.3331 + ], + "hints": { + "index": 7320 + } + }, + { + "items": [ + 4191, + 9.3821 + ], + "hints": { + "index": 7321 + } + }, + { + "items": [ + 4191.5, + 8.3799 + ], + "hints": { + "index": 7322 + } + }, + { + "items": [ + 4192, + 7.2221 + ], + "hints": { + "index": 7323 + } + }, + { + "items": [ + 4192.5, + 6.9058 + ], + "hints": { + "index": 7324 + } + }, + { + "items": [ + 4193, + 5.061 + ], + "hints": { + "index": 7325 + } + }, + { + "items": [ + 4193.5, + 7.6218 + ], + "hints": { + "index": 7326 + } + }, + { + "items": [ + 4194, + 10.4369 + ], + "hints": { + "index": 7327 + } + }, + { + "items": [ + 4194.5, + 16.0976 + ], + "hints": { + "index": 7328 + } + }, + { + "items": [ + 4195, + 20.5653 + ], + "hints": { + "index": 7329 + } + }, + { + "items": [ + 4195.5, + 19.4338 + ], + "hints": { + "index": 7330 + } + }, + { + "items": [ + 4196, + 17.3511 + ], + "hints": { + "index": 7331 + } + }, + { + "items": [ + 4196.5, + 14.1285 + ], + "hints": { + "index": 7332 + } + }, + { + "items": [ + 4197, + 15.940999984741213 + ], + "hints": { + "index": 7333 + } + }, + { + "items": [ + 4197.5, + 17.0726 + ], + "hints": { + "index": 7334 + } + }, + { + "items": [ + 4198, + 21.7388 + ], + "hints": { + "index": 7335 + } + }, + { + "items": [ + 4198.5, + 20.5728 + ], + "hints": { + "index": 7336 + } + }, + { + "items": [ + 4199, + 21.2412 + ], + "hints": { + "index": 7337 + } + }, + { + "items": [ + 4199.5, + 22.1119 + ], + "hints": { + "index": 7338 + } + }, + { + "items": [ + 4200, + 23.6395 + ], + "hints": { + "index": 7339 + } + }, + { + "items": [ + 4200.5, + 21.1229 + ], + "hints": { + "index": 7340 + } + }, + { + "items": [ + 4201, + 19.9251 + ], + "hints": { + "index": 7341 + } + }, + { + "items": [ + 4201.5, + 14.5571 + ], + "hints": { + "index": 7342 + } + }, + { + "items": [ + 4202, + 11.8401 + ], + "hints": { + "index": 7343 + } + }, + { + "items": [ + 4202.5, + 7.8828 + ], + "hints": { + "index": 7344 + } + }, + { + "items": [ + 4203, + 8.0816 + ], + "hints": { + "index": 7345 + } + }, + { + "items": [ + 4203.5, + 8.6929 + ], + "hints": { + "index": 7346 + } + }, + { + "items": [ + 4204, + 9.5825 + ], + "hints": { + "index": 7347 + } + }, + { + "items": [ + 4204.5, + 9.3211 + ], + "hints": { + "index": 7348 + } + }, + { + "items": [ + 4205, + 9.0805 + ], + "hints": { + "index": 7349 + } + }, + { + "items": [ + 4205.5, + 7.3533 + ], + "hints": { + "index": 7350 + } + }, + { + "items": [ + 4206, + 5.7307 + ], + "hints": { + "index": 7351 + } + }, + { + "items": [ + 4206.5, + 5.0482 + ], + "hints": { + "index": 7352 + } + }, + { + "items": [ + 4207, + 5.4008 + ], + "hints": { + "index": 7353 + } + }, + { + "items": [ + 4207.5, + 6.4253 + ], + "hints": { + "index": 7354 + } + }, + { + "items": [ + 4208, + 7.643 + ], + "hints": { + "index": 7355 + } + }, + { + "items": [ + 4208.5, + 10.2349 + ], + "hints": { + "index": 7356 + } + }, + { + "items": [ + 4209, + 11.8809 + ], + "hints": { + "index": 7357 + } + }, + { + "items": [ + 4209.5, + 10.9966 + ], + "hints": { + "index": 7358 + } + }, + { + "items": [ + 4210, + 9.8847 + ], + "hints": { + "index": 7359 + } + }, + { + "items": [ + 4210.5, + 7.5798 + ], + "hints": { + "index": 7360 + } + }, + { + "items": [ + 4211, + 6.9395 + ], + "hints": { + "index": 7361 + } + }, + { + "items": [ + 4211.5, + 5.9417 + ], + "hints": { + "index": 7362 + } + }, + { + "items": [ + 4212, + 6.4321 + ], + "hints": { + "index": 7363 + } + }, + { + "items": [ + 4212.5, + 7.724599838256835 + ], + "hints": { + "index": 7364 + } + }, + { + "items": [ + 4213, + 11.206100463867188 + ], + "hints": { + "index": 7365 + } + }, + { + "items": [ + 4213.5, + 14.480400085449221 + ], + "hints": { + "index": 7366 + } + }, + { + "items": [ + 4214, + 13.88510036468506 + ], + "hints": { + "index": 7367 + } + }, + { + "items": [ + 4214.5, + 11.027400016784668 + ], + "hints": { + "index": 7368 + } + }, + { + "items": [ + 4215, + 10.666099548339844 + ], + "hints": { + "index": 7369 + } + }, + { + "items": [ + 4215.5, + 11.507900238037108 + ], + "hints": { + "index": 7370 + } + }, + { + "items": [ + 4216, + 9.2147998809814453 + ], + "hints": { + "index": 7371 + } + }, + { + "items": [ + 4216.5, + 7.3393001556396484 + ], + "hints": { + "index": 7372 + } + }, + { + "items": [ + 4217, + 7.6529998779296884 + ], + "hints": { + "index": 7373 + } + }, + { + "items": [ + 4217.5, + 10.768500328063965 + ], + "hints": { + "index": 7374 + } + }, + { + "items": [ + 4218, + 18.659999847412109 + ], + "hints": { + "index": 7375 + } + }, + { + "items": [ + 4218.5, + 18.221200942993164 + ], + "hints": { + "index": 7376 + } + }, + { + "items": [ + 4219, + 17.940700531005859 + ], + "hints": { + "index": 7377 + } + }, + { + "items": [ + 4219.5, + 17.202400207519531 + ], + "hints": { + "index": 7378 + } + }, + { + "items": [ + 4220, + 16.563100814819336 + ], + "hints": { + "index": 7379 + } + }, + { + "items": [ + 4220.5, + 17.005599975585938 + ], + "hints": { + "index": 7380 + } + }, + { + "items": [ + 4221, + 16.928800582885742 + ], + "hints": { + "index": 7381 + } + }, + { + "items": [ + 4221.5, + 18.318700790405273 + ], + "hints": { + "index": 7382 + } + }, + { + "items": [ + 4222, + 13.535699844360352 + ], + "hints": { + "index": 7383 + } + }, + { + "items": [ + 4222.5, + 11.894700050354004 + ], + "hints": { + "index": 7384 + } + }, + { + "items": [ + 4223, + 11.738699913024902 + ], + "hints": { + "index": 7385 + } + }, + { + "items": [ + 4223.5, + 13.579299926757813 + ], + "hints": { + "index": 7386 + } + }, + { + "items": [ + 4224, + 15.639800071716309 + ], + "hints": { + "index": 7387 + } + }, + { + "items": [ + 4224.5, + 17.41309928894043 + ], + "hints": { + "index": 7388 + } + }, + { + "items": [ + 4225, + 13.8256 + ], + "hints": { + "index": 7389 + } + }, + { + "items": [ + 4225.5, + 12.5491 + ], + "hints": { + "index": 7390 + } + }, + { + "items": [ + 4226, + 12.2155 + ], + "hints": { + "index": 7391 + } + }, + { + "items": [ + 4226.5, + 14.1452 + ], + "hints": { + "index": 7392 + } + }, + { + "items": [ + 4227, + 15.4225 + ], + "hints": { + "index": 7393 + } + }, + { + "items": [ + 4227.5, + 16.7373 + ], + "hints": { + "index": 7394 + } + }, + { + "items": [ + 4228, + 19.0233 + ], + "hints": { + "index": 7395 + } + }, + { + "items": [ + 4228.5, + 20.9727 + ], + "hints": { + "index": 7396 + } + }, + { + "items": [ + 4229, + 24.8661 + ], + "hints": { + "index": 7397 + } + }, + { + "items": [ + 4229.5, + 19.1134 + ], + "hints": { + "index": 7398 + } + }, + { + "items": [ + 4230, + 16.0324 + ], + "hints": { + "index": 7399 + } + }, + { + "items": [ + 4230.5, + 15.6208 + ], + "hints": { + "index": 7400 + } + }, + { + "items": [ + 4231, + 15.3937 + ], + "hints": { + "index": 7401 + } + }, + { + "items": [ + 4231.5, + 14.5338 + ], + "hints": { + "index": 7402 + } + }, + { + "items": [ + 4232, + 14.4751 + ], + "hints": { + "index": 7403 + } + }, + { + "items": [ + 4232.5, + 18.1643 + ], + "hints": { + "index": 7404 + } + }, + { + "items": [ + 4233, + 21.4082 + ], + "hints": { + "index": 7405 + } + }, + { + "items": [ + 4233.5, + 19.546 + ], + "hints": { + "index": 7406 + } + }, + { + "items": [ + 4234, + 15.8455 + ], + "hints": { + "index": 7407 + } + }, + { + "items": [ + 4234.5, + 17.4547 + ], + "hints": { + "index": 7408 + } + }, + { + "items": [ + 4235, + 18.0931 + ], + "hints": { + "index": 7409 + } + }, + { + "items": [ + 4235.5, + 19.1719 + ], + "hints": { + "index": 7410 + } + }, + { + "items": [ + 4236, + 14.878 + ], + "hints": { + "index": 7411 + } + }, + { + "items": [ + 4236.5, + 14.3715 + ], + "hints": { + "index": 7412 + } + }, + { + "items": [ + 4237, + 16.37 + ], + "hints": { + "index": 7413 + } + }, + { + "items": [ + 4237.5, + 21.4278 + ], + "hints": { + "index": 7414 + } + }, + { + "items": [ + 4238, + 24.6138 + ], + "hints": { + "index": 7415 + } + }, + { + "items": [ + 4238.5, + 25.465700149536133 + ], + "hints": { + "index": 7416 + } + }, + { + "items": [ + 4239, + 20.96820068359375 + ], + "hints": { + "index": 7417 + } + }, + { + "items": [ + 4239.5, + 10.8624 + ], + "hints": { + "index": 7418 + } + }, + { + "items": [ + 4240, + 8.6753997802734375 + ], + "hints": { + "index": 7419 + } + }, + { + "items": [ + 4240.5, + 9.1133 + ], + "hints": { + "index": 7420 + } + }, + { + "items": [ + 4241, + 13.375200271606444 + ], + "hints": { + "index": 7421 + } + }, + { + "items": [ + 4241.5, + 15.1951 + ], + "hints": { + "index": 7422 + } + }, + { + "items": [ + 4242, + 9.5179996490478516 + ], + "hints": { + "index": 7423 + } + }, + { + "items": [ + 4242.5, + 8.3078 + ], + "hints": { + "index": 7424 + } + }, + { + "items": [ + 4243, + 8.3556003570556641 + ], + "hints": { + "index": 7425 + } + }, + { + "items": [ + 4243.5, + 10.539 + ], + "hints": { + "index": 7426 + } + }, + { + "items": [ + 4244, + 10.592 + ], + "hints": { + "index": 7427 + } + }, + { + "items": [ + 4244.5, + 9.7741003036499023 + ], + "hints": { + "index": 7428 + } + }, + { + "items": [ + 4245, + 8.547 + ], + "hints": { + "index": 7429 + } + }, + { + "items": [ + 4245.5, + 8.3067 + ], + "hints": { + "index": 7430 + } + }, + { + "items": [ + 4246, + 7.9442 + ], + "hints": { + "index": 7431 + } + }, + { + "items": [ + 4246.5, + 8.8617000579833984 + ], + "hints": { + "index": 7432 + } + }, + { + "items": [ + 4247, + 9.9413 + ], + "hints": { + "index": 7433 + } + }, + { + "items": [ + 4247.5, + 10.583900451660156 + ], + "hints": { + "index": 7434 + } + }, + { + "items": [ + 4248, + 11.225600242614746 + ], + "hints": { + "index": 7435 + } + }, + { + "items": [ + 4248.5, + 11.133500099182127 + ], + "hints": { + "index": 7436 + } + }, + { + "items": [ + 4249, + 10.544 + ], + "hints": { + "index": 7437 + } + }, + { + "items": [ + 4249.5, + 10.3976 + ], + "hints": { + "index": 7438 + } + }, + { + "items": [ + 4250, + 10.768099784851074 + ], + "hints": { + "index": 7439 + } + }, + { + "items": [ + 4250.5, + 13.31149959564209 + ], + "hints": { + "index": 7440 + } + }, + { + "items": [ + 4251, + 13.1766 + ], + "hints": { + "index": 7441 + } + }, + { + "items": [ + 4251.5, + 12.9099 + ], + "hints": { + "index": 7442 + } + }, + { + "items": [ + 4252, + 11.7246 + ], + "hints": { + "index": 7443 + } + }, + { + "items": [ + 4252.5, + 11.628499984741213 + ], + "hints": { + "index": 7444 + } + }, + { + "items": [ + 4253, + 10.604299545288086 + ], + "hints": { + "index": 7445 + } + }, + { + "items": [ + 4253.5, + 9.6569 + ], + "hints": { + "index": 7446 + } + }, + { + "items": [ + 4254, + 8.9561004638671875 + ], + "hints": { + "index": 7447 + } + }, + { + "items": [ + 4254.5, + 10.3056001663208 + ], + "hints": { + "index": 7448 + } + }, + { + "items": [ + 4255, + 11.905200004577637 + ], + "hints": { + "index": 7449 + } + }, + { + "items": [ + 4255.5, + 14.3337 + ], + "hints": { + "index": 7450 + } + }, + { + "items": [ + 4256, + 14.3499 + ], + "hints": { + "index": 7451 + } + }, + { + "items": [ + 4256.5, + 14.998800277709959 + ], + "hints": { + "index": 7452 + } + }, + { + "items": [ + 4257, + 13.717300415039063 + ], + "hints": { + "index": 7453 + } + }, + { + "items": [ + 4257.5, + 10.5504 + ], + "hints": { + "index": 7454 + } + }, + { + "items": [ + 4258, + 10.176799774169922 + ], + "hints": { + "index": 7455 + } + }, + { + "items": [ + 4258.5, + 10.3837 + ], + "hints": { + "index": 7456 + } + }, + { + "items": [ + 4259, + 9.8475 + ], + "hints": { + "index": 7457 + } + }, + { + "items": [ + 4259.5, + 8.6761999130249023 + ], + "hints": { + "index": 7458 + } + }, + { + "items": [ + 4260, + 8.2826995849609375 + ], + "hints": { + "index": 7459 + } + }, + { + "items": [ + 4260.5, + 9.3299 + ], + "hints": { + "index": 7460 + } + }, + { + "items": [ + 4261, + 11.969 + ], + "hints": { + "index": 7461 + } + }, + { + "items": [ + 4261.5, + 15.384799957275392 + ], + "hints": { + "index": 7462 + } + }, + { + "items": [ + 4262, + 19.5495 + ], + "hints": { + "index": 7463 + } + }, + { + "items": [ + 4262.5, + 12.423399925231934 + ], + "hints": { + "index": 7464 + } + }, + { + "items": [ + 4263, + 8.61400032043457 + ], + "hints": { + "index": 7465 + } + }, + { + "items": [ + 4263.5, + 6.6421 + ], + "hints": { + "index": 7466 + } + }, + { + "items": [ + 4264, + 7.5377 + ], + "hints": { + "index": 7467 + } + }, + { + "items": [ + 4264.5, + 7.3259 + ], + "hints": { + "index": 7468 + } + }, + { + "items": [ + 4265, + 6.343599796295166 + ], + "hints": { + "index": 7469 + } + }, + { + "items": [ + 4265.5, + 4.9015002250671387 + ], + "hints": { + "index": 7470 + } + }, + { + "items": [ + 4266, + 4.237299919128418 + ], + "hints": { + "index": 7471 + } + }, + { + "items": [ + 4266.5, + 4.1969 + ], + "hints": { + "index": 7472 + } + }, + { + "items": [ + 4267, + 3.8901000022888184 + ], + "hints": { + "index": 7473 + } + }, + { + "items": [ + 4267.5, + 3.8924 + ], + "hints": { + "index": 7474 + } + }, + { + "items": [ + 4268, + 3.7884 + ], + "hints": { + "index": 7475 + } + }, + { + "items": [ + 4268.5, + 3.8899 + ], + "hints": { + "index": 7476 + } + }, + { + "items": [ + 4269, + 4.0146 + ], + "hints": { + "index": 7477 + } + }, + { + "items": [ + 4269.5, + 4.193 + ], + "hints": { + "index": 7478 + } + }, + { + "items": [ + 4270, + 4.0911002159118652 + ], + "hints": { + "index": 7479 + } + }, + { + "items": [ + 4270.5, + 3.8635 + ], + "hints": { + "index": 7480 + } + }, + { + "items": [ + 4271, + 4.7918 + ], + "hints": { + "index": 7481 + } + }, + { + "items": [ + 4271.5, + 6.4798998832702637 + ], + "hints": { + "index": 7482 + } + }, + { + "items": [ + 4272, + 8.9972000122070313 + ], + "hints": { + "index": 7483 + } + }, + { + "items": [ + 4272.5, + 9.4011001586914063 + ], + "hints": { + "index": 7484 + } + }, + { + "items": [ + 4273, + 10.762700080871582 + ], + "hints": { + "index": 7485 + } + }, + { + "items": [ + 4273.5, + 13.2245 + ], + "hints": { + "index": 7486 + } + }, + { + "items": [ + 4274, + 9.4438 + ], + "hints": { + "index": 7487 + } + }, + { + "items": [ + 4274.5, + 5.9812002182006836 + ], + "hints": { + "index": 7488 + } + }, + { + "items": [ + 4275, + 4.4236998558044434 + ], + "hints": { + "index": 7489 + } + }, + { + "items": [ + 4275.5, + 3.9442 + ], + "hints": { + "index": 7490 + } + }, + { + "items": [ + 4276, + 3.8173999786376953 + ], + "hints": { + "index": 7491 + } + }, + { + "items": [ + 4276.5, + 3.657 + ], + "hints": { + "index": 7492 + } + }, + { + "items": [ + 4277, + 3.638 + ], + "hints": { + "index": 7493 + } + }, + { + "items": [ + 4277.5, + 4.1891999244689941 + ], + "hints": { + "index": 7494 + } + }, + { + "items": [ + 4278, + 6.2599 + ], + "hints": { + "index": 7495 + } + }, + { + "items": [ + 4278.5, + 9.1896 + ], + "hints": { + "index": 7496 + } + }, + { + "items": [ + 4279, + 14.021100044250488 + ], + "hints": { + "index": 7497 + } + }, + { + "items": [ + 4279.5, + 17.7352 + ], + "hints": { + "index": 7498 + } + }, + { + "items": [ + 4280, + 10.989700317382813 + ], + "hints": { + "index": 7499 + } + }, + { + "items": [ + 4280.5, + 9.4776 + ], + "hints": { + "index": 7500 + } + }, + { + "items": [ + 4281, + 9.6948995590209961 + ], + "hints": { + "index": 7501 + } + }, + { + "items": [ + 4281.5, + 13.1346 + ], + "hints": { + "index": 7502 + } + }, + { + "items": [ + 4282, + 15.5918 + ], + "hints": { + "index": 7503 + } + }, + { + "items": [ + 4282.5, + 17.1065 + ], + "hints": { + "index": 7504 + } + }, + { + "items": [ + 4283, + 16.0007 + ], + "hints": { + "index": 7505 + } + }, + { + "items": [ + 4283.5, + 12.0823 + ], + "hints": { + "index": 7506 + } + }, + { + "items": [ + 4284, + 9.0717000961303711 + ], + "hints": { + "index": 7507 + } + }, + { + "items": [ + 4284.5, + 7.0465 + ], + "hints": { + "index": 7508 + } + }, + { + "items": [ + 4285, + 5.746300220489502 + ], + "hints": { + "index": 7509 + } + }, + { + "items": [ + 4285.5, + 5.1829 + ], + "hints": { + "index": 7510 + } + }, + { + "items": [ + 4286, + 4.9218001365661621 + ], + "hints": { + "index": 7511 + } + }, + { + "items": [ + 4286.5, + 6.222099781036377 + ], + "hints": { + "index": 7512 + } + }, + { + "items": [ + 4287, + 8.46150016784668 + ], + "hints": { + "index": 7513 + } + }, + { + "items": [ + 4287.5, + 12.7919 + ], + "hints": { + "index": 7514 + } + }, + { + "items": [ + 4288, + 15.5533 + ], + "hints": { + "index": 7515 + } + }, + { + "items": [ + 4288.5, + 15.2946 + ], + "hints": { + "index": 7516 + } + }, + { + "items": [ + 4289, + 13.396699905395508 + ], + "hints": { + "index": 7517 + } + }, + { + "items": [ + 4289.5, + 12.649999618530272 + ], + "hints": { + "index": 7518 + } + }, + { + "items": [ + 4290, + 10.534899711608888 + ], + "hints": { + "index": 7519 + } + }, + { + "items": [ + 4290.5, + 10.80620002746582 + ], + "hints": { + "index": 7520 + } + }, + { + "items": [ + 4291, + 8.1006002426147461 + ], + "hints": { + "index": 7521 + } + }, + { + "items": [ + 4291.5, + 6.3214001655578613 + ], + "hints": { + "index": 7522 + } + }, + { + "items": [ + 4292, + 4.8502001762390137 + ], + "hints": { + "index": 7523 + } + }, + { + "items": [ + 4292.5, + 4.291600227355957 + ], + "hints": { + "index": 7524 + } + }, + { + "items": [ + 4293, + 4.3702 + ], + "hints": { + "index": 7525 + } + }, + { + "items": [ + 4293.5, + 4.7513999938964844 + ], + "hints": { + "index": 7526 + } + }, + { + "items": [ + 4294, + 6.337 + ], + "hints": { + "index": 7527 + } + }, + { + "items": [ + 4294.5, + 8.86929988861084 + ], + "hints": { + "index": 7528 + } + }, + { + "items": [ + 4295, + 11.434200286865234 + ], + "hints": { + "index": 7529 + } + }, + { + "items": [ + 4295.5, + 7.8808999061584482 + ], + "hints": { + "index": 7530 + } + }, + { + "items": [ + 4296, + 7.6820998191833505 + ], + "hints": { + "index": 7531 + } + }, + { + "items": [ + 4296.5, + 8.851099967956543 + ], + "hints": { + "index": 7532 + } + }, + { + "items": [ + 4297, + 10.1534 + ], + "hints": { + "index": 7533 + } + }, + { + "items": [ + 4297.5, + 7.397200107574462 + ], + "hints": { + "index": 7534 + } + }, + { + "items": [ + 4298, + 5.3531999588012695 + ], + "hints": { + "index": 7535 + } + }, + { + "items": [ + 4298.5, + 4.6452999114990234 + ], + "hints": { + "index": 7536 + } + }, + { + "items": [ + 4299, + 4.4460000991821289 + ], + "hints": { + "index": 7537 + } + }, + { + "items": [ + 4299.5, + 4.5618000030517578 + ], + "hints": { + "index": 7538 + } + }, + { + "items": [ + 4300, + 5.1501 + ], + "hints": { + "index": 7539 + } + }, + { + "items": [ + 4300.5, + 5.9551 + ], + "hints": { + "index": 7540 + } + }, + { + "items": [ + 4301, + 6.0172 + ], + "hints": { + "index": 7541 + } + }, + { + "items": [ + 4301.5, + 6.1647 + ], + "hints": { + "index": 7542 + } + }, + { + "items": [ + 4302, + 6.6042 + ], + "hints": { + "index": 7543 + } + }, + { + "items": [ + 4302.5, + 9.1649 + ], + "hints": { + "index": 7544 + } + }, + { + "items": [ + 4303, + 12.987099647521973 + ], + "hints": { + "index": 7545 + } + }, + { + "items": [ + 4303.5, + 12.6363 + ], + "hints": { + "index": 7546 + } + }, + { + "items": [ + 4304, + 9.8124 + ], + "hints": { + "index": 7547 + } + }, + { + "items": [ + 4304.5, + 7.7857 + ], + "hints": { + "index": 7548 + } + }, + { + "items": [ + 4305, + 8.3788995742797852 + ], + "hints": { + "index": 7549 + } + }, + { + "items": [ + 4305.5, + 8.9191 + ], + "hints": { + "index": 7550 + } + }, + { + "items": [ + 4306, + 9.2901 + ], + "hints": { + "index": 7551 + } + }, + { + "items": [ + 4306.5, + 7.1228 + ], + "hints": { + "index": 7552 + } + }, + { + "items": [ + 4307, + 5.6364998817443848 + ], + "hints": { + "index": 7553 + } + }, + { + "items": [ + 4307.5, + 5.1132 + ], + "hints": { + "index": 7554 + } + }, + { + "items": [ + 4308, + 5.03000020980835 + ], + "hints": { + "index": 7555 + } + }, + { + "items": [ + 4308.5, + 4.8802 + ], + "hints": { + "index": 7556 + } + }, + { + "items": [ + 4309, + 4.382 + ], + "hints": { + "index": 7557 + } + }, + { + "items": [ + 4309.5, + 4.2843 + ], + "hints": { + "index": 7558 + } + }, + { + "items": [ + 4310, + 4.7975997924804688 + ], + "hints": { + "index": 7559 + } + }, + { + "items": [ + 4310.5, + 5.0142002105712891 + ], + "hints": { + "index": 7560 + } + }, + { + "items": [ + 4311, + 4.7979001998901367 + ], + "hints": { + "index": 7561 + } + }, + { + "items": [ + 4311.5, + 4.0022997856140137 + ], + "hints": { + "index": 7562 + } + }, + { + "items": [ + 4312, + 4.6831998825073242 + ], + "hints": { + "index": 7563 + } + }, + { + "items": [ + 4312.5, + 7.2342000007629395 + ], + "hints": { + "index": 7564 + } + }, + { + "items": [ + 4313, + 13.4305 + ], + "hints": { + "index": 7565 + } + }, + { + "items": [ + 4313.5, + 23.358400344848633 + ], + "hints": { + "index": 7566 + } + }, + { + "items": [ + 4314, + 22.306299209594727 + ], + "hints": { + "index": 7567 + } + }, + { + "items": [ + 4314.5, + 23.447099685668945 + ], + "hints": { + "index": 7568 + } + }, + { + "items": [ + 4315, + 27.579399108886719 + ], + "hints": { + "index": 7569 + } + }, + { + "items": [ + 4315.5, + 18.198200225830082 + ], + "hints": { + "index": 7570 + } + }, + { + "items": [ + 4316, + 13.9289 + ], + "hints": { + "index": 7571 + } + }, + { + "items": [ + 4316.5, + 12.7814 + ], + "hints": { + "index": 7572 + } + }, + { + "items": [ + 4317, + 16.2681 + ], + "hints": { + "index": 7573 + } + }, + { + "items": [ + 4317.5, + 15.3414 + ], + "hints": { + "index": 7574 + } + }, + { + "items": [ + 4318, + 13.3358 + ], + "hints": { + "index": 7575 + } + }, + { + "items": [ + 4318.5, + 12.7872 + ], + "hints": { + "index": 7576 + } + }, + { + "items": [ + 4319, + 12.8752 + ], + "hints": { + "index": 7577 + } + }, + { + "items": [ + 4319.5, + 11.0057 + ], + "hints": { + "index": 7578 + } + }, + { + "items": [ + 4320, + 7.9938 + ], + "hints": { + "index": 7579 + } + }, + { + "items": [ + 4320.5, + 5.8064 + ], + "hints": { + "index": 7580 + } + }, + { + "items": [ + 4321, + 4.9626998901367188 + ], + "hints": { + "index": 7581 + } + }, + { + "items": [ + 4321.5, + 4.737800121307373 + ], + "hints": { + "index": 7582 + } + }, + { + "items": [ + 4322, + 4.7184000015258789 + ], + "hints": { + "index": 7583 + } + }, + { + "items": [ + 4322.5, + 4.7122001647949219 + ], + "hints": { + "index": 7584 + } + }, + { + "items": [ + 4323, + 4.8046998977661133 + ], + "hints": { + "index": 7585 + } + }, + { + "items": [ + 4323.5, + 5.2343001365661621 + ], + "hints": { + "index": 7586 + } + }, + { + "items": [ + 4324, + 5.8883 + ], + "hints": { + "index": 7587 + } + }, + { + "items": [ + 4324.5, + 6.0936 + ], + "hints": { + "index": 7588 + } + }, + { + "items": [ + 4325, + 7.2249 + ], + "hints": { + "index": 7589 + } + }, + { + "items": [ + 4325.5, + 8.118 + ], + "hints": { + "index": 7590 + } + }, + { + "items": [ + 4326, + 7.3826 + ], + "hints": { + "index": 7591 + } + }, + { + "items": [ + 4326.5, + 6.7337 + ], + "hints": { + "index": 7592 + } + }, + { + "items": [ + 4327, + 6.9604997634887695 + ], + "hints": { + "index": 7593 + } + }, + { + "items": [ + 4327.5, + 9.1620998382568359 + ], + "hints": { + "index": 7594 + } + }, + { + "items": [ + 4328, + 12.2735 + ], + "hints": { + "index": 7595 + } + }, + { + "items": [ + 4328.5, + 15.8317 + ], + "hints": { + "index": 7596 + } + }, + { + "items": [ + 4329, + 22.1778 + ], + "hints": { + "index": 7597 + } + }, + { + "items": [ + 4329.5, + 25.484899520874023 + ], + "hints": { + "index": 7598 + } + }, + { + "items": [ + 4330, + 26.3762 + ], + "hints": { + "index": 7599 + } + }, + { + "items": [ + 4330.5, + 15.1775 + ], + "hints": { + "index": 7600 + } + }, + { + "items": [ + 4331, + 10.5951 + ], + "hints": { + "index": 7601 + } + }, + { + "items": [ + 4331.5, + 7.4571 + ], + "hints": { + "index": 7602 + } + }, + { + "items": [ + 4332, + 7.2171 + ], + "hints": { + "index": 7603 + } + }, + { + "items": [ + 4332.5, + 6.6943 + ], + "hints": { + "index": 7604 + } + }, + { + "items": [ + 4333, + 7.1353 + ], + "hints": { + "index": 7605 + } + }, + { + "items": [ + 4333.5, + 6.9071 + ], + "hints": { + "index": 7606 + } + }, + { + "items": [ + 4334, + 6.3187 + ], + "hints": { + "index": 7607 + } + }, + { + "items": [ + 4334.5, + 5.4305 + ], + "hints": { + "index": 7608 + } + }, + { + "items": [ + 4335, + 5.56 + ], + "hints": { + "index": 7609 + } + }, + { + "items": [ + 4335.5, + 7.5255 + ], + "hints": { + "index": 7610 + } + }, + { + "items": [ + 4336, + 9.4951 + ], + "hints": { + "index": 7611 + } + }, + { + "items": [ + 4336.5, + 10.0508 + ], + "hints": { + "index": 7612 + } + }, + { + "items": [ + 4337, + 7.0419 + ], + "hints": { + "index": 7613 + } + }, + { + "items": [ + 4337.5, + 6.621 + ], + "hints": { + "index": 7614 + } + }, + { + "items": [ + 4338, + 5.6653 + ], + "hints": { + "index": 7615 + } + }, + { + "items": [ + 4338.5, + 5.4171 + ], + "hints": { + "index": 7616 + } + }, + { + "items": [ + 4339, + 4.9324 + ], + "hints": { + "index": 7617 + } + }, + { + "items": [ + 4339.5, + 4.8338 + ], + "hints": { + "index": 7618 + } + }, + { + "items": [ + 4340, + 4.8229 + ], + "hints": { + "index": 7619 + } + }, + { + "items": [ + 4340.5, + 4.6073 + ], + "hints": { + "index": 7620 + } + }, + { + "items": [ + 4341, + 4.438 + ], + "hints": { + "index": 7621 + } + }, + { + "items": [ + 4341.5, + 4.7594 + ], + "hints": { + "index": 7622 + } + }, + { + "items": [ + 4342, + 4.9773 + ], + "hints": { + "index": 7623 + } + }, + { + "items": [ + 4342.5, + 5.3189 + ], + "hints": { + "index": 7624 + } + }, + { + "items": [ + 4343, + 5.2793 + ], + "hints": { + "index": 7625 + } + }, + { + "items": [ + 4343.5, + 5.4854 + ], + "hints": { + "index": 7626 + } + }, + { + "items": [ + 4344, + 5.0382999999999996 + ], + "hints": { + "index": 7627 + } + }, + { + "items": [ + 4344.5, + 4.3636 + ], + "hints": { + "index": 7628 + } + }, + { + "items": [ + 4345, + 4.0003 + ], + "hints": { + "index": 7629 + } + }, + { + "items": [ + 4345.5, + 4.288 + ], + "hints": { + "index": 7630 + } + }, + { + "items": [ + 4346, + 5.4851 + ], + "hints": { + "index": 7631 + } + }, + { + "items": [ + 4346.5, + 8.3039 + ], + "hints": { + "index": 7632 + } + }, + { + "items": [ + 4347, + 10.5373 + ], + "hints": { + "index": 7633 + } + }, + { + "items": [ + 4347.5, + 10.8604 + ], + "hints": { + "index": 7634 + } + }, + { + "items": [ + 4348, + 8.2785 + ], + "hints": { + "index": 7635 + } + }, + { + "items": [ + 4348.5, + 6.9048 + ], + "hints": { + "index": 7636 + } + }, + { + "items": [ + 4349, + 5.4332 + ], + "hints": { + "index": 7637 + } + }, + { + "items": [ + 4349.5, + 4.6708 + ], + "hints": { + "index": 7638 + } + }, + { + "items": [ + 4350, + 4.3909 + ], + "hints": { + "index": 7639 + } + }, + { + "items": [ + 4350.5, + 4.3223 + ], + "hints": { + "index": 7640 + } + }, + { + "items": [ + 4351, + 4.5507 + ], + "hints": { + "index": 7641 + } + }, + { + "items": [ + 4351.5, + 4.7204 + ], + "hints": { + "index": 7642 + } + }, + { + "items": [ + 4352, + 4.8156 + ], + "hints": { + "index": 7643 + } + }, + { + "items": [ + 4352.5, + 4.5554 + ], + "hints": { + "index": 7644 + } + }, + { + "items": [ + 4353, + 4.3033 + ], + "hints": { + "index": 7645 + } + }, + { + "items": [ + 4353.5, + 4.1532 + ], + "hints": { + "index": 7646 + } + }, + { + "items": [ + 4354, + 3.9746 + ], + "hints": { + "index": 7647 + } + }, + { + "items": [ + 4354.5, + 4.0852 + ], + "hints": { + "index": 7648 + } + }, + { + "items": [ + 4355, + 4.3479 + ], + "hints": { + "index": 7649 + } + }, + { + "items": [ + 4355.5, + 5.4996 + ], + "hints": { + "index": 7650 + } + }, + { + "items": [ + 4356, + 7.3172 + ], + "hints": { + "index": 7651 + } + }, + { + "items": [ + 4356.5, + 10.5972 + ], + "hints": { + "index": 7652 + } + }, + { + "items": [ + 4357, + 13.3759 + ], + "hints": { + "index": 7653 + } + }, + { + "items": [ + 4357.5, + 13.2579 + ], + "hints": { + "index": 7654 + } + }, + { + "items": [ + 4358, + 9.55 + ], + "hints": { + "index": 7655 + } + }, + { + "items": [ + 4358.5, + 7.0527 + ], + "hints": { + "index": 7656 + } + }, + { + "items": [ + 4359, + 6.0464 + ], + "hints": { + "index": 7657 + } + }, + { + "items": [ + 4359.5, + 5.8049 + ], + "hints": { + "index": 7658 + } + }, + { + "items": [ + 4360, + 6.3923 + ], + "hints": { + "index": 7659 + } + }, + { + "items": [ + 4360.5, + 6.5614 + ], + "hints": { + "index": 7660 + } + }, + { + "items": [ + 4361, + 6.3499 + ], + "hints": { + "index": 7661 + } + }, + { + "items": [ + 4361.5, + 6.4092 + ], + "hints": { + "index": 7662 + } + }, + { + "items": [ + 4362, + 7.3154 + ], + "hints": { + "index": 7663 + } + }, + { + "items": [ + 4362.5, + 9.2629 + ], + "hints": { + "index": 7664 + } + }, + { + "items": [ + 4363, + 8.8959 + ], + "hints": { + "index": 7665 + } + }, + { + "items": [ + 4363.5, + 6.2792 + ], + "hints": { + "index": 7666 + } + }, + { + "items": [ + 4364, + 5.065 + ], + "hints": { + "index": 7667 + } + }, + { + "items": [ + 4364.5, + 5.0667 + ], + "hints": { + "index": 7668 + } + }, + { + "items": [ + 4365, + 5.4108 + ], + "hints": { + "index": 7669 + } + }, + { + "items": [ + 4365.5, + 5.0711 + ], + "hints": { + "index": 7670 + } + }, + { + "items": [ + 4366, + 4.4212 + ], + "hints": { + "index": 7671 + } + }, + { + "items": [ + 4366.5, + 4.7256 + ], + "hints": { + "index": 7672 + } + }, + { + "items": [ + 4367, + 6.3634 + ], + "hints": { + "index": 7673 + } + }, + { + "items": [ + 4367.5, + 7.7938 + ], + "hints": { + "index": 7674 + } + }, + { + "items": [ + 4368, + 9.4028 + ], + "hints": { + "index": 7675 + } + }, + { + "items": [ + 4368.5, + 10.4183 + ], + "hints": { + "index": 7676 + } + }, + { + "items": [ + 4369, + 13.1504 + ], + "hints": { + "index": 7677 + } + }, + { + "items": [ + 4369.5, + 14.777999877929688 + ], + "hints": { + "index": 7678 + } + }, + { + "items": [ + 4370, + 14.249199867248535 + ], + "hints": { + "index": 7679 + } + }, + { + "items": [ + 4370.5, + 13.767499923706056 + ], + "hints": { + "index": 7680 + } + }, + { + "items": [ + 4371, + 12.168299674987791 + ], + "hints": { + "index": 7681 + } + }, + { + "items": [ + 4371.5, + 9.89210033416748 + ], + "hints": { + "index": 7682 + } + }, + { + "items": [ + 4372, + 7.1504998207092285 + ], + "hints": { + "index": 7683 + } + }, + { + "items": [ + 4372.5, + 5.9464001655578613 + ], + "hints": { + "index": 7684 + } + }, + { + "items": [ + 4373, + 4.8108000755310059 + ], + "hints": { + "index": 7685 + } + }, + { + "items": [ + 4373.5, + 5.1793999671936035 + ], + "hints": { + "index": 7686 + } + }, + { + "items": [ + 4374, + 4.3727998733520508 + ], + "hints": { + "index": 7687 + } + }, + { + "items": [ + 4374.5, + 4.8477997779846191 + ], + "hints": { + "index": 7688 + } + }, + { + "items": [ + 4375, + 4.5318999290466309 + ], + "hints": { + "index": 7689 + } + }, + { + "items": [ + 4375.5, + 6.0359001159667969 + ], + "hints": { + "index": 7690 + } + }, + { + "items": [ + 4376, + 6.9351000785827637 + ], + "hints": { + "index": 7691 + } + }, + { + "items": [ + 4376.5, + 6.1248998641967773 + ], + "hints": { + "index": 7692 + } + }, + { + "items": [ + 4377, + 5.0037999153137207 + ], + "hints": { + "index": 7693 + } + }, + { + "items": [ + 4377.5, + 4.7326998710632324 + ], + "hints": { + "index": 7694 + } + }, + { + "items": [ + 4378, + 5.23360013961792 + ], + "hints": { + "index": 7695 + } + }, + { + "items": [ + 4378.5, + 5.2653999328613281 + ], + "hints": { + "index": 7696 + } + }, + { + "items": [ + 4379, + 6.0734000205993652 + ], + "hints": { + "index": 7697 + } + }, + { + "items": [ + 4379.5, + 7.7732000350952148 + ], + "hints": { + "index": 7698 + } + }, + { + "items": [ + 4380, + 8.6663999557495117 + ], + "hints": { + "index": 7699 + } + }, + { + "items": [ + 4380.5, + 5.7177000045776367 + ], + "hints": { + "index": 7700 + } + }, + { + "items": [ + 4381, + 4.322700023651123 + ], + "hints": { + "index": 7701 + } + }, + { + "items": [ + 4381.5, + 4.3294000625610352 + ], + "hints": { + "index": 7702 + } + }, + { + "items": [ + 4382, + 4.737800121307373 + ], + "hints": { + "index": 7703 + } + }, + { + "items": [ + 4382.5, + 4.9703001976013184 + ], + "hints": { + "index": 7704 + } + }, + { + "items": [ + 4383, + 4.84630012512207 + ], + "hints": { + "index": 7705 + } + }, + { + "items": [ + 4383.5, + 4.3656997680664063 + ], + "hints": { + "index": 7706 + } + }, + { + "items": [ + 4384, + 4.4948000907897949 + ], + "hints": { + "index": 7707 + } + }, + { + "items": [ + 4384.5, + 4.4713997840881348 + ], + "hints": { + "index": 7708 + } + }, + { + "items": [ + 4385, + 4.7627 + ], + "hints": { + "index": 7709 + } + }, + { + "items": [ + 4385.5, + 4.4201 + ], + "hints": { + "index": 7710 + } + }, + { + "items": [ + 4386, + 4.1868 + ], + "hints": { + "index": 7711 + } + }, + { + "items": [ + 4386.5, + 4.3505 + ], + "hints": { + "index": 7712 + } + }, + { + "items": [ + 4387, + 4.7053 + ], + "hints": { + "index": 7713 + } + }, + { + "items": [ + 4387.5, + 5.4259 + ], + "hints": { + "index": 7714 + } + }, + { + "items": [ + 4388, + 5.4354 + ], + "hints": { + "index": 7715 + } + }, + { + "items": [ + 4388.5, + 5.5301 + ], + "hints": { + "index": 7716 + } + }, + { + "items": [ + 4389, + 6.2866 + ], + "hints": { + "index": 7717 + } + }, + { + "items": [ + 4389.5, + 5.9575 + ], + "hints": { + "index": 7718 + } + }, + { + "items": [ + 4390, + 5.045 + ], + "hints": { + "index": 7719 + } + }, + { + "items": [ + 4390.5, + 4.0901 + ], + "hints": { + "index": 7720 + } + }, + { + "items": [ + 4391, + 3.8196 + ], + "hints": { + "index": 7721 + } + }, + { + "items": [ + 4391.5, + 4.0203 + ], + "hints": { + "index": 7722 + } + }, + { + "items": [ + 4392, + 3.8358 + ], + "hints": { + "index": 7723 + } + }, + { + "items": [ + 4392.5, + 3.8642 + ], + "hints": { + "index": 7724 + } + }, + { + "items": [ + 4393, + 4.3939 + ], + "hints": { + "index": 7725 + } + }, + { + "items": [ + 4393.5, + 4.9477 + ], + "hints": { + "index": 7726 + } + }, + { + "items": [ + 4394, + 5.5441 + ], + "hints": { + "index": 7727 + } + }, + { + "items": [ + 4394.5, + 6.8814 + ], + "hints": { + "index": 7728 + } + }, + { + "items": [ + 4395, + 8.9855 + ], + "hints": { + "index": 7729 + } + }, + { + "items": [ + 4395.5, + 12.81 + ], + "hints": { + "index": 7730 + } + }, + { + "items": [ + 4396, + 10.6418 + ], + "hints": { + "index": 7731 + } + }, + { + "items": [ + 4396.5, + 10.0931 + ], + "hints": { + "index": 7732 + } + }, + { + "items": [ + 4397, + 9.4317 + ], + "hints": { + "index": 7733 + } + }, + { + "items": [ + 4397.5, + 9.5592 + ], + "hints": { + "index": 7734 + } + }, + { + "items": [ + 4398, + 7.1947 + ], + "hints": { + "index": 7735 + } + }, + { + "items": [ + 4398.5, + 5.5522 + ], + "hints": { + "index": 7736 + } + }, + { + "items": [ + 4399, + 4.6315 + ], + "hints": { + "index": 7737 + } + }, + { + "items": [ + 4399.5, + 4.3077 + ], + "hints": { + "index": 7738 + } + }, + { + "items": [ + 4400, + 4.4498 + ], + "hints": { + "index": 7739 + } + }, + { + "items": [ + 4400.5, + 4.6788 + ], + "hints": { + "index": 7740 + } + }, + { + "items": [ + 4401, + 6.0475 + ], + "hints": { + "index": 7741 + } + }, + { + "items": [ + 4401.5, + 7.5821 + ], + "hints": { + "index": 7742 + } + }, + { + "items": [ + 4402, + 9.7719 + ], + "hints": { + "index": 7743 + } + }, + { + "items": [ + 4402.5, + 8.2611 + ], + "hints": { + "index": 7744 + } + }, + { + "items": [ + 4403, + 5.8737 + ], + "hints": { + "index": 7745 + } + }, + { + "items": [ + 4403.5, + 4.9003 + ], + "hints": { + "index": 7746 + } + }, + { + "items": [ + 4404, + 5.3297 + ], + "hints": { + "index": 7747 + } + }, + { + "items": [ + 4404.5, + 7.7467 + ], + "hints": { + "index": 7748 + } + }, + { + "items": [ + 4405, + 10.5997 + ], + "hints": { + "index": 7749 + } + }, + { + "items": [ + 4405.5, + 10.6868 + ], + "hints": { + "index": 7750 + } + }, + { + "items": [ + 4406, + 10.8104 + ], + "hints": { + "index": 7751 + } + }, + { + "items": [ + 4406.5, + 11.7941 + ], + "hints": { + "index": 7752 + } + }, + { + "items": [ + 4407, + 14.6878 + ], + "hints": { + "index": 7753 + } + }, + { + "items": [ + 4407.5, + 14.1945 + ], + "hints": { + "index": 7754 + } + }, + { + "items": [ + 4408, + 12.9644 + ], + "hints": { + "index": 7755 + } + }, + { + "items": [ + 4408.5, + 7.8209 + ], + "hints": { + "index": 7756 + } + }, + { + "items": [ + 4409, + 5.2414 + ], + "hints": { + "index": 7757 + } + }, + { + "items": [ + 4409.5, + 4.1192 + ], + "hints": { + "index": 7758 + } + }, + { + "items": [ + 4410, + 3.9182 + ], + "hints": { + "index": 7759 + } + }, + { + "items": [ + 4410.5, + 3.7819 + ], + "hints": { + "index": 7760 + } + }, + { + "items": [ + 4411, + 3.8349 + ], + "hints": { + "index": 7761 + } + }, + { + "items": [ + 4411.5, + 3.7591 + ], + "hints": { + "index": 7762 + } + }, + { + "items": [ + 4412, + 3.8749 + ], + "hints": { + "index": 7763 + } + }, + { + "items": [ + 4412.5, + 3.6455 + ], + "hints": { + "index": 7764 + } + }, + { + "items": [ + 4413, + 3.6374 + ], + "hints": { + "index": 7765 + } + }, + { + "items": [ + 4413.5, + 3.6243 + ], + "hints": { + "index": 7766 + } + }, + { + "items": [ + 4414, + 3.8374 + ], + "hints": { + "index": 7767 + } + }, + { + "items": [ + 4414.5, + 4.5142 + ], + "hints": { + "index": 7768 + } + }, + { + "items": [ + 4415, + 5.1726999282836914 + ], + "hints": { + "index": 7769 + } + }, + { + "items": [ + 4415.5, + 5.7732000350952148 + ], + "hints": { + "index": 7770 + } + }, + { + "items": [ + 4416, + 6.1703000068664551 + ], + "hints": { + "index": 7771 + } + }, + { + "items": [ + 4416.5, + 6.803800106048584 + ], + "hints": { + "index": 7772 + } + }, + { + "items": [ + 4417, + 8.2541999816894531 + ], + "hints": { + "index": 7773 + } + }, + { + "items": [ + 4417.5, + 7.7971000671386719 + ], + "hints": { + "index": 7774 + } + }, + { + "items": [ + 4418, + 6.888700008392334 + ], + "hints": { + "index": 7775 + } + }, + { + "items": [ + 4418.5, + 5.4246001243591309 + ], + "hints": { + "index": 7776 + } + }, + { + "items": [ + 4419, + 4.6838998794555664 + ], + "hints": { + "index": 7777 + } + }, + { + "items": [ + 4419.5, + 4.37060022354126 + ], + "hints": { + "index": 7778 + } + }, + { + "items": [ + 4420, + 4.2343001365661621 + ], + "hints": { + "index": 7779 + } + }, + { + "items": [ + 4420.5, + 4.7245998382568359 + ], + "hints": { + "index": 7780 + } + }, + { + "items": [ + 4421, + 4.7818999290466309 + ], + "hints": { + "index": 7781 + } + }, + { + "items": [ + 4421.5, + 5.0724000930786133 + ], + "hints": { + "index": 7782 + } + }, + { + "items": [ + 4422, + 4.7150998115539551 + ], + "hints": { + "index": 7783 + } + }, + { + "items": [ + 4422.5, + 5.1319999694824219 + ], + "hints": { + "index": 7784 + } + }, + { + "items": [ + 4423, + 6.253699779510498 + ], + "hints": { + "index": 7785 + } + }, + { + "items": [ + 4423.5, + 7.8948001861572275 + ], + "hints": { + "index": 7786 + } + }, + { + "items": [ + 4424, + 7.87879991531372 + ], + "hints": { + "index": 7787 + } + }, + { + "items": [ + 4424.5, + 5.7772002220153809 + ], + "hints": { + "index": 7788 + } + }, + { + "items": [ + 4425, + 4.9972000122070313 + ], + "hints": { + "index": 7789 + } + }, + { + "items": [ + 4425.5, + 5.097599983215332 + ], + "hints": { + "index": 7790 + } + }, + { + "items": [ + 4426, + 5.1912999153137207 + ], + "hints": { + "index": 7791 + } + }, + { + "items": [ + 4426.5, + 6.5998997688293457 + ], + "hints": { + "index": 7792 + } + }, + { + "items": [ + 4427, + 8.594599723815918 + ], + "hints": { + "index": 7793 + } + }, + { + "items": [ + 4427.5, + 14.125499725341797 + ], + "hints": { + "index": 7794 + } + }, + { + "items": [ + 4428, + 11.16919994354248 + ], + "hints": { + "index": 7795 + } + }, + { + "items": [ + 4428.5, + 7.3032999038696289 + ], + "hints": { + "index": 7796 + } + }, + { + "items": [ + 4429, + 6.1837000846862793 + ], + "hints": { + "index": 7797 + } + }, + { + "items": [ + 4429.5, + 5.8394999504089355 + ], + "hints": { + "index": 7798 + } + }, + { + "items": [ + 4430, + 6.1928000450134277 + ], + "hints": { + "index": 7799 + } + }, + { + "items": [ + 4430.5, + 5.94890022277832 + ], + "hints": { + "index": 7800 + } + }, + { + "items": [ + 4431, + 6.3557000160217285 + ], + "hints": { + "index": 7801 + } + }, + { + "items": [ + 4431.5, + 7.6308999061584482 + ], + "hints": { + "index": 7802 + } + }, + { + "items": [ + 4432, + 7.883699893951416 + ], + "hints": { + "index": 7803 + } + }, + { + "items": [ + 4432.5, + 6.7864999771118164 + ], + "hints": { + "index": 7804 + } + }, + { + "items": [ + 4433, + 5.8289999961853027 + ], + "hints": { + "index": 7805 + } + }, + { + "items": [ + 4433.5, + 5.383699893951416 + ], + "hints": { + "index": 7806 + } + }, + { + "items": [ + 4434, + 5.5542001724243164 + ], + "hints": { + "index": 7807 + } + }, + { + "items": [ + 4434.5, + 5.7355999946594238 + ], + "hints": { + "index": 7808 + } + }, + { + "items": [ + 4435, + 5.2217998504638672 + ], + "hints": { + "index": 7809 + } + }, + { + "items": [ + 4435.5, + 5.5581998825073242 + ], + "hints": { + "index": 7810 + } + }, + { + "items": [ + 4436, + 5.7606000900268555 + ], + "hints": { + "index": 7811 + } + }, + { + "items": [ + 4436.5, + 6.9608001708984375 + ], + "hints": { + "index": 7812 + } + }, + { + "items": [ + 4437, + 6.6388998031616211 + ], + "hints": { + "index": 7813 + } + }, + { + "items": [ + 4437.5, + 5.5130000114440918 + ], + "hints": { + "index": 7814 + } + }, + { + "items": [ + 4438, + 4.2558999061584473 + ], + "hints": { + "index": 7815 + } + }, + { + "items": [ + 4438.5, + 3.7021000385284424 + ], + "hints": { + "index": 7816 + } + }, + { + "items": [ + 4439, + 3.7730000019073486 + ], + "hints": { + "index": 7817 + } + }, + { + "items": [ + 4439.5, + 4.3400001525878906 + ], + "hints": { + "index": 7818 + } + }, + { + "items": [ + 4440, + 4.7027997970581055 + ], + "hints": { + "index": 7819 + } + }, + { + "items": [ + 4440.5, + 4.597099781036377 + ], + "hints": { + "index": 7820 + } + }, + { + "items": [ + 4441, + 4.21120023727417 + ], + "hints": { + "index": 7821 + } + }, + { + "items": [ + 4441.5, + 4.19379997253418 + ], + "hints": { + "index": 7822 + } + }, + { + "items": [ + 4442, + 4.201200008392334 + ], + "hints": { + "index": 7823 + } + }, + { + "items": [ + 4442.5, + 4.4440999031066895 + ], + "hints": { + "index": 7824 + } + }, + { + "items": [ + 4443, + 4.5121002197265625 + ], + "hints": { + "index": 7825 + } + }, + { + "items": [ + 4443.5, + 4.5680999755859375 + ], + "hints": { + "index": 7826 + } + }, + { + "items": [ + 4444, + 4.4765000343322754 + ], + "hints": { + "index": 7827 + } + }, + { + "items": [ + 4444.5, + 4.3038997650146484 + ], + "hints": { + "index": 7828 + } + }, + { + "items": [ + 4445, + 4.226600170135498 + ], + "hints": { + "index": 7829 + } + }, + { + "items": [ + 4445.5, + 4.37470006942749 + ], + "hints": { + "index": 7830 + } + }, + { + "items": [ + 4446, + 4.71150016784668 + ], + "hints": { + "index": 7831 + } + }, + { + "items": [ + 4446.5, + 4.8403000831604 + ], + "hints": { + "index": 7832 + } + }, + { + "items": [ + 4447, + 4.7069001197814941 + ], + "hints": { + "index": 7833 + } + }, + { + "items": [ + 4447.5, + 4.7014999389648438 + ], + "hints": { + "index": 7834 + } + }, + { + "items": [ + 4448, + 4.871300220489502 + ], + "hints": { + "index": 7835 + } + }, + { + "items": [ + 4448.5, + 4.9545001983642578 + ], + "hints": { + "index": 7836 + } + }, + { + "items": [ + 4449, + 5.851099967956543 + ], + "hints": { + "index": 7837 + } + }, + { + "items": [ + 4449.5, + 6.1768999099731445 + ], + "hints": { + "index": 7838 + } + }, + { + "items": [ + 4450, + 5.9196000099182129 + ], + "hints": { + "index": 7839 + } + }, + { + "items": [ + 4450.5, + 4.57889986038208 + ], + "hints": { + "index": 7840 + } + }, + { + "items": [ + 4451, + 4.296299934387207 + ], + "hints": { + "index": 7841 + } + }, + { + "items": [ + 4451.5, + 4.703700065612793 + ], + "hints": { + "index": 7842 + } + }, + { + "items": [ + 4452, + 5.208899974822998 + ], + "hints": { + "index": 7843 + } + }, + { + "items": [ + 4452.5, + 5.4345002174377441 + ], + "hints": { + "index": 7844 + } + }, + { + "items": [ + 4453, + 5.215400218963623 + ], + "hints": { + "index": 7845 + } + }, + { + "items": [ + 4453.5, + 5.4653000831604 + ], + "hints": { + "index": 7846 + } + }, + { + "items": [ + 4454, + 5.6774997711181641 + ], + "hints": { + "index": 7847 + } + }, + { + "items": [ + 4454.5, + 6.6394000053405762 + ], + "hints": { + "index": 7848 + } + }, + { + "items": [ + 4455, + 7.52899980545044 + ], + "hints": { + "index": 7849 + } + }, + { + "items": [ + 4455.5, + 10.010600090026855 + ], + "hints": { + "index": 7850 + } + }, + { + "items": [ + 4456, + 11.307999610900881 + ], + "hints": { + "index": 7851 + } + }, + { + "items": [ + 4456.5, + 10.5065 + ], + "hints": { + "index": 7852 + } + }, + { + "items": [ + 4457, + 8.6154003143310547 + ], + "hints": { + "index": 7853 + } + }, + { + "items": [ + 4457.5, + 6.896 + ], + "hints": { + "index": 7854 + } + }, + { + "items": [ + 4458, + 6.7712001800537109 + ], + "hints": { + "index": 7855 + } + }, + { + "items": [ + 4458.5, + 5.555300235748291 + ], + "hints": { + "index": 7856 + } + }, + { + "items": [ + 4459, + 5.0071001052856445 + ], + "hints": { + "index": 7857 + } + }, + { + "items": [ + 4459.5, + 4.6589999198913574 + ], + "hints": { + "index": 7858 + } + }, + { + "items": [ + 4460, + 5.2206997871398926 + ], + "hints": { + "index": 7859 + } + }, + { + "items": [ + 4460.5, + 5.6989998817443848 + ], + "hints": { + "index": 7860 + } + }, + { + "items": [ + 4461, + 6.1090002059936523 + ], + "hints": { + "index": 7861 + } + }, + { + "items": [ + 4461.5, + 5.7322001457214355 + ], + "hints": { + "index": 7862 + } + }, + { + "items": [ + 4462, + 5.5613999366760254 + ], + "hints": { + "index": 7863 + } + }, + { + "items": [ + 4462.5, + 4.9747 + ], + "hints": { + "index": 7864 + } + }, + { + "items": [ + 4463, + 4.7669000625610352 + ], + "hints": { + "index": 7865 + } + }, + { + "items": [ + 4463.5, + 5.533 + ], + "hints": { + "index": 7866 + } + }, + { + "items": [ + 4464, + 7.4814000129699716 + ], + "hints": { + "index": 7867 + } + }, + { + "items": [ + 4464.5, + 10.807499885559082 + ], + "hints": { + "index": 7868 + } + }, + { + "items": [ + 4465, + 9.3259000778198242 + ], + "hints": { + "index": 7869 + } + }, + { + "items": [ + 4465.5, + 6.5412001609802246 + ], + "hints": { + "index": 7870 + } + }, + { + "items": [ + 4466, + 5.2923002243041992 + ], + "hints": { + "index": 7871 + } + }, + { + "items": [ + 4466.5, + 4.9303 + ], + "hints": { + "index": 7872 + } + }, + { + "items": [ + 4467, + 4.6748 + ], + "hints": { + "index": 7873 + } + }, + { + "items": [ + 4467.5, + 4.252 + ], + "hints": { + "index": 7874 + } + }, + { + "items": [ + 4468, + 4.1773 + ], + "hints": { + "index": 7875 + } + }, + { + "items": [ + 4468.5, + 4.623 + ], + "hints": { + "index": 7876 + } + }, + { + "items": [ + 4469, + 5.571 + ], + "hints": { + "index": 7877 + } + }, + { + "items": [ + 4469.5, + 6.0685 + ], + "hints": { + "index": 7878 + } + }, + { + "items": [ + 4470, + 5.6526 + ], + "hints": { + "index": 7879 + } + }, + { + "items": [ + 4470.5, + 4.7105 + ], + "hints": { + "index": 7880 + } + }, + { + "items": [ + 4471, + 4.268 + ], + "hints": { + "index": 7881 + } + }, + { + "items": [ + 4471.5, + 4.2441000938415527 + ], + "hints": { + "index": 7882 + } + }, + { + "items": [ + 4472, + 4.0571999549865723 + ], + "hints": { + "index": 7883 + } + }, + { + "items": [ + 4472.5, + 4.0914998054504395 + ], + "hints": { + "index": 7884 + } + }, + { + "items": [ + 4473, + 3.9405999183654785 + ], + "hints": { + "index": 7885 + } + }, + { + "items": [ + 4473.5, + 4.4127998352050781 + ], + "hints": { + "index": 7886 + } + }, + { + "items": [ + 4474, + 4.69980001449585 + ], + "hints": { + "index": 7887 + } + }, + { + "items": [ + 4474.5, + 4.8791 + ], + "hints": { + "index": 7888 + } + }, + { + "items": [ + 4475, + 4.8494 + ], + "hints": { + "index": 7889 + } + }, + { + "items": [ + 4475.5, + 4.4599 + ], + "hints": { + "index": 7890 + } + }, + { + "items": [ + 4476, + 4.3014 + ], + "hints": { + "index": 7891 + } + }, + { + "items": [ + 4476.5, + 4.3668 + ], + "hints": { + "index": 7892 + } + }, + { + "items": [ + 4477, + 4.6984000205993652 + ], + "hints": { + "index": 7893 + } + }, + { + "items": [ + 4477.5, + 5.0380997657775879 + ], + "hints": { + "index": 7894 + } + }, + { + "items": [ + 4478, + 4.8825 + ], + "hints": { + "index": 7895 + } + }, + { + "items": [ + 4478.5, + 4.5027 + ], + "hints": { + "index": 7896 + } + }, + { + "items": [ + 4479, + 4.1721000671386719 + ], + "hints": { + "index": 7897 + } + }, + { + "items": [ + 4479.5, + 3.9776 + ], + "hints": { + "index": 7898 + } + }, + { + "items": [ + 4480, + 4.0587000846862793 + ], + "hints": { + "index": 7899 + } + }, + { + "items": [ + 4480.5, + 4.2801 + ], + "hints": { + "index": 7900 + } + }, + { + "items": [ + 4481, + 4.1721 + ], + "hints": { + "index": 7901 + } + }, + { + "items": [ + 4481.5, + 3.9817 + ], + "hints": { + "index": 7902 + } + }, + { + "items": [ + 4482, + 3.7842 + ], + "hints": { + "index": 7903 + } + }, + { + "items": [ + 4482.5, + 3.775 + ], + "hints": { + "index": 7904 + } + }, + { + "items": [ + 4483, + 3.7785999774932866 + ], + "hints": { + "index": 7905 + } + }, + { + "items": [ + 4483.5, + 3.8039000034332271 + ], + "hints": { + "index": 7906 + } + }, + { + "items": [ + 4484, + 3.7544000148773193 + ], + "hints": { + "index": 7907 + } + }, + { + "items": [ + 4484.5, + 3.8113999366760254 + ], + "hints": { + "index": 7908 + } + }, + { + "items": [ + 4485, + 3.7269001007080078 + ], + "hints": { + "index": 7909 + } + }, + { + "items": [ + 4485.5, + 4.0834999084472656 + ], + "hints": { + "index": 7910 + } + }, + { + "items": [ + 4486, + 4.13070011138916 + ], + "hints": { + "index": 7911 + } + }, + { + "items": [ + 4486.5, + 4.2006 + ], + "hints": { + "index": 7912 + } + }, + { + "items": [ + 4487, + 3.9367001056671143 + ], + "hints": { + "index": 7913 + } + }, + { + "items": [ + 4487.5, + 4.0164 + ], + "hints": { + "index": 7914 + } + }, + { + "items": [ + 4488, + 4.1408 + ], + "hints": { + "index": 7915 + } + }, + { + "items": [ + 4488.5, + 4.3375 + ], + "hints": { + "index": 7916 + } + }, + { + "items": [ + 4489, + 4.2438 + ], + "hints": { + "index": 7917 + } + }, + { + "items": [ + 4489.5, + 4.052299976348877 + ], + "hints": { + "index": 7918 + } + }, + { + "items": [ + 4490, + 4.075 + ], + "hints": { + "index": 7919 + } + }, + { + "items": [ + 4490.5, + 4.2294998168945313 + ], + "hints": { + "index": 7920 + } + }, + { + "items": [ + 4491, + 4.5717000961303711 + ], + "hints": { + "index": 7921 + } + }, + { + "items": [ + 4491.5, + 4.7238 + ], + "hints": { + "index": 7922 + } + }, + { + "items": [ + 4492, + 4.8965 + ], + "hints": { + "index": 7923 + } + }, + { + "items": [ + 4492.5, + 5.2504000663757324 + ], + "hints": { + "index": 7924 + } + }, + { + "items": [ + 4493, + 5.4196 + ], + "hints": { + "index": 7925 + } + }, + { + "items": [ + 4493.5, + 6.1785 + ], + "hints": { + "index": 7926 + } + }, + { + "items": [ + 4494, + 5.9517002105712891 + ], + "hints": { + "index": 7927 + } + }, + { + "items": [ + 4494.5, + 5.386 + ], + "hints": { + "index": 7928 + } + }, + { + "items": [ + 4495, + 4.6195001602172852 + ], + "hints": { + "index": 7929 + } + }, + { + "items": [ + 4495.5, + 4.4078 + ], + "hints": { + "index": 7930 + } + }, + { + "items": [ + 4496, + 4.8124 + ], + "hints": { + "index": 7931 + } + }, + { + "items": [ + 4496.5, + 4.4529 + ], + "hints": { + "index": 7932 + } + }, + { + "items": [ + 4497, + 4.3266 + ], + "hints": { + "index": 7933 + } + }, + { + "items": [ + 4497.5, + 3.8900001049041744 + ], + "hints": { + "index": 7934 + } + }, + { + "items": [ + 4498, + 4.066 + ], + "hints": { + "index": 7935 + } + }, + { + "items": [ + 4498.5, + 4.1840000152587891 + ], + "hints": { + "index": 7936 + } + }, + { + "items": [ + 4499, + 4.4113001823425293 + ], + "hints": { + "index": 7937 + } + }, + { + "items": [ + 4499.5, + 4.6216998100280762 + ], + "hints": { + "index": 7938 + } + }, + { + "items": [ + 4500, + 4.3056 + ], + "hints": { + "index": 7939 + } + }, + { + "items": [ + 4500.5, + 4.3552999496459961 + ], + "hints": { + "index": 7940 + } + }, + { + "items": [ + 4501, + 4.2142000198364258 + ], + "hints": { + "index": 7941 + } + }, + { + "items": [ + 4501.5, + 5.6212000846862793 + ], + "hints": { + "index": 7942 + } + }, + { + "items": [ + 4502, + 8.1732997894287109 + ], + "hints": { + "index": 7943 + } + }, + { + "items": [ + 4502.5, + 10.689900398254396 + ], + "hints": { + "index": 7944 + } + }, + { + "items": [ + 4503, + 8.4782 + ], + "hints": { + "index": 7945 + } + }, + { + "items": [ + 4503.5, + 7.80019998550415 + ], + "hints": { + "index": 7946 + } + }, + { + "items": [ + 4504, + 8.6297998428344727 + ], + "hints": { + "index": 7947 + } + }, + { + "items": [ + 4504.5, + 8.0504 + ], + "hints": { + "index": 7948 + } + }, + { + "items": [ + 4505, + 7.0836000442504883 + ], + "hints": { + "index": 7949 + } + }, + { + "items": [ + 4505.5, + 6.3675999641418457 + ], + "hints": { + "index": 7950 + } + }, + { + "items": [ + 4506, + 6.0275001525878906 + ], + "hints": { + "index": 7951 + } + }, + { + "items": [ + 4506.5, + 5.1939001083374023 + ], + "hints": { + "index": 7952 + } + }, + { + "items": [ + 4507, + 4.9667000770568848 + ], + "hints": { + "index": 7953 + } + }, + { + "items": [ + 4507.5, + 5.0103001594543457 + ], + "hints": { + "index": 7954 + } + }, + { + "items": [ + 4508, + 5.3796000480651855 + ], + "hints": { + "index": 7955 + } + }, + { + "items": [ + 4508.5, + 5.3397 + ], + "hints": { + "index": 7956 + } + }, + { + "items": [ + 4509, + 5.3632 + ], + "hints": { + "index": 7957 + } + }, + { + "items": [ + 4509.5, + 4.6917 + ], + "hints": { + "index": 7958 + } + }, + { + "items": [ + 4510, + 4.8436 + ], + "hints": { + "index": 7959 + } + }, + { + "items": [ + 4510.5, + 4.9917998313903809 + ], + "hints": { + "index": 7960 + } + }, + { + "items": [ + 4511, + 5.5809 + ], + "hints": { + "index": 7961 + } + }, + { + "items": [ + 4511.5, + 5.4538002014160156 + ], + "hints": { + "index": 7962 + } + }, + { + "items": [ + 4512, + 5.3520998954772949 + ], + "hints": { + "index": 7963 + } + }, + { + "items": [ + 4512.5, + 5.1006 + ], + "hints": { + "index": 7964 + } + }, + { + "items": [ + 4513, + 4.7 + ], + "hints": { + "index": 7965 + } + }, + { + "items": [ + 4513.5, + 4.3101000785827637 + ], + "hints": { + "index": 7966 + } + }, + { + "items": [ + 4514, + 3.9651999473571777 + ], + "hints": { + "index": 7967 + } + }, + { + "items": [ + 4514.5, + 3.7711000442504878 + ], + "hints": { + "index": 7968 + } + }, + { + "items": [ + 4515, + 3.5562999248504639 + ], + "hints": { + "index": 7969 + } + }, + { + "items": [ + 4515.5, + 3.5031 + ], + "hints": { + "index": 7970 + } + }, + { + "items": [ + 4516, + 3.4627 + ], + "hints": { + "index": 7971 + } + }, + { + "items": [ + 4516.5, + 3.6516 + ], + "hints": { + "index": 7972 + } + }, + { + "items": [ + 4517, + 3.7778999805450439 + ], + "hints": { + "index": 7973 + } + }, + { + "items": [ + 4517.5, + 3.9725000858306889 + ], + "hints": { + "index": 7974 + } + }, + { + "items": [ + 4518, + 3.8763999938964848 + ], + "hints": { + "index": 7975 + } + }, + { + "items": [ + 4518.5, + 3.9168999195098881 + ], + "hints": { + "index": 7976 + } + }, + { + "items": [ + 4519, + 3.8615999221801758 + ], + "hints": { + "index": 7977 + } + }, + { + "items": [ + 4519.5, + 3.883699893951416 + ], + "hints": { + "index": 7978 + } + }, + { + "items": [ + 4520, + 3.7465999126434326 + ], + "hints": { + "index": 7979 + } + }, + { + "items": [ + 4520.5, + 3.7859001159667969 + ], + "hints": { + "index": 7980 + } + }, + { + "items": [ + 4521, + 3.9124999046325679 + ], + "hints": { + "index": 7981 + } + }, + { + "items": [ + 4521.5, + 4.0008001327514648 + ], + "hints": { + "index": 7982 + } + }, + { + "items": [ + 4522, + 3.9763998985290527 + ], + "hints": { + "index": 7983 + } + }, + { + "items": [ + 4522.5, + 3.8285000324249263 + ], + "hints": { + "index": 7984 + } + }, + { + "items": [ + 4523, + 3.8011999130249023 + ], + "hints": { + "index": 7985 + } + }, + { + "items": [ + 4523.5, + 3.4588000774383545 + ], + "hints": { + "index": 7986 + } + }, + { + "items": [ + 4524, + 3.3452999591827393 + ], + "hints": { + "index": 7987 + } + }, + { + "items": [ + 4524.5, + 3.1784999370574951 + ], + "hints": { + "index": 7988 + } + }, + { + "items": [ + 4525, + 3.213900089263916 + ], + "hints": { + "index": 7989 + } + }, + { + "items": [ + 4525.5, + 3.1740999221801758 + ], + "hints": { + "index": 7990 + } + }, + { + "items": [ + 4526, + 3.237299919128418 + ], + "hints": { + "index": 7991 + } + }, + { + "items": [ + 4526.5, + 3.2634999752044682 + ], + "hints": { + "index": 7992 + } + }, + { + "items": [ + 4527, + 3.2588000297546387 + ], + "hints": { + "index": 7993 + } + }, + { + "items": [ + 4527.5, + 3.14520001411438 + ], + "hints": { + "index": 7994 + } + }, + { + "items": [ + 4528, + 3.2000000476837158 + ], + "hints": { + "index": 7995 + } + }, + { + "items": [ + 4528.5, + 3.2161 + ], + "hints": { + "index": 7996 + } + }, + { + "items": [ + 4529, + 3.1254 + ], + "hints": { + "index": 7997 + } + }, + { + "items": [ + 4529.5, + 3.138 + ], + "hints": { + "index": 7998 + } + }, + { + "items": [ + 4530, + 3.562 + ], + "hints": { + "index": 7999 + } + }, + { + "items": [ + 4530.5, + 4.4054 + ], + "hints": { + "index": 8000 + } + }, + { + "items": [ + 4531, + 5.0097 + ], + "hints": { + "index": 8001 + } + }, + { + "items": [ + 4531.5, + 5.2215 + ], + "hints": { + "index": 8002 + } + }, + { + "items": [ + 4532, + 4.9807 + ], + "hints": { + "index": 8003 + } + }, + { + "items": [ + 4532.5, + 4.7009000778198242 + ], + "hints": { + "index": 8004 + } + }, + { + "items": [ + 4533, + 4.7366 + ], + "hints": { + "index": 8005 + } + }, + { + "items": [ + 4533.5, + 5.4046 + ], + "hints": { + "index": 8006 + } + }, + { + "items": [ + 4534, + 5.6835 + ], + "hints": { + "index": 8007 + } + }, + { + "items": [ + 4534.5, + 5.0442 + ], + "hints": { + "index": 8008 + } + }, + { + "items": [ + 4535, + 4.2753 + ], + "hints": { + "index": 8009 + } + }, + { + "items": [ + 4535.5, + 4.0754 + ], + "hints": { + "index": 8010 + } + }, + { + "items": [ + 4536, + 4.2097997665405273 + ], + "hints": { + "index": 8011 + } + }, + { + "items": [ + 4536.5, + 4.1817 + ], + "hints": { + "index": 8012 + } + }, + { + "items": [ + 4537, + 4.3158998489379883 + ], + "hints": { + "index": 8013 + } + }, + { + "items": [ + 4537.5, + 4.5099000930786133 + ], + "hints": { + "index": 8014 + } + }, + { + "items": [ + 4538, + 4.355100154876709 + ], + "hints": { + "index": 8015 + } + }, + { + "items": [ + 4538.5, + 4.2060999870300293 + ], + "hints": { + "index": 8016 + } + }, + { + "items": [ + 4539, + 3.9514999389648442 + ], + "hints": { + "index": 8017 + } + }, + { + "items": [ + 4539.5, + 4.4089999198913574 + ], + "hints": { + "index": 8018 + } + }, + { + "items": [ + 4540, + 4.9289999008178711 + ], + "hints": { + "index": 8019 + } + }, + { + "items": [ + 4540.5, + 5.671299934387207 + ], + "hints": { + "index": 8020 + } + }, + { + "items": [ + 4541, + 5.5976 + ], + "hints": { + "index": 8021 + } + }, + { + "items": [ + 4541.5, + 4.6628 + ], + "hints": { + "index": 8022 + } + }, + { + "items": [ + 4542, + 4.1538 + ], + "hints": { + "index": 8023 + } + }, + { + "items": [ + 4542.5, + 3.7851 + ], + "hints": { + "index": 8024 + } + }, + { + "items": [ + 4543, + 4.0832 + ], + "hints": { + "index": 8025 + } + }, + { + "items": [ + 4543.5, + 4.1272 + ], + "hints": { + "index": 8026 + } + }, + { + "items": [ + 4544, + 4.3227 + ], + "hints": { + "index": 8027 + } + }, + { + "items": [ + 4544.5, + 4.4558 + ], + "hints": { + "index": 8028 + } + }, + { + "items": [ + 4545, + 4.8143000602722168 + ], + "hints": { + "index": 8029 + } + }, + { + "items": [ + 4545.5, + 5.0488 + ], + "hints": { + "index": 8030 + } + }, + { + "items": [ + 4546, + 4.8399 + ], + "hints": { + "index": 8031 + } + }, + { + "items": [ + 4546.5, + 4.4353 + ], + "hints": { + "index": 8032 + } + }, + { + "items": [ + 4547, + 4.2041001319885254 + ], + "hints": { + "index": 8033 + } + }, + { + "items": [ + 4547.5, + 4.0096 + ], + "hints": { + "index": 8034 + } + }, + { + "items": [ + 4548, + 3.6954 + ], + "hints": { + "index": 8035 + } + }, + { + "items": [ + 4548.5, + 3.6503 + ], + "hints": { + "index": 8036 + } + }, + { + "items": [ + 4549, + 3.5545001029968266 + ], + "hints": { + "index": 8037 + } + }, + { + "items": [ + 4549.5, + 3.6224 + ], + "hints": { + "index": 8038 + } + }, + { + "items": [ + 4550, + 3.5305 + ], + "hints": { + "index": 8039 + } + }, + { + "items": [ + 4550.5, + 3.5527 + ], + "hints": { + "index": 8040 + } + }, + { + "items": [ + 4551, + 3.7183 + ], + "hints": { + "index": 8041 + } + }, + { + "items": [ + 4551.5, + 3.8215 + ], + "hints": { + "index": 8042 + } + }, + { + "items": [ + 4552, + 3.8212 + ], + "hints": { + "index": 8043 + } + }, + { + "items": [ + 4552.5, + 3.6845 + ], + "hints": { + "index": 8044 + } + }, + { + "items": [ + 4553, + 3.5371999740600586 + ], + "hints": { + "index": 8045 + } + }, + { + "items": [ + 4553.5, + 3.4992001056671143 + ], + "hints": { + "index": 8046 + } + }, + { + "items": [ + 4554, + 3.5195999145507813 + ], + "hints": { + "index": 8047 + } + }, + { + "items": [ + 4554.5, + 3.7579998970031734 + ], + "hints": { + "index": 8048 + } + }, + { + "items": [ + 4555, + 4.3895998001098633 + ], + "hints": { + "index": 8049 + } + }, + { + "items": [ + 4555.5, + 4.6556000709533691 + ], + "hints": { + "index": 8050 + } + }, + { + "items": [ + 4556, + 4.6617999076843262 + ], + "hints": { + "index": 8051 + } + }, + { + "items": [ + 4556.5, + 4.2066001892089844 + ], + "hints": { + "index": 8052 + } + }, + { + "items": [ + 4557, + 3.9518001079559326 + ], + "hints": { + "index": 8053 + } + }, + { + "items": [ + 4557.5, + 3.8283 + ], + "hints": { + "index": 8054 + } + }, + { + "items": [ + 4558, + 3.7485 + ], + "hints": { + "index": 8055 + } + }, + { + "items": [ + 4558.5, + 3.5549 + ], + "hints": { + "index": 8056 + } + }, + { + "items": [ + 4559, + 3.4038 + ], + "hints": { + "index": 8057 + } + }, + { + "items": [ + 4559.5, + 3.443 + ], + "hints": { + "index": 8058 + } + }, + { + "items": [ + 4560, + 3.4705 + ], + "hints": { + "index": 8059 + } + }, + { + "items": [ + 4560.5, + 3.7596 + ], + "hints": { + "index": 8060 + } + }, + { + "items": [ + 4561, + 3.7978 + ], + "hints": { + "index": 8061 + } + }, + { + "items": [ + 4561.5, + 4.5268 + ], + "hints": { + "index": 8062 + } + }, + { + "items": [ + 4562, + 4.7395 + ], + "hints": { + "index": 8063 + } + }, + { + "items": [ + 4562.5, + 5.00029993057251 + ], + "hints": { + "index": 8064 + } + }, + { + "items": [ + 4563, + 4.5514001846313477 + ], + "hints": { + "index": 8065 + } + }, + { + "items": [ + 4563.5, + 4.2624001502990723 + ], + "hints": { + "index": 8066 + } + }, + { + "items": [ + 4564, + 3.8199000358581543 + ], + "hints": { + "index": 8067 + } + }, + { + "items": [ + 4564.5, + 3.5660998821258545 + ], + "hints": { + "index": 8068 + } + }, + { + "items": [ + 4565, + 3.3863000869750977 + ], + "hints": { + "index": 8069 + } + }, + { + "items": [ + 4565.5, + 3.5013 + ], + "hints": { + "index": 8070 + } + }, + { + "items": [ + 4566, + 3.627 + ], + "hints": { + "index": 8071 + } + }, + { + "items": [ + 4566.5, + 3.8117 + ], + "hints": { + "index": 8072 + } + }, + { + "items": [ + 4567, + 3.8948 + ], + "hints": { + "index": 8073 + } + }, + { + "items": [ + 4567.5, + 3.8571 + ], + "hints": { + "index": 8074 + } + }, + { + "items": [ + 4568, + 3.7497000694274902 + ], + "hints": { + "index": 8075 + } + }, + { + "items": [ + 4568.5, + 3.5738999843597412 + ], + "hints": { + "index": 8076 + } + }, + { + "items": [ + 4569, + 3.4807999134063721 + ], + "hints": { + "index": 8077 + } + }, + { + "items": [ + 4569.5, + 3.5652 + ], + "hints": { + "index": 8078 + } + }, + { + "items": [ + 4570, + 3.6215 + ], + "hints": { + "index": 8079 + } + }, + { + "items": [ + 4570.5, + 3.8078000545501713 + ], + "hints": { + "index": 8080 + } + }, + { + "items": [ + 4571, + 3.5632998943328857 + ], + "hints": { + "index": 8081 + } + }, + { + "items": [ + 4571.5, + 3.7165 + ], + "hints": { + "index": 8082 + } + }, + { + "items": [ + 4572, + 4.2533001899719238 + ], + "hints": { + "index": 8083 + } + }, + { + "items": [ + 4572.5, + 4.8924 + ], + "hints": { + "index": 8084 + } + }, + { + "items": [ + 4573, + 4.6245999336242676 + ], + "hints": { + "index": 8085 + } + }, + { + "items": [ + 4573.5, + 3.79830002784729 + ], + "hints": { + "index": 8086 + } + }, + { + "items": [ + 4574, + 3.5996999740600586 + ], + "hints": { + "index": 8087 + } + }, + { + "items": [ + 4574.5, + 3.6089 + ], + "hints": { + "index": 8088 + } + }, + { + "items": [ + 4575, + 3.7197999954223633 + ], + "hints": { + "index": 8089 + } + }, + { + "items": [ + 4575.5, + 3.6052 + ], + "hints": { + "index": 8090 + } + }, + { + "items": [ + 4576, + 3.6241 + ], + "hints": { + "index": 8091 + } + }, + { + "items": [ + 4576.5, + 3.4527 + ], + "hints": { + "index": 8092 + } + }, + { + "items": [ + 4577, + 3.3053998947143555 + ], + "hints": { + "index": 8093 + } + }, + { + "items": [ + 4577.5, + 3.1405000686645508 + ], + "hints": { + "index": 8094 + } + }, + { + "items": [ + 4578, + 3.2736999988555908 + ], + "hints": { + "index": 8095 + } + }, + { + "items": [ + 4578.5, + 3.4309 + ], + "hints": { + "index": 8096 + } + }, + { + "items": [ + 4579, + 3.5913999080657959 + ], + "hints": { + "index": 8097 + } + }, + { + "items": [ + 4579.5, + 3.3347 + ], + "hints": { + "index": 8098 + } + }, + { + "items": [ + 4580, + 3.2109999656677246 + ], + "hints": { + "index": 8099 + } + }, + { + "items": [ + 4580.5, + 3.1166000366210938 + ], + "hints": { + "index": 8100 + } + }, + { + "items": [ + 4581, + 3.2476000785827637 + ], + "hints": { + "index": 8101 + } + }, + { + "items": [ + 4581.5, + 3.3403999805450439 + ], + "hints": { + "index": 8102 + } + }, + { + "items": [ + 4582, + 3.5528 + ], + "hints": { + "index": 8103 + } + }, + { + "items": [ + 4582.5, + 3.9192 + ], + "hints": { + "index": 8104 + } + }, + { + "items": [ + 4583, + 3.8020999431610103 + ], + "hints": { + "index": 8105 + } + }, + { + "items": [ + 4583.5, + 3.5524 + ], + "hints": { + "index": 8106 + } + }, + { + "items": [ + 4584, + 3.3435 + ], + "hints": { + "index": 8107 + } + }, + { + "items": [ + 4584.5, + 3.4849 + ], + "hints": { + "index": 8108 + } + }, + { + "items": [ + 4585, + 3.779 + ], + "hints": { + "index": 8109 + } + }, + { + "items": [ + 4585.5, + 3.869999885559082 + ], + "hints": { + "index": 8110 + } + }, + { + "items": [ + 4586, + 3.9247000217437744 + ], + "hints": { + "index": 8111 + } + }, + { + "items": [ + 4586.5, + 3.8255000114440918 + ], + "hints": { + "index": 8112 + } + }, + { + "items": [ + 4587, + 3.7363998889923096 + ], + "hints": { + "index": 8113 + } + }, + { + "items": [ + 4587.5, + 3.6447000503540039 + ], + "hints": { + "index": 8114 + } + }, + { + "items": [ + 4588, + 3.4712998867034912 + ], + "hints": { + "index": 8115 + } + }, + { + "items": [ + 4588.5, + 3.61050009727478 + ], + "hints": { + "index": 8116 + } + }, + { + "items": [ + 4589, + 3.7304000854492192 + ], + "hints": { + "index": 8117 + } + }, + { + "items": [ + 4589.5, + 3.7420001029968266 + ], + "hints": { + "index": 8118 + } + }, + { + "items": [ + 4590, + 3.4361 + ], + "hints": { + "index": 8119 + } + }, + { + "items": [ + 4590.5, + 3.3628 + ], + "hints": { + "index": 8120 + } + }, + { + "items": [ + 4591, + 3.6053 + ], + "hints": { + "index": 8121 + } + }, + { + "items": [ + 4591.5, + 3.8016 + ], + "hints": { + "index": 8122 + } + }, + { + "items": [ + 4592, + 3.6866 + ], + "hints": { + "index": 8123 + } + }, + { + "items": [ + 4592.5, + 3.6752 + ], + "hints": { + "index": 8124 + } + }, + { + "items": [ + 4593, + 3.726 + ], + "hints": { + "index": 8125 + } + }, + { + "items": [ + 4593.5, + 3.6366 + ], + "hints": { + "index": 8126 + } + }, + { + "items": [ + 4594, + 3.3728 + ], + "hints": { + "index": 8127 + } + }, + { + "items": [ + 4594.5, + 3.4079000949859619 + ], + "hints": { + "index": 8128 + } + }, + { + "items": [ + 4595, + 3.5822000503540039 + ], + "hints": { + "index": 8129 + } + }, + { + "items": [ + 4595.5, + 3.5559000968933105 + ], + "hints": { + "index": 8130 + } + }, + { + "items": [ + 4596, + 3.5639998912811279 + ], + "hints": { + "index": 8131 + } + }, + { + "items": [ + 4596.5, + 3.5592 + ], + "hints": { + "index": 8132 + } + }, + { + "items": [ + 4597, + 3.8415999412536626 + ], + "hints": { + "index": 8133 + } + }, + { + "items": [ + 4597.5, + 4.0022001266479492 + ], + "hints": { + "index": 8134 + } + }, + { + "items": [ + 4598, + 4.0412998199462891 + ], + "hints": { + "index": 8135 + } + }, + { + "items": [ + 4598.5, + 3.8803000450134282 + ], + "hints": { + "index": 8136 + } + }, + { + "items": [ + 4599, + 3.761199951171875 + ], + "hints": { + "index": 8137 + } + }, + { + "items": [ + 4599.5, + 3.6744999885559082 + ], + "hints": { + "index": 8138 + } + }, + { + "items": [ + 4600, + 3.8477001190185542 + ], + "hints": { + "index": 8139 + } + }, + { + "items": [ + 4600.5, + 3.690000057220459 + ], + "hints": { + "index": 8140 + } + }, + { + "items": [ + 4601, + 3.4732999801635742 + ], + "hints": { + "index": 8141 + } + }, + { + "items": [ + 4601.5, + 3.2132999897003174 + ], + "hints": { + "index": 8142 + } + }, + { + "items": [ + 4602, + 3.39739990234375 + ], + "hints": { + "index": 8143 + } + }, + { + "items": [ + 4602.5, + 3.8359000682830806 + ], + "hints": { + "index": 8144 + } + }, + { + "items": [ + 4603, + 4.0285000801086426 + ], + "hints": { + "index": 8145 + } + }, + { + "items": [ + 4603.5, + 3.7377 + ], + "hints": { + "index": 8146 + } + }, + { + "items": [ + 4604, + 3.3824 + ], + "hints": { + "index": 8147 + } + }, + { + "items": [ + 4604.5, + 3.3534 + ], + "hints": { + "index": 8148 + } + }, + { + "items": [ + 4605, + 3.4151999950408936 + ], + "hints": { + "index": 8149 + } + }, + { + "items": [ + 4605.5, + 3.5483 + ], + "hints": { + "index": 8150 + } + }, + { + "items": [ + 4606, + 3.4237 + ], + "hints": { + "index": 8151 + } + }, + { + "items": [ + 4606.5, + 3.2405 + ], + "hints": { + "index": 8152 + } + }, + { + "items": [ + 4607, + 3.3201000690460205 + ], + "hints": { + "index": 8153 + } + }, + { + "items": [ + 4607.5, + 3.4182999134063721 + ], + "hints": { + "index": 8154 + } + }, + { + "items": [ + 4608, + 3.6719000339508057 + ], + "hints": { + "index": 8155 + } + }, + { + "items": [ + 4608.5, + 3.7833 + ], + "hints": { + "index": 8156 + } + }, + { + "items": [ + 4609, + 4.2657 + ], + "hints": { + "index": 8157 + } + }, + { + "items": [ + 4609.5, + 4.8226 + ], + "hints": { + "index": 8158 + } + }, + { + "items": [ + 4610, + 4.9818000793457031 + ], + "hints": { + "index": 8159 + } + }, + { + "items": [ + 4610.5, + 4.4333000183105469 + ], + "hints": { + "index": 8160 + } + }, + { + "items": [ + 4611, + 3.8308999538421631 + ], + "hints": { + "index": 8161 + } + }, + { + "items": [ + 4611.5, + 3.6178 + ], + "hints": { + "index": 8162 + } + }, + { + "items": [ + 4612, + 3.5448 + ], + "hints": { + "index": 8163 + } + }, + { + "items": [ + 4612.5, + 3.6297 + ], + "hints": { + "index": 8164 + } + }, + { + "items": [ + 4613, + 3.4184000492095947 + ], + "hints": { + "index": 8165 + } + }, + { + "items": [ + 4613.5, + 3.4565000534057617 + ], + "hints": { + "index": 8166 + } + }, + { + "items": [ + 4614, + 3.4054 + ], + "hints": { + "index": 8167 + } + }, + { + "items": [ + 4614.5, + 3.1594 + ], + "hints": { + "index": 8168 + } + }, + { + "items": [ + 4615, + 3.0157 + ], + "hints": { + "index": 8169 + } + }, + { + "items": [ + 4615.5, + 2.9442999362945557 + ], + "hints": { + "index": 8170 + } + }, + { + "items": [ + 4616, + 3.1333000659942627 + ], + "hints": { + "index": 8171 + } + }, + { + "items": [ + 4616.5, + 3.22160005569458 + ], + "hints": { + "index": 8172 + } + }, + { + "items": [ + 4617, + 3.0044 + ], + "hints": { + "index": 8173 + } + }, + { + "items": [ + 4617.5, + 2.9084999561309814 + ], + "hints": { + "index": 8174 + } + }, + { + "items": [ + 4618, + 2.8478999137878418 + ], + "hints": { + "index": 8175 + } + }, + { + "items": [ + 4618.5, + 3.0421 + ], + "hints": { + "index": 8176 + } + }, + { + "items": [ + 4619, + 3.5917000770568848 + ], + "hints": { + "index": 8177 + } + }, + { + "items": [ + 4619.5, + 4.4536 + ], + "hints": { + "index": 8178 + } + }, + { + "items": [ + 4620, + 5.4277000427246094 + ], + "hints": { + "index": 8179 + } + }, + { + "items": [ + 4620.5, + 5.636 + ], + "hints": { + "index": 8180 + } + }, + { + "items": [ + 4621, + 5.43120002746582 + ], + "hints": { + "index": 8181 + } + }, + { + "items": [ + 4621.5, + 5.6633000373840332 + ], + "hints": { + "index": 8182 + } + }, + { + "items": [ + 4622, + 5.7941 + ], + "hints": { + "index": 8183 + } + }, + { + "items": [ + 4622.5, + 5.2091 + ], + "hints": { + "index": 8184 + } + }, + { + "items": [ + 4623, + 4.3533000946044922 + ], + "hints": { + "index": 8185 + } + }, + { + "items": [ + 4623.5, + 3.8315000534057617 + ], + "hints": { + "index": 8186 + } + }, + { + "items": [ + 4624, + 3.717400074005127 + ], + "hints": { + "index": 8187 + } + }, + { + "items": [ + 4624.5, + 3.8322 + ], + "hints": { + "index": 8188 + } + }, + { + "items": [ + 4625, + 4.0933 + ], + "hints": { + "index": 8189 + } + }, + { + "items": [ + 4625.5, + 4.2641 + ], + "hints": { + "index": 8190 + } + }, + { + "items": [ + 4626, + 4.1984 + ], + "hints": { + "index": 8191 + } + }, + { + "items": [ + 4626.5, + 4.38640022277832 + ], + "hints": { + "index": 8192 + } + }, + { + "items": [ + 4627, + 4.4938998222351074 + ], + "hints": { + "index": 8193 + } + }, + { + "items": [ + 4627.5, + 4.7684001922607422 + ], + "hints": { + "index": 8194 + } + }, + { + "items": [ + 4628, + 4.8200998306274414 + ], + "hints": { + "index": 8195 + } + }, + { + "items": [ + 4628.5, + 4.9904999732971191 + ], + "hints": { + "index": 8196 + } + }, + { + "items": [ + 4629, + 4.7086 + ], + "hints": { + "index": 8197 + } + }, + { + "items": [ + 4629.5, + 4.4244999885559082 + ], + "hints": { + "index": 8198 + } + }, + { + "items": [ + 4630, + 4.0915999412536621 + ], + "hints": { + "index": 8199 + } + }, + { + "items": [ + 4630.5, + 4.0236 + ], + "hints": { + "index": 8200 + } + }, + { + "items": [ + 4631, + 3.953700065612793 + ], + "hints": { + "index": 8201 + } + }, + { + "items": [ + 4631.5, + 4.0514998435974121 + ], + "hints": { + "index": 8202 + } + }, + { + "items": [ + 4632, + 4.0723 + ], + "hints": { + "index": 8203 + } + }, + { + "items": [ + 4632.5, + 3.9952 + ], + "hints": { + "index": 8204 + } + }, + { + "items": [ + 4633, + 3.8097 + ], + "hints": { + "index": 8205 + } + }, + { + "items": [ + 4633.5, + 3.7655999660491943 + ], + "hints": { + "index": 8206 + } + }, + { + "items": [ + 4634, + 3.991 + ], + "hints": { + "index": 8207 + } + }, + { + "items": [ + 4634.5, + 4.2980999946594238 + ], + "hints": { + "index": 8208 + } + }, + { + "items": [ + 4635, + 4.4439001083374023 + ], + "hints": { + "index": 8209 + } + }, + { + "items": [ + 4635.5, + 4.6072998046875 + ], + "hints": { + "index": 8210 + } + }, + { + "items": [ + 4636, + 4.8069 + ], + "hints": { + "index": 8211 + } + }, + { + "items": [ + 4636.5, + 5.4555997848510742 + ], + "hints": { + "index": 8212 + } + }, + { + "items": [ + 4637, + 5.63539981842041 + ], + "hints": { + "index": 8213 + } + }, + { + "items": [ + 4637.5, + 5.4926 + ], + "hints": { + "index": 8214 + } + }, + { + "items": [ + 4638, + 5.198699951171875 + ], + "hints": { + "index": 8215 + } + }, + { + "items": [ + 4638.5, + 5.4356999397277832 + ], + "hints": { + "index": 8216 + } + }, + { + "items": [ + 4639, + 6.3148999214172363 + ], + "hints": { + "index": 8217 + } + }, + { + "items": [ + 4639.5, + 7.2498 + ], + "hints": { + "index": 8218 + } + }, + { + "items": [ + 4640, + 8.03439998626709 + ], + "hints": { + "index": 8219 + } + }, + { + "items": [ + 4640.5, + 6.950200080871582 + ], + "hints": { + "index": 8220 + } + }, + { + "items": [ + 4641, + 5.1020998954772949 + ], + "hints": { + "index": 8221 + } + }, + { + "items": [ + 4641.5, + 3.7822999954223633 + ], + "hints": { + "index": 8222 + } + }, + { + "items": [ + 4642, + 4.0500001907348633 + ], + "hints": { + "index": 8223 + } + }, + { + "items": [ + 4642.5, + 5.1683001518249512 + ], + "hints": { + "index": 8224 + } + }, + { + "items": [ + 4643, + 5.0623 + ], + "hints": { + "index": 8225 + } + }, + { + "items": [ + 4643.5, + 5.0963997840881348 + ], + "hints": { + "index": 8226 + } + }, + { + "items": [ + 4644, + 4.8305997848510742 + ], + "hints": { + "index": 8227 + } + }, + { + "items": [ + 4644.5, + 4.552299976348877 + ], + "hints": { + "index": 8228 + } + }, + { + "items": [ + 4645, + 4.0116000175476074 + ], + "hints": { + "index": 8229 + } + }, + { + "items": [ + 4645.5, + 3.6106 + ], + "hints": { + "index": 8230 + } + }, + { + "items": [ + 4646, + 3.7277998924255367 + ], + "hints": { + "index": 8231 + } + }, + { + "items": [ + 4646.5, + 3.8216 + ], + "hints": { + "index": 8232 + } + }, + { + "items": [ + 4647, + 3.6786 + ], + "hints": { + "index": 8233 + } + }, + { + "items": [ + 4647.5, + 3.4515 + ], + "hints": { + "index": 8234 + } + }, + { + "items": [ + 4648, + 3.3742 + ], + "hints": { + "index": 8235 + } + }, + { + "items": [ + 4648.5, + 3.3431 + ], + "hints": { + "index": 8236 + } + }, + { + "items": [ + 4649, + 3.3954999446868896 + ], + "hints": { + "index": 8237 + } + }, + { + "items": [ + 4649.5, + 3.5232000350952148 + ], + "hints": { + "index": 8238 + } + }, + { + "items": [ + 4650, + 3.5036 + ], + "hints": { + "index": 8239 + } + }, + { + "items": [ + 4650.5, + 3.6888000965118408 + ], + "hints": { + "index": 8240 + } + }, + { + "items": [ + 4651, + 3.9244000911712646 + ], + "hints": { + "index": 8241 + } + }, + { + "items": [ + 4651.5, + 4.3531 + ], + "hints": { + "index": 8242 + } + }, + { + "items": [ + 4652, + 4.2504000663757324 + ], + "hints": { + "index": 8243 + } + }, + { + "items": [ + 4652.5, + 4.1394000053405762 + ], + "hints": { + "index": 8244 + } + }, + { + "items": [ + 4653, + 3.9204 + ], + "hints": { + "index": 8245 + } + }, + { + "items": [ + 4653.5, + 3.8786 + ], + "hints": { + "index": 8246 + } + }, + { + "items": [ + 4654, + 3.782599925994873 + ], + "hints": { + "index": 8247 + } + }, + { + "items": [ + 4654.5, + 3.8605999946594238 + ], + "hints": { + "index": 8248 + } + }, + { + "items": [ + 4655, + 3.99020004272461 + ], + "hints": { + "index": 8249 + } + }, + { + "items": [ + 4655.5, + 4.0696001052856445 + ], + "hints": { + "index": 8250 + } + }, + { + "items": [ + 4656, + 3.8538999557495122 + ], + "hints": { + "index": 8251 + } + }, + { + "items": [ + 4656.5, + 3.5357000827789307 + ], + "hints": { + "index": 8252 + } + }, + { + "items": [ + 4657, + 3.4212 + ], + "hints": { + "index": 8253 + } + }, + { + "items": [ + 4657.5, + 3.4677 + ], + "hints": { + "index": 8254 + } + }, + { + "items": [ + 4658, + 3.794699907302856 + ], + "hints": { + "index": 8255 + } + }, + { + "items": [ + 4658.5, + 4.0563 + ], + "hints": { + "index": 8256 + } + }, + { + "items": [ + 4659, + 4.5079998970031738 + ], + "hints": { + "index": 8257 + } + }, + { + "items": [ + 4659.5, + 4.9563999176025391 + ], + "hints": { + "index": 8258 + } + }, + { + "items": [ + 4660, + 4.949699878692627 + ], + "hints": { + "index": 8259 + } + }, + { + "items": [ + 4660.5, + 4.4145002365112305 + ], + "hints": { + "index": 8260 + } + }, + { + "items": [ + 4661, + 3.7825 + ], + "hints": { + "index": 8261 + } + }, + { + "items": [ + 4661.5, + 3.4642999172210693 + ], + "hints": { + "index": 8262 + } + }, + { + "items": [ + 4662, + 3.4151 + ], + "hints": { + "index": 8263 + } + }, + { + "items": [ + 4662.5, + 3.3107 + ], + "hints": { + "index": 8264 + } + }, + { + "items": [ + 4663, + 3.2395 + ], + "hints": { + "index": 8265 + } + }, + { + "items": [ + 4663.5, + 3.3501 + ], + "hints": { + "index": 8266 + } + }, + { + "items": [ + 4664, + 3.502000093460083 + ], + "hints": { + "index": 8267 + } + }, + { + "items": [ + 4664.5, + 3.5989000797271729 + ], + "hints": { + "index": 8268 + } + }, + { + "items": [ + 4665, + 3.3074 + ], + "hints": { + "index": 8269 + } + }, + { + "items": [ + 4665.5, + 3.0617 + ], + "hints": { + "index": 8270 + } + }, + { + "items": [ + 4666, + 3.1017999649047852 + ], + "hints": { + "index": 8271 + } + }, + { + "items": [ + 4666.5, + 3.2785000801086426 + ], + "hints": { + "index": 8272 + } + }, + { + "items": [ + 4667, + 3.5475 + ], + "hints": { + "index": 8273 + } + }, + { + "items": [ + 4667.5, + 3.3959000110626221 + ], + "hints": { + "index": 8274 + } + }, + { + "items": [ + 4668, + 3.4133 + ], + "hints": { + "index": 8275 + } + }, + { + "items": [ + 4668.5, + 3.4059 + ], + "hints": { + "index": 8276 + } + }, + { + "items": [ + 4669, + 3.7416000366210938 + ], + "hints": { + "index": 8277 + } + }, + { + "items": [ + 4669.5, + 4.3850002288818359 + ], + "hints": { + "index": 8278 + } + }, + { + "items": [ + 4670, + 5.4250998497009277 + ], + "hints": { + "index": 8279 + } + }, + { + "items": [ + 4670.5, + 6.4243001937866211 + ], + "hints": { + "index": 8280 + } + }, + { + "items": [ + 4671, + 6.6202001571655273 + ], + "hints": { + "index": 8281 + } + }, + { + "items": [ + 4671.5, + 5.74459981918335 + ], + "hints": { + "index": 8282 + } + }, + { + "items": [ + 4672, + 4.673799991607666 + ], + "hints": { + "index": 8283 + } + }, + { + "items": [ + 4672.5, + 4.05079984664917 + ], + "hints": { + "index": 8284 + } + }, + { + "items": [ + 4673, + 3.6839 + ], + "hints": { + "index": 8285 + } + }, + { + "items": [ + 4673.5, + 3.694600105285645 + ], + "hints": { + "index": 8286 + } + }, + { + "items": [ + 4674, + 3.452800035476685 + ], + "hints": { + "index": 8287 + } + }, + { + "items": [ + 4674.5, + 3.4511 + ], + "hints": { + "index": 8288 + } + }, + { + "items": [ + 4675, + 3.3677 + ], + "hints": { + "index": 8289 + } + }, + { + "items": [ + 4675.5, + 3.3377 + ], + "hints": { + "index": 8290 + } + }, + { + "items": [ + 4676, + 3.078 + ], + "hints": { + "index": 8291 + } + }, + { + "items": [ + 4676.5, + 2.9722 + ], + "hints": { + "index": 8292 + } + }, + { + "items": [ + 4677, + 3.3203001022338867 + ], + "hints": { + "index": 8293 + } + }, + { + "items": [ + 4677.5, + 4.1810002326965332 + ], + "hints": { + "index": 8294 + } + }, + { + "items": [ + 4678, + 5.2545 + ], + "hints": { + "index": 8295 + } + }, + { + "items": [ + 4678.5, + 5.5184998512268066 + ], + "hints": { + "index": 8296 + } + }, + { + "items": [ + 4679, + 5.7940998077392578 + ], + "hints": { + "index": 8297 + } + }, + { + "items": [ + 4679.5, + 5.4386 + ], + "hints": { + "index": 8298 + } + }, + { + "items": [ + 4680, + 5.0285000801086426 + ], + "hints": { + "index": 8299 + } + }, + { + "items": [ + 4680.5, + 4.5992999076843262 + ], + "hints": { + "index": 8300 + } + }, + { + "items": [ + 4681, + 4.3992 + ], + "hints": { + "index": 8301 + } + }, + { + "items": [ + 4681.5, + 4.116300106048584 + ], + "hints": { + "index": 8302 + } + }, + { + "items": [ + 4682, + 3.8308999538421631 + ], + "hints": { + "index": 8303 + } + }, + { + "items": [ + 4682.5, + 3.9603 + ], + "hints": { + "index": 8304 + } + }, + { + "items": [ + 4683, + 4.0089 + ], + "hints": { + "index": 8305 + } + }, + { + "items": [ + 4683.5, + 4.0736 + ], + "hints": { + "index": 8306 + } + }, + { + "items": [ + 4684, + 3.8779 + ], + "hints": { + "index": 8307 + } + }, + { + "items": [ + 4684.5, + 3.5374999046325684 + ], + "hints": { + "index": 8308 + } + }, + { + "items": [ + 4685, + 3.6078000068664551 + ], + "hints": { + "index": 8309 + } + }, + { + "items": [ + 4685.5, + 3.758699893951416 + ], + "hints": { + "index": 8310 + } + }, + { + "items": [ + 4686, + 4.4428 + ], + "hints": { + "index": 8311 + } + }, + { + "items": [ + 4686.5, + 4.5531001091003418 + ], + "hints": { + "index": 8312 + } + }, + { + "items": [ + 4687, + 4.6787 + ], + "hints": { + "index": 8313 + } + }, + { + "items": [ + 4687.5, + 4.4986 + ], + "hints": { + "index": 8314 + } + }, + { + "items": [ + 4688, + 4.4653 + ], + "hints": { + "index": 8315 + } + }, + { + "items": [ + 4688.5, + 4.3101 + ], + "hints": { + "index": 8316 + } + }, + { + "items": [ + 4689, + 4.1548 + ], + "hints": { + "index": 8317 + } + }, + { + "items": [ + 4689.5, + 3.9038 + ], + "hints": { + "index": 8318 + } + }, + { + "items": [ + 4690, + 3.7952001094818111 + ], + "hints": { + "index": 8319 + } + }, + { + "items": [ + 4690.5, + 3.8996999263763423 + ], + "hints": { + "index": 8320 + } + }, + { + "items": [ + 4691, + 4.2930998802185059 + ], + "hints": { + "index": 8321 + } + }, + { + "items": [ + 4691.5, + 4.3181 + ], + "hints": { + "index": 8322 + } + }, + { + "items": [ + 4692, + 4.2846999168396 + ], + "hints": { + "index": 8323 + } + }, + { + "items": [ + 4692.5, + 3.9270000457763672 + ], + "hints": { + "index": 8324 + } + }, + { + "items": [ + 4693, + 3.7342 + ], + "hints": { + "index": 8325 + } + }, + { + "items": [ + 4693.5, + 3.5613000392913814 + ], + "hints": { + "index": 8326 + } + }, + { + "items": [ + 4694, + 3.6840999126434326 + ], + "hints": { + "index": 8327 + } + }, + { + "items": [ + 4694.5, + 4.0134 + ], + "hints": { + "index": 8328 + } + }, + { + "items": [ + 4695, + 4.1457 + ], + "hints": { + "index": 8329 + } + }, + { + "items": [ + 4695.5, + 3.9768 + ], + "hints": { + "index": 8330 + } + }, + { + "items": [ + 4696, + 3.9404 + ], + "hints": { + "index": 8331 + } + }, + { + "items": [ + 4696.5, + 3.9718000888824463 + ], + "hints": { + "index": 8332 + } + }, + { + "items": [ + 4697, + 4.2852 + ], + "hints": { + "index": 8333 + } + }, + { + "items": [ + 4697.5, + 4.4674 + ], + "hints": { + "index": 8334 + } + }, + { + "items": [ + 4698, + 4.7540998458862305 + ], + "hints": { + "index": 8335 + } + }, + { + "items": [ + 4698.5, + 4.2452998161315918 + ], + "hints": { + "index": 8336 + } + }, + { + "items": [ + 4699, + 3.7123 + ], + "hints": { + "index": 8337 + } + }, + { + "items": [ + 4699.5, + 3.51200008392334 + ], + "hints": { + "index": 8338 + } + }, + { + "items": [ + 4700, + 3.6723001003265385 + ], + "hints": { + "index": 8339 + } + }, + { + "items": [ + 4700.5, + 3.7862000465393062 + ], + "hints": { + "index": 8340 + } + }, + { + "items": [ + 4701, + 3.74020004272461 + ], + "hints": { + "index": 8341 + } + }, + { + "items": [ + 4701.5, + 3.7762999534606938 + ], + "hints": { + "index": 8342 + } + }, + { + "items": [ + 4702, + 3.849600076675415 + ], + "hints": { + "index": 8343 + } + }, + { + "items": [ + 4702.5, + 3.7920000553131104 + ], + "hints": { + "index": 8344 + } + }, + { + "items": [ + 4703, + 3.888 + ], + "hints": { + "index": 8345 + } + }, + { + "items": [ + 4703.5, + 4.0579 + ], + "hints": { + "index": 8346 + } + }, + { + "items": [ + 4704, + 4.0734 + ], + "hints": { + "index": 8347 + } + }, + { + "items": [ + 4704.5, + 4.2064 + ], + "hints": { + "index": 8348 + } + }, + { + "items": [ + 4705, + 4.1252 + ], + "hints": { + "index": 8349 + } + }, + { + "items": [ + 4705.5, + 4.2670998573303223 + ], + "hints": { + "index": 8350 + } + }, + { + "items": [ + 4706, + 4.1025 + ], + "hints": { + "index": 8351 + } + }, + { + "items": [ + 4706.5, + 4.0352001190185547 + ], + "hints": { + "index": 8352 + } + }, + { + "items": [ + 4707, + 3.8415 + ], + "hints": { + "index": 8353 + } + }, + { + "items": [ + 4707.5, + 3.7544000148773193 + ], + "hints": { + "index": 8354 + } + }, + { + "items": [ + 4708, + 3.6921999454498287 + ], + "hints": { + "index": 8355 + } + }, + { + "items": [ + 4708.5, + 3.72379994392395 + ], + "hints": { + "index": 8356 + } + }, + { + "items": [ + 4709, + 3.9497 + ], + "hints": { + "index": 8357 + } + }, + { + "items": [ + 4709.5, + 3.8843998908996582 + ], + "hints": { + "index": 8358 + } + }, + { + "items": [ + 4710, + 3.9798 + ], + "hints": { + "index": 8359 + } + }, + { + "items": [ + 4710.5, + 3.8517999649047856 + ], + "hints": { + "index": 8360 + } + }, + { + "items": [ + 4711, + 4.1811 + ], + "hints": { + "index": 8361 + } + }, + { + "items": [ + 4711.5, + 5.4910998344421387 + ], + "hints": { + "index": 8362 + } + }, + { + "items": [ + 4712, + 7.011 + ], + "hints": { + "index": 8363 + } + }, + { + "items": [ + 4712.5, + 10.1932 + ], + "hints": { + "index": 8364 + } + }, + { + "items": [ + 4713, + 8.6782999038696289 + ], + "hints": { + "index": 8365 + } + }, + { + "items": [ + 4713.5, + 6.0943 + ], + "hints": { + "index": 8366 + } + }, + { + "items": [ + 4714, + 4.7676000595092773 + ], + "hints": { + "index": 8367 + } + }, + { + "items": [ + 4714.5, + 4.7508997917175293 + ], + "hints": { + "index": 8368 + } + }, + { + "items": [ + 4715, + 4.8006000518798828 + ], + "hints": { + "index": 8369 + } + }, + { + "items": [ + 4715.5, + 4.519 + ], + "hints": { + "index": 8370 + } + }, + { + "items": [ + 4716, + 4.0762 + ], + "hints": { + "index": 8371 + } + }, + { + "items": [ + 4716.5, + 4.111299991607666 + ], + "hints": { + "index": 8372 + } + }, + { + "items": [ + 4717, + 4.4035 + ], + "hints": { + "index": 8373 + } + }, + { + "items": [ + 4717.5, + 4.4246997833251953 + ], + "hints": { + "index": 8374 + } + }, + { + "items": [ + 4718, + 4.4688000679016113 + ], + "hints": { + "index": 8375 + } + }, + { + "items": [ + 4718.5, + 4.4115 + ], + "hints": { + "index": 8376 + } + }, + { + "items": [ + 4719, + 4.6013998985290527 + ], + "hints": { + "index": 8377 + } + }, + { + "items": [ + 4719.5, + 4.9112000465393066 + ], + "hints": { + "index": 8378 + } + }, + { + "items": [ + 4720, + 4.8977999687194824 + ], + "hints": { + "index": 8379 + } + }, + { + "items": [ + 4720.5, + 4.9851 + ], + "hints": { + "index": 8380 + } + }, + { + "items": [ + 4721, + 5.4701 + ], + "hints": { + "index": 8381 + } + }, + { + "items": [ + 4721.5, + 6.20959997177124 + ], + "hints": { + "index": 8382 + } + }, + { + "items": [ + 4722, + 7.5407 + ], + "hints": { + "index": 8383 + } + }, + { + "items": [ + 4722.5, + 8.0560998916625977 + ], + "hints": { + "index": 8384 + } + }, + { + "items": [ + 4723, + 7.1223001480102539 + ], + "hints": { + "index": 8385 + } + }, + { + "items": [ + 4723.5, + 5.9285001754760742 + ], + "hints": { + "index": 8386 + } + }, + { + "items": [ + 4724, + 5.3285 + ], + "hints": { + "index": 8387 + } + }, + { + "items": [ + 4724.5, + 4.8813 + ], + "hints": { + "index": 8388 + } + }, + { + "items": [ + 4725, + 4.8508 + ], + "hints": { + "index": 8389 + } + }, + { + "items": [ + 4725.5, + 5.2847 + ], + "hints": { + "index": 8390 + } + }, + { + "items": [ + 4726, + 5.8096 + ], + "hints": { + "index": 8391 + } + }, + { + "items": [ + 4726.5, + 5.5177001953125 + ], + "hints": { + "index": 8392 + } + }, + { + "items": [ + 4727, + 4.8309001922607422 + ], + "hints": { + "index": 8393 + } + }, + { + "items": [ + 4727.5, + 4.4960999488830566 + ], + "hints": { + "index": 8394 + } + }, + { + "items": [ + 4728, + 4.8772997856140137 + ], + "hints": { + "index": 8395 + } + }, + { + "items": [ + 4728.5, + 4.6577000617980957 + ], + "hints": { + "index": 8396 + } + }, + { + "items": [ + 4729, + 4.9563 + ], + "hints": { + "index": 8397 + } + }, + { + "items": [ + 4729.5, + 5.4534997940063477 + ], + "hints": { + "index": 8398 + } + }, + { + "items": [ + 4730, + 6.7141 + ], + "hints": { + "index": 8399 + } + }, + { + "items": [ + 4730.5, + 8.3998 + ], + "hints": { + "index": 8400 + } + }, + { + "items": [ + 4731, + 9.9537000656127912 + ], + "hints": { + "index": 8401 + } + }, + { + "items": [ + 4731.5, + 10.581000328063965 + ], + "hints": { + "index": 8402 + } + }, + { + "items": [ + 4732, + 12.785300254821776 + ], + "hints": { + "index": 8403 + } + }, + { + "items": [ + 4732.5, + 12.668700218200684 + ], + "hints": { + "index": 8404 + } + }, + { + "items": [ + 4733, + 15.844099998474119 + ], + "hints": { + "index": 8405 + } + }, + { + "items": [ + 4733.5, + 10.662400245666504 + ], + "hints": { + "index": 8406 + } + }, + { + "items": [ + 4734, + 8.6394 + ], + "hints": { + "index": 8407 + } + }, + { + "items": [ + 4734.5, + 7.3831000328063965 + ], + "hints": { + "index": 8408 + } + }, + { + "items": [ + 4735, + 6.8416 + ], + "hints": { + "index": 8409 + } + }, + { + "items": [ + 4735.5, + 5.6472001075744629 + ], + "hints": { + "index": 8410 + } + }, + { + "items": [ + 4736, + 4.80109977722168 + ], + "hints": { + "index": 8411 + } + }, + { + "items": [ + 4736.5, + 4.6217 + ], + "hints": { + "index": 8412 + } + }, + { + "items": [ + 4737, + 5.6036 + ], + "hints": { + "index": 8413 + } + }, + { + "items": [ + 4737.5, + 6.858799934387207 + ], + "hints": { + "index": 8414 + } + }, + { + "items": [ + 4738, + 9.6688 + ], + "hints": { + "index": 8415 + } + }, + { + "items": [ + 4738.5, + 12.1068 + ], + "hints": { + "index": 8416 + } + }, + { + "items": [ + 4739, + 14.113100051879885 + ], + "hints": { + "index": 8417 + } + }, + { + "items": [ + 4739.5, + 13.583999633789063 + ], + "hints": { + "index": 8418 + } + }, + { + "items": [ + 4740, + 13.6279 + ], + "hints": { + "index": 8419 + } + }, + { + "items": [ + 4740.5, + 13.981800079345703 + ], + "hints": { + "index": 8420 + } + }, + { + "items": [ + 4741, + 10.48 + ], + "hints": { + "index": 8421 + } + }, + { + "items": [ + 4741.5, + 9.4535 + ], + "hints": { + "index": 8422 + } + }, + { + "items": [ + 4742, + 9.3747997283935547 + ], + "hints": { + "index": 8423 + } + }, + { + "items": [ + 4742.5, + 13.035799980163574 + ], + "hints": { + "index": 8424 + } + }, + { + "items": [ + 4743, + 14.4923 + ], + "hints": { + "index": 8425 + } + }, + { + "items": [ + 4743.5, + 15.270600318908691 + ], + "hints": { + "index": 8426 + } + }, + { + "items": [ + 4744, + 15.7369 + ], + "hints": { + "index": 8427 + } + }, + { + "items": [ + 4744.5, + 17.212499618530273 + ], + "hints": { + "index": 8428 + } + }, + { + "items": [ + 4745, + 16.857700347900391 + ], + "hints": { + "index": 8429 + } + }, + { + "items": [ + 4745.5, + 16.290800094604492 + ], + "hints": { + "index": 8430 + } + }, + { + "items": [ + 4746, + 12.994999885559082 + ], + "hints": { + "index": 8431 + } + }, + { + "items": [ + 4746.5, + 8.7060003280639648 + ], + "hints": { + "index": 8432 + } + }, + { + "items": [ + 4747, + 6.1682000160217285 + ], + "hints": { + "index": 8433 + } + }, + { + "items": [ + 4747.5, + 4.6903 + ], + "hints": { + "index": 8434 + } + }, + { + "items": [ + 4748, + 4.7423000335693359 + ], + "hints": { + "index": 8435 + } + }, + { + "items": [ + 4748.5, + 6.34499979019165 + ], + "hints": { + "index": 8436 + } + }, + { + "items": [ + 4749, + 8.0376996994018555 + ], + "hints": { + "index": 8437 + } + }, + { + "items": [ + 4749.5, + 10.547599792480469 + ], + "hints": { + "index": 8438 + } + }, + { + "items": [ + 4750, + 12.1689 + ], + "hints": { + "index": 8439 + } + }, + { + "items": [ + 4750.5, + 14.525899887084959 + ], + "hints": { + "index": 8440 + } + }, + { + "items": [ + 4751, + 11.3544 + ], + "hints": { + "index": 8441 + } + }, + { + "items": [ + 4751.5, + 9.1701 + ], + "hints": { + "index": 8442 + } + }, + { + "items": [ + 4752, + 9.5763 + ], + "hints": { + "index": 8443 + } + }, + { + "items": [ + 4752.5, + 12.0704 + ], + "hints": { + "index": 8444 + } + }, + { + "items": [ + 4753, + 11.25570011138916 + ], + "hints": { + "index": 8445 + } + }, + { + "items": [ + 4753.5, + 9.2530002593994141 + ], + "hints": { + "index": 8446 + } + }, + { + "items": [ + 4754, + 6.7882 + ], + "hints": { + "index": 8447 + } + }, + { + "items": [ + 4754.5, + 6.1782 + ], + "hints": { + "index": 8448 + } + }, + { + "items": [ + 4755, + 6.3559 + ], + "hints": { + "index": 8449 + } + }, + { + "items": [ + 4755.5, + 7.4018 + ], + "hints": { + "index": 8450 + } + }, + { + "items": [ + 4756, + 9.7808 + ], + "hints": { + "index": 8451 + } + }, + { + "items": [ + 4756.5, + 10.7495 + ], + "hints": { + "index": 8452 + } + }, + { + "items": [ + 4757, + 12.7182 + ], + "hints": { + "index": 8453 + } + }, + { + "items": [ + 4757.5, + 12.7967 + ], + "hints": { + "index": 8454 + } + }, + { + "items": [ + 4758, + 9.8074 + ], + "hints": { + "index": 8455 + } + }, + { + "items": [ + 4758.5, + 9.3135 + ], + "hints": { + "index": 8456 + } + }, + { + "items": [ + 4759, + 9.0245 + ], + "hints": { + "index": 8457 + } + }, + { + "items": [ + 4759.5, + 8.3837 + ], + "hints": { + "index": 8458 + } + }, + { + "items": [ + 4760, + 6.23199987411499 + ], + "hints": { + "index": 8459 + } + }, + { + "items": [ + 4760.5, + 5.6613 + ], + "hints": { + "index": 8460 + } + }, + { + "items": [ + 4761, + 6.333 + ], + "hints": { + "index": 8461 + } + }, + { + "items": [ + 4761.5, + 8.3793 + ], + "hints": { + "index": 8462 + } + }, + { + "items": [ + 4762, + 10.230400085449221 + ], + "hints": { + "index": 8463 + } + }, + { + "items": [ + 4762.5, + 11.6202 + ], + "hints": { + "index": 8464 + } + }, + { + "items": [ + 4763, + 11.571100234985352 + ], + "hints": { + "index": 8465 + } + }, + { + "items": [ + 4763.5, + 12.364 + ], + "hints": { + "index": 8466 + } + }, + { + "items": [ + 4764, + 12.6751 + ], + "hints": { + "index": 8467 + } + }, + { + "items": [ + 4764.5, + 13.253 + ], + "hints": { + "index": 8468 + } + }, + { + "items": [ + 4765, + 15.1727 + ], + "hints": { + "index": 8469 + } + }, + { + "items": [ + 4765.5, + 17.730300903320313 + ], + "hints": { + "index": 8470 + } + }, + { + "items": [ + 4766, + 23.00629997253418 + ], + "hints": { + "index": 8471 + } + }, + { + "items": [ + 4766.5, + 24.119600296020508 + ], + "hints": { + "index": 8472 + } + }, + { + "items": [ + 4767, + 29.640300750732425 + ], + "hints": { + "index": 8473 + } + }, + { + "items": [ + 4767.5, + 28.199300765991211 + ], + "hints": { + "index": 8474 + } + }, + { + "items": [ + 4768, + 29.607400894165039 + ], + "hints": { + "index": 8475 + } + }, + { + "items": [ + 4768.5, + 18.782199859619141 + ], + "hints": { + "index": 8476 + } + }, + { + "items": [ + 4769, + 10.723799705505373 + ], + "hints": { + "index": 8477 + } + }, + { + "items": [ + 4769.5, + 7.4021 + ], + "hints": { + "index": 8478 + } + }, + { + "items": [ + 4770, + 6.0984 + ], + "hints": { + "index": 8479 + } + }, + { + "items": [ + 4770.5, + 6.7674 + ], + "hints": { + "index": 8480 + } + }, + { + "items": [ + 4771, + 8.2641 + ], + "hints": { + "index": 8481 + } + }, + { + "items": [ + 4771.5, + 11.2344 + ], + "hints": { + "index": 8482 + } + }, + { + "items": [ + 4772, + 10.98 + ], + "hints": { + "index": 8483 + } + }, + { + "items": [ + 4772.5, + 10.2059 + ], + "hints": { + "index": 8484 + } + }, + { + "items": [ + 4773, + 10.9901 + ], + "hints": { + "index": 8485 + } + }, + { + "items": [ + 4773.5, + 14.2364 + ], + "hints": { + "index": 8486 + } + }, + { + "items": [ + 4774, + 18.7487 + ], + "hints": { + "index": 8487 + } + }, + { + "items": [ + 4774.5, + 18.084199905395508 + ], + "hints": { + "index": 8488 + } + }, + { + "items": [ + 4775, + 15.71560001373291 + ], + "hints": { + "index": 8489 + } + }, + { + "items": [ + 4775.5, + 12.066499710083008 + ], + "hints": { + "index": 8490 + } + }, + { + "items": [ + 4776, + 9.4429998397827148 + ], + "hints": { + "index": 8491 + } + }, + { + "items": [ + 4776.5, + 8.7343997955322266 + ], + "hints": { + "index": 8492 + } + }, + { + "items": [ + 4777, + 8.8512001037597656 + ], + "hints": { + "index": 8493 + } + }, + { + "items": [ + 4777.5, + 10.7874 + ], + "hints": { + "index": 8494 + } + }, + { + "items": [ + 4778, + 12.1907 + ], + "hints": { + "index": 8495 + } + }, + { + "items": [ + 4778.5, + 13.8261 + ], + "hints": { + "index": 8496 + } + }, + { + "items": [ + 4779, + 13.33489990234375 + ], + "hints": { + "index": 8497 + } + }, + { + "items": [ + 4779.5, + 13.4989 + ], + "hints": { + "index": 8498 + } + }, + { + "items": [ + 4780, + 13.729100227355955 + ], + "hints": { + "index": 8499 + } + }, + { + "items": [ + 4780.5, + 16.100299835205078 + ], + "hints": { + "index": 8500 + } + }, + { + "items": [ + 4781, + 15.027199745178224 + ], + "hints": { + "index": 8501 + } + }, + { + "items": [ + 4781.5, + 9.8044 + ], + "hints": { + "index": 8502 + } + }, + { + "items": [ + 4782, + 6.5703 + ], + "hints": { + "index": 8503 + } + }, + { + "items": [ + 4782.5, + 5.427 + ], + "hints": { + "index": 8504 + } + }, + { + "items": [ + 4783, + 6.075200080871582 + ], + "hints": { + "index": 8505 + } + }, + { + "items": [ + 4783.5, + 7.6943 + ], + "hints": { + "index": 8506 + } + }, + { + "items": [ + 4784, + 10.826700210571287 + ], + "hints": { + "index": 8507 + } + }, + { + "items": [ + 4784.5, + 11.802800178527832 + ], + "hints": { + "index": 8508 + } + }, + { + "items": [ + 4785, + 11.442500114440918 + ], + "hints": { + "index": 8509 + } + }, + { + "items": [ + 4785.5, + 9.2223997116088867 + ], + "hints": { + "index": 8510 + } + }, + { + "items": [ + 4786, + 8.5122003555297852 + ], + "hints": { + "index": 8511 + } + }, + { + "items": [ + 4786.5, + 10.053099632263184 + ], + "hints": { + "index": 8512 + } + }, + { + "items": [ + 4787, + 12.251199722290041 + ], + "hints": { + "index": 8513 + } + }, + { + "items": [ + 4787.5, + 16.425100326538086 + ], + "hints": { + "index": 8514 + } + }, + { + "items": [ + 4788, + 15.63259983062744 + ], + "hints": { + "index": 8515 + } + }, + { + "items": [ + 4788.5, + 10.55679988861084 + ], + "hints": { + "index": 8516 + } + }, + { + "items": [ + 4789, + 7.2867999076843262 + ], + "hints": { + "index": 8517 + } + }, + { + "items": [ + 4789.5, + 6.3453 + ], + "hints": { + "index": 8518 + } + }, + { + "items": [ + 4790, + 7.6869001388549805 + ], + "hints": { + "index": 8519 + } + }, + { + "items": [ + 4790.5, + 9.4133996963500977 + ], + "hints": { + "index": 8520 + } + }, + { + "items": [ + 4791, + 8.9492998123168945 + ], + "hints": { + "index": 8521 + } + }, + { + "items": [ + 4791.5, + 6.73799991607666 + ], + "hints": { + "index": 8522 + } + }, + { + "items": [ + 4792, + 6.6760001182556152 + ], + "hints": { + "index": 8523 + } + }, + { + "items": [ + 4792.5, + 8.0204 + ], + "hints": { + "index": 8524 + } + }, + { + "items": [ + 4793, + 12.0339 + ], + "hints": { + "index": 8525 + } + }, + { + "items": [ + 4793.5, + 15.1311 + ], + "hints": { + "index": 8526 + } + }, + { + "items": [ + 4794, + 16.593299865722656 + ], + "hints": { + "index": 8527 + } + }, + { + "items": [ + 4794.5, + 14.460700035095217 + ], + "hints": { + "index": 8528 + } + }, + { + "items": [ + 4795, + 11.038700103759766 + ], + "hints": { + "index": 8529 + } + }, + { + "items": [ + 4795.5, + 6.6979 + ], + "hints": { + "index": 8530 + } + }, + { + "items": [ + 4796, + 5.7289 + ], + "hints": { + "index": 8531 + } + }, + { + "items": [ + 4796.5, + 6.0672998428344727 + ], + "hints": { + "index": 8532 + } + }, + { + "items": [ + 4797, + 8.0961 + ], + "hints": { + "index": 8533 + } + }, + { + "items": [ + 4797.5, + 11.8255 + ], + "hints": { + "index": 8534 + } + }, + { + "items": [ + 4798, + 13.827699661254885 + ], + "hints": { + "index": 8535 + } + }, + { + "items": [ + 4798.5, + 13.05840015411377 + ], + "hints": { + "index": 8536 + } + }, + { + "items": [ + 4799, + 11.915399551391602 + ], + "hints": { + "index": 8537 + } + }, + { + "items": [ + 4799.5, + 9.7315998077392578 + ], + "hints": { + "index": 8538 + } + }, + { + "items": [ + 4800, + 8.5391998291015625 + ], + "hints": { + "index": 8539 + } + }, + { + "items": [ + 4800.5, + 8.2327 + ], + "hints": { + "index": 8540 + } + }, + { + "items": [ + 4801, + 11.235500335693359 + ], + "hints": { + "index": 8541 + } + }, + { + "items": [ + 4801.5, + 15.0468 + ], + "hints": { + "index": 8542 + } + }, + { + "items": [ + 4802, + 18.2286 + ], + "hints": { + "index": 8543 + } + }, + { + "items": [ + 4802.5, + 15.30519962310791 + ], + "hints": { + "index": 8544 + } + }, + { + "items": [ + 4803, + 12.184900283813477 + ], + "hints": { + "index": 8545 + } + }, + { + "items": [ + 4803.5, + 11.203900337219238 + ], + "hints": { + "index": 8546 + } + }, + { + "items": [ + 4804, + 12.776 + ], + "hints": { + "index": 8547 + } + }, + { + "items": [ + 4804.5, + 15.940600395202637 + ], + "hints": { + "index": 8548 + } + }, + { + "items": [ + 4805, + 18.287500381469727 + ], + "hints": { + "index": 8549 + } + }, + { + "items": [ + 4805.5, + 17.493400573730469 + ], + "hints": { + "index": 8550 + } + }, + { + "items": [ + 4806, + 15.125900268554688 + ], + "hints": { + "index": 8551 + } + }, + { + "items": [ + 4806.5, + 12.296199798583984 + ], + "hints": { + "index": 8552 + } + }, + { + "items": [ + 4807, + 10.98639965057373 + ], + "hints": { + "index": 8553 + } + }, + { + "items": [ + 4807.5, + 8.9842 + ], + "hints": { + "index": 8554 + } + }, + { + "items": [ + 4808, + 10.821499824523926 + ], + "hints": { + "index": 8555 + } + }, + { + "items": [ + 4808.5, + 12.619799613952637 + ], + "hints": { + "index": 8556 + } + }, + { + "items": [ + 4809, + 16.97960090637207 + ], + "hints": { + "index": 8557 + } + }, + { + "items": [ + 4809.5, + 15.934700012207031 + ], + "hints": { + "index": 8558 + } + }, + { + "items": [ + 4810, + 15.469200134277344 + ], + "hints": { + "index": 8559 + } + }, + { + "items": [ + 4810.5, + 15.356100082397459 + ], + "hints": { + "index": 8560 + } + }, + { + "items": [ + 4811, + 13.8725 + ], + "hints": { + "index": 8561 + } + }, + { + "items": [ + 4811.5, + 14.2483 + ], + "hints": { + "index": 8562 + } + }, + { + "items": [ + 4812, + 16.134199142456055 + ], + "hints": { + "index": 8563 + } + }, + { + "items": [ + 4812.5, + 15.752 + ], + "hints": { + "index": 8564 + } + }, + { + "items": [ + 4813, + 15.052000045776367 + ], + "hints": { + "index": 8565 + } + }, + { + "items": [ + 4813.5, + 13.5843 + ], + "hints": { + "index": 8566 + } + }, + { + "items": [ + 4814, + 15.598799705505373 + ], + "hints": { + "index": 8567 + } + }, + { + "items": [ + 4814.5, + 12.102199554443359 + ], + "hints": { + "index": 8568 + } + }, + { + "items": [ + 4815, + 9.0638999938964844 + ], + "hints": { + "index": 8569 + } + }, + { + "items": [ + 4815.5, + 8.7308998107910156 + ], + "hints": { + "index": 8570 + } + }, + { + "items": [ + 4816, + 10.7504 + ], + "hints": { + "index": 8571 + } + }, + { + "items": [ + 4816.5, + 13.536700248718262 + ], + "hints": { + "index": 8572 + } + }, + { + "items": [ + 4817, + 13.3774995803833 + ], + "hints": { + "index": 8573 + } + }, + { + "items": [ + 4817.5, + 10.345100402832031 + ], + "hints": { + "index": 8574 + } + }, + { + "items": [ + 4818, + 7.2661 + ], + "hints": { + "index": 8575 + } + }, + { + "items": [ + 4818.5, + 5.3133 + ], + "hints": { + "index": 8576 + } + }, + { + "items": [ + 4819, + 4.356 + ], + "hints": { + "index": 8577 + } + }, + { + "items": [ + 4819.5, + 4.1621 + ], + "hints": { + "index": 8578 + } + }, + { + "items": [ + 4820, + 3.8210000991821289 + ], + "hints": { + "index": 8579 + } + }, + { + "items": [ + 4820.5, + 3.6636 + ], + "hints": { + "index": 8580 + } + }, + { + "items": [ + 4821, + 3.5906000137329106 + ], + "hints": { + "index": 8581 + } + }, + { + "items": [ + 4821.5, + 3.535 + ], + "hints": { + "index": 8582 + } + }, + { + "items": [ + 4822, + 3.4959 + ], + "hints": { + "index": 8583 + } + }, + { + "items": [ + 4822.5, + 3.381 + ], + "hints": { + "index": 8584 + } + }, + { + "items": [ + 4823, + 3.2908999919891357 + ], + "hints": { + "index": 8585 + } + }, + { + "items": [ + 4823.5, + 3.2104 + ], + "hints": { + "index": 8586 + } + }, + { + "items": [ + 4824, + 3.1268 + ], + "hints": { + "index": 8587 + } + }, + { + "items": [ + 4824.5, + 3.0571 + ], + "hints": { + "index": 8588 + } + }, + { + "items": [ + 4825, + 2.9574999809265137 + ], + "hints": { + "index": 8589 + } + }, + { + "items": [ + 4825.5, + 3.0651 + ], + "hints": { + "index": 8590 + } + }, + { + "items": [ + 4826, + 3.1586000919342041 + ], + "hints": { + "index": 8591 + } + }, + { + "items": [ + 4826.5, + 3.1353 + ], + "hints": { + "index": 8592 + } + }, + { + "items": [ + 4827, + 3.0288999080657959 + ], + "hints": { + "index": 8593 + } + }, + { + "items": [ + 4827.5, + 2.9936 + ], + "hints": { + "index": 8594 + } + }, + { + "items": [ + 4828, + 3.0336 + ], + "hints": { + "index": 8595 + } + }, + { + "items": [ + 4828.5, + 2.9713 + ], + "hints": { + "index": 8596 + } + }, + { + "items": [ + 4829, + 2.9404 + ], + "hints": { + "index": 8597 + } + }, + { + "items": [ + 4829.5, + 2.9807999134063721 + ], + "hints": { + "index": 8598 + } + }, + { + "items": [ + 4830, + 3.0081 + ], + "hints": { + "index": 8599 + } + }, + { + "items": [ + 4830.5, + 3.0367000102996826 + ], + "hints": { + "index": 8600 + } + }, + { + "items": [ + 4831, + 2.9388000965118408 + ], + "hints": { + "index": 8601 + } + }, + { + "items": [ + 4831.5, + 2.9898 + ], + "hints": { + "index": 8602 + } + }, + { + "items": [ + 4832, + 2.8928 + ], + "hints": { + "index": 8603 + } + }, + { + "items": [ + 4832.5, + 2.9422 + ], + "hints": { + "index": 8604 + } + }, + { + "items": [ + 4833, + 2.9669 + ], + "hints": { + "index": 8605 + } + }, + { + "items": [ + 4833.5, + 3.0546 + ], + "hints": { + "index": 8606 + } + }, + { + "items": [ + 4834, + 3.059 + ], + "hints": { + "index": 8607 + } + }, + { + "items": [ + 4834.5, + 2.9442 + ], + "hints": { + "index": 8608 + } + }, + { + "items": [ + 4835, + 2.9166 + ], + "hints": { + "index": 8609 + } + }, + { + "items": [ + 4835.5, + 2.8718 + ], + "hints": { + "index": 8610 + } + }, + { + "items": [ + 4836, + 2.9698 + ], + "hints": { + "index": 8611 + } + }, + { + "items": [ + 4836.5, + 2.9693 + ], + "hints": { + "index": 8612 + } + }, + { + "items": [ + 4837, + 3.0312 + ], + "hints": { + "index": 8613 + } + }, + { + "items": [ + 4837.5, + 3.0268 + ], + "hints": { + "index": 8614 + } + }, + { + "items": [ + 4838, + 2.9918 + ], + "hints": { + "index": 8615 + } + }, + { + "items": [ + 4838.5, + 2.9719 + ], + "hints": { + "index": 8616 + } + }, + { + "items": [ + 4839, + 2.9691998958587646 + ], + "hints": { + "index": 8617 + } + }, + { + "items": [ + 4839.5, + 3.0536 + ], + "hints": { + "index": 8618 + } + }, + { + "items": [ + 4840, + 3.0808 + ], + "hints": { + "index": 8619 + } + }, + { + "items": [ + 4840.5, + 3.1245 + ], + "hints": { + "index": 8620 + } + }, + { + "items": [ + 4841, + 3.0181 + ], + "hints": { + "index": 8621 + } + }, + { + "items": [ + 4841.5, + 3.0143 + ], + "hints": { + "index": 8622 + } + }, + { + "items": [ + 4842, + 3.0035 + ], + "hints": { + "index": 8623 + } + }, + { + "items": [ + 4842.5, + 3.1442 + ], + "hints": { + "index": 8624 + } + }, + { + "items": [ + 4843, + 3.1707 + ], + "hints": { + "index": 8625 + } + }, + { + "items": [ + 4843.5, + 3.1908 + ], + "hints": { + "index": 8626 + } + }, + { + "items": [ + 4844, + 3.1683 + ], + "hints": { + "index": 8627 + } + }, + { + "items": [ + 4844.5, + 3.0584 + ], + "hints": { + "index": 8628 + } + }, + { + "items": [ + 4845, + 3.0046999454498291 + ], + "hints": { + "index": 8629 + } + }, + { + "items": [ + 4845.5, + 2.9407 + ], + "hints": { + "index": 8630 + } + }, + { + "items": [ + 4846, + 3.1082 + ], + "hints": { + "index": 8631 + } + }, + { + "items": [ + 4846.5, + 3.1048 + ], + "hints": { + "index": 8632 + } + }, + { + "items": [ + 4847, + 3.284 + ], + "hints": { + "index": 8633 + } + }, + { + "items": [ + 4847.5, + 3.1467 + ], + "hints": { + "index": 8634 + } + }, + { + "items": [ + 4848, + 3.242 + ], + "hints": { + "index": 8635 + } + }, + { + "items": [ + 4848.5, + 3.1432 + ], + "hints": { + "index": 8636 + } + }, + { + "items": [ + 4849, + 3.2014000415802 + ], + "hints": { + "index": 8637 + } + }, + { + "items": [ + 4849.5, + 3.2674000263214111 + ], + "hints": { + "index": 8638 + } + }, + { + "items": [ + 4850, + 3.7012 + ], + "hints": { + "index": 8639 + } + }, + { + "items": [ + 4850.5, + 4.4103 + ], + "hints": { + "index": 8640 + } + }, + { + "items": [ + 4851, + 6.0231 + ], + "hints": { + "index": 8641 + } + }, + { + "items": [ + 4851.5, + 6.6074 + ], + "hints": { + "index": 8642 + } + }, + { + "items": [ + 4852, + 6.2076 + ], + "hints": { + "index": 8643 + } + }, + { + "items": [ + 4852.5, + 4.8423 + ], + "hints": { + "index": 8644 + } + }, + { + "items": [ + 4853, + 3.8764998912811279 + ], + "hints": { + "index": 8645 + } + }, + { + "items": [ + 4853.5, + 3.3955 + ], + "hints": { + "index": 8646 + } + }, + { + "items": [ + 4854, + 3.2815001010894775 + ], + "hints": { + "index": 8647 + } + }, + { + "items": [ + 4854.5, + 3.1508998870849609 + ], + "hints": { + "index": 8648 + } + }, + { + "items": [ + 4855, + 3.139 + ], + "hints": { + "index": 8649 + } + }, + { + "items": [ + 4855.5, + 3.0455000400543213 + ], + "hints": { + "index": 8650 + } + }, + { + "items": [ + 4856, + 3.1136999130249023 + ], + "hints": { + "index": 8651 + } + }, + { + "items": [ + 4856.5, + 3.2105000019073486 + ], + "hints": { + "index": 8652 + } + }, + { + "items": [ + 4857, + 3.3671000003814697 + ], + "hints": { + "index": 8653 + } + }, + { + "items": [ + 4857.5, + 3.2725999355316162 + ], + "hints": { + "index": 8654 + } + }, + { + "items": [ + 4858, + 3.087899923324585 + ], + "hints": { + "index": 8655 + } + }, + { + "items": [ + 4858.5, + 2.8942000865936279 + ], + "hints": { + "index": 8656 + } + }, + { + "items": [ + 4859, + 2.8712000846862793 + ], + "hints": { + "index": 8657 + } + }, + { + "items": [ + 4859.5, + 3.0282 + ], + "hints": { + "index": 8658 + } + }, + { + "items": [ + 4860, + 3.1086 + ], + "hints": { + "index": 8659 + } + }, + { + "items": [ + 4860.5, + 3.0796 + ], + "hints": { + "index": 8660 + } + }, + { + "items": [ + 4861, + 3.0894999504089355 + ], + "hints": { + "index": 8661 + } + }, + { + "items": [ + 4861.5, + 3.1568 + ], + "hints": { + "index": 8662 + } + }, + { + "items": [ + 4862, + 3.3167 + ], + "hints": { + "index": 8663 + } + }, + { + "items": [ + 4862.5, + 3.1252 + ], + "hints": { + "index": 8664 + } + }, + { + "items": [ + 4863, + 3.0894 + ], + "hints": { + "index": 8665 + } + }, + { + "items": [ + 4863.5, + 3.1449 + ], + "hints": { + "index": 8666 + } + }, + { + "items": [ + 4864, + 3.2318 + ], + "hints": { + "index": 8667 + } + }, + { + "items": [ + 4864.5, + 3.2146 + ], + "hints": { + "index": 8668 + } + }, + { + "items": [ + 4865, + 3.1233000755310059 + ], + "hints": { + "index": 8669 + } + }, + { + "items": [ + 4865.5, + 3.1861 + ], + "hints": { + "index": 8670 + } + }, + { + "items": [ + 4866, + 3.1974 + ], + "hints": { + "index": 8671 + } + }, + { + "items": [ + 4866.5, + 3.2233 + ], + "hints": { + "index": 8672 + } + }, + { + "items": [ + 4867, + 3.1339 + ], + "hints": { + "index": 8673 + } + }, + { + "items": [ + 4867.5, + 3.121 + ], + "hints": { + "index": 8674 + } + }, + { + "items": [ + 4868, + 3.0247 + ], + "hints": { + "index": 8675 + } + }, + { + "items": [ + 4868.5, + 3.0468 + ], + "hints": { + "index": 8676 + } + }, + { + "items": [ + 4869, + 3.1088 + ], + "hints": { + "index": 8677 + } + }, + { + "items": [ + 4869.5, + 3.1495 + ], + "hints": { + "index": 8678 + } + }, + { + "items": [ + 4870, + 3.1728 + ], + "hints": { + "index": 8679 + } + }, + { + "items": [ + 4870.5, + 3.086999893188477 + ], + "hints": { + "index": 8680 + } + }, + { + "items": [ + 4871, + 2.9561 + ], + "hints": { + "index": 8681 + } + }, + { + "items": [ + 4871.5, + 2.9639999866485596 + ], + "hints": { + "index": 8682 + } + }, + { + "items": [ + 4872, + 2.975100040435791 + ], + "hints": { + "index": 8683 + } + }, + { + "items": [ + 4872.5, + 3.1440999507904053 + ], + "hints": { + "index": 8684 + } + }, + { + "items": [ + 4873, + 3.1038000583648682 + ], + "hints": { + "index": 8685 + } + }, + { + "items": [ + 4873.5, + 3.1263999938964844 + ], + "hints": { + "index": 8686 + } + }, + { + "items": [ + 4874, + 3.2227001190185547 + ], + "hints": { + "index": 8687 + } + }, + { + "items": [ + 4874.5, + 3.3979001045227051 + ], + "hints": { + "index": 8688 + } + }, + { + "items": [ + 4875, + 3.5453999042510982 + ], + "hints": { + "index": 8689 + } + }, + { + "items": [ + 4875.5, + 3.3486 + ], + "hints": { + "index": 8690 + } + }, + { + "items": [ + 4876, + 3.1803 + ], + "hints": { + "index": 8691 + } + }, + { + "items": [ + 4876.5, + 3.0181 + ], + "hints": { + "index": 8692 + } + }, + { + "items": [ + 4877, + 3.1212 + ], + "hints": { + "index": 8693 + } + }, + { + "items": [ + 4877.5, + 3.109 + ], + "hints": { + "index": 8694 + } + }, + { + "items": [ + 4878, + 3.2166 + ], + "hints": { + "index": 8695 + } + }, + { + "items": [ + 4878.5, + 3.2604 + ], + "hints": { + "index": 8696 + } + }, + { + "items": [ + 4879, + 3.2082 + ], + "hints": { + "index": 8697 + } + }, + { + "items": [ + 4879.5, + 3.1692 + ], + "hints": { + "index": 8698 + } + }, + { + "items": [ + 4880, + 3.0414 + ], + "hints": { + "index": 8699 + } + }, + { + "items": [ + 4880.5, + 3.1247999668121338 + ], + "hints": { + "index": 8700 + } + }, + { + "items": [ + 4881, + 3.1439 + ], + "hints": { + "index": 8701 + } + }, + { + "items": [ + 4881.5, + 3.3431999683380127 + ], + "hints": { + "index": 8702 + } + }, + { + "items": [ + 4882, + 3.5209999084472656 + ], + "hints": { + "index": 8703 + } + }, + { + "items": [ + 4882.5, + 3.4421999454498291 + ], + "hints": { + "index": 8704 + } + }, + { + "items": [ + 4883, + 3.4670999050140381 + ], + "hints": { + "index": 8705 + } + }, + { + "items": [ + 4883.5, + 3.312 + ], + "hints": { + "index": 8706 + } + }, + { + "items": [ + 4884, + 3.4379 + ], + "hints": { + "index": 8707 + } + }, + { + "items": [ + 4884.5, + 3.3377 + ], + "hints": { + "index": 8708 + } + }, + { + "items": [ + 4885, + 3.3253 + ], + "hints": { + "index": 8709 + } + }, + { + "items": [ + 4885.5, + 3.2273 + ], + "hints": { + "index": 8710 + } + }, + { + "items": [ + 4886, + 3.2132999897003174 + ], + "hints": { + "index": 8711 + } + }, + { + "items": [ + 4886.5, + 3.2054998874664307 + ], + "hints": { + "index": 8712 + } + }, + { + "items": [ + 4887, + 3.2342000007629395 + ], + "hints": { + "index": 8713 + } + }, + { + "items": [ + 4887.5, + 3.0903 + ], + "hints": { + "index": 8714 + } + }, + { + "items": [ + 4888, + 3.148 + ], + "hints": { + "index": 8715 + } + }, + { + "items": [ + 4888.5, + 3.085 + ], + "hints": { + "index": 8716 + } + }, + { + "items": [ + 4889, + 3.1960999965667725 + ], + "hints": { + "index": 8717 + } + }, + { + "items": [ + 4889.5, + 3.1274 + ], + "hints": { + "index": 8718 + } + }, + { + "items": [ + 4890, + 3.1807000637054443 + ], + "hints": { + "index": 8719 + } + }, + { + "items": [ + 4890.5, + 3.105600118637085 + ], + "hints": { + "index": 8720 + } + }, + { + "items": [ + 4891, + 3.1085000038146973 + ], + "hints": { + "index": 8721 + } + }, + { + "items": [ + 4891.5, + 3.0875999927520752 + ], + "hints": { + "index": 8722 + } + }, + { + "items": [ + 4892, + 3.1140999794006348 + ], + "hints": { + "index": 8723 + } + }, + { + "items": [ + 4892.5, + 3.0406 + ], + "hints": { + "index": 8724 + } + }, + { + "items": [ + 4893, + 3.0414 + ], + "hints": { + "index": 8725 + } + }, + { + "items": [ + 4893.5, + 3.1096000671386719 + ], + "hints": { + "index": 8726 + } + }, + { + "items": [ + 4894, + 3.1687 + ], + "hints": { + "index": 8727 + } + }, + { + "items": [ + 4894.5, + 3.2162 + ], + "hints": { + "index": 8728 + } + }, + { + "items": [ + 4895, + 3.1531999111175537 + ], + "hints": { + "index": 8729 + } + }, + { + "items": [ + 4895.5, + 3.1902000904083252 + ], + "hints": { + "index": 8730 + } + }, + { + "items": [ + 4896, + 3.1332 + ], + "hints": { + "index": 8731 + } + }, + { + "items": [ + 4896.5, + 3.082799911499023 + ], + "hints": { + "index": 8732 + } + }, + { + "items": [ + 4897, + 3.0422 + ], + "hints": { + "index": 8733 + } + }, + { + "items": [ + 4897.5, + 3.1150000095367432 + ], + "hints": { + "index": 8734 + } + }, + { + "items": [ + 4898, + 3.1554 + ], + "hints": { + "index": 8735 + } + }, + { + "items": [ + 4898.5, + 3.1397 + ], + "hints": { + "index": 8736 + } + }, + { + "items": [ + 4899, + 3.0292000770568848 + ], + "hints": { + "index": 8737 + } + }, + { + "items": [ + 4899.5, + 3.0049 + ], + "hints": { + "index": 8738 + } + }, + { + "items": [ + 4900, + 3.00600004196167 + ], + "hints": { + "index": 8739 + } + }, + { + "items": [ + 4900.5, + 2.984699964523315 + ], + "hints": { + "index": 8740 + } + }, + { + "items": [ + 4901, + 2.9358000755310059 + ], + "hints": { + "index": 8741 + } + }, + { + "items": [ + 4901.5, + 2.8901998996734619 + ], + "hints": { + "index": 8742 + } + }, + { + "items": [ + 4902, + 2.8712000846862793 + ], + "hints": { + "index": 8743 + } + }, + { + "items": [ + 4902.5, + 2.8471999168395996 + ], + "hints": { + "index": 8744 + } + }, + { + "items": [ + 4903, + 2.9033000469207764 + ], + "hints": { + "index": 8745 + } + }, + { + "items": [ + 4903.5, + 2.8894000053405762 + ], + "hints": { + "index": 8746 + } + }, + { + "items": [ + 4904, + 2.9432 + ], + "hints": { + "index": 8747 + } + }, + { + "items": [ + 4904.5, + 2.9695999622344971 + ], + "hints": { + "index": 8748 + } + }, + { + "items": [ + 4905, + 3.0122001171112061 + ], + "hints": { + "index": 8749 + } + }, + { + "items": [ + 4905.5, + 3.1749 + ], + "hints": { + "index": 8750 + } + }, + { + "items": [ + 4906, + 3.54 + ], + "hints": { + "index": 8751 + } + }, + { + "items": [ + 4906.5, + 3.9732 + ], + "hints": { + "index": 8752 + } + }, + { + "items": [ + 4907, + 3.70199990272522 + ], + "hints": { + "index": 8753 + } + }, + { + "items": [ + 4907.5, + 3.2059 + ], + "hints": { + "index": 8754 + } + }, + { + "items": [ + 4908, + 2.9288 + ], + "hints": { + "index": 8755 + } + }, + { + "items": [ + 4908.5, + 2.8442 + ], + "hints": { + "index": 8756 + } + }, + { + "items": [ + 4909, + 2.8396000862121582 + ], + "hints": { + "index": 8757 + } + }, + { + "items": [ + 4909.5, + 2.8832 + ], + "hints": { + "index": 8758 + } + }, + { + "items": [ + 4910, + 3.0566000938415527 + ], + "hints": { + "index": 8759 + } + }, + { + "items": [ + 4910.5, + 3.0434999465942383 + ], + "hints": { + "index": 8760 + } + }, + { + "items": [ + 4911, + 2.9814000129699707 + ], + "hints": { + "index": 8761 + } + }, + { + "items": [ + 4911.5, + 2.8543 + ], + "hints": { + "index": 8762 + } + }, + { + "items": [ + 4912, + 2.9231 + ], + "hints": { + "index": 8763 + } + }, + { + "items": [ + 4912.5, + 3.100100040435791 + ], + "hints": { + "index": 8764 + } + }, + { + "items": [ + 4913, + 3.4271 + ], + "hints": { + "index": 8765 + } + }, + { + "items": [ + 4913.5, + 3.4343 + ], + "hints": { + "index": 8766 + } + }, + { + "items": [ + 4914, + 3.3078000545501709 + ], + "hints": { + "index": 8767 + } + }, + { + "items": [ + 4914.5, + 3.1280999183654785 + ], + "hints": { + "index": 8768 + } + }, + { + "items": [ + 4915, + 3.0495998859405522 + ], + "hints": { + "index": 8769 + } + }, + { + "items": [ + 4915.5, + 3.1472001075744629 + ], + "hints": { + "index": 8770 + } + }, + { + "items": [ + 4916, + 3.182499885559082 + ], + "hints": { + "index": 8771 + } + }, + { + "items": [ + 4916.5, + 3.2734000682830811 + ], + "hints": { + "index": 8772 + } + }, + { + "items": [ + 4917, + 3.2039000988006592 + ], + "hints": { + "index": 8773 + } + }, + { + "items": [ + 4917.5, + 3.2140998840332031 + ], + "hints": { + "index": 8774 + } + }, + { + "items": [ + 4918, + 3.333 + ], + "hints": { + "index": 8775 + } + }, + { + "items": [ + 4918.5, + 3.4293999671936035 + ], + "hints": { + "index": 8776 + } + }, + { + "items": [ + 4919, + 3.5339999198913574 + ], + "hints": { + "index": 8777 + } + }, + { + "items": [ + 4919.5, + 3.55049991607666 + ], + "hints": { + "index": 8778 + } + }, + { + "items": [ + 4920, + 3.635699987411499 + ], + "hints": { + "index": 8779 + } + }, + { + "items": [ + 4920.5, + 3.5859000682830811 + ], + "hints": { + "index": 8780 + } + }, + { + "items": [ + 4921, + 3.6389999389648442 + ], + "hints": { + "index": 8781 + } + }, + { + "items": [ + 4921.5, + 3.8431999683380127 + ], + "hints": { + "index": 8782 + } + }, + { + "items": [ + 4922, + 4.27839994430542 + ], + "hints": { + "index": 8783 + } + }, + { + "items": [ + 4922.5, + 5.0655999183654785 + ], + "hints": { + "index": 8784 + } + }, + { + "items": [ + 4923, + 6.3758997917175293 + ], + "hints": { + "index": 8785 + } + }, + { + "items": [ + 4923.5, + 7.70170021057129 + ], + "hints": { + "index": 8786 + } + }, + { + "items": [ + 4924, + 7.6872000694274893 + ], + "hints": { + "index": 8787 + } + }, + { + "items": [ + 4924.5, + 6.2634000778198242 + ], + "hints": { + "index": 8788 + } + }, + { + "items": [ + 4925, + 5.1451001167297363 + ], + "hints": { + "index": 8789 + } + }, + { + "items": [ + 4925.5, + 4.6243000030517578 + ], + "hints": { + "index": 8790 + } + }, + { + "items": [ + 4926, + 4.5289998054504395 + ], + "hints": { + "index": 8791 + } + }, + { + "items": [ + 4926.5, + 4.2761998176574707 + ], + "hints": { + "index": 8792 + } + }, + { + "items": [ + 4927, + 4.171299934387207 + ], + "hints": { + "index": 8793 + } + }, + { + "items": [ + 4927.5, + 4.0890002250671387 + ], + "hints": { + "index": 8794 + } + }, + { + "items": [ + 4928, + 4.5406999588012695 + ], + "hints": { + "index": 8795 + } + }, + { + "items": [ + 4928.5, + 4.9404001235961914 + ], + "hints": { + "index": 8796 + } + }, + { + "items": [ + 4929, + 5.54290008544922 + ], + "hints": { + "index": 8797 + } + }, + { + "items": [ + 4929.5, + 5.5117998123168945 + ], + "hints": { + "index": 8798 + } + }, + { + "items": [ + 4930, + 5.2715997695922852 + ], + "hints": { + "index": 8799 + } + }, + { + "items": [ + 4930.5, + 5.003699779510498 + ], + "hints": { + "index": 8800 + } + }, + { + "items": [ + 4931, + 4.9559998512268066 + ], + "hints": { + "index": 8801 + } + }, + { + "items": [ + 4931.5, + 5.2133002281188965 + ], + "hints": { + "index": 8802 + } + }, + { + "items": [ + 4932, + 5.028900146484375 + ], + "hints": { + "index": 8803 + } + }, + { + "items": [ + 4932.5, + 5.2828001976013184 + ], + "hints": { + "index": 8804 + } + }, + { + "items": [ + 4933, + 5.5241 + ], + "hints": { + "index": 8805 + } + }, + { + "items": [ + 4933.5, + 6.3114 + ], + "hints": { + "index": 8806 + } + }, + { + "items": [ + 4934, + 6.0336 + ], + "hints": { + "index": 8807 + } + }, + { + "items": [ + 4934.5, + 5.4622 + ], + "hints": { + "index": 8808 + } + }, + { + "items": [ + 4935, + 4.668 + ], + "hints": { + "index": 8809 + } + }, + { + "items": [ + 4935.5, + 4.4542 + ], + "hints": { + "index": 8810 + } + }, + { + "items": [ + 4936, + 4.3731 + ], + "hints": { + "index": 8811 + } + }, + { + "items": [ + 4936.5, + 4.3412 + ], + "hints": { + "index": 8812 + } + }, + { + "items": [ + 4937, + 4.5314 + ], + "hints": { + "index": 8813 + } + }, + { + "items": [ + 4937.5, + 5.1435999870300293 + ], + "hints": { + "index": 8814 + } + }, + { + "items": [ + 4938, + 6.916100025177002 + ], + "hints": { + "index": 8815 + } + }, + { + "items": [ + 4938.5, + 9.75529956817627 + ], + "hints": { + "index": 8816 + } + }, + { + "items": [ + 4939, + 9.9063997268676758 + ], + "hints": { + "index": 8817 + } + }, + { + "items": [ + 4939.5, + 6.6357002258300781 + ], + "hints": { + "index": 8818 + } + }, + { + "items": [ + 4940, + 5.0118999481201172 + ], + "hints": { + "index": 8819 + } + }, + { + "items": [ + 4940.5, + 5.0641999244689941 + ], + "hints": { + "index": 8820 + } + }, + { + "items": [ + 4941, + 5.1655998229980469 + ], + "hints": { + "index": 8821 + } + }, + { + "items": [ + 4941.5, + 6.3014001846313477 + ], + "hints": { + "index": 8822 + } + }, + { + "items": [ + 4942, + 6.950200080871582 + ], + "hints": { + "index": 8823 + } + }, + { + "items": [ + 4942.5, + 9.8751001358032227 + ], + "hints": { + "index": 8824 + } + }, + { + "items": [ + 4943, + 10.4412 + ], + "hints": { + "index": 8825 + } + }, + { + "items": [ + 4943.5, + 10.2186 + ], + "hints": { + "index": 8826 + } + }, + { + "items": [ + 4944, + 11.4451 + ], + "hints": { + "index": 8827 + } + }, + { + "items": [ + 4944.5, + 12.9894 + ], + "hints": { + "index": 8828 + } + }, + { + "items": [ + 4945, + 17.94 + ], + "hints": { + "index": 8829 + } + }, + { + "items": [ + 4945.5, + 13.81410026550293 + ], + "hints": { + "index": 8830 + } + }, + { + "items": [ + 4946, + 11.534799575805664 + ], + "hints": { + "index": 8831 + } + }, + { + "items": [ + 4946.5, + 9.0072002410888672 + ], + "hints": { + "index": 8832 + } + }, + { + "items": [ + 4947, + 8.3989 + ], + "hints": { + "index": 8833 + } + }, + { + "items": [ + 4947.5, + 8.3854 + ], + "hints": { + "index": 8834 + } + }, + { + "items": [ + 4948, + 8.0972003936767578 + ], + "hints": { + "index": 8835 + } + }, + { + "items": [ + 4948.5, + 9.31 + ], + "hints": { + "index": 8836 + } + }, + { + "items": [ + 4949, + 9.974 + ], + "hints": { + "index": 8837 + } + }, + { + "items": [ + 4949.5, + 10.7344 + ], + "hints": { + "index": 8838 + } + }, + { + "items": [ + 4950, + 8.3143997192382813 + ], + "hints": { + "index": 8839 + } + }, + { + "items": [ + 4950.5, + 7.3636 + ], + "hints": { + "index": 8840 + } + }, + { + "items": [ + 4951, + 8.2194 + ], + "hints": { + "index": 8841 + } + }, + { + "items": [ + 4951.5, + 10.310199737548828 + ], + "hints": { + "index": 8842 + } + }, + { + "items": [ + 4952, + 13.3583 + ], + "hints": { + "index": 8843 + } + }, + { + "items": [ + 4952.5, + 15.849399566650392 + ], + "hints": { + "index": 8844 + } + }, + { + "items": [ + 4953, + 17.763099670410156 + ], + "hints": { + "index": 8845 + } + }, + { + "items": [ + 4953.5, + 14.2285 + ], + "hints": { + "index": 8846 + } + }, + { + "items": [ + 4954, + 9.8454 + ], + "hints": { + "index": 8847 + } + }, + { + "items": [ + 4954.5, + 8.5223 + ], + "hints": { + "index": 8848 + } + }, + { + "items": [ + 4955, + 9.3534002304077148 + ], + "hints": { + "index": 8849 + } + }, + { + "items": [ + 4955.5, + 10.254899978637695 + ], + "hints": { + "index": 8850 + } + }, + { + "items": [ + 4956, + 10.1668 + ], + "hints": { + "index": 8851 + } + }, + { + "items": [ + 4956.5, + 9.1472997665405273 + ], + "hints": { + "index": 8852 + } + }, + { + "items": [ + 4957, + 8.2330999374389648 + ], + "hints": { + "index": 8853 + } + }, + { + "items": [ + 4957.5, + 7.6757 + ], + "hints": { + "index": 8854 + } + }, + { + "items": [ + 4958, + 8.3142995834350586 + ], + "hints": { + "index": 8855 + } + }, + { + "items": [ + 4958.5, + 10.725700378417969 + ], + "hints": { + "index": 8856 + } + }, + { + "items": [ + 4959, + 14.031800270080566 + ], + "hints": { + "index": 8857 + } + }, + { + "items": [ + 4959.5, + 18.146400451660156 + ], + "hints": { + "index": 8858 + } + }, + { + "items": [ + 4960, + 21.152299880981445 + ], + "hints": { + "index": 8859 + } + }, + { + "items": [ + 4960.5, + 21.8876 + ], + "hints": { + "index": 8860 + } + }, + { + "items": [ + 4961, + 19.0851 + ], + "hints": { + "index": 8861 + } + }, + { + "items": [ + 4961.5, + 15.575900077819824 + ], + "hints": { + "index": 8862 + } + }, + { + "items": [ + 4962, + 14.2379 + ], + "hints": { + "index": 8863 + } + }, + { + "items": [ + 4962.5, + 13.826899528503418 + ], + "hints": { + "index": 8864 + } + }, + { + "items": [ + 4963, + 12.769 + ], + "hints": { + "index": 8865 + } + }, + { + "items": [ + 4963.5, + 13.416099548339844 + ], + "hints": { + "index": 8866 + } + }, + { + "items": [ + 4964, + 13.9258 + ], + "hints": { + "index": 8867 + } + }, + { + "items": [ + 4964.5, + 15.884 + ], + "hints": { + "index": 8868 + } + }, + { + "items": [ + 4965, + 16.561599731445313 + ], + "hints": { + "index": 8869 + } + }, + { + "items": [ + 4965.5, + 16.561700820922852 + ], + "hints": { + "index": 8870 + } + }, + { + "items": [ + 4966, + 15.161100387573242 + ], + "hints": { + "index": 8871 + } + }, + { + "items": [ + 4966.5, + 12.73639965057373 + ], + "hints": { + "index": 8872 + } + }, + { + "items": [ + 4967, + 11.6626 + ], + "hints": { + "index": 8873 + } + }, + { + "items": [ + 4967.5, + 12.181500434875488 + ], + "hints": { + "index": 8874 + } + }, + { + "items": [ + 4968, + 14.468600273132324 + ], + "hints": { + "index": 8875 + } + }, + { + "items": [ + 4968.5, + 15.7052001953125 + ], + "hints": { + "index": 8876 + } + }, + { + "items": [ + 4969, + 16.479400634765625 + ], + "hints": { + "index": 8877 + } + }, + { + "items": [ + 4969.5, + 14.894900321960447 + ], + "hints": { + "index": 8878 + } + }, + { + "items": [ + 4970, + 14.6656 + ], + "hints": { + "index": 8879 + } + }, + { + "items": [ + 4970.5, + 11.048399925231934 + ], + "hints": { + "index": 8880 + } + }, + { + "items": [ + 4971, + 10.7023 + ], + "hints": { + "index": 8881 + } + }, + { + "items": [ + 4971.5, + 12.005999565124512 + ], + "hints": { + "index": 8882 + } + }, + { + "items": [ + 4972, + 16.533500671386719 + ], + "hints": { + "index": 8883 + } + }, + { + "items": [ + 4972.5, + 18.728300094604492 + ], + "hints": { + "index": 8884 + } + }, + { + "items": [ + 4973, + 17.562400817871094 + ], + "hints": { + "index": 8885 + } + }, + { + "items": [ + 4973.5, + 15.1596 + ], + "hints": { + "index": 8886 + } + }, + { + "items": [ + 4974, + 17.851699829101563 + ], + "hints": { + "index": 8887 + } + }, + { + "items": [ + 4974.5, + 21.3683 + ], + "hints": { + "index": 8888 + } + }, + { + "items": [ + 4975, + 29.4465 + ], + "hints": { + "index": 8889 + } + }, + { + "items": [ + 4975.5, + 33.6253 + ], + "hints": { + "index": 8890 + } + }, + { + "items": [ + 4976, + 33.8711 + ], + "hints": { + "index": 8891 + } + }, + { + "items": [ + 4976.5, + 26.6723 + ], + "hints": { + "index": 8892 + } + }, + { + "items": [ + 4977, + 21.9151 + ], + "hints": { + "index": 8893 + } + }, + { + "items": [ + 4977.5, + 18.4436 + ], + "hints": { + "index": 8894 + } + }, + { + "items": [ + 4978, + 19.1814 + ], + "hints": { + "index": 8895 + } + }, + { + "items": [ + 4978.5, + 19.8873 + ], + "hints": { + "index": 8896 + } + }, + { + "items": [ + 4979, + 22.0993 + ], + "hints": { + "index": 8897 + } + }, + { + "items": [ + 4979.5, + 22.6086 + ], + "hints": { + "index": 8898 + } + }, + { + "items": [ + 4980, + 20.9603 + ], + "hints": { + "index": 8899 + } + }, + { + "items": [ + 4980.5, + 18.5231 + ], + "hints": { + "index": 8900 + } + }, + { + "items": [ + 4981, + 15.2304 + ], + "hints": { + "index": 8901 + } + }, + { + "items": [ + 4981.5, + 14.2036 + ], + "hints": { + "index": 8902 + } + }, + { + "items": [ + 4982, + 15.3708 + ], + "hints": { + "index": 8903 + } + }, + { + "items": [ + 4982.5, + 18.6199 + ], + "hints": { + "index": 8904 + } + }, + { + "items": [ + 4983, + 22.0644 + ], + "hints": { + "index": 8905 + } + }, + { + "items": [ + 4983.5, + 24.6775 + ], + "hints": { + "index": 8906 + } + }, + { + "items": [ + 4984, + 27.0614 + ], + "hints": { + "index": 8907 + } + }, + { + "items": [ + 4984.5, + 26.2865 + ], + "hints": { + "index": 8908 + } + }, + { + "items": [ + 4985, + 24.2052 + ], + "hints": { + "index": 8909 + } + }, + { + "items": [ + 4985.5, + 20.2518 + ], + "hints": { + "index": 8910 + } + }, + { + "items": [ + 4986, + 18.2496 + ], + "hints": { + "index": 8911 + } + }, + { + "items": [ + 4986.5, + 14.8354 + ], + "hints": { + "index": 8912 + } + }, + { + "items": [ + 4987, + 12.467 + ], + "hints": { + "index": 8913 + } + }, + { + "items": [ + 4987.5, + 11.7301 + ], + "hints": { + "index": 8914 + } + }, + { + "items": [ + 4988, + 14.4469 + ], + "hints": { + "index": 8915 + } + }, + { + "items": [ + 4988.5, + 18.414 + ], + "hints": { + "index": 8916 + } + }, + { + "items": [ + 4989, + 23.0956 + ], + "hints": { + "index": 8917 + } + }, + { + "items": [ + 4989.5, + 20.0904 + ], + "hints": { + "index": 8918 + } + }, + { + "items": [ + 4990, + 16.9726 + ], + "hints": { + "index": 8919 + } + }, + { + "items": [ + 4990.5, + 16.5945 + ], + "hints": { + "index": 8920 + } + }, + { + "items": [ + 4991, + 16.73 + ], + "hints": { + "index": 8921 + } + }, + { + "items": [ + 4991.5, + 19.0288 + ], + "hints": { + "index": 8922 + } + }, + { + "items": [ + 4992, + 16.2207 + ], + "hints": { + "index": 8923 + } + }, + { + "items": [ + 4992.5, + 15.1758 + ], + "hints": { + "index": 8924 + } + }, + { + "items": [ + 4993, + 15.2991 + ], + "hints": { + "index": 8925 + } + }, + { + "items": [ + 4993.5, + 16.232500076293945 + ], + "hints": { + "index": 8926 + } + }, + { + "items": [ + 4994, + 13.673999786376951 + ], + "hints": { + "index": 8927 + } + }, + { + "items": [ + 4994.5, + 11.183699607849119 + ], + "hints": { + "index": 8928 + } + }, + { + "items": [ + 4995, + 11.215100288391112 + ], + "hints": { + "index": 8929 + } + }, + { + "items": [ + 4995.5, + 10.519000053405762 + ], + "hints": { + "index": 8930 + } + }, + { + "items": [ + 4996, + 12.892299652099608 + ], + "hints": { + "index": 8931 + } + }, + { + "items": [ + 4996.5, + 14.754899978637695 + ], + "hints": { + "index": 8932 + } + }, + { + "items": [ + 4997, + 22.150800704956055 + ], + "hints": { + "index": 8933 + } + }, + { + "items": [ + 4997.5, + 20.855800628662109 + ], + "hints": { + "index": 8934 + } + }, + { + "items": [ + 4998, + 17.012800216674805 + ], + "hints": { + "index": 8935 + } + }, + { + "items": [ + 4998.5, + 14.852899551391602 + ], + "hints": { + "index": 8936 + } + }, + { + "items": [ + 4999, + 13.480600357055664 + ], + "hints": { + "index": 8937 + } + }, + { + "items": [ + 4999.5, + 13.237799644470217 + ], + "hints": { + "index": 8938 + } + }, + { + "items": [ + 5000, + 13.400799751281738 + ], + "hints": { + "index": 8939 + } + }, + { + "items": [ + 5000.5, + 15.465100288391112 + ], + "hints": { + "index": 8940 + } + }, + { + "items": [ + 5001, + 15.165800094604492 + ], + "hints": { + "index": 8941 + } + }, + { + "items": [ + 5001.5, + 14.090399742126465 + ], + "hints": { + "index": 8942 + } + }, + { + "items": [ + 5002, + 12.910200119018556 + ], + "hints": { + "index": 8943 + } + }, + { + "items": [ + 5002.5, + 13.636500358581545 + ], + "hints": { + "index": 8944 + } + }, + { + "items": [ + 5003, + 16.275100708007813 + ], + "hints": { + "index": 8945 + } + }, + { + "items": [ + 5003.5, + 17.158599853515625 + ], + "hints": { + "index": 8946 + } + }, + { + "items": [ + 5004, + 18.054100036621097 + ], + "hints": { + "index": 8947 + } + }, + { + "items": [ + 5004.5, + 18.933599472045895 + ], + "hints": { + "index": 8948 + } + }, + { + "items": [ + 5005, + 22.9883 + ], + "hints": { + "index": 8949 + } + }, + { + "items": [ + 5005.5, + 27.965000152587891 + ], + "hints": { + "index": 8950 + } + }, + { + "items": [ + 5006, + 31.087299346923828 + ], + "hints": { + "index": 8951 + } + }, + { + "items": [ + 5006.5, + 28.175500869750977 + ], + "hints": { + "index": 8952 + } + }, + { + "items": [ + 5007, + 24.1747 + ], + "hints": { + "index": 8953 + } + }, + { + "items": [ + 5007.5, + 22.650299072265625 + ], + "hints": { + "index": 8954 + } + }, + { + "items": [ + 5008, + 23.1156005859375 + ], + "hints": { + "index": 8955 + } + }, + { + "items": [ + 5008.5, + 20.115900039672852 + ], + "hints": { + "index": 8956 + } + }, + { + "items": [ + 5009, + 18.384199142456055 + ], + "hints": { + "index": 8957 + } + }, + { + "items": [ + 5009.5, + 16.533100128173828 + ], + "hints": { + "index": 8958 + } + }, + { + "items": [ + 5010, + 15.462300300598145 + ], + "hints": { + "index": 8959 + } + }, + { + "items": [ + 5010.5, + 14.192099571228027 + ], + "hints": { + "index": 8960 + } + }, + { + "items": [ + 5011, + 14.461 + ], + "hints": { + "index": 8961 + } + }, + { + "items": [ + 5011.5, + 14.440699577331545 + ], + "hints": { + "index": 8962 + } + }, + { + "items": [ + 5012, + 15.375 + ], + "hints": { + "index": 8963 + } + }, + { + "items": [ + 5012.5, + 16.3874 + ], + "hints": { + "index": 8964 + } + }, + { + "items": [ + 5013, + 18.9904 + ], + "hints": { + "index": 8965 + } + }, + { + "items": [ + 5013.5, + 18.2115 + ], + "hints": { + "index": 8966 + } + }, + { + "items": [ + 5014, + 15.735 + ], + "hints": { + "index": 8967 + } + }, + { + "items": [ + 5014.5, + 15.6544 + ], + "hints": { + "index": 8968 + } + }, + { + "items": [ + 5015, + 17.4842 + ], + "hints": { + "index": 8969 + } + }, + { + "items": [ + 5015.5, + 20.4492 + ], + "hints": { + "index": 8970 + } + }, + { + "items": [ + 5016, + 20.7468 + ], + "hints": { + "index": 8971 + } + }, + { + "items": [ + 5016.5, + 18.4877 + ], + "hints": { + "index": 8972 + } + }, + { + "items": [ + 5017, + 19.5308 + ], + "hints": { + "index": 8973 + } + }, + { + "items": [ + 5017.5, + 18.8148 + ], + "hints": { + "index": 8974 + } + }, + { + "items": [ + 5018, + 17.2478 + ], + "hints": { + "index": 8975 + } + }, + { + "items": [ + 5018.5, + 14.9121 + ], + "hints": { + "index": 8976 + } + }, + { + "items": [ + 5019, + 13.7316 + ], + "hints": { + "index": 8977 + } + }, + { + "items": [ + 5019.5, + 14.7326 + ], + "hints": { + "index": 8978 + } + }, + { + "items": [ + 5020, + 14.7817 + ], + "hints": { + "index": 8979 + } + }, + { + "items": [ + 5020.5, + 15.8241 + ], + "hints": { + "index": 8980 + } + }, + { + "items": [ + 5021, + 13.1392 + ], + "hints": { + "index": 8981 + } + }, + { + "items": [ + 5021.5, + 12.2385 + ], + "hints": { + "index": 8982 + } + }, + { + "items": [ + 5022, + 10.5949 + ], + "hints": { + "index": 8983 + } + }, + { + "items": [ + 5022.5, + 9.993 + ], + "hints": { + "index": 8984 + } + }, + { + "items": [ + 5023, + 8.7021 + ], + "hints": { + "index": 8985 + } + }, + { + "items": [ + 5023.5, + 8.5153 + ], + "hints": { + "index": 8986 + } + }, + { + "items": [ + 5024, + 8.6651 + ], + "hints": { + "index": 8987 + } + }, + { + "items": [ + 5024.5, + 9.3598 + ], + "hints": { + "index": 8988 + } + }, + { + "items": [ + 5025, + 10.9396 + ], + "hints": { + "index": 8989 + } + }, + { + "items": [ + 5025.5, + 12.929400444030762 + ], + "hints": { + "index": 8990 + } + }, + { + "items": [ + 5026, + 13.707400321960447 + ], + "hints": { + "index": 8991 + } + }, + { + "items": [ + 5026.5, + 10.534999847412108 + ], + "hints": { + "index": 8992 + } + }, + { + "items": [ + 5027, + 11.017399787902832 + ], + "hints": { + "index": 8993 + } + }, + { + "items": [ + 5027.5, + 12.447199821472168 + ], + "hints": { + "index": 8994 + } + }, + { + "items": [ + 5028, + 11.595000267028809 + ], + "hints": { + "index": 8995 + } + }, + { + "items": [ + 5028.5, + 8.1826000213623047 + ], + "hints": { + "index": 8996 + } + }, + { + "items": [ + 5029, + 7.0978999137878418 + ], + "hints": { + "index": 8997 + } + }, + { + "items": [ + 5029.5, + 9.0747995376586914 + ], + "hints": { + "index": 8998 + } + }, + { + "items": [ + 5030, + 13.629199981689451 + ], + "hints": { + "index": 8999 + } + }, + { + "items": [ + 5030.5, + 17.963699340820313 + ], + "hints": { + "index": 9000 + } + }, + { + "items": [ + 5031, + 17.4574 + ], + "hints": { + "index": 9001 + } + }, + { + "items": [ + 5031.5, + 16.490100860595703 + ], + "hints": { + "index": 9002 + } + }, + { + "items": [ + 5032, + 16.1906 + ], + "hints": { + "index": 9003 + } + }, + { + "items": [ + 5032.5, + 14.4396 + ], + "hints": { + "index": 9004 + } + }, + { + "items": [ + 5033, + 15.0373 + ], + "hints": { + "index": 9005 + } + }, + { + "items": [ + 5033.5, + 15.1712 + ], + "hints": { + "index": 9006 + } + }, + { + "items": [ + 5034, + 19.5443 + ], + "hints": { + "index": 9007 + } + }, + { + "items": [ + 5034.5, + 19.3949 + ], + "hints": { + "index": 9008 + } + }, + { + "items": [ + 5035, + 18.6794 + ], + "hints": { + "index": 9009 + } + }, + { + "items": [ + 5035.5, + 13.4143 + ], + "hints": { + "index": 9010 + } + }, + { + "items": [ + 5036, + 10.9525 + ], + "hints": { + "index": 9011 + } + }, + { + "items": [ + 5036.5, + 10.64 + ], + "hints": { + "index": 9012 + } + }, + { + "items": [ + 5037, + 12.5218 + ], + "hints": { + "index": 9013 + } + }, + { + "items": [ + 5037.5, + 16.9825 + ], + "hints": { + "index": 9014 + } + }, + { + "items": [ + 5038, + 19.2902 + ], + "hints": { + "index": 9015 + } + }, + { + "items": [ + 5038.5, + 20.075 + ], + "hints": { + "index": 9016 + } + }, + { + "items": [ + 5039, + 15.0537 + ], + "hints": { + "index": 9017 + } + }, + { + "items": [ + 5039.5, + 11.8375 + ], + "hints": { + "index": 9018 + } + }, + { + "items": [ + 5040, + 11.3988 + ], + "hints": { + "index": 9019 + } + }, + { + "items": [ + 5040.5, + 13.1861 + ], + "hints": { + "index": 9020 + } + }, + { + "items": [ + 5041, + 16.9307 + ], + "hints": { + "index": 9021 + } + }, + { + "items": [ + 5041.5, + 15.720100402832031 + ], + "hints": { + "index": 9022 + } + }, + { + "items": [ + 5042, + 13.697099685668944 + ], + "hints": { + "index": 9023 + } + }, + { + "items": [ + 5042.5, + 11.093299865722656 + ], + "hints": { + "index": 9024 + } + }, + { + "items": [ + 5043, + 11.781499862670898 + ], + "hints": { + "index": 9025 + } + }, + { + "items": [ + 5043.5, + 12.255200386047363 + ], + "hints": { + "index": 9026 + } + }, + { + "items": [ + 5044, + 10.7563 + ], + "hints": { + "index": 9027 + } + }, + { + "items": [ + 5044.5, + 9.9328 + ], + "hints": { + "index": 9028 + } + }, + { + "items": [ + 5045, + 9.4594 + ], + "hints": { + "index": 9029 + } + }, + { + "items": [ + 5045.5, + 11.1526 + ], + "hints": { + "index": 9030 + } + }, + { + "items": [ + 5046, + 12.6562 + ], + "hints": { + "index": 9031 + } + }, + { + "items": [ + 5046.5, + 13.2738 + ], + "hints": { + "index": 9032 + } + }, + { + "items": [ + 5047, + 15.4841 + ], + "hints": { + "index": 9033 + } + }, + { + "items": [ + 5047.5, + 13.5341 + ], + "hints": { + "index": 9034 + } + }, + { + "items": [ + 5048, + 14.1611 + ], + "hints": { + "index": 9035 + } + }, + { + "items": [ + 5048.5, + 14.1062 + ], + "hints": { + "index": 9036 + } + }, + { + "items": [ + 5049, + 15.2982 + ], + "hints": { + "index": 9037 + } + }, + { + "items": [ + 5049.5, + 13.702099800109863 + ], + "hints": { + "index": 9038 + } + }, + { + "items": [ + 5050, + 12.654500007629396 + ], + "hints": { + "index": 9039 + } + }, + { + "items": [ + 5050.5, + 11.29419994354248 + ], + "hints": { + "index": 9040 + } + }, + { + "items": [ + 5051, + 11.6588 + ], + "hints": { + "index": 9041 + } + }, + { + "items": [ + 5051.5, + 12.119 + ], + "hints": { + "index": 9042 + } + }, + { + "items": [ + 5052, + 13.651 + ], + "hints": { + "index": 9043 + } + }, + { + "items": [ + 5052.5, + 11.5673 + ], + "hints": { + "index": 9044 + } + }, + { + "items": [ + 5053, + 10.078 + ], + "hints": { + "index": 9045 + } + }, + { + "items": [ + 5053.5, + 10.380100250244141 + ], + "hints": { + "index": 9046 + } + }, + { + "items": [ + 5054, + 12.0434 + ], + "hints": { + "index": 9047 + } + }, + { + "items": [ + 5054.5, + 10.719 + ], + "hints": { + "index": 9048 + } + }, + { + "items": [ + 5055, + 9.6048 + ], + "hints": { + "index": 9049 + } + }, + { + "items": [ + 5055.5, + 9.8133 + ], + "hints": { + "index": 9050 + } + }, + { + "items": [ + 5056, + 10.7207 + ], + "hints": { + "index": 9051 + } + }, + { + "items": [ + 5056.5, + 10.1227 + ], + "hints": { + "index": 9052 + } + }, + { + "items": [ + 5057, + 8.6819000244140625 + ], + "hints": { + "index": 9053 + } + }, + { + "items": [ + 5057.5, + 8.8943 + ], + "hints": { + "index": 9054 + } + }, + { + "items": [ + 5058, + 8.3643999099731445 + ], + "hints": { + "index": 9055 + } + }, + { + "items": [ + 5058.5, + 8.5836000442504883 + ], + "hints": { + "index": 9056 + } + }, + { + "items": [ + 5059, + 7.2784 + ], + "hints": { + "index": 9057 + } + }, + { + "items": [ + 5059.5, + 7.307 + ], + "hints": { + "index": 9058 + } + }, + { + "items": [ + 5060, + 9.3854 + ], + "hints": { + "index": 9059 + } + }, + { + "items": [ + 5060.5, + 13.296 + ], + "hints": { + "index": 9060 + } + }, + { + "items": [ + 5061, + 19.4363 + ], + "hints": { + "index": 9061 + } + }, + { + "items": [ + 5061.5, + 13.5647 + ], + "hints": { + "index": 9062 + } + }, + { + "items": [ + 5062, + 16.0655 + ], + "hints": { + "index": 9063 + } + }, + { + "items": [ + 5062.5, + 18.0941 + ], + "hints": { + "index": 9064 + } + }, + { + "items": [ + 5063, + 22.253900527954105 + ], + "hints": { + "index": 9065 + } + }, + { + "items": [ + 5063.5, + 19.010900497436523 + ], + "hints": { + "index": 9066 + } + }, + { + "items": [ + 5064, + 11.722700119018556 + ], + "hints": { + "index": 9067 + } + }, + { + "items": [ + 5064.5, + 10.499600410461426 + ], + "hints": { + "index": 9068 + } + }, + { + "items": [ + 5065, + 10.196000099182127 + ], + "hints": { + "index": 9069 + } + }, + { + "items": [ + 5065.5, + 12.816499710083008 + ], + "hints": { + "index": 9070 + } + }, + { + "items": [ + 5066, + 13.843500137329102 + ], + "hints": { + "index": 9071 + } + }, + { + "items": [ + 5066.5, + 13.527600288391112 + ], + "hints": { + "index": 9072 + } + }, + { + "items": [ + 5067, + 13.9544 + ], + "hints": { + "index": 9073 + } + }, + { + "items": [ + 5067.5, + 13.386699676513672 + ], + "hints": { + "index": 9074 + } + }, + { + "items": [ + 5068, + 12.856399536132813 + ], + "hints": { + "index": 9075 + } + }, + { + "items": [ + 5068.5, + 10.18690013885498 + ], + "hints": { + "index": 9076 + } + }, + { + "items": [ + 5069, + 8.8269 + ], + "hints": { + "index": 9077 + } + }, + { + "items": [ + 5069.5, + 9.36240005493164 + ], + "hints": { + "index": 9078 + } + }, + { + "items": [ + 5070, + 10.871299743652344 + ], + "hints": { + "index": 9079 + } + }, + { + "items": [ + 5070.5, + 14.1737 + ], + "hints": { + "index": 9080 + } + }, + { + "items": [ + 5071, + 16.178400039672852 + ], + "hints": { + "index": 9081 + } + }, + { + "items": [ + 5071.5, + 17.481199264526367 + ], + "hints": { + "index": 9082 + } + }, + { + "items": [ + 5072, + 13.915599822998049 + ], + "hints": { + "index": 9083 + } + }, + { + "items": [ + 5072.5, + 10.031999588012695 + ], + "hints": { + "index": 9084 + } + }, + { + "items": [ + 5073, + 9.6179 + ], + "hints": { + "index": 9085 + } + }, + { + "items": [ + 5073.5, + 10.9937 + ], + "hints": { + "index": 9086 + } + }, + { + "items": [ + 5074, + 13.8422 + ], + "hints": { + "index": 9087 + } + }, + { + "items": [ + 5074.5, + 15.840900421142578 + ], + "hints": { + "index": 9088 + } + }, + { + "items": [ + 5075, + 14.0207 + ], + "hints": { + "index": 9089 + } + }, + { + "items": [ + 5075.5, + 15.6298 + ], + "hints": { + "index": 9090 + } + }, + { + "items": [ + 5076, + 17.693300247192383 + ], + "hints": { + "index": 9091 + } + }, + { + "items": [ + 5076.5, + 23.087400436401367 + ], + "hints": { + "index": 9092 + } + }, + { + "items": [ + 5077, + 23.770999908447266 + ], + "hints": { + "index": 9093 + } + }, + { + "items": [ + 5077.5, + 22.0478 + ], + "hints": { + "index": 9094 + } + }, + { + "items": [ + 5078, + 18.1754 + ], + "hints": { + "index": 9095 + } + }, + { + "items": [ + 5078.5, + 16.9238 + ], + "hints": { + "index": 9096 + } + }, + { + "items": [ + 5079, + 18.692800521850582 + ], + "hints": { + "index": 9097 + } + }, + { + "items": [ + 5079.5, + 21.233200073242188 + ], + "hints": { + "index": 9098 + } + }, + { + "items": [ + 5080, + 24.378599166870117 + ], + "hints": { + "index": 9099 + } + }, + { + "items": [ + 5080.5, + 20.6611 + ], + "hints": { + "index": 9100 + } + }, + { + "items": [ + 5081, + 16.417900085449219 + ], + "hints": { + "index": 9101 + } + }, + { + "items": [ + 5081.5, + 11.3894 + ], + "hints": { + "index": 9102 + } + }, + { + "items": [ + 5082, + 8.7615 + ], + "hints": { + "index": 9103 + } + }, + { + "items": [ + 5082.5, + 7.7224 + ], + "hints": { + "index": 9104 + } + }, + { + "items": [ + 5083, + 6.9365 + ], + "hints": { + "index": 9105 + } + }, + { + "items": [ + 5083.5, + 6.96589994430542 + ], + "hints": { + "index": 9106 + } + }, + { + "items": [ + 5084, + 6.9910998344421387 + ], + "hints": { + "index": 9107 + } + }, + { + "items": [ + 5084.5, + 8.329 + ], + "hints": { + "index": 9108 + } + }, + { + "items": [ + 5085, + 9.3833999633789063 + ], + "hints": { + "index": 9109 + } + }, + { + "items": [ + 5085.5, + 10.5469 + ], + "hints": { + "index": 9110 + } + }, + { + "items": [ + 5086, + 11.6725 + ], + "hints": { + "index": 9111 + } + }, + { + "items": [ + 5086.5, + 14.5617 + ], + "hints": { + "index": 9112 + } + }, + { + "items": [ + 5087, + 16.590700149536133 + ], + "hints": { + "index": 9113 + } + }, + { + "items": [ + 5087.5, + 14.088899612426758 + ], + "hints": { + "index": 9114 + } + }, + { + "items": [ + 5088, + 8.2142000198364258 + ], + "hints": { + "index": 9115 + } + }, + { + "items": [ + 5088.5, + 7.6978001594543457 + ], + "hints": { + "index": 9116 + } + }, + { + "items": [ + 5089, + 8.2476997375488281 + ], + "hints": { + "index": 9117 + } + }, + { + "items": [ + 5089.5, + 11.2766 + ], + "hints": { + "index": 9118 + } + }, + { + "items": [ + 5090, + 10.3322 + ], + "hints": { + "index": 9119 + } + }, + { + "items": [ + 5090.5, + 9.6884 + ], + "hints": { + "index": 9120 + } + }, + { + "items": [ + 5091, + 8.1517 + ], + "hints": { + "index": 9121 + } + }, + { + "items": [ + 5091.5, + 8.3862 + ], + "hints": { + "index": 9122 + } + }, + { + "items": [ + 5092, + 8.9595 + ], + "hints": { + "index": 9123 + } + }, + { + "items": [ + 5092.5, + 12.3401 + ], + "hints": { + "index": 9124 + } + }, + { + "items": [ + 5093, + 15.114299774169922 + ], + "hints": { + "index": 9125 + } + }, + { + "items": [ + 5093.5, + 16.7674 + ], + "hints": { + "index": 9126 + } + }, + { + "items": [ + 5094, + 16.249500274658203 + ], + "hints": { + "index": 9127 + } + }, + { + "items": [ + 5094.5, + 18.208599090576172 + ], + "hints": { + "index": 9128 + } + }, + { + "items": [ + 5095, + 20.444900512695313 + ], + "hints": { + "index": 9129 + } + }, + { + "items": [ + 5095.5, + 21.014200210571289 + ], + "hints": { + "index": 9130 + } + }, + { + "items": [ + 5096, + 17.525199890136719 + ], + "hints": { + "index": 9131 + } + }, + { + "items": [ + 5096.5, + 13.9624 + ], + "hints": { + "index": 9132 + } + }, + { + "items": [ + 5097, + 14.022600173950195 + ], + "hints": { + "index": 9133 + } + }, + { + "items": [ + 5097.5, + 13.3514 + ], + "hints": { + "index": 9134 + } + }, + { + "items": [ + 5098, + 14.009 + ], + "hints": { + "index": 9135 + } + }, + { + "items": [ + 5098.5, + 13.8641996383667 + ], + "hints": { + "index": 9136 + } + }, + { + "items": [ + 5099, + 14.0082 + ], + "hints": { + "index": 9137 + } + }, + { + "items": [ + 5099.5, + 14.4635 + ], + "hints": { + "index": 9138 + } + }, + { + "items": [ + 5100, + 13.391300201416016 + ], + "hints": { + "index": 9139 + } + }, + { + "items": [ + 5100.5, + 12.537 + ], + "hints": { + "index": 9140 + } + }, + { + "items": [ + 5101, + 9.4097003936767578 + ], + "hints": { + "index": 9141 + } + }, + { + "items": [ + 5101.5, + 8.3984 + ], + "hints": { + "index": 9142 + } + }, + { + "items": [ + 5102, + 7.9780001640319824 + ], + "hints": { + "index": 9143 + } + }, + { + "items": [ + 5102.5, + 9.91569995880127 + ], + "hints": { + "index": 9144 + } + }, + { + "items": [ + 5103, + 11.9812 + ], + "hints": { + "index": 9145 + } + }, + { + "items": [ + 5103.5, + 14.5856 + ], + "hints": { + "index": 9146 + } + }, + { + "items": [ + 5104, + 13.65030002593994 + ], + "hints": { + "index": 9147 + } + }, + { + "items": [ + 5104.5, + 11.45680046081543 + ], + "hints": { + "index": 9148 + } + }, + { + "items": [ + 5105, + 10.369799613952637 + ], + "hints": { + "index": 9149 + } + }, + { + "items": [ + 5105.5, + 9.42650032043457 + ], + "hints": { + "index": 9150 + } + }, + { + "items": [ + 5106, + 9.0269002914428711 + ], + "hints": { + "index": 9151 + } + }, + { + "items": [ + 5106.5, + 7.403399944305419 + ], + "hints": { + "index": 9152 + } + }, + { + "items": [ + 5107, + 6.4141998291015625 + ], + "hints": { + "index": 9153 + } + }, + { + "items": [ + 5107.5, + 6.6045 + ], + "hints": { + "index": 9154 + } + }, + { + "items": [ + 5108, + 8.5818996429443359 + ], + "hints": { + "index": 9155 + } + }, + { + "items": [ + 5108.5, + 12.9425 + ], + "hints": { + "index": 9156 + } + }, + { + "items": [ + 5109, + 17.079200744628906 + ], + "hints": { + "index": 9157 + } + }, + { + "items": [ + 5109.5, + 17.6471 + ], + "hints": { + "index": 9158 + } + }, + { + "items": [ + 5110, + 16.529399871826172 + ], + "hints": { + "index": 9159 + } + }, + { + "items": [ + 5110.5, + 15.33489990234375 + ], + "hints": { + "index": 9160 + } + }, + { + "items": [ + 5111, + 13.947500228881836 + ], + "hints": { + "index": 9161 + } + }, + { + "items": [ + 5111.5, + 14.096799850463867 + ], + "hints": { + "index": 9162 + } + }, + { + "items": [ + 5112, + 12.799500465393066 + ], + "hints": { + "index": 9163 + } + }, + { + "items": [ + 5112.5, + 10.8799 + ], + "hints": { + "index": 9164 + } + }, + { + "items": [ + 5113, + 9.8843002319335938 + ], + "hints": { + "index": 9165 + } + }, + { + "items": [ + 5113.5, + 8.8613004684448242 + ], + "hints": { + "index": 9166 + } + }, + { + "items": [ + 5114, + 8.1431999206542969 + ], + "hints": { + "index": 9167 + } + }, + { + "items": [ + 5114.5, + 6.7190999984741211 + ], + "hints": { + "index": 9168 + } + }, + { + "items": [ + 5115, + 5.91949987411499 + ], + "hints": { + "index": 9169 + } + }, + { + "items": [ + 5115.5, + 5.6837 + ], + "hints": { + "index": 9170 + } + }, + { + "items": [ + 5116, + 6.7583999633789063 + ], + "hints": { + "index": 9171 + } + }, + { + "items": [ + 5116.5, + 8.4605998992919922 + ], + "hints": { + "index": 9172 + } + }, + { + "items": [ + 5117, + 9.4727001190185547 + ], + "hints": { + "index": 9173 + } + }, + { + "items": [ + 5117.5, + 8.2165002822875977 + ], + "hints": { + "index": 9174 + } + }, + { + "items": [ + 5118, + 7.6487998962402335 + ], + "hints": { + "index": 9175 + } + }, + { + "items": [ + 5118.5, + 7.9637 + ], + "hints": { + "index": 9176 + } + }, + { + "items": [ + 5119, + 7.5559 + ], + "hints": { + "index": 9177 + } + }, + { + "items": [ + 5119.5, + 7.3214998245239267 + ], + "hints": { + "index": 9178 + } + }, + { + "items": [ + 5120, + 6.7828001976013184 + ], + "hints": { + "index": 9179 + } + }, + { + "items": [ + 5120.5, + 8.2226 + ], + "hints": { + "index": 9180 + } + }, + { + "items": [ + 5121, + 9.7114000320434553 + ], + "hints": { + "index": 9181 + } + }, + { + "items": [ + 5121.5, + 12.922699928283691 + ], + "hints": { + "index": 9182 + } + }, + { + "items": [ + 5122, + 12.776200294494627 + ], + "hints": { + "index": 9183 + } + }, + { + "items": [ + 5122.5, + 11.549300193786619 + ], + "hints": { + "index": 9184 + } + }, + { + "items": [ + 5123, + 10.248900413513184 + ], + "hints": { + "index": 9185 + } + }, + { + "items": [ + 5123.5, + 10.473799705505373 + ], + "hints": { + "index": 9186 + } + }, + { + "items": [ + 5124, + 10.939800262451172 + ], + "hints": { + "index": 9187 + } + }, + { + "items": [ + 5124.5, + 11.7426 + ], + "hints": { + "index": 9188 + } + }, + { + "items": [ + 5125, + 10.9334 + ], + "hints": { + "index": 9189 + } + }, + { + "items": [ + 5125.5, + 9.9591 + ], + "hints": { + "index": 9190 + } + }, + { + "items": [ + 5126, + 9.0678 + ], + "hints": { + "index": 9191 + } + }, + { + "items": [ + 5126.5, + 8.9226 + ], + "hints": { + "index": 9192 + } + }, + { + "items": [ + 5127, + 9.0372 + ], + "hints": { + "index": 9193 + } + }, + { + "items": [ + 5127.5, + 7.5692 + ], + "hints": { + "index": 9194 + } + }, + { + "items": [ + 5128, + 7.368 + ], + "hints": { + "index": 9195 + } + }, + { + "items": [ + 5128.5, + 7.8632 + ], + "hints": { + "index": 9196 + } + }, + { + "items": [ + 5129, + 10.5012 + ], + "hints": { + "index": 9197 + } + }, + { + "items": [ + 5129.5, + 10.4811 + ], + "hints": { + "index": 9198 + } + }, + { + "items": [ + 5130, + 10.2079 + ], + "hints": { + "index": 9199 + } + }, + { + "items": [ + 5130.5, + 9.7487 + ], + "hints": { + "index": 9200 + } + }, + { + "items": [ + 5131, + 11.2369 + ], + "hints": { + "index": 9201 + } + }, + { + "items": [ + 5131.5, + 12.431300163269045 + ], + "hints": { + "index": 9202 + } + }, + { + "items": [ + 5132, + 12.041899681091309 + ], + "hints": { + "index": 9203 + } + }, + { + "items": [ + 5132.5, + 11.911299705505373 + ], + "hints": { + "index": 9204 + } + }, + { + "items": [ + 5133, + 13.050700187683104 + ], + "hints": { + "index": 9205 + } + }, + { + "items": [ + 5133.5, + 15.725099563598633 + ], + "hints": { + "index": 9206 + } + }, + { + "items": [ + 5134, + 17.31089973449707 + ], + "hints": { + "index": 9207 + } + }, + { + "items": [ + 5134.5, + 16.8013 + ], + "hints": { + "index": 9208 + } + }, + { + "items": [ + 5135, + 14.4303 + ], + "hints": { + "index": 9209 + } + }, + { + "items": [ + 5135.5, + 9.9491 + ], + "hints": { + "index": 9210 + } + }, + { + "items": [ + 5136, + 7.3902 + ], + "hints": { + "index": 9211 + } + }, + { + "items": [ + 5136.5, + 6.8284 + ], + "hints": { + "index": 9212 + } + }, + { + "items": [ + 5137, + 7.3498 + ], + "hints": { + "index": 9213 + } + }, + { + "items": [ + 5137.5, + 8.6373 + ], + "hints": { + "index": 9214 + } + }, + { + "items": [ + 5138, + 8.967 + ], + "hints": { + "index": 9215 + } + }, + { + "items": [ + 5138.5, + 10.8187 + ], + "hints": { + "index": 9216 + } + }, + { + "items": [ + 5139, + 11.0701 + ], + "hints": { + "index": 9217 + } + }, + { + "items": [ + 5139.5, + 12.0742 + ], + "hints": { + "index": 9218 + } + }, + { + "items": [ + 5140, + 10.2914 + ], + "hints": { + "index": 9219 + } + }, + { + "items": [ + 5140.5, + 9.4475 + ], + "hints": { + "index": 9220 + } + }, + { + "items": [ + 5141, + 8.3247 + ], + "hints": { + "index": 9221 + } + }, + { + "items": [ + 5141.5, + 8.7647 + ], + "hints": { + "index": 9222 + } + }, + { + "items": [ + 5142, + 8.3191 + ], + "hints": { + "index": 9223 + } + }, + { + "items": [ + 5142.5, + 8.4747 + ], + "hints": { + "index": 9224 + } + }, + { + "items": [ + 5143, + 9.8116998672485352 + ], + "hints": { + "index": 9225 + } + }, + { + "items": [ + 5143.5, + 12.9114 + ], + "hints": { + "index": 9226 + } + }, + { + "items": [ + 5144, + 16.3459 + ], + "hints": { + "index": 9227 + } + }, + { + "items": [ + 5144.5, + 13.722200393676758 + ], + "hints": { + "index": 9228 + } + }, + { + "items": [ + 5145, + 9.9111003875732422 + ], + "hints": { + "index": 9229 + } + }, + { + "items": [ + 5145.5, + 8.426 + ], + "hints": { + "index": 9230 + } + }, + { + "items": [ + 5146, + 7.4935002326965332 + ], + "hints": { + "index": 9231 + } + }, + { + "items": [ + 5146.5, + 8.3495998382568359 + ], + "hints": { + "index": 9232 + } + }, + { + "items": [ + 5147, + 8.6134 + ], + "hints": { + "index": 9233 + } + }, + { + "items": [ + 5147.5, + 9.55840015411377 + ], + "hints": { + "index": 9234 + } + }, + { + "items": [ + 5148, + 8.8973 + ], + "hints": { + "index": 9235 + } + }, + { + "items": [ + 5148.5, + 8.9930000305175781 + ], + "hints": { + "index": 9236 + } + }, + { + "items": [ + 5149, + 8.5876 + ], + "hints": { + "index": 9237 + } + }, + { + "items": [ + 5149.5, + 8.9682 + ], + "hints": { + "index": 9238 + } + }, + { + "items": [ + 5150, + 8.1989 + ], + "hints": { + "index": 9239 + } + }, + { + "items": [ + 5150.5, + 8.3715000152587891 + ], + "hints": { + "index": 9240 + } + }, + { + "items": [ + 5151, + 8.7568998336792 + ], + "hints": { + "index": 9241 + } + }, + { + "items": [ + 5151.5, + 9.50790023803711 + ], + "hints": { + "index": 9242 + } + }, + { + "items": [ + 5152, + 9.16189956665039 + ], + "hints": { + "index": 9243 + } + }, + { + "items": [ + 5152.5, + 7.9163999557495117 + ], + "hints": { + "index": 9244 + } + }, + { + "items": [ + 5153, + 6.3436999320983887 + ], + "hints": { + "index": 9245 + } + }, + { + "items": [ + 5153.5, + 5.763700008392334 + ], + "hints": { + "index": 9246 + } + }, + { + "items": [ + 5154, + 5.8056001663208008 + ], + "hints": { + "index": 9247 + } + }, + { + "items": [ + 5154.5, + 6.1866998672485352 + ], + "hints": { + "index": 9248 + } + }, + { + "items": [ + 5155, + 5.9622 + ], + "hints": { + "index": 9249 + } + }, + { + "items": [ + 5155.5, + 4.9826 + ], + "hints": { + "index": 9250 + } + }, + { + "items": [ + 5156, + 4.79040002822876 + ], + "hints": { + "index": 9251 + } + }, + { + "items": [ + 5156.5, + 5.0292 + ], + "hints": { + "index": 9252 + } + }, + { + "items": [ + 5157, + 5.9812002182006836 + ], + "hints": { + "index": 9253 + } + }, + { + "items": [ + 5157.5, + 6.2439 + ], + "hints": { + "index": 9254 + } + }, + { + "items": [ + 5158, + 6.3727 + ], + "hints": { + "index": 9255 + } + }, + { + "items": [ + 5158.5, + 6.5845 + ], + "hints": { + "index": 9256 + } + }, + { + "items": [ + 5159, + 6.4328 + ], + "hints": { + "index": 9257 + } + }, + { + "items": [ + 5159.5, + 6.911 + ], + "hints": { + "index": 9258 + } + }, + { + "items": [ + 5160, + 6.7069 + ], + "hints": { + "index": 9259 + } + }, + { + "items": [ + 5160.5, + 6.7684 + ], + "hints": { + "index": 9260 + } + }, + { + "items": [ + 5161, + 5.731299877166748 + ], + "hints": { + "index": 9261 + } + }, + { + "items": [ + 5161.5, + 5.7885 + ], + "hints": { + "index": 9262 + } + }, + { + "items": [ + 5162, + 6.6154999732971191 + ], + "hints": { + "index": 9263 + } + }, + { + "items": [ + 5162.5, + 8.2588996887207031 + ], + "hints": { + "index": 9264 + } + }, + { + "items": [ + 5163, + 8.99590015411377 + ], + "hints": { + "index": 9265 + } + }, + { + "items": [ + 5163.5, + 8.9780998229980469 + ], + "hints": { + "index": 9266 + } + }, + { + "items": [ + 5164, + 8.266200065612793 + ], + "hints": { + "index": 9267 + } + }, + { + "items": [ + 5164.5, + 8.9193000793457031 + ], + "hints": { + "index": 9268 + } + }, + { + "items": [ + 5165, + 9.5471 + ], + "hints": { + "index": 9269 + } + }, + { + "items": [ + 5165.5, + 9.2472 + ], + "hints": { + "index": 9270 + } + }, + { + "items": [ + 5166, + 7.695 + ], + "hints": { + "index": 9271 + } + }, + { + "items": [ + 5166.5, + 6.4331 + ], + "hints": { + "index": 9272 + } + }, + { + "items": [ + 5167, + 5.4064 + ], + "hints": { + "index": 9273 + } + }, + { + "items": [ + 5167.5, + 5.0721001625061035 + ], + "hints": { + "index": 9274 + } + }, + { + "items": [ + 5168, + 4.8499 + ], + "hints": { + "index": 9275 + } + }, + { + "items": [ + 5168.5, + 4.958 + ], + "hints": { + "index": 9276 + } + }, + { + "items": [ + 5169, + 5.7119 + ], + "hints": { + "index": 9277 + } + }, + { + "items": [ + 5169.5, + 6.264 + ], + "hints": { + "index": 9278 + } + }, + { + "items": [ + 5170, + 6.7001 + ], + "hints": { + "index": 9279 + } + }, + { + "items": [ + 5170.5, + 6.1296000480651855 + ], + "hints": { + "index": 9280 + } + }, + { + "items": [ + 5171, + 5.9422998428344727 + ], + "hints": { + "index": 9281 + } + }, + { + "items": [ + 5171.5, + 5.7966 + ], + "hints": { + "index": 9282 + } + }, + { + "items": [ + 5172, + 6.3359999656677246 + ], + "hints": { + "index": 9283 + } + }, + { + "items": [ + 5172.5, + 6.9650998115539551 + ], + "hints": { + "index": 9284 + } + }, + { + "items": [ + 5173, + 6.3516998291015625 + ], + "hints": { + "index": 9285 + } + }, + { + "items": [ + 5173.5, + 4.945000171661377 + ], + "hints": { + "index": 9286 + } + }, + { + "items": [ + 5174, + 3.9207 + ], + "hints": { + "index": 9287 + } + }, + { + "items": [ + 5174.5, + 3.634 + ], + "hints": { + "index": 9288 + } + }, + { + "items": [ + 5175, + 3.5992 + ], + "hints": { + "index": 9289 + } + }, + { + "items": [ + 5175.5, + 3.8176000118255615 + ], + "hints": { + "index": 9290 + } + }, + { + "items": [ + 5176, + 4.1479 + ], + "hints": { + "index": 9291 + } + }, + { + "items": [ + 5176.5, + 4.2048001289367676 + ], + "hints": { + "index": 9292 + } + }, + { + "items": [ + 5177, + 3.9326999187469478 + ], + "hints": { + "index": 9293 + } + }, + { + "items": [ + 5177.5, + 3.7713000774383545 + ], + "hints": { + "index": 9294 + } + }, + { + "items": [ + 5178, + 3.6912 + ], + "hints": { + "index": 9295 + } + }, + { + "items": [ + 5178.5, + 3.8384 + ], + "hints": { + "index": 9296 + } + }, + { + "items": [ + 5179, + 3.7630999088287354 + ], + "hints": { + "index": 9297 + } + }, + { + "items": [ + 5179.5, + 3.7843999862670894 + ], + "hints": { + "index": 9298 + } + }, + { + "items": [ + 5180, + 3.6067 + ], + "hints": { + "index": 9299 + } + }, + { + "items": [ + 5180.5, + 3.678800106048584 + ], + "hints": { + "index": 9300 + } + }, + { + "items": [ + 5181, + 3.7014 + ], + "hints": { + "index": 9301 + } + }, + { + "items": [ + 5181.5, + 3.9827 + ], + "hints": { + "index": 9302 + } + }, + { + "items": [ + 5182, + 4.1808 + ], + "hints": { + "index": 9303 + } + }, + { + "items": [ + 5182.5, + 4.3198 + ], + "hints": { + "index": 9304 + } + }, + { + "items": [ + 5183, + 4.1066 + ], + "hints": { + "index": 9305 + } + }, + { + "items": [ + 5183.5, + 3.7721 + ], + "hints": { + "index": 9306 + } + }, + { + "items": [ + 5184, + 3.70989990234375 + ], + "hints": { + "index": 9307 + } + }, + { + "items": [ + 5184.5, + 3.6929 + ], + "hints": { + "index": 9308 + } + }, + { + "items": [ + 5185, + 3.9275999069213863 + ], + "hints": { + "index": 9309 + } + }, + { + "items": [ + 5185.5, + 4.2583 + ], + "hints": { + "index": 9310 + } + }, + { + "items": [ + 5186, + 4.7659 + ], + "hints": { + "index": 9311 + } + }, + { + "items": [ + 5186.5, + 5.3253 + ], + "hints": { + "index": 9312 + } + }, + { + "items": [ + 5187, + 5.0767002105712891 + ], + "hints": { + "index": 9313 + } + }, + { + "items": [ + 5187.5, + 4.5361 + ], + "hints": { + "index": 9314 + } + }, + { + "items": [ + 5188, + 3.9923000335693359 + ], + "hints": { + "index": 9315 + } + }, + { + "items": [ + 5188.5, + 3.8480000495910649 + ], + "hints": { + "index": 9316 + } + }, + { + "items": [ + 5189, + 3.9523 + ], + "hints": { + "index": 9317 + } + }, + { + "items": [ + 5189.5, + 4.3092 + ], + "hints": { + "index": 9318 + } + }, + { + "items": [ + 5190, + 4.11870002746582 + ], + "hints": { + "index": 9319 + } + }, + { + "items": [ + 5190.5, + 3.86680006980896 + ], + "hints": { + "index": 9320 + } + }, + { + "items": [ + 5191, + 3.555 + ], + "hints": { + "index": 9321 + } + }, + { + "items": [ + 5191.5, + 3.6858000755310054 + ], + "hints": { + "index": 9322 + } + }, + { + "items": [ + 5192, + 3.7156000137329106 + ], + "hints": { + "index": 9323 + } + }, + { + "items": [ + 5192.5, + 3.6345999240875249 + ], + "hints": { + "index": 9324 + } + }, + { + "items": [ + 5193, + 3.5576 + ], + "hints": { + "index": 9325 + } + }, + { + "items": [ + 5193.5, + 3.4662001132965088 + ], + "hints": { + "index": 9326 + } + }, + { + "items": [ + 5194, + 3.5861999988555908 + ], + "hints": { + "index": 9327 + } + }, + { + "items": [ + 5194.5, + 3.4179 + ], + "hints": { + "index": 9328 + } + }, + { + "items": [ + 5195, + 3.3733000755310059 + ], + "hints": { + "index": 9329 + } + }, + { + "items": [ + 5195.5, + 3.4400999546051025 + ], + "hints": { + "index": 9330 + } + }, + { + "items": [ + 5196, + 3.475600004196167 + ], + "hints": { + "index": 9331 + } + }, + { + "items": [ + 5196.5, + 3.5423998832702637 + ], + "hints": { + "index": 9332 + } + }, + { + "items": [ + 5197, + 3.3301 + ], + "hints": { + "index": 9333 + } + }, + { + "items": [ + 5197.5, + 3.7157 + ], + "hints": { + "index": 9334 + } + }, + { + "items": [ + 5198, + 3.9069 + ], + "hints": { + "index": 9335 + } + }, + { + "items": [ + 5198.5, + 3.9576 + ], + "hints": { + "index": 9336 + } + }, + { + "items": [ + 5199, + 3.6165 + ], + "hints": { + "index": 9337 + } + }, + { + "items": [ + 5199.5, + 3.4077999591827393 + ], + "hints": { + "index": 9338 + } + }, + { + "items": [ + 5200, + 3.313 + ], + "hints": { + "index": 9339 + } + }, + { + "items": [ + 5200.5, + 3.2604000568389893 + ], + "hints": { + "index": 9340 + } + }, + { + "items": [ + 5201, + 3.2737998962402344 + ], + "hints": { + "index": 9341 + } + }, + { + "items": [ + 5201.5, + 3.3678998947143555 + ], + "hints": { + "index": 9342 + } + }, + { + "items": [ + 5202, + 3.3946 + ], + "hints": { + "index": 9343 + } + }, + { + "items": [ + 5202.5, + 3.4335999488830566 + ], + "hints": { + "index": 9344 + } + }, + { + "items": [ + 5203, + 3.3345000743865967 + ], + "hints": { + "index": 9345 + } + }, + { + "items": [ + 5203.5, + 3.3208999633789063 + ], + "hints": { + "index": 9346 + } + }, + { + "items": [ + 5204, + 3.2481999397277832 + ], + "hints": { + "index": 9347 + } + }, + { + "items": [ + 5204.5, + 3.288000106811523 + ], + "hints": { + "index": 9348 + } + }, + { + "items": [ + 5205, + 3.3238000869750977 + ], + "hints": { + "index": 9349 + } + }, + { + "items": [ + 5205.5, + 3.4635000228881836 + ], + "hints": { + "index": 9350 + } + }, + { + "items": [ + 5206, + 3.4977 + ], + "hints": { + "index": 9351 + } + }, + { + "items": [ + 5206.5, + 3.4656000137329106 + ], + "hints": { + "index": 9352 + } + }, + { + "items": [ + 5207, + 3.448 + ], + "hints": { + "index": 9353 + } + }, + { + "items": [ + 5207.5, + 3.4373 + ], + "hints": { + "index": 9354 + } + }, + { + "items": [ + 5208, + 3.4943 + ], + "hints": { + "index": 9355 + } + }, + { + "items": [ + 5208.5, + 3.4695999622344971 + ], + "hints": { + "index": 9356 + } + }, + { + "items": [ + 5209, + 3.4762001037597656 + ], + "hints": { + "index": 9357 + } + }, + { + "items": [ + 5209.5, + 3.5260999202728271 + ], + "hints": { + "index": 9358 + } + }, + { + "items": [ + 5210, + 3.8371000289916992 + ], + "hints": { + "index": 9359 + } + }, + { + "items": [ + 5210.5, + 4.1210999488830566 + ], + "hints": { + "index": 9360 + } + }, + { + "items": [ + 5211, + 4.4580001831054688 + ], + "hints": { + "index": 9361 + } + }, + { + "items": [ + 5211.5, + 4.533599853515625 + ], + "hints": { + "index": 9362 + } + }, + { + "items": [ + 5212, + 4.6606998443603516 + ], + "hints": { + "index": 9363 + } + }, + { + "items": [ + 5212.5, + 4.3763999938964844 + ], + "hints": { + "index": 9364 + } + }, + { + "items": [ + 5213, + 4.0178999900817871 + ], + "hints": { + "index": 9365 + } + }, + { + "items": [ + 5213.5, + 3.7311999797821049 + ], + "hints": { + "index": 9366 + } + }, + { + "items": [ + 5214, + 3.705300092697144 + ], + "hints": { + "index": 9367 + } + }, + { + "items": [ + 5214.5, + 3.7458000183105473 + ], + "hints": { + "index": 9368 + } + }, + { + "items": [ + 5215, + 3.8866000175476074 + ], + "hints": { + "index": 9369 + } + }, + { + "items": [ + 5215.5, + 3.7534000873565674 + ], + "hints": { + "index": 9370 + } + }, + { + "items": [ + 5216, + 4.0607 + ], + "hints": { + "index": 9371 + } + }, + { + "items": [ + 5216.5, + 4.20359992980957 + ], + "hints": { + "index": 9372 + } + }, + { + "items": [ + 5217, + 5.1939001083374023 + ], + "hints": { + "index": 9373 + } + }, + { + "items": [ + 5217.5, + 5.1303000450134277 + ], + "hints": { + "index": 9374 + } + }, + { + "items": [ + 5218, + 5.7508997917175293 + ], + "hints": { + "index": 9375 + } + }, + { + "items": [ + 5218.5, + 5.0051999092102051 + ], + "hints": { + "index": 9376 + } + }, + { + "items": [ + 5219, + 4.8944997787475586 + ], + "hints": { + "index": 9377 + } + }, + { + "items": [ + 5219.5, + 4.2909998893737793 + ], + "hints": { + "index": 9378 + } + }, + { + "items": [ + 5220, + 4.153900146484375 + ], + "hints": { + "index": 9379 + } + }, + { + "items": [ + 5220.5, + 4.1970000267028809 + ], + "hints": { + "index": 9380 + } + }, + { + "items": [ + 5221, + 4.0005998611450195 + ], + "hints": { + "index": 9381 + } + }, + { + "items": [ + 5221.5, + 3.92549991607666 + ], + "hints": { + "index": 9382 + } + }, + { + "items": [ + 5222, + 3.5399000644683838 + ], + "hints": { + "index": 9383 + } + }, + { + "items": [ + 5222.5, + 3.5190999507904053 + ], + "hints": { + "index": 9384 + } + }, + { + "items": [ + 5223, + 3.3515000343322754 + ], + "hints": { + "index": 9385 + } + }, + { + "items": [ + 5223.5, + 3.3255999088287354 + ], + "hints": { + "index": 9386 + } + }, + { + "items": [ + 5224, + 3.2674 + ], + "hints": { + "index": 9387 + } + }, + { + "items": [ + 5224.5, + 3.233799934387207 + ], + "hints": { + "index": 9388 + } + }, + { + "items": [ + 5225, + 3.3817000389099121 + ], + "hints": { + "index": 9389 + } + }, + { + "items": [ + 5225.5, + 3.3956000804901123 + ], + "hints": { + "index": 9390 + } + }, + { + "items": [ + 5226, + 3.4445 + ], + "hints": { + "index": 9391 + } + }, + { + "items": [ + 5226.5, + 3.2016000747680664 + ], + "hints": { + "index": 9392 + } + }, + { + "items": [ + 5227, + 3.1723 + ], + "hints": { + "index": 9393 + } + }, + { + "items": [ + 5227.5, + 3.6470000743865967 + ], + "hints": { + "index": 9394 + } + }, + { + "items": [ + 5228, + 4.2606 + ], + "hints": { + "index": 9395 + } + }, + { + "items": [ + 5228.5, + 4.4542999267578125 + ], + "hints": { + "index": 9396 + } + }, + { + "items": [ + 5229, + 3.8241000175476074 + ], + "hints": { + "index": 9397 + } + }, + { + "items": [ + 5229.5, + 3.361799955368042 + ], + "hints": { + "index": 9398 + } + }, + { + "items": [ + 5230, + 3.7569 + ], + "hints": { + "index": 9399 + } + }, + { + "items": [ + 5230.5, + 4.4854998588562012 + ], + "hints": { + "index": 9400 + } + }, + { + "items": [ + 5231, + 4.6454000473022461 + ], + "hints": { + "index": 9401 + } + }, + { + "items": [ + 5231.5, + 3.8680999279022217 + ], + "hints": { + "index": 9402 + } + }, + { + "items": [ + 5232, + 3.1315999031066895 + ], + "hints": { + "index": 9403 + } + }, + { + "items": [ + 5232.5, + 3.0780999660491943 + ], + "hints": { + "index": 9404 + } + }, + { + "items": [ + 5233, + 3.1071000099182129 + ], + "hints": { + "index": 9405 + } + }, + { + "items": [ + 5233.5, + 3.0840001106262207 + ], + "hints": { + "index": 9406 + } + }, + { + "items": [ + 5234, + 2.9811999797821045 + ], + "hints": { + "index": 9407 + } + }, + { + "items": [ + 5234.5, + 2.8901998996734619 + ], + "hints": { + "index": 9408 + } + }, + { + "items": [ + 5235, + 2.9418001174926758 + ], + "hints": { + "index": 9409 + } + }, + { + "items": [ + 5235.5, + 2.9904000759124756 + ], + "hints": { + "index": 9410 + } + }, + { + "items": [ + 5236, + 3.098599910736084 + ], + "hints": { + "index": 9411 + } + }, + { + "items": [ + 5236.5, + 3.1317999362945557 + ], + "hints": { + "index": 9412 + } + }, + { + "items": [ + 5237, + 3.1187999248504639 + ], + "hints": { + "index": 9413 + } + }, + { + "items": [ + 5237.5, + 3.1108999252319336 + ], + "hints": { + "index": 9414 + } + }, + { + "items": [ + 5238, + 3.077 + ], + "hints": { + "index": 9415 + } + }, + { + "items": [ + 5238.5, + 3.0501999855041504 + ], + "hints": { + "index": 9416 + } + }, + { + "items": [ + 5239, + 2.9584000110626221 + ], + "hints": { + "index": 9417 + } + }, + { + "items": [ + 5239.5, + 2.8845000267028809 + ], + "hints": { + "index": 9418 + } + }, + { + "items": [ + 5240, + 2.8661 + ], + "hints": { + "index": 9419 + } + }, + { + "items": [ + 5240.5, + 2.863300085067749 + ], + "hints": { + "index": 9420 + } + }, + { + "items": [ + 5241, + 2.8752999305725098 + ], + "hints": { + "index": 9421 + } + }, + { + "items": [ + 5241.5, + 2.8060998916625977 + ], + "hints": { + "index": 9422 + } + }, + { + "items": [ + 5242, + 2.851 + ], + "hints": { + "index": 9423 + } + }, + { + "items": [ + 5242.5, + 2.8921999931335449 + ], + "hints": { + "index": 9424 + } + }, + { + "items": [ + 5243, + 3.0272 + ], + "hints": { + "index": 9425 + } + }, + { + "items": [ + 5243.5, + 3.1085000038146973 + ], + "hints": { + "index": 9426 + } + }, + { + "items": [ + 5244, + 3.0908 + ], + "hints": { + "index": 9427 + } + }, + { + "items": [ + 5244.5, + 3.098599910736084 + ], + "hints": { + "index": 9428 + } + }, + { + "items": [ + 5245, + 3.1298999786376953 + ], + "hints": { + "index": 9429 + } + }, + { + "items": [ + 5245.5, + 3.0780999660491943 + ], + "hints": { + "index": 9430 + } + }, + { + "items": [ + 5246, + 3.0547 + ], + "hints": { + "index": 9431 + } + }, + { + "items": [ + 5246.5, + 2.9205999374389648 + ], + "hints": { + "index": 9432 + } + }, + { + "items": [ + 5247, + 3.0148000717163086 + ], + "hints": { + "index": 9433 + } + }, + { + "items": [ + 5247.5, + 3.08270001411438 + ], + "hints": { + "index": 9434 + } + }, + { + "items": [ + 5248, + 3.1036 + ], + "hints": { + "index": 9435 + } + }, + { + "items": [ + 5248.5, + 3.0618999004364018 + ], + "hints": { + "index": 9436 + } + }, + { + "items": [ + 5249, + 3.0464999675750732 + ], + "hints": { + "index": 9437 + } + }, + { + "items": [ + 5249.5, + 3.0371999740600586 + ], + "hints": { + "index": 9438 + } + }, + { + "items": [ + 5250, + 3.0342 + ], + "hints": { + "index": 9439 + } + }, + { + "items": [ + 5250.5, + 2.9449000358581543 + ], + "hints": { + "index": 9440 + } + }, + { + "items": [ + 5251, + 2.9599 + ], + "hints": { + "index": 9441 + } + }, + { + "items": [ + 5251.5, + 2.9475998878479004 + ], + "hints": { + "index": 9442 + } + }, + { + "items": [ + 5252, + 3.0524001121520996 + ], + "hints": { + "index": 9443 + } + }, + { + "items": [ + 5252.5, + 3.1106998920440674 + ], + "hints": { + "index": 9444 + } + }, + { + "items": [ + 5253, + 3.1491999626159668 + ], + "hints": { + "index": 9445 + } + }, + { + "items": [ + 5253.5, + 3.1284000873565674 + ], + "hints": { + "index": 9446 + } + }, + { + "items": [ + 5254, + 3.0617 + ], + "hints": { + "index": 9447 + } + }, + { + "items": [ + 5254.5, + 3.1379001140594478 + ], + "hints": { + "index": 9448 + } + }, + { + "items": [ + 5255, + 3.0391 + ], + "hints": { + "index": 9449 + } + }, + { + "items": [ + 5255.5, + 3.1294999122619629 + ], + "hints": { + "index": 9450 + } + }, + { + "items": [ + 5256, + 3.1502 + ], + "hints": { + "index": 9451 + } + }, + { + "items": [ + 5256.5, + 3.2627999782562256 + ], + "hints": { + "index": 9452 + } + }, + { + "items": [ + 5257, + 3.2633 + ], + "hints": { + "index": 9453 + } + }, + { + "items": [ + 5257.5, + 3.1779999732971191 + ], + "hints": { + "index": 9454 + } + }, + { + "items": [ + 5258, + 3.0505 + ], + "hints": { + "index": 9455 + } + }, + { + "items": [ + 5258.5, + 2.9137001037597656 + ], + "hints": { + "index": 9456 + } + }, + { + "items": [ + 5259, + 2.8818 + ], + "hints": { + "index": 9457 + } + }, + { + "items": [ + 5259.5, + 2.9165000915527344 + ], + "hints": { + "index": 9458 + } + }, + { + "items": [ + 5260, + 2.9842 + ], + "hints": { + "index": 9459 + } + }, + { + "items": [ + 5260.5, + 3.0058000087738037 + ], + "hints": { + "index": 9460 + } + }, + { + "items": [ + 5261, + 3.0998 + ], + "hints": { + "index": 9461 + } + }, + { + "items": [ + 5261.5, + 3.1026999950408936 + ], + "hints": { + "index": 9462 + } + }, + { + "items": [ + 5262, + 3.3422 + ], + "hints": { + "index": 9463 + } + }, + { + "items": [ + 5262.5, + 3.3938000202178955 + ], + "hints": { + "index": 9464 + } + }, + { + "items": [ + 5263, + 3.5580000877380371 + ], + "hints": { + "index": 9465 + } + }, + { + "items": [ + 5263.5, + 3.3383998870849609 + ], + "hints": { + "index": 9466 + } + }, + { + "items": [ + 5264, + 3.3048999309539795 + ], + "hints": { + "index": 9467 + } + }, + { + "items": [ + 5264.5, + 3.2005000114440918 + ], + "hints": { + "index": 9468 + } + }, + { + "items": [ + 5265, + 3.1984000205993652 + ], + "hints": { + "index": 9469 + } + }, + { + "items": [ + 5265.5, + 3.2464001178741455 + ], + "hints": { + "index": 9470 + } + }, + { + "items": [ + 5266, + 3.2946999073028564 + ], + "hints": { + "index": 9471 + } + }, + { + "items": [ + 5266.5, + 3.3863999843597412 + ], + "hints": { + "index": 9472 + } + }, + { + "items": [ + 5267, + 3.247999906539917 + ], + "hints": { + "index": 9473 + } + }, + { + "items": [ + 5267.5, + 3.2197999954223633 + ], + "hints": { + "index": 9474 + } + }, + { + "items": [ + 5268, + 3.22979998588562 + ], + "hints": { + "index": 9475 + } + }, + { + "items": [ + 5268.5, + 3.442500114440918 + ], + "hints": { + "index": 9476 + } + }, + { + "items": [ + 5269, + 3.4844999313354492 + ], + "hints": { + "index": 9477 + } + }, + { + "items": [ + 5269.5, + 3.4358000755310059 + ], + "hints": { + "index": 9478 + } + }, + { + "items": [ + 5270, + 3.4254000186920166 + ], + "hints": { + "index": 9479 + } + }, + { + "items": [ + 5270.5, + 3.60700011253357 + ], + "hints": { + "index": 9480 + } + }, + { + "items": [ + 5271, + 3.6203999519348145 + ], + "hints": { + "index": 9481 + } + }, + { + "items": [ + 5271.5, + 3.4453999996185303 + ], + "hints": { + "index": 9482 + } + }, + { + "items": [ + 5272, + 3.1984999179840088 + ], + "hints": { + "index": 9483 + } + }, + { + "items": [ + 5272.5, + 3.1217000484466553 + ], + "hints": { + "index": 9484 + } + }, + { + "items": [ + 5273, + 3.2564001083374023 + ], + "hints": { + "index": 9485 + } + }, + { + "items": [ + 5273.5, + 3.2869000434875488 + ], + "hints": { + "index": 9486 + } + }, + { + "items": [ + 5274, + 3.3412001132965088 + ], + "hints": { + "index": 9487 + } + }, + { + "items": [ + 5274.5, + 3.4072 + ], + "hints": { + "index": 9488 + } + }, + { + "items": [ + 5275, + 3.6147 + ], + "hints": { + "index": 9489 + } + }, + { + "items": [ + 5275.5, + 3.6501 + ], + "hints": { + "index": 9490 + } + }, + { + "items": [ + 5276, + 3.4663 + ], + "hints": { + "index": 9491 + } + }, + { + "items": [ + 5276.5, + 3.2308 + ], + "hints": { + "index": 9492 + } + }, + { + "items": [ + 5277, + 3.0856 + ], + "hints": { + "index": 9493 + } + }, + { + "items": [ + 5277.5, + 3.0587 + ], + "hints": { + "index": 9494 + } + }, + { + "items": [ + 5278, + 3.1673 + ], + "hints": { + "index": 9495 + } + }, + { + "items": [ + 5278.5, + 3.2377 + ], + "hints": { + "index": 9496 + } + }, + { + "items": [ + 5279, + 3.3477 + ], + "hints": { + "index": 9497 + } + }, + { + "items": [ + 5279.5, + 3.3312 + ], + "hints": { + "index": 9498 + } + }, + { + "items": [ + 5280, + 3.5009 + ], + "hints": { + "index": 9499 + } + }, + { + "items": [ + 5280.5, + 3.5688 + ], + "hints": { + "index": 9500 + } + }, + { + "items": [ + 5281, + 3.647 + ], + "hints": { + "index": 9501 + } + }, + { + "items": [ + 5281.5, + 3.7411 + ], + "hints": { + "index": 9502 + } + }, + { + "items": [ + 5282, + 3.7643 + ], + "hints": { + "index": 9503 + } + }, + { + "items": [ + 5282.5, + 3.808 + ], + "hints": { + "index": 9504 + } + }, + { + "items": [ + 5283, + 3.7887 + ], + "hints": { + "index": 9505 + } + }, + { + "items": [ + 5283.5, + 3.6093 + ], + "hints": { + "index": 9506 + } + }, + { + "items": [ + 5284, + 3.5029 + ], + "hints": { + "index": 9507 + } + }, + { + "items": [ + 5284.5, + 3.441 + ], + "hints": { + "index": 9508 + } + }, + { + "items": [ + 5285, + 3.5029 + ], + "hints": { + "index": 9509 + } + }, + { + "items": [ + 5285.5, + 3.5164 + ], + "hints": { + "index": 9510 + } + }, + { + "items": [ + 5286, + 3.4306 + ], + "hints": { + "index": 9511 + } + }, + { + "items": [ + 5286.5, + 3.42 + ], + "hints": { + "index": 9512 + } + }, + { + "items": [ + 5287, + 3.3834 + ], + "hints": { + "index": 9513 + } + }, + { + "items": [ + 5287.5, + 3.4481 + ], + "hints": { + "index": 9514 + } + }, + { + "items": [ + 5288, + 3.6156 + ], + "hints": { + "index": 9515 + } + }, + { + "items": [ + 5288.5, + 3.7755 + ], + "hints": { + "index": 9516 + } + }, + { + "items": [ + 5289, + 3.759 + ], + "hints": { + "index": 9517 + } + }, + { + "items": [ + 5289.5, + 3.5867 + ], + "hints": { + "index": 9518 + } + }, + { + "items": [ + 5290, + 3.4746 + ], + "hints": { + "index": 9519 + } + }, + { + "items": [ + 5290.5, + 3.5831 + ], + "hints": { + "index": 9520 + } + }, + { + "items": [ + 5291, + 3.6242 + ], + "hints": { + "index": 9521 + } + }, + { + "items": [ + 5291.5, + 3.6509 + ], + "hints": { + "index": 9522 + } + }, + { + "items": [ + 5292, + 3.4663 + ], + "hints": { + "index": 9523 + } + }, + { + "items": [ + 5292.5, + 3.3631 + ], + "hints": { + "index": 9524 + } + }, + { + "items": [ + 5293, + 3.4024 + ], + "hints": { + "index": 9525 + } + }, + { + "items": [ + 5293.5, + 3.9394 + ], + "hints": { + "index": 9526 + } + }, + { + "items": [ + 5294, + 4.6689 + ], + "hints": { + "index": 9527 + } + }, + { + "items": [ + 5294.5, + 4.9484 + ], + "hints": { + "index": 9528 + } + }, + { + "items": [ + 5295, + 4.2266 + ], + "hints": { + "index": 9529 + } + }, + { + "items": [ + 5295.5, + 3.7697 + ], + "hints": { + "index": 9530 + } + }, + { + "items": [ + 5296, + 3.5377 + ], + "hints": { + "index": 9531 + } + }, + { + "items": [ + 5296.5, + 3.6617 + ], + "hints": { + "index": 9532 + } + }, + { + "items": [ + 5297, + 3.6948 + ], + "hints": { + "index": 9533 + } + }, + { + "items": [ + 5297.5, + 3.6996 + ], + "hints": { + "index": 9534 + } + }, + { + "items": [ + 5298, + 3.7426 + ], + "hints": { + "index": 9535 + } + }, + { + "items": [ + 5298.5, + 3.8214 + ], + "hints": { + "index": 9536 + } + }, + { + "items": [ + 5299, + 3.9785 + ], + "hints": { + "index": 9537 + } + }, + { + "items": [ + 5299.5, + 4.0906 + ], + "hints": { + "index": 9538 + } + }, + { + "items": [ + 5300, + 4.3485 + ], + "hints": { + "index": 9539 + } + }, + { + "items": [ + 5300.5, + 5.3559 + ], + "hints": { + "index": 9540 + } + }, + { + "items": [ + 5301, + 6.1878 + ], + "hints": { + "index": 9541 + } + }, + { + "items": [ + 5301.5, + 6.7162 + ], + "hints": { + "index": 9542 + } + }, + { + "items": [ + 5302, + 6.4302 + ], + "hints": { + "index": 9543 + } + }, + { + "items": [ + 5302.5, + 6.0545 + ], + "hints": { + "index": 9544 + } + }, + { + "items": [ + 5303, + 5.5103 + ], + "hints": { + "index": 9545 + } + }, + { + "items": [ + 5303.5, + 4.6766 + ], + "hints": { + "index": 9546 + } + }, + { + "items": [ + 5304, + 4.3458 + ], + "hints": { + "index": 9547 + } + }, + { + "items": [ + 5304.5, + 4.2244 + ], + "hints": { + "index": 9548 + } + }, + { + "items": [ + 5305, + 4.3225 + ], + "hints": { + "index": 9549 + } + }, + { + "items": [ + 5305.5, + 4.1329 + ], + "hints": { + "index": 9550 + } + }, + { + "items": [ + 5306, + 3.8919000625610352 + ], + "hints": { + "index": 9551 + } + }, + { + "items": [ + 5306.5, + 4.0124001502990723 + ], + "hints": { + "index": 9552 + } + }, + { + "items": [ + 5307, + 4.100100040435791 + ], + "hints": { + "index": 9553 + } + }, + { + "items": [ + 5307.5, + 4.2046999931335449 + ], + "hints": { + "index": 9554 + } + }, + { + "items": [ + 5308, + 3.7504 + ], + "hints": { + "index": 9555 + } + }, + { + "items": [ + 5308.5, + 3.7518 + ], + "hints": { + "index": 9556 + } + }, + { + "items": [ + 5309, + 3.8818 + ], + "hints": { + "index": 9557 + } + }, + { + "items": [ + 5309.5, + 4.1332 + ], + "hints": { + "index": 9558 + } + }, + { + "items": [ + 5310, + 4.535 + ], + "hints": { + "index": 9559 + } + }, + { + "items": [ + 5310.5, + 4.8241 + ], + "hints": { + "index": 9560 + } + }, + { + "items": [ + 5311, + 5.0754 + ], + "hints": { + "index": 9561 + } + }, + { + "items": [ + 5311.5, + 4.9517 + ], + "hints": { + "index": 9562 + } + }, + { + "items": [ + 5312, + 4.7684 + ], + "hints": { + "index": 9563 + } + }, + { + "items": [ + 5312.5, + 5.0576 + ], + "hints": { + "index": 9564 + } + }, + { + "items": [ + 5313, + 5.9612 + ], + "hints": { + "index": 9565 + } + }, + { + "items": [ + 5313.5, + 7.8174 + ], + "hints": { + "index": 9566 + } + }, + { + "items": [ + 5314, + 8.1132 + ], + "hints": { + "index": 9567 + } + }, + { + "items": [ + 5314.5, + 6.7667 + ], + "hints": { + "index": 9568 + } + }, + { + "items": [ + 5315, + 5.4832 + ], + "hints": { + "index": 9569 + } + }, + { + "items": [ + 5315.5, + 5.335 + ], + "hints": { + "index": 9570 + } + }, + { + "items": [ + 5316, + 5.8261 + ], + "hints": { + "index": 9571 + } + }, + { + "items": [ + 5316.5, + 6.5067 + ], + "hints": { + "index": 9572 + } + }, + { + "items": [ + 5317, + 6.7774 + ], + "hints": { + "index": 9573 + } + }, + { + "items": [ + 5317.5, + 6.2267 + ], + "hints": { + "index": 9574 + } + }, + { + "items": [ + 5318, + 5.3107 + ], + "hints": { + "index": 9575 + } + }, + { + "items": [ + 5318.5, + 4.7670998573303223 + ], + "hints": { + "index": 9576 + } + }, + { + "items": [ + 5319, + 4.5767002105712891 + ], + "hints": { + "index": 9577 + } + }, + { + "items": [ + 5319.5, + 4.9545998573303223 + ], + "hints": { + "index": 9578 + } + }, + { + "items": [ + 5320, + 4.7090001106262207 + ], + "hints": { + "index": 9579 + } + }, + { + "items": [ + 5320.5, + 4.6395998001098633 + ], + "hints": { + "index": 9580 + } + }, + { + "items": [ + 5321, + 4.0914998054504395 + ], + "hints": { + "index": 9581 + } + }, + { + "items": [ + 5321.5, + 4.2472000122070313 + ], + "hints": { + "index": 9582 + } + }, + { + "items": [ + 5322, + 4.5388998985290527 + ], + "hints": { + "index": 9583 + } + }, + { + "items": [ + 5322.5, + 4.6844000816345215 + ], + "hints": { + "index": 9584 + } + }, + { + "items": [ + 5323, + 4.4517002105712891 + ], + "hints": { + "index": 9585 + } + }, + { + "items": [ + 5323.5, + 3.8972001075744633 + ], + "hints": { + "index": 9586 + } + }, + { + "items": [ + 5324, + 3.8393 + ], + "hints": { + "index": 9587 + } + }, + { + "items": [ + 5324.5, + 3.9224 + ], + "hints": { + "index": 9588 + } + }, + { + "items": [ + 5325, + 3.9582 + ], + "hints": { + "index": 9589 + } + }, + { + "items": [ + 5325.5, + 4.5325 + ], + "hints": { + "index": 9590 + } + }, + { + "items": [ + 5326, + 5.054 + ], + "hints": { + "index": 9591 + } + }, + { + "items": [ + 5326.5, + 5.5394 + ], + "hints": { + "index": 9592 + } + }, + { + "items": [ + 5327, + 4.9152 + ], + "hints": { + "index": 9593 + } + }, + { + "items": [ + 5327.5, + 4.3138 + ], + "hints": { + "index": 9594 + } + }, + { + "items": [ + 5328, + 3.951 + ], + "hints": { + "index": 9595 + } + }, + { + "items": [ + 5328.5, + 3.9338 + ], + "hints": { + "index": 9596 + } + }, + { + "items": [ + 5329, + 4.1185 + ], + "hints": { + "index": 9597 + } + }, + { + "items": [ + 5329.5, + 4.2032 + ], + "hints": { + "index": 9598 + } + }, + { + "items": [ + 5330, + 4.2909 + ], + "hints": { + "index": 9599 + } + }, + { + "items": [ + 5330.5, + 4.2209 + ], + "hints": { + "index": 9600 + } + }, + { + "items": [ + 5331, + 4.3299 + ], + "hints": { + "index": 9601 + } + }, + { + "items": [ + 5331.5, + 4.538 + ], + "hints": { + "index": 9602 + } + }, + { + "items": [ + 5332, + 4.5308 + ], + "hints": { + "index": 9603 + } + }, + { + "items": [ + 5332.5, + 4.4681 + ], + "hints": { + "index": 9604 + } + }, + { + "items": [ + 5333, + 4.3489 + ], + "hints": { + "index": 9605 + } + }, + { + "items": [ + 5333.5, + 4.3419 + ], + "hints": { + "index": 9606 + } + }, + { + "items": [ + 5334, + 4.4958 + ], + "hints": { + "index": 9607 + } + }, + { + "items": [ + 5334.5, + 4.3981 + ], + "hints": { + "index": 9608 + } + }, + { + "items": [ + 5335, + 4.6765 + ], + "hints": { + "index": 9609 + } + }, + { + "items": [ + 5335.5, + 4.5841 + ], + "hints": { + "index": 9610 + } + }, + { + "items": [ + 5336, + 4.9453 + ], + "hints": { + "index": 9611 + } + }, + { + "items": [ + 5336.5, + 4.7059 + ], + "hints": { + "index": 9612 + } + }, + { + "items": [ + 5337, + 4.5614 + ], + "hints": { + "index": 9613 + } + }, + { + "items": [ + 5337.5, + 4.1869 + ], + "hints": { + "index": 9614 + } + }, + { + "items": [ + 5338, + 4.0791001319885254 + ], + "hints": { + "index": 9615 + } + }, + { + "items": [ + 5338.5, + 3.8845 + ], + "hints": { + "index": 9616 + } + }, + { + "items": [ + 5339, + 3.9089 + ], + "hints": { + "index": 9617 + } + }, + { + "items": [ + 5339.5, + 4.0597000122070313 + ], + "hints": { + "index": 9618 + } + }, + { + "items": [ + 5340, + 4.8217 + ], + "hints": { + "index": 9619 + } + }, + { + "items": [ + 5340.5, + 5.4822998046875 + ], + "hints": { + "index": 9620 + } + }, + { + "items": [ + 5341, + 5.6755 + ], + "hints": { + "index": 9621 + } + }, + { + "items": [ + 5341.5, + 4.9498 + ], + "hints": { + "index": 9622 + } + }, + { + "items": [ + 5342, + 4.3417 + ], + "hints": { + "index": 9623 + } + }, + { + "items": [ + 5342.5, + 3.9548 + ], + "hints": { + "index": 9624 + } + }, + { + "items": [ + 5343, + 3.9 + ], + "hints": { + "index": 9625 + } + }, + { + "items": [ + 5343.5, + 3.883699893951416 + ], + "hints": { + "index": 9626 + } + }, + { + "items": [ + 5344, + 4.0019998550415039 + ], + "hints": { + "index": 9627 + } + }, + { + "items": [ + 5344.5, + 4.0352 + ], + "hints": { + "index": 9628 + } + }, + { + "items": [ + 5345, + 4.0570001602172852 + ], + "hints": { + "index": 9629 + } + }, + { + "items": [ + 5345.5, + 4.158599853515625 + ], + "hints": { + "index": 9630 + } + }, + { + "items": [ + 5346, + 4.2080998420715332 + ], + "hints": { + "index": 9631 + } + }, + { + "items": [ + 5346.5, + 4.3431000709533691 + ], + "hints": { + "index": 9632 + } + }, + { + "items": [ + 5347, + 4.2712998390197754 + ], + "hints": { + "index": 9633 + } + }, + { + "items": [ + 5347.5, + 4.3067 + ], + "hints": { + "index": 9634 + } + }, + { + "items": [ + 5348, + 4.6075000762939453 + ], + "hints": { + "index": 9635 + } + }, + { + "items": [ + 5348.5, + 5.55019998550415 + ], + "hints": { + "index": 9636 + } + }, + { + "items": [ + 5349, + 7.1733 + ], + "hints": { + "index": 9637 + } + }, + { + "items": [ + 5349.5, + 9.0608 + ], + "hints": { + "index": 9638 + } + }, + { + "items": [ + 5350, + 7.901400089263916 + ], + "hints": { + "index": 9639 + } + }, + { + "items": [ + 5350.5, + 6.4124999046325684 + ], + "hints": { + "index": 9640 + } + }, + { + "items": [ + 5351, + 4.9872 + ], + "hints": { + "index": 9641 + } + }, + { + "items": [ + 5351.5, + 4.7417998313903809 + ], + "hints": { + "index": 9642 + } + }, + { + "items": [ + 5352, + 4.5659999847412109 + ], + "hints": { + "index": 9643 + } + }, + { + "items": [ + 5352.5, + 4.4302000999450684 + ], + "hints": { + "index": 9644 + } + }, + { + "items": [ + 5353, + 4.4531002044677734 + ], + "hints": { + "index": 9645 + } + }, + { + "items": [ + 5353.5, + 4.7115998268127441 + ], + "hints": { + "index": 9646 + } + }, + { + "items": [ + 5354, + 5.0797 + ], + "hints": { + "index": 9647 + } + }, + { + "items": [ + 5354.5, + 5.4875 + ], + "hints": { + "index": 9648 + } + }, + { + "items": [ + 5355, + 5.8375 + ], + "hints": { + "index": 9649 + } + }, + { + "items": [ + 5355.5, + 5.7135000228881836 + ], + "hints": { + "index": 9650 + } + }, + { + "items": [ + 5356, + 5.115300178527832 + ], + "hints": { + "index": 9651 + } + }, + { + "items": [ + 5356.5, + 4.4635000228881836 + ], + "hints": { + "index": 9652 + } + }, + { + "items": [ + 5357, + 4.4155998229980469 + ], + "hints": { + "index": 9653 + } + }, + { + "items": [ + 5357.5, + 4.3644 + ], + "hints": { + "index": 9654 + } + }, + { + "items": [ + 5358, + 4.413599967956543 + ], + "hints": { + "index": 9655 + } + }, + { + "items": [ + 5358.5, + 4.3643999099731445 + ], + "hints": { + "index": 9656 + } + }, + { + "items": [ + 5359, + 4.6065998077392578 + ], + "hints": { + "index": 9657 + } + }, + { + "items": [ + 5359.5, + 4.8832998275756836 + ], + "hints": { + "index": 9658 + } + }, + { + "items": [ + 5360, + 4.8969998359680176 + ], + "hints": { + "index": 9659 + } + }, + { + "items": [ + 5360.5, + 4.7540998458862305 + ], + "hints": { + "index": 9660 + } + }, + { + "items": [ + 5361, + 4.3698000907897949 + ], + "hints": { + "index": 9661 + } + }, + { + "items": [ + 5361.5, + 4.428800106048584 + ], + "hints": { + "index": 9662 + } + }, + { + "items": [ + 5362, + 4.4877 + ], + "hints": { + "index": 9663 + } + }, + { + "items": [ + 5362.5, + 4.7129998207092285 + ], + "hints": { + "index": 9664 + } + }, + { + "items": [ + 5363, + 5.5557999610900879 + ], + "hints": { + "index": 9665 + } + }, + { + "items": [ + 5363.5, + 6.2925000190734863 + ], + "hints": { + "index": 9666 + } + }, + { + "items": [ + 5364, + 6.1307 + ], + "hints": { + "index": 9667 + } + }, + { + "items": [ + 5364.5, + 4.779900074005127 + ], + "hints": { + "index": 9668 + } + }, + { + "items": [ + 5365, + 4.2479000091552734 + ], + "hints": { + "index": 9669 + } + }, + { + "items": [ + 5365.5, + 3.98550009727478 + ], + "hints": { + "index": 9670 + } + }, + { + "items": [ + 5366, + 4.0612 + ], + "hints": { + "index": 9671 + } + }, + { + "items": [ + 5366.5, + 3.8613 + ], + "hints": { + "index": 9672 + } + }, + { + "items": [ + 5367, + 3.9972000122070313 + ], + "hints": { + "index": 9673 + } + }, + { + "items": [ + 5367.5, + 4.2031002044677734 + ], + "hints": { + "index": 9674 + } + }, + { + "items": [ + 5368, + 4.4226999282836914 + ], + "hints": { + "index": 9675 + } + }, + { + "items": [ + 5368.5, + 4.6901001930236816 + ], + "hints": { + "index": 9676 + } + }, + { + "items": [ + 5369, + 4.7146 + ], + "hints": { + "index": 9677 + } + }, + { + "items": [ + 5369.5, + 4.7065000534057617 + ], + "hints": { + "index": 9678 + } + }, + { + "items": [ + 5370, + 4.5092 + ], + "hints": { + "index": 9679 + } + }, + { + "items": [ + 5370.5, + 4.26230001449585 + ], + "hints": { + "index": 9680 + } + }, + { + "items": [ + 5371, + 4.1805000305175781 + ], + "hints": { + "index": 9681 + } + }, + { + "items": [ + 5371.5, + 4.0854001045227051 + ], + "hints": { + "index": 9682 + } + }, + { + "items": [ + 5372, + 4.2248997688293457 + ], + "hints": { + "index": 9683 + } + }, + { + "items": [ + 5372.5, + 4.3859 + ], + "hints": { + "index": 9684 + } + }, + { + "items": [ + 5373, + 4.4289 + ], + "hints": { + "index": 9685 + } + }, + { + "items": [ + 5373.5, + 4.1803998947143555 + ], + "hints": { + "index": 9686 + } + }, + { + "items": [ + 5374, + 3.9862 + ], + "hints": { + "index": 9687 + } + }, + { + "items": [ + 5374.5, + 4.0890002250671387 + ], + "hints": { + "index": 9688 + } + }, + { + "items": [ + 5375, + 4.2100000381469727 + ], + "hints": { + "index": 9689 + } + }, + { + "items": [ + 5375.5, + 4.112299919128418 + ], + "hints": { + "index": 9690 + } + }, + { + "items": [ + 5376, + 4.0647001266479492 + ], + "hints": { + "index": 9691 + } + }, + { + "items": [ + 5376.5, + 4.0412001609802246 + ], + "hints": { + "index": 9692 + } + }, + { + "items": [ + 5377, + 4.3098998069763184 + ], + "hints": { + "index": 9693 + } + }, + { + "items": [ + 5377.5, + 4.4959001541137695 + ], + "hints": { + "index": 9694 + } + }, + { + "items": [ + 5378, + 4.3885002136230469 + ], + "hints": { + "index": 9695 + } + }, + { + "items": [ + 5378.5, + 4.14900016784668 + ], + "hints": { + "index": 9696 + } + }, + { + "items": [ + 5379, + 3.9637999534606938 + ], + "hints": { + "index": 9697 + } + }, + { + "items": [ + 5379.5, + 4.0683999061584473 + ], + "hints": { + "index": 9698 + } + }, + { + "items": [ + 5380, + 4.3801999092102051 + ], + "hints": { + "index": 9699 + } + }, + { + "items": [ + 5380.5, + 4.4078001976013184 + ], + "hints": { + "index": 9700 + } + }, + { + "items": [ + 5381, + 4.4535 + ], + "hints": { + "index": 9701 + } + }, + { + "items": [ + 5381.5, + 4.3344998359680176 + ], + "hints": { + "index": 9702 + } + }, + { + "items": [ + 5382, + 4.109799861907959 + ], + "hints": { + "index": 9703 + } + }, + { + "items": [ + 5382.5, + 3.8531999588012695 + ], + "hints": { + "index": 9704 + } + }, + { + "items": [ + 5383, + 3.7193999290466313 + ], + "hints": { + "index": 9705 + } + }, + { + "items": [ + 5383.5, + 3.8768999576568608 + ], + "hints": { + "index": 9706 + } + }, + { + "items": [ + 5384, + 4.3319997787475586 + ], + "hints": { + "index": 9707 + } + }, + { + "items": [ + 5384.5, + 4.6285 + ], + "hints": { + "index": 9708 + } + }, + { + "items": [ + 5385, + 5.1606001853942871 + ], + "hints": { + "index": 9709 + } + }, + { + "items": [ + 5385.5, + 5.3516998291015625 + ], + "hints": { + "index": 9710 + } + }, + { + "items": [ + 5386, + 5.9976 + ], + "hints": { + "index": 9711 + } + }, + { + "items": [ + 5386.5, + 5.6215 + ], + "hints": { + "index": 9712 + } + }, + { + "items": [ + 5387, + 5.1821 + ], + "hints": { + "index": 9713 + } + }, + { + "items": [ + 5387.5, + 4.325200080871582 + ], + "hints": { + "index": 9714 + } + }, + { + "items": [ + 5388, + 4.3289999961853027 + ], + "hints": { + "index": 9715 + } + }, + { + "items": [ + 5388.5, + 4.3358001708984375 + ], + "hints": { + "index": 9716 + } + }, + { + "items": [ + 5389, + 4.4010000228881836 + ], + "hints": { + "index": 9717 + } + }, + { + "items": [ + 5389.5, + 4.2875 + ], + "hints": { + "index": 9718 + } + }, + { + "items": [ + 5390, + 4.3284997940063477 + ], + "hints": { + "index": 9719 + } + }, + { + "items": [ + 5390.5, + 4.561 + ], + "hints": { + "index": 9720 + } + }, + { + "items": [ + 5391, + 4.58459997177124 + ], + "hints": { + "index": 9721 + } + }, + { + "items": [ + 5391.5, + 4.75029993057251 + ], + "hints": { + "index": 9722 + } + }, + { + "items": [ + 5392, + 4.9070000648498535 + ], + "hints": { + "index": 9723 + } + }, + { + "items": [ + 5392.5, + 4.9028000831604 + ], + "hints": { + "index": 9724 + } + }, + { + "items": [ + 5393, + 4.7635998725891113 + ], + "hints": { + "index": 9725 + } + }, + { + "items": [ + 5393.5, + 5.0373997688293457 + ], + "hints": { + "index": 9726 + } + }, + { + "items": [ + 5394, + 5.7081999778747559 + ], + "hints": { + "index": 9727 + } + }, + { + "items": [ + 5394.5, + 6.51230001449585 + ], + "hints": { + "index": 9728 + } + }, + { + "items": [ + 5395, + 5.7778000831604 + ], + "hints": { + "index": 9729 + } + }, + { + "items": [ + 5395.5, + 4.8158998489379883 + ], + "hints": { + "index": 9730 + } + }, + { + "items": [ + 5396, + 4.44320011138916 + ], + "hints": { + "index": 9731 + } + }, + { + "items": [ + 5396.5, + 5.2786002159118652 + ], + "hints": { + "index": 9732 + } + }, + { + "items": [ + 5397, + 6.3456997871398926 + ], + "hints": { + "index": 9733 + } + }, + { + "items": [ + 5397.5, + 6.7142000198364258 + ], + "hints": { + "index": 9734 + } + }, + { + "items": [ + 5398, + 5.683800220489502 + ], + "hints": { + "index": 9735 + } + }, + { + "items": [ + 5398.5, + 5.0356001853942871 + ], + "hints": { + "index": 9736 + } + }, + { + "items": [ + 5399, + 4.5671000480651855 + ], + "hints": { + "index": 9737 + } + }, + { + "items": [ + 5399.5, + 4.4106001853942871 + ], + "hints": { + "index": 9738 + } + }, + { + "items": [ + 5400, + 4.118800163269043 + ], + "hints": { + "index": 9739 + } + }, + { + "items": [ + 5400.5, + 4.518700122833252 + ], + "hints": { + "index": 9740 + } + }, + { + "items": [ + 5401, + 4.5476999282836914 + ], + "hints": { + "index": 9741 + } + }, + { + "items": [ + 5401.5, + 4.8123002052307129 + ], + "hints": { + "index": 9742 + } + }, + { + "items": [ + 5402, + 4.3617000579833984 + ], + "hints": { + "index": 9743 + } + }, + { + "items": [ + 5402.5, + 4.3688998222351074 + ], + "hints": { + "index": 9744 + } + }, + { + "items": [ + 5403, + 4.042600154876709 + ], + "hints": { + "index": 9745 + } + }, + { + "items": [ + 5403.5, + 3.9168999195098881 + ], + "hints": { + "index": 9746 + } + }, + { + "items": [ + 5404, + 3.8155999183654785 + ], + "hints": { + "index": 9747 + } + }, + { + "items": [ + 5404.5, + 3.948600053787231 + ], + "hints": { + "index": 9748 + } + }, + { + "items": [ + 5405, + 3.9505000114440918 + ], + "hints": { + "index": 9749 + } + }, + { + "items": [ + 5405.5, + 4.1675000190734863 + ], + "hints": { + "index": 9750 + } + }, + { + "items": [ + 5406, + 4.2314000129699707 + ], + "hints": { + "index": 9751 + } + }, + { + "items": [ + 5406.5, + 4.4345002174377441 + ], + "hints": { + "index": 9752 + } + }, + { + "items": [ + 5407, + 4.2196998596191406 + ], + "hints": { + "index": 9753 + } + }, + { + "items": [ + 5407.5, + 4.2705998420715332 + ], + "hints": { + "index": 9754 + } + }, + { + "items": [ + 5408, + 4.4155998229980469 + ], + "hints": { + "index": 9755 + } + }, + { + "items": [ + 5408.5, + 4.5984997749328613 + ], + "hints": { + "index": 9756 + } + }, + { + "items": [ + 5409, + 4.7681999206542969 + ], + "hints": { + "index": 9757 + } + }, + { + "items": [ + 5409.5, + 4.6142001152038574 + ], + "hints": { + "index": 9758 + } + }, + { + "items": [ + 5410, + 4.51200008392334 + ], + "hints": { + "index": 9759 + } + }, + { + "items": [ + 5410.5, + 4.50540018081665 + ], + "hints": { + "index": 9760 + } + }, + { + "items": [ + 5411, + 4.3761 + ], + "hints": { + "index": 9761 + } + }, + { + "items": [ + 5411.5, + 4.3331 + ], + "hints": { + "index": 9762 + } + }, + { + "items": [ + 5412, + 4.372 + ], + "hints": { + "index": 9763 + } + }, + { + "items": [ + 5412.5, + 4.5900998115539551 + ], + "hints": { + "index": 9764 + } + }, + { + "items": [ + 5413, + 4.7916 + ], + "hints": { + "index": 9765 + } + }, + { + "items": [ + 5413.5, + 4.7151 + ], + "hints": { + "index": 9766 + } + }, + { + "items": [ + 5414, + 5.0099 + ], + "hints": { + "index": 9767 + } + }, + { + "items": [ + 5414.5, + 5.2034001350402832 + ], + "hints": { + "index": 9768 + } + }, + { + "items": [ + 5415, + 5.3518 + ], + "hints": { + "index": 9769 + } + }, + { + "items": [ + 5415.5, + 5.1129 + ], + "hints": { + "index": 9770 + } + }, + { + "items": [ + 5416, + 5.0922 + ], + "hints": { + "index": 9771 + } + }, + { + "items": [ + 5416.5, + 5.1248 + ], + "hints": { + "index": 9772 + } + }, + { + "items": [ + 5417, + 5.4467 + ], + "hints": { + "index": 9773 + } + }, + { + "items": [ + 5417.5, + 5.7213 + ], + "hints": { + "index": 9774 + } + }, + { + "items": [ + 5418, + 5.8802 + ], + "hints": { + "index": 9775 + } + }, + { + "items": [ + 5418.5, + 5.3811 + ], + "hints": { + "index": 9776 + } + }, + { + "items": [ + 5419, + 4.9128 + ], + "hints": { + "index": 9777 + } + }, + { + "items": [ + 5419.5, + 4.5999 + ], + "hints": { + "index": 9778 + } + }, + { + "items": [ + 5420, + 4.7631 + ], + "hints": { + "index": 9779 + } + }, + { + "items": [ + 5420.5, + 5.4702 + ], + "hints": { + "index": 9780 + } + }, + { + "items": [ + 5421, + 7.1378 + ], + "hints": { + "index": 9781 + } + }, + { + "items": [ + 5421.5, + 9.5183 + ], + "hints": { + "index": 9782 + } + }, + { + "items": [ + 5422, + 12.2222 + ], + "hints": { + "index": 9783 + } + }, + { + "items": [ + 5422.5, + 12.6778 + ], + "hints": { + "index": 9784 + } + }, + { + "items": [ + 5423, + 14.252900123596191 + ], + "hints": { + "index": 9785 + } + }, + { + "items": [ + 5423.5, + 11.8927001953125 + ], + "hints": { + "index": 9786 + } + }, + { + "items": [ + 5424, + 10.405900001525881 + ], + "hints": { + "index": 9787 + } + }, + { + "items": [ + 5424.5, + 7.3291001319885245 + ], + "hints": { + "index": 9788 + } + }, + { + "items": [ + 5425, + 6.8777999877929688 + ], + "hints": { + "index": 9789 + } + }, + { + "items": [ + 5425.5, + 6.4994 + ], + "hints": { + "index": 9790 + } + }, + { + "items": [ + 5426, + 7.1328 + ], + "hints": { + "index": 9791 + } + }, + { + "items": [ + 5426.5, + 8.5863 + ], + "hints": { + "index": 9792 + } + }, + { + "items": [ + 5427, + 10.517999649047852 + ], + "hints": { + "index": 9793 + } + }, + { + "items": [ + 5427.5, + 13.3681001663208 + ], + "hints": { + "index": 9794 + } + }, + { + "items": [ + 5428, + 12.738300323486328 + ], + "hints": { + "index": 9795 + } + }, + { + "items": [ + 5428.5, + 10.7837 + ], + "hints": { + "index": 9796 + } + }, + { + "items": [ + 5429, + 9.6898 + ], + "hints": { + "index": 9797 + } + }, + { + "items": [ + 5429.5, + 12.3166 + ], + "hints": { + "index": 9798 + } + }, + { + "items": [ + 5430, + 16.4689998626709 + ], + "hints": { + "index": 9799 + } + }, + { + "items": [ + 5430.5, + 23.9304 + ], + "hints": { + "index": 9800 + } + }, + { + "items": [ + 5431, + 21.3021 + ], + "hints": { + "index": 9801 + } + }, + { + "items": [ + 5431.5, + 13.060299873352053 + ], + "hints": { + "index": 9802 + } + }, + { + "items": [ + 5432, + 10.3125 + ], + "hints": { + "index": 9803 + } + }, + { + "items": [ + 5432.5, + 9.9695 + ], + "hints": { + "index": 9804 + } + }, + { + "items": [ + 5433, + 9.522 + ], + "hints": { + "index": 9805 + } + }, + { + "items": [ + 5433.5, + 8.2268 + ], + "hints": { + "index": 9806 + } + }, + { + "items": [ + 5434, + 6.6558 + ], + "hints": { + "index": 9807 + } + }, + { + "items": [ + 5434.5, + 6.5409 + ], + "hints": { + "index": 9808 + } + }, + { + "items": [ + 5435, + 6.7685 + ], + "hints": { + "index": 9809 + } + }, + { + "items": [ + 5435.5, + 7.5167 + ], + "hints": { + "index": 9810 + } + }, + { + "items": [ + 5436, + 8.708 + ], + "hints": { + "index": 9811 + } + }, + { + "items": [ + 5436.5, + 9.3725 + ], + "hints": { + "index": 9812 + } + }, + { + "items": [ + 5437, + 8.1917 + ], + "hints": { + "index": 9813 + } + }, + { + "items": [ + 5437.5, + 7.8295998573303214 + ], + "hints": { + "index": 9814 + } + }, + { + "items": [ + 5438, + 7.4775 + ], + "hints": { + "index": 9815 + } + }, + { + "items": [ + 5438.5, + 8.1977996826171875 + ], + "hints": { + "index": 9816 + } + }, + { + "items": [ + 5439, + 8.4083003997802734 + ], + "hints": { + "index": 9817 + } + }, + { + "items": [ + 5439.5, + 8.0174999237060547 + ], + "hints": { + "index": 9818 + } + }, + { + "items": [ + 5440, + 6.8316001892089844 + ], + "hints": { + "index": 9819 + } + }, + { + "items": [ + 5440.5, + 5.8343 + ], + "hints": { + "index": 9820 + } + }, + { + "items": [ + 5441, + 5.6963 + ], + "hints": { + "index": 9821 + } + }, + { + "items": [ + 5441.5, + 5.8498997688293457 + ], + "hints": { + "index": 9822 + } + }, + { + "items": [ + 5442, + 5.7487998008728027 + ], + "hints": { + "index": 9823 + } + }, + { + "items": [ + 5442.5, + 5.5255999565124512 + ], + "hints": { + "index": 9824 + } + }, + { + "items": [ + 5443, + 5.4840998649597168 + ], + "hints": { + "index": 9825 + } + }, + { + "items": [ + 5443.5, + 5.7621 + ], + "hints": { + "index": 9826 + } + }, + { + "items": [ + 5444, + 6.1380000114440918 + ], + "hints": { + "index": 9827 + } + }, + { + "items": [ + 5444.5, + 6.3203 + ], + "hints": { + "index": 9828 + } + }, + { + "items": [ + 5445, + 5.9650001525878906 + ], + "hints": { + "index": 9829 + } + }, + { + "items": [ + 5445.5, + 5.7628998756408691 + ], + "hints": { + "index": 9830 + } + }, + { + "items": [ + 5446, + 6.1432 + ], + "hints": { + "index": 9831 + } + }, + { + "items": [ + 5446.5, + 6.4383001327514648 + ], + "hints": { + "index": 9832 + } + }, + { + "items": [ + 5447, + 6.1035 + ], + "hints": { + "index": 9833 + } + }, + { + "items": [ + 5447.5, + 5.3520998954772949 + ], + "hints": { + "index": 9834 + } + }, + { + "items": [ + 5448, + 4.7676000595092773 + ], + "hints": { + "index": 9835 + } + }, + { + "items": [ + 5448.5, + 4.2828 + ], + "hints": { + "index": 9836 + } + }, + { + "items": [ + 5449, + 4.2355999946594238 + ], + "hints": { + "index": 9837 + } + }, + { + "items": [ + 5449.5, + 4.4067001342773438 + ], + "hints": { + "index": 9838 + } + }, + { + "items": [ + 5450, + 4.6848998069763184 + ], + "hints": { + "index": 9839 + } + }, + { + "items": [ + 5450.5, + 4.9906997680664063 + ], + "hints": { + "index": 9840 + } + }, + { + "items": [ + 5451, + 5.247499942779541 + ], + "hints": { + "index": 9841 + } + }, + { + "items": [ + 5451.5, + 5.4081997871398926 + ], + "hints": { + "index": 9842 + } + }, + { + "items": [ + 5452, + 5.2265000343322754 + ], + "hints": { + "index": 9843 + } + }, + { + "items": [ + 5452.5, + 4.9543 + ], + "hints": { + "index": 9844 + } + }, + { + "items": [ + 5453, + 4.9781 + ], + "hints": { + "index": 9845 + } + }, + { + "items": [ + 5453.5, + 4.7133 + ], + "hints": { + "index": 9846 + } + }, + { + "items": [ + 5454, + 4.8161 + ], + "hints": { + "index": 9847 + } + }, + { + "items": [ + 5454.5, + 4.7953 + ], + "hints": { + "index": 9848 + } + }, + { + "items": [ + 5455, + 5.2712 + ], + "hints": { + "index": 9849 + } + }, + { + "items": [ + 5455.5, + 5.4084 + ], + "hints": { + "index": 9850 + } + }, + { + "items": [ + 5456, + 5.2284 + ], + "hints": { + "index": 9851 + } + }, + { + "items": [ + 5456.5, + 5.0206 + ], + "hints": { + "index": 9852 + } + }, + { + "items": [ + 5457, + 4.9886 + ], + "hints": { + "index": 9853 + } + }, + { + "items": [ + 5457.5, + 5.2415 + ], + "hints": { + "index": 9854 + } + }, + { + "items": [ + 5458, + 5.2594 + ], + "hints": { + "index": 9855 + } + }, + { + "items": [ + 5458.5, + 5.178 + ], + "hints": { + "index": 9856 + } + }, + { + "items": [ + 5459, + 5.1742000579833984 + ], + "hints": { + "index": 9857 + } + }, + { + "items": [ + 5459.5, + 5.7470002174377441 + ], + "hints": { + "index": 9858 + } + }, + { + "items": [ + 5460, + 6.63539981842041 + ], + "hints": { + "index": 9859 + } + }, + { + "items": [ + 5460.5, + 7.62309980392456 + ], + "hints": { + "index": 9860 + } + }, + { + "items": [ + 5461, + 7.38640022277832 + ], + "hints": { + "index": 9861 + } + }, + { + "items": [ + 5461.5, + 7.0911002159118652 + ], + "hints": { + "index": 9862 + } + }, + { + "items": [ + 5462, + 6.5097 + ], + "hints": { + "index": 9863 + } + }, + { + "items": [ + 5462.5, + 6.0107 + ], + "hints": { + "index": 9864 + } + }, + { + "items": [ + 5463, + 5.7449 + ], + "hints": { + "index": 9865 + } + }, + { + "items": [ + 5463.5, + 6.0714 + ], + "hints": { + "index": 9866 + } + }, + { + "items": [ + 5464, + 6.3384 + ], + "hints": { + "index": 9867 + } + }, + { + "items": [ + 5464.5, + 6.2044 + ], + "hints": { + "index": 9868 + } + }, + { + "items": [ + 5465, + 5.7331 + ], + "hints": { + "index": 9869 + } + }, + { + "items": [ + 5465.5, + 5.1907 + ], + "hints": { + "index": 9870 + } + }, + { + "items": [ + 5466, + 5.0459 + ], + "hints": { + "index": 9871 + } + }, + { + "items": [ + 5466.5, + 4.5757 + ], + "hints": { + "index": 9872 + } + }, + { + "items": [ + 5467, + 5.5029 + ], + "hints": { + "index": 9873 + } + }, + { + "items": [ + 5467.5, + 6.0676 + ], + "hints": { + "index": 9874 + } + }, + { + "items": [ + 5468, + 6.8038 + ], + "hints": { + "index": 9875 + } + }, + { + "items": [ + 5468.5, + 6.8638 + ], + "hints": { + "index": 9876 + } + }, + { + "items": [ + 5469, + 7.3591 + ], + "hints": { + "index": 9877 + } + }, + { + "items": [ + 5469.5, + 7.4539 + ], + "hints": { + "index": 9878 + } + }, + { + "items": [ + 5470, + 6.3923 + ], + "hints": { + "index": 9879 + } + }, + { + "items": [ + 5470.5, + 5.4281 + ], + "hints": { + "index": 9880 + } + }, + { + "items": [ + 5471, + 4.8521 + ], + "hints": { + "index": 9881 + } + }, + { + "items": [ + 5471.5, + 4.5941 + ], + "hints": { + "index": 9882 + } + }, + { + "items": [ + 5472, + 4.4237 + ], + "hints": { + "index": 9883 + } + }, + { + "items": [ + 5472.5, + 4.4632000923156738 + ], + "hints": { + "index": 9884 + } + }, + { + "items": [ + 5473, + 4.4453 + ], + "hints": { + "index": 9885 + } + }, + { + "items": [ + 5473.5, + 4.4664998054504395 + ], + "hints": { + "index": 9886 + } + }, + { + "items": [ + 5474, + 4.6185 + ], + "hints": { + "index": 9887 + } + }, + { + "items": [ + 5474.5, + 5.0488 + ], + "hints": { + "index": 9888 + } + }, + { + "items": [ + 5475, + 5.17 + ], + "hints": { + "index": 9889 + } + }, + { + "items": [ + 5475.5, + 5.7557 + ], + "hints": { + "index": 9890 + } + }, + { + "items": [ + 5476, + 6.1500000953674316 + ], + "hints": { + "index": 9891 + } + }, + { + "items": [ + 5476.5, + 7.2039999961853027 + ], + "hints": { + "index": 9892 + } + }, + { + "items": [ + 5477, + 7.1848001480102539 + ], + "hints": { + "index": 9893 + } + }, + { + "items": [ + 5477.5, + 6.3309001922607422 + ], + "hints": { + "index": 9894 + } + }, + { + "items": [ + 5478, + 5.0538997650146484 + ], + "hints": { + "index": 9895 + } + }, + { + "items": [ + 5478.5, + 4.38040018081665 + ], + "hints": { + "index": 9896 + } + }, + { + "items": [ + 5479, + 4.0926 + ], + "hints": { + "index": 9897 + } + }, + { + "items": [ + 5479.5, + 3.8268001079559326 + ], + "hints": { + "index": 9898 + } + }, + { + "items": [ + 5480, + 3.7241 + ], + "hints": { + "index": 9899 + } + }, + { + "items": [ + 5480.5, + 3.6507000923156734 + ], + "hints": { + "index": 9900 + } + }, + { + "items": [ + 5481, + 3.8843998908996582 + ], + "hints": { + "index": 9901 + } + }, + { + "items": [ + 5481.5, + 3.8973 + ], + "hints": { + "index": 9902 + } + }, + { + "items": [ + 5482, + 4.0782 + ], + "hints": { + "index": 9903 + } + }, + { + "items": [ + 5482.5, + 4.0258998870849609 + ], + "hints": { + "index": 9904 + } + }, + { + "items": [ + 5483, + 4.2417 + ], + "hints": { + "index": 9905 + } + }, + { + "items": [ + 5483.5, + 4.1044998168945313 + ], + "hints": { + "index": 9906 + } + }, + { + "items": [ + 5484, + 4.337 + ], + "hints": { + "index": 9907 + } + }, + { + "items": [ + 5484.5, + 4.425 + ], + "hints": { + "index": 9908 + } + }, + { + "items": [ + 5485, + 4.531 + ], + "hints": { + "index": 9909 + } + }, + { + "items": [ + 5485.5, + 4.54290008544922 + ], + "hints": { + "index": 9910 + } + }, + { + "items": [ + 5486, + 4.5546 + ], + "hints": { + "index": 9911 + } + }, + { + "items": [ + 5486.5, + 4.4871 + ], + "hints": { + "index": 9912 + } + }, + { + "items": [ + 5487, + 4.30649995803833 + ], + "hints": { + "index": 9913 + } + }, + { + "items": [ + 5487.5, + 4.3378 + ], + "hints": { + "index": 9914 + } + }, + { + "items": [ + 5488, + 4.2593998908996582 + ], + "hints": { + "index": 9915 + } + }, + { + "items": [ + 5488.5, + 4.1873002052307129 + ], + "hints": { + "index": 9916 + } + }, + { + "items": [ + 5489, + 4.0149 + ], + "hints": { + "index": 9917 + } + }, + { + "items": [ + 5489.5, + 4.3428 + ], + "hints": { + "index": 9918 + } + }, + { + "items": [ + 5490, + 4.9229001998901367 + ], + "hints": { + "index": 9919 + } + }, + { + "items": [ + 5490.5, + 4.7877 + ], + "hints": { + "index": 9920 + } + }, + { + "items": [ + 5491, + 4.3998 + ], + "hints": { + "index": 9921 + } + }, + { + "items": [ + 5491.5, + 4.082 + ], + "hints": { + "index": 9922 + } + }, + { + "items": [ + 5492, + 4.5203 + ], + "hints": { + "index": 9923 + } + }, + { + "items": [ + 5492.5, + 4.9514 + ], + "hints": { + "index": 9924 + } + }, + { + "items": [ + 5493, + 5.0979 + ], + "hints": { + "index": 9925 + } + }, + { + "items": [ + 5493.5, + 4.8702 + ], + "hints": { + "index": 9926 + } + }, + { + "items": [ + 5494, + 4.87470006942749 + ], + "hints": { + "index": 9927 + } + }, + { + "items": [ + 5494.5, + 4.8812 + ], + "hints": { + "index": 9928 + } + }, + { + "items": [ + 5495, + 5.1366000175476074 + ], + "hints": { + "index": 9929 + } + }, + { + "items": [ + 5495.5, + 5.4318 + ], + "hints": { + "index": 9930 + } + }, + { + "items": [ + 5496, + 5.5946998596191406 + ], + "hints": { + "index": 9931 + } + }, + { + "items": [ + 5496.5, + 5.167600154876709 + ], + "hints": { + "index": 9932 + } + }, + { + "items": [ + 5497, + 4.8667 + ], + "hints": { + "index": 9933 + } + }, + { + "items": [ + 5497.5, + 4.8982 + ], + "hints": { + "index": 9934 + } + }, + { + "items": [ + 5498, + 4.9653 + ], + "hints": { + "index": 9935 + } + }, + { + "items": [ + 5498.5, + 4.8714 + ], + "hints": { + "index": 9936 + } + }, + { + "items": [ + 5499, + 5.2185 + ], + "hints": { + "index": 9937 + } + }, + { + "items": [ + 5499.5, + 5.1427 + ], + "hints": { + "index": 9938 + } + }, + { + "items": [ + 5500, + 4.9120001792907715 + ], + "hints": { + "index": 9939 + } + }, + { + "items": [ + 5500.5, + 4.433800220489502 + ], + "hints": { + "index": 9940 + } + }, + { + "items": [ + 5501, + 4.29580020904541 + ], + "hints": { + "index": 9941 + } + }, + { + "items": [ + 5501.5, + 4.4816999435424805 + ], + "hints": { + "index": 9942 + } + }, + { + "items": [ + 5502, + 4.5394001007080078 + ], + "hints": { + "index": 9943 + } + }, + { + "items": [ + 5502.5, + 4.7836999893188477 + ], + "hints": { + "index": 9944 + } + }, + { + "items": [ + 5503, + 4.68779993057251 + ], + "hints": { + "index": 9945 + } + }, + { + "items": [ + 5503.5, + 4.3818001747131348 + ], + "hints": { + "index": 9946 + } + }, + { + "items": [ + 5504, + 4.2108001708984375 + ], + "hints": { + "index": 9947 + } + }, + { + "items": [ + 5504.5, + 3.86680006980896 + ], + "hints": { + "index": 9948 + } + }, + { + "items": [ + 5505, + 3.5573000907897949 + ], + "hints": { + "index": 9949 + } + }, + { + "items": [ + 5505.5, + 3.4930000305175781 + ], + "hints": { + "index": 9950 + } + }, + { + "items": [ + 5506, + 3.8689999580383305 + ], + "hints": { + "index": 9951 + } + }, + { + "items": [ + 5506.5, + 4.89139986038208 + ], + "hints": { + "index": 9952 + } + }, + { + "items": [ + 5507, + 6.7347002029418945 + ], + "hints": { + "index": 9953 + } + }, + { + "items": [ + 5507.5, + 10.310400009155272 + ], + "hints": { + "index": 9954 + } + }, + { + "items": [ + 5508, + 10.8934 + ], + "hints": { + "index": 9955 + } + }, + { + "items": [ + 5508.5, + 7.876 + ], + "hints": { + "index": 9956 + } + }, + { + "items": [ + 5509, + 4.8348 + ], + "hints": { + "index": 9957 + } + }, + { + "items": [ + 5509.5, + 4.0886 + ], + "hints": { + "index": 9958 + } + }, + { + "items": [ + 5510, + 3.7116 + ], + "hints": { + "index": 9959 + } + }, + { + "items": [ + 5510.5, + 3.7335 + ], + "hints": { + "index": 9960 + } + }, + { + "items": [ + 5511, + 3.5754 + ], + "hints": { + "index": 9961 + } + }, + { + "items": [ + 5511.5, + 3.8479 + ], + "hints": { + "index": 9962 + } + }, + { + "items": [ + 5512, + 4.51609992980957 + ], + "hints": { + "index": 9963 + } + }, + { + "items": [ + 5512.5, + 5.5694999694824219 + ], + "hints": { + "index": 9964 + } + }, + { + "items": [ + 5513, + 5.4563999176025391 + ], + "hints": { + "index": 9965 + } + }, + { + "items": [ + 5513.5, + 4.723599910736084 + ], + "hints": { + "index": 9966 + } + }, + { + "items": [ + 5514, + 4.07420015335083 + ], + "hints": { + "index": 9967 + } + }, + { + "items": [ + 5514.5, + 3.901400089263916 + ], + "hints": { + "index": 9968 + } + }, + { + "items": [ + 5515, + 3.9746999740600586 + ], + "hints": { + "index": 9969 + } + }, + { + "items": [ + 5515.5, + 4.1781997680664063 + ], + "hints": { + "index": 9970 + } + }, + { + "items": [ + 5516, + 4.2392997741699219 + ], + "hints": { + "index": 9971 + } + }, + { + "items": [ + 5516.5, + 4.1314001083374023 + ], + "hints": { + "index": 9972 + } + }, + { + "items": [ + 5517, + 4.0022001266479492 + ], + "hints": { + "index": 9973 + } + }, + { + "items": [ + 5517.5, + 4.2329001426696777 + ], + "hints": { + "index": 9974 + } + }, + { + "items": [ + 5518, + 4.526400089263916 + ], + "hints": { + "index": 9975 + } + }, + { + "items": [ + 5518.5, + 4.5004000663757324 + ], + "hints": { + "index": 9976 + } + }, + { + "items": [ + 5519, + 4.3145999908447266 + ], + "hints": { + "index": 9977 + } + }, + { + "items": [ + 5519.5, + 4.3527 + ], + "hints": { + "index": 9978 + } + }, + { + "items": [ + 5520, + 4.8084001541137695 + ], + "hints": { + "index": 9979 + } + }, + { + "items": [ + 5520.5, + 4.7712998390197754 + ], + "hints": { + "index": 9980 + } + }, + { + "items": [ + 5521, + 4.4043 + ], + "hints": { + "index": 9981 + } + }, + { + "items": [ + 5521.5, + 4.1753997802734375 + ], + "hints": { + "index": 9982 + } + }, + { + "items": [ + 5522, + 4.2305 + ], + "hints": { + "index": 9983 + } + }, + { + "items": [ + 5522.5, + 4.21 + ], + "hints": { + "index": 9984 + } + }, + { + "items": [ + 5523, + 4.1153 + ], + "hints": { + "index": 9985 + } + }, + { + "items": [ + 5523.5, + 4.0159997940063477 + ], + "hints": { + "index": 9986 + } + }, + { + "items": [ + 5524, + 4.1909999847412109 + ], + "hints": { + "index": 9987 + } + }, + { + "items": [ + 5524.5, + 4.4407000541687012 + ], + "hints": { + "index": 9988 + } + }, + { + "items": [ + 5525, + 4.6545000076293945 + ], + "hints": { + "index": 9989 + } + }, + { + "items": [ + 5525.5, + 4.7934999465942383 + ], + "hints": { + "index": 9990 + } + }, + { + "items": [ + 5526, + 4.6118001937866211 + ], + "hints": { + "index": 9991 + } + }, + { + "items": [ + 5526.5, + 4.6216998100280762 + ], + "hints": { + "index": 9992 + } + }, + { + "items": [ + 5527, + 4.71750020980835 + ], + "hints": { + "index": 9993 + } + }, + { + "items": [ + 5527.5, + 5.0795998573303223 + ], + "hints": { + "index": 9994 + } + }, + { + "items": [ + 5528, + 5.6381001472473145 + ], + "hints": { + "index": 9995 + } + }, + { + "items": [ + 5528.5, + 6.0170001983642578 + ], + "hints": { + "index": 9996 + } + }, + { + "items": [ + 5529, + 6.28249979019165 + ], + "hints": { + "index": 9997 + } + }, + { + "items": [ + 5529.5, + 6.3731999397277832 + ], + "hints": { + "index": 9998 + } + }, + { + "items": [ + 5530, + 6.3695001602172852 + ], + "hints": { + "index": 9999 + } + }, + { + "items": [ + 5530.5, + 6.2239999771118164 + ], + "hints": { + "index": 10000 + } + }, + { + "items": [ + 5531, + 6.2188000679016113 + ], + "hints": { + "index": 10001 + } + }, + { + "items": [ + 5531.5, + 7.8534002304077148 + ], + "hints": { + "index": 10002 + } + }, + { + "items": [ + 5532, + 10.008000373840332 + ], + "hints": { + "index": 10003 + } + }, + { + "items": [ + 5532.5, + 13.357099533081056 + ], + "hints": { + "index": 10004 + } + }, + { + "items": [ + 5533, + 15.827099800109863 + ], + "hints": { + "index": 10005 + } + }, + { + "items": [ + 5533.5, + 17.842800140380859 + ], + "hints": { + "index": 10006 + } + }, + { + "items": [ + 5534, + 17.351999282836914 + ], + "hints": { + "index": 10007 + } + }, + { + "items": [ + 5534.5, + 15.526399612426758 + ], + "hints": { + "index": 10008 + } + }, + { + "items": [ + 5535, + 13.464300155639648 + ], + "hints": { + "index": 10009 + } + }, + { + "items": [ + 5535.5, + 10.12399959564209 + ], + "hints": { + "index": 10010 + } + }, + { + "items": [ + 5536, + 8.21150016784668 + ], + "hints": { + "index": 10011 + } + }, + { + "items": [ + 5536.5, + 8.055999755859375 + ], + "hints": { + "index": 10012 + } + }, + { + "items": [ + 5537, + 9.5684 + ], + "hints": { + "index": 10013 + } + }, + { + "items": [ + 5537.5, + 11.81190013885498 + ], + "hints": { + "index": 10014 + } + }, + { + "items": [ + 5538, + 14.8012 + ], + "hints": { + "index": 10015 + } + }, + { + "items": [ + 5538.5, + 17.6899 + ], + "hints": { + "index": 10016 + } + }, + { + "items": [ + 5539, + 16.0779 + ], + "hints": { + "index": 10017 + } + }, + { + "items": [ + 5539.5, + 13.9182 + ], + "hints": { + "index": 10018 + } + }, + { + "items": [ + 5540, + 15.291399955749512 + ], + "hints": { + "index": 10019 + } + }, + { + "items": [ + 5540.5, + 21.1389 + ], + "hints": { + "index": 10020 + } + }, + { + "items": [ + 5541, + 30.7784 + ], + "hints": { + "index": 10021 + } + }, + { + "items": [ + 5541.5, + 36.6622 + ], + "hints": { + "index": 10022 + } + }, + { + "items": [ + 5542, + 37.472999572753906 + ], + "hints": { + "index": 10023 + } + }, + { + "items": [ + 5542.5, + 36.3501 + ], + "hints": { + "index": 10024 + } + }, + { + "items": [ + 5543, + 38.0422 + ], + "hints": { + "index": 10025 + } + }, + { + "items": [ + 5543.5, + 36.0357 + ], + "hints": { + "index": 10026 + } + }, + { + "items": [ + 5544, + 35.864299774169922 + ], + "hints": { + "index": 10027 + } + }, + { + "items": [ + 5544.5, + 32.410301208496094 + ], + "hints": { + "index": 10028 + } + }, + { + "items": [ + 5545, + 32.0275 + ], + "hints": { + "index": 10029 + } + }, + { + "items": [ + 5545.5, + 31.757299423217773 + ], + "hints": { + "index": 10030 + } + }, + { + "items": [ + 5546, + 34.389 + ], + "hints": { + "index": 10031 + } + }, + { + "items": [ + 5546.5, + 36.9167 + ], + "hints": { + "index": 10032 + } + }, + { + "items": [ + 5547, + 39.2072 + ], + "hints": { + "index": 10033 + } + }, + { + "items": [ + 5547.5, + 38.399 + ], + "hints": { + "index": 10034 + } + }, + { + "items": [ + 5548, + 34.438499450683594 + ], + "hints": { + "index": 10035 + } + }, + { + "items": [ + 5548.5, + 27.1453 + ], + "hints": { + "index": 10036 + } + }, + { + "items": [ + 5549, + 17.944 + ], + "hints": { + "index": 10037 + } + }, + { + "items": [ + 5549.5, + 12.7751 + ], + "hints": { + "index": 10038 + } + }, + { + "items": [ + 5550, + 12.008199691772459 + ], + "hints": { + "index": 10039 + } + }, + { + "items": [ + 5550.5, + 13.2955 + ], + "hints": { + "index": 10040 + } + }, + { + "items": [ + 5551, + 13.1242 + ], + "hints": { + "index": 10041 + } + }, + { + "items": [ + 5551.5, + 8.5528 + ], + "hints": { + "index": 10042 + } + }, + { + "items": [ + 5552, + 6.0591001510620117 + ], + "hints": { + "index": 10043 + } + }, + { + "items": [ + 5552.5, + 5.6918001174926758 + ], + "hints": { + "index": 10044 + } + }, + { + "items": [ + 5553, + 6.3181 + ], + "hints": { + "index": 10045 + } + }, + { + "items": [ + 5553.5, + 8.13759994506836 + ], + "hints": { + "index": 10046 + } + }, + { + "items": [ + 5554, + 9.6665000915527344 + ], + "hints": { + "index": 10047 + } + }, + { + "items": [ + 5554.5, + 10.418700218200684 + ], + "hints": { + "index": 10048 + } + }, + { + "items": [ + 5555, + 9.9083003997802734 + ], + "hints": { + "index": 10049 + } + }, + { + "items": [ + 5555.5, + 9.264 + ], + "hints": { + "index": 10050 + } + }, + { + "items": [ + 5556, + 8.8346996307373047 + ], + "hints": { + "index": 10051 + } + }, + { + "items": [ + 5556.5, + 8.6212 + ], + "hints": { + "index": 10052 + } + }, + { + "items": [ + 5557, + 8.4663000106811523 + ], + "hints": { + "index": 10053 + } + }, + { + "items": [ + 5557.5, + 7.0064 + ], + "hints": { + "index": 10054 + } + }, + { + "items": [ + 5558, + 6.4472 + ], + "hints": { + "index": 10055 + } + }, + { + "items": [ + 5558.5, + 5.9788 + ], + "hints": { + "index": 10056 + } + }, + { + "items": [ + 5559, + 7.0195 + ], + "hints": { + "index": 10057 + } + }, + { + "items": [ + 5559.5, + 7.3453001976013184 + ], + "hints": { + "index": 10058 + } + }, + { + "items": [ + 5560, + 8.3385 + ], + "hints": { + "index": 10059 + } + }, + { + "items": [ + 5560.5, + 9.7556 + ], + "hints": { + "index": 10060 + } + }, + { + "items": [ + 5561, + 12.5979 + ], + "hints": { + "index": 10061 + } + }, + { + "items": [ + 5561.5, + 14.529 + ], + "hints": { + "index": 10062 + } + }, + { + "items": [ + 5562, + 13.224100112915041 + ], + "hints": { + "index": 10063 + } + }, + { + "items": [ + 5562.5, + 11.845199584960938 + ], + "hints": { + "index": 10064 + } + }, + { + "items": [ + 5563, + 10.4665 + ], + "hints": { + "index": 10065 + } + }, + { + "items": [ + 5563.5, + 8.6612997055053711 + ], + "hints": { + "index": 10066 + } + }, + { + "items": [ + 5564, + 7.3875 + ], + "hints": { + "index": 10067 + } + }, + { + "items": [ + 5564.5, + 8.0394 + ], + "hints": { + "index": 10068 + } + }, + { + "items": [ + 5565, + 7.874000072479248 + ], + "hints": { + "index": 10069 + } + }, + { + "items": [ + 5565.5, + 7.7595 + ], + "hints": { + "index": 10070 + } + }, + { + "items": [ + 5566, + 7.6674 + ], + "hints": { + "index": 10071 + } + }, + { + "items": [ + 5566.5, + 8.093 + ], + "hints": { + "index": 10072 + } + }, + { + "items": [ + 5567, + 8.4046 + ], + "hints": { + "index": 10073 + } + }, + { + "items": [ + 5567.5, + 7.6709 + ], + "hints": { + "index": 10074 + } + }, + { + "items": [ + 5568, + 8.62559986114502 + ], + "hints": { + "index": 10075 + } + }, + { + "items": [ + 5568.5, + 10.96619987487793 + ], + "hints": { + "index": 10076 + } + }, + { + "items": [ + 5569, + 13.6827 + ], + "hints": { + "index": 10077 + } + }, + { + "items": [ + 5569.5, + 16.3314 + ], + "hints": { + "index": 10078 + } + }, + { + "items": [ + 5570, + 14.881600379943848 + ], + "hints": { + "index": 10079 + } + }, + { + "items": [ + 5570.5, + 12.6171 + ], + "hints": { + "index": 10080 + } + }, + { + "items": [ + 5571, + 10.106800079345703 + ], + "hints": { + "index": 10081 + } + }, + { + "items": [ + 5571.5, + 9.856 + ], + "hints": { + "index": 10082 + } + }, + { + "items": [ + 5572, + 11.208499908447266 + ], + "hints": { + "index": 10083 + } + }, + { + "items": [ + 5572.5, + 14.329000473022459 + ], + "hints": { + "index": 10084 + } + }, + { + "items": [ + 5573, + 16.8516 + ], + "hints": { + "index": 10085 + } + }, + { + "items": [ + 5573.5, + 19.6019 + ], + "hints": { + "index": 10086 + } + }, + { + "items": [ + 5574, + 23.3711 + ], + "hints": { + "index": 10087 + } + }, + { + "items": [ + 5574.5, + 29.1797 + ], + "hints": { + "index": 10088 + } + }, + { + "items": [ + 5575, + 32.2232 + ], + "hints": { + "index": 10089 + } + }, + { + "items": [ + 5575.5, + 32.3987 + ], + "hints": { + "index": 10090 + } + }, + { + "items": [ + 5576, + 33.759498596191406 + ], + "hints": { + "index": 10091 + } + }, + { + "items": [ + 5576.5, + 32.100200653076172 + ], + "hints": { + "index": 10092 + } + }, + { + "items": [ + 5577, + 32.254398345947266 + ], + "hints": { + "index": 10093 + } + }, + { + "items": [ + 5577.5, + 31.0261 + ], + "hints": { + "index": 10094 + } + }, + { + "items": [ + 5578, + 30.8576 + ], + "hints": { + "index": 10095 + } + }, + { + "items": [ + 5578.5, + 30.1309 + ], + "hints": { + "index": 10096 + } + }, + { + "items": [ + 5579, + 31.5489 + ], + "hints": { + "index": 10097 + } + }, + { + "items": [ + 5579.5, + 28.115 + ], + "hints": { + "index": 10098 + } + }, + { + "items": [ + 5580, + 24.6251 + ], + "hints": { + "index": 10099 + } + }, + { + "items": [ + 5580.5, + 19.1756 + ], + "hints": { + "index": 10100 + } + }, + { + "items": [ + 5581, + 18.9034 + ], + "hints": { + "index": 10101 + } + }, + { + "items": [ + 5581.5, + 17.368 + ], + "hints": { + "index": 10102 + } + }, + { + "items": [ + 5582, + 18.6876 + ], + "hints": { + "index": 10103 + } + }, + { + "items": [ + 5582.5, + 21.0406 + ], + "hints": { + "index": 10104 + } + }, + { + "items": [ + 5583, + 24.8064 + ], + "hints": { + "index": 10105 + } + }, + { + "items": [ + 5583.5, + 27.8465 + ], + "hints": { + "index": 10106 + } + }, + { + "items": [ + 5584, + 25.50200080871582 + ], + "hints": { + "index": 10107 + } + }, + { + "items": [ + 5584.5, + 18.570699691772461 + ], + "hints": { + "index": 10108 + } + }, + { + "items": [ + 5585, + 12.7076 + ], + "hints": { + "index": 10109 + } + }, + { + "items": [ + 5585.5, + 10.5147 + ], + "hints": { + "index": 10110 + } + }, + { + "items": [ + 5586, + 11.687000274658203 + ], + "hints": { + "index": 10111 + } + }, + { + "items": [ + 5586.5, + 14.7196 + ], + "hints": { + "index": 10112 + } + }, + { + "items": [ + 5587, + 20.113000869750977 + ], + "hints": { + "index": 10113 + } + }, + { + "items": [ + 5587.5, + 24.98900032043457 + ], + "hints": { + "index": 10114 + } + }, + { + "items": [ + 5588, + 30.1809 + ], + "hints": { + "index": 10115 + } + }, + { + "items": [ + 5588.5, + 31.0918 + ], + "hints": { + "index": 10116 + } + }, + { + "items": [ + 5589, + 31.2967 + ], + "hints": { + "index": 10117 + } + }, + { + "items": [ + 5589.5, + 31.87299919128418 + ], + "hints": { + "index": 10118 + } + }, + { + "items": [ + 5590, + 28.933300018310547 + ], + "hints": { + "index": 10119 + } + }, + { + "items": [ + 5590.5, + 13.075200080871582 + ], + "hints": { + "index": 10120 + } + }, + { + "items": [ + 5591, + 11.004500389099119 + ], + "hints": { + "index": 10121 + } + }, + { + "items": [ + 5591.5, + 11.5672 + ], + "hints": { + "index": 10122 + } + }, + { + "items": [ + 5592, + 20.01569938659668 + ], + "hints": { + "index": 10123 + } + }, + { + "items": [ + 5592.5, + 29.1837 + ], + "hints": { + "index": 10124 + } + }, + { + "items": [ + 5593, + 35.724998474121094 + ], + "hints": { + "index": 10125 + } + }, + { + "items": [ + 5593.5, + 34.9098014831543 + ], + "hints": { + "index": 10126 + } + }, + { + "items": [ + 5594, + 32.541900634765625 + ], + "hints": { + "index": 10127 + } + }, + { + "items": [ + 5594.5, + 29.831 + ], + "hints": { + "index": 10128 + } + }, + { + "items": [ + 5595, + 14.513400077819824 + ], + "hints": { + "index": 10129 + } + }, + { + "items": [ + 5595.5, + 8.8233 + ], + "hints": { + "index": 10130 + } + }, + { + "items": [ + 5596, + 6.453 + ], + "hints": { + "index": 10131 + } + }, + { + "items": [ + 5596.5, + 6.2666 + ], + "hints": { + "index": 10132 + } + }, + { + "items": [ + 5597, + 5.8999 + ], + "hints": { + "index": 10133 + } + }, + { + "items": [ + 5597.5, + 6.8011 + ], + "hints": { + "index": 10134 + } + }, + { + "items": [ + 5598, + 8.9605 + ], + "hints": { + "index": 10135 + } + }, + { + "items": [ + 5598.5, + 14.4494 + ], + "hints": { + "index": 10136 + } + }, + { + "items": [ + 5599, + 21.5438 + ], + "hints": { + "index": 10137 + } + }, + { + "items": [ + 5599.5, + 22.835399627685547 + ], + "hints": { + "index": 10138 + } + }, + { + "items": [ + 5600, + 21.031200408935547 + ], + "hints": { + "index": 10139 + } + }, + { + "items": [ + 5600.5, + 16.6014 + ], + "hints": { + "index": 10140 + } + }, + { + "items": [ + 5601, + 17.527 + ], + "hints": { + "index": 10141 + } + }, + { + "items": [ + 5601.5, + 21.3432 + ], + "hints": { + "index": 10142 + } + }, + { + "items": [ + 5602, + 29.3272 + ], + "hints": { + "index": 10143 + } + }, + { + "items": [ + 5602.5, + 25.5826 + ], + "hints": { + "index": 10144 + } + }, + { + "items": [ + 5603, + 16.6986 + ], + "hints": { + "index": 10145 + } + }, + { + "items": [ + 5603.5, + 11.860600471496582 + ], + "hints": { + "index": 10146 + } + }, + { + "items": [ + 5604, + 9.7319 + ], + "hints": { + "index": 10147 + } + }, + { + "items": [ + 5604.5, + 9.8337 + ], + "hints": { + "index": 10148 + } + }, + { + "items": [ + 5605, + 9.3443 + ], + "hints": { + "index": 10149 + } + }, + { + "items": [ + 5605.5, + 11.021900177001951 + ], + "hints": { + "index": 10150 + } + }, + { + "items": [ + 5606, + 14.0104 + ], + "hints": { + "index": 10151 + } + }, + { + "items": [ + 5606.5, + 20.8257 + ], + "hints": { + "index": 10152 + } + }, + { + "items": [ + 5607, + 21.8384 + ], + "hints": { + "index": 10153 + } + }, + { + "items": [ + 5607.5, + 18.355600357055664 + ], + "hints": { + "index": 10154 + } + }, + { + "items": [ + 5608, + 18.863300323486328 + ], + "hints": { + "index": 10155 + } + }, + { + "items": [ + 5608.5, + 19.838899612426761 + ], + "hints": { + "index": 10156 + } + }, + { + "items": [ + 5609, + 15.5643 + ], + "hints": { + "index": 10157 + } + }, + { + "items": [ + 5609.5, + 10.598 + ], + "hints": { + "index": 10158 + } + }, + { + "items": [ + 5610, + 7.5407 + ], + "hints": { + "index": 10159 + } + }, + { + "items": [ + 5610.5, + 6.1619 + ], + "hints": { + "index": 10160 + } + }, + { + "items": [ + 5611, + 5.1779 + ], + "hints": { + "index": 10161 + } + }, + { + "items": [ + 5611.5, + 5.2446999549865723 + ], + "hints": { + "index": 10162 + } + }, + { + "items": [ + 5612, + 5.5612001419067383 + ], + "hints": { + "index": 10163 + } + }, + { + "items": [ + 5612.5, + 6.2182 + ], + "hints": { + "index": 10164 + } + }, + { + "items": [ + 5613, + 5.855 + ], + "hints": { + "index": 10165 + } + }, + { + "items": [ + 5613.5, + 5.9981999397277832 + ], + "hints": { + "index": 10166 + } + }, + { + "items": [ + 5614, + 6.1762 + ], + "hints": { + "index": 10167 + } + }, + { + "items": [ + 5614.5, + 5.6663999557495117 + ], + "hints": { + "index": 10168 + } + }, + { + "items": [ + 5615, + 5.157599925994873 + ], + "hints": { + "index": 10169 + } + }, + { + "items": [ + 5615.5, + 4.9230999946594238 + ], + "hints": { + "index": 10170 + } + }, + { + "items": [ + 5616, + 5.5900998115539551 + ], + "hints": { + "index": 10171 + } + }, + { + "items": [ + 5616.5, + 6.5862998962402344 + ], + "hints": { + "index": 10172 + } + }, + { + "items": [ + 5617, + 6.1665 + ], + "hints": { + "index": 10173 + } + }, + { + "items": [ + 5617.5, + 6.647 + ], + "hints": { + "index": 10174 + } + }, + { + "items": [ + 5618, + 6.4493 + ], + "hints": { + "index": 10175 + } + }, + { + "items": [ + 5618.5, + 6.4156 + ], + "hints": { + "index": 10176 + } + }, + { + "items": [ + 5619, + 5.6115999221801758 + ], + "hints": { + "index": 10177 + } + }, + { + "items": [ + 5619.5, + 5.2557 + ], + "hints": { + "index": 10178 + } + }, + { + "items": [ + 5620, + 6.3042001724243164 + ], + "hints": { + "index": 10179 + } + }, + { + "items": [ + 5620.5, + 8.5263004302978516 + ], + "hints": { + "index": 10180 + } + }, + { + "items": [ + 5621, + 12.41800022125244 + ], + "hints": { + "index": 10181 + } + }, + { + "items": [ + 5621.5, + 16.568300247192383 + ], + "hints": { + "index": 10182 + } + }, + { + "items": [ + 5622, + 16.199199676513672 + ], + "hints": { + "index": 10183 + } + }, + { + "items": [ + 5622.5, + 12.534099578857422 + ], + "hints": { + "index": 10184 + } + }, + { + "items": [ + 5623, + 9.7795000076293945 + ], + "hints": { + "index": 10185 + } + }, + { + "items": [ + 5623.5, + 9.1559 + ], + "hints": { + "index": 10186 + } + }, + { + "items": [ + 5624, + 9.552 + ], + "hints": { + "index": 10187 + } + }, + { + "items": [ + 5624.5, + 11.1267 + ], + "hints": { + "index": 10188 + } + }, + { + "items": [ + 5625, + 11.7225 + ], + "hints": { + "index": 10189 + } + }, + { + "items": [ + 5625.5, + 13.730400085449221 + ], + "hints": { + "index": 10190 + } + }, + { + "items": [ + 5626, + 13.6203 + ], + "hints": { + "index": 10191 + } + }, + { + "items": [ + 5626.5, + 12.1335 + ], + "hints": { + "index": 10192 + } + }, + { + "items": [ + 5627, + 9.5159 + ], + "hints": { + "index": 10193 + } + }, + { + "items": [ + 5627.5, + 9.53030014038086 + ], + "hints": { + "index": 10194 + } + }, + { + "items": [ + 5628, + 10.8819 + ], + "hints": { + "index": 10195 + } + }, + { + "items": [ + 5628.5, + 12.216 + ], + "hints": { + "index": 10196 + } + }, + { + "items": [ + 5629, + 9.2737 + ], + "hints": { + "index": 10197 + } + }, + { + "items": [ + 5629.5, + 6.7493 + ], + "hints": { + "index": 10198 + } + }, + { + "items": [ + 5630, + 6.4558 + ], + "hints": { + "index": 10199 + } + }, + { + "items": [ + 5630.5, + 7.7419 + ], + "hints": { + "index": 10200 + } + }, + { + "items": [ + 5631, + 10.7465 + ], + "hints": { + "index": 10201 + } + }, + { + "items": [ + 5631.5, + 13.3955 + ], + "hints": { + "index": 10202 + } + }, + { + "items": [ + 5632, + 11.970399856567385 + ], + "hints": { + "index": 10203 + } + }, + { + "items": [ + 5632.5, + 10.165900230407717 + ], + "hints": { + "index": 10204 + } + }, + { + "items": [ + 5633, + 8.448699951171875 + ], + "hints": { + "index": 10205 + } + }, + { + "items": [ + 5633.5, + 6.992800235748291 + ], + "hints": { + "index": 10206 + } + }, + { + "items": [ + 5634, + 5.7354001998901367 + ], + "hints": { + "index": 10207 + } + }, + { + "items": [ + 5634.5, + 5.5331001281738281 + ], + "hints": { + "index": 10208 + } + }, + { + "items": [ + 5635, + 6.1431999206542969 + ], + "hints": { + "index": 10209 + } + }, + { + "items": [ + 5635.5, + 6.1489 + ], + "hints": { + "index": 10210 + } + }, + { + "items": [ + 5636, + 6.0107 + ], + "hints": { + "index": 10211 + } + }, + { + "items": [ + 5636.5, + 6.1139 + ], + "hints": { + "index": 10212 + } + }, + { + "items": [ + 5637, + 7.5448999404907235 + ], + "hints": { + "index": 10213 + } + }, + { + "items": [ + 5637.5, + 8.1778 + ], + "hints": { + "index": 10214 + } + }, + { + "items": [ + 5638, + 8.1295995712280273 + ], + "hints": { + "index": 10215 + } + }, + { + "items": [ + 5638.5, + 6.4082 + ], + "hints": { + "index": 10216 + } + }, + { + "items": [ + 5639, + 5.9578 + ], + "hints": { + "index": 10217 + } + }, + { + "items": [ + 5639.5, + 5.4519 + ], + "hints": { + "index": 10218 + } + }, + { + "items": [ + 5640, + 6.0100998878479 + ], + "hints": { + "index": 10219 + } + }, + { + "items": [ + 5640.5, + 5.67579984664917 + ], + "hints": { + "index": 10220 + } + }, + { + "items": [ + 5641, + 4.939 + ], + "hints": { + "index": 10221 + } + }, + { + "items": [ + 5641.5, + 4.8031997680664063 + ], + "hints": { + "index": 10222 + } + }, + { + "items": [ + 5642, + 5.5431 + ], + "hints": { + "index": 10223 + } + }, + { + "items": [ + 5642.5, + 7.1581 + ], + "hints": { + "index": 10224 + } + }, + { + "items": [ + 5643, + 7.822700023651123 + ], + "hints": { + "index": 10225 + } + }, + { + "items": [ + 5643.5, + 7.63390016555786 + ], + "hints": { + "index": 10226 + } + }, + { + "items": [ + 5644, + 8.1705999374389648 + ], + "hints": { + "index": 10227 + } + }, + { + "items": [ + 5644.5, + 10.1646 + ], + "hints": { + "index": 10228 + } + }, + { + "items": [ + 5645, + 13.7356 + ], + "hints": { + "index": 10229 + } + }, + { + "items": [ + 5645.5, + 17.0837 + ], + "hints": { + "index": 10230 + } + }, + { + "items": [ + 5646, + 18.0104 + ], + "hints": { + "index": 10231 + } + }, + { + "items": [ + 5646.5, + 14.608599662780762 + ], + "hints": { + "index": 10232 + } + }, + { + "items": [ + 5647, + 13.634799957275392 + ], + "hints": { + "index": 10233 + } + }, + { + "items": [ + 5647.5, + 10.19 + ], + "hints": { + "index": 10234 + } + }, + { + "items": [ + 5648, + 9.0064 + ], + "hints": { + "index": 10235 + } + }, + { + "items": [ + 5648.5, + 9.5839996337890625 + ], + "hints": { + "index": 10236 + } + }, + { + "items": [ + 5649, + 12.1617 + ], + "hints": { + "index": 10237 + } + }, + { + "items": [ + 5649.5, + 16.729 + ], + "hints": { + "index": 10238 + } + }, + { + "items": [ + 5650, + 14.70580005645752 + ], + "hints": { + "index": 10239 + } + }, + { + "items": [ + 5650.5, + 11.884300231933594 + ], + "hints": { + "index": 10240 + } + }, + { + "items": [ + 5651, + 11.0624 + ], + "hints": { + "index": 10241 + } + }, + { + "items": [ + 5651.5, + 9.7644 + ], + "hints": { + "index": 10242 + } + }, + { + "items": [ + 5652, + 10.560999870300291 + ], + "hints": { + "index": 10243 + } + }, + { + "items": [ + 5652.5, + 9.9483995437622088 + ], + "hints": { + "index": 10244 + } + }, + { + "items": [ + 5653, + 10.757900238037108 + ], + "hints": { + "index": 10245 + } + }, + { + "items": [ + 5653.5, + 10.3951997756958 + ], + "hints": { + "index": 10246 + } + }, + { + "items": [ + 5654, + 8.6057 + ], + "hints": { + "index": 10247 + } + }, + { + "items": [ + 5654.5, + 8.4994 + ], + "hints": { + "index": 10248 + } + }, + { + "items": [ + 5655, + 9.4823999404907227 + ], + "hints": { + "index": 10249 + } + }, + { + "items": [ + 5655.5, + 11.824000358581545 + ], + "hints": { + "index": 10250 + } + }, + { + "items": [ + 5656, + 11.656 + ], + "hints": { + "index": 10251 + } + }, + { + "items": [ + 5656.5, + 9.6498 + ], + "hints": { + "index": 10252 + } + }, + { + "items": [ + 5657, + 10.3532 + ], + "hints": { + "index": 10253 + } + }, + { + "items": [ + 5657.5, + 13.4379 + ], + "hints": { + "index": 10254 + } + }, + { + "items": [ + 5658, + 17.0231 + ], + "hints": { + "index": 10255 + } + }, + { + "items": [ + 5658.5, + 16.2125 + ], + "hints": { + "index": 10256 + } + }, + { + "items": [ + 5659, + 11.9078 + ], + "hints": { + "index": 10257 + } + }, + { + "items": [ + 5659.5, + 9.3599 + ], + "hints": { + "index": 10258 + } + }, + { + "items": [ + 5660, + 9.251 + ], + "hints": { + "index": 10259 + } + }, + { + "items": [ + 5660.5, + 9.4483995437622088 + ], + "hints": { + "index": 10260 + } + }, + { + "items": [ + 5661, + 10.034 + ], + "hints": { + "index": 10261 + } + }, + { + "items": [ + 5661.5, + 10.5869 + ], + "hints": { + "index": 10262 + } + }, + { + "items": [ + 5662, + 9.5722 + ], + "hints": { + "index": 10263 + } + }, + { + "items": [ + 5662.5, + 10.10099983215332 + ], + "hints": { + "index": 10264 + } + }, + { + "items": [ + 5663, + 9.8192 + ], + "hints": { + "index": 10265 + } + }, + { + "items": [ + 5663.5, + 12.135299682617188 + ], + "hints": { + "index": 10266 + } + }, + { + "items": [ + 5664, + 14.161100387573242 + ], + "hints": { + "index": 10267 + } + }, + { + "items": [ + 5664.5, + 14.1456 + ], + "hints": { + "index": 10268 + } + }, + { + "items": [ + 5665, + 12.4568 + ], + "hints": { + "index": 10269 + } + }, + { + "items": [ + 5665.5, + 8.7597 + ], + "hints": { + "index": 10270 + } + }, + { + "items": [ + 5666, + 8.7271 + ], + "hints": { + "index": 10271 + } + }, + { + "items": [ + 5666.5, + 9.8493003845214844 + ], + "hints": { + "index": 10272 + } + }, + { + "items": [ + 5667, + 10.963899612426758 + ], + "hints": { + "index": 10273 + } + }, + { + "items": [ + 5667.5, + 8.7235 + ], + "hints": { + "index": 10274 + } + }, + { + "items": [ + 5668, + 7.510200023651123 + ], + "hints": { + "index": 10275 + } + }, + { + "items": [ + 5668.5, + 7.4434 + ], + "hints": { + "index": 10276 + } + }, + { + "items": [ + 5669, + 7.0548000335693359 + ], + "hints": { + "index": 10277 + } + }, + { + "items": [ + 5669.5, + 6.233799934387207 + ], + "hints": { + "index": 10278 + } + }, + { + "items": [ + 5670, + 5.288599967956543 + ], + "hints": { + "index": 10279 + } + }, + { + "items": [ + 5670.5, + 5.5867 + ], + "hints": { + "index": 10280 + } + }, + { + "items": [ + 5671, + 5.7533998489379883 + ], + "hints": { + "index": 10281 + } + }, + { + "items": [ + 5671.5, + 6.0432 + ], + "hints": { + "index": 10282 + } + }, + { + "items": [ + 5672, + 5.0374 + ], + "hints": { + "index": 10283 + } + }, + { + "items": [ + 5672.5, + 4.3905 + ], + "hints": { + "index": 10284 + } + }, + { + "items": [ + 5673, + 4.1844 + ], + "hints": { + "index": 10285 + } + }, + { + "items": [ + 5673.5, + 5.6468 + ], + "hints": { + "index": 10286 + } + }, + { + "items": [ + 5674, + 11.2531 + ], + "hints": { + "index": 10287 + } + }, + { + "items": [ + 5674.5, + 16.0338 + ], + "hints": { + "index": 10288 + } + }, + { + "items": [ + 5675, + 26.8126 + ], + "hints": { + "index": 10289 + } + }, + { + "items": [ + 5675.5, + 26.3011 + ], + "hints": { + "index": 10290 + } + }, + { + "items": [ + 5676, + 23.2718 + ], + "hints": { + "index": 10291 + } + }, + { + "items": [ + 5676.5, + 16.5502 + ], + "hints": { + "index": 10292 + } + }, + { + "items": [ + 5677, + 14.3315 + ], + "hints": { + "index": 10293 + } + }, + { + "items": [ + 5677.5, + 13.5562 + ], + "hints": { + "index": 10294 + } + }, + { + "items": [ + 5678, + 11.8104 + ], + "hints": { + "index": 10295 + } + }, + { + "items": [ + 5678.5, + 9.5476 + ], + "hints": { + "index": 10296 + } + }, + { + "items": [ + 5679, + 8.128 + ], + "hints": { + "index": 10297 + } + }, + { + "items": [ + 5679.5, + 8.1018 + ], + "hints": { + "index": 10298 + } + }, + { + "items": [ + 5680, + 8.1559000015258789 + ], + "hints": { + "index": 10299 + } + }, + { + "items": [ + 5680.5, + 8.2695999145507813 + ], + "hints": { + "index": 10300 + } + }, + { + "items": [ + 5681, + 7.9513001441955566 + ], + "hints": { + "index": 10301 + } + }, + { + "items": [ + 5681.5, + 7.29990005493164 + ], + "hints": { + "index": 10302 + } + }, + { + "items": [ + 5682, + 8.2961997985839844 + ], + "hints": { + "index": 10303 + } + }, + { + "items": [ + 5682.5, + 10.003499984741213 + ], + "hints": { + "index": 10304 + } + }, + { + "items": [ + 5683, + 9.3256998062133789 + ], + "hints": { + "index": 10305 + } + }, + { + "items": [ + 5683.5, + 7.4307999610900879 + ], + "hints": { + "index": 10306 + } + }, + { + "items": [ + 5684, + 7.2649998664855948 + ], + "hints": { + "index": 10307 + } + }, + { + "items": [ + 5684.5, + 9.3931999206542969 + ], + "hints": { + "index": 10308 + } + }, + { + "items": [ + 5685, + 11.708800315856934 + ], + "hints": { + "index": 10309 + } + }, + { + "items": [ + 5685.5, + 11.042799949645996 + ], + "hints": { + "index": 10310 + } + }, + { + "items": [ + 5686, + 9.7264995574951172 + ], + "hints": { + "index": 10311 + } + }, + { + "items": [ + 5686.5, + 8.90779972076416 + ], + "hints": { + "index": 10312 + } + }, + { + "items": [ + 5687, + 8.663599967956543 + ], + "hints": { + "index": 10313 + } + }, + { + "items": [ + 5687.5, + 8.312800407409668 + ], + "hints": { + "index": 10314 + } + }, + { + "items": [ + 5688, + 7.3376998901367188 + ], + "hints": { + "index": 10315 + } + }, + { + "items": [ + 5688.5, + 6.3347997665405273 + ], + "hints": { + "index": 10316 + } + }, + { + "items": [ + 5689, + 6.315000057220459 + ], + "hints": { + "index": 10317 + } + }, + { + "items": [ + 5689.5, + 6.4713997840881348 + ], + "hints": { + "index": 10318 + } + }, + { + "items": [ + 5690, + 6.9261999130249023 + ], + "hints": { + "index": 10319 + } + }, + { + "items": [ + 5690.5, + 6.3033 + ], + "hints": { + "index": 10320 + } + }, + { + "items": [ + 5691, + 6.0533 + ], + "hints": { + "index": 10321 + } + }, + { + "items": [ + 5691.5, + 6.25629997253418 + ], + "hints": { + "index": 10322 + } + }, + { + "items": [ + 5692, + 6.5328998565673828 + ], + "hints": { + "index": 10323 + } + }, + { + "items": [ + 5692.5, + 6.8736 + ], + "hints": { + "index": 10324 + } + }, + { + "items": [ + 5693, + 6.6279 + ], + "hints": { + "index": 10325 + } + }, + { + "items": [ + 5693.5, + 6.10699987411499 + ], + "hints": { + "index": 10326 + } + }, + { + "items": [ + 5694, + 5.6981 + ], + "hints": { + "index": 10327 + } + }, + { + "items": [ + 5694.5, + 5.4635 + ], + "hints": { + "index": 10328 + } + }, + { + "items": [ + 5695, + 5.7810001373291016 + ], + "hints": { + "index": 10329 + } + }, + { + "items": [ + 5695.5, + 6.1883001327514648 + ], + "hints": { + "index": 10330 + } + }, + { + "items": [ + 5696, + 6.31279993057251 + ], + "hints": { + "index": 10331 + } + }, + { + "items": [ + 5696.5, + 5.713900089263916 + ], + "hints": { + "index": 10332 + } + }, + { + "items": [ + 5697, + 5.3993000984191895 + ], + "hints": { + "index": 10333 + } + }, + { + "items": [ + 5697.5, + 4.9809999465942383 + ], + "hints": { + "index": 10334 + } + }, + { + "items": [ + 5698, + 5.3017997741699219 + ], + "hints": { + "index": 10335 + } + }, + { + "items": [ + 5698.5, + 4.9470000267028809 + ], + "hints": { + "index": 10336 + } + }, + { + "items": [ + 5699, + 5.1287999153137207 + ], + "hints": { + "index": 10337 + } + }, + { + "items": [ + 5699.5, + 4.9644 + ], + "hints": { + "index": 10338 + } + }, + { + "items": [ + 5700, + 5.0156 + ], + "hints": { + "index": 10339 + } + }, + { + "items": [ + 5700.5, + 5.004 + ], + "hints": { + "index": 10340 + } + }, + { + "items": [ + 5701, + 4.9684 + ], + "hints": { + "index": 10341 + } + }, + { + "items": [ + 5701.5, + 5.0938 + ], + "hints": { + "index": 10342 + } + }, + { + "items": [ + 5702, + 5.1654 + ], + "hints": { + "index": 10343 + } + }, + { + "items": [ + 5702.5, + 4.8232 + ], + "hints": { + "index": 10344 + } + }, + { + "items": [ + 5703, + 4.7866001129150391 + ], + "hints": { + "index": 10345 + } + }, + { + "items": [ + 5703.5, + 4.6487998962402344 + ], + "hints": { + "index": 10346 + } + }, + { + "items": [ + 5704, + 5.4699001312255859 + ], + "hints": { + "index": 10347 + } + }, + { + "items": [ + 5704.5, + 5.8906 + ], + "hints": { + "index": 10348 + } + }, + { + "items": [ + 5705, + 5.9305 + ], + "hints": { + "index": 10349 + } + }, + { + "items": [ + 5705.5, + 5.0799999237060547 + ], + "hints": { + "index": 10350 + } + }, + { + "items": [ + 5706, + 4.9722 + ], + "hints": { + "index": 10351 + } + }, + { + "items": [ + 5706.5, + 4.6332 + ], + "hints": { + "index": 10352 + } + }, + { + "items": [ + 5707, + 4.407 + ], + "hints": { + "index": 10353 + } + }, + { + "items": [ + 5707.5, + 4.2434 + ], + "hints": { + "index": 10354 + } + }, + { + "items": [ + 5708, + 5.0724000930786133 + ], + "hints": { + "index": 10355 + } + }, + { + "items": [ + 5708.5, + 6.5191001892089844 + ], + "hints": { + "index": 10356 + } + }, + { + "items": [ + 5709, + 7.8539 + ], + "hints": { + "index": 10357 + } + }, + { + "items": [ + 5709.5, + 8.6393003463745117 + ], + "hints": { + "index": 10358 + } + }, + { + "items": [ + 5710, + 8.711700439453125 + ], + "hints": { + "index": 10359 + } + }, + { + "items": [ + 5710.5, + 7.2898 + ], + "hints": { + "index": 10360 + } + }, + { + "items": [ + 5711, + 5.5 + ], + "hints": { + "index": 10361 + } + }, + { + "items": [ + 5711.5, + 5.0783 + ], + "hints": { + "index": 10362 + } + }, + { + "items": [ + 5712, + 5.2239 + ], + "hints": { + "index": 10363 + } + }, + { + "items": [ + 5712.5, + 5.92579984664917 + ], + "hints": { + "index": 10364 + } + }, + { + "items": [ + 5713, + 6.0265 + ], + "hints": { + "index": 10365 + } + }, + { + "items": [ + 5713.5, + 6.7239 + ], + "hints": { + "index": 10366 + } + }, + { + "items": [ + 5714, + 6.7195 + ], + "hints": { + "index": 10367 + } + }, + { + "items": [ + 5714.5, + 6.9780998229980469 + ], + "hints": { + "index": 10368 + } + }, + { + "items": [ + 5715, + 6.9092 + ], + "hints": { + "index": 10369 + } + }, + { + "items": [ + 5715.5, + 8.298100471496582 + ], + "hints": { + "index": 10370 + } + }, + { + "items": [ + 5716, + 8.883 + ], + "hints": { + "index": 10371 + } + }, + { + "items": [ + 5716.5, + 11.0016 + ], + "hints": { + "index": 10372 + } + }, + { + "items": [ + 5717, + 12.0031 + ], + "hints": { + "index": 10373 + } + }, + { + "items": [ + 5717.5, + 12.9901 + ], + "hints": { + "index": 10374 + } + }, + { + "items": [ + 5718, + 12.5488 + ], + "hints": { + "index": 10375 + } + }, + { + "items": [ + 5718.5, + 13.3581 + ], + "hints": { + "index": 10376 + } + }, + { + "items": [ + 5719, + 13.369999885559082 + ], + "hints": { + "index": 10377 + } + }, + { + "items": [ + 5719.5, + 11.769000053405762 + ], + "hints": { + "index": 10378 + } + }, + { + "items": [ + 5720, + 9.4693 + ], + "hints": { + "index": 10379 + } + }, + { + "items": [ + 5720.5, + 8.3793001174926758 + ], + "hints": { + "index": 10380 + } + }, + { + "items": [ + 5721, + 8.0893 + ], + "hints": { + "index": 10381 + } + }, + { + "items": [ + 5721.5, + 8.4586000442504883 + ], + "hints": { + "index": 10382 + } + }, + { + "items": [ + 5722, + 10.1944 + ], + "hints": { + "index": 10383 + } + }, + { + "items": [ + 5722.5, + 10.6802 + ], + "hints": { + "index": 10384 + } + }, + { + "items": [ + 5723, + 11.54419994354248 + ], + "hints": { + "index": 10385 + } + }, + { + "items": [ + 5723.5, + 12.300399780273438 + ], + "hints": { + "index": 10386 + } + }, + { + "items": [ + 5724, + 15.474399566650392 + ], + "hints": { + "index": 10387 + } + }, + { + "items": [ + 5724.5, + 17.880500793457031 + ], + "hints": { + "index": 10388 + } + }, + { + "items": [ + 5725, + 17.715200424194336 + ], + "hints": { + "index": 10389 + } + }, + { + "items": [ + 5725.5, + 16.234199523925781 + ], + "hints": { + "index": 10390 + } + }, + { + "items": [ + 5726, + 14.5331 + ], + "hints": { + "index": 10391 + } + }, + { + "items": [ + 5726.5, + 13.1407 + ], + "hints": { + "index": 10392 + } + }, + { + "items": [ + 5727, + 12.0628 + ], + "hints": { + "index": 10393 + } + }, + { + "items": [ + 5727.5, + 9.6389 + ], + "hints": { + "index": 10394 + } + }, + { + "items": [ + 5728, + 9.5474 + ], + "hints": { + "index": 10395 + } + }, + { + "items": [ + 5728.5, + 10.6242 + ], + "hints": { + "index": 10396 + } + }, + { + "items": [ + 5729, + 14.3591 + ], + "hints": { + "index": 10397 + } + }, + { + "items": [ + 5729.5, + 18.535900115966797 + ], + "hints": { + "index": 10398 + } + }, + { + "items": [ + 5730, + 21.414499282836911 + ], + "hints": { + "index": 10399 + } + }, + { + "items": [ + 5730.5, + 23.181400299072266 + ], + "hints": { + "index": 10400 + } + }, + { + "items": [ + 5731, + 21.464300155639648 + ], + "hints": { + "index": 10401 + } + }, + { + "items": [ + 5731.5, + 20.3168 + ], + "hints": { + "index": 10402 + } + }, + { + "items": [ + 5732, + 17.8501 + ], + "hints": { + "index": 10403 + } + }, + { + "items": [ + 5732.5, + 16.1471004486084 + ], + "hints": { + "index": 10404 + } + }, + { + "items": [ + 5733, + 16.0579 + ], + "hints": { + "index": 10405 + } + }, + { + "items": [ + 5733.5, + 17.218799591064453 + ], + "hints": { + "index": 10406 + } + }, + { + "items": [ + 5734, + 16.1668 + ], + "hints": { + "index": 10407 + } + }, + { + "items": [ + 5734.5, + 13.0859 + ], + "hints": { + "index": 10408 + } + }, + { + "items": [ + 5735, + 12.121 + ], + "hints": { + "index": 10409 + } + }, + { + "items": [ + 5735.5, + 14.4789 + ], + "hints": { + "index": 10410 + } + }, + { + "items": [ + 5736, + 17.35 + ], + "hints": { + "index": 10411 + } + }, + { + "items": [ + 5736.5, + 18.4855 + ], + "hints": { + "index": 10412 + } + }, + { + "items": [ + 5737, + 18.0945 + ], + "hints": { + "index": 10413 + } + }, + { + "items": [ + 5737.5, + 20.66 + ], + "hints": { + "index": 10414 + } + }, + { + "items": [ + 5738, + 26.638999938964844 + ], + "hints": { + "index": 10415 + } + }, + { + "items": [ + 5738.5, + 29.628799438476559 + ], + "hints": { + "index": 10416 + } + }, + { + "items": [ + 5739, + 28.7089 + ], + "hints": { + "index": 10417 + } + }, + { + "items": [ + 5739.5, + 29.103900909423828 + ], + "hints": { + "index": 10418 + } + }, + { + "items": [ + 5740, + 30.0673 + ], + "hints": { + "index": 10419 + } + }, + { + "items": [ + 5740.5, + 31.3077 + ], + "hints": { + "index": 10420 + } + }, + { + "items": [ + 5741, + 30.9761 + ], + "hints": { + "index": 10421 + } + }, + { + "items": [ + 5741.5, + 30.819499969482425 + ], + "hints": { + "index": 10422 + } + }, + { + "items": [ + 5742, + 32.9121 + ], + "hints": { + "index": 10423 + } + }, + { + "items": [ + 5742.5, + 33.7122 + ], + "hints": { + "index": 10424 + } + }, + { + "items": [ + 5743, + 34.6897 + ], + "hints": { + "index": 10425 + } + }, + { + "items": [ + 5743.5, + 38.4484 + ], + "hints": { + "index": 10426 + } + }, + { + "items": [ + 5744, + 42.288101196289063 + ], + "hints": { + "index": 10427 + } + }, + { + "items": [ + 5744.5, + 44.561599731445313 + ], + "hints": { + "index": 10428 + } + }, + { + "items": [ + 5745, + 36.5231 + ], + "hints": { + "index": 10429 + } + }, + { + "items": [ + 5745.5, + 26.677999496459961 + ], + "hints": { + "index": 10430 + } + }, + { + "items": [ + 5746, + 23.136199951171875 + ], + "hints": { + "index": 10431 + } + }, + { + "items": [ + 5746.5, + 23.239599227905273 + ], + "hints": { + "index": 10432 + } + }, + { + "items": [ + 5747, + 26.117399215698239 + ], + "hints": { + "index": 10433 + } + }, + { + "items": [ + 5747.5, + 29.4172 + ], + "hints": { + "index": 10434 + } + }, + { + "items": [ + 5748, + 33.220500946044922 + ], + "hints": { + "index": 10435 + } + }, + { + "items": [ + 5748.5, + 39.1876 + ], + "hints": { + "index": 10436 + } + }, + { + "items": [ + 5749, + 42.3212 + ], + "hints": { + "index": 10437 + } + }, + { + "items": [ + 5749.5, + 35.662998199462891 + ], + "hints": { + "index": 10438 + } + }, + { + "items": [ + 5750, + 33.3502 + ], + "hints": { + "index": 10439 + } + }, + { + "items": [ + 5750.5, + 31.5616 + ], + "hints": { + "index": 10440 + } + }, + { + "items": [ + 5751, + 32.4756 + ], + "hints": { + "index": 10441 + } + }, + { + "items": [ + 5751.5, + 26.7537 + ], + "hints": { + "index": 10442 + } + }, + { + "items": [ + 5752, + 29.1328 + ], + "hints": { + "index": 10443 + } + }, + { + "items": [ + 5752.5, + 30.618200302124023 + ], + "hints": { + "index": 10444 + } + }, + { + "items": [ + 5753, + 37.8192 + ], + "hints": { + "index": 10445 + } + }, + { + "items": [ + 5753.5, + 35.4378 + ], + "hints": { + "index": 10446 + } + }, + { + "items": [ + 5754, + 38.5844 + ], + "hints": { + "index": 10447 + } + }, + { + "items": [ + 5754.5, + 34.422698974609375 + ], + "hints": { + "index": 10448 + } + }, + { + "items": [ + 5755, + 34.292800903320313 + ], + "hints": { + "index": 10449 + } + }, + { + "items": [ + 5755.5, + 33.571 + ], + "hints": { + "index": 10450 + } + }, + { + "items": [ + 5756, + 41.583099365234375 + ], + "hints": { + "index": 10451 + } + }, + { + "items": [ + 5756.5, + 41.938499450683594 + ], + "hints": { + "index": 10452 + } + }, + { + "items": [ + 5757, + 43.889598846435547 + ], + "hints": { + "index": 10453 + } + }, + { + "items": [ + 5757.5, + 41.9724 + ], + "hints": { + "index": 10454 + } + }, + { + "items": [ + 5758, + 43.699600219726563 + ], + "hints": { + "index": 10455 + } + }, + { + "items": [ + 5758.5, + 42.484001159667969 + ], + "hints": { + "index": 10456 + } + }, + { + "items": [ + 5759, + 37.563499450683594 + ], + "hints": { + "index": 10457 + } + }, + { + "items": [ + 5759.5, + 32.186100006103516 + ], + "hints": { + "index": 10458 + } + }, + { + "items": [ + 5760, + 32.299701690673828 + ], + "hints": { + "index": 10459 + } + }, + { + "items": [ + 5760.5, + 34.151298522949219 + ], + "hints": { + "index": 10460 + } + }, + { + "items": [ + 5761, + 38.2404 + ], + "hints": { + "index": 10461 + } + }, + { + "items": [ + 5761.5, + 36.9405 + ], + "hints": { + "index": 10462 + } + }, + { + "items": [ + 5762, + 33.088 + ], + "hints": { + "index": 10463 + } + }, + { + "items": [ + 5762.5, + 29.343099594116211 + ], + "hints": { + "index": 10464 + } + }, + { + "items": [ + 5763, + 27.402200698852539 + ], + "hints": { + "index": 10465 + } + }, + { + "items": [ + 5763.5, + 30.572099685668945 + ], + "hints": { + "index": 10466 + } + }, + { + "items": [ + 5764, + 34.954200744628906 + ], + "hints": { + "index": 10467 + } + }, + { + "items": [ + 5764.5, + 33.890598297119141 + ], + "hints": { + "index": 10468 + } + }, + { + "items": [ + 5765, + 31.47960090637207 + ], + "hints": { + "index": 10469 + } + }, + { + "items": [ + 5765.5, + 27.0887 + ], + "hints": { + "index": 10470 + } + }, + { + "items": [ + 5766, + 30.3365 + ], + "hints": { + "index": 10471 + } + }, + { + "items": [ + 5766.5, + 29.6759 + ], + "hints": { + "index": 10472 + } + }, + { + "items": [ + 5767, + 33.7463 + ], + "hints": { + "index": 10473 + } + }, + { + "items": [ + 5767.5, + 32.3817 + ], + "hints": { + "index": 10474 + } + }, + { + "items": [ + 5768, + 34.8087 + ], + "hints": { + "index": 10475 + } + }, + { + "items": [ + 5768.5, + 32.6275 + ], + "hints": { + "index": 10476 + } + }, + { + "items": [ + 5769, + 31.4865 + ], + "hints": { + "index": 10477 + } + }, + { + "items": [ + 5769.5, + 31.8535 + ], + "hints": { + "index": 10478 + } + }, + { + "items": [ + 5770, + 31.6477 + ], + "hints": { + "index": 10479 + } + }, + { + "items": [ + 5770.5, + 27.8972 + ], + "hints": { + "index": 10480 + } + }, + { + "items": [ + 5771, + 25.492900848388672 + ], + "hints": { + "index": 10481 + } + }, + { + "items": [ + 5771.5, + 23.4988 + ], + "hints": { + "index": 10482 + } + }, + { + "items": [ + 5772, + 26.4268 + ], + "hints": { + "index": 10483 + } + }, + { + "items": [ + 5772.5, + 28.65410041809082 + ], + "hints": { + "index": 10484 + } + }, + { + "items": [ + 5773, + 34.8843994140625 + ], + "hints": { + "index": 10485 + } + }, + { + "items": [ + 5773.5, + 37.2988 + ], + "hints": { + "index": 10486 + } + }, + { + "items": [ + 5774, + 35.4640998840332 + ], + "hints": { + "index": 10487 + } + }, + { + "items": [ + 5774.5, + 30.941 + ], + "hints": { + "index": 10488 + } + }, + { + "items": [ + 5775, + 28.872699737548828 + ], + "hints": { + "index": 10489 + } + }, + { + "items": [ + 5775.5, + 30.4855 + ], + "hints": { + "index": 10490 + } + }, + { + "items": [ + 5776, + 31.50670051574707 + ], + "hints": { + "index": 10491 + } + }, + { + "items": [ + 5776.5, + 34.368099212646484 + ], + "hints": { + "index": 10492 + } + }, + { + "items": [ + 5777, + 31.366 + ], + "hints": { + "index": 10493 + } + }, + { + "items": [ + 5777.5, + 35.922298431396484 + ], + "hints": { + "index": 10494 + } + }, + { + "items": [ + 5778, + 37.831001281738281 + ], + "hints": { + "index": 10495 + } + }, + { + "items": [ + 5778.5, + 38.7059 + ], + "hints": { + "index": 10496 + } + }, + { + "items": [ + 5779, + 28.2528 + ], + "hints": { + "index": 10497 + } + }, + { + "items": [ + 5779.5, + 20.5925 + ], + "hints": { + "index": 10498 + } + }, + { + "items": [ + 5780, + 15.3962 + ], + "hints": { + "index": 10499 + } + }, + { + "items": [ + 5780.5, + 14.0103 + ], + "hints": { + "index": 10500 + } + }, + { + "items": [ + 5781, + 14.688899993896484 + ], + "hints": { + "index": 10501 + } + }, + { + "items": [ + 5781.5, + 15.8161 + ], + "hints": { + "index": 10502 + } + }, + { + "items": [ + 5782, + 16.3466 + ], + "hints": { + "index": 10503 + } + }, + { + "items": [ + 5782.5, + 14.692700386047363 + ], + "hints": { + "index": 10504 + } + }, + { + "items": [ + 5783, + 12.464500427246094 + ], + "hints": { + "index": 10505 + } + }, + { + "items": [ + 5783.5, + 9.5008001327514648 + ], + "hints": { + "index": 10506 + } + }, + { + "items": [ + 5784, + 8.1287 + ], + "hints": { + "index": 10507 + } + }, + { + "items": [ + 5784.5, + 7.2744998931884766 + ], + "hints": { + "index": 10508 + } + }, + { + "items": [ + 5785, + 6.7323999404907227 + ], + "hints": { + "index": 10509 + } + }, + { + "items": [ + 5785.5, + 6.2839999198913574 + ], + "hints": { + "index": 10510 + } + }, + { + "items": [ + 5786, + 6.6817002296447754 + ], + "hints": { + "index": 10511 + } + }, + { + "items": [ + 5786.5, + 7.5398998260498047 + ], + "hints": { + "index": 10512 + } + }, + { + "items": [ + 5787, + 7.5485 + ], + "hints": { + "index": 10513 + } + }, + { + "items": [ + 5787.5, + 6.163 + ], + "hints": { + "index": 10514 + } + }, + { + "items": [ + 5788, + 5.9065 + ], + "hints": { + "index": 10515 + } + }, + { + "items": [ + 5788.5, + 6.3422 + ], + "hints": { + "index": 10516 + } + }, + { + "items": [ + 5789, + 7.2293 + ], + "hints": { + "index": 10517 + } + }, + { + "items": [ + 5789.5, + 7.7654 + ], + "hints": { + "index": 10518 + } + }, + { + "items": [ + 5790, + 8.3419 + ], + "hints": { + "index": 10519 + } + }, + { + "items": [ + 5790.5, + 9.3509 + ], + "hints": { + "index": 10520 + } + }, + { + "items": [ + 5791, + 10.663299560546877 + ], + "hints": { + "index": 10521 + } + }, + { + "items": [ + 5791.5, + 11.105199813842772 + ], + "hints": { + "index": 10522 + } + }, + { + "items": [ + 5792, + 11.105199813842772 + ], + "hints": { + "index": 10523 + } + }, + { + "items": [ + 5792.5, + 10.814499855041504 + ], + "hints": { + "index": 10524 + } + }, + { + "items": [ + 5793, + 10.895500183105469 + ], + "hints": { + "index": 10525 + } + }, + { + "items": [ + 5793.5, + 10.801799774169922 + ], + "hints": { + "index": 10526 + } + }, + { + "items": [ + 5794, + 10.52810001373291 + ], + "hints": { + "index": 10527 + } + }, + { + "items": [ + 5794.5, + 9.0801000595092773 + ], + "hints": { + "index": 10528 + } + }, + { + "items": [ + 5795, + 8.6674995422363281 + ], + "hints": { + "index": 10529 + } + }, + { + "items": [ + 5795.5, + 7.803800106048584 + ], + "hints": { + "index": 10530 + } + }, + { + "items": [ + 5796, + 8.1751003265380859 + ], + "hints": { + "index": 10531 + } + }, + { + "items": [ + 5796.5, + 8.4244003295898438 + ], + "hints": { + "index": 10532 + } + }, + { + "items": [ + 5797, + 8.5830001831054688 + ], + "hints": { + "index": 10533 + } + }, + { + "items": [ + 5797.5, + 9.2044000625610352 + ], + "hints": { + "index": 10534 + } + }, + { + "items": [ + 5798, + 9.6211996078491211 + ], + "hints": { + "index": 10535 + } + }, + { + "items": [ + 5798.5, + 10.2483 + ], + "hints": { + "index": 10536 + } + }, + { + "items": [ + 5799, + 9.0840997695922852 + ], + "hints": { + "index": 10537 + } + }, + { + "items": [ + 5799.5, + 8.0657997131347656 + ], + "hints": { + "index": 10538 + } + }, + { + "items": [ + 5800, + 7.961900234222413 + ], + "hints": { + "index": 10539 + } + }, + { + "items": [ + 5800.5, + 9.0597000122070313 + ], + "hints": { + "index": 10540 + } + }, + { + "items": [ + 5801, + 10.386500358581545 + ], + "hints": { + "index": 10541 + } + }, + { + "items": [ + 5801.5, + 11.566900253295898 + ], + "hints": { + "index": 10542 + } + }, + { + "items": [ + 5802, + 11.411499977111816 + ], + "hints": { + "index": 10543 + } + }, + { + "items": [ + 5802.5, + 11.84969997406006 + ], + "hints": { + "index": 10544 + } + }, + { + "items": [ + 5803, + 12.178899765014648 + ], + "hints": { + "index": 10545 + } + }, + { + "items": [ + 5803.5, + 13.027500152587892 + ], + "hints": { + "index": 10546 + } + }, + { + "items": [ + 5804, + 13.9095 + ], + "hints": { + "index": 10547 + } + }, + { + "items": [ + 5804.5, + 12.9166 + ], + "hints": { + "index": 10548 + } + }, + { + "items": [ + 5805, + 11.6925 + ], + "hints": { + "index": 10549 + } + }, + { + "items": [ + 5805.5, + 11.3702 + ], + "hints": { + "index": 10550 + } + }, + { + "items": [ + 5806, + 13.4864 + ], + "hints": { + "index": 10551 + } + }, + { + "items": [ + 5806.5, + 15.0184 + ], + "hints": { + "index": 10552 + } + }, + { + "items": [ + 5807, + 14.9026 + ], + "hints": { + "index": 10553 + } + }, + { + "items": [ + 5807.5, + 12.1483 + ], + "hints": { + "index": 10554 + } + }, + { + "items": [ + 5808, + 9.5241 + ], + "hints": { + "index": 10555 + } + }, + { + "items": [ + 5808.5, + 9.0102 + ], + "hints": { + "index": 10556 + } + }, + { + "items": [ + 5809, + 9.8258 + ], + "hints": { + "index": 10557 + } + }, + { + "items": [ + 5809.5, + 12.4716 + ], + "hints": { + "index": 10558 + } + }, + { + "items": [ + 5810, + 13.8874 + ], + "hints": { + "index": 10559 + } + }, + { + "items": [ + 5810.5, + 14.7587 + ], + "hints": { + "index": 10560 + } + }, + { + "items": [ + 5811, + 16.2622 + ], + "hints": { + "index": 10561 + } + }, + { + "items": [ + 5811.5, + 18.1558 + ], + "hints": { + "index": 10562 + } + }, + { + "items": [ + 5812, + 14.729 + ], + "hints": { + "index": 10563 + } + }, + { + "items": [ + 5812.5, + 11.3324 + ], + "hints": { + "index": 10564 + } + }, + { + "items": [ + 5813, + 9.4137 + ], + "hints": { + "index": 10565 + } + }, + { + "items": [ + 5813.5, + 8.8485 + ], + "hints": { + "index": 10566 + } + }, + { + "items": [ + 5814, + 8.8298 + ], + "hints": { + "index": 10567 + } + }, + { + "items": [ + 5814.5, + 7.8297 + ], + "hints": { + "index": 10568 + } + }, + { + "items": [ + 5815, + 7.0019 + ], + "hints": { + "index": 10569 + } + }, + { + "items": [ + 5815.5, + 5.7313 + ], + "hints": { + "index": 10570 + } + }, + { + "items": [ + 5816, + 5.2386 + ], + "hints": { + "index": 10571 + } + }, + { + "items": [ + 5816.5, + 5.5739 + ], + "hints": { + "index": 10572 + } + }, + { + "items": [ + 5817, + 6.3026 + ], + "hints": { + "index": 10573 + } + }, + { + "items": [ + 5817.5, + 7.2641 + ], + "hints": { + "index": 10574 + } + }, + { + "items": [ + 5818, + 7.5354 + ], + "hints": { + "index": 10575 + } + }, + { + "items": [ + 5818.5, + 8.0673 + ], + "hints": { + "index": 10576 + } + }, + { + "items": [ + 5819, + 8.553 + ], + "hints": { + "index": 10577 + } + }, + { + "items": [ + 5819.5, + 7.692 + ], + "hints": { + "index": 10578 + } + }, + { + "items": [ + 5820, + 8.5679 + ], + "hints": { + "index": 10579 + } + }, + { + "items": [ + 5820.5, + 9.9226 + ], + "hints": { + "index": 10580 + } + }, + { + "items": [ + 5821, + 13.8171 + ], + "hints": { + "index": 10581 + } + }, + { + "items": [ + 5821.5, + 13.2858 + ], + "hints": { + "index": 10582 + } + }, + { + "items": [ + 5822, + 13.4246 + ], + "hints": { + "index": 10583 + } + }, + { + "items": [ + 5822.5, + 14.2316 + ], + "hints": { + "index": 10584 + } + }, + { + "items": [ + 5823, + 15.6133 + ], + "hints": { + "index": 10585 + } + }, + { + "items": [ + 5823.5, + 13.7929 + ], + "hints": { + "index": 10586 + } + }, + { + "items": [ + 5824, + 9.7313 + ], + "hints": { + "index": 10587 + } + }, + { + "items": [ + 5824.5, + 9.3072 + ], + "hints": { + "index": 10588 + } + }, + { + "items": [ + 5825, + 9.865300178527832 + ], + "hints": { + "index": 10589 + } + }, + { + "items": [ + 5825.5, + 13.447799682617188 + ], + "hints": { + "index": 10590 + } + }, + { + "items": [ + 5826, + 12.535799980163574 + ], + "hints": { + "index": 10591 + } + }, + { + "items": [ + 5826.5, + 11.860799789428713 + ], + "hints": { + "index": 10592 + } + }, + { + "items": [ + 5827, + 9.5455999374389648 + ], + "hints": { + "index": 10593 + } + }, + { + "items": [ + 5827.5, + 9.8002996444702148 + ], + "hints": { + "index": 10594 + } + }, + { + "items": [ + 5828, + 10.356399536132813 + ], + "hints": { + "index": 10595 + } + }, + { + "items": [ + 5828.5, + 13.020899772644045 + ], + "hints": { + "index": 10596 + } + }, + { + "items": [ + 5829, + 13.262800216674805 + ], + "hints": { + "index": 10597 + } + }, + { + "items": [ + 5829.5, + 13.021599769592283 + ], + "hints": { + "index": 10598 + } + }, + { + "items": [ + 5830, + 12.46150016784668 + ], + "hints": { + "index": 10599 + } + }, + { + "items": [ + 5830.5, + 12.576499938964844 + ], + "hints": { + "index": 10600 + } + }, + { + "items": [ + 5831, + 12.693400382995604 + ], + "hints": { + "index": 10601 + } + }, + { + "items": [ + 5831.5, + 14.530699729919434 + ], + "hints": { + "index": 10602 + } + }, + { + "items": [ + 5832, + 15.08489990234375 + ], + "hints": { + "index": 10603 + } + }, + { + "items": [ + 5832.5, + 16.580799102783203 + ], + "hints": { + "index": 10604 + } + }, + { + "items": [ + 5833, + 17.1742000579834 + ], + "hints": { + "index": 10605 + } + }, + { + "items": [ + 5833.5, + 16.1476993560791 + ], + "hints": { + "index": 10606 + } + }, + { + "items": [ + 5834, + 15.568300247192385 + ], + "hints": { + "index": 10607 + } + }, + { + "items": [ + 5834.5, + 15.818400382995604 + ], + "hints": { + "index": 10608 + } + }, + { + "items": [ + 5835, + 19.088300704956055 + ], + "hints": { + "index": 10609 + } + }, + { + "items": [ + 5835.5, + 19.976200103759769 + ], + "hints": { + "index": 10610 + } + }, + { + "items": [ + 5836, + 17.8389 + ], + "hints": { + "index": 10611 + } + }, + { + "items": [ + 5836.5, + 16.743 + ], + "hints": { + "index": 10612 + } + }, + { + "items": [ + 5837, + 16.3911 + ], + "hints": { + "index": 10613 + } + }, + { + "items": [ + 5837.5, + 18.876 + ], + "hints": { + "index": 10614 + } + }, + { + "items": [ + 5838, + 23.3366 + ], + "hints": { + "index": 10615 + } + }, + { + "items": [ + 5838.5, + 28.4035 + ], + "hints": { + "index": 10616 + } + }, + { + "items": [ + 5839, + 30.5208 + ], + "hints": { + "index": 10617 + } + }, + { + "items": [ + 5839.5, + 29.185 + ], + "hints": { + "index": 10618 + } + }, + { + "items": [ + 5840, + 27.0838 + ], + "hints": { + "index": 10619 + } + }, + { + "items": [ + 5840.5, + 25.883 + ], + "hints": { + "index": 10620 + } + }, + { + "items": [ + 5841, + 24.4548 + ], + "hints": { + "index": 10621 + } + }, + { + "items": [ + 5841.5, + 23.4491 + ], + "hints": { + "index": 10622 + } + }, + { + "items": [ + 5842, + 21.8534 + ], + "hints": { + "index": 10623 + } + }, + { + "items": [ + 5842.5, + 21.8278 + ], + "hints": { + "index": 10624 + } + }, + { + "items": [ + 5843, + 21.5002 + ], + "hints": { + "index": 10625 + } + }, + { + "items": [ + 5843.5, + 19.7684 + ], + "hints": { + "index": 10626 + } + }, + { + "items": [ + 5844, + 17.2948 + ], + "hints": { + "index": 10627 + } + }, + { + "items": [ + 5844.5, + 16.1896 + ], + "hints": { + "index": 10628 + } + }, + { + "items": [ + 5845, + 15.7613 + ], + "hints": { + "index": 10629 + } + }, + { + "items": [ + 5845.5, + 14.9424 + ], + "hints": { + "index": 10630 + } + }, + { + "items": [ + 5846, + 13.7473 + ], + "hints": { + "index": 10631 + } + }, + { + "items": [ + 5846.5, + 14.3807 + ], + "hints": { + "index": 10632 + } + }, + { + "items": [ + 5847, + 15.1439 + ], + "hints": { + "index": 10633 + } + }, + { + "items": [ + 5847.5, + 15.4022 + ], + "hints": { + "index": 10634 + } + }, + { + "items": [ + 5848, + 14.483 + ], + "hints": { + "index": 10635 + } + }, + { + "items": [ + 5848.5, + 13.6387 + ], + "hints": { + "index": 10636 + } + }, + { + "items": [ + 5849, + 12.938 + ], + "hints": { + "index": 10637 + } + }, + { + "items": [ + 5849.5, + 11.6675 + ], + "hints": { + "index": 10638 + } + }, + { + "items": [ + 5850, + 10.9335 + ], + "hints": { + "index": 10639 + } + }, + { + "items": [ + 5850.5, + 11.296 + ], + "hints": { + "index": 10640 + } + }, + { + "items": [ + 5851, + 12.4406 + ], + "hints": { + "index": 10641 + } + }, + { + "items": [ + 5851.5, + 12.8497 + ], + "hints": { + "index": 10642 + } + }, + { + "items": [ + 5852, + 14.480899810791016 + ], + "hints": { + "index": 10643 + } + }, + { + "items": [ + 5852.5, + 14.807700157165527 + ], + "hints": { + "index": 10644 + } + }, + { + "items": [ + 5853, + 17.670499801635742 + ], + "hints": { + "index": 10645 + } + }, + { + "items": [ + 5853.5, + 16.80419921875 + ], + "hints": { + "index": 10646 + } + }, + { + "items": [ + 5854, + 17.906099319458008 + ], + "hints": { + "index": 10647 + } + }, + { + "items": [ + 5854.5, + 15.8943 + ], + "hints": { + "index": 10648 + } + }, + { + "items": [ + 5855, + 14.586400032043455 + ], + "hints": { + "index": 10649 + } + }, + { + "items": [ + 5855.5, + 12.7937 + ], + "hints": { + "index": 10650 + } + }, + { + "items": [ + 5856, + 12.4568 + ], + "hints": { + "index": 10651 + } + }, + { + "items": [ + 5856.5, + 14.503700256347656 + ], + "hints": { + "index": 10652 + } + }, + { + "items": [ + 5857, + 17.252700805664063 + ], + "hints": { + "index": 10653 + } + }, + { + "items": [ + 5857.5, + 21.2955 + ], + "hints": { + "index": 10654 + } + }, + { + "items": [ + 5858, + 20.613399505615231 + ], + "hints": { + "index": 10655 + } + }, + { + "items": [ + 5858.5, + 17.0581 + ], + "hints": { + "index": 10656 + } + }, + { + "items": [ + 5859, + 15.332500457763672 + ], + "hints": { + "index": 10657 + } + }, + { + "items": [ + 5859.5, + 14.373000144958496 + ], + "hints": { + "index": 10658 + } + }, + { + "items": [ + 5860, + 14.8671 + ], + "hints": { + "index": 10659 + } + }, + { + "items": [ + 5860.5, + 12.328700065612791 + ], + "hints": { + "index": 10660 + } + }, + { + "items": [ + 5861, + 11.778499603271484 + ], + "hints": { + "index": 10661 + } + }, + { + "items": [ + 5861.5, + 11.4389 + ], + "hints": { + "index": 10662 + } + }, + { + "items": [ + 5862, + 12.6721 + ], + "hints": { + "index": 10663 + } + }, + { + "items": [ + 5862.5, + 13.347000122070313 + ], + "hints": { + "index": 10664 + } + }, + { + "items": [ + 5863, + 11.238200187683104 + ], + "hints": { + "index": 10665 + } + }, + { + "items": [ + 5863.5, + 9.2987003326416016 + ], + "hints": { + "index": 10666 + } + }, + { + "items": [ + 5864, + 7.4956 + ], + "hints": { + "index": 10667 + } + }, + { + "items": [ + 5864.5, + 6.9545 + ], + "hints": { + "index": 10668 + } + }, + { + "items": [ + 5865, + 6.6761999130249023 + ], + "hints": { + "index": 10669 + } + }, + { + "items": [ + 5865.5, + 6.3428 + ], + "hints": { + "index": 10670 + } + }, + { + "items": [ + 5866, + 6.0863 + ], + "hints": { + "index": 10671 + } + }, + { + "items": [ + 5866.5, + 5.5507001876831055 + ], + "hints": { + "index": 10672 + } + }, + { + "items": [ + 5867, + 5.5769000053405762 + ], + "hints": { + "index": 10673 + } + }, + { + "items": [ + 5867.5, + 5.4920001029968262 + ], + "hints": { + "index": 10674 + } + }, + { + "items": [ + 5868, + 5.7867 + ], + "hints": { + "index": 10675 + } + }, + { + "items": [ + 5868.5, + 6.0934000015258789 + ], + "hints": { + "index": 10676 + } + }, + { + "items": [ + 5869, + 6.5335 + ], + "hints": { + "index": 10677 + } + }, + { + "items": [ + 5869.5, + 6.6698 + ], + "hints": { + "index": 10678 + } + }, + { + "items": [ + 5870, + 6.5223 + ], + "hints": { + "index": 10679 + } + }, + { + "items": [ + 5870.5, + 6.482600212097168 + ], + "hints": { + "index": 10680 + } + }, + { + "items": [ + 5871, + 6.56820011138916 + ], + "hints": { + "index": 10681 + } + }, + { + "items": [ + 5871.5, + 6.6989998817443848 + ], + "hints": { + "index": 10682 + } + }, + { + "items": [ + 5872, + 7.908599853515625 + ], + "hints": { + "index": 10683 + } + }, + { + "items": [ + 5872.5, + 8.9107999801635742 + ], + "hints": { + "index": 10684 + } + }, + { + "items": [ + 5873, + 11.115099906921388 + ], + "hints": { + "index": 10685 + } + }, + { + "items": [ + 5873.5, + 11.142900466918944 + ], + "hints": { + "index": 10686 + } + }, + { + "items": [ + 5874, + 10.8098 + ], + "hints": { + "index": 10687 + } + }, + { + "items": [ + 5874.5, + 10.026800155639648 + ], + "hints": { + "index": 10688 + } + }, + { + "items": [ + 5875, + 8.8093 + ], + "hints": { + "index": 10689 + } + }, + { + "items": [ + 5875.5, + 8.5312004089355469 + ], + "hints": { + "index": 10690 + } + }, + { + "items": [ + 5876, + 7.2169 + ], + "hints": { + "index": 10691 + } + }, + { + "items": [ + 5876.5, + 7.6207 + ], + "hints": { + "index": 10692 + } + }, + { + "items": [ + 5877, + 7.9829998016357422 + ], + "hints": { + "index": 10693 + } + }, + { + "items": [ + 5877.5, + 10.323699951171877 + ], + "hints": { + "index": 10694 + } + }, + { + "items": [ + 5878, + 12.313199996948242 + ], + "hints": { + "index": 10695 + } + }, + { + "items": [ + 5878.5, + 15.130200386047363 + ], + "hints": { + "index": 10696 + } + }, + { + "items": [ + 5879, + 12.956600189208984 + ], + "hints": { + "index": 10697 + } + }, + { + "items": [ + 5879.5, + 11.339300155639648 + ], + "hints": { + "index": 10698 + } + }, + { + "items": [ + 5880, + 10.5554 + ], + "hints": { + "index": 10699 + } + }, + { + "items": [ + 5880.5, + 12.1106 + ], + "hints": { + "index": 10700 + } + }, + { + "items": [ + 5881, + 12.085399627685549 + ], + "hints": { + "index": 10701 + } + }, + { + "items": [ + 5881.5, + 13.606200218200684 + ], + "hints": { + "index": 10702 + } + }, + { + "items": [ + 5882, + 16.656400680541992 + ], + "hints": { + "index": 10703 + } + }, + { + "items": [ + 5882.5, + 23.281299591064453 + ], + "hints": { + "index": 10704 + } + }, + { + "items": [ + 5883, + 26.6821 + ], + "hints": { + "index": 10705 + } + }, + { + "items": [ + 5883.5, + 24.939599990844727 + ], + "hints": { + "index": 10706 + } + }, + { + "items": [ + 5884, + 16.136699676513672 + ], + "hints": { + "index": 10707 + } + }, + { + "items": [ + 5884.5, + 13.095800399780272 + ], + "hints": { + "index": 10708 + } + }, + { + "items": [ + 5885, + 10.3346 + ], + "hints": { + "index": 10709 + } + }, + { + "items": [ + 5885.5, + 12.235500335693359 + ], + "hints": { + "index": 10710 + } + }, + { + "items": [ + 5886, + 15.3825 + ], + "hints": { + "index": 10711 + } + }, + { + "items": [ + 5886.5, + 21.003499984741211 + ], + "hints": { + "index": 10712 + } + }, + { + "items": [ + 5887, + 19.861 + ], + "hints": { + "index": 10713 + } + }, + { + "items": [ + 5887.5, + 19.3 + ], + "hints": { + "index": 10714 + } + }, + { + "items": [ + 5888, + 21.296199798583984 + ], + "hints": { + "index": 10715 + } + }, + { + "items": [ + 5888.5, + 24.7885 + ], + "hints": { + "index": 10716 + } + }, + { + "items": [ + 5889, + 26.452999114990231 + ], + "hints": { + "index": 10717 + } + }, + { + "items": [ + 5889.5, + 29.7823 + ], + "hints": { + "index": 10718 + } + }, + { + "items": [ + 5890, + 31.702400207519531 + ], + "hints": { + "index": 10719 + } + }, + { + "items": [ + 5890.5, + 29.93910026550293 + ], + "hints": { + "index": 10720 + } + }, + { + "items": [ + 5891, + 24.3889 + ], + "hints": { + "index": 10721 + } + }, + { + "items": [ + 5891.5, + 19.4447 + ], + "hints": { + "index": 10722 + } + }, + { + "items": [ + 5892, + 16.696199417114258 + ], + "hints": { + "index": 10723 + } + }, + { + "items": [ + 5892.5, + 16.6981 + ], + "hints": { + "index": 10724 + } + }, + { + "items": [ + 5893, + 20.0018 + ], + "hints": { + "index": 10725 + } + }, + { + "items": [ + 5893.5, + 23.7907 + ], + "hints": { + "index": 10726 + } + }, + { + "items": [ + 5894, + 26.062000274658203 + ], + "hints": { + "index": 10727 + } + }, + { + "items": [ + 5894.5, + 26.140399932861328 + ], + "hints": { + "index": 10728 + } + }, + { + "items": [ + 5895, + 24.3723 + ], + "hints": { + "index": 10729 + } + }, + { + "items": [ + 5895.5, + 22.643100738525391 + ], + "hints": { + "index": 10730 + } + }, + { + "items": [ + 5896, + 22.489999771118164 + ], + "hints": { + "index": 10731 + } + }, + { + "items": [ + 5896.5, + 21.7936 + ], + "hints": { + "index": 10732 + } + }, + { + "items": [ + 5897, + 18.144800186157227 + ], + "hints": { + "index": 10733 + } + }, + { + "items": [ + 5897.5, + 12.124699592590332 + ], + "hints": { + "index": 10734 + } + }, + { + "items": [ + 5898, + 10.3745 + ], + "hints": { + "index": 10735 + } + }, + { + "items": [ + 5898.5, + 8.7437 + ], + "hints": { + "index": 10736 + } + }, + { + "items": [ + 5899, + 9.7247 + ], + "hints": { + "index": 10737 + } + }, + { + "items": [ + 5899.5, + 9.8473997116088867 + ], + "hints": { + "index": 10738 + } + }, + { + "items": [ + 5900, + 12.673500061035156 + ], + "hints": { + "index": 10739 + } + }, + { + "items": [ + 5900.5, + 10.835800170898438 + ], + "hints": { + "index": 10740 + } + }, + { + "items": [ + 5901, + 9.2087001800537109 + ], + "hints": { + "index": 10741 + } + }, + { + "items": [ + 5901.5, + 7.6922 + ], + "hints": { + "index": 10742 + } + }, + { + "items": [ + 5902, + 8.9821996688842773 + ], + "hints": { + "index": 10743 + } + }, + { + "items": [ + 5902.5, + 11.9559 + ], + "hints": { + "index": 10744 + } + }, + { + "items": [ + 5903, + 15.5177 + ], + "hints": { + "index": 10745 + } + }, + { + "items": [ + 5903.5, + 19.1171 + ], + "hints": { + "index": 10746 + } + }, + { + "items": [ + 5904, + 20.871299743652344 + ], + "hints": { + "index": 10747 + } + }, + { + "items": [ + 5904.5, + 17.710300445556641 + ], + "hints": { + "index": 10748 + } + }, + { + "items": [ + 5905, + 14.7325 + ], + "hints": { + "index": 10749 + } + }, + { + "items": [ + 5905.5, + 13.5518 + ], + "hints": { + "index": 10750 + } + }, + { + "items": [ + 5906, + 13.915300369262695 + ], + "hints": { + "index": 10751 + } + }, + { + "items": [ + 5906.5, + 12.7295 + ], + "hints": { + "index": 10752 + } + }, + { + "items": [ + 5907, + 9.7861 + ], + "hints": { + "index": 10753 + } + }, + { + "items": [ + 5907.5, + 10.661899566650392 + ], + "hints": { + "index": 10754 + } + }, + { + "items": [ + 5908, + 12.638400077819824 + ], + "hints": { + "index": 10755 + } + }, + { + "items": [ + 5908.5, + 16.9773 + ], + "hints": { + "index": 10756 + } + }, + { + "items": [ + 5909, + 15.5717 + ], + "hints": { + "index": 10757 + } + }, + { + "items": [ + 5909.5, + 11.8681001663208 + ], + "hints": { + "index": 10758 + } + }, + { + "items": [ + 5910, + 11.428899765014648 + ], + "hints": { + "index": 10759 + } + }, + { + "items": [ + 5910.5, + 11.7149 + ], + "hints": { + "index": 10760 + } + }, + { + "items": [ + 5911, + 14.238699913024902 + ], + "hints": { + "index": 10761 + } + }, + { + "items": [ + 5911.5, + 14.7001 + ], + "hints": { + "index": 10762 + } + }, + { + "items": [ + 5912, + 15.203399658203123 + ], + "hints": { + "index": 10763 + } + }, + { + "items": [ + 5912.5, + 15.6697998046875 + ], + "hints": { + "index": 10764 + } + }, + { + "items": [ + 5913, + 15.963000297546388 + ], + "hints": { + "index": 10765 + } + }, + { + "items": [ + 5913.5, + 15.9449 + ], + "hints": { + "index": 10766 + } + }, + { + "items": [ + 5914, + 14.872699737548828 + ], + "hints": { + "index": 10767 + } + }, + { + "items": [ + 5914.5, + 13.6212 + ], + "hints": { + "index": 10768 + } + }, + { + "items": [ + 5915, + 14.7297 + ], + "hints": { + "index": 10769 + } + }, + { + "items": [ + 5915.5, + 13.1097 + ], + "hints": { + "index": 10770 + } + }, + { + "items": [ + 5916, + 14.9064 + ], + "hints": { + "index": 10771 + } + }, + { + "items": [ + 5916.5, + 15.270899772644045 + ], + "hints": { + "index": 10772 + } + }, + { + "items": [ + 5917, + 19.215900421142575 + ], + "hints": { + "index": 10773 + } + }, + { + "items": [ + 5917.5, + 19.275899887084961 + ], + "hints": { + "index": 10774 + } + }, + { + "items": [ + 5918, + 15.525699615478516 + ], + "hints": { + "index": 10775 + } + }, + { + "items": [ + 5918.5, + 15.3594 + ], + "hints": { + "index": 10776 + } + }, + { + "items": [ + 5919, + 17.862499237060547 + ], + "hints": { + "index": 10777 + } + }, + { + "items": [ + 5919.5, + 21.8356 + ], + "hints": { + "index": 10778 + } + }, + { + "items": [ + 5920, + 19.8536 + ], + "hints": { + "index": 10779 + } + }, + { + "items": [ + 5920.5, + 17.025 + ], + "hints": { + "index": 10780 + } + }, + { + "items": [ + 5921, + 15.424500465393066 + ], + "hints": { + "index": 10781 + } + }, + { + "items": [ + 5921.5, + 14.701899528503418 + ], + "hints": { + "index": 10782 + } + }, + { + "items": [ + 5922, + 14.515800476074221 + ], + "hints": { + "index": 10783 + } + }, + { + "items": [ + 5922.5, + 16.2354 + ], + "hints": { + "index": 10784 + } + }, + { + "items": [ + 5923, + 20.079799652099609 + ], + "hints": { + "index": 10785 + } + }, + { + "items": [ + 5923.5, + 21.7391 + ], + "hints": { + "index": 10786 + } + }, + { + "items": [ + 5924, + 21.184099197387695 + ], + "hints": { + "index": 10787 + } + }, + { + "items": [ + 5924.5, + 19.6009 + ], + "hints": { + "index": 10788 + } + }, + { + "items": [ + 5925, + 18.3295 + ], + "hints": { + "index": 10789 + } + }, + { + "items": [ + 5925.5, + 18.6917 + ], + "hints": { + "index": 10790 + } + }, + { + "items": [ + 5926, + 18.697700500488281 + ], + "hints": { + "index": 10791 + } + }, + { + "items": [ + 5926.5, + 18.948699951171875 + ], + "hints": { + "index": 10792 + } + }, + { + "items": [ + 5927, + 19.8559 + ], + "hints": { + "index": 10793 + } + }, + { + "items": [ + 5927.5, + 19.636199951171875 + ], + "hints": { + "index": 10794 + } + }, + { + "items": [ + 5928, + 21.329099655151367 + ], + "hints": { + "index": 10795 + } + }, + { + "items": [ + 5928.5, + 18.0169 + ], + "hints": { + "index": 10796 + } + }, + { + "items": [ + 5929, + 18.120599746704105 + ], + "hints": { + "index": 10797 + } + }, + { + "items": [ + 5929.5, + 16.653799057006836 + ], + "hints": { + "index": 10798 + } + }, + { + "items": [ + 5930, + 14.3703 + ], + "hints": { + "index": 10799 + } + }, + { + "items": [ + 5930.5, + 13.3145 + ], + "hints": { + "index": 10800 + } + }, + { + "items": [ + 5931, + 13.6707 + ], + "hints": { + "index": 10801 + } + }, + { + "items": [ + 5931.5, + 15.528499603271484 + ], + "hints": { + "index": 10802 + } + }, + { + "items": [ + 5932, + 13.93220043182373 + ], + "hints": { + "index": 10803 + } + }, + { + "items": [ + 5932.5, + 13.596799850463867 + ], + "hints": { + "index": 10804 + } + }, + { + "items": [ + 5933, + 13.9355 + ], + "hints": { + "index": 10805 + } + }, + { + "items": [ + 5933.5, + 16.759500503540039 + ], + "hints": { + "index": 10806 + } + }, + { + "items": [ + 5934, + 16.952499389648438 + ], + "hints": { + "index": 10807 + } + }, + { + "items": [ + 5934.5, + 14.076899528503418 + ], + "hints": { + "index": 10808 + } + }, + { + "items": [ + 5935, + 9.5473 + ], + "hints": { + "index": 10809 + } + }, + { + "items": [ + 5935.5, + 8.3285 + ], + "hints": { + "index": 10810 + } + }, + { + "items": [ + 5936, + 8.0585002899169922 + ], + "hints": { + "index": 10811 + } + }, + { + "items": [ + 5936.5, + 8.3315000534057617 + ], + "hints": { + "index": 10812 + } + }, + { + "items": [ + 5937, + 8.2679004669189453 + ], + "hints": { + "index": 10813 + } + }, + { + "items": [ + 5937.5, + 8.1118 + ], + "hints": { + "index": 10814 + } + }, + { + "items": [ + 5938, + 8.6578998565673828 + ], + "hints": { + "index": 10815 + } + }, + { + "items": [ + 5938.5, + 9.1690998077392578 + ], + "hints": { + "index": 10816 + } + }, + { + "items": [ + 5939, + 10.1916 + ], + "hints": { + "index": 10817 + } + }, + { + "items": [ + 5939.5, + 13.076199531555176 + ], + "hints": { + "index": 10818 + } + }, + { + "items": [ + 5940, + 15.337900161743164 + ], + "hints": { + "index": 10819 + } + }, + { + "items": [ + 5940.5, + 19.9297 + ], + "hints": { + "index": 10820 + } + }, + { + "items": [ + 5941, + 19.058 + ], + "hints": { + "index": 10821 + } + }, + { + "items": [ + 5941.5, + 16.8834 + ], + "hints": { + "index": 10822 + } + }, + { + "items": [ + 5942, + 14.3564 + ], + "hints": { + "index": 10823 + } + }, + { + "items": [ + 5942.5, + 15.4196 + ], + "hints": { + "index": 10824 + } + }, + { + "items": [ + 5943, + 17.503299713134766 + ], + "hints": { + "index": 10825 + } + }, + { + "items": [ + 5943.5, + 17.6518 + ], + "hints": { + "index": 10826 + } + }, + { + "items": [ + 5944, + 16.3710994720459 + ], + "hints": { + "index": 10827 + } + }, + { + "items": [ + 5944.5, + 16.551700592041016 + ], + "hints": { + "index": 10828 + } + }, + { + "items": [ + 5945, + 15.1845 + ], + "hints": { + "index": 10829 + } + }, + { + "items": [ + 5945.5, + 15.008099555969238 + ], + "hints": { + "index": 10830 + } + }, + { + "items": [ + 5946, + 15.58590030670166 + ], + "hints": { + "index": 10831 + } + }, + { + "items": [ + 5946.5, + 19.578699111938477 + ], + "hints": { + "index": 10832 + } + }, + { + "items": [ + 5947, + 21.16 + ], + "hints": { + "index": 10833 + } + }, + { + "items": [ + 5947.5, + 18.739799499511719 + ], + "hints": { + "index": 10834 + } + }, + { + "items": [ + 5948, + 16.569299697875977 + ], + "hints": { + "index": 10835 + } + }, + { + "items": [ + 5948.5, + 17.2387 + ], + "hints": { + "index": 10836 + } + }, + { + "items": [ + 5949, + 16.1162 + ], + "hints": { + "index": 10837 + } + }, + { + "items": [ + 5949.5, + 13.9019 + ], + "hints": { + "index": 10838 + } + }, + { + "items": [ + 5950, + 11.434900283813477 + ], + "hints": { + "index": 10839 + } + }, + { + "items": [ + 5950.5, + 12.061100006103516 + ], + "hints": { + "index": 10840 + } + }, + { + "items": [ + 5951, + 11.437700271606444 + ], + "hints": { + "index": 10841 + } + }, + { + "items": [ + 5951.5, + 11.179599761962892 + ], + "hints": { + "index": 10842 + } + }, + { + "items": [ + 5952, + 12.343600273132324 + ], + "hints": { + "index": 10843 + } + }, + { + "items": [ + 5952.5, + 15.7727 + ], + "hints": { + "index": 10844 + } + }, + { + "items": [ + 5953, + 19.4437 + ], + "hints": { + "index": 10845 + } + }, + { + "items": [ + 5953.5, + 21.3346004486084 + ], + "hints": { + "index": 10846 + } + }, + { + "items": [ + 5954, + 24.0495 + ], + "hints": { + "index": 10847 + } + }, + { + "items": [ + 5954.5, + 28.710699081420895 + ], + "hints": { + "index": 10848 + } + }, + { + "items": [ + 5955, + 29.8619 + ], + "hints": { + "index": 10849 + } + }, + { + "items": [ + 5955.5, + 27.46150016784668 + ], + "hints": { + "index": 10850 + } + }, + { + "items": [ + 5956, + 25.885 + ], + "hints": { + "index": 10851 + } + }, + { + "items": [ + 5956.5, + 25.0061 + ], + "hints": { + "index": 10852 + } + }, + { + "items": [ + 5957, + 25.1737003326416 + ], + "hints": { + "index": 10853 + } + }, + { + "items": [ + 5957.5, + 30.444299697875977 + ], + "hints": { + "index": 10854 + } + }, + { + "items": [ + 5958, + 30.3546 + ], + "hints": { + "index": 10855 + } + }, + { + "items": [ + 5958.5, + 33.3617 + ], + "hints": { + "index": 10856 + } + }, + { + "items": [ + 5959, + 32.3385009765625 + ], + "hints": { + "index": 10857 + } + }, + { + "items": [ + 5959.5, + 32.804901123046875 + ], + "hints": { + "index": 10858 + } + }, + { + "items": [ + 5960, + 31.3362 + ], + "hints": { + "index": 10859 + } + }, + { + "items": [ + 5960.5, + 29.229700088500977 + ], + "hints": { + "index": 10860 + } + }, + { + "items": [ + 5961, + 28.3502 + ], + "hints": { + "index": 10861 + } + }, + { + "items": [ + 5961.5, + 29.2744 + ], + "hints": { + "index": 10862 + } + }, + { + "items": [ + 5962, + 29.1121 + ], + "hints": { + "index": 10863 + } + }, + { + "items": [ + 5962.5, + 30.819299697875977 + ], + "hints": { + "index": 10864 + } + }, + { + "items": [ + 5963, + 29.0691 + ], + "hints": { + "index": 10865 + } + }, + { + "items": [ + 5963.5, + 30.484 + ], + "hints": { + "index": 10866 + } + }, + { + "items": [ + 5964, + 32.8536 + ], + "hints": { + "index": 10867 + } + }, + { + "items": [ + 5964.5, + 31.8498 + ], + "hints": { + "index": 10868 + } + }, + { + "items": [ + 5965, + 34.3760986328125 + ], + "hints": { + "index": 10869 + } + }, + { + "items": [ + 5965.5, + 32.1211 + ], + "hints": { + "index": 10870 + } + }, + { + "items": [ + 5966, + 30.8003 + ], + "hints": { + "index": 10871 + } + }, + { + "items": [ + 5966.5, + 29.055999755859375 + ], + "hints": { + "index": 10872 + } + }, + { + "items": [ + 5967, + 29.1861 + ], + "hints": { + "index": 10873 + } + }, + { + "items": [ + 5967.5, + 33.1046 + ], + "hints": { + "index": 10874 + } + }, + { + "items": [ + 5968, + 30.978799819946289 + ], + "hints": { + "index": 10875 + } + }, + { + "items": [ + 5968.5, + 24.562099456787109 + ], + "hints": { + "index": 10876 + } + }, + { + "items": [ + 5969, + 20.2532 + ], + "hints": { + "index": 10877 + } + }, + { + "items": [ + 5969.5, + 15.517 + ], + "hints": { + "index": 10878 + } + }, + { + "items": [ + 5970, + 15.2139 + ], + "hints": { + "index": 10879 + } + }, + { + "items": [ + 5970.5, + 16.1775 + ], + "hints": { + "index": 10880 + } + }, + { + "items": [ + 5971, + 20.344 + ], + "hints": { + "index": 10881 + } + }, + { + "items": [ + 5971.5, + 24.8224 + ], + "hints": { + "index": 10882 + } + }, + { + "items": [ + 5972, + 27.305 + ], + "hints": { + "index": 10883 + } + }, + { + "items": [ + 5972.5, + 31.9931 + ], + "hints": { + "index": 10884 + } + }, + { + "items": [ + 5973, + 35.2682 + ], + "hints": { + "index": 10885 + } + }, + { + "items": [ + 5973.5, + 41.4343 + ], + "hints": { + "index": 10886 + } + }, + { + "items": [ + 5974, + 39.0021 + ], + "hints": { + "index": 10887 + } + }, + { + "items": [ + 5974.5, + 39.9935 + ], + "hints": { + "index": 10888 + } + }, + { + "items": [ + 5975, + 35.2118 + ], + "hints": { + "index": 10889 + } + }, + { + "items": [ + 5975.5, + 34.8082 + ], + "hints": { + "index": 10890 + } + }, + { + "items": [ + 5976, + 31.494400024414063 + ], + "hints": { + "index": 10891 + } + }, + { + "items": [ + 5976.5, + 31.4884 + ], + "hints": { + "index": 10892 + } + }, + { + "items": [ + 5977, + 33.7432 + ], + "hints": { + "index": 10893 + } + }, + { + "items": [ + 5977.5, + 36.0706 + ], + "hints": { + "index": 10894 + } + }, + { + "items": [ + 5978, + 37.2047004699707 + ], + "hints": { + "index": 10895 + } + }, + { + "items": [ + 5978.5, + 35.974601745605469 + ], + "hints": { + "index": 10896 + } + }, + { + "items": [ + 5979, + 36.8912 + ], + "hints": { + "index": 10897 + } + }, + { + "items": [ + 5979.5, + 34.0609 + ], + "hints": { + "index": 10898 + } + }, + { + "items": [ + 5980, + 33.093299865722656 + ], + "hints": { + "index": 10899 + } + }, + { + "items": [ + 5980.5, + 29.9244 + ], + "hints": { + "index": 10900 + } + }, + { + "items": [ + 5981, + 30.1911 + ], + "hints": { + "index": 10901 + } + }, + { + "items": [ + 5981.5, + 32.29 + ], + "hints": { + "index": 10902 + } + }, + { + "items": [ + 5982, + 31.4727 + ], + "hints": { + "index": 10903 + } + }, + { + "items": [ + 5982.5, + 32.7459 + ], + "hints": { + "index": 10904 + } + }, + { + "items": [ + 5983, + 31.4542 + ], + "hints": { + "index": 10905 + } + }, + { + "items": [ + 5983.5, + 32.799900054931641 + ], + "hints": { + "index": 10906 + } + }, + { + "items": [ + 5984, + 31.3445 + ], + "hints": { + "index": 10907 + } + }, + { + "items": [ + 5984.5, + 28.8599 + ], + "hints": { + "index": 10908 + } + }, + { + "items": [ + 5985, + 29.0882 + ], + "hints": { + "index": 10909 + } + }, + { + "items": [ + 5985.5, + 28.87969970703125 + ], + "hints": { + "index": 10910 + } + }, + { + "items": [ + 5986, + 29.9769 + ], + "hints": { + "index": 10911 + } + }, + { + "items": [ + 5986.5, + 29.7722 + ], + "hints": { + "index": 10912 + } + }, + { + "items": [ + 5987, + 33.0702 + ], + "hints": { + "index": 10913 + } + }, + { + "items": [ + 5987.5, + 32.8605 + ], + "hints": { + "index": 10914 + } + }, + { + "items": [ + 5988, + 33.2659 + ], + "hints": { + "index": 10915 + } + }, + { + "items": [ + 5988.5, + 31.173 + ], + "hints": { + "index": 10916 + } + }, + { + "items": [ + 5989, + 31.512399673461911 + ], + "hints": { + "index": 10917 + } + }, + { + "items": [ + 5989.5, + 31.534599304199219 + ], + "hints": { + "index": 10918 + } + }, + { + "items": [ + 5990, + 28.2281 + ], + "hints": { + "index": 10919 + } + }, + { + "items": [ + 5990.5, + 26.4981 + ], + "hints": { + "index": 10920 + } + }, + { + "items": [ + 5991, + 27.4353 + ], + "hints": { + "index": 10921 + } + }, + { + "items": [ + 5991.5, + 30.347499847412109 + ], + "hints": { + "index": 10922 + } + }, + { + "items": [ + 5992, + 32.7834 + ], + "hints": { + "index": 10923 + } + }, + { + "items": [ + 5992.5, + 29.3276 + ], + "hints": { + "index": 10924 + } + }, + { + "items": [ + 5993, + 27.0454 + ], + "hints": { + "index": 10925 + } + }, + { + "items": [ + 5993.5, + 24.846599578857425 + ], + "hints": { + "index": 10926 + } + }, + { + "items": [ + 5994, + 22.1615 + ], + "hints": { + "index": 10927 + } + }, + { + "items": [ + 5994.5, + 22.00469970703125 + ], + "hints": { + "index": 10928 + } + }, + { + "items": [ + 5995, + 21.0048 + ], + "hints": { + "index": 10929 + } + }, + { + "items": [ + 5995.5, + 24.089500427246097 + ], + "hints": { + "index": 10930 + } + }, + { + "items": [ + 5996, + 24.6675 + ], + "hints": { + "index": 10931 + } + }, + { + "items": [ + 5996.5, + 25.487100601196289 + ], + "hints": { + "index": 10932 + } + }, + { + "items": [ + 5997, + 25.591 + ], + "hints": { + "index": 10933 + } + }, + { + "items": [ + 5997.5, + 24.463300704956055 + ], + "hints": { + "index": 10934 + } + }, + { + "items": [ + 5998, + 24.6868 + ], + "hints": { + "index": 10935 + } + }, + { + "items": [ + 5998.5, + 21.108 + ], + "hints": { + "index": 10936 + } + }, + { + "items": [ + 5999, + 20.457 + ], + "hints": { + "index": 10937 + } + }, + { + "items": [ + 5999.5, + 19.184900283813477 + ], + "hints": { + "index": 10938 + } + }, + { + "items": [ + 6000, + 20.4913 + ], + "hints": { + "index": 10939 + } + }, + { + "items": [ + 6000.5, + 21.110300064086911 + ], + "hints": { + "index": 10940 + } + }, + { + "items": [ + 6001, + 23.0086 + ], + "hints": { + "index": 10941 + } + }, + { + "items": [ + 6001.5, + 24.576200485229492 + ], + "hints": { + "index": 10942 + } + }, + { + "items": [ + 6002, + 25.787099838256836 + ], + "hints": { + "index": 10943 + } + }, + { + "items": [ + 6002.5, + 23.0707 + ], + "hints": { + "index": 10944 + } + }, + { + "items": [ + 6003, + 19.385 + ], + "hints": { + "index": 10945 + } + }, + { + "items": [ + 6003.5, + 17.9411 + ], + "hints": { + "index": 10946 + } + }, + { + "items": [ + 6004, + 16.9106 + ], + "hints": { + "index": 10947 + } + }, + { + "items": [ + 6004.5, + 17.563400268554688 + ], + "hints": { + "index": 10948 + } + }, + { + "items": [ + 6005, + 17.5077 + ], + "hints": { + "index": 10949 + } + }, + { + "items": [ + 6005.5, + 18.7477 + ], + "hints": { + "index": 10950 + } + }, + { + "items": [ + 6006, + 19.412599563598633 + ], + "hints": { + "index": 10951 + } + }, + { + "items": [ + 6006.5, + 19.4968 + ], + "hints": { + "index": 10952 + } + }, + { + "items": [ + 6007, + 18.8523 + ], + "hints": { + "index": 10953 + } + }, + { + "items": [ + 6007.5, + 18.881399154663089 + ], + "hints": { + "index": 10954 + } + }, + { + "items": [ + 6008, + 20.5551 + ], + "hints": { + "index": 10955 + } + }, + { + "items": [ + 6008.5, + 23.5318 + ], + "hints": { + "index": 10956 + } + }, + { + "items": [ + 6009, + 26.249 + ], + "hints": { + "index": 10957 + } + }, + { + "items": [ + 6009.5, + 26.3399 + ], + "hints": { + "index": 10958 + } + }, + { + "items": [ + 6010, + 24.324499130249023 + ], + "hints": { + "index": 10959 + } + }, + { + "items": [ + 6010.5, + 22.2506 + ], + "hints": { + "index": 10960 + } + }, + { + "items": [ + 6011, + 21.9924 + ], + "hints": { + "index": 10961 + } + }, + { + "items": [ + 6011.5, + 21.6716 + ], + "hints": { + "index": 10962 + } + }, + { + "items": [ + 6012, + 20.911 + ], + "hints": { + "index": 10963 + } + }, + { + "items": [ + 6012.5, + 17.4312 + ], + "hints": { + "index": 10964 + } + }, + { + "items": [ + 6013, + 17.2208 + ], + "hints": { + "index": 10965 + } + }, + { + "items": [ + 6013.5, + 18.024 + ], + "hints": { + "index": 10966 + } + }, + { + "items": [ + 6014, + 21.2869 + ], + "hints": { + "index": 10967 + } + }, + { + "items": [ + 6014.5, + 24.5686 + ], + "hints": { + "index": 10968 + } + }, + { + "items": [ + 6015, + 26.841400146484375 + ], + "hints": { + "index": 10969 + } + }, + { + "items": [ + 6015.5, + 27.8566 + ], + "hints": { + "index": 10970 + } + }, + { + "items": [ + 6016, + 27.656900405883789 + ], + "hints": { + "index": 10971 + } + }, + { + "items": [ + 6016.5, + 27.582799911499023 + ], + "hints": { + "index": 10972 + } + }, + { + "items": [ + 6017, + 24.0132999420166 + ], + "hints": { + "index": 10973 + } + }, + { + "items": [ + 6017.5, + 22.780799865722656 + ], + "hints": { + "index": 10974 + } + }, + { + "items": [ + 6018, + 21.6151 + ], + "hints": { + "index": 10975 + } + }, + { + "items": [ + 6018.5, + 20.7637 + ], + "hints": { + "index": 10976 + } + }, + { + "items": [ + 6019, + 19.6877 + ], + "hints": { + "index": 10977 + } + }, + { + "items": [ + 6019.5, + 19.116600036621097 + ], + "hints": { + "index": 10978 + } + }, + { + "items": [ + 6020, + 20.0024 + ], + "hints": { + "index": 10979 + } + }, + { + "items": [ + 6020.5, + 19.124 + ], + "hints": { + "index": 10980 + } + }, + { + "items": [ + 6021, + 20.6155 + ], + "hints": { + "index": 10981 + } + }, + { + "items": [ + 6021.5, + 22.075099945068359 + ], + "hints": { + "index": 10982 + } + }, + { + "items": [ + 6022, + 27.1381 + ], + "hints": { + "index": 10983 + } + }, + { + "items": [ + 6022.5, + 27.260700225830082 + ], + "hints": { + "index": 10984 + } + }, + { + "items": [ + 6023, + 27.695199966430664 + ], + "hints": { + "index": 10985 + } + }, + { + "items": [ + 6023.5, + 25.1102 + ], + "hints": { + "index": 10986 + } + }, + { + "items": [ + 6024, + 24.4953 + ], + "hints": { + "index": 10987 + } + }, + { + "items": [ + 6024.5, + 24.960699081420895 + ], + "hints": { + "index": 10988 + } + }, + { + "items": [ + 6025, + 24.4456 + ], + "hints": { + "index": 10989 + } + }, + { + "items": [ + 6025.5, + 27.154399871826172 + ], + "hints": { + "index": 10990 + } + }, + { + "items": [ + 6026, + 28.766599655151367 + ], + "hints": { + "index": 10991 + } + }, + { + "items": [ + 6026.5, + 32.830398559570313 + ], + "hints": { + "index": 10992 + } + }, + { + "items": [ + 6027, + 30.434499740600582 + ], + "hints": { + "index": 10993 + } + }, + { + "items": [ + 6027.5, + 27.989099502563477 + ], + "hints": { + "index": 10994 + } + }, + { + "items": [ + 6028, + 26.7447 + ], + "hints": { + "index": 10995 + } + }, + { + "items": [ + 6028.5, + 27.6929 + ], + "hints": { + "index": 10996 + } + }, + { + "items": [ + 6029, + 26.1181 + ], + "hints": { + "index": 10997 + } + }, + { + "items": [ + 6029.5, + 23.9516 + ], + "hints": { + "index": 10998 + } + }, + { + "items": [ + 6030, + 20.5114 + ], + "hints": { + "index": 10999 + } + }, + { + "items": [ + 6030.5, + 18.68950080871582 + ], + "hints": { + "index": 11000 + } + }, + { + "items": [ + 6031, + 16.700599670410156 + ], + "hints": { + "index": 11001 + } + }, + { + "items": [ + 6031.5, + 15.774499893188477 + ], + "hints": { + "index": 11002 + } + }, + { + "items": [ + 6032, + 15.8972 + ], + "hints": { + "index": 11003 + } + }, + { + "items": [ + 6032.5, + 15.6672 + ], + "hints": { + "index": 11004 + } + }, + { + "items": [ + 6033, + 14.8305 + ], + "hints": { + "index": 11005 + } + }, + { + "items": [ + 6033.5, + 14.262900352478027 + ], + "hints": { + "index": 11006 + } + }, + { + "items": [ + 6034, + 14.2781 + ], + "hints": { + "index": 11007 + } + }, + { + "items": [ + 6034.5, + 16.537399291992188 + ], + "hints": { + "index": 11008 + } + }, + { + "items": [ + 6035, + 18.3619 + ], + "hints": { + "index": 11009 + } + }, + { + "items": [ + 6035.5, + 18.343000411987305 + ], + "hints": { + "index": 11010 + } + }, + { + "items": [ + 6036, + 15.9695 + ], + "hints": { + "index": 11011 + } + }, + { + "items": [ + 6036.5, + 16.590499877929688 + ], + "hints": { + "index": 11012 + } + }, + { + "items": [ + 6037, + 19.1052 + ], + "hints": { + "index": 11013 + } + }, + { + "items": [ + 6037.5, + 23.682100296020508 + ], + "hints": { + "index": 11014 + } + }, + { + "items": [ + 6038, + 23.0681 + ], + "hints": { + "index": 11015 + } + }, + { + "items": [ + 6038.5, + 22.9524 + ], + "hints": { + "index": 11016 + } + }, + { + "items": [ + 6039, + 19.4089 + ], + "hints": { + "index": 11017 + } + }, + { + "items": [ + 6039.5, + 18.346099853515625 + ], + "hints": { + "index": 11018 + } + }, + { + "items": [ + 6040, + 17.5359 + ], + "hints": { + "index": 11019 + } + }, + { + "items": [ + 6040.5, + 17.4275 + ], + "hints": { + "index": 11020 + } + }, + { + "items": [ + 6041, + 16.4117 + ], + "hints": { + "index": 11021 + } + }, + { + "items": [ + 6041.5, + 14.767999649047852 + ], + "hints": { + "index": 11022 + } + }, + { + "items": [ + 6042, + 13.4074 + ], + "hints": { + "index": 11023 + } + }, + { + "items": [ + 6042.5, + 13.584500312805176 + ], + "hints": { + "index": 11024 + } + }, + { + "items": [ + 6043, + 14.6267 + ], + "hints": { + "index": 11025 + } + }, + { + "items": [ + 6043.5, + 13.440799713134766 + ], + "hints": { + "index": 11026 + } + }, + { + "items": [ + 6044, + 10.6295 + ], + "hints": { + "index": 11027 + } + }, + { + "items": [ + 6044.5, + 9.0851 + ], + "hints": { + "index": 11028 + } + }, + { + "items": [ + 6045, + 10.3337 + ], + "hints": { + "index": 11029 + } + }, + { + "items": [ + 6045.5, + 14.204400062561035 + ], + "hints": { + "index": 11030 + } + }, + { + "items": [ + 6046, + 21.2196 + ], + "hints": { + "index": 11031 + } + }, + { + "items": [ + 6046.5, + 25.547100067138672 + ], + "hints": { + "index": 11032 + } + }, + { + "items": [ + 6047, + 26.315 + ], + "hints": { + "index": 11033 + } + }, + { + "items": [ + 6047.5, + 21.13599967956543 + ], + "hints": { + "index": 11034 + } + }, + { + "items": [ + 6048, + 17.9505 + ], + "hints": { + "index": 11035 + } + }, + { + "items": [ + 6048.5, + 15.7196 + ], + "hints": { + "index": 11036 + } + }, + { + "items": [ + 6049, + 14.94320011138916 + ], + "hints": { + "index": 11037 + } + }, + { + "items": [ + 6049.5, + 14.1048 + ], + "hints": { + "index": 11038 + } + }, + { + "items": [ + 6050, + 13.37 + ], + "hints": { + "index": 11039 + } + }, + { + "items": [ + 6050.5, + 12.055700302124023 + ], + "hints": { + "index": 11040 + } + }, + { + "items": [ + 6051, + 11.5823 + ], + "hints": { + "index": 11041 + } + }, + { + "items": [ + 6051.5, + 11.159999847412108 + ], + "hints": { + "index": 11042 + } + }, + { + "items": [ + 6052, + 12.1527 + ], + "hints": { + "index": 11043 + } + }, + { + "items": [ + 6052.5, + 13.9134 + ], + "hints": { + "index": 11044 + } + }, + { + "items": [ + 6053, + 14.4049 + ], + "hints": { + "index": 11045 + } + }, + { + "items": [ + 6053.5, + 15.89430046081543 + ], + "hints": { + "index": 11046 + } + }, + { + "items": [ + 6054, + 15.1066 + ], + "hints": { + "index": 11047 + } + }, + { + "items": [ + 6054.5, + 15.378499984741213 + ], + "hints": { + "index": 11048 + } + }, + { + "items": [ + 6055, + 15.8427 + ], + "hints": { + "index": 11049 + } + }, + { + "items": [ + 6055.5, + 17.645500183105469 + ], + "hints": { + "index": 11050 + } + }, + { + "items": [ + 6056, + 21.4713 + ], + "hints": { + "index": 11051 + } + }, + { + "items": [ + 6056.5, + 20.682899475097656 + ], + "hints": { + "index": 11052 + } + }, + { + "items": [ + 6057, + 20.982 + ], + "hints": { + "index": 11053 + } + }, + { + "items": [ + 6057.5, + 20.492799758911133 + ], + "hints": { + "index": 11054 + } + }, + { + "items": [ + 6058, + 23.6362 + ], + "hints": { + "index": 11055 + } + }, + { + "items": [ + 6058.5, + 27.106199264526367 + ], + "hints": { + "index": 11056 + } + }, + { + "items": [ + 6059, + 29.1168 + ], + "hints": { + "index": 11057 + } + }, + { + "items": [ + 6059.5, + 24.013 + ], + "hints": { + "index": 11058 + } + }, + { + "items": [ + 6060, + 18.7634 + ], + "hints": { + "index": 11059 + } + }, + { + "items": [ + 6060.5, + 17.090599060058594 + ], + "hints": { + "index": 11060 + } + }, + { + "items": [ + 6061, + 16.8293 + ], + "hints": { + "index": 11061 + } + }, + { + "items": [ + 6061.5, + 16.689899444580078 + ], + "hints": { + "index": 11062 + } + }, + { + "items": [ + 6062, + 16.9157 + ], + "hints": { + "index": 11063 + } + }, + { + "items": [ + 6062.5, + 17.1269 + ], + "hints": { + "index": 11064 + } + }, + { + "items": [ + 6063, + 17.4373 + ], + "hints": { + "index": 11065 + } + }, + { + "items": [ + 6063.5, + 16.8023 + ], + "hints": { + "index": 11066 + } + }, + { + "items": [ + 6064, + 15.8128 + ], + "hints": { + "index": 11067 + } + }, + { + "items": [ + 6064.5, + 14.703700065612791 + ], + "hints": { + "index": 11068 + } + }, + { + "items": [ + 6065, + 13.6296 + ], + "hints": { + "index": 11069 + } + }, + { + "items": [ + 6065.5, + 13.506600379943848 + ], + "hints": { + "index": 11070 + } + }, + { + "items": [ + 6066, + 12.9081 + ], + "hints": { + "index": 11071 + } + }, + { + "items": [ + 6066.5, + 14.334099769592283 + ], + "hints": { + "index": 11072 + } + }, + { + "items": [ + 6067, + 13.7911 + ], + "hints": { + "index": 11073 + } + }, + { + "items": [ + 6067.5, + 16.767400741577148 + ], + "hints": { + "index": 11074 + } + }, + { + "items": [ + 6068, + 17.5915 + ], + "hints": { + "index": 11075 + } + }, + { + "items": [ + 6068.5, + 22.579799652099609 + ], + "hints": { + "index": 11076 + } + }, + { + "items": [ + 6069, + 20.2222 + ], + "hints": { + "index": 11077 + } + }, + { + "items": [ + 6069.5, + 20.751100540161133 + ], + "hints": { + "index": 11078 + } + }, + { + "items": [ + 6070, + 20.9635 + ], + "hints": { + "index": 11079 + } + }, + { + "items": [ + 6070.5, + 21.635200500488281 + ], + "hints": { + "index": 11080 + } + }, + { + "items": [ + 6071, + 22.880800247192383 + ], + "hints": { + "index": 11081 + } + }, + { + "items": [ + 6071.5, + 22.0125 + ], + "hints": { + "index": 11082 + } + }, + { + "items": [ + 6072, + 23.9415 + ], + "hints": { + "index": 11083 + } + }, + { + "items": [ + 6072.5, + 22.8237 + ], + "hints": { + "index": 11084 + } + }, + { + "items": [ + 6073, + 21.0008 + ], + "hints": { + "index": 11085 + } + }, + { + "items": [ + 6073.5, + 18.9775 + ], + "hints": { + "index": 11086 + } + }, + { + "items": [ + 6074, + 17.4612 + ], + "hints": { + "index": 11087 + } + }, + { + "items": [ + 6074.5, + 15.7745 + ], + "hints": { + "index": 11088 + } + }, + { + "items": [ + 6075, + 15.0833 + ], + "hints": { + "index": 11089 + } + }, + { + "items": [ + 6075.5, + 14.882 + ], + "hints": { + "index": 11090 + } + }, + { + "items": [ + 6076, + 16.5854 + ], + "hints": { + "index": 11091 + } + }, + { + "items": [ + 6076.5, + 17.3888 + ], + "hints": { + "index": 11092 + } + }, + { + "items": [ + 6077, + 18.793 + ], + "hints": { + "index": 11093 + } + }, + { + "items": [ + 6077.5, + 21.15 + ], + "hints": { + "index": 11094 + } + }, + { + "items": [ + 6078, + 23.6346 + ], + "hints": { + "index": 11095 + } + }, + { + "items": [ + 6078.5, + 23.820400238037109 + ], + "hints": { + "index": 11096 + } + }, + { + "items": [ + 6079, + 20.9756 + ], + "hints": { + "index": 11097 + } + }, + { + "items": [ + 6079.5, + 20.167600631713867 + ], + "hints": { + "index": 11098 + } + }, + { + "items": [ + 6080, + 19.9717 + ], + "hints": { + "index": 11099 + } + }, + { + "items": [ + 6080.5, + 20.285400390625 + ], + "hints": { + "index": 11100 + } + }, + { + "items": [ + 6081, + 19.3501 + ], + "hints": { + "index": 11101 + } + }, + { + "items": [ + 6081.5, + 16.8654 + ], + "hints": { + "index": 11102 + } + }, + { + "items": [ + 6082, + 15.0961 + ], + "hints": { + "index": 11103 + } + }, + { + "items": [ + 6082.5, + 14.843999862670898 + ], + "hints": { + "index": 11104 + } + }, + { + "items": [ + 6083, + 15.18340015411377 + ], + "hints": { + "index": 11105 + } + }, + { + "items": [ + 6083.5, + 14.824399948120115 + ], + "hints": { + "index": 11106 + } + }, + { + "items": [ + 6084, + 13.7626 + ], + "hints": { + "index": 11107 + } + }, + { + "items": [ + 6084.5, + 12.820899963378906 + ], + "hints": { + "index": 11108 + } + }, + { + "items": [ + 6085, + 11.648200035095217 + ], + "hints": { + "index": 11109 + } + }, + { + "items": [ + 6085.5, + 12.0072 + ], + "hints": { + "index": 11110 + } + }, + { + "items": [ + 6086, + 15.8219 + ], + "hints": { + "index": 11111 + } + }, + { + "items": [ + 6086.5, + 21.172800064086911 + ], + "hints": { + "index": 11112 + } + }, + { + "items": [ + 6087, + 24.4729 + ], + "hints": { + "index": 11113 + } + }, + { + "items": [ + 6087.5, + 20.156200408935547 + ], + "hints": { + "index": 11114 + } + }, + { + "items": [ + 6088, + 17.8884 + ], + "hints": { + "index": 11115 + } + }, + { + "items": [ + 6088.5, + 17.346700668334961 + ], + "hints": { + "index": 11116 + } + }, + { + "items": [ + 6089, + 18.2661 + ], + "hints": { + "index": 11117 + } + }, + { + "items": [ + 6089.5, + 17.971799850463867 + ], + "hints": { + "index": 11118 + } + }, + { + "items": [ + 6090, + 16.9706 + ], + "hints": { + "index": 11119 + } + }, + { + "items": [ + 6090.5, + 15.605600357055664 + ], + "hints": { + "index": 11120 + } + }, + { + "items": [ + 6091, + 17.371799468994141 + ], + "hints": { + "index": 11121 + } + }, + { + "items": [ + 6091.5, + 21.319299697875977 + ], + "hints": { + "index": 11122 + } + }, + { + "items": [ + 6092, + 26.1503 + ], + "hints": { + "index": 11123 + } + }, + { + "items": [ + 6092.5, + 27.5662 + ], + "hints": { + "index": 11124 + } + }, + { + "items": [ + 6093, + 26.6228 + ], + "hints": { + "index": 11125 + } + }, + { + "items": [ + 6093.5, + 25.1073 + ], + "hints": { + "index": 11126 + } + }, + { + "items": [ + 6094, + 21.6479 + ], + "hints": { + "index": 11127 + } + }, + { + "items": [ + 6094.5, + 23.511299133300781 + ], + "hints": { + "index": 11128 + } + }, + { + "items": [ + 6095, + 22.635599136352539 + ], + "hints": { + "index": 11129 + } + }, + { + "items": [ + 6095.5, + 24.977300643920895 + ], + "hints": { + "index": 11130 + } + }, + { + "items": [ + 6096, + 21.3609 + ], + "hints": { + "index": 11131 + } + }, + { + "items": [ + 6096.5, + 22.672 + ], + "hints": { + "index": 11132 + } + }, + { + "items": [ + 6097, + 22.0288 + ], + "hints": { + "index": 11133 + } + }, + { + "items": [ + 6097.5, + 21.559900283813477 + ], + "hints": { + "index": 11134 + } + }, + { + "items": [ + 6098, + 18.7721 + ], + "hints": { + "index": 11135 + } + }, + { + "items": [ + 6098.5, + 18.286699295043945 + ], + "hints": { + "index": 11136 + } + }, + { + "items": [ + 6099, + 16.7802 + ], + "hints": { + "index": 11137 + } + }, + { + "items": [ + 6099.5, + 14.784299850463867 + ], + "hints": { + "index": 11138 + } + }, + { + "items": [ + 6100, + 12.7909 + ], + "hints": { + "index": 11139 + } + }, + { + "items": [ + 6100.5, + 11.410099983215332 + ], + "hints": { + "index": 11140 + } + }, + { + "items": [ + 6101, + 10.7385 + ], + "hints": { + "index": 11141 + } + }, + { + "items": [ + 6101.5, + 10.0137 + ], + "hints": { + "index": 11142 + } + }, + { + "items": [ + 6102, + 10.2594 + ], + "hints": { + "index": 11143 + } + }, + { + "items": [ + 6102.5, + 11.9375 + ], + "hints": { + "index": 11144 + } + }, + { + "items": [ + 6103, + 13.1872 + ], + "hints": { + "index": 11145 + } + }, + { + "items": [ + 6103.5, + 14.3782 + ], + "hints": { + "index": 11146 + } + }, + { + "items": [ + 6104, + 14.6108 + ], + "hints": { + "index": 11147 + } + }, + { + "items": [ + 6104.5, + 15.0872 + ], + "hints": { + "index": 11148 + } + }, + { + "items": [ + 6105, + 16.4568 + ], + "hints": { + "index": 11149 + } + }, + { + "items": [ + 6105.5, + 15.5282 + ], + "hints": { + "index": 11150 + } + }, + { + "items": [ + 6106, + 14.8065 + ], + "hints": { + "index": 11151 + } + }, + { + "items": [ + 6106.5, + 10.3209 + ], + "hints": { + "index": 11152 + } + }, + { + "items": [ + 6107, + 8.7016 + ], + "hints": { + "index": 11153 + } + }, + { + "items": [ + 6107.5, + 8.5258998870849609 + ], + "hints": { + "index": 11154 + } + }, + { + "items": [ + 6108, + 9.7023 + ], + "hints": { + "index": 11155 + } + }, + { + "items": [ + 6108.5, + 9.8838 + ], + "hints": { + "index": 11156 + } + }, + { + "items": [ + 6109, + 10.2509 + ], + "hints": { + "index": 11157 + } + }, + { + "items": [ + 6109.5, + 10.0948 + ], + "hints": { + "index": 11158 + } + }, + { + "items": [ + 6110, + 9.2752 + ], + "hints": { + "index": 11159 + } + }, + { + "items": [ + 6110.5, + 7.7134 + ], + "hints": { + "index": 11160 + } + }, + { + "items": [ + 6111, + 7.8611 + ], + "hints": { + "index": 11161 + } + }, + { + "items": [ + 6111.5, + 9.5901 + ], + "hints": { + "index": 11162 + } + }, + { + "items": [ + 6112, + 12.6886 + ], + "hints": { + "index": 11163 + } + }, + { + "items": [ + 6112.5, + 13.7012 + ], + "hints": { + "index": 11164 + } + }, + { + "items": [ + 6113, + 12.022 + ], + "hints": { + "index": 11165 + } + }, + { + "items": [ + 6113.5, + 8.8815 + ], + "hints": { + "index": 11166 + } + }, + { + "items": [ + 6114, + 8.8036 + ], + "hints": { + "index": 11167 + } + }, + { + "items": [ + 6114.5, + 9.6262 + ], + "hints": { + "index": 11168 + } + }, + { + "items": [ + 6115, + 13.1372 + ], + "hints": { + "index": 11169 + } + }, + { + "items": [ + 6115.5, + 15.7389 + ], + "hints": { + "index": 11170 + } + }, + { + "items": [ + 6116, + 16.2806 + ], + "hints": { + "index": 11171 + } + }, + { + "items": [ + 6116.5, + 12.05 + ], + "hints": { + "index": 11172 + } + }, + { + "items": [ + 6117, + 8.8355 + ], + "hints": { + "index": 11173 + } + }, + { + "items": [ + 6117.5, + 7.6286 + ], + "hints": { + "index": 11174 + } + }, + { + "items": [ + 6118, + 8.1915 + ], + "hints": { + "index": 11175 + } + }, + { + "items": [ + 6118.5, + 9.8395 + ], + "hints": { + "index": 11176 + } + }, + { + "items": [ + 6119, + 9.6269 + ], + "hints": { + "index": 11177 + } + }, + { + "items": [ + 6119.5, + 9.7657 + ], + "hints": { + "index": 11178 + } + }, + { + "items": [ + 6120, + 8.6541 + ], + "hints": { + "index": 11179 + } + }, + { + "items": [ + 6120.5, + 9.5632 + ], + "hints": { + "index": 11180 + } + }, + { + "items": [ + 6121, + 10.41 + ], + "hints": { + "index": 11181 + } + }, + { + "items": [ + 6121.5, + 11.7046 + ], + "hints": { + "index": 11182 + } + }, + { + "items": [ + 6122, + 11.7966 + ], + "hints": { + "index": 11183 + } + }, + { + "items": [ + 6122.5, + 11.8421 + ], + "hints": { + "index": 11184 + } + }, + { + "items": [ + 6123, + 10.1677 + ], + "hints": { + "index": 11185 + } + }, + { + "items": [ + 6123.5, + 7.9111 + ], + "hints": { + "index": 11186 + } + }, + { + "items": [ + 6124, + 6.9151 + ], + "hints": { + "index": 11187 + } + }, + { + "items": [ + 6124.5, + 7.4693 + ], + "hints": { + "index": 11188 + } + }, + { + "items": [ + 6125, + 9.5321 + ], + "hints": { + "index": 11189 + } + }, + { + "items": [ + 6125.5, + 12.5409 + ], + "hints": { + "index": 11190 + } + }, + { + "items": [ + 6126, + 13.7856 + ], + "hints": { + "index": 11191 + } + }, + { + "items": [ + 6126.5, + 13.767900466918944 + ], + "hints": { + "index": 11192 + } + }, + { + "items": [ + 6127, + 12.8385 + ], + "hints": { + "index": 11193 + } + }, + { + "items": [ + 6127.5, + 12.199999809265137 + ], + "hints": { + "index": 11194 + } + }, + { + "items": [ + 6128, + 11.5767 + ], + "hints": { + "index": 11195 + } + }, + { + "items": [ + 6128.5, + 10.593899726867676 + ], + "hints": { + "index": 11196 + } + }, + { + "items": [ + 6129, + 11.1276 + ], + "hints": { + "index": 11197 + } + }, + { + "items": [ + 6129.5, + 11.958399772644045 + ], + "hints": { + "index": 11198 + } + }, + { + "items": [ + 6130, + 14.5674 + ], + "hints": { + "index": 11199 + } + }, + { + "items": [ + 6130.5, + 15.587599754333496 + ], + "hints": { + "index": 11200 + } + }, + { + "items": [ + 6131, + 15.7543 + ], + "hints": { + "index": 11201 + } + }, + { + "items": [ + 6131.5, + 12.490200042724608 + ], + "hints": { + "index": 11202 + } + }, + { + "items": [ + 6132, + 13.0044 + ], + "hints": { + "index": 11203 + } + }, + { + "items": [ + 6132.5, + 14.789999961853027 + ], + "hints": { + "index": 11204 + } + }, + { + "items": [ + 6133, + 18.1703 + ], + "hints": { + "index": 11205 + } + }, + { + "items": [ + 6133.5, + 15.9458 + ], + "hints": { + "index": 11206 + } + }, + { + "items": [ + 6134, + 13.4927 + ], + "hints": { + "index": 11207 + } + }, + { + "items": [ + 6134.5, + 12.056900024414063 + ], + "hints": { + "index": 11208 + } + }, + { + "items": [ + 6135, + 13.9074 + ], + "hints": { + "index": 11209 + } + }, + { + "items": [ + 6135.5, + 16.671300888061523 + ], + "hints": { + "index": 11210 + } + }, + { + "items": [ + 6136, + 15.6997 + ], + "hints": { + "index": 11211 + } + }, + { + "items": [ + 6136.5, + 12.982000350952148 + ], + "hints": { + "index": 11212 + } + }, + { + "items": [ + 6137, + 12.0961 + ], + "hints": { + "index": 11213 + } + }, + { + "items": [ + 6137.5, + 13.285300254821776 + ], + "hints": { + "index": 11214 + } + }, + { + "items": [ + 6138, + 14.3409 + ], + "hints": { + "index": 11215 + } + }, + { + "items": [ + 6138.5, + 13.948699951171877 + ], + "hints": { + "index": 11216 + } + }, + { + "items": [ + 6139, + 13.772199630737305 + ], + "hints": { + "index": 11217 + } + }, + { + "items": [ + 6139.5, + 12.458100318908691 + ], + "hints": { + "index": 11218 + } + }, + { + "items": [ + 6140, + 11.419899940490724 + ], + "hints": { + "index": 11219 + } + }, + { + "items": [ + 6140.5, + 11.4991 + ], + "hints": { + "index": 11220 + } + }, + { + "items": [ + 6141, + 13.280799865722656 + ], + "hints": { + "index": 11221 + } + }, + { + "items": [ + 6141.5, + 15.493200302124023 + ], + "hints": { + "index": 11222 + } + }, + { + "items": [ + 6142, + 16.686500549316406 + ], + "hints": { + "index": 11223 + } + }, + { + "items": [ + 6142.5, + 14.85319995880127 + ], + "hints": { + "index": 11224 + } + }, + { + "items": [ + 6143, + 12.774100303649902 + ], + "hints": { + "index": 11225 + } + }, + { + "items": [ + 6143.5, + 11.63230037689209 + ], + "hints": { + "index": 11226 + } + }, + { + "items": [ + 6144, + 12.687700271606444 + ], + "hints": { + "index": 11227 + } + }, + { + "items": [ + 6144.5, + 13.807700157165527 + ], + "hints": { + "index": 11228 + } + }, + { + "items": [ + 6145, + 14.658499717712402 + ], + "hints": { + "index": 11229 + } + }, + { + "items": [ + 6145.5, + 13.655900001525881 + ], + "hints": { + "index": 11230 + } + }, + { + "items": [ + 6146, + 14.798399925231934 + ], + "hints": { + "index": 11231 + } + }, + { + "items": [ + 6146.5, + 14.278499603271484 + ], + "hints": { + "index": 11232 + } + }, + { + "items": [ + 6147, + 12.55490016937256 + ], + "hints": { + "index": 11233 + } + }, + { + "items": [ + 6147.5, + 10.846199989318848 + ], + "hints": { + "index": 11234 + } + }, + { + "items": [ + 6148, + 10.951999664306641 + ], + "hints": { + "index": 11235 + } + }, + { + "items": [ + 6148.5, + 12.636799812316896 + ], + "hints": { + "index": 11236 + } + }, + { + "items": [ + 6149, + 14.207400321960447 + ], + "hints": { + "index": 11237 + } + }, + { + "items": [ + 6149.5, + 15.092700004577637 + ], + "hints": { + "index": 11238 + } + }, + { + "items": [ + 6150, + 15.695699691772459 + ], + "hints": { + "index": 11239 + } + }, + { + "items": [ + 6150.5, + 17.460399627685547 + ], + "hints": { + "index": 11240 + } + }, + { + "items": [ + 6151, + 20.381099700927734 + ], + "hints": { + "index": 11241 + } + }, + { + "items": [ + 6151.5, + 24.38640022277832 + ], + "hints": { + "index": 11242 + } + }, + { + "items": [ + 6152, + 24.116100311279297 + ], + "hints": { + "index": 11243 + } + }, + { + "items": [ + 6152.5, + 21.176300048828125 + ], + "hints": { + "index": 11244 + } + }, + { + "items": [ + 6153, + 17.969900131225586 + ], + "hints": { + "index": 11245 + } + }, + { + "items": [ + 6153.5, + 16.93950080871582 + ], + "hints": { + "index": 11246 + } + }, + { + "items": [ + 6154, + 16.922000885009766 + ], + "hints": { + "index": 11247 + } + }, + { + "items": [ + 6154.5, + 14.635600090026855 + ], + "hints": { + "index": 11248 + } + }, + { + "items": [ + 6155, + 14.062700271606444 + ], + "hints": { + "index": 11249 + } + }, + { + "items": [ + 6155.5, + 13.843199729919434 + ], + "hints": { + "index": 11250 + } + }, + { + "items": [ + 6156, + 15.447400093078612 + ], + "hints": { + "index": 11251 + } + }, + { + "items": [ + 6156.5, + 17.046300888061523 + ], + "hints": { + "index": 11252 + } + }, + { + "items": [ + 6157, + 20.111499786376953 + ], + "hints": { + "index": 11253 + } + }, + { + "items": [ + 6157.5, + 24.854499816894531 + ], + "hints": { + "index": 11254 + } + }, + { + "items": [ + 6158, + 24.078300476074219 + ], + "hints": { + "index": 11255 + } + }, + { + "items": [ + 6158.5, + 21.158599853515625 + ], + "hints": { + "index": 11256 + } + }, + { + "items": [ + 6159, + 18.844200134277344 + ], + "hints": { + "index": 11257 + } + }, + { + "items": [ + 6159.5, + 18.819000244140625 + ], + "hints": { + "index": 11258 + } + }, + { + "items": [ + 6160, + 18.884700775146484 + ], + "hints": { + "index": 11259 + } + }, + { + "items": [ + 6160.5, + 20.122900009155273 + ], + "hints": { + "index": 11260 + } + }, + { + "items": [ + 6161, + 21.289199829101559 + ], + "hints": { + "index": 11261 + } + }, + { + "items": [ + 6161.5, + 24.779600143432617 + ], + "hints": { + "index": 11262 + } + }, + { + "items": [ + 6162, + 26.743000030517575 + ], + "hints": { + "index": 11263 + } + }, + { + "items": [ + 6162.5, + 32.570899963378906 + ], + "hints": { + "index": 11264 + } + }, + { + "items": [ + 6163, + 32.627201080322266 + ], + "hints": { + "index": 11265 + } + }, + { + "items": [ + 6163.5, + 28.949899673461911 + ], + "hints": { + "index": 11266 + } + }, + { + "items": [ + 6164, + 25.8262996673584 + ], + "hints": { + "index": 11267 + } + }, + { + "items": [ + 6164.5, + 25.229700088500977 + ], + "hints": { + "index": 11268 + } + }, + { + "items": [ + 6165, + 28.042299270629883 + ], + "hints": { + "index": 11269 + } + }, + { + "items": [ + 6165.5, + 28.423900604248047 + ], + "hints": { + "index": 11270 + } + }, + { + "items": [ + 6166, + 25.228700637817383 + ], + "hints": { + "index": 11271 + } + }, + { + "items": [ + 6166.5, + 22.389299392700195 + ], + "hints": { + "index": 11272 + } + }, + { + "items": [ + 6167, + 20.436800003051761 + ], + "hints": { + "index": 11273 + } + }, + { + "items": [ + 6167.5, + 19.66819953918457 + ], + "hints": { + "index": 11274 + } + }, + { + "items": [ + 6168, + 20.983600616455082 + ], + "hints": { + "index": 11275 + } + }, + { + "items": [ + 6168.5, + 21.751399993896484 + ], + "hints": { + "index": 11276 + } + }, + { + "items": [ + 6169, + 22.483100891113281 + ], + "hints": { + "index": 11277 + } + }, + { + "items": [ + 6169.5, + 19.482000350952148 + ], + "hints": { + "index": 11278 + } + }, + { + "items": [ + 6170, + 16.616399765014648 + ], + "hints": { + "index": 11279 + } + }, + { + "items": [ + 6170.5, + 12.437999725341797 + ], + "hints": { + "index": 11280 + } + }, + { + "items": [ + 6171, + 10.4798002243042 + ], + "hints": { + "index": 11281 + } + }, + { + "items": [ + 6171.5, + 9.2817001342773438 + ], + "hints": { + "index": 11282 + } + }, + { + "items": [ + 6172, + 8.9753999710083 + ], + "hints": { + "index": 11283 + } + }, + { + "items": [ + 6172.5, + 7.8294000625610352 + ], + "hints": { + "index": 11284 + } + }, + { + "items": [ + 6173, + 7.04610013961792 + ], + "hints": { + "index": 11285 + } + }, + { + "items": [ + 6173.5, + 7.5897998809814444 + ], + "hints": { + "index": 11286 + } + }, + { + "items": [ + 6174, + 9.3795003890991211 + ], + "hints": { + "index": 11287 + } + }, + { + "items": [ + 6174.5, + 10.503800392150881 + ], + "hints": { + "index": 11288 + } + }, + { + "items": [ + 6175, + 10.680800437927246 + ], + "hints": { + "index": 11289 + } + }, + { + "items": [ + 6175.5, + 10.593899726867676 + ], + "hints": { + "index": 11290 + } + }, + { + "items": [ + 6176, + 12.544099807739258 + ], + "hints": { + "index": 11291 + } + }, + { + "items": [ + 6176.5, + 13.839500427246094 + ], + "hints": { + "index": 11292 + } + }, + { + "items": [ + 6177, + 12.714400291442873 + ], + "hints": { + "index": 11293 + } + }, + { + "items": [ + 6177.5, + 10.66919994354248 + ], + "hints": { + "index": 11294 + } + }, + { + "items": [ + 6178, + 10.531299591064451 + ], + "hints": { + "index": 11295 + } + }, + { + "items": [ + 6178.5, + 13.0405 + ], + "hints": { + "index": 11296 + } + }, + { + "items": [ + 6179, + 19.539400100708008 + ], + "hints": { + "index": 11297 + } + }, + { + "items": [ + 6179.5, + 24.294399261474609 + ], + "hints": { + "index": 11298 + } + }, + { + "items": [ + 6180, + 20.1072998046875 + ], + "hints": { + "index": 11299 + } + }, + { + "items": [ + 6180.5, + 17.7236 + ], + "hints": { + "index": 11300 + } + }, + { + "items": [ + 6181, + 16.033599853515625 + ], + "hints": { + "index": 11301 + } + }, + { + "items": [ + 6181.5, + 14.074700355529783 + ], + "hints": { + "index": 11302 + } + }, + { + "items": [ + 6182, + 11.065699577331545 + ], + "hints": { + "index": 11303 + } + }, + { + "items": [ + 6182.5, + 9.9697 + ], + "hints": { + "index": 11304 + } + }, + { + "items": [ + 6183, + 9.1232995986938477 + ], + "hints": { + "index": 11305 + } + }, + { + "items": [ + 6183.5, + 8.99899959564209 + ], + "hints": { + "index": 11306 + } + }, + { + "items": [ + 6184, + 8.3725004196167 + ], + "hints": { + "index": 11307 + } + }, + { + "items": [ + 6184.5, + 8.1352 + ], + "hints": { + "index": 11308 + } + }, + { + "items": [ + 6185, + 6.83050012588501 + ], + "hints": { + "index": 11309 + } + }, + { + "items": [ + 6185.5, + 5.755 + ], + "hints": { + "index": 11310 + } + }, + { + "items": [ + 6186, + 4.9636998176574707 + ], + "hints": { + "index": 11311 + } + }, + { + "items": [ + 6186.5, + 4.6708 + ], + "hints": { + "index": 11312 + } + }, + { + "items": [ + 6187, + 4.8498997688293457 + ], + "hints": { + "index": 11313 + } + }, + { + "items": [ + 6187.5, + 5.50029993057251 + ], + "hints": { + "index": 11314 + } + }, + { + "items": [ + 6188, + 6.8178000450134277 + ], + "hints": { + "index": 11315 + } + }, + { + "items": [ + 6188.5, + 8.1366 + ], + "hints": { + "index": 11316 + } + }, + { + "items": [ + 6189, + 7.9380998611450195 + ], + "hints": { + "index": 11317 + } + }, + { + "items": [ + 6189.5, + 6.972599983215332 + ], + "hints": { + "index": 11318 + } + }, + { + "items": [ + 6190, + 5.9194002151489258 + ], + "hints": { + "index": 11319 + } + }, + { + "items": [ + 6190.5, + 5.7566 + ], + "hints": { + "index": 11320 + } + }, + { + "items": [ + 6191, + 4.9987998008728027 + ], + "hints": { + "index": 11321 + } + }, + { + "items": [ + 6191.5, + 4.4015002250671387 + ], + "hints": { + "index": 11322 + } + }, + { + "items": [ + 6192, + 3.9331998825073242 + ], + "hints": { + "index": 11323 + } + }, + { + "items": [ + 6192.5, + 4.1841 + ], + "hints": { + "index": 11324 + } + }, + { + "items": [ + 6193, + 4.3421998023986816 + ], + "hints": { + "index": 11325 + } + }, + { + "items": [ + 6193.5, + 4.255 + ], + "hints": { + "index": 11326 + } + }, + { + "items": [ + 6194, + 3.7162001132965088 + ], + "hints": { + "index": 11327 + } + }, + { + "items": [ + 6194.5, + 3.3688 + ], + "hints": { + "index": 11328 + } + }, + { + "items": [ + 6195, + 3.2704999446868896 + ], + "hints": { + "index": 11329 + } + }, + { + "items": [ + 6195.5, + 3.2293999195098877 + ], + "hints": { + "index": 11330 + } + }, + { + "items": [ + 6196, + 3.299299955368042 + ], + "hints": { + "index": 11331 + } + }, + { + "items": [ + 6196.5, + 3.3243 + ], + "hints": { + "index": 11332 + } + }, + { + "items": [ + 6197, + 3.4402000904083252 + ], + "hints": { + "index": 11333 + } + }, + { + "items": [ + 6197.5, + 3.515300035476685 + ], + "hints": { + "index": 11334 + } + }, + { + "items": [ + 6198, + 3.4690001010894775 + ], + "hints": { + "index": 11335 + } + }, + { + "items": [ + 6198.5, + 3.385 + ], + "hints": { + "index": 11336 + } + }, + { + "items": [ + 6199, + 3.3778998851776123 + ], + "hints": { + "index": 11337 + } + }, + { + "items": [ + 6199.5, + 3.5190000534057617 + ], + "hints": { + "index": 11338 + } + }, + { + "items": [ + 6200, + 4.0173001289367676 + ], + "hints": { + "index": 11339 + } + }, + { + "items": [ + 6200.5, + 4.1025 + ], + "hints": { + "index": 11340 + } + }, + { + "items": [ + 6201, + 3.8814001083374023 + ], + "hints": { + "index": 11341 + } + }, + { + "items": [ + 6201.5, + 3.5949 + ], + "hints": { + "index": 11342 + } + }, + { + "items": [ + 6202, + 3.3761999607086186 + ], + "hints": { + "index": 11343 + } + }, + { + "items": [ + 6202.5, + 3.4621 + ], + "hints": { + "index": 11344 + } + }, + { + "items": [ + 6203, + 3.3705000877380371 + ], + "hints": { + "index": 11345 + } + }, + { + "items": [ + 6203.5, + 3.4000000953674316 + ], + "hints": { + "index": 11346 + } + }, + { + "items": [ + 6204, + 3.2527000904083252 + ], + "hints": { + "index": 11347 + } + }, + { + "items": [ + 6204.5, + 3.1733 + ], + "hints": { + "index": 11348 + } + }, + { + "items": [ + 6205, + 2.9865999221801758 + ], + "hints": { + "index": 11349 + } + }, + { + "items": [ + 6205.5, + 3.0854001045227051 + ], + "hints": { + "index": 11350 + } + }, + { + "items": [ + 6206, + 3.062999963760376 + ], + "hints": { + "index": 11351 + } + }, + { + "items": [ + 6206.5, + 3.1805 + ], + "hints": { + "index": 11352 + } + }, + { + "items": [ + 6207, + 3.1442999839782715 + ], + "hints": { + "index": 11353 + } + }, + { + "items": [ + 6207.5, + 3.2446999549865723 + ], + "hints": { + "index": 11354 + } + }, + { + "items": [ + 6208, + 3.2311000823974609 + ], + "hints": { + "index": 11355 + } + }, + { + "items": [ + 6208.5, + 3.1866 + ], + "hints": { + "index": 11356 + } + }, + { + "items": [ + 6209, + 3.0141000747680664 + ], + "hints": { + "index": 11357 + } + }, + { + "items": [ + 6209.5, + 3.1835999488830566 + ], + "hints": { + "index": 11358 + } + }, + { + "items": [ + 6210, + 3.2988998889923096 + ], + "hints": { + "index": 11359 + } + }, + { + "items": [ + 6210.5, + 3.3735 + ], + "hints": { + "index": 11360 + } + }, + { + "items": [ + 6211, + 3.2270998954772949 + ], + "hints": { + "index": 11361 + } + }, + { + "items": [ + 6211.5, + 3.1749000549316406 + ], + "hints": { + "index": 11362 + } + }, + { + "items": [ + 6212, + 3.1473000049591064 + ], + "hints": { + "index": 11363 + } + }, + { + "items": [ + 6212.5, + 3.1665 + ], + "hints": { + "index": 11364 + } + }, + { + "items": [ + 6213, + 3.1528000831604004 + ], + "hints": { + "index": 11365 + } + }, + { + "items": [ + 6213.5, + 3.2597000598907471 + ], + "hints": { + "index": 11366 + } + }, + { + "items": [ + 6214, + 3.3459999561309814 + ], + "hints": { + "index": 11367 + } + }, + { + "items": [ + 6214.5, + 3.4938 + ], + "hints": { + "index": 11368 + } + }, + { + "items": [ + 6215, + 3.4709000587463379 + ], + "hints": { + "index": 11369 + } + }, + { + "items": [ + 6215.5, + 3.4851000308990479 + ], + "hints": { + "index": 11370 + } + }, + { + "items": [ + 6216, + 3.3113999366760254 + ], + "hints": { + "index": 11371 + } + }, + { + "items": [ + 6216.5, + 3.3866 + ], + "hints": { + "index": 11372 + } + }, + { + "items": [ + 6217, + 3.3919000625610352 + ], + "hints": { + "index": 11373 + } + }, + { + "items": [ + 6217.5, + 3.473 + ], + "hints": { + "index": 11374 + } + }, + { + "items": [ + 6218, + 3.5083999633789063 + ], + "hints": { + "index": 11375 + } + }, + { + "items": [ + 6218.5, + 3.437 + ], + "hints": { + "index": 11376 + } + }, + { + "items": [ + 6219, + 3.4911000728607178 + ], + "hints": { + "index": 11377 + } + }, + { + "items": [ + 6219.5, + 3.3919000625610352 + ], + "hints": { + "index": 11378 + } + }, + { + "items": [ + 6220, + 3.3761999607086186 + ], + "hints": { + "index": 11379 + } + }, + { + "items": [ + 6220.5, + 3.2633 + ], + "hints": { + "index": 11380 + } + }, + { + "items": [ + 6221, + 3.2265000343322754 + ], + "hints": { + "index": 11381 + } + }, + { + "items": [ + 6221.5, + 3.1810998916625977 + ], + "hints": { + "index": 11382 + } + }, + { + "items": [ + 6222, + 3.2047998905181885 + ], + "hints": { + "index": 11383 + } + }, + { + "items": [ + 6222.5, + 3.2446 + ], + "hints": { + "index": 11384 + } + }, + { + "items": [ + 6223, + 3.4475998878479004 + ], + "hints": { + "index": 11385 + } + }, + { + "items": [ + 6223.5, + 3.4981999397277832 + ], + "hints": { + "index": 11386 + } + }, + { + "items": [ + 6224, + 3.4921998977661133 + ], + "hints": { + "index": 11387 + } + }, + { + "items": [ + 6224.5, + 3.3115 + ], + "hints": { + "index": 11388 + } + }, + { + "items": [ + 6225, + 3.2583999633789063 + ], + "hints": { + "index": 11389 + } + }, + { + "items": [ + 6225.5, + 3.1973 + ], + "hints": { + "index": 11390 + } + }, + { + "items": [ + 6226, + 3.1893999576568604 + ], + "hints": { + "index": 11391 + } + }, + { + "items": [ + 6226.5, + 3.2077 + ], + "hints": { + "index": 11392 + } + }, + { + "items": [ + 6227, + 3.3573999404907227 + ], + "hints": { + "index": 11393 + } + }, + { + "items": [ + 6227.5, + 3.4465999603271484 + ], + "hints": { + "index": 11394 + } + }, + { + "items": [ + 6228, + 3.4000000953674316 + ], + "hints": { + "index": 11395 + } + }, + { + "items": [ + 6228.5, + 3.4028 + ], + "hints": { + "index": 11396 + } + }, + { + "items": [ + 6229, + 3.2751998901367188 + ], + "hints": { + "index": 11397 + } + }, + { + "items": [ + 6229.5, + 3.2534000873565674 + ], + "hints": { + "index": 11398 + } + }, + { + "items": [ + 6230, + 3.2223999500274658 + ], + "hints": { + "index": 11399 + } + }, + { + "items": [ + 6230.5, + 3.4126 + ], + "hints": { + "index": 11400 + } + }, + { + "items": [ + 6231, + 3.5199999809265137 + ], + "hints": { + "index": 11401 + } + }, + { + "items": [ + 6231.5, + 3.4119000434875488 + ], + "hints": { + "index": 11402 + } + }, + { + "items": [ + 6232, + 3.4205000400543213 + ], + "hints": { + "index": 11403 + } + }, + { + "items": [ + 6232.5, + 3.3905 + ], + "hints": { + "index": 11404 + } + }, + { + "items": [ + 6233, + 3.5271000862121582 + ], + "hints": { + "index": 11405 + } + }, + { + "items": [ + 6233.5, + 3.4008 + ], + "hints": { + "index": 11406 + } + }, + { + "items": [ + 6234, + 3.5704998970031734 + ], + "hints": { + "index": 11407 + } + }, + { + "items": [ + 6234.5, + 3.5542 + ], + "hints": { + "index": 11408 + } + }, + { + "items": [ + 6235, + 3.5773000717163086 + ], + "hints": { + "index": 11409 + } + }, + { + "items": [ + 6235.5, + 3.4479999542236328 + ], + "hints": { + "index": 11410 + } + }, + { + "items": [ + 6236, + 3.4309999942779541 + ], + "hints": { + "index": 11411 + } + }, + { + "items": [ + 6236.5, + 3.4601 + ], + "hints": { + "index": 11412 + } + }, + { + "items": [ + 6237, + 3.3571000099182129 + ], + "hints": { + "index": 11413 + } + }, + { + "items": [ + 6237.5, + 3.2207999229431152 + ], + "hints": { + "index": 11414 + } + }, + { + "items": [ + 6238, + 3.1354999542236328 + ], + "hints": { + "index": 11415 + } + }, + { + "items": [ + 6238.5, + 3.1027 + ], + "hints": { + "index": 11416 + } + }, + { + "items": [ + 6239, + 3.2065999507904053 + ], + "hints": { + "index": 11417 + } + }, + { + "items": [ + 6239.5, + 3.2627999782562256 + ], + "hints": { + "index": 11418 + } + }, + { + "items": [ + 6240, + 3.4007999897003174 + ], + "hints": { + "index": 11419 + } + }, + { + "items": [ + 6240.5, + 3.488300085067749 + ], + "hints": { + "index": 11420 + } + }, + { + "items": [ + 6241, + 3.5931000709533691 + ], + "hints": { + "index": 11421 + } + }, + { + "items": [ + 6241.5, + 3.5599000453948975 + ], + "hints": { + "index": 11422 + } + }, + { + "items": [ + 6242, + 3.5771999359130859 + ], + "hints": { + "index": 11423 + } + }, + { + "items": [ + 6242.5, + 3.5374999046325684 + ], + "hints": { + "index": 11424 + } + }, + { + "items": [ + 6243, + 3.5356 + ], + "hints": { + "index": 11425 + } + }, + { + "items": [ + 6243.5, + 3.4158 + ], + "hints": { + "index": 11426 + } + }, + { + "items": [ + 6244, + 3.3891 + ], + "hints": { + "index": 11427 + } + }, + { + "items": [ + 6244.5, + 3.495 + ], + "hints": { + "index": 11428 + } + }, + { + "items": [ + 6245, + 3.5786 + ], + "hints": { + "index": 11429 + } + }, + { + "items": [ + 6245.5, + 3.5075 + ], + "hints": { + "index": 11430 + } + }, + { + "items": [ + 6246, + 3.2851 + ], + "hints": { + "index": 11431 + } + }, + { + "items": [ + 6246.5, + 3.303 + ], + "hints": { + "index": 11432 + } + }, + { + "items": [ + 6247, + 3.4107 + ], + "hints": { + "index": 11433 + } + }, + { + "items": [ + 6247.5, + 3.4505 + ], + "hints": { + "index": 11434 + } + }, + { + "items": [ + 6248, + 3.3771 + ], + "hints": { + "index": 11435 + } + }, + { + "items": [ + 6248.5, + 3.2322 + ], + "hints": { + "index": 11436 + } + }, + { + "items": [ + 6249, + 3.2556 + ], + "hints": { + "index": 11437 + } + }, + { + "items": [ + 6249.5, + 3.2247 + ], + "hints": { + "index": 11438 + } + }, + { + "items": [ + 6250, + 3.2983 + ], + "hints": { + "index": 11439 + } + }, + { + "items": [ + 6250.5, + 3.2704 + ], + "hints": { + "index": 11440 + } + }, + { + "items": [ + 6251, + 3.2284 + ], + "hints": { + "index": 11441 + } + }, + { + "items": [ + 6251.5, + 3.1916 + ], + "hints": { + "index": 11442 + } + }, + { + "items": [ + 6252, + 3.2 + ], + "hints": { + "index": 11443 + } + }, + { + "items": [ + 6252.5, + 3.2221 + ], + "hints": { + "index": 11444 + } + }, + { + "items": [ + 6253, + 3.2335 + ], + "hints": { + "index": 11445 + } + }, + { + "items": [ + 6253.5, + 3.2455 + ], + "hints": { + "index": 11446 + } + }, + { + "items": [ + 6254, + 3.2405 + ], + "hints": { + "index": 11447 + } + }, + { + "items": [ + 6254.5, + 3.2788 + ], + "hints": { + "index": 11448 + } + }, + { + "items": [ + 6255, + 3.2593 + ], + "hints": { + "index": 11449 + } + }, + { + "items": [ + 6255.5, + 3.1642 + ], + "hints": { + "index": 11450 + } + }, + { + "items": [ + 6256, + 3.0459 + ], + "hints": { + "index": 11451 + } + }, + { + "items": [ + 6256.5, + 3.0099 + ], + "hints": { + "index": 11452 + } + }, + { + "items": [ + 6257, + 3.0131 + ], + "hints": { + "index": 11453 + } + }, + { + "items": [ + 6257.5, + 2.905 + ], + "hints": { + "index": 11454 + } + }, + { + "items": [ + 6258, + 2.8451 + ], + "hints": { + "index": 11455 + } + }, + { + "items": [ + 6258.5, + 2.94 + ], + "hints": { + "index": 11456 + } + }, + { + "items": [ + 6259, + 3.0675 + ], + "hints": { + "index": 11457 + } + }, + { + "items": [ + 6259.5, + 3.1469 + ], + "hints": { + "index": 11458 + } + }, + { + "items": [ + 6260, + 3.0706 + ], + "hints": { + "index": 11459 + } + }, + { + "items": [ + 6260.5, + 3.0691 + ], + "hints": { + "index": 11460 + } + }, + { + "items": [ + 6261, + 3.1109 + ], + "hints": { + "index": 11461 + } + }, + { + "items": [ + 6261.5, + 3.0688 + ], + "hints": { + "index": 11462 + } + }, + { + "items": [ + 6262, + 3.029 + ], + "hints": { + "index": 11463 + } + }, + { + "items": [ + 6262.5, + 2.9632 + ], + "hints": { + "index": 11464 + } + }, + { + "items": [ + 6263, + 2.9337 + ], + "hints": { + "index": 11465 + } + }, + { + "items": [ + 6263.5, + 2.8712 + ], + "hints": { + "index": 11466 + } + }, + { + "items": [ + 6264, + 2.9657 + ], + "hints": { + "index": 11467 + } + }, + { + "items": [ + 6264.5, + 3.0624 + ], + "hints": { + "index": 11468 + } + }, + { + "items": [ + 6265, + 3.2509 + ], + "hints": { + "index": 11469 + } + }, + { + "items": [ + 6265.5, + 3.1933 + ], + "hints": { + "index": 11470 + } + }, + { + "items": [ + 6266, + 3.2021 + ], + "hints": { + "index": 11471 + } + }, + { + "items": [ + 6266.5, + 3.2496 + ], + "hints": { + "index": 11472 + } + }, + { + "items": [ + 6267, + 3.2771 + ], + "hints": { + "index": 11473 + } + }, + { + "items": [ + 6267.5, + 3.3747 + ], + "hints": { + "index": 11474 + } + }, + { + "items": [ + 6268, + 3.3634 + ], + "hints": { + "index": 11475 + } + }, + { + "items": [ + 6268.5, + 3.3834 + ], + "hints": { + "index": 11476 + } + }, + { + "items": [ + 6269, + 3.1596999168395996 + ], + "hints": { + "index": 11477 + } + }, + { + "items": [ + 6269.5, + 3.0569999217987061 + ], + "hints": { + "index": 11478 + } + }, + { + "items": [ + 6270, + 2.923799991607666 + ], + "hints": { + "index": 11479 + } + }, + { + "items": [ + 6270.5, + 3.0502998828887939 + ], + "hints": { + "index": 11480 + } + }, + { + "items": [ + 6271, + 3.0852000713348389 + ], + "hints": { + "index": 11481 + } + }, + { + "items": [ + 6271.5, + 3.1946001052856445 + ], + "hints": { + "index": 11482 + } + }, + { + "items": [ + 6272, + 3.2026998996734619 + ], + "hints": { + "index": 11483 + } + }, + { + "items": [ + 6272.5, + 3.0999000072479248 + ], + "hints": { + "index": 11484 + } + }, + { + "items": [ + 6273, + 2.9360001087188721 + ], + "hints": { + "index": 11485 + } + }, + { + "items": [ + 6273.5, + 2.8366999626159668 + ], + "hints": { + "index": 11486 + } + }, + { + "items": [ + 6274, + 2.79010009765625 + ], + "hints": { + "index": 11487 + } + }, + { + "items": [ + 6274.5, + 2.9547998905181885 + ], + "hints": { + "index": 11488 + } + }, + { + "items": [ + 6275, + 2.9235000610351558 + ], + "hints": { + "index": 11489 + } + }, + { + "items": [ + 6275.5, + 3.0278000831604004 + ], + "hints": { + "index": 11490 + } + }, + { + "items": [ + 6276, + 2.9252998828887939 + ], + "hints": { + "index": 11491 + } + }, + { + "items": [ + 6276.5, + 2.9790000915527344 + ], + "hints": { + "index": 11492 + } + }, + { + "items": [ + 6277, + 2.8620998859405522 + ], + "hints": { + "index": 11493 + } + }, + { + "items": [ + 6277.5, + 2.935499906539917 + ], + "hints": { + "index": 11494 + } + }, + { + "items": [ + 6278, + 2.899399995803833 + ], + "hints": { + "index": 11495 + } + }, + { + "items": [ + 6278.5, + 2.9923000335693359 + ], + "hints": { + "index": 11496 + } + }, + { + "items": [ + 6279, + 2.8538000583648682 + ], + "hints": { + "index": 11497 + } + }, + { + "items": [ + 6279.5, + 2.8859999179840088 + ], + "hints": { + "index": 11498 + } + }, + { + "items": [ + 6280, + 2.8159999847412109 + ], + "hints": { + "index": 11499 + } + }, + { + "items": [ + 6280.5, + 2.8942999839782715 + ], + "hints": { + "index": 11500 + } + }, + { + "items": [ + 6281, + 2.83240008354187 + ], + "hints": { + "index": 11501 + } + }, + { + "items": [ + 6281.5, + 2.9049999713897705 + ], + "hints": { + "index": 11502 + } + }, + { + "items": [ + 6282, + 2.8545999526977539 + ], + "hints": { + "index": 11503 + } + }, + { + "items": [ + 6282.5, + 2.8603999614715576 + ], + "hints": { + "index": 11504 + } + }, + { + "items": [ + 6283, + 2.878000020980835 + ], + "hints": { + "index": 11505 + } + }, + { + "items": [ + 6283.5, + 2.9042999744415283 + ], + "hints": { + "index": 11506 + } + }, + { + "items": [ + 6284, + 3.0250999927520752 + ], + "hints": { + "index": 11507 + } + }, + { + "items": [ + 6284.5, + 3.1315999031066895 + ], + "hints": { + "index": 11508 + } + }, + { + "items": [ + 6285, + 3.1691999435424805 + ], + "hints": { + "index": 11509 + } + }, + { + "items": [ + 6285.5, + 3.1519999504089355 + ], + "hints": { + "index": 11510 + } + }, + { + "items": [ + 6286, + 3.1140000820159912 + ], + "hints": { + "index": 11511 + } + }, + { + "items": [ + 6286.5, + 3.3108999729156494 + ], + "hints": { + "index": 11512 + } + }, + { + "items": [ + 6287, + 3.4853000640869141 + ], + "hints": { + "index": 11513 + } + }, + { + "items": [ + 6287.5, + 3.6094999313354497 + ], + "hints": { + "index": 11514 + } + }, + { + "items": [ + 6288, + 3.5906999111175537 + ], + "hints": { + "index": 11515 + } + }, + { + "items": [ + 6288.5, + 3.5643999576568604 + ], + "hints": { + "index": 11516 + } + }, + { + "items": [ + 6289, + 3.512700080871582 + ], + "hints": { + "index": 11517 + } + }, + { + "items": [ + 6289.5, + 3.5394001007080078 + ], + "hints": { + "index": 11518 + } + }, + { + "items": [ + 6290, + 3.5578000545501709 + ], + "hints": { + "index": 11519 + } + }, + { + "items": [ + 6290.5, + 3.6045999526977535 + ], + "hints": { + "index": 11520 + } + }, + { + "items": [ + 6291, + 3.6185998916625977 + ], + "hints": { + "index": 11521 + } + }, + { + "items": [ + 6291.5, + 3.5794000625610352 + ], + "hints": { + "index": 11522 + } + }, + { + "items": [ + 6292, + 3.7014000415802 + ], + "hints": { + "index": 11523 + } + }, + { + "items": [ + 6292.5, + 3.7892000675201416 + ], + "hints": { + "index": 11524 + } + }, + { + "items": [ + 6293, + 3.9734001159667969 + ], + "hints": { + "index": 11525 + } + }, + { + "items": [ + 6293.5, + 3.9986000061035152 + ], + "hints": { + "index": 11526 + } + }, + { + "items": [ + 6294, + 4.0692000389099121 + ], + "hints": { + "index": 11527 + } + }, + { + "items": [ + 6294.5, + 4.1658000946044922 + ], + "hints": { + "index": 11528 + } + }, + { + "items": [ + 6295, + 4.253699779510498 + ], + "hints": { + "index": 11529 + } + }, + { + "items": [ + 6295.5, + 4.2402000427246094 + ], + "hints": { + "index": 11530 + } + }, + { + "items": [ + 6296, + 4.1153998374938965 + ], + "hints": { + "index": 11531 + } + }, + { + "items": [ + 6296.5, + 4.0760002136230469 + ], + "hints": { + "index": 11532 + } + }, + { + "items": [ + 6297, + 4.1234002113342285 + ], + "hints": { + "index": 11533 + } + }, + { + "items": [ + 6297.5, + 4.30709981918335 + ], + "hints": { + "index": 11534 + } + }, + { + "items": [ + 6298, + 4.4187002182006836 + ], + "hints": { + "index": 11535 + } + }, + { + "items": [ + 6298.5, + 4.5932002067565918 + ], + "hints": { + "index": 11536 + } + }, + { + "items": [ + 6299, + 4.5894999504089355 + ], + "hints": { + "index": 11537 + } + }, + { + "items": [ + 6299.5, + 4.4986000061035156 + ], + "hints": { + "index": 11538 + } + }, + { + "items": [ + 6300, + 4.3550000190734863 + ], + "hints": { + "index": 11539 + } + }, + { + "items": [ + 6300.5, + 4.2967000007629395 + ], + "hints": { + "index": 11540 + } + }, + { + "items": [ + 6301, + 4.3111000061035156 + ], + "hints": { + "index": 11541 + } + }, + { + "items": [ + 6301.5, + 4.3632001876831055 + ], + "hints": { + "index": 11542 + } + }, + { + "items": [ + 6302, + 4.2290000915527344 + ], + "hints": { + "index": 11543 + } + }, + { + "items": [ + 6302.5, + 4.3257999420166016 + ], + "hints": { + "index": 11544 + } + }, + { + "items": [ + 6303, + 4.28980016708374 + ], + "hints": { + "index": 11545 + } + }, + { + "items": [ + 6303.5, + 4.8249998092651367 + ], + "hints": { + "index": 11546 + } + }, + { + "items": [ + 6304, + 5.0018000602722168 + ], + "hints": { + "index": 11547 + } + }, + { + "items": [ + 6304.5, + 4.0378999710083008 + ], + "hints": { + "index": 11548 + } + }, + { + "items": [ + 6305, + 3.2392001152038574 + ], + "hints": { + "index": 11549 + } + }, + { + "items": [ + 6305.5, + 2.6352999210357666 + ], + "hints": { + "index": 11550 + } + }, + { + "items": [ + 6306, + 2.7797999382019043 + ], + "hints": { + "index": 11551 + } + }, + { + "items": [ + 6306.5, + 2.8575000762939453 + ], + "hints": { + "index": 11552 + } + }, + { + "items": [ + 6307, + 2.9309999942779541 + ], + "hints": { + "index": 11553 + } + }, + { + "items": [ + 6307.5, + 2.8138000965118408 + ], + "hints": { + "index": 11554 + } + }, + { + "items": [ + 6308, + 2.7855000495910645 + ], + "hints": { + "index": 11555 + } + }, + { + "items": [ + 6308.5, + 2.7223000526428223 + ], + "hints": { + "index": 11556 + } + }, + { + "items": [ + 6309, + 2.7535998821258545 + ], + "hints": { + "index": 11557 + } + }, + { + "items": [ + 6309.5, + 2.7948000431060791 + ], + "hints": { + "index": 11558 + } + }, + { + "items": [ + 6310, + 2.9244000911712646 + ], + "hints": { + "index": 11559 + } + }, + { + "items": [ + 6310.5, + 3.0185000896453857 + ], + "hints": { + "index": 11560 + } + }, + { + "items": [ + 6311, + 3.1175999641418457 + ], + "hints": { + "index": 11561 + } + }, + { + "items": [ + 6311.5, + 3.1877999305725098 + ], + "hints": { + "index": 11562 + } + }, + { + "items": [ + 6312, + 3.7572999000549312 + ], + "hints": { + "index": 11563 + } + }, + { + "items": [ + 6312.5, + 5.1842999458312988 + ], + "hints": { + "index": 11564 + } + }, + { + "items": [ + 6313, + 6.7694001197814941 + ], + "hints": { + "index": 11565 + } + }, + { + "items": [ + 6313.5, + 8.7274999618530273 + ], + "hints": { + "index": 11566 + } + }, + { + "items": [ + 6314, + 8.8514003753662109 + ], + "hints": { + "index": 11567 + } + }, + { + "items": [ + 6314.5, + 7.06879997253418 + ], + "hints": { + "index": 11568 + } + }, + { + "items": [ + 6315, + 4.6094999313354492 + ], + "hints": { + "index": 11569 + } + }, + { + "items": [ + 6315.5, + 3.2112998962402344 + ], + "hints": { + "index": 11570 + } + }, + { + "items": [ + 6316, + 2.9530000686645508 + ], + "hints": { + "index": 11571 + } + }, + { + "items": [ + 6316.5, + 3.04229998588562 + ], + "hints": { + "index": 11572 + } + }, + { + "items": [ + 6317, + 3.1496999263763428 + ], + "hints": { + "index": 11573 + } + }, + { + "items": [ + 6317.5, + 3.0927000045776367 + ], + "hints": { + "index": 11574 + } + }, + { + "items": [ + 6318, + 3.03629994392395 + ], + "hints": { + "index": 11575 + } + }, + { + "items": [ + 6318.5, + 2.9969000816345215 + ], + "hints": { + "index": 11576 + } + }, + { + "items": [ + 6319, + 3.1363000869750977 + ], + "hints": { + "index": 11577 + } + }, + { + "items": [ + 6319.5, + 3.127500057220459 + ], + "hints": { + "index": 11578 + } + }, + { + "items": [ + 6320, + 3.0460000038146973 + ], + "hints": { + "index": 11579 + } + }, + { + "items": [ + 6320.5, + 2.934999942779541 + ], + "hints": { + "index": 11580 + } + }, + { + "items": [ + 6321, + 2.9205000400543213 + ], + "hints": { + "index": 11581 + } + }, + { + "items": [ + 6321.5, + 3.0833001136779785 + ], + "hints": { + "index": 11582 + } + }, + { + "items": [ + 6322, + 3.0738999843597412 + ], + "hints": { + "index": 11583 + } + }, + { + "items": [ + 6322.5, + 3.0957999229431152 + ], + "hints": { + "index": 11584 + } + }, + { + "items": [ + 6323, + 2.9453999996185303 + ], + "hints": { + "index": 11585 + } + }, + { + "items": [ + 6323.5, + 2.9876000881195068 + ], + "hints": { + "index": 11586 + } + }, + { + "items": [ + 6324, + 2.9347000122070313 + ], + "hints": { + "index": 11587 + } + }, + { + "items": [ + 6324.5, + 2.9446001052856445 + ], + "hints": { + "index": 11588 + } + }, + { + "items": [ + 6325, + 2.9166998863220215 + ], + "hints": { + "index": 11589 + } + }, + { + "items": [ + 6325.5, + 2.88319993019104 + ], + "hints": { + "index": 11590 + } + }, + { + "items": [ + 6326, + 2.9140000343322754 + ], + "hints": { + "index": 11591 + } + }, + { + "items": [ + 6326.5, + 2.890700101852417 + ], + "hints": { + "index": 11592 + } + }, + { + "items": [ + 6327, + 2.938499927520752 + ], + "hints": { + "index": 11593 + } + }, + { + "items": [ + 6327.5, + 2.9521999359130859 + ], + "hints": { + "index": 11594 + } + }, + { + "items": [ + 6328, + 2.9463000297546387 + ], + "hints": { + "index": 11595 + } + }, + { + "items": [ + 6328.5, + 2.9921998977661133 + ], + "hints": { + "index": 11596 + } + }, + { + "items": [ + 6329, + 2.9846000671386719 + ], + "hints": { + "index": 11597 + } + }, + { + "items": [ + 6329.5, + 3.0796000957489018 + ], + "hints": { + "index": 11598 + } + }, + { + "items": [ + 6330, + 3.04010009765625 + ], + "hints": { + "index": 11599 + } + }, + { + "items": [ + 6330.5, + 3.0186998844146729 + ], + "hints": { + "index": 11600 + } + }, + { + "items": [ + 6331, + 3.011699914932251 + ], + "hints": { + "index": 11601 + } + }, + { + "items": [ + 6331.5, + 2.9832999706268311 + ], + "hints": { + "index": 11602 + } + }, + { + "items": [ + 6332, + 3.0364000797271729 + ], + "hints": { + "index": 11603 + } + }, + { + "items": [ + 6332.5, + 3.0378999710083008 + ], + "hints": { + "index": 11604 + } + }, + { + "items": [ + 6333, + 3.0520999431610107 + ], + "hints": { + "index": 11605 + } + }, + { + "items": [ + 6333.5, + 3.0961999893188477 + ], + "hints": { + "index": 11606 + } + }, + { + "items": [ + 6334, + 3.0776000022888184 + ], + "hints": { + "index": 11607 + } + }, + { + "items": [ + 6334.5, + 3.0864999294281006 + ], + "hints": { + "index": 11608 + } + }, + { + "items": [ + 6335, + 3.089400053024292 + ], + "hints": { + "index": 11609 + } + }, + { + "items": [ + 6335.5, + 3.1119999885559082 + ], + "hints": { + "index": 11610 + } + }, + { + "items": [ + 6336, + 3.2481999397277832 + ], + "hints": { + "index": 11611 + } + }, + { + "items": [ + 6336.5, + 3.1658000946044922 + ], + "hints": { + "index": 11612 + } + }, + { + "items": [ + 6337, + 3.1084001064300537 + ], + "hints": { + "index": 11613 + } + }, + { + "items": [ + 6337.5, + 3.0051999092102051 + ], + "hints": { + "index": 11614 + } + }, + { + "items": [ + 6338, + 3.0206000804901123 + ], + "hints": { + "index": 11615 + } + }, + { + "items": [ + 6338.5, + 3.1426000595092773 + ], + "hints": { + "index": 11616 + } + }, + { + "items": [ + 6339, + 3.1673998832702637 + ], + "hints": { + "index": 11617 + } + }, + { + "items": [ + 6339.5, + 3.1505999565124512 + ], + "hints": { + "index": 11618 + } + }, + { + "items": [ + 6340, + 3.1252999305725098 + ], + "hints": { + "index": 11619 + } + }, + { + "items": [ + 6340.5, + 3.1480000019073486 + ], + "hints": { + "index": 11620 + } + }, + { + "items": [ + 6341, + 3.2801001071929932 + ], + "hints": { + "index": 11621 + } + }, + { + "items": [ + 6341.5, + 3.2372000217437744 + ], + "hints": { + "index": 11622 + } + }, + { + "items": [ + 6342, + 3.1891999244689941 + ], + "hints": { + "index": 11623 + } + }, + { + "items": [ + 6342.5, + 3.0148000717163086 + ], + "hints": { + "index": 11624 + } + }, + { + "items": [ + 6343, + 3.082799911499023 + ], + "hints": { + "index": 11625 + } + }, + { + "items": [ + 6343.5, + 3.1308999061584473 + ], + "hints": { + "index": 11626 + } + }, + { + "items": [ + 6344, + 3.2818999290466309 + ], + "hints": { + "index": 11627 + } + }, + { + "items": [ + 6344.5, + 3.3169000148773193 + ], + "hints": { + "index": 11628 + } + }, + { + "items": [ + 6345, + 3.4119999408721924 + ], + "hints": { + "index": 11629 + } + }, + { + "items": [ + 6345.5, + 3.46370005607605 + ], + "hints": { + "index": 11630 + } + }, + { + "items": [ + 6346, + 3.447700023651123 + ], + "hints": { + "index": 11631 + } + }, + { + "items": [ + 6346.5, + 3.457799911499023 + ], + "hints": { + "index": 11632 + } + }, + { + "items": [ + 6347, + 3.688499927520752 + ], + "hints": { + "index": 11633 + } + }, + { + "items": [ + 6347.5, + 4.0963997840881348 + ], + "hints": { + "index": 11634 + } + }, + { + "items": [ + 6348, + 4.2722001075744629 + ], + "hints": { + "index": 11635 + } + }, + { + "items": [ + 6348.5, + 4.3305997848510742 + ], + "hints": { + "index": 11636 + } + }, + { + "items": [ + 6349, + 4.3657999038696289 + ], + "hints": { + "index": 11637 + } + }, + { + "items": [ + 6349.5, + 4.5076999664306641 + ], + "hints": { + "index": 11638 + } + }, + { + "items": [ + 6350, + 4.35860013961792 + ], + "hints": { + "index": 11639 + } + }, + { + "items": [ + 6350.5, + 4.3229999542236328 + ], + "hints": { + "index": 11640 + } + }, + { + "items": [ + 6351, + 4.4444999694824219 + ], + "hints": { + "index": 11641 + } + }, + { + "items": [ + 6351.5, + 3.9825000762939458 + ], + "hints": { + "index": 11642 + } + }, + { + "items": [ + 6352, + 3.301399946212769 + ], + "hints": { + "index": 11643 + } + }, + { + "items": [ + 6352.5, + 2.8914000988006592 + ], + "hints": { + "index": 11644 + } + }, + { + "items": [ + 6353, + 2.9193000793457031 + ], + "hints": { + "index": 11645 + } + }, + { + "items": [ + 6353.5, + 3.1324999332427979 + ], + "hints": { + "index": 11646 + } + }, + { + "items": [ + 6354, + 3.2444000244140625 + ], + "hints": { + "index": 11647 + } + }, + { + "items": [ + 6354.5, + 3.2792000770568848 + ], + "hints": { + "index": 11648 + } + }, + { + "items": [ + 6355, + 3.1779000759124756 + ], + "hints": { + "index": 11649 + } + }, + { + "items": [ + 6355.5, + 3.1537001132965088 + ], + "hints": { + "index": 11650 + } + }, + { + "items": [ + 6356, + 3.2653999328613281 + ], + "hints": { + "index": 11651 + } + }, + { + "items": [ + 6356.5, + 3.32669997215271 + ], + "hints": { + "index": 11652 + } + }, + { + "items": [ + 6357, + 3.3320000171661377 + ], + "hints": { + "index": 11653 + } + }, + { + "items": [ + 6357.5, + 3.667700052261353 + ], + "hints": { + "index": 11654 + } + }, + { + "items": [ + 6358, + 4.53249979019165 + ], + "hints": { + "index": 11655 + } + }, + { + "items": [ + 6358.5, + 5.6630997657775879 + ], + "hints": { + "index": 11656 + } + }, + { + "items": [ + 6359, + 5.95550012588501 + ], + "hints": { + "index": 11657 + } + }, + { + "items": [ + 6359.5, + 5.426300048828125 + ], + "hints": { + "index": 11658 + } + }, + { + "items": [ + 6360, + 4.9102001190185547 + ], + "hints": { + "index": 11659 + } + }, + { + "items": [ + 6360.5, + 4.7715001106262207 + ], + "hints": { + "index": 11660 + } + }, + { + "items": [ + 6361, + 4.2649998664855957 + ], + "hints": { + "index": 11661 + } + }, + { + "items": [ + 6361.5, + 4.1244001388549805 + ], + "hints": { + "index": 11662 + } + }, + { + "items": [ + 6362, + 4.1237001419067383 + ], + "hints": { + "index": 11663 + } + }, + { + "items": [ + 6362.5, + 4.3934001922607422 + ], + "hints": { + "index": 11664 + } + }, + { + "items": [ + 6363, + 4.8838000297546387 + ], + "hints": { + "index": 11665 + } + }, + { + "items": [ + 6363.5, + 6.3333001136779785 + ], + "hints": { + "index": 11666 + } + }, + { + "items": [ + 6364, + 7.7699999809265137 + ], + "hints": { + "index": 11667 + } + }, + { + "items": [ + 6364.5, + 8.094599723815918 + ], + "hints": { + "index": 11668 + } + }, + { + "items": [ + 6365, + 6.6504001617431641 + ], + "hints": { + "index": 11669 + } + }, + { + "items": [ + 6365.5, + 6.407599925994873 + ], + "hints": { + "index": 11670 + } + }, + { + "items": [ + 6366, + 6.36929988861084 + ], + "hints": { + "index": 11671 + } + }, + { + "items": [ + 6366.5, + 5.0311999320983887 + ], + "hints": { + "index": 11672 + } + }, + { + "items": [ + 6367, + 3.8278999328613281 + ], + "hints": { + "index": 11673 + } + }, + { + "items": [ + 6367.5, + 3.22979998588562 + ], + "hints": { + "index": 11674 + } + }, + { + "items": [ + 6368, + 3.3194000720977783 + ], + "hints": { + "index": 11675 + } + }, + { + "items": [ + 6368.5, + 4.2239999771118164 + ], + "hints": { + "index": 11676 + } + }, + { + "items": [ + 6369, + 5.2494997978210449 + ], + "hints": { + "index": 11677 + } + }, + { + "items": [ + 6369.5, + 6.0759000778198242 + ], + "hints": { + "index": 11678 + } + }, + { + "items": [ + 6370, + 6.137199878692627 + ], + "hints": { + "index": 11679 + } + }, + { + "items": [ + 6370.5, + 5.1082000732421875 + ], + "hints": { + "index": 11680 + } + }, + { + "items": [ + 6371, + 4.2340002059936523 + ], + "hints": { + "index": 11681 + } + }, + { + "items": [ + 6371.5, + 3.348099946975708 + ], + "hints": { + "index": 11682 + } + }, + { + "items": [ + 6372, + 3.1419000625610352 + ], + "hints": { + "index": 11683 + } + }, + { + "items": [ + 6372.5, + 3.4391000270843506 + ], + "hints": { + "index": 11684 + } + }, + { + "items": [ + 6373, + 3.8034000396728511 + ], + "hints": { + "index": 11685 + } + }, + { + "items": [ + 6373.5, + 3.9144001007080078 + ], + "hints": { + "index": 11686 + } + }, + { + "items": [ + 6374, + 3.4723000526428223 + ], + "hints": { + "index": 11687 + } + }, + { + "items": [ + 6374.5, + 3.2088000774383545 + ], + "hints": { + "index": 11688 + } + }, + { + "items": [ + 6375, + 2.9909999370574951 + ], + "hints": { + "index": 11689 + } + }, + { + "items": [ + 6375.5, + 2.9655001163482666 + ], + "hints": { + "index": 11690 + } + }, + { + "items": [ + 6376, + 2.9047000408172607 + ], + "hints": { + "index": 11691 + } + }, + { + "items": [ + 6376.5, + 2.8942999839782715 + ], + "hints": { + "index": 11692 + } + }, + { + "items": [ + 6377, + 2.86899995803833 + ], + "hints": { + "index": 11693 + } + }, + { + "items": [ + 6377.5, + 2.8469998836517334 + ], + "hints": { + "index": 11694 + } + }, + { + "items": [ + 6378, + 2.8980000019073486 + ], + "hints": { + "index": 11695 + } + }, + { + "items": [ + 6378.5, + 2.9939000606536865 + ], + "hints": { + "index": 11696 + } + }, + { + "items": [ + 6379, + 3.1810998916625977 + ], + "hints": { + "index": 11697 + } + }, + { + "items": [ + 6379.5, + 3.3559000492095947 + ], + "hints": { + "index": 11698 + } + }, + { + "items": [ + 6380, + 3.447700023651123 + ], + "hints": { + "index": 11699 + } + }, + { + "items": [ + 6380.5, + 3.6084001064300537 + ], + "hints": { + "index": 11700 + } + }, + { + "items": [ + 6381, + 3.7634999752044682 + ], + "hints": { + "index": 11701 + } + }, + { + "items": [ + 6381.5, + 3.5490000247955318 + ], + "hints": { + "index": 11702 + } + }, + { + "items": [ + 6382, + 3.2460000514984131 + ], + "hints": { + "index": 11703 + } + }, + { + "items": [ + 6382.5, + 3.0385000705718994 + ], + "hints": { + "index": 11704 + } + }, + { + "items": [ + 6383, + 3.0002999305725098 + ], + "hints": { + "index": 11705 + } + }, + { + "items": [ + 6383.5, + 2.8034000396728516 + ], + "hints": { + "index": 11706 + } + }, + { + "items": [ + 6384, + 2.6846001148223877 + ], + "hints": { + "index": 11707 + } + }, + { + "items": [ + 6384.5, + 2.7355000972747803 + ], + "hints": { + "index": 11708 + } + }, + { + "items": [ + 6385, + 3.1329998970031734 + ], + "hints": { + "index": 11709 + } + }, + { + "items": [ + 6385.5, + 3.3278999328613281 + ], + "hints": { + "index": 11710 + } + }, + { + "items": [ + 6386, + 3.1851999759674072 + ], + "hints": { + "index": 11711 + } + }, + { + "items": [ + 6386.5, + 2.8717000484466553 + ], + "hints": { + "index": 11712 + } + }, + { + "items": [ + 6387, + 2.6508998870849609 + ], + "hints": { + "index": 11713 + } + }, + { + "items": [ + 6387.5, + 2.6823000907897949 + ], + "hints": { + "index": 11714 + } + }, + { + "items": [ + 6388, + 2.6614999771118164 + ], + "hints": { + "index": 11715 + } + }, + { + "items": [ + 6388.5, + 2.7207999229431152 + ], + "hints": { + "index": 11716 + } + }, + { + "items": [ + 6389, + 2.7204999923706055 + ], + "hints": { + "index": 11717 + } + }, + { + "items": [ + 6389.5, + 2.8248000144958496 + ], + "hints": { + "index": 11718 + } + }, + { + "items": [ + 6390, + 2.8480000495910645 + ], + "hints": { + "index": 11719 + } + }, + { + "items": [ + 6390.5, + 2.8661000728607178 + ], + "hints": { + "index": 11720 + } + }, + { + "items": [ + 6391, + 2.793100118637085 + ], + "hints": { + "index": 11721 + } + }, + { + "items": [ + 6391.5, + 2.7406001091003418 + ], + "hints": { + "index": 11722 + } + }, + { + "items": [ + 6392, + 2.7809000015258789 + ], + "hints": { + "index": 11723 + } + }, + { + "items": [ + 6392.5, + 3.086999893188477 + ], + "hints": { + "index": 11724 + } + }, + { + "items": [ + 6393, + 3.4244000911712646 + ], + "hints": { + "index": 11725 + } + }, + { + "items": [ + 6393.5, + 4.362299919128418 + ], + "hints": { + "index": 11726 + } + }, + { + "items": [ + 6394, + 4.8494000434875488 + ], + "hints": { + "index": 11727 + } + }, + { + "items": [ + 6394.5, + 5.7010998725891113 + ], + "hints": { + "index": 11728 + } + }, + { + "items": [ + 6395, + 4.9482002258300781 + ], + "hints": { + "index": 11729 + } + }, + { + "items": [ + 6395.5, + 4.6965999603271484 + ], + "hints": { + "index": 11730 + } + }, + { + "items": [ + 6396, + 4.091400146484375 + ], + "hints": { + "index": 11731 + } + }, + { + "items": [ + 6396.5, + 4.0928 + ], + "hints": { + "index": 11732 + } + }, + { + "items": [ + 6397, + 3.9842 + ], + "hints": { + "index": 11733 + } + }, + { + "items": [ + 6397.5, + 4.4104 + ], + "hints": { + "index": 11734 + } + }, + { + "items": [ + 6398, + 4.8775 + ], + "hints": { + "index": 11735 + } + }, + { + "items": [ + 6398.5, + 5.3737 + ], + "hints": { + "index": 11736 + } + }, + { + "items": [ + 6399, + 5.4801 + ], + "hints": { + "index": 11737 + } + }, + { + "items": [ + 6399.5, + 6.4034 + ], + "hints": { + "index": 11738 + } + }, + { + "items": [ + 6400, + 7.5836 + ], + "hints": { + "index": 11739 + } + }, + { + "items": [ + 6400.5, + 8.8769 + ], + "hints": { + "index": 11740 + } + }, + { + "items": [ + 6401, + 7.7384 + ], + "hints": { + "index": 11741 + } + }, + { + "items": [ + 6401.5, + 5.6142 + ], + "hints": { + "index": 11742 + } + }, + { + "items": [ + 6402, + 4.6441 + ], + "hints": { + "index": 11743 + } + }, + { + "items": [ + 6402.5, + 4.3552 + ], + "hints": { + "index": 11744 + } + }, + { + "items": [ + 6403, + 4.3649 + ], + "hints": { + "index": 11745 + } + }, + { + "items": [ + 6403.5, + 4.5296 + ], + "hints": { + "index": 11746 + } + }, + { + "items": [ + 6404, + 4.1405 + ], + "hints": { + "index": 11747 + } + }, + { + "items": [ + 6404.5, + 4.3637 + ], + "hints": { + "index": 11748 + } + }, + { + "items": [ + 6405, + 4.7858 + ], + "hints": { + "index": 11749 + } + }, + { + "items": [ + 6405.5, + 5.5638 + ], + "hints": { + "index": 11750 + } + }, + { + "items": [ + 6406, + 4.8402 + ], + "hints": { + "index": 11751 + } + }, + { + "items": [ + 6406.5, + 4.0405 + ], + "hints": { + "index": 11752 + } + }, + { + "items": [ + 6407, + 3.7445 + ], + "hints": { + "index": 11753 + } + }, + { + "items": [ + 6407.5, + 3.7143 + ], + "hints": { + "index": 11754 + } + }, + { + "items": [ + 6408, + 3.9609 + ], + "hints": { + "index": 11755 + } + }, + { + "items": [ + 6408.5, + 4.0731 + ], + "hints": { + "index": 11756 + } + }, + { + "items": [ + 6409, + 5.0213 + ], + "hints": { + "index": 11757 + } + }, + { + "items": [ + 6409.5, + 5.7084 + ], + "hints": { + "index": 11758 + } + }, + { + "items": [ + 6410, + 5.9713 + ], + "hints": { + "index": 11759 + } + }, + { + "items": [ + 6410.5, + 4.9858 + ], + "hints": { + "index": 11760 + } + }, + { + "items": [ + 6411, + 3.7597 + ], + "hints": { + "index": 11761 + } + }, + { + "items": [ + 6411.5, + 3.1743 + ], + "hints": { + "index": 11762 + } + }, + { + "items": [ + 6412, + 2.9409 + ], + "hints": { + "index": 11763 + } + }, + { + "items": [ + 6412.5, + 3.1982 + ], + "hints": { + "index": 11764 + } + }, + { + "items": [ + 6413, + 3.5742 + ], + "hints": { + "index": 11765 + } + }, + { + "items": [ + 6413.5, + 4.1938 + ], + "hints": { + "index": 11766 + } + }, + { + "items": [ + 6414, + 4.7274 + ], + "hints": { + "index": 11767 + } + }, + { + "items": [ + 6414.5, + 4.4628 + ], + "hints": { + "index": 11768 + } + }, + { + "items": [ + 6415, + 3.6904 + ], + "hints": { + "index": 11769 + } + }, + { + "items": [ + 6415.5, + 3.2262 + ], + "hints": { + "index": 11770 + } + }, + { + "items": [ + 6416, + 3.1279 + ], + "hints": { + "index": 11771 + } + }, + { + "items": [ + 6416.5, + 3.2752 + ], + "hints": { + "index": 11772 + } + }, + { + "items": [ + 6417, + 3.4069 + ], + "hints": { + "index": 11773 + } + }, + { + "items": [ + 6417.5, + 3.3791 + ], + "hints": { + "index": 11774 + } + }, + { + "items": [ + 6418, + 3.3041 + ], + "hints": { + "index": 11775 + } + }, + { + "items": [ + 6418.5, + 3.1816 + ], + "hints": { + "index": 11776 + } + }, + { + "items": [ + 6419, + 3.5176 + ], + "hints": { + "index": 11777 + } + }, + { + "items": [ + 6419.5, + 4.1302 + ], + "hints": { + "index": 11778 + } + }, + { + "items": [ + 6420, + 4.7511 + ], + "hints": { + "index": 11779 + } + }, + { + "items": [ + 6420.5, + 4.8885 + ], + "hints": { + "index": 11780 + } + }, + { + "items": [ + 6421, + 4.0626 + ], + "hints": { + "index": 11781 + } + }, + { + "items": [ + 6421.5, + 3.4588 + ], + "hints": { + "index": 11782 + } + }, + { + "items": [ + 6422, + 3.0039 + ], + "hints": { + "index": 11783 + } + }, + { + "items": [ + 6422.5, + 3.1195 + ], + "hints": { + "index": 11784 + } + }, + { + "items": [ + 6423, + 3.4951 + ], + "hints": { + "index": 11785 + } + }, + { + "items": [ + 6423.5, + 4.0191 + ], + "hints": { + "index": 11786 + } + }, + { + "items": [ + 6424, + 3.7784 + ], + "hints": { + "index": 11787 + } + }, + { + "items": [ + 6424.5, + 3.6767 + ], + "hints": { + "index": 11788 + } + }, + { + "items": [ + 6425, + 3.7986 + ], + "hints": { + "index": 11789 + } + }, + { + "items": [ + 6425.5, + 4.0004 + ], + "hints": { + "index": 11790 + } + }, + { + "items": [ + 6426, + 3.6332 + ], + "hints": { + "index": 11791 + } + }, + { + "items": [ + 6426.5, + 3.3558 + ], + "hints": { + "index": 11792 + } + }, + { + "items": [ + 6427, + 3.2924 + ], + "hints": { + "index": 11793 + } + }, + { + "items": [ + 6427.5, + 3.3451 + ], + "hints": { + "index": 11794 + } + }, + { + "items": [ + 6428, + 3.1602 + ], + "hints": { + "index": 11795 + } + }, + { + "items": [ + 6428.5, + 3.4581 + ], + "hints": { + "index": 11796 + } + }, + { + "items": [ + 6429, + 3.9081 + ], + "hints": { + "index": 11797 + } + }, + { + "items": [ + 6429.5, + 4.7808 + ], + "hints": { + "index": 11798 + } + }, + { + "items": [ + 6430, + 5.0326 + ], + "hints": { + "index": 11799 + } + }, + { + "items": [ + 6430.5, + 5.2139 + ], + "hints": { + "index": 11800 + } + }, + { + "items": [ + 6431, + 4.6744 + ], + "hints": { + "index": 11801 + } + }, + { + "items": [ + 6431.5, + 4.1758 + ], + "hints": { + "index": 11802 + } + }, + { + "items": [ + 6432, + 4.1792 + ], + "hints": { + "index": 11803 + } + }, + { + "items": [ + 6432.5, + 4.7504 + ], + "hints": { + "index": 11804 + } + }, + { + "items": [ + 6433, + 6.2257 + ], + "hints": { + "index": 11805 + } + }, + { + "items": [ + 6433.5, + 6.3383 + ], + "hints": { + "index": 11806 + } + }, + { + "items": [ + 6434, + 6.3372 + ], + "hints": { + "index": 11807 + } + }, + { + "items": [ + 6434.5, + 4.7295 + ], + "hints": { + "index": 11808 + } + }, + { + "items": [ + 6435, + 4.0254 + ], + "hints": { + "index": 11809 + } + }, + { + "items": [ + 6435.5, + 3.3212 + ], + "hints": { + "index": 11810 + } + }, + { + "items": [ + 6436, + 3.0544 + ], + "hints": { + "index": 11811 + } + }, + { + "items": [ + 6436.5, + 3.0522 + ], + "hints": { + "index": 11812 + } + }, + { + "items": [ + 6437, + 2.9688 + ], + "hints": { + "index": 11813 + } + }, + { + "items": [ + 6437.5, + 3.0457 + ], + "hints": { + "index": 11814 + } + }, + { + "items": [ + 6438, + 3.0901 + ], + "hints": { + "index": 11815 + } + }, + { + "items": [ + 6438.5, + 3.198 + ], + "hints": { + "index": 11816 + } + }, + { + "items": [ + 6439, + 3.108 + ], + "hints": { + "index": 11817 + } + }, + { + "items": [ + 6439.5, + 2.9846 + ], + "hints": { + "index": 11818 + } + }, + { + "items": [ + 6440, + 2.8995 + ], + "hints": { + "index": 11819 + } + }, + { + "items": [ + 6440.5, + 2.9192 + ], + "hints": { + "index": 11820 + } + }, + { + "items": [ + 6441, + 3.163 + ], + "hints": { + "index": 11821 + } + }, + { + "items": [ + 6441.5, + 3.4367 + ], + "hints": { + "index": 11822 + } + }, + { + "items": [ + 6442, + 3.4788 + ], + "hints": { + "index": 11823 + } + }, + { + "items": [ + 6442.5, + 3.2933 + ], + "hints": { + "index": 11824 + } + }, + { + "items": [ + 6443, + 3.3026 + ], + "hints": { + "index": 11825 + } + }, + { + "items": [ + 6443.5, + 3.961 + ], + "hints": { + "index": 11826 + } + }, + { + "items": [ + 6444, + 5.4857 + ], + "hints": { + "index": 11827 + } + }, + { + "items": [ + 6444.5, + 8.6329 + ], + "hints": { + "index": 11828 + } + }, + { + "items": [ + 6445, + 11.553 + ], + "hints": { + "index": 11829 + } + }, + { + "items": [ + 6445.5, + 11.7196 + ], + "hints": { + "index": 11830 + } + }, + { + "items": [ + 6446, + 10.9683 + ], + "hints": { + "index": 11831 + } + }, + { + "items": [ + 6446.5, + 12.1255 + ], + "hints": { + "index": 11832 + } + }, + { + "items": [ + 6447, + 6.8895 + ], + "hints": { + "index": 11833 + } + }, + { + "items": [ + 6447.5, + 4.2283 + ], + "hints": { + "index": 11834 + } + }, + { + "items": [ + 6448, + 3.091 + ], + "hints": { + "index": 11835 + } + }, + { + "items": [ + 6448.5, + 2.9381 + ], + "hints": { + "index": 11836 + } + }, + { + "items": [ + 6449, + 2.8585 + ], + "hints": { + "index": 11837 + } + }, + { + "items": [ + 6449.5, + 2.8029 + ], + "hints": { + "index": 11838 + } + }, + { + "items": [ + 6450, + 2.864 + ], + "hints": { + "index": 11839 + } + }, + { + "items": [ + 6450.5, + 2.9003 + ], + "hints": { + "index": 11840 + } + }, + { + "items": [ + 6451, + 3.0606 + ], + "hints": { + "index": 11841 + } + }, + { + "items": [ + 6451.5, + 3.1951 + ], + "hints": { + "index": 11842 + } + }, + { + "items": [ + 6452, + 3.4258 + ], + "hints": { + "index": 11843 + } + }, + { + "items": [ + 6452.5, + 3.7582 + ], + "hints": { + "index": 11844 + } + }, + { + "items": [ + 6453, + 4.2483 + ], + "hints": { + "index": 11845 + } + }, + { + "items": [ + 6453.5, + 4.8628 + ], + "hints": { + "index": 11846 + } + }, + { + "items": [ + 6454, + 4.3094 + ], + "hints": { + "index": 11847 + } + }, + { + "items": [ + 6454.5, + 3.726 + ], + "hints": { + "index": 11848 + } + }, + { + "items": [ + 6455, + 3.1841 + ], + "hints": { + "index": 11849 + } + }, + { + "items": [ + 6455.5, + 3.1319 + ], + "hints": { + "index": 11850 + } + }, + { + "items": [ + 6456, + 3.0387 + ], + "hints": { + "index": 11851 + } + }, + { + "items": [ + 6456.5, + 3.1072 + ], + "hints": { + "index": 11852 + } + }, + { + "items": [ + 6457, + 3.1609 + ], + "hints": { + "index": 11853 + } + }, + { + "items": [ + 6457.5, + 3.2561 + ], + "hints": { + "index": 11854 + } + }, + { + "items": [ + 6458, + 3.2768 + ], + "hints": { + "index": 11855 + } + }, + { + "items": [ + 6458.5, + 3.7812 + ], + "hints": { + "index": 11856 + } + }, + { + "items": [ + 6459, + 4.3057 + ], + "hints": { + "index": 11857 + } + }, + { + "items": [ + 6459.5, + 4.6861 + ], + "hints": { + "index": 11858 + } + }, + { + "items": [ + 6460, + 4.4262 + ], + "hints": { + "index": 11859 + } + }, + { + "items": [ + 6460.5, + 3.9268 + ], + "hints": { + "index": 11860 + } + }, + { + "items": [ + 6461, + 3.6117 + ], + "hints": { + "index": 11861 + } + }, + { + "items": [ + 6461.5, + 3.245 + ], + "hints": { + "index": 11862 + } + }, + { + "items": [ + 6462, + 3.1992 + ], + "hints": { + "index": 11863 + } + }, + { + "items": [ + 6462.5, + 3.1383 + ], + "hints": { + "index": 11864 + } + }, + { + "items": [ + 6463, + 3.047 + ], + "hints": { + "index": 11865 + } + }, + { + "items": [ + 6463.5, + 3.0643 + ], + "hints": { + "index": 11866 + } + }, + { + "items": [ + 6464, + 3.174 + ], + "hints": { + "index": 11867 + } + }, + { + "items": [ + 6464.5, + 3.3546 + ], + "hints": { + "index": 11868 + } + }, + { + "items": [ + 6465, + 3.3832 + ], + "hints": { + "index": 11869 + } + }, + { + "items": [ + 6465.5, + 3.3964 + ], + "hints": { + "index": 11870 + } + }, + { + "items": [ + 6466, + 3.6696 + ], + "hints": { + "index": 11871 + } + }, + { + "items": [ + 6466.5, + 4.1256 + ], + "hints": { + "index": 11872 + } + }, + { + "items": [ + 6467, + 4.4376001358032227 + ], + "hints": { + "index": 11873 + } + }, + { + "items": [ + 6467.5, + 4.4311 + ], + "hints": { + "index": 11874 + } + }, + { + "items": [ + 6468, + 3.8369 + ], + "hints": { + "index": 11875 + } + }, + { + "items": [ + 6468.5, + 3.3769 + ], + "hints": { + "index": 11876 + } + }, + { + "items": [ + 6469, + 3.3962 + ], + "hints": { + "index": 11877 + } + }, + { + "items": [ + 6469.5, + 3.3845000267028809 + ], + "hints": { + "index": 11878 + } + }, + { + "items": [ + 6470, + 3.4468 + ], + "hints": { + "index": 11879 + } + }, + { + "items": [ + 6470.5, + 2.9983000755310059 + ], + "hints": { + "index": 11880 + } + }, + { + "items": [ + 6471, + 2.8910999298095703 + ], + "hints": { + "index": 11881 + } + }, + { + "items": [ + 6471.5, + 2.8044 + ], + "hints": { + "index": 11882 + } + }, + { + "items": [ + 6472, + 2.7076 + ], + "hints": { + "index": 11883 + } + }, + { + "items": [ + 6472.5, + 2.7843 + ], + "hints": { + "index": 11884 + } + }, + { + "items": [ + 6473, + 2.8050000667572021 + ], + "hints": { + "index": 11885 + } + }, + { + "items": [ + 6473.5, + 2.9168 + ], + "hints": { + "index": 11886 + } + }, + { + "items": [ + 6474, + 3.1863 + ], + "hints": { + "index": 11887 + } + }, + { + "items": [ + 6474.5, + 3.2277 + ], + "hints": { + "index": 11888 + } + }, + { + "items": [ + 6475, + 3.2869 + ], + "hints": { + "index": 11889 + } + }, + { + "items": [ + 6475.5, + 3.1171998977661133 + ], + "hints": { + "index": 11890 + } + }, + { + "items": [ + 6476, + 3.9513 + ], + "hints": { + "index": 11891 + } + }, + { + "items": [ + 6476.5, + 4.4924001693725586 + ], + "hints": { + "index": 11892 + } + }, + { + "items": [ + 6477, + 4.60860013961792 + ], + "hints": { + "index": 11893 + } + }, + { + "items": [ + 6477.5, + 3.4853 + ], + "hints": { + "index": 11894 + } + }, + { + "items": [ + 6478, + 3.1078 + ], + "hints": { + "index": 11895 + } + }, + { + "items": [ + 6478.5, + 3.042200088500977 + ], + "hints": { + "index": 11896 + } + }, + { + "items": [ + 6479, + 3.4167 + ], + "hints": { + "index": 11897 + } + }, + { + "items": [ + 6479.5, + 3.9356999397277832 + ], + "hints": { + "index": 11898 + } + }, + { + "items": [ + 6480, + 4.328 + ], + "hints": { + "index": 11899 + } + }, + { + "items": [ + 6480.5, + 4.0971999168396 + ], + "hints": { + "index": 11900 + } + }, + { + "items": [ + 6481, + 3.9261999130249023 + ], + "hints": { + "index": 11901 + } + }, + { + "items": [ + 6481.5, + 3.7509000301361088 + ], + "hints": { + "index": 11902 + } + }, + { + "items": [ + 6482, + 3.9154999256134033 + ], + "hints": { + "index": 11903 + } + }, + { + "items": [ + 6482.5, + 3.9345 + ], + "hints": { + "index": 11904 + } + }, + { + "items": [ + 6483, + 3.6285998821258545 + ], + "hints": { + "index": 11905 + } + }, + { + "items": [ + 6483.5, + 3.2492001056671143 + ], + "hints": { + "index": 11906 + } + }, + { + "items": [ + 6484, + 2.9097 + ], + "hints": { + "index": 11907 + } + }, + { + "items": [ + 6484.5, + 2.9058 + ], + "hints": { + "index": 11908 + } + }, + { + "items": [ + 6485, + 2.9249000549316406 + ], + "hints": { + "index": 11909 + } + }, + { + "items": [ + 6485.5, + 2.9630999565124512 + ], + "hints": { + "index": 11910 + } + }, + { + "items": [ + 6486, + 2.9295 + ], + "hints": { + "index": 11911 + } + }, + { + "items": [ + 6486.5, + 2.8645 + ], + "hints": { + "index": 11912 + } + }, + { + "items": [ + 6487, + 2.828700065612793 + ], + "hints": { + "index": 11913 + } + }, + { + "items": [ + 6487.5, + 2.9265999794006348 + ], + "hints": { + "index": 11914 + } + }, + { + "items": [ + 6488, + 3.018 + ], + "hints": { + "index": 11915 + } + }, + { + "items": [ + 6488.5, + 3.2485 + ], + "hints": { + "index": 11916 + } + }, + { + "items": [ + 6489, + 3.3705999851226807 + ], + "hints": { + "index": 11917 + } + }, + { + "items": [ + 6489.5, + 3.5817999839782715 + ], + "hints": { + "index": 11918 + } + }, + { + "items": [ + 6490, + 4.6584 + ], + "hints": { + "index": 11919 + } + }, + { + "items": [ + 6490.5, + 6.4447999000549316 + ], + "hints": { + "index": 11920 + } + }, + { + "items": [ + 6491, + 9.2924003601074219 + ], + "hints": { + "index": 11921 + } + }, + { + "items": [ + 6491.5, + 8.8671998977661133 + ], + "hints": { + "index": 11922 + } + }, + { + "items": [ + 6492, + 8.1086 + ], + "hints": { + "index": 11923 + } + }, + { + "items": [ + 6492.5, + 7.3727998733520508 + ], + "hints": { + "index": 11924 + } + }, + { + "items": [ + 6493, + 6.9310002326965332 + ], + "hints": { + "index": 11925 + } + }, + { + "items": [ + 6493.5, + 6.7536001205444336 + ], + "hints": { + "index": 11926 + } + }, + { + "items": [ + 6494, + 5.65910005569458 + ], + "hints": { + "index": 11927 + } + }, + { + "items": [ + 6494.5, + 4.896399974822998 + ], + "hints": { + "index": 11928 + } + }, + { + "items": [ + 6495, + 3.9047999382019039 + ], + "hints": { + "index": 11929 + } + }, + { + "items": [ + 6495.5, + 3.7300999164581294 + ], + "hints": { + "index": 11930 + } + }, + { + "items": [ + 6496, + 3.8441998958587646 + ], + "hints": { + "index": 11931 + } + }, + { + "items": [ + 6496.5, + 4.3420000076293945 + ], + "hints": { + "index": 11932 + } + }, + { + "items": [ + 6497, + 4.8884000778198242 + ], + "hints": { + "index": 11933 + } + }, + { + "items": [ + 6497.5, + 4.7863001823425293 + ], + "hints": { + "index": 11934 + } + }, + { + "items": [ + 6498, + 4.7109999656677246 + ], + "hints": { + "index": 11935 + } + }, + { + "items": [ + 6498.5, + 4.3101 + ], + "hints": { + "index": 11936 + } + }, + { + "items": [ + 6499, + 4.2083001136779785 + ], + "hints": { + "index": 11937 + } + }, + { + "items": [ + 6499.5, + 3.8092999458312993 + ], + "hints": { + "index": 11938 + } + }, + { + "items": [ + 6500, + 3.8891 + ], + "hints": { + "index": 11939 + } + }, + { + "items": [ + 6500.5, + 4.1089 + ], + "hints": { + "index": 11940 + } + }, + { + "items": [ + 6501, + 4.6648 + ], + "hints": { + "index": 11941 + } + }, + { + "items": [ + 6501.5, + 5.3949 + ], + "hints": { + "index": 11942 + } + }, + { + "items": [ + 6502, + 5.583 + ], + "hints": { + "index": 11943 + } + }, + { + "items": [ + 6502.5, + 4.695 + ], + "hints": { + "index": 11944 + } + }, + { + "items": [ + 6503, + 4.2837 + ], + "hints": { + "index": 11945 + } + }, + { + "items": [ + 6503.5, + 3.9121 + ], + "hints": { + "index": 11946 + } + }, + { + "items": [ + 6504, + 4.0897 + ], + "hints": { + "index": 11947 + } + }, + { + "items": [ + 6504.5, + 4.1836 + ], + "hints": { + "index": 11948 + } + }, + { + "items": [ + 6505, + 4.6631 + ], + "hints": { + "index": 11949 + } + }, + { + "items": [ + 6505.5, + 4.8321 + ], + "hints": { + "index": 11950 + } + }, + { + "items": [ + 6506, + 4.6921 + ], + "hints": { + "index": 11951 + } + }, + { + "items": [ + 6506.5, + 4.4194 + ], + "hints": { + "index": 11952 + } + }, + { + "items": [ + 6507, + 4.4541 + ], + "hints": { + "index": 11953 + } + }, + { + "items": [ + 6507.5, + 4.4861 + ], + "hints": { + "index": 11954 + } + }, + { + "items": [ + 6508, + 5.0755 + ], + "hints": { + "index": 11955 + } + }, + { + "items": [ + 6508.5, + 5.6195 + ], + "hints": { + "index": 11956 + } + }, + { + "items": [ + 6509, + 7.1354 + ], + "hints": { + "index": 11957 + } + }, + { + "items": [ + 6509.5, + 6.9671 + ], + "hints": { + "index": 11958 + } + }, + { + "items": [ + 6510, + 6.6238 + ], + "hints": { + "index": 11959 + } + }, + { + "items": [ + 6510.5, + 5.8779 + ], + "hints": { + "index": 11960 + } + }, + { + "items": [ + 6511, + 6.1353 + ], + "hints": { + "index": 11961 + } + }, + { + "items": [ + 6511.5, + 6.6516 + ], + "hints": { + "index": 11962 + } + }, + { + "items": [ + 6512, + 6.2482 + ], + "hints": { + "index": 11963 + } + }, + { + "items": [ + 6512.5, + 5.7936 + ], + "hints": { + "index": 11964 + } + }, + { + "items": [ + 6513, + 4.7481 + ], + "hints": { + "index": 11965 + } + }, + { + "items": [ + 6513.5, + 4.1725 + ], + "hints": { + "index": 11966 + } + }, + { + "items": [ + 6514, + 4.0252 + ], + "hints": { + "index": 11967 + } + }, + { + "items": [ + 6514.5, + 4.8661 + ], + "hints": { + "index": 11968 + } + }, + { + "items": [ + 6515, + 6.1337 + ], + "hints": { + "index": 11969 + } + }, + { + "items": [ + 6515.5, + 6.7811 + ], + "hints": { + "index": 11970 + } + }, + { + "items": [ + 6516, + 6.7573 + ], + "hints": { + "index": 11971 + } + }, + { + "items": [ + 6516.5, + 5.9551 + ], + "hints": { + "index": 11972 + } + }, + { + "items": [ + 6517, + 4.855 + ], + "hints": { + "index": 11973 + } + }, + { + "items": [ + 6517.5, + 3.9692 + ], + "hints": { + "index": 11974 + } + }, + { + "items": [ + 6518, + 4.094 + ], + "hints": { + "index": 11975 + } + }, + { + "items": [ + 6518.5, + 4.7744 + ], + "hints": { + "index": 11976 + } + }, + { + "items": [ + 6519, + 6.0216 + ], + "hints": { + "index": 11977 + } + }, + { + "items": [ + 6519.5, + 6.5489 + ], + "hints": { + "index": 11978 + } + }, + { + "items": [ + 6520, + 6.3324 + ], + "hints": { + "index": 11979 + } + }, + { + "items": [ + 6520.5, + 5.4661 + ], + "hints": { + "index": 11980 + } + }, + { + "items": [ + 6521, + 4.4246997833251953 + ], + "hints": { + "index": 11981 + } + }, + { + "items": [ + 6521.5, + 3.7241001129150391 + ], + "hints": { + "index": 11982 + } + }, + { + "items": [ + 6522, + 3.4632000923156734 + ], + "hints": { + "index": 11983 + } + }, + { + "items": [ + 6522.5, + 3.836400032043457 + ], + "hints": { + "index": 11984 + } + }, + { + "items": [ + 6523, + 4.4065999984741211 + ], + "hints": { + "index": 11985 + } + }, + { + "items": [ + 6523.5, + 4.5559000968933105 + ], + "hints": { + "index": 11986 + } + }, + { + "items": [ + 6524, + 4.4102001190185547 + ], + "hints": { + "index": 11987 + } + }, + { + "items": [ + 6524.5, + 4.3295001983642578 + ], + "hints": { + "index": 11988 + } + }, + { + "items": [ + 6525, + 4.6627998352050781 + ], + "hints": { + "index": 11989 + } + }, + { + "items": [ + 6525.5, + 4.7346000671386719 + ], + "hints": { + "index": 11990 + } + }, + { + "items": [ + 6526, + 5.06279993057251 + ], + "hints": { + "index": 11991 + } + }, + { + "items": [ + 6526.5, + 4.7308001518249512 + ], + "hints": { + "index": 11992 + } + }, + { + "items": [ + 6527, + 4.7119002342224121 + ], + "hints": { + "index": 11993 + } + }, + { + "items": [ + 6527.5, + 4.5668001174926758 + ], + "hints": { + "index": 11994 + } + }, + { + "items": [ + 6528, + 4.6237001419067383 + ], + "hints": { + "index": 11995 + } + }, + { + "items": [ + 6528.5, + 4.9520998001098633 + ], + "hints": { + "index": 11996 + } + }, + { + "items": [ + 6529, + 4.9116001129150391 + ], + "hints": { + "index": 11997 + } + }, + { + "items": [ + 6529.5, + 5.4871001243591309 + ], + "hints": { + "index": 11998 + } + }, + { + "items": [ + 6530, + 5.9098000526428223 + ], + "hints": { + "index": 11999 + } + }, + { + "items": [ + 6530.5, + 6.2125000953674316 + ], + "hints": { + "index": 12000 + } + }, + { + "items": [ + 6531, + 5.2358999252319336 + ], + "hints": { + "index": 12001 + } + }, + { + "items": [ + 6531.5, + 4.2153 + ], + "hints": { + "index": 12002 + } + }, + { + "items": [ + 6532, + 4.0372 + ], + "hints": { + "index": 12003 + } + }, + { + "items": [ + 6532.5, + 4.2227 + ], + "hints": { + "index": 12004 + } + }, + { + "items": [ + 6533, + 4.3596 + ], + "hints": { + "index": 12005 + } + }, + { + "items": [ + 6533.5, + 3.8666 + ], + "hints": { + "index": 12006 + } + }, + { + "items": [ + 6534, + 3.5976 + ], + "hints": { + "index": 12007 + } + }, + { + "items": [ + 6534.5, + 3.7327 + ], + "hints": { + "index": 12008 + } + }, + { + "items": [ + 6535, + 4.0467 + ], + "hints": { + "index": 12009 + } + }, + { + "items": [ + 6535.5, + 4.9657 + ], + "hints": { + "index": 12010 + } + }, + { + "items": [ + 6536, + 5.188 + ], + "hints": { + "index": 12011 + } + }, + { + "items": [ + 6536.5, + 5.3358 + ], + "hints": { + "index": 12012 + } + }, + { + "items": [ + 6537, + 4.2886 + ], + "hints": { + "index": 12013 + } + }, + { + "items": [ + 6537.5, + 3.6922 + ], + "hints": { + "index": 12014 + } + }, + { + "items": [ + 6538, + 3.5332 + ], + "hints": { + "index": 12015 + } + }, + { + "items": [ + 6538.5, + 3.7573 + ], + "hints": { + "index": 12016 + } + }, + { + "items": [ + 6539, + 4.6413 + ], + "hints": { + "index": 12017 + } + }, + { + "items": [ + 6539.5, + 5.5686 + ], + "hints": { + "index": 12018 + } + }, + { + "items": [ + 6540, + 6.7597 + ], + "hints": { + "index": 12019 + } + }, + { + "items": [ + 6540.5, + 6.7154 + ], + "hints": { + "index": 12020 + } + }, + { + "items": [ + 6541, + 5.9271 + ], + "hints": { + "index": 12021 + } + }, + { + "items": [ + 6541.5, + 4.9903 + ], + "hints": { + "index": 12022 + } + }, + { + "items": [ + 6542, + 4.847 + ], + "hints": { + "index": 12023 + } + }, + { + "items": [ + 6542.5, + 4.7882 + ], + "hints": { + "index": 12024 + } + }, + { + "items": [ + 6543, + 4.4764 + ], + "hints": { + "index": 12025 + } + }, + { + "items": [ + 6543.5, + 3.8129 + ], + "hints": { + "index": 12026 + } + }, + { + "items": [ + 6544, + 3.5918 + ], + "hints": { + "index": 12027 + } + }, + { + "items": [ + 6544.5, + 3.4951 + ], + "hints": { + "index": 12028 + } + }, + { + "items": [ + 6545, + 3.5513 + ], + "hints": { + "index": 12029 + } + }, + { + "items": [ + 6545.5, + 3.4956 + ], + "hints": { + "index": 12030 + } + }, + { + "items": [ + 6546, + 3.3992 + ], + "hints": { + "index": 12031 + } + }, + { + "items": [ + 6546.5, + 3.4237 + ], + "hints": { + "index": 12032 + } + }, + { + "items": [ + 6547, + 3.4572999477386475 + ], + "hints": { + "index": 12033 + } + }, + { + "items": [ + 6547.5, + 3.732 + ], + "hints": { + "index": 12034 + } + }, + { + "items": [ + 6548, + 3.7892999649047856 + ], + "hints": { + "index": 12035 + } + }, + { + "items": [ + 6548.5, + 3.6734 + ], + "hints": { + "index": 12036 + } + }, + { + "items": [ + 6549, + 3.4072 + ], + "hints": { + "index": 12037 + } + }, + { + "items": [ + 6549.5, + 3.4389 + ], + "hints": { + "index": 12038 + } + }, + { + "items": [ + 6550, + 3.7532000541687007 + ], + "hints": { + "index": 12039 + } + }, + { + "items": [ + 6550.5, + 4.1795001029968262 + ], + "hints": { + "index": 12040 + } + }, + { + "items": [ + 6551, + 4.301 + ], + "hints": { + "index": 12041 + } + }, + { + "items": [ + 6551.5, + 4.0618000030517578 + ], + "hints": { + "index": 12042 + } + }, + { + "items": [ + 6552, + 4.2394 + ], + "hints": { + "index": 12043 + } + }, + { + "items": [ + 6552.5, + 4.66379976272583 + ], + "hints": { + "index": 12044 + } + }, + { + "items": [ + 6553, + 4.9019 + ], + "hints": { + "index": 12045 + } + }, + { + "items": [ + 6553.5, + 4.8977999687194824 + ], + "hints": { + "index": 12046 + } + }, + { + "items": [ + 6554, + 4.822 + ], + "hints": { + "index": 12047 + } + }, + { + "items": [ + 6554.5, + 4.9007000923156738 + ], + "hints": { + "index": 12048 + } + }, + { + "items": [ + 6555, + 4.7989 + ], + "hints": { + "index": 12049 + } + }, + { + "items": [ + 6555.5, + 4.4892001152038574 + ], + "hints": { + "index": 12050 + } + }, + { + "items": [ + 6556, + 4.4112 + ], + "hints": { + "index": 12051 + } + }, + { + "items": [ + 6556.5, + 4.7507 + ], + "hints": { + "index": 12052 + } + }, + { + "items": [ + 6557, + 4.7579 + ], + "hints": { + "index": 12053 + } + }, + { + "items": [ + 6557.5, + 5.0624 + ], + "hints": { + "index": 12054 + } + }, + { + "items": [ + 6558, + 4.7024002075195313 + ], + "hints": { + "index": 12055 + } + }, + { + "items": [ + 6558.5, + 4.8635001182556152 + ], + "hints": { + "index": 12056 + } + }, + { + "items": [ + 6559, + 4.7294001579284668 + ], + "hints": { + "index": 12057 + } + }, + { + "items": [ + 6559.5, + 4.2712 + ], + "hints": { + "index": 12058 + } + }, + { + "items": [ + 6560, + 3.9007000923156734 + ], + "hints": { + "index": 12059 + } + }, + { + "items": [ + 6560.5, + 4.0013999938964844 + ], + "hints": { + "index": 12060 + } + }, + { + "items": [ + 6561, + 4.3458 + ], + "hints": { + "index": 12061 + } + }, + { + "items": [ + 6561.5, + 5.0012001991271973 + ], + "hints": { + "index": 12062 + } + }, + { + "items": [ + 6562, + 5.050300121307373 + ], + "hints": { + "index": 12063 + } + }, + { + "items": [ + 6562.5, + 5.4584999084472656 + ], + "hints": { + "index": 12064 + } + }, + { + "items": [ + 6563, + 5.3050999641418457 + ], + "hints": { + "index": 12065 + } + }, + { + "items": [ + 6563.5, + 5.7119002342224121 + ], + "hints": { + "index": 12066 + } + }, + { + "items": [ + 6564, + 6.160099983215332 + ], + "hints": { + "index": 12067 + } + }, + { + "items": [ + 6564.5, + 6.3591 + ], + "hints": { + "index": 12068 + } + }, + { + "items": [ + 6565, + 6.1732 + ], + "hints": { + "index": 12069 + } + }, + { + "items": [ + 6565.5, + 5.4519 + ], + "hints": { + "index": 12070 + } + }, + { + "items": [ + 6566, + 5.0959 + ], + "hints": { + "index": 12071 + } + }, + { + "items": [ + 6566.5, + 4.5992 + ], + "hints": { + "index": 12072 + } + }, + { + "items": [ + 6567, + 4.3167 + ], + "hints": { + "index": 12073 + } + }, + { + "items": [ + 6567.5, + 4.0756998062133789 + ], + "hints": { + "index": 12074 + } + }, + { + "items": [ + 6568, + 3.81879997253418 + ], + "hints": { + "index": 12075 + } + }, + { + "items": [ + 6568.5, + 3.7486999034881592 + ], + "hints": { + "index": 12076 + } + }, + { + "items": [ + 6569, + 3.7845 + ], + "hints": { + "index": 12077 + } + }, + { + "items": [ + 6569.5, + 3.9811 + ], + "hints": { + "index": 12078 + } + }, + { + "items": [ + 6570, + 4.0364 + ], + "hints": { + "index": 12079 + } + }, + { + "items": [ + 6570.5, + 4.1987 + ], + "hints": { + "index": 12080 + } + }, + { + "items": [ + 6571, + 4.4829 + ], + "hints": { + "index": 12081 + } + }, + { + "items": [ + 6571.5, + 4.8405 + ], + "hints": { + "index": 12082 + } + }, + { + "items": [ + 6572, + 4.7249 + ], + "hints": { + "index": 12083 + } + }, + { + "items": [ + 6572.5, + 4.1813 + ], + "hints": { + "index": 12084 + } + }, + { + "items": [ + 6573, + 4.1143 + ], + "hints": { + "index": 12085 + } + }, + { + "items": [ + 6573.5, + 4.6127 + ], + "hints": { + "index": 12086 + } + }, + { + "items": [ + 6574, + 5.8303999900817871 + ], + "hints": { + "index": 12087 + } + }, + { + "items": [ + 6574.5, + 6.6279 + ], + "hints": { + "index": 12088 + } + }, + { + "items": [ + 6575, + 6.17140007019043 + ], + "hints": { + "index": 12089 + } + }, + { + "items": [ + 6575.5, + 5.2395 + ], + "hints": { + "index": 12090 + } + }, + { + "items": [ + 6576, + 4.4749 + ], + "hints": { + "index": 12091 + } + }, + { + "items": [ + 6576.5, + 4.4076 + ], + "hints": { + "index": 12092 + } + }, + { + "items": [ + 6577, + 4.9981999397277832 + ], + "hints": { + "index": 12093 + } + }, + { + "items": [ + 6577.5, + 5.2718000411987305 + ], + "hints": { + "index": 12094 + } + }, + { + "items": [ + 6578, + 5.1873 + ], + "hints": { + "index": 12095 + } + }, + { + "items": [ + 6578.5, + 4.2274999618530273 + ], + "hints": { + "index": 12096 + } + }, + { + "items": [ + 6579, + 3.988 + ], + "hints": { + "index": 12097 + } + }, + { + "items": [ + 6579.5, + 3.888200044631958 + ], + "hints": { + "index": 12098 + } + }, + { + "items": [ + 6580, + 3.8243000507354736 + ], + "hints": { + "index": 12099 + } + }, + { + "items": [ + 6580.5, + 3.6861999034881592 + ], + "hints": { + "index": 12100 + } + }, + { + "items": [ + 6581, + 3.4234 + ], + "hints": { + "index": 12101 + } + }, + { + "items": [ + 6581.5, + 3.4804 + ], + "hints": { + "index": 12102 + } + }, + { + "items": [ + 6582, + 3.6909000873565674 + ], + "hints": { + "index": 12103 + } + }, + { + "items": [ + 6582.5, + 3.6191 + ], + "hints": { + "index": 12104 + } + }, + { + "items": [ + 6583, + 3.4995999336242676 + ], + "hints": { + "index": 12105 + } + }, + { + "items": [ + 6583.5, + 3.2338 + ], + "hints": { + "index": 12106 + } + }, + { + "items": [ + 6584, + 3.2681999206542969 + ], + "hints": { + "index": 12107 + } + }, + { + "items": [ + 6584.5, + 3.4381 + ], + "hints": { + "index": 12108 + } + }, + { + "items": [ + 6585, + 3.6038000583648682 + ], + "hints": { + "index": 12109 + } + }, + { + "items": [ + 6585.5, + 3.8677999973297119 + ], + "hints": { + "index": 12110 + } + }, + { + "items": [ + 6586, + 3.77839994430542 + ], + "hints": { + "index": 12111 + } + }, + { + "items": [ + 6586.5, + 3.6557 + ], + "hints": { + "index": 12112 + } + }, + { + "items": [ + 6587, + 3.9033000469207759 + ], + "hints": { + "index": 12113 + } + }, + { + "items": [ + 6587.5, + 4.53980016708374 + ], + "hints": { + "index": 12114 + } + }, + { + "items": [ + 6588, + 5.6982002258300781 + ], + "hints": { + "index": 12115 + } + }, + { + "items": [ + 6588.5, + 5.4735 + ], + "hints": { + "index": 12116 + } + }, + { + "items": [ + 6589, + 4.4458 + ], + "hints": { + "index": 12117 + } + }, + { + "items": [ + 6589.5, + 4.0995998382568359 + ], + "hints": { + "index": 12118 + } + }, + { + "items": [ + 6590, + 3.9655 + ], + "hints": { + "index": 12119 + } + }, + { + "items": [ + 6590.5, + 3.8099 + ], + "hints": { + "index": 12120 + } + }, + { + "items": [ + 6591, + 3.2275 + ], + "hints": { + "index": 12121 + } + }, + { + "items": [ + 6591.5, + 2.963900089263916 + ], + "hints": { + "index": 12122 + } + }, + { + "items": [ + 6592, + 3.21589994430542 + ], + "hints": { + "index": 12123 + } + }, + { + "items": [ + 6592.5, + 3.7697000503540039 + ], + "hints": { + "index": 12124 + } + }, + { + "items": [ + 6593, + 4.4047999382019043 + ], + "hints": { + "index": 12125 + } + }, + { + "items": [ + 6593.5, + 4.57480001449585 + ], + "hints": { + "index": 12126 + } + }, + { + "items": [ + 6594, + 4.0454998016357422 + ], + "hints": { + "index": 12127 + } + }, + { + "items": [ + 6594.5, + 3.5387001037597656 + ], + "hints": { + "index": 12128 + } + }, + { + "items": [ + 6595, + 3.1326000690460205 + ], + "hints": { + "index": 12129 + } + }, + { + "items": [ + 6595.5, + 3.0783998966217041 + ], + "hints": { + "index": 12130 + } + }, + { + "items": [ + 6596, + 3.6835999488830566 + ], + "hints": { + "index": 12131 + } + }, + { + "items": [ + 6596.5, + 5.8231000900268555 + ], + "hints": { + "index": 12132 + } + }, + { + "items": [ + 6597, + 8.7042 + ], + "hints": { + "index": 12133 + } + }, + { + "items": [ + 6597.5, + 10.0767 + ], + "hints": { + "index": 12134 + } + }, + { + "items": [ + 6598, + 6.9829001426696777 + ], + "hints": { + "index": 12135 + } + }, + { + "items": [ + 6598.5, + 5.2273998260498047 + ], + "hints": { + "index": 12136 + } + }, + { + "items": [ + 6599, + 5.0514001846313477 + ], + "hints": { + "index": 12137 + } + }, + { + "items": [ + 6599.5, + 5.9576 + ], + "hints": { + "index": 12138 + } + }, + { + "items": [ + 6600, + 6.3494000434875488 + ], + "hints": { + "index": 12139 + } + }, + { + "items": [ + 6600.5, + 5.0112 + ], + "hints": { + "index": 12140 + } + }, + { + "items": [ + 6601, + 3.8129000663757329 + ], + "hints": { + "index": 12141 + } + }, + { + "items": [ + 6601.5, + 3.5941998958587646 + ], + "hints": { + "index": 12142 + } + }, + { + "items": [ + 6602, + 3.6696000099182129 + ], + "hints": { + "index": 12143 + } + }, + { + "items": [ + 6602.5, + 3.70169997215271 + ], + "hints": { + "index": 12144 + } + }, + { + "items": [ + 6603, + 3.7245 + ], + "hints": { + "index": 12145 + } + }, + { + "items": [ + 6603.5, + 4.2077 + ], + "hints": { + "index": 12146 + } + }, + { + "items": [ + 6604, + 5.0372 + ], + "hints": { + "index": 12147 + } + }, + { + "items": [ + 6604.5, + 4.9702000617980957 + ], + "hints": { + "index": 12148 + } + }, + { + "items": [ + 6605, + 3.9165 + ], + "hints": { + "index": 12149 + } + }, + { + "items": [ + 6605.5, + 3.3999 + ], + "hints": { + "index": 12150 + } + }, + { + "items": [ + 6606, + 3.3427 + ], + "hints": { + "index": 12151 + } + }, + { + "items": [ + 6606.5, + 3.6369 + ], + "hints": { + "index": 12152 + } + }, + { + "items": [ + 6607, + 3.7897999286651607 + ], + "hints": { + "index": 12153 + } + }, + { + "items": [ + 6607.5, + 3.6282000541687007 + ], + "hints": { + "index": 12154 + } + }, + { + "items": [ + 6608, + 3.3912 + ], + "hints": { + "index": 12155 + } + }, + { + "items": [ + 6608.5, + 3.4007999897003174 + ], + "hints": { + "index": 12156 + } + }, + { + "items": [ + 6609, + 3.8222000598907471 + ], + "hints": { + "index": 12157 + } + }, + { + "items": [ + 6609.5, + 4.752 + ], + "hints": { + "index": 12158 + } + }, + { + "items": [ + 6610, + 5.6715 + ], + "hints": { + "index": 12159 + } + }, + { + "items": [ + 6610.5, + 5.3866000175476074 + ], + "hints": { + "index": 12160 + } + }, + { + "items": [ + 6611, + 4.5090999603271484 + ], + "hints": { + "index": 12161 + } + }, + { + "items": [ + 6611.5, + 3.8905999660491943 + ], + "hints": { + "index": 12162 + } + }, + { + "items": [ + 6612, + 3.5831000804901123 + ], + "hints": { + "index": 12163 + } + }, + { + "items": [ + 6612.5, + 3.5377 + ], + "hints": { + "index": 12164 + } + }, + { + "items": [ + 6613, + 3.6079 + ], + "hints": { + "index": 12165 + } + }, + { + "items": [ + 6613.5, + 4.1914 + ], + "hints": { + "index": 12166 + } + }, + { + "items": [ + 6614, + 4.9166 + ], + "hints": { + "index": 12167 + } + }, + { + "items": [ + 6614.5, + 5.5474 + ], + "hints": { + "index": 12168 + } + }, + { + "items": [ + 6615, + 4.7505 + ], + "hints": { + "index": 12169 + } + }, + { + "items": [ + 6615.5, + 3.9932000637054439 + ], + "hints": { + "index": 12170 + } + }, + { + "items": [ + 6616, + 3.7848999500274658 + ], + "hints": { + "index": 12171 + } + }, + { + "items": [ + 6616.5, + 4.0728 + ], + "hints": { + "index": 12172 + } + }, + { + "items": [ + 6617, + 4.5238 + ], + "hints": { + "index": 12173 + } + }, + { + "items": [ + 6617.5, + 4.9224 + ], + "hints": { + "index": 12174 + } + }, + { + "items": [ + 6618, + 4.9149 + ], + "hints": { + "index": 12175 + } + }, + { + "items": [ + 6618.5, + 4.3973 + ], + "hints": { + "index": 12176 + } + }, + { + "items": [ + 6619, + 3.8909 + ], + "hints": { + "index": 12177 + } + }, + { + "items": [ + 6619.5, + 3.4905 + ], + "hints": { + "index": 12178 + } + }, + { + "items": [ + 6620, + 3.5236 + ], + "hints": { + "index": 12179 + } + }, + { + "items": [ + 6620.5, + 3.707799911499023 + ], + "hints": { + "index": 12180 + } + }, + { + "items": [ + 6621, + 3.9771 + ], + "hints": { + "index": 12181 + } + }, + { + "items": [ + 6621.5, + 3.875 + ], + "hints": { + "index": 12182 + } + }, + { + "items": [ + 6622, + 3.6259 + ], + "hints": { + "index": 12183 + } + }, + { + "items": [ + 6622.5, + 3.4026000499725342 + ], + "hints": { + "index": 12184 + } + }, + { + "items": [ + 6623, + 3.3250000476837158 + ], + "hints": { + "index": 12185 + } + }, + { + "items": [ + 6623.5, + 3.3469998836517334 + ], + "hints": { + "index": 12186 + } + }, + { + "items": [ + 6624, + 3.5865 + ], + "hints": { + "index": 12187 + } + }, + { + "items": [ + 6624.5, + 4.1025 + ], + "hints": { + "index": 12188 + } + }, + { + "items": [ + 6625, + 4.3951 + ], + "hints": { + "index": 12189 + } + }, + { + "items": [ + 6625.5, + 4.902 + ], + "hints": { + "index": 12190 + } + }, + { + "items": [ + 6626, + 5.5083 + ], + "hints": { + "index": 12191 + } + }, + { + "items": [ + 6626.5, + 6.0535 + ], + "hints": { + "index": 12192 + } + }, + { + "items": [ + 6627, + 6.25540018081665 + ], + "hints": { + "index": 12193 + } + }, + { + "items": [ + 6627.5, + 6.1959 + ], + "hints": { + "index": 12194 + } + }, + { + "items": [ + 6628, + 6.4001998901367188 + ], + "hints": { + "index": 12195 + } + }, + { + "items": [ + 6628.5, + 5.7547998428344727 + ], + "hints": { + "index": 12196 + } + }, + { + "items": [ + 6629, + 4.8777 + ], + "hints": { + "index": 12197 + } + }, + { + "items": [ + 6629.5, + 4.341400146484375 + ], + "hints": { + "index": 12198 + } + }, + { + "items": [ + 6630, + 4.2013001441955566 + ], + "hints": { + "index": 12199 + } + }, + { + "items": [ + 6630.5, + 4.0109 + ], + "hints": { + "index": 12200 + } + }, + { + "items": [ + 6631, + 4.0763998031616211 + ], + "hints": { + "index": 12201 + } + }, + { + "items": [ + 6631.5, + 4.0661001205444336 + ], + "hints": { + "index": 12202 + } + }, + { + "items": [ + 6632, + 4.5612 + ], + "hints": { + "index": 12203 + } + }, + { + "items": [ + 6632.5, + 4.3621 + ], + "hints": { + "index": 12204 + } + }, + { + "items": [ + 6633, + 4.2325 + ], + "hints": { + "index": 12205 + } + }, + { + "items": [ + 6633.5, + 3.7386 + ], + "hints": { + "index": 12206 + } + }, + { + "items": [ + 6634, + 3.4530000686645508 + ], + "hints": { + "index": 12207 + } + }, + { + "items": [ + 6634.5, + 3.4179000854492188 + ], + "hints": { + "index": 12208 + } + }, + { + "items": [ + 6635, + 3.4242000579833984 + ], + "hints": { + "index": 12209 + } + }, + { + "items": [ + 6635.5, + 3.681 + ], + "hints": { + "index": 12210 + } + }, + { + "items": [ + 6636, + 4.0237998962402344 + ], + "hints": { + "index": 12211 + } + }, + { + "items": [ + 6636.5, + 4.929 + ], + "hints": { + "index": 12212 + } + }, + { + "items": [ + 6637, + 5.7025 + ], + "hints": { + "index": 12213 + } + }, + { + "items": [ + 6637.5, + 5.4120001792907715 + ], + "hints": { + "index": 12214 + } + }, + { + "items": [ + 6638, + 5.4889001846313477 + ], + "hints": { + "index": 12215 + } + }, + { + "items": [ + 6638.5, + 5.2569 + ], + "hints": { + "index": 12216 + } + }, + { + "items": [ + 6639, + 5.3279 + ], + "hints": { + "index": 12217 + } + }, + { + "items": [ + 6639.5, + 4.301 + ], + "hints": { + "index": 12218 + } + }, + { + "items": [ + 6640, + 3.8596 + ], + "hints": { + "index": 12219 + } + }, + { + "items": [ + 6640.5, + 3.7627 + ], + "hints": { + "index": 12220 + } + }, + { + "items": [ + 6641, + 3.7673 + ], + "hints": { + "index": 12221 + } + }, + { + "items": [ + 6641.5, + 4.1119999885559082 + ], + "hints": { + "index": 12222 + } + }, + { + "items": [ + 6642, + 4.1981 + ], + "hints": { + "index": 12223 + } + }, + { + "items": [ + 6642.5, + 4.774 + ], + "hints": { + "index": 12224 + } + }, + { + "items": [ + 6643, + 4.7483 + ], + "hints": { + "index": 12225 + } + }, + { + "items": [ + 6643.5, + 5.0134 + ], + "hints": { + "index": 12226 + } + }, + { + "items": [ + 6644, + 5.4046 + ], + "hints": { + "index": 12227 + } + }, + { + "items": [ + 6644.5, + 6.1975998878479 + ], + "hints": { + "index": 12228 + } + }, + { + "items": [ + 6645, + 7.545 + ], + "hints": { + "index": 12229 + } + }, + { + "items": [ + 6645.5, + 8.0275 + ], + "hints": { + "index": 12230 + } + }, + { + "items": [ + 6646, + 8.6869 + ], + "hints": { + "index": 12231 + } + }, + { + "items": [ + 6646.5, + 6.7930002212524414 + ], + "hints": { + "index": 12232 + } + }, + { + "items": [ + 6647, + 5.7014 + ], + "hints": { + "index": 12233 + } + }, + { + "items": [ + 6647.5, + 5.2573 + ], + "hints": { + "index": 12234 + } + }, + { + "items": [ + 6648, + 6.0758 + ], + "hints": { + "index": 12235 + } + }, + { + "items": [ + 6648.5, + 5.7232 + ], + "hints": { + "index": 12236 + } + }, + { + "items": [ + 6649, + 4.9904999732971191 + ], + "hints": { + "index": 12237 + } + }, + { + "items": [ + 6649.5, + 4.2147998809814453 + ], + "hints": { + "index": 12238 + } + }, + { + "items": [ + 6650, + 4.1143 + ], + "hints": { + "index": 12239 + } + }, + { + "items": [ + 6650.5, + 3.9214999675750737 + ], + "hints": { + "index": 12240 + } + }, + { + "items": [ + 6651, + 3.842400074005127 + ], + "hints": { + "index": 12241 + } + }, + { + "items": [ + 6651.5, + 3.845099925994873 + ], + "hints": { + "index": 12242 + } + }, + { + "items": [ + 6652, + 3.737 + ], + "hints": { + "index": 12243 + } + }, + { + "items": [ + 6652.5, + 3.7769999504089351 + ], + "hints": { + "index": 12244 + } + }, + { + "items": [ + 6653, + 4.0467000007629395 + ], + "hints": { + "index": 12245 + } + }, + { + "items": [ + 6653.5, + 5.3418002128601074 + ], + "hints": { + "index": 12246 + } + }, + { + "items": [ + 6654, + 5.859799861907959 + ], + "hints": { + "index": 12247 + } + }, + { + "items": [ + 6654.5, + 5.3836002349853516 + ], + "hints": { + "index": 12248 + } + }, + { + "items": [ + 6655, + 4.1671 + ], + "hints": { + "index": 12249 + } + }, + { + "items": [ + 6655.5, + 4.1226000785827637 + ], + "hints": { + "index": 12250 + } + }, + { + "items": [ + 6656, + 4.3652 + ], + "hints": { + "index": 12251 + } + }, + { + "items": [ + 6656.5, + 4.5067 + ], + "hints": { + "index": 12252 + } + }, + { + "items": [ + 6657, + 4.3638 + ], + "hints": { + "index": 12253 + } + }, + { + "items": [ + 6657.5, + 4.262 + ], + "hints": { + "index": 12254 + } + }, + { + "items": [ + 6658, + 4.2188 + ], + "hints": { + "index": 12255 + } + }, + { + "items": [ + 6658.5, + 4.1711997985839844 + ], + "hints": { + "index": 12256 + } + }, + { + "items": [ + 6659, + 4.1869 + ], + "hints": { + "index": 12257 + } + }, + { + "items": [ + 6659.5, + 4.1423 + ], + "hints": { + "index": 12258 + } + }, + { + "items": [ + 6660, + 4.25629997253418 + ], + "hints": { + "index": 12259 + } + }, + { + "items": [ + 6660.5, + 4.2984 + ], + "hints": { + "index": 12260 + } + }, + { + "items": [ + 6661, + 4.7945 + ], + "hints": { + "index": 12261 + } + }, + { + "items": [ + 6661.5, + 5.9428 + ], + "hints": { + "index": 12262 + } + }, + { + "items": [ + 6662, + 7.3704 + ], + "hints": { + "index": 12263 + } + }, + { + "items": [ + 6662.5, + 8.5612 + ], + "hints": { + "index": 12264 + } + }, + { + "items": [ + 6663, + 6.9532 + ], + "hints": { + "index": 12265 + } + }, + { + "items": [ + 6663.5, + 6.1929 + ], + "hints": { + "index": 12266 + } + }, + { + "items": [ + 6664, + 6.2097997665405273 + ], + "hints": { + "index": 12267 + } + }, + { + "items": [ + 6664.5, + 6.8000001907348633 + ], + "hints": { + "index": 12268 + } + }, + { + "items": [ + 6665, + 6.9980998039245605 + ], + "hints": { + "index": 12269 + } + }, + { + "items": [ + 6665.5, + 7.1263999938964844 + ], + "hints": { + "index": 12270 + } + }, + { + "items": [ + 6666, + 7.1342000961303711 + ], + "hints": { + "index": 12271 + } + }, + { + "items": [ + 6666.5, + 6.5114998817443848 + ], + "hints": { + "index": 12272 + } + }, + { + "items": [ + 6667, + 5.5720000267028809 + ], + "hints": { + "index": 12273 + } + }, + { + "items": [ + 6667.5, + 5.1754 + ], + "hints": { + "index": 12274 + } + }, + { + "items": [ + 6668, + 5.391200065612793 + ], + "hints": { + "index": 12275 + } + }, + { + "items": [ + 6668.5, + 5.9667 + ], + "hints": { + "index": 12276 + } + }, + { + "items": [ + 6669, + 6.4205 + ], + "hints": { + "index": 12277 + } + }, + { + "items": [ + 6669.5, + 7.0315 + ], + "hints": { + "index": 12278 + } + }, + { + "items": [ + 6670, + 6.8337 + ], + "hints": { + "index": 12279 + } + }, + { + "items": [ + 6670.5, + 6.5378 + ], + "hints": { + "index": 12280 + } + }, + { + "items": [ + 6671, + 6.2746 + ], + "hints": { + "index": 12281 + } + }, + { + "items": [ + 6671.5, + 6.7035 + ], + "hints": { + "index": 12282 + } + }, + { + "items": [ + 6672, + 7.9453001022338867 + ], + "hints": { + "index": 12283 + } + }, + { + "items": [ + 6672.5, + 8.7495002746582031 + ], + "hints": { + "index": 12284 + } + }, + { + "items": [ + 6673, + 8.8128995895385742 + ], + "hints": { + "index": 12285 + } + }, + { + "items": [ + 6673.5, + 8.2592000961303711 + ], + "hints": { + "index": 12286 + } + }, + { + "items": [ + 6674, + 6.4783000946044922 + ], + "hints": { + "index": 12287 + } + }, + { + "items": [ + 6674.5, + 5.6459999084472656 + ], + "hints": { + "index": 12288 + } + }, + { + "items": [ + 6675, + 4.983 + ], + "hints": { + "index": 12289 + } + }, + { + "items": [ + 6675.5, + 5.4915 + ], + "hints": { + "index": 12290 + } + }, + { + "items": [ + 6676, + 5.0626997947692871 + ], + "hints": { + "index": 12291 + } + }, + { + "items": [ + 6676.5, + 4.8372998237609863 + ], + "hints": { + "index": 12292 + } + }, + { + "items": [ + 6677, + 4.4134001731872559 + ], + "hints": { + "index": 12293 + } + }, + { + "items": [ + 6677.5, + 4.469 + ], + "hints": { + "index": 12294 + } + }, + { + "items": [ + 6678, + 4.7069997787475586 + ], + "hints": { + "index": 12295 + } + }, + { + "items": [ + 6678.5, + 4.8589 + ], + "hints": { + "index": 12296 + } + }, + { + "items": [ + 6679, + 5.1861000061035156 + ], + "hints": { + "index": 12297 + } + }, + { + "items": [ + 6679.5, + 4.9509 + ], + "hints": { + "index": 12298 + } + }, + { + "items": [ + 6680, + 4.7272 + ], + "hints": { + "index": 12299 + } + }, + { + "items": [ + 6680.5, + 4.6247 + ], + "hints": { + "index": 12300 + } + }, + { + "items": [ + 6681, + 4.525 + ], + "hints": { + "index": 12301 + } + }, + { + "items": [ + 6681.5, + 4.5729 + ], + "hints": { + "index": 12302 + } + }, + { + "items": [ + 6682, + 4.3434000015258789 + ], + "hints": { + "index": 12303 + } + }, + { + "items": [ + 6682.5, + 4.2518000602722168 + ], + "hints": { + "index": 12304 + } + }, + { + "items": [ + 6683, + 4.8561000823974609 + ], + "hints": { + "index": 12305 + } + }, + { + "items": [ + 6683.5, + 5.9687 + ], + "hints": { + "index": 12306 + } + }, + { + "items": [ + 6684, + 7.8429 + ], + "hints": { + "index": 12307 + } + }, + { + "items": [ + 6684.5, + 7.7129 + ], + "hints": { + "index": 12308 + } + }, + { + "items": [ + 6685, + 6.7951 + ], + "hints": { + "index": 12309 + } + }, + { + "items": [ + 6685.5, + 5.9537 + ], + "hints": { + "index": 12310 + } + }, + { + "items": [ + 6686, + 6.2270998954772949 + ], + "hints": { + "index": 12311 + } + }, + { + "items": [ + 6686.5, + 6.6663 + ], + "hints": { + "index": 12312 + } + }, + { + "items": [ + 6687, + 7.226600170135498 + ], + "hints": { + "index": 12313 + } + }, + { + "items": [ + 6687.5, + 6.8906002044677734 + ], + "hints": { + "index": 12314 + } + }, + { + "items": [ + 6688, + 7.6648998260498047 + ], + "hints": { + "index": 12315 + } + }, + { + "items": [ + 6688.5, + 7.3064999580383292 + ], + "hints": { + "index": 12316 + } + }, + { + "items": [ + 6689, + 7.0216999053955078 + ], + "hints": { + "index": 12317 + } + }, + { + "items": [ + 6689.5, + 6.5244 + ], + "hints": { + "index": 12318 + } + }, + { + "items": [ + 6690, + 6.225 + ], + "hints": { + "index": 12319 + } + }, + { + "items": [ + 6690.5, + 6.4285001754760742 + ], + "hints": { + "index": 12320 + } + }, + { + "items": [ + 6691, + 6.4597001075744629 + ], + "hints": { + "index": 12321 + } + }, + { + "items": [ + 6691.5, + 6.9991998672485352 + ], + "hints": { + "index": 12322 + } + }, + { + "items": [ + 6692, + 6.8020000457763672 + ], + "hints": { + "index": 12323 + } + }, + { + "items": [ + 6692.5, + 6.6110000610351563 + ], + "hints": { + "index": 12324 + } + }, + { + "items": [ + 6693, + 6.9464001655578613 + ], + "hints": { + "index": 12325 + } + }, + { + "items": [ + 6693.5, + 7.2930002212524414 + ], + "hints": { + "index": 12326 + } + }, + { + "items": [ + 6694, + 6.0769 + ], + "hints": { + "index": 12327 + } + }, + { + "items": [ + 6694.5, + 5.200200080871582 + ], + "hints": { + "index": 12328 + } + }, + { + "items": [ + 6695, + 5.4169001579284668 + ], + "hints": { + "index": 12329 + } + }, + { + "items": [ + 6695.5, + 6.8955998420715332 + ], + "hints": { + "index": 12330 + } + }, + { + "items": [ + 6696, + 8.8071002960205078 + ], + "hints": { + "index": 12331 + } + }, + { + "items": [ + 6696.5, + 9.0754995346069336 + ], + "hints": { + "index": 12332 + } + }, + { + "items": [ + 6697, + 9.0001001358032227 + ], + "hints": { + "index": 12333 + } + }, + { + "items": [ + 6697.5, + 8.7569999694824219 + ], + "hints": { + "index": 12334 + } + }, + { + "items": [ + 6698, + 8.7614 + ], + "hints": { + "index": 12335 + } + }, + { + "items": [ + 6698.5, + 7.6337 + ], + "hints": { + "index": 12336 + } + }, + { + "items": [ + 6699, + 6.5301 + ], + "hints": { + "index": 12337 + } + }, + { + "items": [ + 6699.5, + 6.1177000999450684 + ], + "hints": { + "index": 12338 + } + }, + { + "items": [ + 6700, + 6.0940999984741211 + ], + "hints": { + "index": 12339 + } + }, + { + "items": [ + 6700.5, + 7.1543998718261719 + ], + "hints": { + "index": 12340 + } + }, + { + "items": [ + 6701, + 7.8345 + ], + "hints": { + "index": 12341 + } + }, + { + "items": [ + 6701.5, + 9.1202 + ], + "hints": { + "index": 12342 + } + }, + { + "items": [ + 6702, + 8.5112 + ], + "hints": { + "index": 12343 + } + }, + { + "items": [ + 6702.5, + 8.7125997543334961 + ], + "hints": { + "index": 12344 + } + }, + { + "items": [ + 6703, + 8.2918 + ], + "hints": { + "index": 12345 + } + }, + { + "items": [ + 6703.5, + 7.988800048828125 + ], + "hints": { + "index": 12346 + } + }, + { + "items": [ + 6704, + 6.9067997932434082 + ], + "hints": { + "index": 12347 + } + }, + { + "items": [ + 6704.5, + 6.38670015335083 + ], + "hints": { + "index": 12348 + } + }, + { + "items": [ + 6705, + 5.9818 + ], + "hints": { + "index": 12349 + } + }, + { + "items": [ + 6705.5, + 5.7383999824523926 + ], + "hints": { + "index": 12350 + } + }, + { + "items": [ + 6706, + 5.89709997177124 + ], + "hints": { + "index": 12351 + } + }, + { + "items": [ + 6706.5, + 6.0633997917175293 + ], + "hints": { + "index": 12352 + } + }, + { + "items": [ + 6707, + 6.4394001960754395 + ], + "hints": { + "index": 12353 + } + }, + { + "items": [ + 6707.5, + 5.6454000473022461 + ], + "hints": { + "index": 12354 + } + }, + { + "items": [ + 6708, + 5.9528999328613281 + ], + "hints": { + "index": 12355 + } + }, + { + "items": [ + 6708.5, + 6.4328999519348145 + ], + "hints": { + "index": 12356 + } + }, + { + "items": [ + 6709, + 7.6855001449584961 + ], + "hints": { + "index": 12357 + } + }, + { + "items": [ + 6709.5, + 7.2435998916625985 + ], + "hints": { + "index": 12358 + } + }, + { + "items": [ + 6710, + 5.8593001365661621 + ], + "hints": { + "index": 12359 + } + }, + { + "items": [ + 6710.5, + 4.9788999557495117 + ], + "hints": { + "index": 12360 + } + }, + { + "items": [ + 6711, + 4.7049999237060547 + ], + "hints": { + "index": 12361 + } + }, + { + "items": [ + 6711.5, + 5.4913997650146484 + ], + "hints": { + "index": 12362 + } + }, + { + "items": [ + 6712, + 6.3614997863769531 + ], + "hints": { + "index": 12363 + } + }, + { + "items": [ + 6712.5, + 7.5129 + ], + "hints": { + "index": 12364 + } + }, + { + "items": [ + 6713, + 8.0466995239257813 + ], + "hints": { + "index": 12365 + } + }, + { + "items": [ + 6713.5, + 8.4908 + ], + "hints": { + "index": 12366 + } + }, + { + "items": [ + 6714, + 7.7228 + ], + "hints": { + "index": 12367 + } + }, + { + "items": [ + 6714.5, + 6.653 + ], + "hints": { + "index": 12368 + } + }, + { + "items": [ + 6715, + 6.0479 + ], + "hints": { + "index": 12369 + } + }, + { + "items": [ + 6715.5, + 5.8875 + ], + "hints": { + "index": 12370 + } + }, + { + "items": [ + 6716, + 6.3205 + ], + "hints": { + "index": 12371 + } + }, + { + "items": [ + 6716.5, + 6.6502 + ], + "hints": { + "index": 12372 + } + }, + { + "items": [ + 6717, + 8.0869 + ], + "hints": { + "index": 12373 + } + }, + { + "items": [ + 6717.5, + 8.2905 + ], + "hints": { + "index": 12374 + } + }, + { + "items": [ + 6718, + 6.6713 + ], + "hints": { + "index": 12375 + } + }, + { + "items": [ + 6718.5, + 5.4891 + ], + "hints": { + "index": 12376 + } + }, + { + "items": [ + 6719, + 4.8061 + ], + "hints": { + "index": 12377 + } + }, + { + "items": [ + 6719.5, + 5.0609 + ], + "hints": { + "index": 12378 + } + }, + { + "items": [ + 6720, + 5.702 + ], + "hints": { + "index": 12379 + } + }, + { + "items": [ + 6720.5, + 6.4907 + ], + "hints": { + "index": 12380 + } + }, + { + "items": [ + 6721, + 7.8338 + ], + "hints": { + "index": 12381 + } + }, + { + "items": [ + 6721.5, + 8.1026 + ], + "hints": { + "index": 12382 + } + }, + { + "items": [ + 6722, + 8.4697 + ], + "hints": { + "index": 12383 + } + }, + { + "items": [ + 6722.5, + 9.1961 + ], + "hints": { + "index": 12384 + } + }, + { + "items": [ + 6723, + 9.5209 + ], + "hints": { + "index": 12385 + } + }, + { + "items": [ + 6723.5, + 8.5636 + ], + "hints": { + "index": 12386 + } + }, + { + "items": [ + 6724, + 7.8442 + ], + "hints": { + "index": 12387 + } + }, + { + "items": [ + 6724.5, + 7.8811 + ], + "hints": { + "index": 12388 + } + }, + { + "items": [ + 6725, + 9.453 + ], + "hints": { + "index": 12389 + } + }, + { + "items": [ + 6725.5, + 9.0073 + ], + "hints": { + "index": 12390 + } + }, + { + "items": [ + 6726, + 7.4716 + ], + "hints": { + "index": 12391 + } + }, + { + "items": [ + 6726.5, + 6.3962 + ], + "hints": { + "index": 12392 + } + }, + { + "items": [ + 6727, + 6.1646 + ], + "hints": { + "index": 12393 + } + }, + { + "items": [ + 6727.5, + 6.8927 + ], + "hints": { + "index": 12394 + } + }, + { + "items": [ + 6728, + 7.0781 + ], + "hints": { + "index": 12395 + } + }, + { + "items": [ + 6728.5, + 6.9721 + ], + "hints": { + "index": 12396 + } + }, + { + "items": [ + 6729, + 6.1699 + ], + "hints": { + "index": 12397 + } + }, + { + "items": [ + 6729.5, + 5.9241 + ], + "hints": { + "index": 12398 + } + }, + { + "items": [ + 6730, + 6.2001 + ], + "hints": { + "index": 12399 + } + }, + { + "items": [ + 6730.5, + 6.5402 + ], + "hints": { + "index": 12400 + } + }, + { + "items": [ + 6731, + 7.0801 + ], + "hints": { + "index": 12401 + } + }, + { + "items": [ + 6731.5, + 6.5084 + ], + "hints": { + "index": 12402 + } + }, + { + "items": [ + 6732, + 7.059 + ], + "hints": { + "index": 12403 + } + }, + { + "items": [ + 6732.5, + 6.7482 + ], + "hints": { + "index": 12404 + } + }, + { + "items": [ + 6733, + 7.7892 + ], + "hints": { + "index": 12405 + } + }, + { + "items": [ + 6733.5, + 8.1795 + ], + "hints": { + "index": 12406 + } + }, + { + "items": [ + 6734, + 8.3186 + ], + "hints": { + "index": 12407 + } + }, + { + "items": [ + 6734.5, + 9.2441 + ], + "hints": { + "index": 12408 + } + }, + { + "items": [ + 6735, + 10.2156 + ], + "hints": { + "index": 12409 + } + }, + { + "items": [ + 6735.5, + 11.8121 + ], + "hints": { + "index": 12410 + } + }, + { + "items": [ + 6736, + 9.3487 + ], + "hints": { + "index": 12411 + } + }, + { + "items": [ + 6736.5, + 7.6457 + ], + "hints": { + "index": 12412 + } + }, + { + "items": [ + 6737, + 7.1754 + ], + "hints": { + "index": 12413 + } + }, + { + "items": [ + 6737.5, + 6.2848 + ], + "hints": { + "index": 12414 + } + }, + { + "items": [ + 6738, + 5.3386 + ], + "hints": { + "index": 12415 + } + }, + { + "items": [ + 6738.5, + 5.0476 + ], + "hints": { + "index": 12416 + } + }, + { + "items": [ + 6739, + 5.0569 + ], + "hints": { + "index": 12417 + } + }, + { + "items": [ + 6739.5, + 5.833 + ], + "hints": { + "index": 12418 + } + }, + { + "items": [ + 6740, + 6.0379 + ], + "hints": { + "index": 12419 + } + }, + { + "items": [ + 6740.5, + 6.0374 + ], + "hints": { + "index": 12420 + } + }, + { + "items": [ + 6741, + 7.3186 + ], + "hints": { + "index": 12421 + } + }, + { + "items": [ + 6741.5, + 8.5299 + ], + "hints": { + "index": 12422 + } + }, + { + "items": [ + 6742, + 12.099 + ], + "hints": { + "index": 12423 + } + }, + { + "items": [ + 6742.5, + 11.958 + ], + "hints": { + "index": 12424 + } + }, + { + "items": [ + 6743, + 12.0133 + ], + "hints": { + "index": 12425 + } + }, + { + "items": [ + 6743.5, + 10.013099670410156 + ], + "hints": { + "index": 12426 + } + }, + { + "items": [ + 6744, + 9.4245004653930664 + ], + "hints": { + "index": 12427 + } + }, + { + "items": [ + 6744.5, + 8.4401998519897461 + ], + "hints": { + "index": 12428 + } + }, + { + "items": [ + 6745, + 7.8172998428344718 + ], + "hints": { + "index": 12429 + } + }, + { + "items": [ + 6745.5, + 7.1095 + ], + "hints": { + "index": 12430 + } + }, + { + "items": [ + 6746, + 7.4396 + ], + "hints": { + "index": 12431 + } + }, + { + "items": [ + 6746.5, + 8.6844 + ], + "hints": { + "index": 12432 + } + }, + { + "items": [ + 6747, + 9.973 + ], + "hints": { + "index": 12433 + } + }, + { + "items": [ + 6747.5, + 11.1866 + ], + "hints": { + "index": 12434 + } + }, + { + "items": [ + 6748, + 13.2994 + ], + "hints": { + "index": 12435 + } + }, + { + "items": [ + 6748.5, + 10.4431 + ], + "hints": { + "index": 12436 + } + }, + { + "items": [ + 6749, + 6.4752 + ], + "hints": { + "index": 12437 + } + }, + { + "items": [ + 6749.5, + 4.2563 + ], + "hints": { + "index": 12438 + } + }, + { + "items": [ + 6750, + 3.6404 + ], + "hints": { + "index": 12439 + } + }, + { + "items": [ + 6750.5, + 3.4333 + ], + "hints": { + "index": 12440 + } + }, + { + "items": [ + 6751, + 3.9837 + ], + "hints": { + "index": 12441 + } + }, + { + "items": [ + 6751.5, + 5.5357 + ], + "hints": { + "index": 12442 + } + }, + { + "items": [ + 6752, + 8.1453 + ], + "hints": { + "index": 12443 + } + }, + { + "items": [ + 6752.5, + 9.9471 + ], + "hints": { + "index": 12444 + } + }, + { + "items": [ + 6753, + 10.136 + ], + "hints": { + "index": 12445 + } + }, + { + "items": [ + 6753.5, + 8.055 + ], + "hints": { + "index": 12446 + } + }, + { + "items": [ + 6754, + 8.28 + ], + "hints": { + "index": 12447 + } + }, + { + "items": [ + 6754.5, + 8.2542 + ], + "hints": { + "index": 12448 + } + }, + { + "items": [ + 6755, + 11.0784 + ], + "hints": { + "index": 12449 + } + }, + { + "items": [ + 6755.5, + 12.4969 + ], + "hints": { + "index": 12450 + } + }, + { + "items": [ + 6756, + 13.6523 + ], + "hints": { + "index": 12451 + } + }, + { + "items": [ + 6756.5, + 12.4873 + ], + "hints": { + "index": 12452 + } + }, + { + "items": [ + 6757, + 11.9897 + ], + "hints": { + "index": 12453 + } + }, + { + "items": [ + 6757.5, + 11.5695 + ], + "hints": { + "index": 12454 + } + }, + { + "items": [ + 6758, + 11.4256 + ], + "hints": { + "index": 12455 + } + }, + { + "items": [ + 6758.5, + 9.1668 + ], + "hints": { + "index": 12456 + } + }, + { + "items": [ + 6759, + 8.7883 + ], + "hints": { + "index": 12457 + } + }, + { + "items": [ + 6759.5, + 9.6478 + ], + "hints": { + "index": 12458 + } + }, + { + "items": [ + 6760, + 10.5925 + ], + "hints": { + "index": 12459 + } + }, + { + "items": [ + 6760.5, + 9.5129 + ], + "hints": { + "index": 12460 + } + }, + { + "items": [ + 6761, + 8.1517 + ], + "hints": { + "index": 12461 + } + }, + { + "items": [ + 6761.5, + 6.5847 + ], + "hints": { + "index": 12462 + } + }, + { + "items": [ + 6762, + 7.1571 + ], + "hints": { + "index": 12463 + } + }, + { + "items": [ + 6762.5, + 8.0801 + ], + "hints": { + "index": 12464 + } + }, + { + "items": [ + 6763, + 10.7979 + ], + "hints": { + "index": 12465 + } + }, + { + "items": [ + 6763.5, + 12.8242 + ], + "hints": { + "index": 12466 + } + }, + { + "items": [ + 6764, + 13.1688 + ], + "hints": { + "index": 12467 + } + }, + { + "items": [ + 6764.5, + 11.9279 + ], + "hints": { + "index": 12468 + } + }, + { + "items": [ + 6765, + 11.5721 + ], + "hints": { + "index": 12469 + } + }, + { + "items": [ + 6765.5, + 8.829 + ], + "hints": { + "index": 12470 + } + }, + { + "items": [ + 6766, + 7.2313 + ], + "hints": { + "index": 12471 + } + }, + { + "items": [ + 6766.5, + 6.6196 + ], + "hints": { + "index": 12472 + } + }, + { + "items": [ + 6767, + 6.8144 + ], + "hints": { + "index": 12473 + } + }, + { + "items": [ + 6767.5, + 7.2316 + ], + "hints": { + "index": 12474 + } + }, + { + "items": [ + 6768, + 6.853 + ], + "hints": { + "index": 12475 + } + }, + { + "items": [ + 6768.5, + 7.0972 + ], + "hints": { + "index": 12476 + } + }, + { + "items": [ + 6769, + 8.0101 + ], + "hints": { + "index": 12477 + } + }, + { + "items": [ + 6769.5, + 8.7032 + ], + "hints": { + "index": 12478 + } + }, + { + "items": [ + 6770, + 8.4564 + ], + "hints": { + "index": 12479 + } + }, + { + "items": [ + 6770.5, + 7.6821 + ], + "hints": { + "index": 12480 + } + }, + { + "items": [ + 6771, + 8.6567 + ], + "hints": { + "index": 12481 + } + }, + { + "items": [ + 6771.5, + 10.94 + ], + "hints": { + "index": 12482 + } + }, + { + "items": [ + 6772, + 16.1532 + ], + "hints": { + "index": 12483 + } + }, + { + "items": [ + 6772.5, + 17.0802001953125 + ], + "hints": { + "index": 12484 + } + }, + { + "items": [ + 6773, + 15.8722 + ], + "hints": { + "index": 12485 + } + }, + { + "items": [ + 6773.5, + 11.9886 + ], + "hints": { + "index": 12486 + } + }, + { + "items": [ + 6774, + 11.995 + ], + "hints": { + "index": 12487 + } + }, + { + "items": [ + 6774.5, + 11.6828 + ], + "hints": { + "index": 12488 + } + }, + { + "items": [ + 6775, + 14.860400199890137 + ], + "hints": { + "index": 12489 + } + }, + { + "items": [ + 6775.5, + 16.801300048828125 + ], + "hints": { + "index": 12490 + } + }, + { + "items": [ + 6776, + 19.8232 + ], + "hints": { + "index": 12491 + } + }, + { + "items": [ + 6776.5, + 15.477499961853027 + ], + "hints": { + "index": 12492 + } + }, + { + "items": [ + 6777, + 11.7845 + ], + "hints": { + "index": 12493 + } + }, + { + "items": [ + 6777.5, + 10.0944 + ], + "hints": { + "index": 12494 + } + }, + { + "items": [ + 6778, + 10.492899894714355 + ], + "hints": { + "index": 12495 + } + }, + { + "items": [ + 6778.5, + 10.2995 + ], + "hints": { + "index": 12496 + } + }, + { + "items": [ + 6779, + 10.2391996383667 + ], + "hints": { + "index": 12497 + } + }, + { + "items": [ + 6779.5, + 9.6838998794555664 + ], + "hints": { + "index": 12498 + } + }, + { + "items": [ + 6780, + 11.177700042724608 + ], + "hints": { + "index": 12499 + } + }, + { + "items": [ + 6780.5, + 10.419300079345703 + ], + "hints": { + "index": 12500 + } + }, + { + "items": [ + 6781, + 9.5749 + ], + "hints": { + "index": 12501 + } + }, + { + "items": [ + 6781.5, + 7.5302000045776367 + ], + "hints": { + "index": 12502 + } + }, + { + "items": [ + 6782, + 7.0247 + ], + "hints": { + "index": 12503 + } + }, + { + "items": [ + 6782.5, + 6.7446999549865723 + ], + "hints": { + "index": 12504 + } + }, + { + "items": [ + 6783, + 7.1841 + ], + "hints": { + "index": 12505 + } + }, + { + "items": [ + 6783.5, + 8.3126001358032227 + ], + "hints": { + "index": 12506 + } + }, + { + "items": [ + 6784, + 9.2685003280639648 + ], + "hints": { + "index": 12507 + } + }, + { + "items": [ + 6784.5, + 8.6258 + ], + "hints": { + "index": 12508 + } + }, + { + "items": [ + 6785, + 6.2965002059936523 + ], + "hints": { + "index": 12509 + } + }, + { + "items": [ + 6785.5, + 5.5219998359680176 + ], + "hints": { + "index": 12510 + } + }, + { + "items": [ + 6786, + 5.4696002006530762 + ], + "hints": { + "index": 12511 + } + }, + { + "items": [ + 6786.5, + 6.0212001800537109 + ], + "hints": { + "index": 12512 + } + }, + { + "items": [ + 6787, + 5.9428 + ], + "hints": { + "index": 12513 + } + }, + { + "items": [ + 6787.5, + 5.7979001998901367 + ], + "hints": { + "index": 12514 + } + }, + { + "items": [ + 6788, + 5.9277 + ], + "hints": { + "index": 12515 + } + }, + { + "items": [ + 6788.5, + 6.04040002822876 + ], + "hints": { + "index": 12516 + } + }, + { + "items": [ + 6789, + 7.6504998207092285 + ], + "hints": { + "index": 12517 + } + }, + { + "items": [ + 6789.5, + 10.018500328063965 + ], + "hints": { + "index": 12518 + } + }, + { + "items": [ + 6790, + 14.3548002243042 + ], + "hints": { + "index": 12519 + } + }, + { + "items": [ + 6790.5, + 15.5304 + ], + "hints": { + "index": 12520 + } + }, + { + "items": [ + 6791, + 16.1875 + ], + "hints": { + "index": 12521 + } + }, + { + "items": [ + 6791.5, + 16.193899154663086 + ], + "hints": { + "index": 12522 + } + }, + { + "items": [ + 6792, + 16.408199310302734 + ], + "hints": { + "index": 12523 + } + }, + { + "items": [ + 6792.5, + 14.9765 + ], + "hints": { + "index": 12524 + } + }, + { + "items": [ + 6793, + 12.3604 + ], + "hints": { + "index": 12525 + } + }, + { + "items": [ + 6793.5, + 10.8263 + ], + "hints": { + "index": 12526 + } + }, + { + "items": [ + 6794, + 10.044599533081056 + ], + "hints": { + "index": 12527 + } + }, + { + "items": [ + 6794.5, + 9.8510999679565447 + ], + "hints": { + "index": 12528 + } + }, + { + "items": [ + 6795, + 7.8871002197265634 + ], + "hints": { + "index": 12529 + } + }, + { + "items": [ + 6795.5, + 6.8517999649047852 + ], + "hints": { + "index": 12530 + } + }, + { + "items": [ + 6796, + 6.2452998161315918 + ], + "hints": { + "index": 12531 + } + }, + { + "items": [ + 6796.5, + 6.3611001968383789 + ], + "hints": { + "index": 12532 + } + }, + { + "items": [ + 6797, + 6.9499 + ], + "hints": { + "index": 12533 + } + }, + { + "items": [ + 6797.5, + 7.6268 + ], + "hints": { + "index": 12534 + } + }, + { + "items": [ + 6798, + 8.0598 + ], + "hints": { + "index": 12535 + } + }, + { + "items": [ + 6798.5, + 6.8525 + ], + "hints": { + "index": 12536 + } + }, + { + "items": [ + 6799, + 5.7263 + ], + "hints": { + "index": 12537 + } + }, + { + "items": [ + 6799.5, + 5.1202998161315918 + ], + "hints": { + "index": 12538 + } + }, + { + "items": [ + 6800, + 5.0861001014709473 + ], + "hints": { + "index": 12539 + } + }, + { + "items": [ + 6800.5, + 5.4821000099182129 + ], + "hints": { + "index": 12540 + } + }, + { + "items": [ + 6801, + 6.1982002258300781 + ], + "hints": { + "index": 12541 + } + }, + { + "items": [ + 6801.5, + 7.4169001579284668 + ], + "hints": { + "index": 12542 + } + }, + { + "items": [ + 6802, + 7.2616 + ], + "hints": { + "index": 12543 + } + }, + { + "items": [ + 6802.5, + 6.1237998008728027 + ], + "hints": { + "index": 12544 + } + }, + { + "items": [ + 6803, + 5.1177 + ], + "hints": { + "index": 12545 + } + }, + { + "items": [ + 6803.5, + 4.8954 + ], + "hints": { + "index": 12546 + } + }, + { + "items": [ + 6804, + 5.5338 + ], + "hints": { + "index": 12547 + } + }, + { + "items": [ + 6804.5, + 6.2328 + ], + "hints": { + "index": 12548 + } + }, + { + "items": [ + 6805, + 6.38539981842041 + ], + "hints": { + "index": 12549 + } + }, + { + "items": [ + 6805.5, + 5.7073001861572266 + ], + "hints": { + "index": 12550 + } + }, + { + "items": [ + 6806, + 4.7111001014709473 + ], + "hints": { + "index": 12551 + } + }, + { + "items": [ + 6806.5, + 4.1262998580932617 + ], + "hints": { + "index": 12552 + } + }, + { + "items": [ + 6807, + 4.0904998779296875 + ], + "hints": { + "index": 12553 + } + }, + { + "items": [ + 6807.5, + 4.4250001907348633 + ], + "hints": { + "index": 12554 + } + }, + { + "items": [ + 6808, + 4.8267002105712891 + ], + "hints": { + "index": 12555 + } + }, + { + "items": [ + 6808.5, + 4.5201001167297363 + ], + "hints": { + "index": 12556 + } + }, + { + "items": [ + 6809, + 3.9414999485015874 + ], + "hints": { + "index": 12557 + } + }, + { + "items": [ + 6809.5, + 3.5048999786376953 + ], + "hints": { + "index": 12558 + } + }, + { + "items": [ + 6810, + 3.9337000846862793 + ], + "hints": { + "index": 12559 + } + }, + { + "items": [ + 6810.5, + 4.21560001373291 + ], + "hints": { + "index": 12560 + } + }, + { + "items": [ + 6811, + 4.3919000625610352 + ], + "hints": { + "index": 12561 + } + }, + { + "items": [ + 6811.5, + 3.822700023651123 + ], + "hints": { + "index": 12562 + } + }, + { + "items": [ + 6812, + 3.7441999912261958 + ], + "hints": { + "index": 12563 + } + }, + { + "items": [ + 6812.5, + 4.0114998817443848 + ], + "hints": { + "index": 12564 + } + }, + { + "items": [ + 6813, + 4.734799861907959 + ], + "hints": { + "index": 12565 + } + }, + { + "items": [ + 6813.5, + 4.90339994430542 + ], + "hints": { + "index": 12566 + } + }, + { + "items": [ + 6814, + 4.3800997734069824 + ], + "hints": { + "index": 12567 + } + }, + { + "items": [ + 6814.5, + 3.7627999782562256 + ], + "hints": { + "index": 12568 + } + }, + { + "items": [ + 6815, + 3.5624001026153564 + ], + "hints": { + "index": 12569 + } + }, + { + "items": [ + 6815.5, + 4.0251002311706543 + ], + "hints": { + "index": 12570 + } + }, + { + "items": [ + 6816, + 4.2641000747680664 + ], + "hints": { + "index": 12571 + } + }, + { + "items": [ + 6816.5, + 4.96150016784668 + ], + "hints": { + "index": 12572 + } + }, + { + "items": [ + 6817, + 5.3625998497009277 + ], + "hints": { + "index": 12573 + } + }, + { + "items": [ + 6817.5, + 5.8607997894287109 + ], + "hints": { + "index": 12574 + } + }, + { + "items": [ + 6818, + 5.4018001556396484 + ], + "hints": { + "index": 12575 + } + }, + { + "items": [ + 6818.5, + 5.0191998481750488 + ], + "hints": { + "index": 12576 + } + }, + { + "items": [ + 6819, + 4.3942999839782715 + ], + "hints": { + "index": 12577 + } + }, + { + "items": [ + 6819.5, + 4.1171998977661133 + ], + "hints": { + "index": 12578 + } + }, + { + "items": [ + 6820, + 4.1567001342773438 + ], + "hints": { + "index": 12579 + } + }, + { + "items": [ + 6820.5, + 5.0215997695922852 + ], + "hints": { + "index": 12580 + } + }, + { + "items": [ + 6821, + 6.3003997802734375 + ], + "hints": { + "index": 12581 + } + }, + { + "items": [ + 6821.5, + 6.2368998527526855 + ], + "hints": { + "index": 12582 + } + }, + { + "items": [ + 6822, + 5.999 + ], + "hints": { + "index": 12583 + } + }, + { + "items": [ + 6822.5, + 5.4770002365112305 + ], + "hints": { + "index": 12584 + } + }, + { + "items": [ + 6823, + 6.0029 + ], + "hints": { + "index": 12585 + } + }, + { + "items": [ + 6823.5, + 5.45959997177124 + ], + "hints": { + "index": 12586 + } + }, + { + "items": [ + 6824, + 4.6096 + ], + "hints": { + "index": 12587 + } + }, + { + "items": [ + 6824.5, + 4.1743001937866211 + ], + "hints": { + "index": 12588 + } + }, + { + "items": [ + 6825, + 4.4689998626708984 + ], + "hints": { + "index": 12589 + } + }, + { + "items": [ + 6825.5, + 5.376500129699707 + ], + "hints": { + "index": 12590 + } + }, + { + "items": [ + 6826, + 5.7221 + ], + "hints": { + "index": 12591 + } + }, + { + "items": [ + 6826.5, + 5.0353999137878418 + ], + "hints": { + "index": 12592 + } + }, + { + "items": [ + 6827, + 4.4527997970581055 + ], + "hints": { + "index": 12593 + } + }, + { + "items": [ + 6827.5, + 4.505000114440918 + ], + "hints": { + "index": 12594 + } + }, + { + "items": [ + 6828, + 5.0028 + ], + "hints": { + "index": 12595 + } + }, + { + "items": [ + 6828.5, + 5.6005001068115234 + ], + "hints": { + "index": 12596 + } + }, + { + "items": [ + 6829, + 5.8207001686096191 + ], + "hints": { + "index": 12597 + } + }, + { + "items": [ + 6829.5, + 6.5082998275756836 + ], + "hints": { + "index": 12598 + } + }, + { + "items": [ + 6830, + 6.9015 + ], + "hints": { + "index": 12599 + } + }, + { + "items": [ + 6830.5, + 6.6027002334594727 + ], + "hints": { + "index": 12600 + } + }, + { + "items": [ + 6831, + 5.0974001884460449 + ], + "hints": { + "index": 12601 + } + }, + { + "items": [ + 6831.5, + 4.6612000465393066 + ], + "hints": { + "index": 12602 + } + }, + { + "items": [ + 6832, + 5.8208 + ], + "hints": { + "index": 12603 + } + }, + { + "items": [ + 6832.5, + 8.3947000503540039 + ], + "hints": { + "index": 12604 + } + }, + { + "items": [ + 6833, + 11.799300193786619 + ], + "hints": { + "index": 12605 + } + }, + { + "items": [ + 6833.5, + 11.807499885559082 + ], + "hints": { + "index": 12606 + } + }, + { + "items": [ + 6834, + 10.6348 + ], + "hints": { + "index": 12607 + } + }, + { + "items": [ + 6834.5, + 9.5260000228881836 + ], + "hints": { + "index": 12608 + } + }, + { + "items": [ + 6835, + 7.914599895477294 + ], + "hints": { + "index": 12609 + } + }, + { + "items": [ + 6835.5, + 6.5532999038696289 + ], + "hints": { + "index": 12610 + } + }, + { + "items": [ + 6836, + 6.0707998275756836 + ], + "hints": { + "index": 12611 + } + }, + { + "items": [ + 6836.5, + 6.7706999778747559 + ], + "hints": { + "index": 12612 + } + }, + { + "items": [ + 6837, + 8.3467998504638672 + ], + "hints": { + "index": 12613 + } + }, + { + "items": [ + 6837.5, + 10.401100158691406 + ], + "hints": { + "index": 12614 + } + }, + { + "items": [ + 6838, + 9.2193 + ], + "hints": { + "index": 12615 + } + }, + { + "items": [ + 6838.5, + 7.1143 + ], + "hints": { + "index": 12616 + } + }, + { + "items": [ + 6839, + 5.74 + ], + "hints": { + "index": 12617 + } + }, + { + "items": [ + 6839.5, + 5.5455 + ], + "hints": { + "index": 12618 + } + }, + { + "items": [ + 6840, + 5.8509 + ], + "hints": { + "index": 12619 + } + }, + { + "items": [ + 6840.5, + 6.3107 + ], + "hints": { + "index": 12620 + } + }, + { + "items": [ + 6841, + 6.4352 + ], + "hints": { + "index": 12621 + } + }, + { + "items": [ + 6841.5, + 6.1554 + ], + "hints": { + "index": 12622 + } + }, + { + "items": [ + 6842, + 5.1927 + ], + "hints": { + "index": 12623 + } + }, + { + "items": [ + 6842.5, + 4.6914 + ], + "hints": { + "index": 12624 + } + }, + { + "items": [ + 6843, + 4.3918 + ], + "hints": { + "index": 12625 + } + }, + { + "items": [ + 6843.5, + 4.9493 + ], + "hints": { + "index": 12626 + } + }, + { + "items": [ + 6844, + 5.1577 + ], + "hints": { + "index": 12627 + } + }, + { + "items": [ + 6844.5, + 5.7056 + ], + "hints": { + "index": 12628 + } + }, + { + "items": [ + 6845, + 5.7654 + ], + "hints": { + "index": 12629 + } + }, + { + "items": [ + 6845.5, + 5.3895 + ], + "hints": { + "index": 12630 + } + }, + { + "items": [ + 6846, + 4.6263 + ], + "hints": { + "index": 12631 + } + }, + { + "items": [ + 6846.5, + 4.2035 + ], + "hints": { + "index": 12632 + } + }, + { + "items": [ + 6847, + 4.7103 + ], + "hints": { + "index": 12633 + } + }, + { + "items": [ + 6847.5, + 5.5744 + ], + "hints": { + "index": 12634 + } + }, + { + "items": [ + 6848, + 6.289 + ], + "hints": { + "index": 12635 + } + }, + { + "items": [ + 6848.5, + 5.492 + ], + "hints": { + "index": 12636 + } + }, + { + "items": [ + 6849, + 4.8472 + ], + "hints": { + "index": 12637 + } + }, + { + "items": [ + 6849.5, + 4.0845 + ], + "hints": { + "index": 12638 + } + }, + { + "items": [ + 6850, + 4.1203 + ], + "hints": { + "index": 12639 + } + }, + { + "items": [ + 6850.5, + 3.9837 + ], + "hints": { + "index": 12640 + } + }, + { + "items": [ + 6851, + 4.0893 + ], + "hints": { + "index": 12641 + } + }, + { + "items": [ + 6851.5, + 3.8719 + ], + "hints": { + "index": 12642 + } + }, + { + "items": [ + 6852, + 3.7796 + ], + "hints": { + "index": 12643 + } + }, + { + "items": [ + 6852.5, + 3.7388 + ], + "hints": { + "index": 12644 + } + }, + { + "items": [ + 6853, + 4.0312 + ], + "hints": { + "index": 12645 + } + }, + { + "items": [ + 6853.5, + 4.7652 + ], + "hints": { + "index": 12646 + } + }, + { + "items": [ + 6854, + 6.6487 + ], + "hints": { + "index": 12647 + } + }, + { + "items": [ + 6854.5, + 9.108 + ], + "hints": { + "index": 12648 + } + }, + { + "items": [ + 6855, + 11.8488 + ], + "hints": { + "index": 12649 + } + }, + { + "items": [ + 6855.5, + 8.52340030670166 + ], + "hints": { + "index": 12650 + } + }, + { + "items": [ + 6856, + 6.490300178527832 + ], + "hints": { + "index": 12651 + } + }, + { + "items": [ + 6856.5, + 5.2786002159118652 + ], + "hints": { + "index": 12652 + } + }, + { + "items": [ + 6857, + 5.29290008544922 + ], + "hints": { + "index": 12653 + } + }, + { + "items": [ + 6857.5, + 5.3378 + ], + "hints": { + "index": 12654 + } + }, + { + "items": [ + 6858, + 5.3462 + ], + "hints": { + "index": 12655 + } + }, + { + "items": [ + 6858.5, + 5.0673 + ], + "hints": { + "index": 12656 + } + }, + { + "items": [ + 6859, + 4.7144 + ], + "hints": { + "index": 12657 + } + }, + { + "items": [ + 6859.5, + 4.5182 + ], + "hints": { + "index": 12658 + } + }, + { + "items": [ + 6860, + 4.301 + ], + "hints": { + "index": 12659 + } + }, + { + "items": [ + 6860.5, + 4.3414 + ], + "hints": { + "index": 12660 + } + }, + { + "items": [ + 6861, + 4.3259 + ], + "hints": { + "index": 12661 + } + }, + { + "items": [ + 6861.5, + 4.8131 + ], + "hints": { + "index": 12662 + } + }, + { + "items": [ + 6862, + 4.8974 + ], + "hints": { + "index": 12663 + } + }, + { + "items": [ + 6862.5, + 5.318 + ], + "hints": { + "index": 12664 + } + }, + { + "items": [ + 6863, + 4.7709 + ], + "hints": { + "index": 12665 + } + }, + { + "items": [ + 6863.5, + 4.59630012512207 + ], + "hints": { + "index": 12666 + } + }, + { + "items": [ + 6864, + 4.1599998474121094 + ], + "hints": { + "index": 12667 + } + }, + { + "items": [ + 6864.5, + 4.1637001037597656 + ], + "hints": { + "index": 12668 + } + }, + { + "items": [ + 6865, + 4.2531 + ], + "hints": { + "index": 12669 + } + }, + { + "items": [ + 6865.5, + 4.3994 + ], + "hints": { + "index": 12670 + } + }, + { + "items": [ + 6866, + 4.2987 + ], + "hints": { + "index": 12671 + } + }, + { + "items": [ + 6866.5, + 4.1789 + ], + "hints": { + "index": 12672 + } + }, + { + "items": [ + 6867, + 3.9601 + ], + "hints": { + "index": 12673 + } + }, + { + "items": [ + 6867.5, + 3.9869000911712646 + ], + "hints": { + "index": 12674 + } + }, + { + "items": [ + 6868, + 3.9682 + ], + "hints": { + "index": 12675 + } + }, + { + "items": [ + 6868.5, + 3.962 + ], + "hints": { + "index": 12676 + } + }, + { + "items": [ + 6869, + 3.8717 + ], + "hints": { + "index": 12677 + } + }, + { + "items": [ + 6869.5, + 3.8247001171112065 + ], + "hints": { + "index": 12678 + } + }, + { + "items": [ + 6870, + 4.0625 + ], + "hints": { + "index": 12679 + } + }, + { + "items": [ + 6870.5, + 4.191 + ], + "hints": { + "index": 12680 + } + }, + { + "items": [ + 6871, + 4.2726001739501953 + ], + "hints": { + "index": 12681 + } + }, + { + "items": [ + 6871.5, + 3.9404 + ], + "hints": { + "index": 12682 + } + }, + { + "items": [ + 6872, + 3.8342 + ], + "hints": { + "index": 12683 + } + }, + { + "items": [ + 6872.5, + 3.741 + ], + "hints": { + "index": 12684 + } + }, + { + "items": [ + 6873, + 3.5794000625610352 + ], + "hints": { + "index": 12685 + } + }, + { + "items": [ + 6873.5, + 3.4284000396728516 + ], + "hints": { + "index": 12686 + } + }, + { + "items": [ + 6874, + 3.2293000221252441 + ], + "hints": { + "index": 12687 + } + }, + { + "items": [ + 6874.5, + 3.332 + ], + "hints": { + "index": 12688 + } + }, + { + "items": [ + 6875, + 3.3718 + ], + "hints": { + "index": 12689 + } + }, + { + "items": [ + 6875.5, + 3.4230000972747803 + ], + "hints": { + "index": 12690 + } + }, + { + "items": [ + 6876, + 3.4804 + ], + "hints": { + "index": 12691 + } + }, + { + "items": [ + 6876.5, + 3.5195999145507813 + ], + "hints": { + "index": 12692 + } + }, + { + "items": [ + 6877, + 3.5675 + ], + "hints": { + "index": 12693 + } + }, + { + "items": [ + 6877.5, + 3.6117000579833984 + ], + "hints": { + "index": 12694 + } + }, + { + "items": [ + 6878, + 3.6967 + ], + "hints": { + "index": 12695 + } + }, + { + "items": [ + 6878.5, + 3.6408998966217041 + ], + "hints": { + "index": 12696 + } + }, + { + "items": [ + 6879, + 3.636100053787231 + ], + "hints": { + "index": 12697 + } + }, + { + "items": [ + 6879.5, + 3.5098 + ], + "hints": { + "index": 12698 + } + }, + { + "items": [ + 6880, + 3.4144999980926514 + ], + "hints": { + "index": 12699 + } + }, + { + "items": [ + 6880.5, + 3.1918001174926758 + ], + "hints": { + "index": 12700 + } + }, + { + "items": [ + 6881, + 3.1150000095367432 + ], + "hints": { + "index": 12701 + } + }, + { + "items": [ + 6881.5, + 3.1131 + ], + "hints": { + "index": 12702 + } + }, + { + "items": [ + 6882, + 3.2323999404907227 + ], + "hints": { + "index": 12703 + } + }, + { + "items": [ + 6882.5, + 3.4676001071929932 + ], + "hints": { + "index": 12704 + } + }, + { + "items": [ + 6883, + 3.8420000076293945 + ], + "hints": { + "index": 12705 + } + }, + { + "items": [ + 6883.5, + 3.9871 + ], + "hints": { + "index": 12706 + } + }, + { + "items": [ + 6884, + 4.1111998558044434 + ], + "hints": { + "index": 12707 + } + }, + { + "items": [ + 6884.5, + 4.2867 + ], + "hints": { + "index": 12708 + } + }, + { + "items": [ + 6885, + 4.4656 + ], + "hints": { + "index": 12709 + } + }, + { + "items": [ + 6885.5, + 4.3918 + ], + "hints": { + "index": 12710 + } + }, + { + "items": [ + 6886, + 4.1178 + ], + "hints": { + "index": 12711 + } + }, + { + "items": [ + 6886.5, + 3.9958999156951904 + ], + "hints": { + "index": 12712 + } + }, + { + "items": [ + 6887, + 3.9059000015258794 + ], + "hints": { + "index": 12713 + } + }, + { + "items": [ + 6887.5, + 3.8306999206542969 + ], + "hints": { + "index": 12714 + } + }, + { + "items": [ + 6888, + 3.7225000858306889 + ], + "hints": { + "index": 12715 + } + }, + { + "items": [ + 6888.5, + 3.5460999011993408 + ], + "hints": { + "index": 12716 + } + }, + { + "items": [ + 6889, + 3.3912999629974365 + ], + "hints": { + "index": 12717 + } + }, + { + "items": [ + 6889.5, + 3.3768000602722168 + ], + "hints": { + "index": 12718 + } + }, + { + "items": [ + 6890, + 3.5095 + ], + "hints": { + "index": 12719 + } + }, + { + "items": [ + 6890.5, + 3.66129994392395 + ], + "hints": { + "index": 12720 + } + }, + { + "items": [ + 6891, + 3.5681 + ], + "hints": { + "index": 12721 + } + }, + { + "items": [ + 6891.5, + 3.4709 + ], + "hints": { + "index": 12722 + } + }, + { + "items": [ + 6892, + 3.3843998908996582 + ], + "hints": { + "index": 12723 + } + }, + { + "items": [ + 6892.5, + 3.5008 + ], + "hints": { + "index": 12724 + } + }, + { + "items": [ + 6893, + 3.7039999961853023 + ], + "hints": { + "index": 12725 + } + }, + { + "items": [ + 6893.5, + 3.7127 + ], + "hints": { + "index": 12726 + } + }, + { + "items": [ + 6894, + 3.6117000579833984 + ], + "hints": { + "index": 12727 + } + }, + { + "items": [ + 6894.5, + 3.4373 + ], + "hints": { + "index": 12728 + } + }, + { + "items": [ + 6895, + 3.5098 + ], + "hints": { + "index": 12729 + } + }, + { + "items": [ + 6895.5, + 3.5455999374389648 + ], + "hints": { + "index": 12730 + } + }, + { + "items": [ + 6896, + 3.4895999431610107 + ], + "hints": { + "index": 12731 + } + }, + { + "items": [ + 6896.5, + 3.4276 + ], + "hints": { + "index": 12732 + } + }, + { + "items": [ + 6897, + 3.4724 + ], + "hints": { + "index": 12733 + } + }, + { + "items": [ + 6897.5, + 3.7948 + ], + "hints": { + "index": 12734 + } + }, + { + "items": [ + 6898, + 4.1086997985839844 + ], + "hints": { + "index": 12735 + } + }, + { + "items": [ + 6898.5, + 4.2828998565673828 + ], + "hints": { + "index": 12736 + } + }, + { + "items": [ + 6899, + 3.9876000881195073 + ], + "hints": { + "index": 12737 + } + }, + { + "items": [ + 6899.5, + 3.6598 + ], + "hints": { + "index": 12738 + } + }, + { + "items": [ + 6900, + 3.5095 + ], + "hints": { + "index": 12739 + } + }, + { + "items": [ + 6900.5, + 3.2841 + ], + "hints": { + "index": 12740 + } + }, + { + "items": [ + 6901, + 3.3223 + ], + "hints": { + "index": 12741 + } + }, + { + "items": [ + 6901.5, + 3.2471001148223877 + ], + "hints": { + "index": 12742 + } + }, + { + "items": [ + 6902, + 3.2198998928070068 + ], + "hints": { + "index": 12743 + } + }, + { + "items": [ + 6902.5, + 3.1827 + ], + "hints": { + "index": 12744 + } + }, + { + "items": [ + 6903, + 3.0564 + ], + "hints": { + "index": 12745 + } + }, + { + "items": [ + 6903.5, + 3.1126 + ], + "hints": { + "index": 12746 + } + }, + { + "items": [ + 6904, + 3.092 + ], + "hints": { + "index": 12747 + } + }, + { + "items": [ + 6904.5, + 3.1844 + ], + "hints": { + "index": 12748 + } + }, + { + "items": [ + 6905, + 3.0848 + ], + "hints": { + "index": 12749 + } + }, + { + "items": [ + 6905.5, + 3.1171998977661133 + ], + "hints": { + "index": 12750 + } + }, + { + "items": [ + 6906, + 3.1591999530792236 + ], + "hints": { + "index": 12751 + } + }, + { + "items": [ + 6906.5, + 3.233 + ], + "hints": { + "index": 12752 + } + }, + { + "items": [ + 6907, + 3.2116000652313232 + ], + "hints": { + "index": 12753 + } + }, + { + "items": [ + 6907.5, + 3.199 + ], + "hints": { + "index": 12754 + } + }, + { + "items": [ + 6908, + 3.2193000316619873 + ], + "hints": { + "index": 12755 + } + }, + { + "items": [ + 6908.5, + 3.2173 + ], + "hints": { + "index": 12756 + } + }, + { + "items": [ + 6909, + 3.2644999027252197 + ], + "hints": { + "index": 12757 + } + }, + { + "items": [ + 6909.5, + 3.298799991607666 + ], + "hints": { + "index": 12758 + } + }, + { + "items": [ + 6910, + 3.3243999481201172 + ], + "hints": { + "index": 12759 + } + }, + { + "items": [ + 6910.5, + 3.3311998844146729 + ], + "hints": { + "index": 12760 + } + }, + { + "items": [ + 6911, + 3.4475 + ], + "hints": { + "index": 12761 + } + }, + { + "items": [ + 6911.5, + 3.5227 + ], + "hints": { + "index": 12762 + } + }, + { + "items": [ + 6912, + 3.5344998836517334 + ], + "hints": { + "index": 12763 + } + }, + { + "items": [ + 6912.5, + 3.4012 + ], + "hints": { + "index": 12764 + } + }, + { + "items": [ + 6913, + 3.3249 + ], + "hints": { + "index": 12765 + } + }, + { + "items": [ + 6913.5, + 3.2623 + ], + "hints": { + "index": 12766 + } + }, + { + "items": [ + 6914, + 3.3127000331878662 + ], + "hints": { + "index": 12767 + } + }, + { + "items": [ + 6914.5, + 3.4372 + ], + "hints": { + "index": 12768 + } + }, + { + "items": [ + 6915, + 3.61299991607666 + ], + "hints": { + "index": 12769 + } + }, + { + "items": [ + 6915.5, + 3.5992999076843266 + ], + "hints": { + "index": 12770 + } + }, + { + "items": [ + 6916, + 3.4746999740600586 + ], + "hints": { + "index": 12771 + } + }, + { + "items": [ + 6916.5, + 3.2991 + ], + "hints": { + "index": 12772 + } + }, + { + "items": [ + 6917, + 3.4402999877929688 + ], + "hints": { + "index": 12773 + } + }, + { + "items": [ + 6917.5, + 3.3584 + ], + "hints": { + "index": 12774 + } + }, + { + "items": [ + 6918, + 3.4279 + ], + "hints": { + "index": 12775 + } + }, + { + "items": [ + 6918.5, + 3.4068999290466309 + ], + "hints": { + "index": 12776 + } + }, + { + "items": [ + 6919, + 3.6735000610351558 + ], + "hints": { + "index": 12777 + } + }, + { + "items": [ + 6919.5, + 3.6500000953674321 + ], + "hints": { + "index": 12778 + } + }, + { + "items": [ + 6920, + 3.4103 + ], + "hints": { + "index": 12779 + } + }, + { + "items": [ + 6920.5, + 3.2309000492095947 + ], + "hints": { + "index": 12780 + } + }, + { + "items": [ + 6921, + 3.2679 + ], + "hints": { + "index": 12781 + } + }, + { + "items": [ + 6921.5, + 3.2514 + ], + "hints": { + "index": 12782 + } + }, + { + "items": [ + 6922, + 3.124000072479248 + ], + "hints": { + "index": 12783 + } + }, + { + "items": [ + 6922.5, + 3.1081 + ], + "hints": { + "index": 12784 + } + }, + { + "items": [ + 6923, + 3.1386 + ], + "hints": { + "index": 12785 + } + }, + { + "items": [ + 6923.5, + 3.2762999534606938 + ], + "hints": { + "index": 12786 + } + }, + { + "items": [ + 6924, + 3.2434 + ], + "hints": { + "index": 12787 + } + }, + { + "items": [ + 6924.5, + 3.2618000507354736 + ], + "hints": { + "index": 12788 + } + }, + { + "items": [ + 6925, + 3.5319 + ], + "hints": { + "index": 12789 + } + }, + { + "items": [ + 6925.5, + 3.7484 + ], + "hints": { + "index": 12790 + } + }, + { + "items": [ + 6926, + 3.8423 + ], + "hints": { + "index": 12791 + } + }, + { + "items": [ + 6926.5, + 3.4291000366210938 + ], + "hints": { + "index": 12792 + } + }, + { + "items": [ + 6927, + 3.3141999244689941 + ], + "hints": { + "index": 12793 + } + }, + { + "items": [ + 6927.5, + 3.2602 + ], + "hints": { + "index": 12794 + } + }, + { + "items": [ + 6928, + 3.3243 + ], + "hints": { + "index": 12795 + } + }, + { + "items": [ + 6928.5, + 3.2492 + ], + "hints": { + "index": 12796 + } + }, + { + "items": [ + 6929, + 3.3397 + ], + "hints": { + "index": 12797 + } + }, + { + "items": [ + 6929.5, + 3.42770004272461 + ], + "hints": { + "index": 12798 + } + }, + { + "items": [ + 6930, + 3.5329000949859619 + ], + "hints": { + "index": 12799 + } + }, + { + "items": [ + 6930.5, + 3.4890000820159912 + ], + "hints": { + "index": 12800 + } + }, + { + "items": [ + 6931, + 3.3988 + ], + "hints": { + "index": 12801 + } + }, + { + "items": [ + 6931.5, + 3.3627998828887939 + ], + "hints": { + "index": 12802 + } + }, + { + "items": [ + 6932, + 3.3262 + ], + "hints": { + "index": 12803 + } + }, + { + "items": [ + 6932.5, + 3.3164000511169434 + ], + "hints": { + "index": 12804 + } + }, + { + "items": [ + 6933, + 3.0478999614715576 + ], + "hints": { + "index": 12805 + } + }, + { + "items": [ + 6933.5, + 3.015 + ], + "hints": { + "index": 12806 + } + }, + { + "items": [ + 6934, + 2.8845000267028809 + ], + "hints": { + "index": 12807 + } + }, + { + "items": [ + 6934.5, + 3.043100118637085 + ], + "hints": { + "index": 12808 + } + }, + { + "items": [ + 6935, + 3.2669999599456787 + ], + "hints": { + "index": 12809 + } + }, + { + "items": [ + 6935.5, + 3.9295001029968266 + ], + "hints": { + "index": 12810 + } + }, + { + "items": [ + 6936, + 4.7045998573303223 + ], + "hints": { + "index": 12811 + } + }, + { + "items": [ + 6936.5, + 5.1542000770568848 + ], + "hints": { + "index": 12812 + } + }, + { + "items": [ + 6937, + 4.6746997833251953 + ], + "hints": { + "index": 12813 + } + }, + { + "items": [ + 6937.5, + 3.9048 + ], + "hints": { + "index": 12814 + } + }, + { + "items": [ + 6938, + 3.3510000705718994 + ], + "hints": { + "index": 12815 + } + }, + { + "items": [ + 6938.5, + 3.1896 + ], + "hints": { + "index": 12816 + } + }, + { + "items": [ + 6939, + 3.1751 + ], + "hints": { + "index": 12817 + } + }, + { + "items": [ + 6939.5, + 3.2382 + ], + "hints": { + "index": 12818 + } + }, + { + "items": [ + 6940, + 3.1813 + ], + "hints": { + "index": 12819 + } + }, + { + "items": [ + 6940.5, + 3.1434 + ], + "hints": { + "index": 12820 + } + }, + { + "items": [ + 6941, + 3.0912001132965088 + ], + "hints": { + "index": 12821 + } + }, + { + "items": [ + 6941.5, + 3.2534999847412109 + ], + "hints": { + "index": 12822 + } + }, + { + "items": [ + 6942, + 3.4815 + ], + "hints": { + "index": 12823 + } + }, + { + "items": [ + 6942.5, + 3.6626999378204346 + ], + "hints": { + "index": 12824 + } + }, + { + "items": [ + 6943, + 3.7573 + ], + "hints": { + "index": 12825 + } + }, + { + "items": [ + 6943.5, + 3.644399881362915 + ], + "hints": { + "index": 12826 + } + }, + { + "items": [ + 6944, + 3.6725 + ], + "hints": { + "index": 12827 + } + }, + { + "items": [ + 6944.5, + 3.5229 + ], + "hints": { + "index": 12828 + } + }, + { + "items": [ + 6945, + 3.4182999134063721 + ], + "hints": { + "index": 12829 + } + }, + { + "items": [ + 6945.5, + 3.347 + ], + "hints": { + "index": 12830 + } + }, + { + "items": [ + 6946, + 3.3262999057769775 + ], + "hints": { + "index": 12831 + } + }, + { + "items": [ + 6946.5, + 3.41729998588562 + ], + "hints": { + "index": 12832 + } + }, + { + "items": [ + 6947, + 3.3534 + ], + "hints": { + "index": 12833 + } + }, + { + "items": [ + 6947.5, + 3.3449 + ], + "hints": { + "index": 12834 + } + }, + { + "items": [ + 6948, + 3.2638 + ], + "hints": { + "index": 12835 + } + }, + { + "items": [ + 6948.5, + 3.2335 + ], + "hints": { + "index": 12836 + } + }, + { + "items": [ + 6949, + 3.1995999813079834 + ], + "hints": { + "index": 12837 + } + }, + { + "items": [ + 6949.5, + 3.1035 + ], + "hints": { + "index": 12838 + } + }, + { + "items": [ + 6950, + 3.2648000717163086 + ], + "hints": { + "index": 12839 + } + }, + { + "items": [ + 6950.5, + 3.2458000183105469 + ], + "hints": { + "index": 12840 + } + }, + { + "items": [ + 6951, + 3.4758000373840332 + ], + "hints": { + "index": 12841 + } + }, + { + "items": [ + 6951.5, + 3.4763000011444092 + ], + "hints": { + "index": 12842 + } + }, + { + "items": [ + 6952, + 3.5133 + ], + "hints": { + "index": 12843 + } + }, + { + "items": [ + 6952.5, + 3.3424 + ], + "hints": { + "index": 12844 + } + }, + { + "items": [ + 6953, + 3.2476999759674072 + ], + "hints": { + "index": 12845 + } + }, + { + "items": [ + 6953.5, + 3.3674 + ], + "hints": { + "index": 12846 + } + }, + { + "items": [ + 6954, + 3.3859 + ], + "hints": { + "index": 12847 + } + }, + { + "items": [ + 6954.5, + 3.3927 + ], + "hints": { + "index": 12848 + } + }, + { + "items": [ + 6955, + 3.3907 + ], + "hints": { + "index": 12849 + } + }, + { + "items": [ + 6955.5, + 3.399 + ], + "hints": { + "index": 12850 + } + }, + { + "items": [ + 6956, + 3.3439 + ], + "hints": { + "index": 12851 + } + }, + { + "items": [ + 6956.5, + 3.2119 + ], + "hints": { + "index": 12852 + } + }, + { + "items": [ + 6957, + 3.3849999904632568 + ], + "hints": { + "index": 12853 + } + }, + { + "items": [ + 6957.5, + 3.6545999050140385 + ], + "hints": { + "index": 12854 + } + }, + { + "items": [ + 6958, + 3.948100090026855 + ], + "hints": { + "index": 12855 + } + }, + { + "items": [ + 6958.5, + 4.1721000671386719 + ], + "hints": { + "index": 12856 + } + }, + { + "items": [ + 6959, + 4.4229 + ], + "hints": { + "index": 12857 + } + }, + { + "items": [ + 6959.5, + 4.8632001876831055 + ], + "hints": { + "index": 12858 + } + }, + { + "items": [ + 6960, + 4.9225001335144043 + ], + "hints": { + "index": 12859 + } + }, + { + "items": [ + 6960.5, + 5.2297000885009766 + ], + "hints": { + "index": 12860 + } + }, + { + "items": [ + 6961, + 4.9457001686096191 + ], + "hints": { + "index": 12861 + } + }, + { + "items": [ + 6961.5, + 4.9657 + ], + "hints": { + "index": 12862 + } + }, + { + "items": [ + 6962, + 4.2232 + ], + "hints": { + "index": 12863 + } + }, + { + "items": [ + 6962.5, + 3.9051001071929936 + ], + "hints": { + "index": 12864 + } + }, + { + "items": [ + 6963, + 3.5761001110076904 + ], + "hints": { + "index": 12865 + } + }, + { + "items": [ + 6963.5, + 3.4325 + ], + "hints": { + "index": 12866 + } + }, + { + "items": [ + 6964, + 3.2874000072479248 + ], + "hints": { + "index": 12867 + } + }, + { + "items": [ + 6964.5, + 3.1405999660491943 + ], + "hints": { + "index": 12868 + } + }, + { + "items": [ + 6965, + 3.0768001079559326 + ], + "hints": { + "index": 12869 + } + }, + { + "items": [ + 6965.5, + 3.0494000911712646 + ], + "hints": { + "index": 12870 + } + }, + { + "items": [ + 6966, + 3.2067 + ], + "hints": { + "index": 12871 + } + }, + { + "items": [ + 6966.5, + 3.254 + ], + "hints": { + "index": 12872 + } + }, + { + "items": [ + 6967, + 3.4497001171112061 + ], + "hints": { + "index": 12873 + } + }, + { + "items": [ + 6967.5, + 3.440000057220459 + ], + "hints": { + "index": 12874 + } + }, + { + "items": [ + 6968, + 3.5631000995635982 + ], + "hints": { + "index": 12875 + } + }, + { + "items": [ + 6968.5, + 3.3922998905181885 + ], + "hints": { + "index": 12876 + } + }, + { + "items": [ + 6969, + 3.2716 + ], + "hints": { + "index": 12877 + } + }, + { + "items": [ + 6969.5, + 3.1180000305175781 + ], + "hints": { + "index": 12878 + } + }, + { + "items": [ + 6970, + 3.1349 + ], + "hints": { + "index": 12879 + } + }, + { + "items": [ + 6970.5, + 3.2692000865936279 + ], + "hints": { + "index": 12880 + } + }, + { + "items": [ + 6971, + 3.6424 + ], + "hints": { + "index": 12881 + } + }, + { + "items": [ + 6971.5, + 3.8207 + ], + "hints": { + "index": 12882 + } + }, + { + "items": [ + 6972, + 3.9358999729156494 + ], + "hints": { + "index": 12883 + } + }, + { + "items": [ + 6972.5, + 3.5416998863220215 + ], + "hints": { + "index": 12884 + } + }, + { + "items": [ + 6973, + 3.3737 + ], + "hints": { + "index": 12885 + } + }, + { + "items": [ + 6973.5, + 3.2018 + ], + "hints": { + "index": 12886 + } + }, + { + "items": [ + 6974, + 3.4276 + ], + "hints": { + "index": 12887 + } + }, + { + "items": [ + 6974.5, + 3.58459997177124 + ], + "hints": { + "index": 12888 + } + }, + { + "items": [ + 6975, + 3.4348 + ], + "hints": { + "index": 12889 + } + }, + { + "items": [ + 6975.5, + 3.1447000503540039 + ], + "hints": { + "index": 12890 + } + }, + { + "items": [ + 6976, + 2.9391999244689941 + ], + "hints": { + "index": 12891 + } + }, + { + "items": [ + 6976.5, + 3.0039999485015869 + ], + "hints": { + "index": 12892 + } + }, + { + "items": [ + 6977, + 3.2251 + ], + "hints": { + "index": 12893 + } + }, + { + "items": [ + 6977.5, + 3.3152999877929688 + ], + "hints": { + "index": 12894 + } + }, + { + "items": [ + 6978, + 3.2093 + ], + "hints": { + "index": 12895 + } + }, + { + "items": [ + 6978.5, + 2.9679999351501465 + ], + "hints": { + "index": 12896 + } + }, + { + "items": [ + 6979, + 2.912100076675415 + ], + "hints": { + "index": 12897 + } + }, + { + "items": [ + 6979.5, + 2.9676001071929932 + ], + "hints": { + "index": 12898 + } + }, + { + "items": [ + 6980, + 3.010200023651123 + ], + "hints": { + "index": 12899 + } + }, + { + "items": [ + 6980.5, + 3.0710000991821289 + ], + "hints": { + "index": 12900 + } + }, + { + "items": [ + 6981, + 2.9851000308990479 + ], + "hints": { + "index": 12901 + } + }, + { + "items": [ + 6981.5, + 2.9446001052856445 + ], + "hints": { + "index": 12902 + } + }, + { + "items": [ + 6982, + 2.8617000579833984 + ], + "hints": { + "index": 12903 + } + }, + { + "items": [ + 6982.5, + 2.9718 + ], + "hints": { + "index": 12904 + } + }, + { + "items": [ + 6983, + 3.0892000198364258 + ], + "hints": { + "index": 12905 + } + }, + { + "items": [ + 6983.5, + 3.2920000553131104 + ], + "hints": { + "index": 12906 + } + }, + { + "items": [ + 6984, + 3.4095 + ], + "hints": { + "index": 12907 + } + }, + { + "items": [ + 6984.5, + 3.6577999591827393 + ], + "hints": { + "index": 12908 + } + }, + { + "items": [ + 6985, + 4.3031997680664063 + ], + "hints": { + "index": 12909 + } + }, + { + "items": [ + 6985.5, + 4.7677001953125 + ], + "hints": { + "index": 12910 + } + }, + { + "items": [ + 6986, + 4.4401998519897461 + ], + "hints": { + "index": 12911 + } + }, + { + "items": [ + 6986.5, + 3.5072999000549316 + ], + "hints": { + "index": 12912 + } + }, + { + "items": [ + 6987, + 3.2156999111175537 + ], + "hints": { + "index": 12913 + } + }, + { + "items": [ + 6987.5, + 3.428800106048584 + ], + "hints": { + "index": 12914 + } + }, + { + "items": [ + 6988, + 3.6042 + ], + "hints": { + "index": 12915 + } + }, + { + "items": [ + 6988.5, + 3.533099889755249 + ], + "hints": { + "index": 12916 + } + }, + { + "items": [ + 6989, + 3.2706000804901123 + ], + "hints": { + "index": 12917 + } + }, + { + "items": [ + 6989.5, + 3.1891999244689941 + ], + "hints": { + "index": 12918 + } + }, + { + "items": [ + 6990, + 3.2343 + ], + "hints": { + "index": 12919 + } + }, + { + "items": [ + 6990.5, + 3.3243 + ], + "hints": { + "index": 12920 + } + }, + { + "items": [ + 6991, + 3.6977999210357666 + ], + "hints": { + "index": 12921 + } + }, + { + "items": [ + 6991.5, + 3.7725000381469727 + ], + "hints": { + "index": 12922 + } + }, + { + "items": [ + 6992, + 3.7757000923156734 + ], + "hints": { + "index": 12923 + } + }, + { + "items": [ + 6992.5, + 3.5703001022338867 + ], + "hints": { + "index": 12924 + } + }, + { + "items": [ + 6993, + 3.682 + ], + "hints": { + "index": 12925 + } + }, + { + "items": [ + 6993.5, + 3.5580000877380371 + ], + "hints": { + "index": 12926 + } + }, + { + "items": [ + 6994, + 3.5041 + ], + "hints": { + "index": 12927 + } + }, + { + "items": [ + 6994.5, + 3.564500093460083 + ], + "hints": { + "index": 12928 + } + }, + { + "items": [ + 6995, + 3.8893 + ], + "hints": { + "index": 12929 + } + }, + { + "items": [ + 6995.5, + 4.06279993057251 + ], + "hints": { + "index": 12930 + } + }, + { + "items": [ + 6996, + 4.8601999282836914 + ], + "hints": { + "index": 12931 + } + }, + { + "items": [ + 6996.5, + 6.9127001762390137 + ], + "hints": { + "index": 12932 + } + }, + { + "items": [ + 6997, + 10.128299713134766 + ], + "hints": { + "index": 12933 + } + }, + { + "items": [ + 6997.5, + 11.952500343322754 + ], + "hints": { + "index": 12934 + } + }, + { + "items": [ + 6998, + 9.8715000152587891 + ], + "hints": { + "index": 12935 + } + }, + { + "items": [ + 6998.5, + 8.5299 + ], + "hints": { + "index": 12936 + } + }, + { + "items": [ + 6999, + 7.8111 + ], + "hints": { + "index": 12937 + } + }, + { + "items": [ + 6999.5, + 6.9777002334594727 + ], + "hints": { + "index": 12938 + } + }, + { + "items": [ + 7000, + 5.7807998657226563 + ], + "hints": { + "index": 12939 + } + }, + { + "items": [ + 7000.5, + 4.7328000068664551 + ], + "hints": { + "index": 12940 + } + }, + { + "items": [ + 7001, + 4.2293000221252441 + ], + "hints": { + "index": 12941 + } + }, + { + "items": [ + 7001.5, + 3.9825000762939458 + ], + "hints": { + "index": 12942 + } + }, + { + "items": [ + 7002, + 3.800800085067749 + ], + "hints": { + "index": 12943 + } + }, + { + "items": [ + 7002.5, + 3.6311 + ], + "hints": { + "index": 12944 + } + }, + { + "items": [ + 7003, + 3.5478999614715576 + ], + "hints": { + "index": 12945 + } + }, + { + "items": [ + 7003.5, + 3.4551 + ], + "hints": { + "index": 12946 + } + }, + { + "items": [ + 7004, + 3.3603 + ], + "hints": { + "index": 12947 + } + }, + { + "items": [ + 7004.5, + 3.2190999984741211 + ], + "hints": { + "index": 12948 + } + }, + { + "items": [ + 7005, + 3.1233000755310059 + ], + "hints": { + "index": 12949 + } + }, + { + "items": [ + 7005.5, + 3.4718000888824463 + ], + "hints": { + "index": 12950 + } + }, + { + "items": [ + 7006, + 4.1563000679016113 + ], + "hints": { + "index": 12951 + } + }, + { + "items": [ + 7006.5, + 5.0163002014160156 + ], + "hints": { + "index": 12952 + } + }, + { + "items": [ + 7007, + 5.1592998504638672 + ], + "hints": { + "index": 12953 + } + }, + { + "items": [ + 7007.5, + 4.7829999923706055 + ], + "hints": { + "index": 12954 + } + }, + { + "items": [ + 7008, + 4.287600040435791 + ], + "hints": { + "index": 12955 + } + }, + { + "items": [ + 7008.5, + 3.93120002746582 + ], + "hints": { + "index": 12956 + } + }, + { + "items": [ + 7009, + 3.6864 + ], + "hints": { + "index": 12957 + } + }, + { + "items": [ + 7009.5, + 3.5996 + ], + "hints": { + "index": 12958 + } + }, + { + "items": [ + 7010, + 3.4365 + ], + "hints": { + "index": 12959 + } + }, + { + "items": [ + 7010.5, + 3.5499000549316406 + ], + "hints": { + "index": 12960 + } + }, + { + "items": [ + 7011, + 3.7969000339508057 + ], + "hints": { + "index": 12961 + } + }, + { + "items": [ + 7011.5, + 4.124000072479248 + ], + "hints": { + "index": 12962 + } + }, + { + "items": [ + 7012, + 4.0383 + ], + "hints": { + "index": 12963 + } + }, + { + "items": [ + 7012.5, + 3.7809000015258794 + ], + "hints": { + "index": 12964 + } + }, + { + "items": [ + 7013, + 3.779900074005127 + ], + "hints": { + "index": 12965 + } + }, + { + "items": [ + 7013.5, + 3.6914999485015874 + ], + "hints": { + "index": 12966 + } + }, + { + "items": [ + 7014, + 3.6551 + ], + "hints": { + "index": 12967 + } + }, + { + "items": [ + 7014.5, + 3.516200065612793 + ], + "hints": { + "index": 12968 + } + }, + { + "items": [ + 7015, + 3.4823999404907227 + ], + "hints": { + "index": 12969 + } + }, + { + "items": [ + 7015.5, + 3.3848 + ], + "hints": { + "index": 12970 + } + }, + { + "items": [ + 7016, + 3.2911 + ], + "hints": { + "index": 12971 + } + }, + { + "items": [ + 7016.5, + 3.238899946212769 + ], + "hints": { + "index": 12972 + } + }, + { + "items": [ + 7017, + 3.342400074005127 + ], + "hints": { + "index": 12973 + } + }, + { + "items": [ + 7017.5, + 3.5817000865936279 + ], + "hints": { + "index": 12974 + } + }, + { + "items": [ + 7018, + 3.6343998908996582 + ], + "hints": { + "index": 12975 + } + }, + { + "items": [ + 7018.5, + 3.7061998844146729 + ], + "hints": { + "index": 12976 + } + }, + { + "items": [ + 7019, + 3.6113998889923096 + ], + "hints": { + "index": 12977 + } + }, + { + "items": [ + 7019.5, + 3.8917999267578129 + ], + "hints": { + "index": 12978 + } + }, + { + "items": [ + 7020, + 4.1549 + ], + "hints": { + "index": 12979 + } + }, + { + "items": [ + 7020.5, + 4.7045 + ], + "hints": { + "index": 12980 + } + }, + { + "items": [ + 7021, + 4.6852998733520508 + ], + "hints": { + "index": 12981 + } + }, + { + "items": [ + 7021.5, + 4.237800121307373 + ], + "hints": { + "index": 12982 + } + }, + { + "items": [ + 7022, + 3.8745 + ], + "hints": { + "index": 12983 + } + }, + { + "items": [ + 7022.5, + 3.8232998847961426 + ], + "hints": { + "index": 12984 + } + }, + { + "items": [ + 7023, + 3.6705000400543217 + ], + "hints": { + "index": 12985 + } + }, + { + "items": [ + 7023.5, + 3.4207000732421875 + ], + "hints": { + "index": 12986 + } + }, + { + "items": [ + 7024, + 3.3103 + ], + "hints": { + "index": 12987 + } + }, + { + "items": [ + 7024.5, + 3.2488 + ], + "hints": { + "index": 12988 + } + }, + { + "items": [ + 7025, + 3.2748000621795654 + ], + "hints": { + "index": 12989 + } + }, + { + "items": [ + 7025.5, + 3.4333000183105469 + ], + "hints": { + "index": 12990 + } + }, + { + "items": [ + 7026, + 3.5239999294281006 + ], + "hints": { + "index": 12991 + } + }, + { + "items": [ + 7026.5, + 3.5404999256134033 + ], + "hints": { + "index": 12992 + } + }, + { + "items": [ + 7027, + 3.390700101852417 + ], + "hints": { + "index": 12993 + } + }, + { + "items": [ + 7027.5, + 3.3928 + ], + "hints": { + "index": 12994 + } + }, + { + "items": [ + 7028, + 3.778 + ], + "hints": { + "index": 12995 + } + }, + { + "items": [ + 7028.5, + 4.1020002365112305 + ], + "hints": { + "index": 12996 + } + }, + { + "items": [ + 7029, + 4.5602002143859863 + ], + "hints": { + "index": 12997 + } + }, + { + "items": [ + 7029.5, + 4.447700023651123 + ], + "hints": { + "index": 12998 + } + }, + { + "items": [ + 7030, + 4.467400074005127 + ], + "hints": { + "index": 12999 + } + }, + { + "items": [ + 7030.5, + 4.2395000457763672 + ], + "hints": { + "index": 13000 + } + }, + { + "items": [ + 7031, + 4.1168999671936035 + ], + "hints": { + "index": 13001 + } + }, + { + "items": [ + 7031.5, + 3.9079999923706055 + ], + "hints": { + "index": 13002 + } + }, + { + "items": [ + 7032, + 4.0226001739501953 + ], + "hints": { + "index": 13003 + } + }, + { + "items": [ + 7032.5, + 4.0390000343322754 + ], + "hints": { + "index": 13004 + } + }, + { + "items": [ + 7033, + 4.2241001129150391 + ], + "hints": { + "index": 13005 + } + }, + { + "items": [ + 7033.5, + 4.4443998336791992 + ], + "hints": { + "index": 13006 + } + }, + { + "items": [ + 7034, + 4.6174001693725586 + ], + "hints": { + "index": 13007 + } + }, + { + "items": [ + 7034.5, + 4.7638998031616211 + ], + "hints": { + "index": 13008 + } + }, + { + "items": [ + 7035, + 5.0594000816345215 + ], + "hints": { + "index": 13009 + } + }, + { + "items": [ + 7035.5, + 5.5771 + ], + "hints": { + "index": 13010 + } + }, + { + "items": [ + 7036, + 6.0304999351501465 + ], + "hints": { + "index": 13011 + } + }, + { + "items": [ + 7036.5, + 5.4546999931335449 + ], + "hints": { + "index": 13012 + } + }, + { + "items": [ + 7037, + 4.7769999504089355 + ], + "hints": { + "index": 13013 + } + }, + { + "items": [ + 7037.5, + 4.1385002136230469 + ], + "hints": { + "index": 13014 + } + }, + { + "items": [ + 7038, + 4.0454998016357422 + ], + "hints": { + "index": 13015 + } + }, + { + "items": [ + 7038.5, + 4.0469999313354492 + ], + "hints": { + "index": 13016 + } + }, + { + "items": [ + 7039, + 3.8729000091552734 + ], + "hints": { + "index": 13017 + } + }, + { + "items": [ + 7039.5, + 3.796799898147583 + ], + "hints": { + "index": 13018 + } + }, + { + "items": [ + 7040, + 3.8797 + ], + "hints": { + "index": 13019 + } + }, + { + "items": [ + 7040.5, + 4.4387001991271973 + ], + "hints": { + "index": 13020 + } + }, + { + "items": [ + 7041, + 4.6791000366210938 + ], + "hints": { + "index": 13021 + } + }, + { + "items": [ + 7041.5, + 4.5977 + ], + "hints": { + "index": 13022 + } + }, + { + "items": [ + 7042, + 4.4794001579284668 + ], + "hints": { + "index": 13023 + } + }, + { + "items": [ + 7042.5, + 4.26639986038208 + ], + "hints": { + "index": 13024 + } + }, + { + "items": [ + 7043, + 4.0913000106811523 + ], + "hints": { + "index": 13025 + } + }, + { + "items": [ + 7043.5, + 3.574199914932251 + ], + "hints": { + "index": 13026 + } + }, + { + "items": [ + 7044, + 3.4719 + ], + "hints": { + "index": 13027 + } + }, + { + "items": [ + 7044.5, + 3.3722000122070313 + ], + "hints": { + "index": 13028 + } + }, + { + "items": [ + 7045, + 3.3740999698638916 + ], + "hints": { + "index": 13029 + } + }, + { + "items": [ + 7045.5, + 3.2797999382019043 + ], + "hints": { + "index": 13030 + } + }, + { + "items": [ + 7046, + 3.2699 + ], + "hints": { + "index": 13031 + } + }, + { + "items": [ + 7046.5, + 3.3409 + ], + "hints": { + "index": 13032 + } + }, + { + "items": [ + 7047, + 3.2920000553131104 + ], + "hints": { + "index": 13033 + } + }, + { + "items": [ + 7047.5, + 3.3515 + ], + "hints": { + "index": 13034 + } + }, + { + "items": [ + 7048, + 3.3815 + ], + "hints": { + "index": 13035 + } + }, + { + "items": [ + 7048.5, + 3.5901999473571777 + ], + "hints": { + "index": 13036 + } + }, + { + "items": [ + 7049, + 3.6456000804901119 + ], + "hints": { + "index": 13037 + } + }, + { + "items": [ + 7049.5, + 3.6830999851226807 + ], + "hints": { + "index": 13038 + } + }, + { + "items": [ + 7050, + 3.6730999946594238 + ], + "hints": { + "index": 13039 + } + }, + { + "items": [ + 7050.5, + 3.6884000301361088 + ], + "hints": { + "index": 13040 + } + }, + { + "items": [ + 7051, + 3.7021000385284424 + ], + "hints": { + "index": 13041 + } + }, + { + "items": [ + 7051.5, + 3.6689 + ], + "hints": { + "index": 13042 + } + }, + { + "items": [ + 7052, + 3.7988998889923096 + ], + "hints": { + "index": 13043 + } + }, + { + "items": [ + 7052.5, + 4.0029997825622559 + ], + "hints": { + "index": 13044 + } + }, + { + "items": [ + 7053, + 4.2978000640869141 + ], + "hints": { + "index": 13045 + } + }, + { + "items": [ + 7053.5, + 4.3899002075195313 + ], + "hints": { + "index": 13046 + } + }, + { + "items": [ + 7054, + 4.3393001556396484 + ], + "hints": { + "index": 13047 + } + }, + { + "items": [ + 7054.5, + 4.2715001106262207 + ], + "hints": { + "index": 13048 + } + }, + { + "items": [ + 7055, + 4.2247 + ], + "hints": { + "index": 13049 + } + }, + { + "items": [ + 7055.5, + 4.2308001518249512 + ], + "hints": { + "index": 13050 + } + }, + { + "items": [ + 7056, + 4.1114997863769531 + ], + "hints": { + "index": 13051 + } + }, + { + "items": [ + 7056.5, + 3.9276 + ], + "hints": { + "index": 13052 + } + }, + { + "items": [ + 7057, + 3.7478001117706294 + ], + "hints": { + "index": 13053 + } + }, + { + "items": [ + 7057.5, + 3.6626 + ], + "hints": { + "index": 13054 + } + }, + { + "items": [ + 7058, + 3.6731 + ], + "hints": { + "index": 13055 + } + }, + { + "items": [ + 7058.5, + 3.6209 + ], + "hints": { + "index": 13056 + } + }, + { + "items": [ + 7059, + 3.5673999786376953 + ], + "hints": { + "index": 13057 + } + }, + { + "items": [ + 7059.5, + 3.3903 + ], + "hints": { + "index": 13058 + } + }, + { + "items": [ + 7060, + 3.3475000858306885 + ], + "hints": { + "index": 13059 + } + }, + { + "items": [ + 7060.5, + 3.3312 + ], + "hints": { + "index": 13060 + } + }, + { + "items": [ + 7061, + 3.3333001136779785 + ], + "hints": { + "index": 13061 + } + }, + { + "items": [ + 7061.5, + 3.2822999954223633 + ], + "hints": { + "index": 13062 + } + }, + { + "items": [ + 7062, + 3.2569 + ], + "hints": { + "index": 13063 + } + }, + { + "items": [ + 7062.5, + 3.3779 + ], + "hints": { + "index": 13064 + } + }, + { + "items": [ + 7063, + 3.5889 + ], + "hints": { + "index": 13065 + } + }, + { + "items": [ + 7063.5, + 3.4984 + ], + "hints": { + "index": 13066 + } + }, + { + "items": [ + 7064, + 3.4425 + ], + "hints": { + "index": 13067 + } + }, + { + "items": [ + 7064.5, + 3.3142 + ], + "hints": { + "index": 13068 + } + }, + { + "items": [ + 7065, + 3.3152999877929688 + ], + "hints": { + "index": 13069 + } + }, + { + "items": [ + 7065.5, + 3.3628 + ], + "hints": { + "index": 13070 + } + }, + { + "items": [ + 7066, + 3.4809 + ], + "hints": { + "index": 13071 + } + }, + { + "items": [ + 7066.5, + 3.6252999305725098 + ], + "hints": { + "index": 13072 + } + }, + { + "items": [ + 7067, + 3.6335999965667729 + ], + "hints": { + "index": 13073 + } + }, + { + "items": [ + 7067.5, + 3.5085 + ], + "hints": { + "index": 13074 + } + }, + { + "items": [ + 7068, + 3.4305 + ], + "hints": { + "index": 13075 + } + }, + { + "items": [ + 7068.5, + 3.3622 + ], + "hints": { + "index": 13076 + } + }, + { + "items": [ + 7069, + 3.41540002822876 + ], + "hints": { + "index": 13077 + } + }, + { + "items": [ + 7069.5, + 3.3302 + ], + "hints": { + "index": 13078 + } + }, + { + "items": [ + 7070, + 3.2323000431060791 + ], + "hints": { + "index": 13079 + } + }, + { + "items": [ + 7070.5, + 3.1644001007080078 + ], + "hints": { + "index": 13080 + } + }, + { + "items": [ + 7071, + 3.2658 + ], + "hints": { + "index": 13081 + } + }, + { + "items": [ + 7071.5, + 3.3103 + ], + "hints": { + "index": 13082 + } + }, + { + "items": [ + 7072, + 3.3536 + ], + "hints": { + "index": 13083 + } + }, + { + "items": [ + 7072.5, + 3.3639 + ], + "hints": { + "index": 13084 + } + }, + { + "items": [ + 7073, + 3.376 + ], + "hints": { + "index": 13085 + } + }, + { + "items": [ + 7073.5, + 3.2484 + ], + "hints": { + "index": 13086 + } + }, + { + "items": [ + 7074, + 3.1611 + ], + "hints": { + "index": 13087 + } + }, + { + "items": [ + 7074.5, + 3.1627 + ], + "hints": { + "index": 13088 + } + }, + { + "items": [ + 7075, + 3.2538 + ], + "hints": { + "index": 13089 + } + }, + { + "items": [ + 7075.5, + 3.2328 + ], + "hints": { + "index": 13090 + } + }, + { + "items": [ + 7076, + 3.1396 + ], + "hints": { + "index": 13091 + } + }, + { + "items": [ + 7076.5, + 3.1012 + ], + "hints": { + "index": 13092 + } + }, + { + "items": [ + 7077, + 3.0687 + ], + "hints": { + "index": 13093 + } + }, + { + "items": [ + 7077.5, + 3.0836 + ], + "hints": { + "index": 13094 + } + }, + { + "items": [ + 7078, + 3.0192 + ], + "hints": { + "index": 13095 + } + }, + { + "items": [ + 7078.5, + 3.1184999942779541 + ], + "hints": { + "index": 13096 + } + }, + { + "items": [ + 7079, + 3.3128 + ], + "hints": { + "index": 13097 + } + }, + { + "items": [ + 7079.5, + 3.4251 + ], + "hints": { + "index": 13098 + } + }, + { + "items": [ + 7080, + 3.3627998828887939 + ], + "hints": { + "index": 13099 + } + }, + { + "items": [ + 7080.5, + 3.1393 + ], + "hints": { + "index": 13100 + } + }, + { + "items": [ + 7081, + 3.0576000213623047 + ], + "hints": { + "index": 13101 + } + }, + { + "items": [ + 7081.5, + 2.9929 + ], + "hints": { + "index": 13102 + } + }, + { + "items": [ + 7082, + 2.9563 + ], + "hints": { + "index": 13103 + } + }, + { + "items": [ + 7082.5, + 2.9343 + ], + "hints": { + "index": 13104 + } + }, + { + "items": [ + 7083, + 3.0474 + ], + "hints": { + "index": 13105 + } + }, + { + "items": [ + 7083.5, + 3.2101 + ], + "hints": { + "index": 13106 + } + }, + { + "items": [ + 7084, + 3.2216 + ], + "hints": { + "index": 13107 + } + }, + { + "items": [ + 7084.5, + 3.1289 + ], + "hints": { + "index": 13108 + } + }, + { + "items": [ + 7085, + 3.1165 + ], + "hints": { + "index": 13109 + } + }, + { + "items": [ + 7085.5, + 3.2251 + ], + "hints": { + "index": 13110 + } + }, + { + "items": [ + 7086, + 3.3132998943328857 + ], + "hints": { + "index": 13111 + } + }, + { + "items": [ + 7086.5, + 3.3833 + ], + "hints": { + "index": 13112 + } + }, + { + "items": [ + 7087, + 3.5313 + ], + "hints": { + "index": 13113 + } + }, + { + "items": [ + 7087.5, + 3.6728 + ], + "hints": { + "index": 13114 + } + }, + { + "items": [ + 7088, + 3.7394 + ], + "hints": { + "index": 13115 + } + }, + { + "items": [ + 7088.5, + 3.4671 + ], + "hints": { + "index": 13116 + } + }, + { + "items": [ + 7089, + 3.2462 + ], + "hints": { + "index": 13117 + } + }, + { + "items": [ + 7089.5, + 3.1244 + ], + "hints": { + "index": 13118 + } + }, + { + "items": [ + 7090, + 3.122 + ], + "hints": { + "index": 13119 + } + }, + { + "items": [ + 7090.5, + 3.1767 + ], + "hints": { + "index": 13120 + } + }, + { + "items": [ + 7091, + 3.1487 + ], + "hints": { + "index": 13121 + } + }, + { + "items": [ + 7091.5, + 3.1481 + ], + "hints": { + "index": 13122 + } + }, + { + "items": [ + 7092, + 3.1494 + ], + "hints": { + "index": 13123 + } + }, + { + "items": [ + 7092.5, + 3.1662 + ], + "hints": { + "index": 13124 + } + }, + { + "items": [ + 7093, + 3.194 + ], + "hints": { + "index": 13125 + } + }, + { + "items": [ + 7093.5, + 3.1443 + ], + "hints": { + "index": 13126 + } + }, + { + "items": [ + 7094, + 2.99180006980896 + ], + "hints": { + "index": 13127 + } + }, + { + "items": [ + 7094.5, + 2.9582 + ], + "hints": { + "index": 13128 + } + }, + { + "items": [ + 7095, + 2.9786 + ], + "hints": { + "index": 13129 + } + }, + { + "items": [ + 7095.5, + 3.2729 + ], + "hints": { + "index": 13130 + } + }, + { + "items": [ + 7096, + 3.3972 + ], + "hints": { + "index": 13131 + } + }, + { + "items": [ + 7096.5, + 3.618 + ], + "hints": { + "index": 13132 + } + }, + { + "items": [ + 7097, + 3.5349 + ], + "hints": { + "index": 13133 + } + }, + { + "items": [ + 7097.5, + 3.4523 + ], + "hints": { + "index": 13134 + } + }, + { + "items": [ + 7098, + 3.2525 + ], + "hints": { + "index": 13135 + } + }, + { + "items": [ + 7098.5, + 3.2287 + ], + "hints": { + "index": 13136 + } + }, + { + "items": [ + 7099, + 3.2361 + ], + "hints": { + "index": 13137 + } + }, + { + "items": [ + 7099.5, + 3.2534 + ], + "hints": { + "index": 13138 + } + }, + { + "items": [ + 7100, + 3.20989990234375 + ], + "hints": { + "index": 13139 + } + }, + { + "items": [ + 7100.5, + 3.236 + ], + "hints": { + "index": 13140 + } + }, + { + "items": [ + 7101, + 3.1646 + ], + "hints": { + "index": 13141 + } + }, + { + "items": [ + 7101.5, + 3.1703 + ], + "hints": { + "index": 13142 + } + }, + { + "items": [ + 7102, + 3.1554000377655029 + ], + "hints": { + "index": 13143 + } + }, + { + "items": [ + 7102.5, + 3.2199 + ], + "hints": { + "index": 13144 + } + }, + { + "items": [ + 7103, + 3.2899 + ], + "hints": { + "index": 13145 + } + }, + { + "items": [ + 7103.5, + 3.2793 + ], + "hints": { + "index": 13146 + } + }, + { + "items": [ + 7104, + 3.3335 + ], + "hints": { + "index": 13147 + } + }, + { + "items": [ + 7104.5, + 3.3695 + ], + "hints": { + "index": 13148 + } + }, + { + "items": [ + 7105, + 3.325700044631958 + ], + "hints": { + "index": 13149 + } + }, + { + "items": [ + 7105.5, + 3.3111 + ], + "hints": { + "index": 13150 + } + }, + { + "items": [ + 7106, + 3.2229 + ], + "hints": { + "index": 13151 + } + }, + { + "items": [ + 7106.5, + 3.3684 + ], + "hints": { + "index": 13152 + } + }, + { + "items": [ + 7107, + 3.3189 + ], + "hints": { + "index": 13153 + } + }, + { + "items": [ + 7107.5, + 3.3325 + ], + "hints": { + "index": 13154 + } + }, + { + "items": [ + 7108, + 3.3447 + ], + "hints": { + "index": 13155 + } + }, + { + "items": [ + 7108.5, + 3.3621 + ], + "hints": { + "index": 13156 + } + }, + { + "items": [ + 7109, + 3.2769 + ], + "hints": { + "index": 13157 + } + }, + { + "items": [ + 7109.5, + 3.1539 + ], + "hints": { + "index": 13158 + } + }, + { + "items": [ + 7110, + 3.1791999340057373 + ], + "hints": { + "index": 13159 + } + }, + { + "items": [ + 7110.5, + 3.2027 + ], + "hints": { + "index": 13160 + } + }, + { + "items": [ + 7111, + 3.1425 + ], + "hints": { + "index": 13161 + } + }, + { + "items": [ + 7111.5, + 3.0584 + ], + "hints": { + "index": 13162 + } + }, + { + "items": [ + 7112, + 2.9574 + ], + "hints": { + "index": 13163 + } + }, + { + "items": [ + 7112.5, + 2.9972 + ], + "hints": { + "index": 13164 + } + }, + { + "items": [ + 7113, + 3.0472 + ], + "hints": { + "index": 13165 + } + }, + { + "items": [ + 7113.5, + 3.1544 + ], + "hints": { + "index": 13166 + } + }, + { + "items": [ + 7114, + 3.0993 + ], + "hints": { + "index": 13167 + } + }, + { + "items": [ + 7114.5, + 3.101 + ], + "hints": { + "index": 13168 + } + }, + { + "items": [ + 7115, + 3.2528 + ], + "hints": { + "index": 13169 + } + }, + { + "items": [ + 7115.5, + 3.4292 + ], + "hints": { + "index": 13170 + } + }, + { + "items": [ + 7116, + 3.4466 + ], + "hints": { + "index": 13171 + } + }, + { + "items": [ + 7116.5, + 3.3386 + ], + "hints": { + "index": 13172 + } + }, + { + "items": [ + 7117, + 3.3006 + ], + "hints": { + "index": 13173 + } + }, + { + "items": [ + 7117.5, + 3.2501 + ], + "hints": { + "index": 13174 + } + }, + { + "items": [ + 7118, + 3.2559 + ], + "hints": { + "index": 13175 + } + }, + { + "items": [ + 7118.5, + 3.1282 + ], + "hints": { + "index": 13176 + } + }, + { + "items": [ + 7119, + 3.1448 + ], + "hints": { + "index": 13177 + } + }, + { + "items": [ + 7119.5, + 3.2195 + ], + "hints": { + "index": 13178 + } + }, + { + "items": [ + 7120, + 3.3623 + ], + "hints": { + "index": 13179 + } + }, + { + "items": [ + 7120.5, + 3.4681 + ], + "hints": { + "index": 13180 + } + }, + { + "items": [ + 7121, + 3.5861 + ], + "hints": { + "index": 13181 + } + }, + { + "items": [ + 7121.5, + 3.853 + ], + "hints": { + "index": 13182 + } + }, + { + "items": [ + 7122, + 4.2378 + ], + "hints": { + "index": 13183 + } + }, + { + "items": [ + 7122.5, + 3.8665 + ], + "hints": { + "index": 13184 + } + }, + { + "items": [ + 7123, + 3.4957 + ], + "hints": { + "index": 13185 + } + }, + { + "items": [ + 7123.5, + 3.0083 + ], + "hints": { + "index": 13186 + } + }, + { + "items": [ + 7124, + 3.0901999473571777 + ], + "hints": { + "index": 13187 + } + }, + { + "items": [ + 7124.5, + 3.236 + ], + "hints": { + "index": 13188 + } + }, + { + "items": [ + 7125, + 3.4333 + ], + "hints": { + "index": 13189 + } + }, + { + "items": [ + 7125.5, + 3.4561 + ], + "hints": { + "index": 13190 + } + }, + { + "items": [ + 7126, + 3.345 + ], + "hints": { + "index": 13191 + } + }, + { + "items": [ + 7126.5, + 3.1659 + ], + "hints": { + "index": 13192 + } + }, + { + "items": [ + 7127, + 3.1789 + ], + "hints": { + "index": 13193 + } + }, + { + "items": [ + 7127.5, + 3.3554 + ], + "hints": { + "index": 13194 + } + }, + { + "items": [ + 7128, + 3.7334 + ], + "hints": { + "index": 13195 + } + }, + { + "items": [ + 7128.5, + 3.7735 + ], + "hints": { + "index": 13196 + } + }, + { + "items": [ + 7129, + 3.9576 + ], + "hints": { + "index": 13197 + } + }, + { + "items": [ + 7129.5, + 3.8096 + ], + "hints": { + "index": 13198 + } + }, + { + "items": [ + 7130, + 3.7881 + ], + "hints": { + "index": 13199 + } + }, + { + "items": [ + 7130.5, + 3.4992 + ], + "hints": { + "index": 13200 + } + }, + { + "items": [ + 7131, + 3.4603 + ], + "hints": { + "index": 13201 + } + }, + { + "items": [ + 7131.5, + 3.3696 + ], + "hints": { + "index": 13202 + } + }, + { + "items": [ + 7132, + 3.3048999309539795 + ], + "hints": { + "index": 13203 + } + }, + { + "items": [ + 7132.5, + 3.3478999137878418 + ], + "hints": { + "index": 13204 + } + }, + { + "items": [ + 7133, + 3.6384000778198242 + ], + "hints": { + "index": 13205 + } + }, + { + "items": [ + 7133.5, + 3.8204998970031734 + ], + "hints": { + "index": 13206 + } + }, + { + "items": [ + 7134, + 3.9453 + ], + "hints": { + "index": 13207 + } + }, + { + "items": [ + 7134.5, + 3.6531999111175537 + ], + "hints": { + "index": 13208 + } + }, + { + "items": [ + 7135, + 3.6257 + ], + "hints": { + "index": 13209 + } + }, + { + "items": [ + 7135.5, + 3.5799000263214111 + ], + "hints": { + "index": 13210 + } + }, + { + "items": [ + 7136, + 3.7684 + ], + "hints": { + "index": 13211 + } + }, + { + "items": [ + 7136.5, + 3.7695000171661377 + ], + "hints": { + "index": 13212 + } + }, + { + "items": [ + 7137, + 3.6555 + ], + "hints": { + "index": 13213 + } + }, + { + "items": [ + 7137.5, + 3.5046000480651855 + ], + "hints": { + "index": 13214 + } + }, + { + "items": [ + 7138, + 3.2544 + ], + "hints": { + "index": 13215 + } + }, + { + "items": [ + 7138.5, + 3.1285998821258545 + ], + "hints": { + "index": 13216 + } + }, + { + "items": [ + 7139, + 3.0581998825073242 + ], + "hints": { + "index": 13217 + } + }, + { + "items": [ + 7139.5, + 3.333899974822998 + ], + "hints": { + "index": 13218 + } + }, + { + "items": [ + 7140, + 3.3154 + ], + "hints": { + "index": 13219 + } + }, + { + "items": [ + 7140.5, + 3.2720000743865967 + ], + "hints": { + "index": 13220 + } + }, + { + "items": [ + 7141, + 3.0790998935699463 + ], + "hints": { + "index": 13221 + } + }, + { + "items": [ + 7141.5, + 3.4927000999450684 + ], + "hints": { + "index": 13222 + } + }, + { + "items": [ + 7142, + 3.9504001140594478 + ], + "hints": { + "index": 13223 + } + }, + { + "items": [ + 7142.5, + 4.626500129699707 + ], + "hints": { + "index": 13224 + } + }, + { + "items": [ + 7143, + 4.3878002166748047 + ], + "hints": { + "index": 13225 + } + }, + { + "items": [ + 7143.5, + 4.066500186920166 + ], + "hints": { + "index": 13226 + } + }, + { + "items": [ + 7144, + 3.5866999626159668 + ], + "hints": { + "index": 13227 + } + }, + { + "items": [ + 7144.5, + 3.641200065612793 + ], + "hints": { + "index": 13228 + } + }, + { + "items": [ + 7145, + 4.2718000411987305 + ], + "hints": { + "index": 13229 + } + }, + { + "items": [ + 7145.5, + 5.0451998710632324 + ], + "hints": { + "index": 13230 + } + }, + { + "items": [ + 7146, + 5.0032000541687012 + ], + "hints": { + "index": 13231 + } + }, + { + "items": [ + 7146.5, + 4.2049999237060547 + ], + "hints": { + "index": 13232 + } + }, + { + "items": [ + 7147, + 3.739300012588501 + ], + "hints": { + "index": 13233 + } + }, + { + "items": [ + 7147.5, + 3.5857000350952148 + ], + "hints": { + "index": 13234 + } + }, + { + "items": [ + 7148, + 3.604700088500977 + ], + "hints": { + "index": 13235 + } + }, + { + "items": [ + 7148.5, + 3.475600004196167 + ], + "hints": { + "index": 13236 + } + }, + { + "items": [ + 7149, + 3.372999906539917 + ], + "hints": { + "index": 13237 + } + }, + { + "items": [ + 7149.5, + 3.2170999050140381 + ], + "hints": { + "index": 13238 + } + }, + { + "items": [ + 7150, + 3.1259000301361084 + ], + "hints": { + "index": 13239 + } + }, + { + "items": [ + 7150.5, + 3.2353999614715576 + ], + "hints": { + "index": 13240 + } + }, + { + "items": [ + 7151, + 3.3831000328063965 + ], + "hints": { + "index": 13241 + } + }, + { + "items": [ + 7151.5, + 3.5060999393463135 + ], + "hints": { + "index": 13242 + } + }, + { + "items": [ + 7152, + 3.4800000190734863 + ], + "hints": { + "index": 13243 + } + }, + { + "items": [ + 7152.5, + 3.3527998924255371 + ], + "hints": { + "index": 13244 + } + }, + { + "items": [ + 7153, + 3.4979000091552734 + ], + "hints": { + "index": 13245 + } + }, + { + "items": [ + 7153.5, + 3.5511000156402588 + ], + "hints": { + "index": 13246 + } + }, + { + "items": [ + 7154, + 3.7276999950408936 + ], + "hints": { + "index": 13247 + } + }, + { + "items": [ + 7154.5, + 3.7011 + ], + "hints": { + "index": 13248 + } + }, + { + "items": [ + 7155, + 3.6001999378204346 + ], + "hints": { + "index": 13249 + } + }, + { + "items": [ + 7155.5, + 3.5085000991821289 + ], + "hints": { + "index": 13250 + } + }, + { + "items": [ + 7156, + 3.4526998996734619 + ], + "hints": { + "index": 13251 + } + }, + { + "items": [ + 7156.5, + 3.701 + ], + "hints": { + "index": 13252 + } + }, + { + "items": [ + 7157, + 3.9052000045776367 + ], + "hints": { + "index": 13253 + } + }, + { + "items": [ + 7157.5, + 3.9665999412536626 + ], + "hints": { + "index": 13254 + } + }, + { + "items": [ + 7158, + 4.0019001960754395 + ], + "hints": { + "index": 13255 + } + }, + { + "items": [ + 7158.5, + 3.952800035476685 + ], + "hints": { + "index": 13256 + } + }, + { + "items": [ + 7159, + 3.7757999897003174 + ], + "hints": { + "index": 13257 + } + }, + { + "items": [ + 7159.5, + 3.421299934387207 + ], + "hints": { + "index": 13258 + } + }, + { + "items": [ + 7160, + 3.139 + ], + "hints": { + "index": 13259 + } + }, + { + "items": [ + 7160.5, + 3.0271 + ], + "hints": { + "index": 13260 + } + }, + { + "items": [ + 7161, + 3.1710999011993408 + ], + "hints": { + "index": 13261 + } + }, + { + "items": [ + 7161.5, + 3.4746999740600586 + ], + "hints": { + "index": 13262 + } + }, + { + "items": [ + 7162, + 3.6710999011993408 + ], + "hints": { + "index": 13263 + } + }, + { + "items": [ + 7162.5, + 3.9827001094818111 + ], + "hints": { + "index": 13264 + } + }, + { + "items": [ + 7163, + 4.1613001823425293 + ], + "hints": { + "index": 13265 + } + }, + { + "items": [ + 7163.5, + 4.3277997970581055 + ], + "hints": { + "index": 13266 + } + }, + { + "items": [ + 7164, + 4.0721001625061035 + ], + "hints": { + "index": 13267 + } + }, + { + "items": [ + 7164.5, + 3.7237000465393062 + ], + "hints": { + "index": 13268 + } + }, + { + "items": [ + 7165, + 3.6796998977661137 + ], + "hints": { + "index": 13269 + } + }, + { + "items": [ + 7165.5, + 3.6054000854492192 + ], + "hints": { + "index": 13270 + } + }, + { + "items": [ + 7166, + 3.6882 + ], + "hints": { + "index": 13271 + } + }, + { + "items": [ + 7166.5, + 3.5776000022888184 + ], + "hints": { + "index": 13272 + } + }, + { + "items": [ + 7167, + 3.3635001182556152 + ], + "hints": { + "index": 13273 + } + }, + { + "items": [ + 7167.5, + 3.26990008354187 + ], + "hints": { + "index": 13274 + } + }, + { + "items": [ + 7168, + 3.2936 + ], + "hints": { + "index": 13275 + } + }, + { + "items": [ + 7168.5, + 3.377 + ], + "hints": { + "index": 13276 + } + }, + { + "items": [ + 7169, + 3.3743999004364018 + ], + "hints": { + "index": 13277 + } + }, + { + "items": [ + 7169.5, + 3.3819000720977783 + ], + "hints": { + "index": 13278 + } + }, + { + "items": [ + 7170, + 3.5229001045227051 + ], + "hints": { + "index": 13279 + } + }, + { + "items": [ + 7170.5, + 3.651000022888184 + ], + "hints": { + "index": 13280 + } + }, + { + "items": [ + 7171, + 3.6861000061035152 + ], + "hints": { + "index": 13281 + } + }, + { + "items": [ + 7171.5, + 3.6468000411987305 + ], + "hints": { + "index": 13282 + } + }, + { + "items": [ + 7172, + 3.5550000667572021 + ], + "hints": { + "index": 13283 + } + }, + { + "items": [ + 7172.5, + 3.467400074005127 + ], + "hints": { + "index": 13284 + } + }, + { + "items": [ + 7173, + 3.3824000358581543 + ], + "hints": { + "index": 13285 + } + }, + { + "items": [ + 7173.5, + 3.3559999465942383 + ], + "hints": { + "index": 13286 + } + }, + { + "items": [ + 7174, + 3.5429999828338623 + ], + "hints": { + "index": 13287 + } + }, + { + "items": [ + 7174.5, + 3.6328999996185303 + ], + "hints": { + "index": 13288 + } + }, + { + "items": [ + 7175, + 3.8591001033782959 + ], + "hints": { + "index": 13289 + } + }, + { + "items": [ + 7175.5, + 3.9112000465393062 + ], + "hints": { + "index": 13290 + } + }, + { + "items": [ + 7176, + 4.1944999694824219 + ], + "hints": { + "index": 13291 + } + }, + { + "items": [ + 7176.5, + 4.3249001502990723 + ], + "hints": { + "index": 13292 + } + }, + { + "items": [ + 7177, + 4.49970006942749 + ], + "hints": { + "index": 13293 + } + }, + { + "items": [ + 7177.5, + 4.5560002326965332 + ], + "hints": { + "index": 13294 + } + }, + { + "items": [ + 7178, + 4.9295997619628906 + ], + "hints": { + "index": 13295 + } + }, + { + "items": [ + 7178.5, + 5.5886001586914063 + ], + "hints": { + "index": 13296 + } + }, + { + "items": [ + 7179, + 6.3403000831604 + ], + "hints": { + "index": 13297 + } + }, + { + "items": [ + 7179.5, + 6.3944997787475586 + ], + "hints": { + "index": 13298 + } + }, + { + "items": [ + 7180, + 6.0005998611450195 + ], + "hints": { + "index": 13299 + } + }, + { + "items": [ + 7180.5, + 5.7186999320983887 + ], + "hints": { + "index": 13300 + } + }, + { + "items": [ + 7181, + 6.026400089263916 + ], + "hints": { + "index": 13301 + } + }, + { + "items": [ + 7181.5, + 6.8189997673034668 + ], + "hints": { + "index": 13302 + } + }, + { + "items": [ + 7182, + 6.7747998237609863 + ], + "hints": { + "index": 13303 + } + }, + { + "items": [ + 7182.5, + 6.493800163269043 + ], + "hints": { + "index": 13304 + } + }, + { + "items": [ + 7183, + 5.9691 + ], + "hints": { + "index": 13305 + } + }, + { + "items": [ + 7183.5, + 6.3134 + ], + "hints": { + "index": 13306 + } + }, + { + "items": [ + 7184, + 6.9062 + ], + "hints": { + "index": 13307 + } + }, + { + "items": [ + 7184.5, + 6.5757 + ], + "hints": { + "index": 13308 + } + }, + { + "items": [ + 7185, + 5.6542000770568848 + ], + "hints": { + "index": 13309 + } + }, + { + "items": [ + 7185.5, + 5.2915000915527344 + ], + "hints": { + "index": 13310 + } + }, + { + "items": [ + 7186, + 5.9063000679016113 + ], + "hints": { + "index": 13311 + } + }, + { + "items": [ + 7186.5, + 6.4559998512268066 + ], + "hints": { + "index": 13312 + } + }, + { + "items": [ + 7187, + 6.1932997703552246 + ], + "hints": { + "index": 13313 + } + }, + { + "items": [ + 7187.5, + 5.9951000213623047 + ], + "hints": { + "index": 13314 + } + }, + { + "items": [ + 7188, + 7.0493001937866211 + ], + "hints": { + "index": 13315 + } + }, + { + "items": [ + 7188.5, + 8.04990005493164 + ], + "hints": { + "index": 13316 + } + }, + { + "items": [ + 7189, + 7.4316000938415518 + ], + "hints": { + "index": 13317 + } + }, + { + "items": [ + 7189.5, + 7.1827998161315918 + ], + "hints": { + "index": 13318 + } + }, + { + "items": [ + 7190, + 6.68120002746582 + ], + "hints": { + "index": 13319 + } + }, + { + "items": [ + 7190.5, + 7.6487998962402335 + ], + "hints": { + "index": 13320 + } + }, + { + "items": [ + 7191, + 8.1352996826171875 + ], + "hints": { + "index": 13321 + } + }, + { + "items": [ + 7191.5, + 10.155900001525881 + ], + "hints": { + "index": 13322 + } + }, + { + "items": [ + 7192, + 10.145600318908691 + ], + "hints": { + "index": 13323 + } + }, + { + "items": [ + 7192.5, + 7.1838998794555664 + ], + "hints": { + "index": 13324 + } + }, + { + "items": [ + 7193, + 5.0886998176574707 + ], + "hints": { + "index": 13325 + } + }, + { + "items": [ + 7193.5, + 4.2266998291015625 + ], + "hints": { + "index": 13326 + } + }, + { + "items": [ + 7194, + 4.2498998641967773 + ], + "hints": { + "index": 13327 + } + }, + { + "items": [ + 7194.5, + 4.5612998008728027 + ], + "hints": { + "index": 13328 + } + }, + { + "items": [ + 7195, + 4.8358001708984375 + ], + "hints": { + "index": 13329 + } + }, + { + "items": [ + 7195.5, + 5.268700122833252 + ], + "hints": { + "index": 13330 + } + }, + { + "items": [ + 7196, + 6.2982001304626465 + ], + "hints": { + "index": 13331 + } + }, + { + "items": [ + 7196.5, + 8.41670036315918 + ], + "hints": { + "index": 13332 + } + }, + { + "items": [ + 7197, + 11.178000450134276 + ], + "hints": { + "index": 13333 + } + }, + { + "items": [ + 7197.5, + 9.2146997451782227 + ], + "hints": { + "index": 13334 + } + }, + { + "items": [ + 7198, + 6.3045997619628906 + ], + "hints": { + "index": 13335 + } + }, + { + "items": [ + 7198.5, + 5.2923998832702637 + ], + "hints": { + "index": 13336 + } + }, + { + "items": [ + 7199, + 5.5093002319335938 + ], + "hints": { + "index": 13337 + } + }, + { + "items": [ + 7199.5, + 5.2817001342773438 + ], + "hints": { + "index": 13338 + } + }, + { + "items": [ + 7200, + 4.6142997741699219 + ], + "hints": { + "index": 13339 + } + }, + { + "items": [ + 7200.5, + 4.9409999847412109 + ], + "hints": { + "index": 13340 + } + }, + { + "items": [ + 7201, + 6.0329999923706055 + ], + "hints": { + "index": 13341 + } + }, + { + "items": [ + 7201.5, + 7.1659998893737793 + ], + "hints": { + "index": 13342 + } + }, + { + "items": [ + 7202, + 6.4686999320983887 + ], + "hints": { + "index": 13343 + } + }, + { + "items": [ + 7202.5, + 6.3277997970581055 + ], + "hints": { + "index": 13344 + } + }, + { + "items": [ + 7203, + 6.4131999015808105 + ], + "hints": { + "index": 13345 + } + }, + { + "items": [ + 7203.5, + 6.2020998001098633 + ], + "hints": { + "index": 13346 + } + }, + { + "items": [ + 7204, + 5.7513 + ], + "hints": { + "index": 13347 + } + }, + { + "items": [ + 7204.5, + 5.4566998481750488 + ], + "hints": { + "index": 13348 + } + }, + { + "items": [ + 7205, + 5.583399772644043 + ], + "hints": { + "index": 13349 + } + }, + { + "items": [ + 7205.5, + 5.4246997833251953 + ], + "hints": { + "index": 13350 + } + }, + { + "items": [ + 7206, + 6.1322 + ], + "hints": { + "index": 13351 + } + }, + { + "items": [ + 7206.5, + 6.8768000602722168 + ], + "hints": { + "index": 13352 + } + }, + { + "items": [ + 7207, + 8.7520999908447266 + ], + "hints": { + "index": 13353 + } + }, + { + "items": [ + 7207.5, + 8.8608999252319336 + ], + "hints": { + "index": 13354 + } + }, + { + "items": [ + 7208, + 8.8742 + ], + "hints": { + "index": 13355 + } + }, + { + "items": [ + 7208.5, + 8.25510025024414 + ], + "hints": { + "index": 13356 + } + }, + { + "items": [ + 7209, + 8.1229000091552734 + ], + "hints": { + "index": 13357 + } + }, + { + "items": [ + 7209.5, + 7.6993999481201172 + ], + "hints": { + "index": 13358 + } + }, + { + "items": [ + 7210, + 7.0036 + ], + "hints": { + "index": 13359 + } + }, + { + "items": [ + 7210.5, + 7.4387001991271964 + ], + "hints": { + "index": 13360 + } + }, + { + "items": [ + 7211, + 7.9629998207092285 + ], + "hints": { + "index": 13361 + } + }, + { + "items": [ + 7211.5, + 9.3194999694824219 + ], + "hints": { + "index": 13362 + } + }, + { + "items": [ + 7212, + 9.0637 + ], + "hints": { + "index": 13363 + } + }, + { + "items": [ + 7212.5, + 9.0736 + ], + "hints": { + "index": 13364 + } + }, + { + "items": [ + 7213, + 8.7542 + ], + "hints": { + "index": 13365 + } + }, + { + "items": [ + 7213.5, + 8.3142 + ], + "hints": { + "index": 13366 + } + }, + { + "items": [ + 7214, + 6.8228 + ], + "hints": { + "index": 13367 + } + }, + { + "items": [ + 7214.5, + 5.9857 + ], + "hints": { + "index": 13368 + } + }, + { + "items": [ + 7215, + 5.7269 + ], + "hints": { + "index": 13369 + } + }, + { + "items": [ + 7215.5, + 6.0964 + ], + "hints": { + "index": 13370 + } + }, + { + "items": [ + 7216, + 6.1609 + ], + "hints": { + "index": 13371 + } + }, + { + "items": [ + 7216.5, + 6.6754 + ], + "hints": { + "index": 13372 + } + }, + { + "items": [ + 7217, + 7.8375000953674316 + ], + "hints": { + "index": 13373 + } + }, + { + "items": [ + 7217.5, + 9.21090030670166 + ], + "hints": { + "index": 13374 + } + }, + { + "items": [ + 7218, + 9.9429998397827148 + ], + "hints": { + "index": 13375 + } + }, + { + "items": [ + 7218.5, + 9.5869998931884766 + ], + "hints": { + "index": 13376 + } + }, + { + "items": [ + 7219, + 10.280799865722656 + ], + "hints": { + "index": 13377 + } + }, + { + "items": [ + 7219.5, + 11.512800216674805 + ], + "hints": { + "index": 13378 + } + }, + { + "items": [ + 7220, + 10.910400390625 + ], + "hints": { + "index": 13379 + } + }, + { + "items": [ + 7220.5, + 8.4205999374389648 + ], + "hints": { + "index": 13380 + } + }, + { + "items": [ + 7221, + 6.6928000450134277 + ], + "hints": { + "index": 13381 + } + }, + { + "items": [ + 7221.5, + 6.9773998260498047 + ], + "hints": { + "index": 13382 + } + }, + { + "items": [ + 7222, + 8.1842002868652344 + ], + "hints": { + "index": 13383 + } + }, + { + "items": [ + 7222.5, + 10.60990047454834 + ], + "hints": { + "index": 13384 + } + }, + { + "items": [ + 7223, + 11.3774995803833 + ], + "hints": { + "index": 13385 + } + }, + { + "items": [ + 7223.5, + 10.61400032043457 + ], + "hints": { + "index": 13386 + } + }, + { + "items": [ + 7224, + 11.31879997253418 + ], + "hints": { + "index": 13387 + } + }, + { + "items": [ + 7224.5, + 11.207099914550779 + ], + "hints": { + "index": 13388 + } + }, + { + "items": [ + 7225, + 11.401800155639648 + ], + "hints": { + "index": 13389 + } + }, + { + "items": [ + 7225.5, + 9.4153003692626953 + ], + "hints": { + "index": 13390 + } + }, + { + "items": [ + 7226, + 8.8029003143310547 + ], + "hints": { + "index": 13391 + } + }, + { + "items": [ + 7226.5, + 7.922299861907959 + ], + "hints": { + "index": 13392 + } + }, + { + "items": [ + 7227, + 8.3379001617431641 + ], + "hints": { + "index": 13393 + } + }, + { + "items": [ + 7227.5, + 9.0289001464843768 + ], + "hints": { + "index": 13394 + } + }, + { + "items": [ + 7228, + 10.348799705505373 + ], + "hints": { + "index": 13395 + } + }, + { + "items": [ + 7228.5, + 9.85420036315918 + ], + "hints": { + "index": 13396 + } + }, + { + "items": [ + 7229, + 10.543100357055664 + ], + "hints": { + "index": 13397 + } + }, + { + "items": [ + 7229.5, + 13.42710018157959 + ], + "hints": { + "index": 13398 + } + }, + { + "items": [ + 7230, + 18.171199798583984 + ], + "hints": { + "index": 13399 + } + }, + { + "items": [ + 7230.5, + 20.366600036621097 + ], + "hints": { + "index": 13400 + } + }, + { + "items": [ + 7231, + 15.642399787902832 + ], + "hints": { + "index": 13401 + } + }, + { + "items": [ + 7231.5, + 14.978300094604492 + ], + "hints": { + "index": 13402 + } + }, + { + "items": [ + 7232, + 15.253000259399414 + ], + "hints": { + "index": 13403 + } + }, + { + "items": [ + 7232.5, + 17.226600646972656 + ], + "hints": { + "index": 13404 + } + }, + { + "items": [ + 7233, + 17.305200576782227 + ], + "hints": { + "index": 13405 + } + }, + { + "items": [ + 7233.5, + 14.979399681091309 + ], + "hints": { + "index": 13406 + } + }, + { + "items": [ + 7234, + 12.5201997756958 + ], + "hints": { + "index": 13407 + } + }, + { + "items": [ + 7234.5, + 12.577500343322754 + ], + "hints": { + "index": 13408 + } + }, + { + "items": [ + 7235, + 14.082900047302246 + ], + "hints": { + "index": 13409 + } + }, + { + "items": [ + 7235.5, + 16.047800064086914 + ], + "hints": { + "index": 13410 + } + }, + { + "items": [ + 7236, + 16.199399948120117 + ], + "hints": { + "index": 13411 + } + }, + { + "items": [ + 7236.5, + 15.158599853515623 + ], + "hints": { + "index": 13412 + } + }, + { + "items": [ + 7237, + 13.559200286865234 + ], + "hints": { + "index": 13413 + } + }, + { + "items": [ + 7237.5, + 12.443400382995604 + ], + "hints": { + "index": 13414 + } + }, + { + "items": [ + 7238, + 12.993599891662598 + ], + "hints": { + "index": 13415 + } + }, + { + "items": [ + 7238.5, + 14.459799766540527 + ], + "hints": { + "index": 13416 + } + }, + { + "items": [ + 7239, + 13.910699844360352 + ], + "hints": { + "index": 13417 + } + }, + { + "items": [ + 7239.5, + 11.445400238037108 + ], + "hints": { + "index": 13418 + } + }, + { + "items": [ + 7240, + 10.2789 + ], + "hints": { + "index": 13419 + } + }, + { + "items": [ + 7240.5, + 10.902299880981444 + ], + "hints": { + "index": 13420 + } + }, + { + "items": [ + 7241, + 12.024499893188477 + ], + "hints": { + "index": 13421 + } + }, + { + "items": [ + 7241.5, + 10.544099807739258 + ], + "hints": { + "index": 13422 + } + }, + { + "items": [ + 7242, + 8.5294 + ], + "hints": { + "index": 13423 + } + }, + { + "items": [ + 7242.5, + 8.064000129699707 + ], + "hints": { + "index": 13424 + } + }, + { + "items": [ + 7243, + 8.43340015411377 + ], + "hints": { + "index": 13425 + } + }, + { + "items": [ + 7243.5, + 8.1350002288818359 + ], + "hints": { + "index": 13426 + } + }, + { + "items": [ + 7244, + 7.4401 + ], + "hints": { + "index": 13427 + } + }, + { + "items": [ + 7244.5, + 8.10420036315918 + ], + "hints": { + "index": 13428 + } + }, + { + "items": [ + 7245, + 9.1118001937866211 + ], + "hints": { + "index": 13429 + } + }, + { + "items": [ + 7245.5, + 10.41670036315918 + ], + "hints": { + "index": 13430 + } + }, + { + "items": [ + 7246, + 11.4738 + ], + "hints": { + "index": 13431 + } + }, + { + "items": [ + 7246.5, + 11.667400360107422 + ], + "hints": { + "index": 13432 + } + }, + { + "items": [ + 7247, + 11.509300231933594 + ], + "hints": { + "index": 13433 + } + }, + { + "items": [ + 7247.5, + 9.8759002685546875 + ], + "hints": { + "index": 13434 + } + }, + { + "items": [ + 7248, + 10.9542 + ], + "hints": { + "index": 13435 + } + }, + { + "items": [ + 7248.5, + 13.190699577331545 + ], + "hints": { + "index": 13436 + } + }, + { + "items": [ + 7249, + 17.070199966430664 + ], + "hints": { + "index": 13437 + } + }, + { + "items": [ + 7249.5, + 17.362800598144531 + ], + "hints": { + "index": 13438 + } + }, + { + "items": [ + 7250, + 14.5341 + ], + "hints": { + "index": 13439 + } + }, + { + "items": [ + 7250.5, + 11.296699523925779 + ], + "hints": { + "index": 13440 + } + }, + { + "items": [ + 7251, + 10.529999732971191 + ], + "hints": { + "index": 13441 + } + }, + { + "items": [ + 7251.5, + 11.042799949645996 + ], + "hints": { + "index": 13442 + } + }, + { + "items": [ + 7252, + 12.5317 + ], + "hints": { + "index": 13443 + } + }, + { + "items": [ + 7252.5, + 13.96619987487793 + ], + "hints": { + "index": 13444 + } + }, + { + "items": [ + 7253, + 16.350400924682617 + ], + "hints": { + "index": 13445 + } + }, + { + "items": [ + 7253.5, + 17.916200637817383 + ], + "hints": { + "index": 13446 + } + }, + { + "items": [ + 7254, + 17.7807 + ], + "hints": { + "index": 13447 + } + }, + { + "items": [ + 7254.5, + 16.329700469970703 + ], + "hints": { + "index": 13448 + } + }, + { + "items": [ + 7255, + 15.825699806213381 + ], + "hints": { + "index": 13449 + } + }, + { + "items": [ + 7255.5, + 16.019500732421875 + ], + "hints": { + "index": 13450 + } + }, + { + "items": [ + 7256, + 17.2129 + ], + "hints": { + "index": 13451 + } + }, + { + "items": [ + 7256.5, + 15.470999717712402 + ], + "hints": { + "index": 13452 + } + }, + { + "items": [ + 7257, + 14.618200302124023 + ], + "hints": { + "index": 13453 + } + }, + { + "items": [ + 7257.5, + 12.77970027923584 + ], + "hints": { + "index": 13454 + } + }, + { + "items": [ + 7258, + 14.0033 + ], + "hints": { + "index": 13455 + } + }, + { + "items": [ + 7258.5, + 14.12440013885498 + ], + "hints": { + "index": 13456 + } + }, + { + "items": [ + 7259, + 15.621000289916992 + ], + "hints": { + "index": 13457 + } + }, + { + "items": [ + 7259.5, + 16.210399627685547 + ], + "hints": { + "index": 13458 + } + }, + { + "items": [ + 7260, + 13.0582 + ], + "hints": { + "index": 13459 + } + }, + { + "items": [ + 7260.5, + 10.877300262451172 + ], + "hints": { + "index": 13460 + } + }, + { + "items": [ + 7261, + 10.575799942016602 + ], + "hints": { + "index": 13461 + } + }, + { + "items": [ + 7261.5, + 13.042900085449221 + ], + "hints": { + "index": 13462 + } + }, + { + "items": [ + 7262, + 15.64739990234375 + ], + "hints": { + "index": 13463 + } + }, + { + "items": [ + 7262.5, + 15.630200386047363 + ], + "hints": { + "index": 13464 + } + }, + { + "items": [ + 7263, + 13.739500045776367 + ], + "hints": { + "index": 13465 + } + }, + { + "items": [ + 7263.5, + 12.114399909973145 + ], + "hints": { + "index": 13466 + } + }, + { + "items": [ + 7264, + 13.057299613952637 + ], + "hints": { + "index": 13467 + } + }, + { + "items": [ + 7264.5, + 14.9435 + ], + "hints": { + "index": 13468 + } + }, + { + "items": [ + 7265, + 16.1874 + ], + "hints": { + "index": 13469 + } + }, + { + "items": [ + 7265.5, + 16.1246 + ], + "hints": { + "index": 13470 + } + }, + { + "items": [ + 7266, + 16.053 + ], + "hints": { + "index": 13471 + } + }, + { + "items": [ + 7266.5, + 16.8877 + ], + "hints": { + "index": 13472 + } + }, + { + "items": [ + 7267, + 15.8925 + ], + "hints": { + "index": 13473 + } + }, + { + "items": [ + 7267.5, + 13.587 + ], + "hints": { + "index": 13474 + } + }, + { + "items": [ + 7268, + 12.3285 + ], + "hints": { + "index": 13475 + } + }, + { + "items": [ + 7268.5, + 12.7133 + ], + "hints": { + "index": 13476 + } + }, + { + "items": [ + 7269, + 13.9594 + ], + "hints": { + "index": 13477 + } + }, + { + "items": [ + 7269.5, + 14.9714 + ], + "hints": { + "index": 13478 + } + }, + { + "items": [ + 7270, + 15.9682 + ], + "hints": { + "index": 13479 + } + }, + { + "items": [ + 7270.5, + 16.0571 + ], + "hints": { + "index": 13480 + } + }, + { + "items": [ + 7271, + 15.5345 + ], + "hints": { + "index": 13481 + } + }, + { + "items": [ + 7271.5, + 13.9585 + ], + "hints": { + "index": 13482 + } + }, + { + "items": [ + 7272, + 13.3069 + ], + "hints": { + "index": 13483 + } + }, + { + "items": [ + 7272.5, + 13.1112 + ], + "hints": { + "index": 13484 + } + }, + { + "items": [ + 7273, + 11.7146 + ], + "hints": { + "index": 13485 + } + }, + { + "items": [ + 7273.5, + 10.2402 + ], + "hints": { + "index": 13486 + } + }, + { + "items": [ + 7274, + 8.896 + ], + "hints": { + "index": 13487 + } + }, + { + "items": [ + 7274.5, + 9.4303 + ], + "hints": { + "index": 13488 + } + }, + { + "items": [ + 7275, + 10.5594 + ], + "hints": { + "index": 13489 + } + }, + { + "items": [ + 7275.5, + 11.5148 + ], + "hints": { + "index": 13490 + } + }, + { + "items": [ + 7276, + 11.1138 + ], + "hints": { + "index": 13491 + } + }, + { + "items": [ + 7276.5, + 10.4622 + ], + "hints": { + "index": 13492 + } + }, + { + "items": [ + 7277, + 9.4454 + ], + "hints": { + "index": 13493 + } + }, + { + "items": [ + 7277.5, + 10.0991 + ], + "hints": { + "index": 13494 + } + }, + { + "items": [ + 7278, + 11.2223 + ], + "hints": { + "index": 13495 + } + }, + { + "items": [ + 7278.5, + 12.72 + ], + "hints": { + "index": 13496 + } + }, + { + "items": [ + 7279, + 13.1344 + ], + "hints": { + "index": 13497 + } + }, + { + "items": [ + 7279.5, + 11.1209 + ], + "hints": { + "index": 13498 + } + }, + { + "items": [ + 7280, + 11.3344 + ], + "hints": { + "index": 13499 + } + }, + { + "items": [ + 7280.5, + 10.6314 + ], + "hints": { + "index": 13500 + } + }, + { + "items": [ + 7281, + 10.206899642944336 + ], + "hints": { + "index": 13501 + } + }, + { + "items": [ + 7281.5, + 9.2452001571655273 + ], + "hints": { + "index": 13502 + } + }, + { + "items": [ + 7282, + 9.0672998428344727 + ], + "hints": { + "index": 13503 + } + }, + { + "items": [ + 7282.5, + 8.80780029296875 + ], + "hints": { + "index": 13504 + } + }, + { + "items": [ + 7283, + 8.5761995315551758 + ], + "hints": { + "index": 13505 + } + }, + { + "items": [ + 7283.5, + 9.4160995483398438 + ], + "hints": { + "index": 13506 + } + }, + { + "items": [ + 7284, + 10.758700370788574 + ], + "hints": { + "index": 13507 + } + }, + { + "items": [ + 7284.5, + 12.468999862670898 + ], + "hints": { + "index": 13508 + } + }, + { + "items": [ + 7285, + 12.771699905395508 + ], + "hints": { + "index": 13509 + } + }, + { + "items": [ + 7285.5, + 14 + ], + "hints": { + "index": 13510 + } + }, + { + "items": [ + 7286, + 15.680000305175779 + ], + "hints": { + "index": 13511 + } + }, + { + "items": [ + 7286.5, + 13.911800384521484 + ], + "hints": { + "index": 13512 + } + }, + { + "items": [ + 7287, + 12.149299621582031 + ], + "hints": { + "index": 13513 + } + }, + { + "items": [ + 7287.5, + 11.715900421142578 + ], + "hints": { + "index": 13514 + } + }, + { + "items": [ + 7288, + 12.849499702453612 + ], + "hints": { + "index": 13515 + } + }, + { + "items": [ + 7288.5, + 13.877599716186523 + ], + "hints": { + "index": 13516 + } + }, + { + "items": [ + 7289, + 11.138400077819824 + ], + "hints": { + "index": 13517 + } + }, + { + "items": [ + 7289.5, + 7.335400104522706 + ], + "hints": { + "index": 13518 + } + }, + { + "items": [ + 7290, + 6.2772002220153809 + ], + "hints": { + "index": 13519 + } + }, + { + "items": [ + 7290.5, + 6.4029998779296875 + ], + "hints": { + "index": 13520 + } + }, + { + "items": [ + 7291, + 8.1983003616333 + ], + "hints": { + "index": 13521 + } + }, + { + "items": [ + 7291.5, + 7.8126997947692862 + ], + "hints": { + "index": 13522 + } + }, + { + "items": [ + 7292, + 7.4689998626708993 + ], + "hints": { + "index": 13523 + } + }, + { + "items": [ + 7292.5, + 6.9857997894287109 + ], + "hints": { + "index": 13524 + } + }, + { + "items": [ + 7293, + 9.17140007019043 + ], + "hints": { + "index": 13525 + } + }, + { + "items": [ + 7293.5, + 11.692299842834473 + ], + "hints": { + "index": 13526 + } + }, + { + "items": [ + 7294, + 17.014299392700195 + ], + "hints": { + "index": 13527 + } + }, + { + "items": [ + 7294.5, + 18.488100051879883 + ], + "hints": { + "index": 13528 + } + }, + { + "items": [ + 7295, + 15.504899978637695 + ], + "hints": { + "index": 13529 + } + }, + { + "items": [ + 7295.5, + 12.548199653625488 + ], + "hints": { + "index": 13530 + } + }, + { + "items": [ + 7296, + 11.050000190734863 + ], + "hints": { + "index": 13531 + } + }, + { + "items": [ + 7296.5, + 10.959500312805176 + ], + "hints": { + "index": 13532 + } + }, + { + "items": [ + 7297, + 11.662699699401855 + ], + "hints": { + "index": 13533 + } + }, + { + "items": [ + 7297.5, + 12.598899841308594 + ], + "hints": { + "index": 13534 + } + }, + { + "items": [ + 7298, + 13.64840030670166 + ], + "hints": { + "index": 13535 + } + }, + { + "items": [ + 7298.5, + 14.271200180053713 + ], + "hints": { + "index": 13536 + } + }, + { + "items": [ + 7299, + 13.809399604797363 + ], + "hints": { + "index": 13537 + } + }, + { + "items": [ + 7299.5, + 14.03849983215332 + ], + "hints": { + "index": 13538 + } + }, + { + "items": [ + 7300, + 12.358400344848633 + ], + "hints": { + "index": 13539 + } + }, + { + "items": [ + 7300.5, + 12.168999671936035 + ], + "hints": { + "index": 13540 + } + }, + { + "items": [ + 7301, + 11.905400276184082 + ], + "hints": { + "index": 13541 + } + }, + { + "items": [ + 7301.5, + 12.890299797058104 + ], + "hints": { + "index": 13542 + } + }, + { + "items": [ + 7302, + 13.175399780273438 + ], + "hints": { + "index": 13543 + } + }, + { + "items": [ + 7302.5, + 13.661700248718262 + ], + "hints": { + "index": 13544 + } + }, + { + "items": [ + 7303, + 13.346799850463867 + ], + "hints": { + "index": 13545 + } + }, + { + "items": [ + 7303.5, + 13.658699989318848 + ], + "hints": { + "index": 13546 + } + }, + { + "items": [ + 7304, + 13.669899940490724 + ], + "hints": { + "index": 13547 + } + }, + { + "items": [ + 7304.5, + 14.41569995880127 + ], + "hints": { + "index": 13548 + } + }, + { + "items": [ + 7305, + 14.329700469970703 + ], + "hints": { + "index": 13549 + } + }, + { + "items": [ + 7305.5, + 13.723799705505373 + ], + "hints": { + "index": 13550 + } + }, + { + "items": [ + 7306, + 13.381500244140623 + ], + "hints": { + "index": 13551 + } + }, + { + "items": [ + 7306.5, + 12.700599670410156 + ], + "hints": { + "index": 13552 + } + }, + { + "items": [ + 7307, + 12.920299530029297 + ], + "hints": { + "index": 13553 + } + }, + { + "items": [ + 7307.5, + 13.59589958190918 + ], + "hints": { + "index": 13554 + } + }, + { + "items": [ + 7308, + 13.647500038146973 + ], + "hints": { + "index": 13555 + } + }, + { + "items": [ + 7308.5, + 13.050200462341309 + ], + "hints": { + "index": 13556 + } + }, + { + "items": [ + 7309, + 14.05210018157959 + ], + "hints": { + "index": 13557 + } + }, + { + "items": [ + 7309.5, + 14.847599983215332 + ], + "hints": { + "index": 13558 + } + }, + { + "items": [ + 7310, + 15.509099960327148 + ], + "hints": { + "index": 13559 + } + }, + { + "items": [ + 7310.5, + 13.23289966583252 + ], + "hints": { + "index": 13560 + } + }, + { + "items": [ + 7311, + 12.64680004119873 + ], + "hints": { + "index": 13561 + } + }, + { + "items": [ + 7311.5, + 12.999300003051758 + ], + "hints": { + "index": 13562 + } + }, + { + "items": [ + 7312, + 13.618900299072266 + ], + "hints": { + "index": 13563 + } + }, + { + "items": [ + 7312.5, + 13.413999557495115 + ], + "hints": { + "index": 13564 + } + }, + { + "items": [ + 7313, + 12.507399559020996 + ], + "hints": { + "index": 13565 + } + }, + { + "items": [ + 7313.5, + 9.5733003616333 + ], + "hints": { + "index": 13566 + } + }, + { + "items": [ + 7314, + 8.5576000213623047 + ], + "hints": { + "index": 13567 + } + }, + { + "items": [ + 7314.5, + 8.211400032043457 + ], + "hints": { + "index": 13568 + } + }, + { + "items": [ + 7315, + 10.274900436401367 + ], + "hints": { + "index": 13569 + } + }, + { + "items": [ + 7315.5, + 11.5826997756958 + ], + "hints": { + "index": 13570 + } + }, + { + "items": [ + 7316, + 9.6906003952026367 + ], + "hints": { + "index": 13571 + } + }, + { + "items": [ + 7316.5, + 7.7569999694824228 + ], + "hints": { + "index": 13572 + } + }, + { + "items": [ + 7317, + 7.127500057220459 + ], + "hints": { + "index": 13573 + } + }, + { + "items": [ + 7317.5, + 7.8784999847412109 + ], + "hints": { + "index": 13574 + } + }, + { + "items": [ + 7318, + 9.3007001876831055 + ], + "hints": { + "index": 13575 + } + }, + { + "items": [ + 7318.5, + 10.258700370788574 + ], + "hints": { + "index": 13576 + } + }, + { + "items": [ + 7319, + 11.957500457763672 + ], + "hints": { + "index": 13577 + } + }, + { + "items": [ + 7319.5, + 11.63599967956543 + ], + "hints": { + "index": 13578 + } + }, + { + "items": [ + 7320, + 12.091500282287598 + ], + "hints": { + "index": 13579 + } + }, + { + "items": [ + 7320.5, + 11.011799812316896 + ], + "hints": { + "index": 13580 + } + }, + { + "items": [ + 7321, + 10.941200256347656 + ], + "hints": { + "index": 13581 + } + }, + { + "items": [ + 7321.5, + 11.219699859619141 + ], + "hints": { + "index": 13582 + } + }, + { + "items": [ + 7322, + 12.191800117492676 + ], + "hints": { + "index": 13583 + } + }, + { + "items": [ + 7322.5, + 12.550399780273438 + ], + "hints": { + "index": 13584 + } + }, + { + "items": [ + 7323, + 11.844099998474119 + ], + "hints": { + "index": 13585 + } + }, + { + "items": [ + 7323.5, + 10.599200248718262 + ], + "hints": { + "index": 13586 + } + }, + { + "items": [ + 7324, + 9.5812997817993164 + ], + "hints": { + "index": 13587 + } + }, + { + "items": [ + 7324.5, + 8.6426000595092773 + ], + "hints": { + "index": 13588 + } + }, + { + "items": [ + 7325, + 8.7290000915527344 + ], + "hints": { + "index": 13589 + } + }, + { + "items": [ + 7325.5, + 8.3943996429443359 + ], + "hints": { + "index": 13590 + } + }, + { + "items": [ + 7326, + 10.360400199890137 + ], + "hints": { + "index": 13591 + } + }, + { + "items": [ + 7326.5, + 12.380000114440918 + ], + "hints": { + "index": 13592 + } + }, + { + "items": [ + 7327, + 15.623900413513184 + ], + "hints": { + "index": 13593 + } + }, + { + "items": [ + 7327.5, + 15.711299896240234 + ], + "hints": { + "index": 13594 + } + }, + { + "items": [ + 7328, + 14.498499870300291 + ], + "hints": { + "index": 13595 + } + }, + { + "items": [ + 7328.5, + 12.731599807739258 + ], + "hints": { + "index": 13596 + } + }, + { + "items": [ + 7329, + 12.984999656677246 + ], + "hints": { + "index": 13597 + } + }, + { + "items": [ + 7329.5, + 11.548299789428713 + ], + "hints": { + "index": 13598 + } + }, + { + "items": [ + 7330, + 12.002799987792969 + ], + "hints": { + "index": 13599 + } + }, + { + "items": [ + 7330.5, + 10.078800201416016 + ], + "hints": { + "index": 13600 + } + }, + { + "items": [ + 7331, + 9.9933004379272461 + ], + "hints": { + "index": 13601 + } + }, + { + "items": [ + 7331.5, + 9.2594003677368164 + ], + "hints": { + "index": 13602 + } + }, + { + "items": [ + 7332, + 9.3989000320434553 + ], + "hints": { + "index": 13603 + } + }, + { + "items": [ + 7332.5, + 10.073100090026855 + ], + "hints": { + "index": 13604 + } + }, + { + "items": [ + 7333, + 11.003800392150881 + ], + "hints": { + "index": 13605 + } + }, + { + "items": [ + 7333.5, + 11.988699913024902 + ], + "hints": { + "index": 13606 + } + }, + { + "items": [ + 7334, + 10.855099678039553 + ], + "hints": { + "index": 13607 + } + }, + { + "items": [ + 7334.5, + 9.5789003372192383 + ], + "hints": { + "index": 13608 + } + }, + { + "items": [ + 7335, + 8.4423999786376953 + ], + "hints": { + "index": 13609 + } + }, + { + "items": [ + 7335.5, + 8.1512002944946289 + ], + "hints": { + "index": 13610 + } + }, + { + "items": [ + 7336, + 8.4575004577636719 + ], + "hints": { + "index": 13611 + } + }, + { + "items": [ + 7336.5, + 9.4279003143310547 + ], + "hints": { + "index": 13612 + } + }, + { + "items": [ + 7337, + 9.8152999877929688 + ], + "hints": { + "index": 13613 + } + }, + { + "items": [ + 7337.5, + 8.1049003601074219 + ], + "hints": { + "index": 13614 + } + }, + { + "items": [ + 7338, + 7.8383998870849618 + ], + "hints": { + "index": 13615 + } + }, + { + "items": [ + 7338.5, + 7.8821001052856445 + ], + "hints": { + "index": 13616 + } + }, + { + "items": [ + 7339, + 9.3815002441406232 + ], + "hints": { + "index": 13617 + } + }, + { + "items": [ + 7339.5, + 9.5138998031616211 + ], + "hints": { + "index": 13618 + } + }, + { + "items": [ + 7340, + 9.2629003524780273 + ], + "hints": { + "index": 13619 + } + }, + { + "items": [ + 7340.5, + 9.8908004760742188 + ], + "hints": { + "index": 13620 + } + }, + { + "items": [ + 7341, + 8.4539003372192383 + ], + "hints": { + "index": 13621 + } + }, + { + "items": [ + 7341.5, + 7.7111001014709473 + ], + "hints": { + "index": 13622 + } + }, + { + "items": [ + 7342, + 7.08209991455078 + ], + "hints": { + "index": 13623 + } + }, + { + "items": [ + 7342.5, + 6.8902997970581055 + ], + "hints": { + "index": 13624 + } + }, + { + "items": [ + 7343, + 6.861299991607666 + ], + "hints": { + "index": 13625 + } + }, + { + "items": [ + 7343.5, + 6.1101999282836914 + ], + "hints": { + "index": 13626 + } + }, + { + "items": [ + 7344, + 6.51200008392334 + ], + "hints": { + "index": 13627 + } + }, + { + "items": [ + 7344.5, + 7.6048998832702637 + ], + "hints": { + "index": 13628 + } + }, + { + "items": [ + 7345, + 9.5726995468139648 + ], + "hints": { + "index": 13629 + } + }, + { + "items": [ + 7345.5, + 9.6716995239257813 + ], + "hints": { + "index": 13630 + } + }, + { + "items": [ + 7346, + 7.05049991607666 + ], + "hints": { + "index": 13631 + } + }, + { + "items": [ + 7346.5, + 6.2066001892089844 + ], + "hints": { + "index": 13632 + } + }, + { + "items": [ + 7347, + 6.1199002265930176 + ], + "hints": { + "index": 13633 + } + }, + { + "items": [ + 7347.5, + 6.8138999938964844 + ], + "hints": { + "index": 13634 + } + }, + { + "items": [ + 7348, + 7.055300235748291 + ], + "hints": { + "index": 13635 + } + }, + { + "items": [ + 7348.5, + 6.7547998428344727 + ], + "hints": { + "index": 13636 + } + }, + { + "items": [ + 7349, + 6.1075000762939453 + ], + "hints": { + "index": 13637 + } + }, + { + "items": [ + 7349.5, + 5.4506998062133789 + ], + "hints": { + "index": 13638 + } + }, + { + "items": [ + 7350, + 5.722099781036377 + ], + "hints": { + "index": 13639 + } + }, + { + "items": [ + 7350.5, + 7.6276001930236816 + ], + "hints": { + "index": 13640 + } + }, + { + "items": [ + 7351, + 9.374699592590332 + ], + "hints": { + "index": 13641 + } + }, + { + "items": [ + 7351.5, + 10.945799827575684 + ], + "hints": { + "index": 13642 + } + }, + { + "items": [ + 7352, + 9.6728000640869141 + ], + "hints": { + "index": 13643 + } + }, + { + "items": [ + 7352.5, + 10.296799659729004 + ], + "hints": { + "index": 13644 + } + }, + { + "items": [ + 7353, + 10.701299667358398 + ], + "hints": { + "index": 13645 + } + }, + { + "items": [ + 7353.5, + 11.254300117492676 + ], + "hints": { + "index": 13646 + } + }, + { + "items": [ + 7354, + 9.7181 + ], + "hints": { + "index": 13647 + } + }, + { + "items": [ + 7354.5, + 7.5958 + ], + "hints": { + "index": 13648 + } + }, + { + "items": [ + 7355, + 6.8176 + ], + "hints": { + "index": 13649 + } + }, + { + "items": [ + 7355.5, + 6.1983 + ], + "hints": { + "index": 13650 + } + }, + { + "items": [ + 7356, + 6.8953 + ], + "hints": { + "index": 13651 + } + }, + { + "items": [ + 7356.5, + 7.6058 + ], + "hints": { + "index": 13652 + } + }, + { + "items": [ + 7357, + 9.8323 + ], + "hints": { + "index": 13653 + } + }, + { + "items": [ + 7357.5, + 10.4485 + ], + "hints": { + "index": 13654 + } + }, + { + "items": [ + 7358, + 10.6154 + ], + "hints": { + "index": 13655 + } + }, + { + "items": [ + 7358.5, + 9.3377 + ], + "hints": { + "index": 13656 + } + }, + { + "items": [ + 7359, + 8.7553 + ], + "hints": { + "index": 13657 + } + }, + { + "items": [ + 7359.5, + 9.0372 + ], + "hints": { + "index": 13658 + } + }, + { + "items": [ + 7360, + 9.406 + ], + "hints": { + "index": 13659 + } + }, + { + "items": [ + 7360.5, + 9.4227 + ], + "hints": { + "index": 13660 + } + }, + { + "items": [ + 7361, + 9.2511 + ], + "hints": { + "index": 13661 + } + }, + { + "items": [ + 7361.5, + 8.5755 + ], + "hints": { + "index": 13662 + } + }, + { + "items": [ + 7362, + 8.1486 + ], + "hints": { + "index": 13663 + } + }, + { + "items": [ + 7362.5, + 6.7737 + ], + "hints": { + "index": 13664 + } + }, + { + "items": [ + 7363, + 6.2238 + ], + "hints": { + "index": 13665 + } + }, + { + "items": [ + 7363.5, + 6.3228 + ], + "hints": { + "index": 13666 + } + }, + { + "items": [ + 7364, + 7.3111 + ], + "hints": { + "index": 13667 + } + }, + { + "items": [ + 7364.5, + 9.3963 + ], + "hints": { + "index": 13668 + } + }, + { + "items": [ + 7365, + 11.3159 + ], + "hints": { + "index": 13669 + } + }, + { + "items": [ + 7365.5, + 11.0487 + ], + "hints": { + "index": 13670 + } + }, + { + "items": [ + 7366, + 10.9519 + ], + "hints": { + "index": 13671 + } + }, + { + "items": [ + 7366.5, + 11.1342 + ], + "hints": { + "index": 13672 + } + }, + { + "items": [ + 7367, + 11.3477 + ], + "hints": { + "index": 13673 + } + }, + { + "items": [ + 7367.5, + 10.6261 + ], + "hints": { + "index": 13674 + } + }, + { + "items": [ + 7368, + 9.9008 + ], + "hints": { + "index": 13675 + } + }, + { + "items": [ + 7368.5, + 9.0438 + ], + "hints": { + "index": 13676 + } + }, + { + "items": [ + 7369, + 8.6554 + ], + "hints": { + "index": 13677 + } + }, + { + "items": [ + 7369.5, + 9.4476 + ], + "hints": { + "index": 13678 + } + }, + { + "items": [ + 7370, + 10.3964 + ], + "hints": { + "index": 13679 + } + }, + { + "items": [ + 7370.5, + 9.6437 + ], + "hints": { + "index": 13680 + } + }, + { + "items": [ + 7371, + 8.5841 + ], + "hints": { + "index": 13681 + } + }, + { + "items": [ + 7371.5, + 8.2091 + ], + "hints": { + "index": 13682 + } + }, + { + "items": [ + 7372, + 7.9427 + ], + "hints": { + "index": 13683 + } + }, + { + "items": [ + 7372.5, + 7.0024 + ], + "hints": { + "index": 13684 + } + }, + { + "items": [ + 7373, + 6.9088 + ], + "hints": { + "index": 13685 + } + }, + { + "items": [ + 7373.5, + 7.5774 + ], + "hints": { + "index": 13686 + } + }, + { + "items": [ + 7374, + 9.142 + ], + "hints": { + "index": 13687 + } + }, + { + "items": [ + 7374.5, + 9.4691 + ], + "hints": { + "index": 13688 + } + }, + { + "items": [ + 7375, + 10.3508 + ], + "hints": { + "index": 13689 + } + }, + { + "items": [ + 7375.5, + 10.2998 + ], + "hints": { + "index": 13690 + } + }, + { + "items": [ + 7376, + 11.6661 + ], + "hints": { + "index": 13691 + } + }, + { + "items": [ + 7376.5, + 11.7062 + ], + "hints": { + "index": 13692 + } + }, + { + "items": [ + 7377, + 11.8575 + ], + "hints": { + "index": 13693 + } + }, + { + "items": [ + 7377.5, + 11.0444 + ], + "hints": { + "index": 13694 + } + }, + { + "items": [ + 7378, + 10.7062 + ], + "hints": { + "index": 13695 + } + }, + { + "items": [ + 7378.5, + 10.9203 + ], + "hints": { + "index": 13696 + } + }, + { + "items": [ + 7379, + 10.6708 + ], + "hints": { + "index": 13697 + } + }, + { + "items": [ + 7379.5, + 11.1651 + ], + "hints": { + "index": 13698 + } + }, + { + "items": [ + 7380, + 11.5786 + ], + "hints": { + "index": 13699 + } + }, + { + "items": [ + 7380.5, + 12.0299 + ], + "hints": { + "index": 13700 + } + }, + { + "items": [ + 7381, + 12.4281 + ], + "hints": { + "index": 13701 + } + }, + { + "items": [ + 7381.5, + 12.2451 + ], + "hints": { + "index": 13702 + } + }, + { + "items": [ + 7382, + 12.373 + ], + "hints": { + "index": 13703 + } + }, + { + "items": [ + 7382.5, + 12.0445 + ], + "hints": { + "index": 13704 + } + }, + { + "items": [ + 7383, + 12.4425 + ], + "hints": { + "index": 13705 + } + }, + { + "items": [ + 7383.5, + 12.8007 + ], + "hints": { + "index": 13706 + } + }, + { + "items": [ + 7384, + 13.9487 + ], + "hints": { + "index": 13707 + } + }, + { + "items": [ + 7384.5, + 14.3559 + ], + "hints": { + "index": 13708 + } + }, + { + "items": [ + 7385, + 14.675 + ], + "hints": { + "index": 13709 + } + }, + { + "items": [ + 7385.5, + 13.3607 + ], + "hints": { + "index": 13710 + } + }, + { + "items": [ + 7386, + 13.4873 + ], + "hints": { + "index": 13711 + } + }, + { + "items": [ + 7386.5, + 15.0524 + ], + "hints": { + "index": 13712 + } + }, + { + "items": [ + 7387, + 18.9679 + ], + "hints": { + "index": 13713 + } + }, + { + "items": [ + 7387.5, + 22.092 + ], + "hints": { + "index": 13714 + } + }, + { + "items": [ + 7388, + 20.1923 + ], + "hints": { + "index": 13715 + } + }, + { + "items": [ + 7388.5, + 17.9742 + ], + "hints": { + "index": 13716 + } + }, + { + "items": [ + 7389, + 17.2237 + ], + "hints": { + "index": 13717 + } + }, + { + "items": [ + 7389.5, + 19.7325 + ], + "hints": { + "index": 13718 + } + }, + { + "items": [ + 7390, + 20.8359 + ], + "hints": { + "index": 13719 + } + }, + { + "items": [ + 7390.5, + 21.7151 + ], + "hints": { + "index": 13720 + } + }, + { + "items": [ + 7391, + 17.122 + ], + "hints": { + "index": 13721 + } + }, + { + "items": [ + 7391.5, + 13.324 + ], + "hints": { + "index": 13722 + } + }, + { + "items": [ + 7392, + 9.0503 + ], + "hints": { + "index": 13723 + } + }, + { + "items": [ + 7392.5, + 8.3018 + ], + "hints": { + "index": 13724 + } + }, + { + "items": [ + 7393, + 8.1943 + ], + "hints": { + "index": 13725 + } + }, + { + "items": [ + 7393.5, + 10.2853 + ], + "hints": { + "index": 13726 + } + }, + { + "items": [ + 7394, + 10.5126 + ], + "hints": { + "index": 13727 + } + }, + { + "items": [ + 7394.5, + 9.5142 + ], + "hints": { + "index": 13728 + } + }, + { + "items": [ + 7395, + 9.3653 + ], + "hints": { + "index": 13729 + } + }, + { + "items": [ + 7395.5, + 9.387 + ], + "hints": { + "index": 13730 + } + }, + { + "items": [ + 7396, + 10.3866 + ], + "hints": { + "index": 13731 + } + }, + { + "items": [ + 7396.5, + 10.8601 + ], + "hints": { + "index": 13732 + } + }, + { + "items": [ + 7397, + 12.5496 + ], + "hints": { + "index": 13733 + } + }, + { + "items": [ + 7397.5, + 14.7857 + ], + "hints": { + "index": 13734 + } + }, + { + "items": [ + 7398, + 15.5486 + ], + "hints": { + "index": 13735 + } + }, + { + "items": [ + 7398.5, + 16.0267 + ], + "hints": { + "index": 13736 + } + }, + { + "items": [ + 7399, + 15.4443 + ], + "hints": { + "index": 13737 + } + }, + { + "items": [ + 7399.5, + 15.761 + ], + "hints": { + "index": 13738 + } + }, + { + "items": [ + 7400, + 16.3233 + ], + "hints": { + "index": 13739 + } + }, + { + "items": [ + 7400.5, + 14.6223 + ], + "hints": { + "index": 13740 + } + }, + { + "items": [ + 7401, + 12.8327 + ], + "hints": { + "index": 13741 + } + }, + { + "items": [ + 7401.5, + 9.543 + ], + "hints": { + "index": 13742 + } + }, + { + "items": [ + 7402, + 10.309 + ], + "hints": { + "index": 13743 + } + }, + { + "items": [ + 7402.5, + 10.8908 + ], + "hints": { + "index": 13744 + } + }, + { + "items": [ + 7403, + 14.8459 + ], + "hints": { + "index": 13745 + } + }, + { + "items": [ + 7403.5, + 17.9911 + ], + "hints": { + "index": 13746 + } + }, + { + "items": [ + 7404, + 19.8975 + ], + "hints": { + "index": 13747 + } + }, + { + "items": [ + 7404.5, + 21.2559 + ], + "hints": { + "index": 13748 + } + }, + { + "items": [ + 7405, + 19.3245 + ], + "hints": { + "index": 13749 + } + }, + { + "items": [ + 7405.5, + 12.9825 + ], + "hints": { + "index": 13750 + } + }, + { + "items": [ + 7406, + 11.3864 + ], + "hints": { + "index": 13751 + } + }, + { + "items": [ + 7406.5, + 11.4127 + ], + "hints": { + "index": 13752 + } + }, + { + "items": [ + 7407, + 15.3568 + ], + "hints": { + "index": 13753 + } + }, + { + "items": [ + 7407.5, + 14.588 + ], + "hints": { + "index": 13754 + } + }, + { + "items": [ + 7408, + 10.7543 + ], + "hints": { + "index": 13755 + } + }, + { + "items": [ + 7408.5, + 8.6294 + ], + "hints": { + "index": 13756 + } + }, + { + "items": [ + 7409, + 7.4650998115539551 + ], + "hints": { + "index": 13757 + } + }, + { + "items": [ + 7409.5, + 7.8429999351501474 + ], + "hints": { + "index": 13758 + } + }, + { + "items": [ + 7410, + 7.8383998870849618 + ], + "hints": { + "index": 13759 + } + }, + { + "items": [ + 7410.5, + 8.1451997756958 + ], + "hints": { + "index": 13760 + } + }, + { + "items": [ + 7411, + 8.53279972076416 + ], + "hints": { + "index": 13761 + } + }, + { + "items": [ + 7411.5, + 8.6085996627807617 + ], + "hints": { + "index": 13762 + } + }, + { + "items": [ + 7412, + 9.3603000640869141 + ], + "hints": { + "index": 13763 + } + }, + { + "items": [ + 7412.5, + 10.461000442504885 + ], + "hints": { + "index": 13764 + } + }, + { + "items": [ + 7413, + 14.640800476074221 + ], + "hints": { + "index": 13765 + } + }, + { + "items": [ + 7413.5, + 14.154899597167969 + ], + "hints": { + "index": 13766 + } + }, + { + "items": [ + 7414, + 11.85890007019043 + ], + "hints": { + "index": 13767 + } + }, + { + "items": [ + 7414.5, + 10.580100059509276 + ], + "hints": { + "index": 13768 + } + }, + { + "items": [ + 7415, + 11.544899940490724 + ], + "hints": { + "index": 13769 + } + }, + { + "items": [ + 7415.5, + 13.75100040435791 + ], + "hints": { + "index": 13770 + } + }, + { + "items": [ + 7416, + 13.965000152587892 + ], + "hints": { + "index": 13771 + } + }, + { + "items": [ + 7416.5, + 11.756500244140623 + ], + "hints": { + "index": 13772 + } + }, + { + "items": [ + 7417, + 9.3568000793457031 + ], + "hints": { + "index": 13773 + } + }, + { + "items": [ + 7417.5, + 8.4180002212524414 + ], + "hints": { + "index": 13774 + } + }, + { + "items": [ + 7418, + 8.6979999542236328 + ], + "hints": { + "index": 13775 + } + }, + { + "items": [ + 7418.5, + 11.006699562072754 + ], + "hints": { + "index": 13776 + } + }, + { + "items": [ + 7419, + 12.428299903869627 + ], + "hints": { + "index": 13777 + } + }, + { + "items": [ + 7419.5, + 12.036100387573242 + ], + "hints": { + "index": 13778 + } + }, + { + "items": [ + 7420, + 11.147500038146973 + ], + "hints": { + "index": 13779 + } + }, + { + "items": [ + 7420.5, + 10.744000434875488 + ], + "hints": { + "index": 13780 + } + }, + { + "items": [ + 7421, + 11.769800186157228 + ], + "hints": { + "index": 13781 + } + }, + { + "items": [ + 7421.5, + 12.435799598693848 + ], + "hints": { + "index": 13782 + } + }, + { + "items": [ + 7422, + 13.258600234985352 + ], + "hints": { + "index": 13783 + } + }, + { + "items": [ + 7422.5, + 14.241900444030762 + ], + "hints": { + "index": 13784 + } + }, + { + "items": [ + 7423, + 14.589500427246094 + ], + "hints": { + "index": 13785 + } + }, + { + "items": [ + 7423.5, + 12.573599815368652 + ], + "hints": { + "index": 13786 + } + }, + { + "items": [ + 7424, + 12.267399787902832 + ], + "hints": { + "index": 13787 + } + }, + { + "items": [ + 7424.5, + 10.987199783325195 + ], + "hints": { + "index": 13788 + } + }, + { + "items": [ + 7425, + 10.34119987487793 + ], + "hints": { + "index": 13789 + } + }, + { + "items": [ + 7425.5, + 8.2168998718261719 + ], + "hints": { + "index": 13790 + } + }, + { + "items": [ + 7426, + 7.4246997833251953 + ], + "hints": { + "index": 13791 + } + }, + { + "items": [ + 7426.5, + 7.4421000480651855 + ], + "hints": { + "index": 13792 + } + }, + { + "items": [ + 7427, + 7.915299892425538 + ], + "hints": { + "index": 13793 + } + }, + { + "items": [ + 7427.5, + 8.1808004379272461 + ], + "hints": { + "index": 13794 + } + }, + { + "items": [ + 7428, + 7.779399871826171 + ], + "hints": { + "index": 13795 + } + }, + { + "items": [ + 7428.5, + 8.8523998260498047 + ], + "hints": { + "index": 13796 + } + }, + { + "items": [ + 7429, + 8.4717998504638672 + ], + "hints": { + "index": 13797 + } + }, + { + "items": [ + 7429.5, + 11.077199935913086 + ], + "hints": { + "index": 13798 + } + }, + { + "items": [ + 7430, + 12.248499870300291 + ], + "hints": { + "index": 13799 + } + }, + { + "items": [ + 7430.5, + 14.161600112915041 + ], + "hints": { + "index": 13800 + } + }, + { + "items": [ + 7431, + 11.22350025177002 + ], + "hints": { + "index": 13801 + } + }, + { + "items": [ + 7431.5, + 9.1688995361328125 + ], + "hints": { + "index": 13802 + } + }, + { + "items": [ + 7432, + 8.1527004241943359 + ], + "hints": { + "index": 13803 + } + }, + { + "items": [ + 7432.5, + 8.3856000900268555 + ], + "hints": { + "index": 13804 + } + }, + { + "items": [ + 7433, + 8.59570026397705 + ], + "hints": { + "index": 13805 + } + }, + { + "items": [ + 7433.5, + 8.7101001739501953 + ], + "hints": { + "index": 13806 + } + }, + { + "items": [ + 7434, + 8.6668996810913086 + ], + "hints": { + "index": 13807 + } + }, + { + "items": [ + 7434.5, + 8.3121004104614258 + ], + "hints": { + "index": 13808 + } + }, + { + "items": [ + 7435, + 9.4336996078491211 + ], + "hints": { + "index": 13809 + } + }, + { + "items": [ + 7435.5, + 10.304499626159668 + ], + "hints": { + "index": 13810 + } + }, + { + "items": [ + 7436, + 13.240900039672852 + ], + "hints": { + "index": 13811 + } + }, + { + "items": [ + 7436.5, + 14.701999664306641 + ], + "hints": { + "index": 13812 + } + }, + { + "items": [ + 7437, + 9.8357000350952148 + ], + "hints": { + "index": 13813 + } + }, + { + "items": [ + 7437.5, + 5.6689000129699707 + ], + "hints": { + "index": 13814 + } + }, + { + "items": [ + 7438, + 4.1669001579284668 + ], + "hints": { + "index": 13815 + } + }, + { + "items": [ + 7438.5, + 4.1444001197814941 + ], + "hints": { + "index": 13816 + } + }, + { + "items": [ + 7439, + 4.129000186920166 + ], + "hints": { + "index": 13817 + } + }, + { + "items": [ + 7439.5, + 4.1781997680664063 + ], + "hints": { + "index": 13818 + } + }, + { + "items": [ + 7440, + 4.2666001319885254 + ], + "hints": { + "index": 13819 + } + }, + { + "items": [ + 7440.5, + 4.6545000076293945 + ], + "hints": { + "index": 13820 + } + }, + { + "items": [ + 7441, + 4.2107000350952148 + ], + "hints": { + "index": 13821 + } + }, + { + "items": [ + 7441.5, + 4.2329998016357422 + ], + "hints": { + "index": 13822 + } + }, + { + "items": [ + 7442, + 4.012199878692627 + ], + "hints": { + "index": 13823 + } + }, + { + "items": [ + 7442.5, + 4.6022000312805176 + ], + "hints": { + "index": 13824 + } + }, + { + "items": [ + 7443, + 4.697199821472168 + ], + "hints": { + "index": 13825 + } + }, + { + "items": [ + 7443.5, + 5.6538000106811523 + ], + "hints": { + "index": 13826 + } + }, + { + "items": [ + 7444, + 7.2786002159118652 + ], + "hints": { + "index": 13827 + } + }, + { + "items": [ + 7444.5, + 10.237500190734863 + ], + "hints": { + "index": 13828 + } + }, + { + "items": [ + 7445, + 13.785799980163574 + ], + "hints": { + "index": 13829 + } + }, + { + "items": [ + 7445.5, + 15.574700355529783 + ], + "hints": { + "index": 13830 + } + }, + { + "items": [ + 7446, + 16.995199203491211 + ], + "hints": { + "index": 13831 + } + }, + { + "items": [ + 7446.5, + 17.170900344848633 + ], + "hints": { + "index": 13832 + } + }, + { + "items": [ + 7447, + 15.36299991607666 + ], + "hints": { + "index": 13833 + } + }, + { + "items": [ + 7447.5, + 14.240400314331056 + ], + "hints": { + "index": 13834 + } + }, + { + "items": [ + 7448, + 12.264599800109863 + ], + "hints": { + "index": 13835 + } + }, + { + "items": [ + 7448.5, + 9.67300033569336 + ], + "hints": { + "index": 13836 + } + }, + { + "items": [ + 7449, + 8.8424997329711914 + ], + "hints": { + "index": 13837 + } + }, + { + "items": [ + 7449.5, + 9.3297004699707031 + ], + "hints": { + "index": 13838 + } + }, + { + "items": [ + 7450, + 13.20989990234375 + ], + "hints": { + "index": 13839 + } + }, + { + "items": [ + 7450.5, + 17.379199981689453 + ], + "hints": { + "index": 13840 + } + }, + { + "items": [ + 7451, + 19.331699371337891 + ], + "hints": { + "index": 13841 + } + }, + { + "items": [ + 7451.5, + 15.502400398254396 + ], + "hints": { + "index": 13842 + } + }, + { + "items": [ + 7452, + 15.119799613952637 + ], + "hints": { + "index": 13843 + } + }, + { + "items": [ + 7452.5, + 15.520000457763672 + ], + "hints": { + "index": 13844 + } + }, + { + "items": [ + 7453, + 19.757900238037109 + ], + "hints": { + "index": 13845 + } + }, + { + "items": [ + 7453.5, + 17.030599594116211 + ], + "hints": { + "index": 13846 + } + }, + { + "items": [ + 7454, + 12.481300354003906 + ], + "hints": { + "index": 13847 + } + }, + { + "items": [ + 7454.5, + 9.3336000442504883 + ], + "hints": { + "index": 13848 + } + }, + { + "items": [ + 7455, + 8.3654003143310547 + ], + "hints": { + "index": 13849 + } + }, + { + "items": [ + 7455.5, + 8.9105997085571289 + ], + "hints": { + "index": 13850 + } + }, + { + "items": [ + 7456, + 9.3350000381469727 + ], + "hints": { + "index": 13851 + } + }, + { + "items": [ + 7456.5, + 9.3759002685546875 + ], + "hints": { + "index": 13852 + } + }, + { + "items": [ + 7457, + 10.018500328063965 + ], + "hints": { + "index": 13853 + } + }, + { + "items": [ + 7457.5, + 11.815600395202637 + ], + "hints": { + "index": 13854 + } + }, + { + "items": [ + 7458, + 13.465800285339355 + ], + "hints": { + "index": 13855 + } + }, + { + "items": [ + 7458.5, + 14.771599769592283 + ], + "hints": { + "index": 13856 + } + }, + { + "items": [ + 7459, + 15.244799613952637 + ], + "hints": { + "index": 13857 + } + }, + { + "items": [ + 7459.5, + 14.30679988861084 + ], + "hints": { + "index": 13858 + } + }, + { + "items": [ + 7460, + 13.953499794006348 + ], + "hints": { + "index": 13859 + } + }, + { + "items": [ + 7460.5, + 11.579299926757813 + ], + "hints": { + "index": 13860 + } + }, + { + "items": [ + 7461, + 11.003199577331545 + ], + "hints": { + "index": 13861 + } + }, + { + "items": [ + 7461.5, + 10.409199714660645 + ], + "hints": { + "index": 13862 + } + }, + { + "items": [ + 7462, + 9.6829004287719727 + ], + "hints": { + "index": 13863 + } + }, + { + "items": [ + 7462.5, + 8.6902999877929688 + ], + "hints": { + "index": 13864 + } + }, + { + "items": [ + 7463, + 6.7006001472473145 + ], + "hints": { + "index": 13865 + } + }, + { + "items": [ + 7463.5, + 6.1956000328063965 + ], + "hints": { + "index": 13866 + } + }, + { + "items": [ + 7464, + 6.8270998001098633 + ], + "hints": { + "index": 13867 + } + }, + { + "items": [ + 7464.5, + 7.7743000984191886 + ], + "hints": { + "index": 13868 + } + }, + { + "items": [ + 7465, + 7.902900218963623 + ], + "hints": { + "index": 13869 + } + }, + { + "items": [ + 7465.5, + 7.6936001777648926 + ], + "hints": { + "index": 13870 + } + }, + { + "items": [ + 7466, + 7.65310001373291 + ], + "hints": { + "index": 13871 + } + }, + { + "items": [ + 7466.5, + 9.2362003326416016 + ], + "hints": { + "index": 13872 + } + }, + { + "items": [ + 7467, + 10.014900207519531 + ], + "hints": { + "index": 13873 + } + }, + { + "items": [ + 7467.5, + 9.4886999130249023 + ], + "hints": { + "index": 13874 + } + }, + { + "items": [ + 7468, + 8.3320999145507813 + ], + "hints": { + "index": 13875 + } + }, + { + "items": [ + 7468.5, + 8.6459999084472656 + ], + "hints": { + "index": 13876 + } + }, + { + "items": [ + 7469, + 8.809300422668457 + ], + "hints": { + "index": 13877 + } + }, + { + "items": [ + 7469.5, + 7.8643999099731436 + ], + "hints": { + "index": 13878 + } + }, + { + "items": [ + 7470, + 6.648900032043457 + ], + "hints": { + "index": 13879 + } + }, + { + "items": [ + 7470.5, + 7.1251997947692871 + ], + "hints": { + "index": 13880 + } + }, + { + "items": [ + 7471, + 7.92899990081787 + ], + "hints": { + "index": 13881 + } + }, + { + "items": [ + 7471.5, + 8.4405002593994141 + ], + "hints": { + "index": 13882 + } + }, + { + "items": [ + 7472, + 9.1885995864868164 + ], + "hints": { + "index": 13883 + } + }, + { + "items": [ + 7472.5, + 9.9048004150390625 + ], + "hints": { + "index": 13884 + } + }, + { + "items": [ + 7473, + 11.558600425720217 + ], + "hints": { + "index": 13885 + } + }, + { + "items": [ + 7473.5, + 10.046199798583984 + ], + "hints": { + "index": 13886 + } + }, + { + "items": [ + 7474, + 7.6526999473571777 + ], + "hints": { + "index": 13887 + } + }, + { + "items": [ + 7474.5, + 5.8197999000549316 + ], + "hints": { + "index": 13888 + } + }, + { + "items": [ + 7475, + 5.3710999488830566 + ], + "hints": { + "index": 13889 + } + }, + { + "items": [ + 7475.5, + 6.5164999961853027 + ], + "hints": { + "index": 13890 + } + }, + { + "items": [ + 7476, + 8.1789999008178711 + ], + "hints": { + "index": 13891 + } + }, + { + "items": [ + 7476.5, + 9.1780004501342773 + ], + "hints": { + "index": 13892 + } + }, + { + "items": [ + 7477, + 9.5468997955322266 + ], + "hints": { + "index": 13893 + } + }, + { + "items": [ + 7477.5, + 10.87660026550293 + ], + "hints": { + "index": 13894 + } + }, + { + "items": [ + 7478, + 10.381799697875977 + ], + "hints": { + "index": 13895 + } + }, + { + "items": [ + 7478.5, + 9.6040000915527344 + ], + "hints": { + "index": 13896 + } + }, + { + "items": [ + 7479, + 7.91629981994629 + ], + "hints": { + "index": 13897 + } + }, + { + "items": [ + 7479.5, + 8.1999998092651367 + ], + "hints": { + "index": 13898 + } + }, + { + "items": [ + 7480, + 9.3713998794555664 + ], + "hints": { + "index": 13899 + } + }, + { + "items": [ + 7480.5, + 10.742300033569336 + ], + "hints": { + "index": 13900 + } + }, + { + "items": [ + 7481, + 11.331500053405762 + ], + "hints": { + "index": 13901 + } + }, + { + "items": [ + 7481.5, + 7.577700138092041 + ], + "hints": { + "index": 13902 + } + }, + { + "items": [ + 7482, + 5.1736998558044434 + ], + "hints": { + "index": 13903 + } + }, + { + "items": [ + 7482.5, + 4.7026000022888184 + ], + "hints": { + "index": 13904 + } + }, + { + "items": [ + 7483, + 5.1968002319335938 + ], + "hints": { + "index": 13905 + } + }, + { + "items": [ + 7483.5, + 5.67110013961792 + ], + "hints": { + "index": 13906 + } + }, + { + "items": [ + 7484, + 6.006199836730957 + ], + "hints": { + "index": 13907 + } + }, + { + "items": [ + 7484.5, + 5.7267999649047852 + ], + "hints": { + "index": 13908 + } + }, + { + "items": [ + 7485, + 5.534599781036377 + ], + "hints": { + "index": 13909 + } + }, + { + "items": [ + 7485.5, + 5.1251997947692871 + ], + "hints": { + "index": 13910 + } + }, + { + "items": [ + 7486, + 5.3822999000549316 + ], + "hints": { + "index": 13911 + } + }, + { + "items": [ + 7486.5, + 5.0657000541687012 + ], + "hints": { + "index": 13912 + } + }, + { + "items": [ + 7487, + 4.6936001777648926 + ], + "hints": { + "index": 13913 + } + }, + { + "items": [ + 7487.5, + 4.2453 + ], + "hints": { + "index": 13914 + } + }, + { + "items": [ + 7488, + 4.2685 + ], + "hints": { + "index": 13915 + } + }, + { + "items": [ + 7488.5, + 4.2805 + ], + "hints": { + "index": 13916 + } + }, + { + "items": [ + 7489, + 4.1809 + ], + "hints": { + "index": 13917 + } + }, + { + "items": [ + 7489.5, + 3.9881 + ], + "hints": { + "index": 13918 + } + }, + { + "items": [ + 7490, + 3.8801 + ], + "hints": { + "index": 13919 + } + }, + { + "items": [ + 7490.5, + 3.7472 + ], + "hints": { + "index": 13920 + } + }, + { + "items": [ + 7491, + 3.7201 + ], + "hints": { + "index": 13921 + } + }, + { + "items": [ + 7491.5, + 3.7452 + ], + "hints": { + "index": 13922 + } + }, + { + "items": [ + 7492, + 3.7519 + ], + "hints": { + "index": 13923 + } + }, + { + "items": [ + 7492.5, + 3.6759 + ], + "hints": { + "index": 13924 + } + }, + { + "items": [ + 7493, + 3.6549 + ], + "hints": { + "index": 13925 + } + }, + { + "items": [ + 7493.5, + 3.6388 + ], + "hints": { + "index": 13926 + } + }, + { + "items": [ + 7494, + 3.7791 + ], + "hints": { + "index": 13927 + } + }, + { + "items": [ + 7494.5, + 3.8678 + ], + "hints": { + "index": 13928 + } + }, + { + "items": [ + 7495, + 3.8211 + ], + "hints": { + "index": 13929 + } + }, + { + "items": [ + 7495.5, + 3.6007 + ], + "hints": { + "index": 13930 + } + }, + { + "items": [ + 7496, + 3.3194 + ], + "hints": { + "index": 13931 + } + }, + { + "items": [ + 7496.5, + 3.2995 + ], + "hints": { + "index": 13932 + } + }, + { + "items": [ + 7497, + 3.3621 + ], + "hints": { + "index": 13933 + } + }, + { + "items": [ + 7497.5, + 3.4077 + ], + "hints": { + "index": 13934 + } + }, + { + "items": [ + 7498, + 3.3825 + ], + "hints": { + "index": 13935 + } + }, + { + "items": [ + 7498.5, + 3.4573 + ], + "hints": { + "index": 13936 + } + }, + { + "items": [ + 7499, + 3.5438 + ], + "hints": { + "index": 13937 + } + }, + { + "items": [ + 7499.5, + 3.5619 + ], + "hints": { + "index": 13938 + } + }, + { + "items": [ + 7500, + 3.3465 + ], + "hints": { + "index": 13939 + } + }, + { + "items": [ + 7500.5, + 3.2379 + ], + "hints": { + "index": 13940 + } + }, + { + "items": [ + 7501, + 3.3586 + ], + "hints": { + "index": 13941 + } + }, + { + "items": [ + 7501.5, + 3.4395 + ], + "hints": { + "index": 13942 + } + }, + { + "items": [ + 7502, + 3.3362 + ], + "hints": { + "index": 13943 + } + }, + { + "items": [ + 7502.5, + 3.1163 + ], + "hints": { + "index": 13944 + } + }, + { + "items": [ + 7503, + 3.0407 + ], + "hints": { + "index": 13945 + } + }, + { + "items": [ + 7503.5, + 2.9954 + ], + "hints": { + "index": 13946 + } + }, + { + "items": [ + 7504, + 2.9554 + ], + "hints": { + "index": 13947 + } + }, + { + "items": [ + 7504.5, + 2.9655 + ], + "hints": { + "index": 13948 + } + }, + { + "items": [ + 7505, + 3.0662 + ], + "hints": { + "index": 13949 + } + }, + { + "items": [ + 7505.5, + 3.0835 + ], + "hints": { + "index": 13950 + } + }, + { + "items": [ + 7506, + 3.1531 + ], + "hints": { + "index": 13951 + } + }, + { + "items": [ + 7506.5, + 3.1122 + ], + "hints": { + "index": 13952 + } + }, + { + "items": [ + 7507, + 3.0775 + ], + "hints": { + "index": 13953 + } + }, + { + "items": [ + 7507.5, + 2.9434 + ], + "hints": { + "index": 13954 + } + }, + { + "items": [ + 7508, + 3.0177 + ], + "hints": { + "index": 13955 + } + }, + { + "items": [ + 7508.5, + 3.0802 + ], + "hints": { + "index": 13956 + } + }, + { + "items": [ + 7509, + 3.002 + ], + "hints": { + "index": 13957 + } + }, + { + "items": [ + 7509.5, + 2.9093 + ], + "hints": { + "index": 13958 + } + }, + { + "items": [ + 7510, + 2.94 + ], + "hints": { + "index": 13959 + } + }, + { + "items": [ + 7510.5, + 3.2021 + ], + "hints": { + "index": 13960 + } + }, + { + "items": [ + 7511, + 3.2604 + ], + "hints": { + "index": 13961 + } + }, + { + "items": [ + 7511.5, + 3.232 + ], + "hints": { + "index": 13962 + } + }, + { + "items": [ + 7512, + 3.1381 + ], + "hints": { + "index": 13963 + } + }, + { + "items": [ + 7512.5, + 3.0441 + ], + "hints": { + "index": 13964 + } + }, + { + "items": [ + 7513, + 3.104 + ], + "hints": { + "index": 13965 + } + }, + { + "items": [ + 7513.5, + 3.6954998970031734 + ], + "hints": { + "index": 13966 + } + }, + { + "items": [ + 7514, + 4.0921998023986816 + ], + "hints": { + "index": 13967 + } + }, + { + "items": [ + 7514.5, + 4.0229001045227051 + ], + "hints": { + "index": 13968 + } + }, + { + "items": [ + 7515, + 3.4038000106811523 + ], + "hints": { + "index": 13969 + } + }, + { + "items": [ + 7515.5, + 3.213900089263916 + ], + "hints": { + "index": 13970 + } + }, + { + "items": [ + 7516, + 3.1802 + ], + "hints": { + "index": 13971 + } + }, + { + "items": [ + 7516.5, + 3.1570000648498535 + ], + "hints": { + "index": 13972 + } + }, + { + "items": [ + 7517, + 3.0476999282836914 + ], + "hints": { + "index": 13973 + } + }, + { + "items": [ + 7517.5, + 2.9460999965667725 + ], + "hints": { + "index": 13974 + } + }, + { + "items": [ + 7518, + 2.8169 + ], + "hints": { + "index": 13975 + } + }, + { + "items": [ + 7518.5, + 2.8410000801086426 + ], + "hints": { + "index": 13976 + } + }, + { + "items": [ + 7519, + 2.9253 + ], + "hints": { + "index": 13977 + } + }, + { + "items": [ + 7519.5, + 2.9242 + ], + "hints": { + "index": 13978 + } + }, + { + "items": [ + 7520, + 2.861299991607666 + ], + "hints": { + "index": 13979 + } + }, + { + "items": [ + 7520.5, + 2.8438 + ], + "hints": { + "index": 13980 + } + }, + { + "items": [ + 7521, + 2.8631 + ], + "hints": { + "index": 13981 + } + }, + { + "items": [ + 7521.5, + 2.823199987411499 + ], + "hints": { + "index": 13982 + } + }, + { + "items": [ + 7522, + 2.7662999629974365 + ], + "hints": { + "index": 13983 + } + }, + { + "items": [ + 7522.5, + 2.7089 + ], + "hints": { + "index": 13984 + } + }, + { + "items": [ + 7523, + 2.7571001052856445 + ], + "hints": { + "index": 13985 + } + }, + { + "items": [ + 7523.5, + 2.7088 + ], + "hints": { + "index": 13986 + } + }, + { + "items": [ + 7524, + 2.7967 + ], + "hints": { + "index": 13987 + } + }, + { + "items": [ + 7524.5, + 2.8097 + ], + "hints": { + "index": 13988 + } + }, + { + "items": [ + 7525, + 2.8914000988006592 + ], + "hints": { + "index": 13989 + } + }, + { + "items": [ + 7525.5, + 2.8632 + ], + "hints": { + "index": 13990 + } + }, + { + "items": [ + 7526, + 2.8185999393463135 + ], + "hints": { + "index": 13991 + } + }, + { + "items": [ + 7526.5, + 2.8173 + ], + "hints": { + "index": 13992 + } + }, + { + "items": [ + 7527, + 2.9460999965667725 + ], + "hints": { + "index": 13993 + } + }, + { + "items": [ + 7527.5, + 3.075 + ], + "hints": { + "index": 13994 + } + }, + { + "items": [ + 7528, + 3.1384 + ], + "hints": { + "index": 13995 + } + }, + { + "items": [ + 7528.5, + 3.0467 + ], + "hints": { + "index": 13996 + } + }, + { + "items": [ + 7529, + 2.9777998924255371 + ], + "hints": { + "index": 13997 + } + }, + { + "items": [ + 7529.5, + 2.9104 + ], + "hints": { + "index": 13998 + } + }, + { + "items": [ + 7530, + 2.9703 + ], + "hints": { + "index": 13999 + } + }, + { + "items": [ + 7530.5, + 2.9635999202728271 + ], + "hints": { + "index": 14000 + } + }, + { + "items": [ + 7531, + 3.0097000598907471 + ], + "hints": { + "index": 14001 + } + }, + { + "items": [ + 7531.5, + 2.9987 + ], + "hints": { + "index": 14002 + } + }, + { + "items": [ + 7532, + 3.0798 + ], + "hints": { + "index": 14003 + } + }, + { + "items": [ + 7532.5, + 3.084 + ], + "hints": { + "index": 14004 + } + }, + { + "items": [ + 7533, + 3.0186 + ], + "hints": { + "index": 14005 + } + }, + { + "items": [ + 7533.5, + 2.9099 + ], + "hints": { + "index": 14006 + } + }, + { + "items": [ + 7534, + 2.8677999973297119 + ], + "hints": { + "index": 14007 + } + }, + { + "items": [ + 7534.5, + 2.9773 + ], + "hints": { + "index": 14008 + } + }, + { + "items": [ + 7535, + 3.0773000717163086 + ], + "hints": { + "index": 14009 + } + }, + { + "items": [ + 7535.5, + 3.1721 + ], + "hints": { + "index": 14010 + } + }, + { + "items": [ + 7536, + 3.1779000759124756 + ], + "hints": { + "index": 14011 + } + }, + { + "items": [ + 7536.5, + 3.249500036239624 + ], + "hints": { + "index": 14012 + } + }, + { + "items": [ + 7537, + 3.1902000904083252 + ], + "hints": { + "index": 14013 + } + }, + { + "items": [ + 7537.5, + 3.1053 + ], + "hints": { + "index": 14014 + } + }, + { + "items": [ + 7538, + 3.1145000457763672 + ], + "hints": { + "index": 14015 + } + }, + { + "items": [ + 7538.5, + 3.2897999286651611 + ], + "hints": { + "index": 14016 + } + }, + { + "items": [ + 7539, + 3.4626998901367188 + ], + "hints": { + "index": 14017 + } + }, + { + "items": [ + 7539.5, + 3.3824 + ], + "hints": { + "index": 14018 + } + }, + { + "items": [ + 7540, + 3.3275001049041748 + ], + "hints": { + "index": 14019 + } + }, + { + "items": [ + 7540.5, + 3.2064 + ], + "hints": { + "index": 14020 + } + }, + { + "items": [ + 7541, + 3.3087999820709229 + ], + "hints": { + "index": 14021 + } + }, + { + "items": [ + 7541.5, + 3.3537 + ], + "hints": { + "index": 14022 + } + }, + { + "items": [ + 7542, + 3.6040999889373775 + ], + "hints": { + "index": 14023 + } + }, + { + "items": [ + 7542.5, + 3.8756000995635982 + ], + "hints": { + "index": 14024 + } + }, + { + "items": [ + 7543, + 4.1256999969482422 + ], + "hints": { + "index": 14025 + } + }, + { + "items": [ + 7543.5, + 4.2648000717163086 + ], + "hints": { + "index": 14026 + } + }, + { + "items": [ + 7544, + 4.2834000587463379 + ], + "hints": { + "index": 14027 + } + }, + { + "items": [ + 7544.5, + 4.2042999267578125 + ], + "hints": { + "index": 14028 + } + }, + { + "items": [ + 7545, + 3.6428999900817871 + ], + "hints": { + "index": 14029 + } + }, + { + "items": [ + 7545.5, + 3.2960000038146973 + ], + "hints": { + "index": 14030 + } + }, + { + "items": [ + 7546, + 2.9855000972747803 + ], + "hints": { + "index": 14031 + } + }, + { + "items": [ + 7546.5, + 2.9681 + ], + "hints": { + "index": 14032 + } + }, + { + "items": [ + 7547, + 2.8598 + ], + "hints": { + "index": 14033 + } + }, + { + "items": [ + 7547.5, + 2.9132 + ], + "hints": { + "index": 14034 + } + }, + { + "items": [ + 7548, + 2.9251999855041504 + ], + "hints": { + "index": 14035 + } + }, + { + "items": [ + 7548.5, + 2.8888 + ], + "hints": { + "index": 14036 + } + }, + { + "items": [ + 7549, + 2.8705999851226807 + ], + "hints": { + "index": 14037 + } + }, + { + "items": [ + 7549.5, + 2.8363 + ], + "hints": { + "index": 14038 + } + }, + { + "items": [ + 7550, + 2.8309 + ], + "hints": { + "index": 14039 + } + }, + { + "items": [ + 7550.5, + 2.8044 + ], + "hints": { + "index": 14040 + } + }, + { + "items": [ + 7551, + 2.8733 + ], + "hints": { + "index": 14041 + } + }, + { + "items": [ + 7551.5, + 2.8105 + ], + "hints": { + "index": 14042 + } + }, + { + "items": [ + 7552, + 2.8062999248504639 + ], + "hints": { + "index": 14043 + } + }, + { + "items": [ + 7552.5, + 2.7332999706268311 + ], + "hints": { + "index": 14044 + } + }, + { + "items": [ + 7553, + 2.8269999027252197 + ], + "hints": { + "index": 14045 + } + }, + { + "items": [ + 7553.5, + 2.7363 + ], + "hints": { + "index": 14046 + } + }, + { + "items": [ + 7554, + 2.7156999111175537 + ], + "hints": { + "index": 14047 + } + }, + { + "items": [ + 7554.5, + 2.7548000812530522 + ], + "hints": { + "index": 14048 + } + }, + { + "items": [ + 7555, + 2.761199951171875 + ], + "hints": { + "index": 14049 + } + }, + { + "items": [ + 7555.5, + 2.9198999404907227 + ], + "hints": { + "index": 14050 + } + }, + { + "items": [ + 7556, + 2.7908999919891357 + ], + "hints": { + "index": 14051 + } + }, + { + "items": [ + 7556.5, + 2.8331000804901123 + ], + "hints": { + "index": 14052 + } + }, + { + "items": [ + 7557, + 2.7156999111175537 + ], + "hints": { + "index": 14053 + } + }, + { + "items": [ + 7557.5, + 2.7377 + ], + "hints": { + "index": 14054 + } + }, + { + "items": [ + 7558, + 2.7149999141693115 + ], + "hints": { + "index": 14055 + } + }, + { + "items": [ + 7558.5, + 2.703200101852417 + ], + "hints": { + "index": 14056 + } + }, + { + "items": [ + 7559, + 2.8584001064300537 + ], + "hints": { + "index": 14057 + } + }, + { + "items": [ + 7559.5, + 2.8639 + ], + "hints": { + "index": 14058 + } + }, + { + "items": [ + 7560, + 2.8770999908447266 + ], + "hints": { + "index": 14059 + } + }, + { + "items": [ + 7560.5, + 2.7295999526977539 + ], + "hints": { + "index": 14060 + } + }, + { + "items": [ + 7561, + 2.7383999824523926 + ], + "hints": { + "index": 14061 + } + }, + { + "items": [ + 7561.5, + 2.7222 + ], + "hints": { + "index": 14062 + } + }, + { + "items": [ + 7562, + 2.737299919128418 + ], + "hints": { + "index": 14063 + } + }, + { + "items": [ + 7562.5, + 2.6352999210357666 + ], + "hints": { + "index": 14064 + } + }, + { + "items": [ + 7563, + 2.6545999050140381 + ], + "hints": { + "index": 14065 + } + }, + { + "items": [ + 7563.5, + 2.6691999435424805 + ], + "hints": { + "index": 14066 + } + }, + { + "items": [ + 7564, + 2.7785999774932861 + ], + "hints": { + "index": 14067 + } + }, + { + "items": [ + 7564.5, + 2.738300085067749 + ], + "hints": { + "index": 14068 + } + }, + { + "items": [ + 7565, + 2.809499979019165 + ], + "hints": { + "index": 14069 + } + }, + { + "items": [ + 7565.5, + 2.9205 + ], + "hints": { + "index": 14070 + } + }, + { + "items": [ + 7566, + 3.0926001071929932 + ], + "hints": { + "index": 14071 + } + }, + { + "items": [ + 7566.5, + 2.9872000217437744 + ], + "hints": { + "index": 14072 + } + }, + { + "items": [ + 7567, + 2.85509991645813 + ], + "hints": { + "index": 14073 + } + }, + { + "items": [ + 7567.5, + 2.739 + ], + "hints": { + "index": 14074 + } + }, + { + "items": [ + 7568, + 2.7760999202728271 + ], + "hints": { + "index": 14075 + } + }, + { + "items": [ + 7568.5, + 2.7363998889923096 + ], + "hints": { + "index": 14076 + } + }, + { + "items": [ + 7569, + 2.7272000312805176 + ], + "hints": { + "index": 14077 + } + }, + { + "items": [ + 7569.5, + 2.6852 + ], + "hints": { + "index": 14078 + } + }, + { + "items": [ + 7570, + 2.7026000022888184 + ], + "hints": { + "index": 14079 + } + }, + { + "items": [ + 7570.5, + 2.7685000896453857 + ], + "hints": { + "index": 14080 + } + }, + { + "items": [ + 7571, + 2.7987000942230225 + ], + "hints": { + "index": 14081 + } + }, + { + "items": [ + 7571.5, + 2.8252999782562256 + ], + "hints": { + "index": 14082 + } + }, + { + "items": [ + 7572, + 2.7513000965118408 + ], + "hints": { + "index": 14083 + } + }, + { + "items": [ + 7572.5, + 2.729700088500977 + ], + "hints": { + "index": 14084 + } + }, + { + "items": [ + 7573, + 2.6552999019622803 + ], + "hints": { + "index": 14085 + } + }, + { + "items": [ + 7573.5, + 2.698 + ], + "hints": { + "index": 14086 + } + }, + { + "items": [ + 7574, + 2.6958 + ], + "hints": { + "index": 14087 + } + }, + { + "items": [ + 7574.5, + 2.8476 + ], + "hints": { + "index": 14088 + } + }, + { + "items": [ + 7575, + 3.0277 + ], + "hints": { + "index": 14089 + } + }, + { + "items": [ + 7575.5, + 3.3083 + ], + "hints": { + "index": 14090 + } + }, + { + "items": [ + 7576, + 3.3065 + ], + "hints": { + "index": 14091 + } + }, + { + "items": [ + 7576.5, + 3.1926999092102051 + ], + "hints": { + "index": 14092 + } + }, + { + "items": [ + 7577, + 3.0408999919891357 + ], + "hints": { + "index": 14093 + } + }, + { + "items": [ + 7577.5, + 3.2023999691009521 + ], + "hints": { + "index": 14094 + } + }, + { + "items": [ + 7578, + 3.1091 + ], + "hints": { + "index": 14095 + } + }, + { + "items": [ + 7578.5, + 3.0804 + ], + "hints": { + "index": 14096 + } + }, + { + "items": [ + 7579, + 3.0049 + ], + "hints": { + "index": 14097 + } + }, + { + "items": [ + 7579.5, + 3.2152 + ], + "hints": { + "index": 14098 + } + }, + { + "items": [ + 7580, + 3.9162 + ], + "hints": { + "index": 14099 + } + }, + { + "items": [ + 7580.5, + 4.5111 + ], + "hints": { + "index": 14100 + } + }, + { + "items": [ + 7581, + 4.0557 + ], + "hints": { + "index": 14101 + } + }, + { + "items": [ + 7581.5, + 3.2903 + ], + "hints": { + "index": 14102 + } + }, + { + "items": [ + 7582, + 2.9015 + ], + "hints": { + "index": 14103 + } + }, + { + "items": [ + 7582.5, + 2.979 + ], + "hints": { + "index": 14104 + } + }, + { + "items": [ + 7583, + 2.9179 + ], + "hints": { + "index": 14105 + } + }, + { + "items": [ + 7583.5, + 2.8762 + ], + "hints": { + "index": 14106 + } + }, + { + "items": [ + 7584, + 3.0993 + ], + "hints": { + "index": 14107 + } + }, + { + "items": [ + 7584.5, + 3.537 + ], + "hints": { + "index": 14108 + } + }, + { + "items": [ + 7585, + 4.0847 + ], + "hints": { + "index": 14109 + } + }, + { + "items": [ + 7585.5, + 3.849 + ], + "hints": { + "index": 14110 + } + }, + { + "items": [ + 7586, + 3.4572 + ], + "hints": { + "index": 14111 + } + }, + { + "items": [ + 7586.5, + 3.1366 + ], + "hints": { + "index": 14112 + } + }, + { + "items": [ + 7587, + 3.2293 + ], + "hints": { + "index": 14113 + } + }, + { + "items": [ + 7587.5, + 3.3471 + ], + "hints": { + "index": 14114 + } + }, + { + "items": [ + 7588, + 3.3727 + ], + "hints": { + "index": 14115 + } + }, + { + "items": [ + 7588.5, + 3.4672 + ], + "hints": { + "index": 14116 + } + }, + { + "items": [ + 7589, + 3.8351 + ], + "hints": { + "index": 14117 + } + }, + { + "items": [ + 7589.5, + 4.4535 + ], + "hints": { + "index": 14118 + } + }, + { + "items": [ + 7590, + 4.6573 + ], + "hints": { + "index": 14119 + } + }, + { + "items": [ + 7590.5, + 4.1153 + ], + "hints": { + "index": 14120 + } + }, + { + "items": [ + 7591, + 3.4349 + ], + "hints": { + "index": 14121 + } + }, + { + "items": [ + 7591.5, + 3.1947 + ], + "hints": { + "index": 14122 + } + }, + { + "items": [ + 7592, + 3.0346 + ], + "hints": { + "index": 14123 + } + }, + { + "items": [ + 7592.5, + 3.0739 + ], + "hints": { + "index": 14124 + } + }, + { + "items": [ + 7593, + 3.0109 + ], + "hints": { + "index": 14125 + } + }, + { + "items": [ + 7593.5, + 2.9642 + ], + "hints": { + "index": 14126 + } + }, + { + "items": [ + 7594, + 2.9584 + ], + "hints": { + "index": 14127 + } + }, + { + "items": [ + 7594.5, + 2.8572 + ], + "hints": { + "index": 14128 + } + }, + { + "items": [ + 7595, + 2.8613 + ], + "hints": { + "index": 14129 + } + }, + { + "items": [ + 7595.5, + 2.8416 + ], + "hints": { + "index": 14130 + } + }, + { + "items": [ + 7596, + 3.2848 + ], + "hints": { + "index": 14131 + } + }, + { + "items": [ + 7596.5, + 3.6763 + ], + "hints": { + "index": 14132 + } + }, + { + "items": [ + 7597, + 4.167 + ], + "hints": { + "index": 14133 + } + }, + { + "items": [ + 7597.5, + 4.1622 + ], + "hints": { + "index": 14134 + } + }, + { + "items": [ + 7598, + 4.0047 + ], + "hints": { + "index": 14135 + } + }, + { + "items": [ + 7598.5, + 3.6305 + ], + "hints": { + "index": 14136 + } + }, + { + "items": [ + 7599, + 3.1924 + ], + "hints": { + "index": 14137 + } + }, + { + "items": [ + 7599.5, + 3.002 + ], + "hints": { + "index": 14138 + } + }, + { + "items": [ + 7600, + 2.9861 + ], + "hints": { + "index": 14139 + } + }, + { + "items": [ + 7600.5, + 3.1959 + ], + "hints": { + "index": 14140 + } + }, + { + "items": [ + 7601, + 3.7342 + ], + "hints": { + "index": 14141 + } + }, + { + "items": [ + 7601.5, + 4.294 + ], + "hints": { + "index": 14142 + } + }, + { + "items": [ + 7602, + 4.6979 + ], + "hints": { + "index": 14143 + } + }, + { + "items": [ + 7602.5, + 4.2953 + ], + "hints": { + "index": 14144 + } + }, + { + "items": [ + 7603, + 3.8176 + ], + "hints": { + "index": 14145 + } + }, + { + "items": [ + 7603.5, + 3.2096 + ], + "hints": { + "index": 14146 + } + }, + { + "items": [ + 7604, + 2.9537 + ], + "hints": { + "index": 14147 + } + }, + { + "items": [ + 7604.5, + 3.2446 + ], + "hints": { + "index": 14148 + } + }, + { + "items": [ + 7605, + 3.9146 + ], + "hints": { + "index": 14149 + } + }, + { + "items": [ + 7605.5, + 4.8703 + ], + "hints": { + "index": 14150 + } + }, + { + "items": [ + 7606, + 5.5412 + ], + "hints": { + "index": 14151 + } + }, + { + "items": [ + 7606.5, + 5.5857 + ], + "hints": { + "index": 14152 + } + }, + { + "items": [ + 7607, + 5.0146999359130859 + ], + "hints": { + "index": 14153 + } + }, + { + "items": [ + 7607.5, + 4.4455 + ], + "hints": { + "index": 14154 + } + }, + { + "items": [ + 7608, + 3.6586000919342041 + ], + "hints": { + "index": 14155 + } + }, + { + "items": [ + 7608.5, + 3.3384 + ], + "hints": { + "index": 14156 + } + }, + { + "items": [ + 7609, + 3.7183 + ], + "hints": { + "index": 14157 + } + }, + { + "items": [ + 7609.5, + 4.9419 + ], + "hints": { + "index": 14158 + } + }, + { + "items": [ + 7610, + 6.1564998626708984 + ], + "hints": { + "index": 14159 + } + }, + { + "items": [ + 7610.5, + 6.9566 + ], + "hints": { + "index": 14160 + } + }, + { + "items": [ + 7611, + 7.1918 + ], + "hints": { + "index": 14161 + } + }, + { + "items": [ + 7611.5, + 7.3695998191833505 + ], + "hints": { + "index": 14162 + } + }, + { + "items": [ + 7612, + 6.3949 + ], + "hints": { + "index": 14163 + } + }, + { + "items": [ + 7612.5, + 5.2606 + ], + "hints": { + "index": 14164 + } + }, + { + "items": [ + 7613, + 5.3746 + ], + "hints": { + "index": 14165 + } + }, + { + "items": [ + 7613.5, + 5.5486 + ], + "hints": { + "index": 14166 + } + }, + { + "items": [ + 7614, + 7.3024 + ], + "hints": { + "index": 14167 + } + }, + { + "items": [ + 7614.5, + 9.18220043182373 + ], + "hints": { + "index": 14168 + } + }, + { + "items": [ + 7615, + 13.024 + ], + "hints": { + "index": 14169 + } + }, + { + "items": [ + 7615.5, + 11.9136 + ], + "hints": { + "index": 14170 + } + }, + { + "items": [ + 7616, + 9.9178 + ], + "hints": { + "index": 14171 + } + }, + { + "items": [ + 7616.5, + 5.9523 + ], + "hints": { + "index": 14172 + } + }, + { + "items": [ + 7617, + 4.1191 + ], + "hints": { + "index": 14173 + } + }, + { + "items": [ + 7617.5, + 3.8092 + ], + "hints": { + "index": 14174 + } + }, + { + "items": [ + 7618, + 4.2153 + ], + "hints": { + "index": 14175 + } + }, + { + "items": [ + 7618.5, + 5.2101001739501953 + ], + "hints": { + "index": 14176 + } + }, + { + "items": [ + 7619, + 6.2930998802185059 + ], + "hints": { + "index": 14177 + } + }, + { + "items": [ + 7619.5, + 8.1935997009277344 + ], + "hints": { + "index": 14178 + } + }, + { + "items": [ + 7620, + 8.3455 + ], + "hints": { + "index": 14179 + } + }, + { + "items": [ + 7620.5, + 6.9644999504089355 + ], + "hints": { + "index": 14180 + } + }, + { + "items": [ + 7621, + 4.7822999954223633 + ], + "hints": { + "index": 14181 + } + }, + { + "items": [ + 7621.5, + 3.7091 + ], + "hints": { + "index": 14182 + } + }, + { + "items": [ + 7622, + 3.6837999820709233 + ], + "hints": { + "index": 14183 + } + }, + { + "items": [ + 7622.5, + 4.0373997688293457 + ], + "hints": { + "index": 14184 + } + }, + { + "items": [ + 7623, + 4.7762999534606934 + ], + "hints": { + "index": 14185 + } + }, + { + "items": [ + 7623.5, + 5.5620999336242676 + ], + "hints": { + "index": 14186 + } + }, + { + "items": [ + 7624, + 6.9291 + ], + "hints": { + "index": 14187 + } + }, + { + "items": [ + 7624.5, + 7.9981999397277823 + ], + "hints": { + "index": 14188 + } + }, + { + "items": [ + 7625, + 7.2593998908996573 + ], + "hints": { + "index": 14189 + } + }, + { + "items": [ + 7625.5, + 5.7467999458312988 + ], + "hints": { + "index": 14190 + } + }, + { + "items": [ + 7626, + 4.9236998558044434 + ], + "hints": { + "index": 14191 + } + }, + { + "items": [ + 7626.5, + 4.9797000885009766 + ], + "hints": { + "index": 14192 + } + }, + { + "items": [ + 7627, + 5.3435 + ], + "hints": { + "index": 14193 + } + }, + { + "items": [ + 7627.5, + 6.8390002250671387 + ], + "hints": { + "index": 14194 + } + }, + { + "items": [ + 7628, + 8.4696 + ], + "hints": { + "index": 14195 + } + }, + { + "items": [ + 7628.5, + 10.5086 + ], + "hints": { + "index": 14196 + } + }, + { + "items": [ + 7629, + 9.8147 + ], + "hints": { + "index": 14197 + } + }, + { + "items": [ + 7629.5, + 7.4224 + ], + "hints": { + "index": 14198 + } + }, + { + "items": [ + 7630, + 4.5329 + ], + "hints": { + "index": 14199 + } + }, + { + "items": [ + 7630.5, + 3.8751 + ], + "hints": { + "index": 14200 + } + }, + { + "items": [ + 7631, + 3.9198 + ], + "hints": { + "index": 14201 + } + }, + { + "items": [ + 7631.5, + 4.7697 + ], + "hints": { + "index": 14202 + } + }, + { + "items": [ + 7632, + 5.3691 + ], + "hints": { + "index": 14203 + } + }, + { + "items": [ + 7632.5, + 5.8366 + ], + "hints": { + "index": 14204 + } + }, + { + "items": [ + 7633, + 5.9443998336791992 + ], + "hints": { + "index": 14205 + } + }, + { + "items": [ + 7633.5, + 5.2465000152587891 + ], + "hints": { + "index": 14206 + } + }, + { + "items": [ + 7634, + 4.7080998420715332 + ], + "hints": { + "index": 14207 + } + }, + { + "items": [ + 7634.5, + 3.8433001041412354 + ], + "hints": { + "index": 14208 + } + }, + { + "items": [ + 7635, + 3.6359000205993648 + ], + "hints": { + "index": 14209 + } + }, + { + "items": [ + 7635.5, + 3.6545999050140385 + ], + "hints": { + "index": 14210 + } + }, + { + "items": [ + 7636, + 4.1276 + ], + "hints": { + "index": 14211 + } + }, + { + "items": [ + 7636.5, + 4.4362 + ], + "hints": { + "index": 14212 + } + }, + { + "items": [ + 7637, + 4.9831 + ], + "hints": { + "index": 14213 + } + }, + { + "items": [ + 7637.5, + 5.1419 + ], + "hints": { + "index": 14214 + } + }, + { + "items": [ + 7638, + 4.2668 + ], + "hints": { + "index": 14215 + } + }, + { + "items": [ + 7638.5, + 3.2546000480651855 + ], + "hints": { + "index": 14216 + } + }, + { + "items": [ + 7639, + 2.8856 + ], + "hints": { + "index": 14217 + } + }, + { + "items": [ + 7639.5, + 2.9035000801086426 + ], + "hints": { + "index": 14218 + } + }, + { + "items": [ + 7640, + 3.0775 + ], + "hints": { + "index": 14219 + } + }, + { + "items": [ + 7640.5, + 3.3958 + ], + "hints": { + "index": 14220 + } + }, + { + "items": [ + 7641, + 4.1746 + ], + "hints": { + "index": 14221 + } + }, + { + "items": [ + 7641.5, + 5.0295000076293945 + ], + "hints": { + "index": 14222 + } + }, + { + "items": [ + 7642, + 4.9731001853942871 + ], + "hints": { + "index": 14223 + } + }, + { + "items": [ + 7642.5, + 3.9063 + ], + "hints": { + "index": 14224 + } + }, + { + "items": [ + 7643, + 3.0097000598907471 + ], + "hints": { + "index": 14225 + } + }, + { + "items": [ + 7643.5, + 2.7527 + ], + "hints": { + "index": 14226 + } + }, + { + "items": [ + 7644, + 2.6977 + ], + "hints": { + "index": 14227 + } + }, + { + "items": [ + 7644.5, + 2.8664 + ], + "hints": { + "index": 14228 + } + }, + { + "items": [ + 7645, + 2.9203 + ], + "hints": { + "index": 14229 + } + }, + { + "items": [ + 7645.5, + 3.1776 + ], + "hints": { + "index": 14230 + } + }, + { + "items": [ + 7646, + 3.7976 + ], + "hints": { + "index": 14231 + } + }, + { + "items": [ + 7646.5, + 4.2176 + ], + "hints": { + "index": 14232 + } + }, + { + "items": [ + 7647, + 4.0936 + ], + "hints": { + "index": 14233 + } + }, + { + "items": [ + 7647.5, + 3.3043999671936035 + ], + "hints": { + "index": 14234 + } + }, + { + "items": [ + 7648, + 3.2532000541687012 + ], + "hints": { + "index": 14235 + } + }, + { + "items": [ + 7648.5, + 3.4302 + ], + "hints": { + "index": 14236 + } + }, + { + "items": [ + 7649, + 3.9073998928070064 + ], + "hints": { + "index": 14237 + } + }, + { + "items": [ + 7649.5, + 4.2274 + ], + "hints": { + "index": 14238 + } + }, + { + "items": [ + 7650, + 4.9225001335144043 + ], + "hints": { + "index": 14239 + } + }, + { + "items": [ + 7650.5, + 5.357 + ], + "hints": { + "index": 14240 + } + }, + { + "items": [ + 7651, + 5.0890998840332031 + ], + "hints": { + "index": 14241 + } + }, + { + "items": [ + 7651.5, + 3.9946000576019287 + ], + "hints": { + "index": 14242 + } + }, + { + "items": [ + 7652, + 3.2125999927520752 + ], + "hints": { + "index": 14243 + } + }, + { + "items": [ + 7652.5, + 2.885200023651123 + ], + "hints": { + "index": 14244 + } + }, + { + "items": [ + 7653, + 2.7656 + ], + "hints": { + "index": 14245 + } + }, + { + "items": [ + 7653.5, + 2.7665998935699463 + ], + "hints": { + "index": 14246 + } + }, + { + "items": [ + 7654, + 2.9154999256134033 + ], + "hints": { + "index": 14247 + } + }, + { + "items": [ + 7654.5, + 3.0909 + ], + "hints": { + "index": 14248 + } + }, + { + "items": [ + 7655, + 3.6516 + ], + "hints": { + "index": 14249 + } + }, + { + "items": [ + 7655.5, + 3.7318999767303462 + ], + "hints": { + "index": 14250 + } + }, + { + "items": [ + 7656, + 3.5945000648498535 + ], + "hints": { + "index": 14251 + } + }, + { + "items": [ + 7656.5, + 3.1988999843597412 + ], + "hints": { + "index": 14252 + } + }, + { + "items": [ + 7657, + 2.9851 + ], + "hints": { + "index": 14253 + } + }, + { + "items": [ + 7657.5, + 2.9505999088287354 + ], + "hints": { + "index": 14254 + } + }, + { + "items": [ + 7658, + 2.770299911499023 + ], + "hints": { + "index": 14255 + } + }, + { + "items": [ + 7658.5, + 2.6744 + ], + "hints": { + "index": 14256 + } + }, + { + "items": [ + 7659, + 2.6649999618530273 + ], + "hints": { + "index": 14257 + } + }, + { + "items": [ + 7659.5, + 2.8166000843048096 + ], + "hints": { + "index": 14258 + } + }, + { + "items": [ + 7660, + 2.9930999279022217 + ], + "hints": { + "index": 14259 + } + }, + { + "items": [ + 7660.5, + 2.9955999851226807 + ], + "hints": { + "index": 14260 + } + }, + { + "items": [ + 7661, + 2.9099 + ], + "hints": { + "index": 14261 + } + }, + { + "items": [ + 7661.5, + 2.8939 + ], + "hints": { + "index": 14262 + } + }, + { + "items": [ + 7662, + 2.7784 + ], + "hints": { + "index": 14263 + } + }, + { + "items": [ + 7662.5, + 2.6714000701904297 + ], + "hints": { + "index": 14264 + } + }, + { + "items": [ + 7663, + 2.5748999118804932 + ], + "hints": { + "index": 14265 + } + }, + { + "items": [ + 7663.5, + 2.7381999492645264 + ], + "hints": { + "index": 14266 + } + }, + { + "items": [ + 7664, + 2.797199964523315 + ], + "hints": { + "index": 14267 + } + }, + { + "items": [ + 7664.5, + 2.8338 + ], + "hints": { + "index": 14268 + } + }, + { + "items": [ + 7665, + 2.7478 + ], + "hints": { + "index": 14269 + } + }, + { + "items": [ + 7665.5, + 2.7064 + ], + "hints": { + "index": 14270 + } + }, + { + "items": [ + 7666, + 2.6570000648498535 + ], + "hints": { + "index": 14271 + } + }, + { + "items": [ + 7666.5, + 2.6748 + ], + "hints": { + "index": 14272 + } + }, + { + "items": [ + 7667, + 2.6484999656677246 + ], + "hints": { + "index": 14273 + } + }, + { + "items": [ + 7667.5, + 2.6554 + ], + "hints": { + "index": 14274 + } + }, + { + "items": [ + 7668, + 2.6728000640869141 + ], + "hints": { + "index": 14275 + } + }, + { + "items": [ + 7668.5, + 2.8226 + ], + "hints": { + "index": 14276 + } + }, + { + "items": [ + 7669, + 2.8639 + ], + "hints": { + "index": 14277 + } + }, + { + "items": [ + 7669.5, + 2.9042 + ], + "hints": { + "index": 14278 + } + }, + { + "items": [ + 7670, + 2.8287 + ], + "hints": { + "index": 14279 + } + }, + { + "items": [ + 7670.5, + 2.7636001110076904 + ], + "hints": { + "index": 14280 + } + }, + { + "items": [ + 7671, + 2.6389000415802 + ], + "hints": { + "index": 14281 + } + }, + { + "items": [ + 7671.5, + 2.6752998828887939 + ], + "hints": { + "index": 14282 + } + }, + { + "items": [ + 7672, + 2.6814 + ], + "hints": { + "index": 14283 + } + }, + { + "items": [ + 7672.5, + 2.7780001163482666 + ], + "hints": { + "index": 14284 + } + }, + { + "items": [ + 7673, + 2.8735 + ], + "hints": { + "index": 14285 + } + }, + { + "items": [ + 7673.5, + 2.9216001033782959 + ], + "hints": { + "index": 14286 + } + }, + { + "items": [ + 7674, + 3.0529000759124756 + ], + "hints": { + "index": 14287 + } + }, + { + "items": [ + 7674.5, + 3.2771000862121582 + ], + "hints": { + "index": 14288 + } + }, + { + "items": [ + 7675, + 3.67930006980896 + ], + "hints": { + "index": 14289 + } + }, + { + "items": [ + 7675.5, + 3.4969000816345215 + ], + "hints": { + "index": 14290 + } + }, + { + "items": [ + 7676, + 3.1135001182556152 + ], + "hints": { + "index": 14291 + } + }, + { + "items": [ + 7676.5, + 3.0789000988006592 + ], + "hints": { + "index": 14292 + } + }, + { + "items": [ + 7677, + 3.2292 + ], + "hints": { + "index": 14293 + } + }, + { + "items": [ + 7677.5, + 3.4551000595092773 + ], + "hints": { + "index": 14294 + } + }, + { + "items": [ + 7678, + 3.2116000652313232 + ], + "hints": { + "index": 14295 + } + }, + { + "items": [ + 7678.5, + 2.9655 + ], + "hints": { + "index": 14296 + } + }, + { + "items": [ + 7679, + 2.7866 + ], + "hints": { + "index": 14297 + } + }, + { + "items": [ + 7679.5, + 2.771899938583374 + ], + "hints": { + "index": 14298 + } + }, + { + "items": [ + 7680, + 2.7537 + ], + "hints": { + "index": 14299 + } + }, + { + "items": [ + 7680.5, + 2.7875 + ], + "hints": { + "index": 14300 + } + }, + { + "items": [ + 7681, + 2.8105 + ], + "hints": { + "index": 14301 + } + }, + { + "items": [ + 7681.5, + 2.9023 + ], + "hints": { + "index": 14302 + } + }, + { + "items": [ + 7682, + 2.8461 + ], + "hints": { + "index": 14303 + } + }, + { + "items": [ + 7682.5, + 2.8078 + ], + "hints": { + "index": 14304 + } + }, + { + "items": [ + 7683, + 2.7958 + ], + "hints": { + "index": 14305 + } + }, + { + "items": [ + 7683.5, + 2.9453001022338867 + ], + "hints": { + "index": 14306 + } + }, + { + "items": [ + 7684, + 3.0687999725341797 + ], + "hints": { + "index": 14307 + } + }, + { + "items": [ + 7684.5, + 2.9677000045776367 + ], + "hints": { + "index": 14308 + } + }, + { + "items": [ + 7685, + 2.7977 + ], + "hints": { + "index": 14309 + } + }, + { + "items": [ + 7685.5, + 2.6675 + ], + "hints": { + "index": 14310 + } + }, + { + "items": [ + 7686, + 2.8197999000549316 + ], + "hints": { + "index": 14311 + } + }, + { + "items": [ + 7686.5, + 2.9409000873565674 + ], + "hints": { + "index": 14312 + } + }, + { + "items": [ + 7687, + 2.9121 + ], + "hints": { + "index": 14313 + } + }, + { + "items": [ + 7687.5, + 2.8326 + ], + "hints": { + "index": 14314 + } + }, + { + "items": [ + 7688, + 2.7561 + ], + "hints": { + "index": 14315 + } + }, + { + "items": [ + 7688.5, + 2.8188 + ], + "hints": { + "index": 14316 + } + }, + { + "items": [ + 7689, + 2.9396 + ], + "hints": { + "index": 14317 + } + }, + { + "items": [ + 7689.5, + 2.9913 + ], + "hints": { + "index": 14318 + } + }, + { + "items": [ + 7690, + 3.1387999057769775 + ], + "hints": { + "index": 14319 + } + }, + { + "items": [ + 7690.5, + 3.1355 + ], + "hints": { + "index": 14320 + } + }, + { + "items": [ + 7691, + 3.2107999324798584 + ], + "hints": { + "index": 14321 + } + }, + { + "items": [ + 7691.5, + 3.0864999294281006 + ], + "hints": { + "index": 14322 + } + }, + { + "items": [ + 7692, + 2.917200088500977 + ], + "hints": { + "index": 14323 + } + }, + { + "items": [ + 7692.5, + 2.9168 + ], + "hints": { + "index": 14324 + } + }, + { + "items": [ + 7693, + 3.0604 + ], + "hints": { + "index": 14325 + } + }, + { + "items": [ + 7693.5, + 3.3348 + ], + "hints": { + "index": 14326 + } + }, + { + "items": [ + 7694, + 3.3073 + ], + "hints": { + "index": 14327 + } + }, + { + "items": [ + 7694.5, + 3.1984 + ], + "hints": { + "index": 14328 + } + }, + { + "items": [ + 7695, + 3.0014 + ], + "hints": { + "index": 14329 + } + }, + { + "items": [ + 7695.5, + 2.968 + ], + "hints": { + "index": 14330 + } + }, + { + "items": [ + 7696, + 2.979 + ], + "hints": { + "index": 14331 + } + }, + { + "items": [ + 7696.5, + 2.9371 + ], + "hints": { + "index": 14332 + } + }, + { + "items": [ + 7697, + 2.947 + ], + "hints": { + "index": 14333 + } + }, + { + "items": [ + 7697.5, + 3.1054000854492188 + ], + "hints": { + "index": 14334 + } + }, + { + "items": [ + 7698, + 3.1683 + ], + "hints": { + "index": 14335 + } + }, + { + "items": [ + 7698.5, + 3.0661 + ], + "hints": { + "index": 14336 + } + }, + { + "items": [ + 7699, + 2.8619999885559082 + ], + "hints": { + "index": 14337 + } + }, + { + "items": [ + 7699.5, + 2.8186 + ], + "hints": { + "index": 14338 + } + }, + { + "items": [ + 7700, + 2.9416999816894531 + ], + "hints": { + "index": 14339 + } + }, + { + "items": [ + 7700.5, + 2.8854999542236328 + ], + "hints": { + "index": 14340 + } + }, + { + "items": [ + 7701, + 2.9803 + ], + "hints": { + "index": 14341 + } + }, + { + "items": [ + 7701.5, + 2.875999927520752 + ], + "hints": { + "index": 14342 + } + }, + { + "items": [ + 7702, + 2.890700101852417 + ], + "hints": { + "index": 14343 + } + }, + { + "items": [ + 7702.5, + 3.171799898147583 + ], + "hints": { + "index": 14344 + } + }, + { + "items": [ + 7703, + 3.488300085067749 + ], + "hints": { + "index": 14345 + } + }, + { + "items": [ + 7703.5, + 3.8661000728607178 + ], + "hints": { + "index": 14346 + } + }, + { + "items": [ + 7704, + 3.5443 + ], + "hints": { + "index": 14347 + } + }, + { + "items": [ + 7704.5, + 3.3732 + ], + "hints": { + "index": 14348 + } + }, + { + "items": [ + 7705, + 3.0972 + ], + "hints": { + "index": 14349 + } + }, + { + "items": [ + 7705.5, + 2.9890000820159912 + ], + "hints": { + "index": 14350 + } + }, + { + "items": [ + 7706, + 2.9119000434875488 + ], + "hints": { + "index": 14351 + } + }, + { + "items": [ + 7706.5, + 2.9247000217437744 + ], + "hints": { + "index": 14352 + } + }, + { + "items": [ + 7707, + 2.9330000877380371 + ], + "hints": { + "index": 14353 + } + }, + { + "items": [ + 7707.5, + 3.0058 + ], + "hints": { + "index": 14354 + } + }, + { + "items": [ + 7708, + 2.966 + ], + "hints": { + "index": 14355 + } + }, + { + "items": [ + 7708.5, + 3.2192 + ], + "hints": { + "index": 14356 + } + }, + { + "items": [ + 7709, + 3.2338 + ], + "hints": { + "index": 14357 + } + }, + { + "items": [ + 7709.5, + 3.2653999328613281 + ], + "hints": { + "index": 14358 + } + }, + { + "items": [ + 7710, + 3.0988 + ], + "hints": { + "index": 14359 + } + }, + { + "items": [ + 7710.5, + 2.9820001125335693 + ], + "hints": { + "index": 14360 + } + }, + { + "items": [ + 7711, + 3.0578999519348145 + ], + "hints": { + "index": 14361 + } + }, + { + "items": [ + 7711.5, + 3.1078999042510982 + ], + "hints": { + "index": 14362 + } + }, + { + "items": [ + 7712, + 3.2112998962402344 + ], + "hints": { + "index": 14363 + } + }, + { + "items": [ + 7712.5, + 3.1632 + ], + "hints": { + "index": 14364 + } + }, + { + "items": [ + 7713, + 2.9987 + ], + "hints": { + "index": 14365 + } + }, + { + "items": [ + 7713.5, + 2.938 + ], + "hints": { + "index": 14366 + } + }, + { + "items": [ + 7714, + 2.9577 + ], + "hints": { + "index": 14367 + } + }, + { + "items": [ + 7714.5, + 2.9526998996734619 + ], + "hints": { + "index": 14368 + } + }, + { + "items": [ + 7715, + 2.9779 + ], + "hints": { + "index": 14369 + } + }, + { + "items": [ + 7715.5, + 2.8615000247955318 + ], + "hints": { + "index": 14370 + } + }, + { + "items": [ + 7716, + 2.8584001064300537 + ], + "hints": { + "index": 14371 + } + }, + { + "items": [ + 7716.5, + 2.86680006980896 + ], + "hints": { + "index": 14372 + } + }, + { + "items": [ + 7717, + 3.0099999904632568 + ], + "hints": { + "index": 14373 + } + }, + { + "items": [ + 7717.5, + 3.326 + ], + "hints": { + "index": 14374 + } + }, + { + "items": [ + 7718, + 3.600600004196167 + ], + "hints": { + "index": 14375 + } + }, + { + "items": [ + 7718.5, + 3.6666998863220215 + ], + "hints": { + "index": 14376 + } + }, + { + "items": [ + 7719, + 3.4788000583648682 + ], + "hints": { + "index": 14377 + } + }, + { + "items": [ + 7719.5, + 3.3071000576019287 + ], + "hints": { + "index": 14378 + } + }, + { + "items": [ + 7720, + 3.2516 + ], + "hints": { + "index": 14379 + } + }, + { + "items": [ + 7720.5, + 3.2172000408172607 + ], + "hints": { + "index": 14380 + } + }, + { + "items": [ + 7721, + 3.19950008392334 + ], + "hints": { + "index": 14381 + } + }, + { + "items": [ + 7721.5, + 3.1414 + ], + "hints": { + "index": 14382 + } + }, + { + "items": [ + 7722, + 3.2042000293731689 + ], + "hints": { + "index": 14383 + } + }, + { + "items": [ + 7722.5, + 3.2408 + ], + "hints": { + "index": 14384 + } + }, + { + "items": [ + 7723, + 3.2599000930786133 + ], + "hints": { + "index": 14385 + } + }, + { + "items": [ + 7723.5, + 3.2912 + ], + "hints": { + "index": 14386 + } + }, + { + "items": [ + 7724, + 3.2007999420166016 + ], + "hints": { + "index": 14387 + } + }, + { + "items": [ + 7724.5, + 3.3029000759124756 + ], + "hints": { + "index": 14388 + } + }, + { + "items": [ + 7725, + 3.1552 + ], + "hints": { + "index": 14389 + } + }, + { + "items": [ + 7725.5, + 3.198699951171875 + ], + "hints": { + "index": 14390 + } + }, + { + "items": [ + 7726, + 3.1593999862670894 + ], + "hints": { + "index": 14391 + } + }, + { + "items": [ + 7726.5, + 3.4451 + ], + "hints": { + "index": 14392 + } + }, + { + "items": [ + 7727, + 3.6321 + ], + "hints": { + "index": 14393 + } + }, + { + "items": [ + 7727.5, + 3.7189 + ], + "hints": { + "index": 14394 + } + }, + { + "items": [ + 7728, + 3.3299 + ], + "hints": { + "index": 14395 + } + }, + { + "items": [ + 7728.5, + 3.0563 + ], + "hints": { + "index": 14396 + } + }, + { + "items": [ + 7729, + 2.8206 + ], + "hints": { + "index": 14397 + } + }, + { + "items": [ + 7729.5, + 2.8122 + ], + "hints": { + "index": 14398 + } + }, + { + "items": [ + 7730, + 2.836 + ], + "hints": { + "index": 14399 + } + }, + { + "items": [ + 7730.5, + 2.877000093460083 + ], + "hints": { + "index": 14400 + } + }, + { + "items": [ + 7731, + 3.0546000003814697 + ], + "hints": { + "index": 14401 + } + }, + { + "items": [ + 7731.5, + 3.1205999851226807 + ], + "hints": { + "index": 14402 + } + }, + { + "items": [ + 7732, + 3.2369 + ], + "hints": { + "index": 14403 + } + }, + { + "items": [ + 7732.5, + 3.1677 + ], + "hints": { + "index": 14404 + } + }, + { + "items": [ + 7733, + 3.1365 + ], + "hints": { + "index": 14405 + } + }, + { + "items": [ + 7733.5, + 2.9849998950958252 + ], + "hints": { + "index": 14406 + } + }, + { + "items": [ + 7734, + 2.9402000904083252 + ], + "hints": { + "index": 14407 + } + }, + { + "items": [ + 7734.5, + 2.9477 + ], + "hints": { + "index": 14408 + } + }, + { + "items": [ + 7735, + 3.1278998851776123 + ], + "hints": { + "index": 14409 + } + }, + { + "items": [ + 7735.5, + 3.3666000366210938 + ], + "hints": { + "index": 14410 + } + }, + { + "items": [ + 7736, + 3.3949 + ], + "hints": { + "index": 14411 + } + }, + { + "items": [ + 7736.5, + 3.2914 + ], + "hints": { + "index": 14412 + } + }, + { + "items": [ + 7737, + 3.0346000194549561 + ], + "hints": { + "index": 14413 + } + }, + { + "items": [ + 7737.5, + 2.8601000308990479 + ], + "hints": { + "index": 14414 + } + }, + { + "items": [ + 7738, + 2.8731 + ], + "hints": { + "index": 14415 + } + }, + { + "items": [ + 7738.5, + 2.9953000545501709 + ], + "hints": { + "index": 14416 + } + }, + { + "items": [ + 7739, + 3.2628 + ], + "hints": { + "index": 14417 + } + }, + { + "items": [ + 7739.5, + 3.4251 + ], + "hints": { + "index": 14418 + } + }, + { + "items": [ + 7740, + 3.8397998809814458 + ], + "hints": { + "index": 14419 + } + }, + { + "items": [ + 7740.5, + 4.3821 + ], + "hints": { + "index": 14420 + } + }, + { + "items": [ + 7741, + 4.5188 + ], + "hints": { + "index": 14421 + } + }, + { + "items": [ + 7741.5, + 3.7181 + ], + "hints": { + "index": 14422 + } + }, + { + "items": [ + 7742, + 3.1545000076293945 + ], + "hints": { + "index": 14423 + } + }, + { + "items": [ + 7742.5, + 3.1096000671386719 + ], + "hints": { + "index": 14424 + } + }, + { + "items": [ + 7743, + 3.2472999095916748 + ], + "hints": { + "index": 14425 + } + }, + { + "items": [ + 7743.5, + 3.3069999217987061 + ], + "hints": { + "index": 14426 + } + }, + { + "items": [ + 7744, + 3.4693999290466309 + ], + "hints": { + "index": 14427 + } + }, + { + "items": [ + 7744.5, + 3.9539999961853023 + ], + "hints": { + "index": 14428 + } + }, + { + "items": [ + 7745, + 4.4828000068664551 + ], + "hints": { + "index": 14429 + } + }, + { + "items": [ + 7745.5, + 4.981 + ], + "hints": { + "index": 14430 + } + }, + { + "items": [ + 7746, + 4.0756001472473145 + ], + "hints": { + "index": 14431 + } + }, + { + "items": [ + 7746.5, + 3.4072000980377197 + ], + "hints": { + "index": 14432 + } + }, + { + "items": [ + 7747, + 3.0148000717163086 + ], + "hints": { + "index": 14433 + } + }, + { + "items": [ + 7747.5, + 2.9974 + ], + "hints": { + "index": 14434 + } + }, + { + "items": [ + 7748, + 3.2629001140594478 + ], + "hints": { + "index": 14435 + } + }, + { + "items": [ + 7748.5, + 3.5299 + ], + "hints": { + "index": 14436 + } + }, + { + "items": [ + 7749, + 4.189000129699707 + ], + "hints": { + "index": 14437 + } + }, + { + "items": [ + 7749.5, + 4.9766998291015625 + ], + "hints": { + "index": 14438 + } + }, + { + "items": [ + 7750, + 5.1199002265930176 + ], + "hints": { + "index": 14439 + } + }, + { + "items": [ + 7750.5, + 4.024899959564209 + ], + "hints": { + "index": 14440 + } + }, + { + "items": [ + 7751, + 3.1472001075744629 + ], + "hints": { + "index": 14441 + } + }, + { + "items": [ + 7751.5, + 2.8578999042510982 + ], + "hints": { + "index": 14442 + } + }, + { + "items": [ + 7752, + 2.823600053787231 + ], + "hints": { + "index": 14443 + } + }, + { + "items": [ + 7752.5, + 2.8624999523162842 + ], + "hints": { + "index": 14444 + } + }, + { + "items": [ + 7753, + 3.2908000946044922 + ], + "hints": { + "index": 14445 + } + }, + { + "items": [ + 7753.5, + 3.77679991722107 + ], + "hints": { + "index": 14446 + } + }, + { + "items": [ + 7754, + 4.1993 + ], + "hints": { + "index": 14447 + } + }, + { + "items": [ + 7754.5, + 3.7845 + ], + "hints": { + "index": 14448 + } + }, + { + "items": [ + 7755, + 3.4254 + ], + "hints": { + "index": 14449 + } + }, + { + "items": [ + 7755.5, + 3.1028 + ], + "hints": { + "index": 14450 + } + }, + { + "items": [ + 7756, + 2.9667 + ], + "hints": { + "index": 14451 + } + }, + { + "items": [ + 7756.5, + 2.9366 + ], + "hints": { + "index": 14452 + } + }, + { + "items": [ + 7757, + 3.052299976348877 + ], + "hints": { + "index": 14453 + } + }, + { + "items": [ + 7757.5, + 3.26 + ], + "hints": { + "index": 14454 + } + }, + { + "items": [ + 7758, + 3.9504001140594478 + ], + "hints": { + "index": 14455 + } + }, + { + "items": [ + 7758.5, + 4.9155001640319824 + ], + "hints": { + "index": 14456 + } + }, + { + "items": [ + 7759, + 4.9161 + ], + "hints": { + "index": 14457 + } + }, + { + "items": [ + 7759.5, + 3.8166 + ], + "hints": { + "index": 14458 + } + }, + { + "items": [ + 7760, + 3.1604 + ], + "hints": { + "index": 14459 + } + }, + { + "items": [ + 7760.5, + 3.0482 + ], + "hints": { + "index": 14460 + } + }, + { + "items": [ + 7761, + 3.0343 + ], + "hints": { + "index": 14461 + } + }, + { + "items": [ + 7761.5, + 3.68 + ], + "hints": { + "index": 14462 + } + }, + { + "items": [ + 7762, + 4.8583998680114746 + ], + "hints": { + "index": 14463 + } + }, + { + "items": [ + 7762.5, + 6.5799 + ], + "hints": { + "index": 14464 + } + }, + { + "items": [ + 7763, + 7.3091998100280771 + ], + "hints": { + "index": 14465 + } + }, + { + "items": [ + 7763.5, + 6.8928999900817871 + ], + "hints": { + "index": 14466 + } + }, + { + "items": [ + 7764, + 5.0782999992370605 + ], + "hints": { + "index": 14467 + } + }, + { + "items": [ + 7764.5, + 3.7123 + ], + "hints": { + "index": 14468 + } + }, + { + "items": [ + 7765, + 3.0025 + ], + "hints": { + "index": 14469 + } + }, + { + "items": [ + 7765.5, + 2.9210000038146973 + ], + "hints": { + "index": 14470 + } + }, + { + "items": [ + 7766, + 2.8199 + ], + "hints": { + "index": 14471 + } + }, + { + "items": [ + 7766.5, + 3.1746 + ], + "hints": { + "index": 14472 + } + }, + { + "items": [ + 7767, + 4.09250020980835 + ], + "hints": { + "index": 14473 + } + }, + { + "items": [ + 7767.5, + 5.2304 + ], + "hints": { + "index": 14474 + } + }, + { + "items": [ + 7768, + 5.3678 + ], + "hints": { + "index": 14475 + } + }, + { + "items": [ + 7768.5, + 4.0626 + ], + "hints": { + "index": 14476 + } + }, + { + "items": [ + 7769, + 3.346 + ], + "hints": { + "index": 14477 + } + }, + { + "items": [ + 7769.5, + 3.002 + ], + "hints": { + "index": 14478 + } + }, + { + "items": [ + 7770, + 2.9401 + ], + "hints": { + "index": 14479 + } + }, + { + "items": [ + 7770.5, + 3.0578 + ], + "hints": { + "index": 14480 + } + }, + { + "items": [ + 7771, + 3.1637001037597656 + ], + "hints": { + "index": 14481 + } + }, + { + "items": [ + 7771.5, + 3.2241 + ], + "hints": { + "index": 14482 + } + }, + { + "items": [ + 7772, + 3.2179 + ], + "hints": { + "index": 14483 + } + }, + { + "items": [ + 7772.5, + 3.0727999210357666 + ], + "hints": { + "index": 14484 + } + }, + { + "items": [ + 7773, + 2.9581 + ], + "hints": { + "index": 14485 + } + }, + { + "items": [ + 7773.5, + 2.8554 + ], + "hints": { + "index": 14486 + } + }, + { + "items": [ + 7774, + 2.8872 + ], + "hints": { + "index": 14487 + } + }, + { + "items": [ + 7774.5, + 2.8296999931335449 + ], + "hints": { + "index": 14488 + } + }, + { + "items": [ + 7775, + 2.8671998977661133 + ], + "hints": { + "index": 14489 + } + }, + { + "items": [ + 7775.5, + 2.8596 + ], + "hints": { + "index": 14490 + } + }, + { + "items": [ + 7776, + 2.9598000049591064 + ], + "hints": { + "index": 14491 + } + }, + { + "items": [ + 7776.5, + 3.038000106811523 + ], + "hints": { + "index": 14492 + } + }, + { + "items": [ + 7777, + 3.266200065612793 + ], + "hints": { + "index": 14493 + } + }, + { + "items": [ + 7777.5, + 3.2497000694274902 + ], + "hints": { + "index": 14494 + } + }, + { + "items": [ + 7778, + 3.0940001010894775 + ], + "hints": { + "index": 14495 + } + }, + { + "items": [ + 7778.5, + 2.9086000919342041 + ], + "hints": { + "index": 14496 + } + }, + { + "items": [ + 7779, + 2.864300012588501 + ], + "hints": { + "index": 14497 + } + }, + { + "items": [ + 7779.5, + 2.9146 + ], + "hints": { + "index": 14498 + } + }, + { + "items": [ + 7780, + 2.9726 + ], + "hints": { + "index": 14499 + } + }, + { + "items": [ + 7780.5, + 2.9862 + ], + "hints": { + "index": 14500 + } + }, + { + "items": [ + 7781, + 2.9492 + ], + "hints": { + "index": 14501 + } + }, + { + "items": [ + 7781.5, + 3.0274 + ], + "hints": { + "index": 14502 + } + }, + { + "items": [ + 7782, + 3.0335 + ], + "hints": { + "index": 14503 + } + }, + { + "items": [ + 7782.5, + 3.0626 + ], + "hints": { + "index": 14504 + } + }, + { + "items": [ + 7783, + 2.963 + ], + "hints": { + "index": 14505 + } + }, + { + "items": [ + 7783.5, + 2.9914 + ], + "hints": { + "index": 14506 + } + }, + { + "items": [ + 7784, + 3.0944 + ], + "hints": { + "index": 14507 + } + }, + { + "items": [ + 7784.5, + 3.160099983215332 + ], + "hints": { + "index": 14508 + } + }, + { + "items": [ + 7785, + 3.2277998924255371 + ], + "hints": { + "index": 14509 + } + }, + { + "items": [ + 7785.5, + 3.0592999458312988 + ], + "hints": { + "index": 14510 + } + }, + { + "items": [ + 7786, + 2.994999885559082 + ], + "hints": { + "index": 14511 + } + }, + { + "items": [ + 7786.5, + 2.936500072479248 + ], + "hints": { + "index": 14512 + } + }, + { + "items": [ + 7787, + 3.0313999652862549 + ], + "hints": { + "index": 14513 + } + }, + { + "items": [ + 7787.5, + 3.0775001049041748 + ], + "hints": { + "index": 14514 + } + }, + { + "items": [ + 7788, + 3.0125999450683594 + ], + "hints": { + "index": 14515 + } + }, + { + "items": [ + 7788.5, + 2.9507999420166016 + ], + "hints": { + "index": 14516 + } + }, + { + "items": [ + 7789, + 2.8443999290466309 + ], + "hints": { + "index": 14517 + } + }, + { + "items": [ + 7789.5, + 2.8248999118804932 + ], + "hints": { + "index": 14518 + } + }, + { + "items": [ + 7790, + 2.7072000503540039 + ], + "hints": { + "index": 14519 + } + }, + { + "items": [ + 7790.5, + 2.676399946212769 + ], + "hints": { + "index": 14520 + } + }, + { + "items": [ + 7791, + 2.887700080871582 + ], + "hints": { + "index": 14521 + } + }, + { + "items": [ + 7791.5, + 3.0253000259399414 + ], + "hints": { + "index": 14522 + } + }, + { + "items": [ + 7792, + 3.13919997215271 + ], + "hints": { + "index": 14523 + } + }, + { + "items": [ + 7792.5, + 3.0074000358581543 + ], + "hints": { + "index": 14524 + } + }, + { + "items": [ + 7793, + 3.0018999576568604 + ], + "hints": { + "index": 14525 + } + }, + { + "items": [ + 7793.5, + 2.980600118637085 + ], + "hints": { + "index": 14526 + } + }, + { + "items": [ + 7794, + 3.005 + ], + "hints": { + "index": 14527 + } + }, + { + "items": [ + 7794.5, + 3.0132 + ], + "hints": { + "index": 14528 + } + }, + { + "items": [ + 7795, + 3.152400016784668 + ], + "hints": { + "index": 14529 + } + }, + { + "items": [ + 7795.5, + 3.2912 + ], + "hints": { + "index": 14530 + } + }, + { + "items": [ + 7796, + 3.4535000324249268 + ], + "hints": { + "index": 14531 + } + }, + { + "items": [ + 7796.5, + 3.345 + ], + "hints": { + "index": 14532 + } + }, + { + "items": [ + 7797, + 3.28410005569458 + ], + "hints": { + "index": 14533 + } + }, + { + "items": [ + 7797.5, + 3.1884 + ], + "hints": { + "index": 14534 + } + }, + { + "items": [ + 7798, + 3.184 + ], + "hints": { + "index": 14535 + } + }, + { + "items": [ + 7798.5, + 2.9769 + ], + "hints": { + "index": 14536 + } + }, + { + "items": [ + 7799, + 3.0427000522613525 + ], + "hints": { + "index": 14537 + } + }, + { + "items": [ + 7799.5, + 3.0308001041412354 + ], + "hints": { + "index": 14538 + } + }, + { + "items": [ + 7800, + 3.0786 + ], + "hints": { + "index": 14539 + } + }, + { + "items": [ + 7800.5, + 2.9782 + ], + "hints": { + "index": 14540 + } + }, + { + "items": [ + 7801, + 3.0195999145507813 + ], + "hints": { + "index": 14541 + } + }, + { + "items": [ + 7801.5, + 3.0511000156402588 + ], + "hints": { + "index": 14542 + } + }, + { + "items": [ + 7802, + 3.162600040435791 + ], + "hints": { + "index": 14543 + } + }, + { + "items": [ + 7802.5, + 3.3599 + ], + "hints": { + "index": 14544 + } + }, + { + "items": [ + 7803, + 3.3749 + ], + "hints": { + "index": 14545 + } + }, + { + "items": [ + 7803.5, + 3.322 + ], + "hints": { + "index": 14546 + } + }, + { + "items": [ + 7804, + 2.9665 + ], + "hints": { + "index": 14547 + } + }, + { + "items": [ + 7804.5, + 2.9149000644683838 + ], + "hints": { + "index": 14548 + } + }, + { + "items": [ + 7805, + 2.8695 + ], + "hints": { + "index": 14549 + } + }, + { + "items": [ + 7805.5, + 3.0089 + ], + "hints": { + "index": 14550 + } + }, + { + "items": [ + 7806, + 2.9684 + ], + "hints": { + "index": 14551 + } + }, + { + "items": [ + 7806.5, + 3.0099000930786133 + ], + "hints": { + "index": 14552 + } + }, + { + "items": [ + 7807, + 2.9107999801635742 + ], + "hints": { + "index": 14553 + } + }, + { + "items": [ + 7807.5, + 3.0284 + ], + "hints": { + "index": 14554 + } + }, + { + "items": [ + 7808, + 3.047199964523315 + ], + "hints": { + "index": 14555 + } + }, + { + "items": [ + 7808.5, + 3.1770000457763672 + ], + "hints": { + "index": 14556 + } + }, + { + "items": [ + 7809, + 3.0894999504089355 + ], + "hints": { + "index": 14557 + } + }, + { + "items": [ + 7809.5, + 3.0659999847412109 + ], + "hints": { + "index": 14558 + } + }, + { + "items": [ + 7810, + 2.9753000736236572 + ], + "hints": { + "index": 14559 + } + }, + { + "items": [ + 7810.5, + 3.0384 + ], + "hints": { + "index": 14560 + } + }, + { + "items": [ + 7811, + 3.0834 + ], + "hints": { + "index": 14561 + } + }, + { + "items": [ + 7811.5, + 3.2444 + ], + "hints": { + "index": 14562 + } + }, + { + "items": [ + 7812, + 3.3114 + ], + "hints": { + "index": 14563 + } + }, + { + "items": [ + 7812.5, + 3.2354 + ], + "hints": { + "index": 14564 + } + }, + { + "items": [ + 7813, + 3.1802999973297119 + ], + "hints": { + "index": 14565 + } + }, + { + "items": [ + 7813.5, + 3.0623 + ], + "hints": { + "index": 14566 + } + }, + { + "items": [ + 7814, + 3.1329 + ], + "hints": { + "index": 14567 + } + }, + { + "items": [ + 7814.5, + 3.1305000782012939 + ], + "hints": { + "index": 14568 + } + }, + { + "items": [ + 7815, + 3.2936000823974609 + ], + "hints": { + "index": 14569 + } + }, + { + "items": [ + 7815.5, + 3.45989990234375 + ], + "hints": { + "index": 14570 + } + }, + { + "items": [ + 7816, + 3.7170999050140385 + ], + "hints": { + "index": 14571 + } + }, + { + "items": [ + 7816.5, + 3.8413999080657959 + ], + "hints": { + "index": 14572 + } + }, + { + "items": [ + 7817, + 3.8362998962402344 + ], + "hints": { + "index": 14573 + } + }, + { + "items": [ + 7817.5, + 3.7149999141693111 + ], + "hints": { + "index": 14574 + } + }, + { + "items": [ + 7818, + 3.5697000026702881 + ], + "hints": { + "index": 14575 + } + }, + { + "items": [ + 7818.5, + 3.3892 + ], + "hints": { + "index": 14576 + } + }, + { + "items": [ + 7819, + 3.4495 + ], + "hints": { + "index": 14577 + } + }, + { + "items": [ + 7819.5, + 3.5197 + ], + "hints": { + "index": 14578 + } + }, + { + "items": [ + 7820, + 3.7824 + ], + "hints": { + "index": 14579 + } + }, + { + "items": [ + 7820.5, + 4.2045001983642578 + ], + "hints": { + "index": 14580 + } + }, + { + "items": [ + 7821, + 4.6486 + ], + "hints": { + "index": 14581 + } + }, + { + "items": [ + 7821.5, + 4.8481001853942871 + ], + "hints": { + "index": 14582 + } + }, + { + "items": [ + 7822, + 4.7756 + ], + "hints": { + "index": 14583 + } + }, + { + "items": [ + 7822.5, + 4.5133 + ], + "hints": { + "index": 14584 + } + }, + { + "items": [ + 7823, + 4.2734 + ], + "hints": { + "index": 14585 + } + }, + { + "items": [ + 7823.5, + 3.9824 + ], + "hints": { + "index": 14586 + } + }, + { + "items": [ + 7824, + 3.8685 + ], + "hints": { + "index": 14587 + } + }, + { + "items": [ + 7824.5, + 3.9941 + ], + "hints": { + "index": 14588 + } + }, + { + "items": [ + 7825, + 4.03980016708374 + ], + "hints": { + "index": 14589 + } + }, + { + "items": [ + 7825.5, + 4.7672 + ], + "hints": { + "index": 14590 + } + }, + { + "items": [ + 7826, + 5.3235 + ], + "hints": { + "index": 14591 + } + }, + { + "items": [ + 7826.5, + 6.1196 + ], + "hints": { + "index": 14592 + } + }, + { + "items": [ + 7827, + 6.2623 + ], + "hints": { + "index": 14593 + } + }, + { + "items": [ + 7827.5, + 6.3476 + ], + "hints": { + "index": 14594 + } + }, + { + "items": [ + 7828, + 6.4682 + ], + "hints": { + "index": 14595 + } + }, + { + "items": [ + 7828.5, + 6.8636 + ], + "hints": { + "index": 14596 + } + }, + { + "items": [ + 7829, + 7.8565 + ], + "hints": { + "index": 14597 + } + }, + { + "items": [ + 7829.5, + 8.0747003555297852 + ], + "hints": { + "index": 14598 + } + }, + { + "items": [ + 7830, + 7.6114 + ], + "hints": { + "index": 14599 + } + }, + { + "items": [ + 7830.5, + 6.677800178527832 + ], + "hints": { + "index": 14600 + } + }, + { + "items": [ + 7831, + 5.7969999313354492 + ], + "hints": { + "index": 14601 + } + }, + { + "items": [ + 7831.5, + 4.2406997680664063 + ], + "hints": { + "index": 14602 + } + }, + { + "items": [ + 7832, + 3.238300085067749 + ], + "hints": { + "index": 14603 + } + }, + { + "items": [ + 7832.5, + 2.8052 + ], + "hints": { + "index": 14604 + } + }, + { + "items": [ + 7833, + 2.9484 + ], + "hints": { + "index": 14605 + } + }, + { + "items": [ + 7833.5, + 3.0714 + ], + "hints": { + "index": 14606 + } + }, + { + "items": [ + 7834, + 3.3334999084472656 + ], + "hints": { + "index": 14607 + } + }, + { + "items": [ + 7834.5, + 3.7101 + ], + "hints": { + "index": 14608 + } + }, + { + "items": [ + 7835, + 3.7025 + ], + "hints": { + "index": 14609 + } + }, + { + "items": [ + 7835.5, + 3.2682 + ], + "hints": { + "index": 14610 + } + }, + { + "items": [ + 7836, + 2.8545 + ], + "hints": { + "index": 14611 + } + }, + { + "items": [ + 7836.5, + 2.761100053787231 + ], + "hints": { + "index": 14612 + } + }, + { + "items": [ + 7837, + 2.8794 + ], + "hints": { + "index": 14613 + } + }, + { + "items": [ + 7837.5, + 2.9186 + ], + "hints": { + "index": 14614 + } + }, + { + "items": [ + 7838, + 3.0566999912261963 + ], + "hints": { + "index": 14615 + } + }, + { + "items": [ + 7838.5, + 3.1708 + ], + "hints": { + "index": 14616 + } + }, + { + "items": [ + 7839, + 3.263 + ], + "hints": { + "index": 14617 + } + }, + { + "items": [ + 7839.5, + 3.1249001026153564 + ], + "hints": { + "index": 14618 + } + }, + { + "items": [ + 7840, + 3.1046 + ], + "hints": { + "index": 14619 + } + }, + { + "items": [ + 7840.5, + 2.9202001094818115 + ], + "hints": { + "index": 14620 + } + }, + { + "items": [ + 7841, + 2.9230000972747803 + ], + "hints": { + "index": 14621 + } + }, + { + "items": [ + 7841.5, + 2.761 + ], + "hints": { + "index": 14622 + } + }, + { + "items": [ + 7842, + 2.7516000270843506 + ], + "hints": { + "index": 14623 + } + }, + { + "items": [ + 7842.5, + 2.7606 + ], + "hints": { + "index": 14624 + } + }, + { + "items": [ + 7843, + 2.8872 + ], + "hints": { + "index": 14625 + } + }, + { + "items": [ + 7843.5, + 2.9009 + ], + "hints": { + "index": 14626 + } + }, + { + "items": [ + 7844, + 2.9911 + ], + "hints": { + "index": 14627 + } + }, + { + "items": [ + 7844.5, + 2.9743 + ], + "hints": { + "index": 14628 + } + }, + { + "items": [ + 7845, + 2.9686 + ], + "hints": { + "index": 14629 + } + }, + { + "items": [ + 7845.5, + 2.8247 + ], + "hints": { + "index": 14630 + } + }, + { + "items": [ + 7846, + 2.826 + ], + "hints": { + "index": 14631 + } + }, + { + "items": [ + 7846.5, + 2.8097 + ], + "hints": { + "index": 14632 + } + }, + { + "items": [ + 7847, + 2.8834 + ], + "hints": { + "index": 14633 + } + }, + { + "items": [ + 7847.5, + 2.8818 + ], + "hints": { + "index": 14634 + } + }, + { + "items": [ + 7848, + 3.0592999458312988 + ], + "hints": { + "index": 14635 + } + }, + { + "items": [ + 7848.5, + 3.2599 + ], + "hints": { + "index": 14636 + } + }, + { + "items": [ + 7849, + 3.332 + ], + "hints": { + "index": 14637 + } + }, + { + "items": [ + 7849.5, + 3.279400110244751 + ], + "hints": { + "index": 14638 + } + }, + { + "items": [ + 7850, + 3.2529 + ], + "hints": { + "index": 14639 + } + }, + { + "items": [ + 7850.5, + 3.207799911499023 + ], + "hints": { + "index": 14640 + } + }, + { + "items": [ + 7851, + 3.3166 + ], + "hints": { + "index": 14641 + } + }, + { + "items": [ + 7851.5, + 3.3813 + ], + "hints": { + "index": 14642 + } + }, + { + "items": [ + 7852, + 3.7147 + ], + "hints": { + "index": 14643 + } + }, + { + "items": [ + 7852.5, + 3.9183 + ], + "hints": { + "index": 14644 + } + }, + { + "items": [ + 7853, + 3.927 + ], + "hints": { + "index": 14645 + } + }, + { + "items": [ + 7853.5, + 3.867 + ], + "hints": { + "index": 14646 + } + }, + { + "items": [ + 7854, + 3.5703 + ], + "hints": { + "index": 14647 + } + }, + { + "items": [ + 7854.5, + 3.4453 + ], + "hints": { + "index": 14648 + } + }, + { + "items": [ + 7855, + 3.2991 + ], + "hints": { + "index": 14649 + } + }, + { + "items": [ + 7855.5, + 3.3194 + ], + "hints": { + "index": 14650 + } + }, + { + "items": [ + 7856, + 3.5796 + ], + "hints": { + "index": 14651 + } + }, + { + "items": [ + 7856.5, + 3.8024001121520992 + ], + "hints": { + "index": 14652 + } + }, + { + "items": [ + 7857, + 4.373 + ], + "hints": { + "index": 14653 + } + }, + { + "items": [ + 7857.5, + 4.5493 + ], + "hints": { + "index": 14654 + } + }, + { + "items": [ + 7858, + 4.7001 + ], + "hints": { + "index": 14655 + } + }, + { + "items": [ + 7858.5, + 4.2192001342773438 + ], + "hints": { + "index": 14656 + } + }, + { + "items": [ + 7859, + 3.9272 + ], + "hints": { + "index": 14657 + } + }, + { + "items": [ + 7859.5, + 4.1345 + ], + "hints": { + "index": 14658 + } + }, + { + "items": [ + 7860, + 4.5722 + ], + "hints": { + "index": 14659 + } + }, + { + "items": [ + 7860.5, + 5.32 + ], + "hints": { + "index": 14660 + } + }, + { + "items": [ + 7861, + 5.4539 + ], + "hints": { + "index": 14661 + } + }, + { + "items": [ + 7861.5, + 5.5614 + ], + "hints": { + "index": 14662 + } + }, + { + "items": [ + 7862, + 4.6725997924804688 + ], + "hints": { + "index": 14663 + } + }, + { + "items": [ + 7862.5, + 4.0749 + ], + "hints": { + "index": 14664 + } + }, + { + "items": [ + 7863, + 3.5725 + ], + "hints": { + "index": 14665 + } + }, + { + "items": [ + 7863.5, + 3.6150999069213863 + ], + "hints": { + "index": 14666 + } + }, + { + "items": [ + 7864, + 3.5167999267578125 + ], + "hints": { + "index": 14667 + } + }, + { + "items": [ + 7864.5, + 3.7199 + ], + "hints": { + "index": 14668 + } + }, + { + "items": [ + 7865, + 3.9696 + ], + "hints": { + "index": 14669 + } + }, + { + "items": [ + 7865.5, + 4.5739 + ], + "hints": { + "index": 14670 + } + }, + { + "items": [ + 7866, + 4.94950008392334 + ], + "hints": { + "index": 14671 + } + }, + { + "items": [ + 7866.5, + 5.0158 + ], + "hints": { + "index": 14672 + } + }, + { + "items": [ + 7867, + 4.4025001525878906 + ], + "hints": { + "index": 14673 + } + }, + { + "items": [ + 7867.5, + 3.8543 + ], + "hints": { + "index": 14674 + } + }, + { + "items": [ + 7868, + 3.547199964523315 + ], + "hints": { + "index": 14675 + } + }, + { + "items": [ + 7868.5, + 3.61050009727478 + ], + "hints": { + "index": 14676 + } + }, + { + "items": [ + 7869, + 3.5724 + ], + "hints": { + "index": 14677 + } + }, + { + "items": [ + 7869.5, + 3.6568000316619873 + ], + "hints": { + "index": 14678 + } + }, + { + "items": [ + 7870, + 3.9340999126434326 + ], + "hints": { + "index": 14679 + } + }, + { + "items": [ + 7870.5, + 4.405 + ], + "hints": { + "index": 14680 + } + }, + { + "items": [ + 7871, + 4.7017998695373535 + ], + "hints": { + "index": 14681 + } + }, + { + "items": [ + 7871.5, + 4.6054 + ], + "hints": { + "index": 14682 + } + }, + { + "items": [ + 7872, + 4.2567000389099121 + ], + "hints": { + "index": 14683 + } + }, + { + "items": [ + 7872.5, + 3.9877998828887935 + ], + "hints": { + "index": 14684 + } + }, + { + "items": [ + 7873, + 3.9971001148223881 + ], + "hints": { + "index": 14685 + } + }, + { + "items": [ + 7873.5, + 4.3899002075195313 + ], + "hints": { + "index": 14686 + } + }, + { + "items": [ + 7874, + 4.9651999473571777 + ], + "hints": { + "index": 14687 + } + }, + { + "items": [ + 7874.5, + 5.1854000091552734 + ], + "hints": { + "index": 14688 + } + }, + { + "items": [ + 7875, + 5.2205 + ], + "hints": { + "index": 14689 + } + }, + { + "items": [ + 7875.5, + 4.488 + ], + "hints": { + "index": 14690 + } + }, + { + "items": [ + 7876, + 4.0537 + ], + "hints": { + "index": 14691 + } + }, + { + "items": [ + 7876.5, + 3.5801999568939209 + ], + "hints": { + "index": 14692 + } + }, + { + "items": [ + 7877, + 3.5171 + ], + "hints": { + "index": 14693 + } + }, + { + "items": [ + 7877.5, + 3.5429999828338623 + ], + "hints": { + "index": 14694 + } + }, + { + "items": [ + 7878, + 3.6315000057220455 + ], + "hints": { + "index": 14695 + } + }, + { + "items": [ + 7878.5, + 4.0259 + ], + "hints": { + "index": 14696 + } + }, + { + "items": [ + 7879, + 4.276 + ], + "hints": { + "index": 14697 + } + }, + { + "items": [ + 7879.5, + 4.4206 + ], + "hints": { + "index": 14698 + } + }, + { + "items": [ + 7880, + 3.8651 + ], + "hints": { + "index": 14699 + } + }, + { + "items": [ + 7880.5, + 3.7695999145507808 + ], + "hints": { + "index": 14700 + } + }, + { + "items": [ + 7881, + 3.7934999465942383 + ], + "hints": { + "index": 14701 + } + }, + { + "items": [ + 7881.5, + 3.9708 + ], + "hints": { + "index": 14702 + } + }, + { + "items": [ + 7882, + 3.9579000473022465 + ], + "hints": { + "index": 14703 + } + }, + { + "items": [ + 7882.5, + 3.9353 + ], + "hints": { + "index": 14704 + } + }, + { + "items": [ + 7883, + 4.1979999542236328 + ], + "hints": { + "index": 14705 + } + }, + { + "items": [ + 7883.5, + 4.7594 + ], + "hints": { + "index": 14706 + } + }, + { + "items": [ + 7884, + 5.7925000190734863 + ], + "hints": { + "index": 14707 + } + }, + { + "items": [ + 7884.5, + 6.2269001007080078 + ], + "hints": { + "index": 14708 + } + }, + { + "items": [ + 7885, + 6.036 + ], + "hints": { + "index": 14709 + } + }, + { + "items": [ + 7885.5, + 4.942 + ], + "hints": { + "index": 14710 + } + }, + { + "items": [ + 7886, + 4.1448 + ], + "hints": { + "index": 14711 + } + }, + { + "items": [ + 7886.5, + 3.7435 + ], + "hints": { + "index": 14712 + } + }, + { + "items": [ + 7887, + 4.0731000900268555 + ], + "hints": { + "index": 14713 + } + }, + { + "items": [ + 7887.5, + 4.8038997650146484 + ], + "hints": { + "index": 14714 + } + }, + { + "items": [ + 7888, + 5.5465 + ], + "hints": { + "index": 14715 + } + }, + { + "items": [ + 7888.5, + 5.2301 + ], + "hints": { + "index": 14716 + } + }, + { + "items": [ + 7889, + 4.4484 + ], + "hints": { + "index": 14717 + } + }, + { + "items": [ + 7889.5, + 4.0797 + ], + "hints": { + "index": 14718 + } + }, + { + "items": [ + 7890, + 4.0703 + ], + "hints": { + "index": 14719 + } + }, + { + "items": [ + 7890.5, + 4.2244 + ], + "hints": { + "index": 14720 + } + }, + { + "items": [ + 7891, + 3.967 + ], + "hints": { + "index": 14721 + } + }, + { + "items": [ + 7891.5, + 4.2576 + ], + "hints": { + "index": 14722 + } + }, + { + "items": [ + 7892, + 4.2123 + ], + "hints": { + "index": 14723 + } + }, + { + "items": [ + 7892.5, + 4.9579 + ], + "hints": { + "index": 14724 + } + }, + { + "items": [ + 7893, + 5.0184 + ], + "hints": { + "index": 14725 + } + }, + { + "items": [ + 7893.5, + 5.801 + ], + "hints": { + "index": 14726 + } + }, + { + "items": [ + 7894, + 5.425 + ], + "hints": { + "index": 14727 + } + }, + { + "items": [ + 7894.5, + 4.5457 + ], + "hints": { + "index": 14728 + } + }, + { + "items": [ + 7895, + 4.2672 + ], + "hints": { + "index": 14729 + } + }, + { + "items": [ + 7895.5, + 4.0598001480102539 + ], + "hints": { + "index": 14730 + } + }, + { + "items": [ + 7896, + 4.5868000984191895 + ], + "hints": { + "index": 14731 + } + }, + { + "items": [ + 7896.5, + 5.1484 + ], + "hints": { + "index": 14732 + } + }, + { + "items": [ + 7897, + 5.9988 + ], + "hints": { + "index": 14733 + } + }, + { + "items": [ + 7897.5, + 6.1071 + ], + "hints": { + "index": 14734 + } + }, + { + "items": [ + 7898, + 6.1006 + ], + "hints": { + "index": 14735 + } + }, + { + "items": [ + 7898.5, + 5.9819 + ], + "hints": { + "index": 14736 + } + }, + { + "items": [ + 7899, + 6.2374 + ], + "hints": { + "index": 14737 + } + }, + { + "items": [ + 7899.5, + 4.7373 + ], + "hints": { + "index": 14738 + } + }, + { + "items": [ + 7900, + 3.67 + ], + "hints": { + "index": 14739 + } + }, + { + "items": [ + 7900.5, + 3.4725 + ], + "hints": { + "index": 14740 + } + }, + { + "items": [ + 7901, + 4.1023 + ], + "hints": { + "index": 14741 + } + }, + { + "items": [ + 7901.5, + 5.4198 + ], + "hints": { + "index": 14742 + } + }, + { + "items": [ + 7902, + 6.6176 + ], + "hints": { + "index": 14743 + } + }, + { + "items": [ + 7902.5, + 7.0755 + ], + "hints": { + "index": 14744 + } + }, + { + "items": [ + 7903, + 5.1381 + ], + "hints": { + "index": 14745 + } + }, + { + "items": [ + 7903.5, + 4.2495 + ], + "hints": { + "index": 14746 + } + }, + { + "items": [ + 7904, + 3.7269 + ], + "hints": { + "index": 14747 + } + }, + { + "items": [ + 7904.5, + 3.8849 + ], + "hints": { + "index": 14748 + } + }, + { + "items": [ + 7905, + 3.8005 + ], + "hints": { + "index": 14749 + } + }, + { + "items": [ + 7905.5, + 3.7287 + ], + "hints": { + "index": 14750 + } + }, + { + "items": [ + 7906, + 3.2777 + ], + "hints": { + "index": 14751 + } + }, + { + "items": [ + 7906.5, + 3.149 + ], + "hints": { + "index": 14752 + } + }, + { + "items": [ + 7907, + 2.9922 + ], + "hints": { + "index": 14753 + } + }, + { + "items": [ + 7907.5, + 3.1576 + ], + "hints": { + "index": 14754 + } + }, + { + "items": [ + 7908, + 3.0587 + ], + "hints": { + "index": 14755 + } + }, + { + "items": [ + 7908.5, + 2.9362 + ], + "hints": { + "index": 14756 + } + }, + { + "items": [ + 7909, + 2.8351 + ], + "hints": { + "index": 14757 + } + }, + { + "items": [ + 7909.5, + 2.8317 + ], + "hints": { + "index": 14758 + } + }, + { + "items": [ + 7910, + 2.8662 + ], + "hints": { + "index": 14759 + } + }, + { + "items": [ + 7910.5, + 2.8286 + ], + "hints": { + "index": 14760 + } + }, + { + "items": [ + 7911, + 2.7086 + ], + "hints": { + "index": 14761 + } + }, + { + "items": [ + 7911.5, + 2.6570000648498535 + ], + "hints": { + "index": 14762 + } + }, + { + "items": [ + 7912, + 2.6521999835968018 + ], + "hints": { + "index": 14763 + } + }, + { + "items": [ + 7912.5, + 2.7999000549316406 + ], + "hints": { + "index": 14764 + } + }, + { + "items": [ + 7913, + 2.8780999183654785 + ], + "hints": { + "index": 14765 + } + }, + { + "items": [ + 7913.5, + 3.0088999271392822 + ], + "hints": { + "index": 14766 + } + }, + { + "items": [ + 7914, + 3.0336000919342041 + ], + "hints": { + "index": 14767 + } + }, + { + "items": [ + 7914.5, + 3.0852000713348389 + ], + "hints": { + "index": 14768 + } + }, + { + "items": [ + 7915, + 3.0100998878479004 + ], + "hints": { + "index": 14769 + } + }, + { + "items": [ + 7915.5, + 2.9718000888824463 + ], + "hints": { + "index": 14770 + } + }, + { + "items": [ + 7916, + 2.9372000694274902 + ], + "hints": { + "index": 14771 + } + }, + { + "items": [ + 7916.5, + 2.9228000640869141 + ], + "hints": { + "index": 14772 + } + }, + { + "items": [ + 7917, + 3.0225000381469727 + ], + "hints": { + "index": 14773 + } + }, + { + "items": [ + 7917.5, + 3.1173000335693359 + ], + "hints": { + "index": 14774 + } + }, + { + "items": [ + 7918, + 3.3415999412536621 + ], + "hints": { + "index": 14775 + } + }, + { + "items": [ + 7918.5, + 3.8480000495910649 + ], + "hints": { + "index": 14776 + } + }, + { + "items": [ + 7919, + 4.4860000610351563 + ], + "hints": { + "index": 14777 + } + }, + { + "items": [ + 7919.5, + 5.28439998626709 + ], + "hints": { + "index": 14778 + } + }, + { + "items": [ + 7920, + 4.4973998069763184 + ], + "hints": { + "index": 14779 + } + }, + { + "items": [ + 7920.5, + 4.2564001083374023 + ], + "hints": { + "index": 14780 + } + }, + { + "items": [ + 7921, + 4.2049999237060547 + ], + "hints": { + "index": 14781 + } + }, + { + "items": [ + 7921.5, + 5.4197001457214355 + ], + "hints": { + "index": 14782 + } + }, + { + "items": [ + 7922, + 6.7603001594543457 + ], + "hints": { + "index": 14783 + } + }, + { + "items": [ + 7922.5, + 8.5044002532958984 + ], + "hints": { + "index": 14784 + } + }, + { + "items": [ + 7923, + 7.3924999237060547 + ], + "hints": { + "index": 14785 + } + }, + { + "items": [ + 7923.5, + 5.1347 + ], + "hints": { + "index": 14786 + } + }, + { + "items": [ + 7924, + 4.1058998107910156 + ], + "hints": { + "index": 14787 + } + }, + { + "items": [ + 7924.5, + 3.6719 + ], + "hints": { + "index": 14788 + } + }, + { + "items": [ + 7925, + 3.6414000988006592 + ], + "hints": { + "index": 14789 + } + }, + { + "items": [ + 7925.5, + 3.7354 + ], + "hints": { + "index": 14790 + } + }, + { + "items": [ + 7926, + 4.4025001525878906 + ], + "hints": { + "index": 14791 + } + }, + { + "items": [ + 7926.5, + 5.4351000785827637 + ], + "hints": { + "index": 14792 + } + }, + { + "items": [ + 7927, + 5.486299991607666 + ], + "hints": { + "index": 14793 + } + }, + { + "items": [ + 7927.5, + 4.6194 + ], + "hints": { + "index": 14794 + } + }, + { + "items": [ + 7928, + 4.4685001373291016 + ], + "hints": { + "index": 14795 + } + }, + { + "items": [ + 7928.5, + 4.2340998649597168 + ], + "hints": { + "index": 14796 + } + }, + { + "items": [ + 7929, + 4.2488999366760254 + ], + "hints": { + "index": 14797 + } + }, + { + "items": [ + 7929.5, + 4.0182 + ], + "hints": { + "index": 14798 + } + }, + { + "items": [ + 7930, + 4.5725998878479 + ], + "hints": { + "index": 14799 + } + }, + { + "items": [ + 7930.5, + 5.427800178527832 + ], + "hints": { + "index": 14800 + } + }, + { + "items": [ + 7931, + 5.60860013961792 + ], + "hints": { + "index": 14801 + } + }, + { + "items": [ + 7931.5, + 5.0477 + ], + "hints": { + "index": 14802 + } + }, + { + "items": [ + 7932, + 4.5545001029968262 + ], + "hints": { + "index": 14803 + } + }, + { + "items": [ + 7932.5, + 4.7216 + ], + "hints": { + "index": 14804 + } + }, + { + "items": [ + 7933, + 5.0093998908996582 + ], + "hints": { + "index": 14805 + } + }, + { + "items": [ + 7933.5, + 4.7948 + ], + "hints": { + "index": 14806 + } + }, + { + "items": [ + 7934, + 4.3758001327514648 + ], + "hints": { + "index": 14807 + } + }, + { + "items": [ + 7934.5, + 4.1107997894287109 + ], + "hints": { + "index": 14808 + } + }, + { + "items": [ + 7935, + 4.1357998847961426 + ], + "hints": { + "index": 14809 + } + }, + { + "items": [ + 7935.5, + 4.1453 + ], + "hints": { + "index": 14810 + } + }, + { + "items": [ + 7936, + 4.1848998069763184 + ], + "hints": { + "index": 14811 + } + }, + { + "items": [ + 7936.5, + 4.2157001495361328 + ], + "hints": { + "index": 14812 + } + }, + { + "items": [ + 7937, + 4.4295001029968262 + ], + "hints": { + "index": 14813 + } + }, + { + "items": [ + 7937.5, + 4.4739999771118164 + ], + "hints": { + "index": 14814 + } + }, + { + "items": [ + 7938, + 4.5313000679016113 + ], + "hints": { + "index": 14815 + } + }, + { + "items": [ + 7938.5, + 4.7456998825073242 + ], + "hints": { + "index": 14816 + } + }, + { + "items": [ + 7939, + 4.9116 + ], + "hints": { + "index": 14817 + } + }, + { + "items": [ + 7939.5, + 5.2145 + ], + "hints": { + "index": 14818 + } + }, + { + "items": [ + 7940, + 5.2683 + ], + "hints": { + "index": 14819 + } + }, + { + "items": [ + 7940.5, + 5.4417 + ], + "hints": { + "index": 14820 + } + }, + { + "items": [ + 7941, + 5.3873 + ], + "hints": { + "index": 14821 + } + }, + { + "items": [ + 7941.5, + 5.3941 + ], + "hints": { + "index": 14822 + } + }, + { + "items": [ + 7942, + 5.155 + ], + "hints": { + "index": 14823 + } + }, + { + "items": [ + 7942.5, + 5.0837 + ], + "hints": { + "index": 14824 + } + }, + { + "items": [ + 7943, + 5.2846 + ], + "hints": { + "index": 14825 + } + }, + { + "items": [ + 7943.5, + 5.3366999626159668 + ], + "hints": { + "index": 14826 + } + }, + { + "items": [ + 7944, + 5.0030999183654785 + ], + "hints": { + "index": 14827 + } + }, + { + "items": [ + 7944.5, + 4.4175000190734863 + ], + "hints": { + "index": 14828 + } + }, + { + "items": [ + 7945, + 4.1216001510620117 + ], + "hints": { + "index": 14829 + } + }, + { + "items": [ + 7945.5, + 4.095099925994873 + ], + "hints": { + "index": 14830 + } + }, + { + "items": [ + 7946, + 4.2378997802734375 + ], + "hints": { + "index": 14831 + } + }, + { + "items": [ + 7946.5, + 3.9061000347137447 + ], + "hints": { + "index": 14832 + } + }, + { + "items": [ + 7947, + 3.6480998992919922 + ], + "hints": { + "index": 14833 + } + }, + { + "items": [ + 7947.5, + 3.2239000797271729 + ], + "hints": { + "index": 14834 + } + }, + { + "items": [ + 7948, + 3.276900053024292 + ], + "hints": { + "index": 14835 + } + }, + { + "items": [ + 7948.5, + 3.3712000846862793 + ], + "hints": { + "index": 14836 + } + }, + { + "items": [ + 7949, + 3.3352999687194824 + ], + "hints": { + "index": 14837 + } + }, + { + "items": [ + 7949.5, + 3.3259999752044682 + ], + "hints": { + "index": 14838 + } + }, + { + "items": [ + 7950, + 3.0580999851226807 + ], + "hints": { + "index": 14839 + } + }, + { + "items": [ + 7950.5, + 3.1294000148773193 + ], + "hints": { + "index": 14840 + } + }, + { + "items": [ + 7951, + 3.1791000366210938 + ], + "hints": { + "index": 14841 + } + }, + { + "items": [ + 7951.5, + 3.216900110244751 + ], + "hints": { + "index": 14842 + } + }, + { + "items": [ + 7952, + 3.0576999187469478 + ], + "hints": { + "index": 14843 + } + }, + { + "items": [ + 7952.5, + 2.8004000186920166 + ], + "hints": { + "index": 14844 + } + }, + { + "items": [ + 7953, + 2.8540000915527344 + ], + "hints": { + "index": 14845 + } + }, + { + "items": [ + 7953.5, + 2.8763999938964844 + ], + "hints": { + "index": 14846 + } + }, + { + "items": [ + 7954, + 3.1438999176025391 + ], + "hints": { + "index": 14847 + } + }, + { + "items": [ + 7954.5, + 3.5278999805450439 + ], + "hints": { + "index": 14848 + } + }, + { + "items": [ + 7955, + 4.0254998207092285 + ], + "hints": { + "index": 14849 + } + }, + { + "items": [ + 7955.5, + 4.3558 + ], + "hints": { + "index": 14850 + } + }, + { + "items": [ + 7956, + 3.8794 + ], + "hints": { + "index": 14851 + } + }, + { + "items": [ + 7956.5, + 3.5771 + ], + "hints": { + "index": 14852 + } + }, + { + "items": [ + 7957, + 3.2162 + ], + "hints": { + "index": 14853 + } + }, + { + "items": [ + 7957.5, + 3.1648 + ], + "hints": { + "index": 14854 + } + }, + { + "items": [ + 7958, + 3.0675 + ], + "hints": { + "index": 14855 + } + }, + { + "items": [ + 7958.5, + 3.1208 + ], + "hints": { + "index": 14856 + } + }, + { + "items": [ + 7959, + 3.2917 + ], + "hints": { + "index": 14857 + } + }, + { + "items": [ + 7959.5, + 3.4567999839782715 + ], + "hints": { + "index": 14858 + } + }, + { + "items": [ + 7960, + 3.5575 + ], + "hints": { + "index": 14859 + } + }, + { + "items": [ + 7960.5, + 3.5512 + ], + "hints": { + "index": 14860 + } + }, + { + "items": [ + 7961, + 3.5477 + ], + "hints": { + "index": 14861 + } + }, + { + "items": [ + 7961.5, + 3.6214 + ], + "hints": { + "index": 14862 + } + }, + { + "items": [ + 7962, + 4.8887 + ], + "hints": { + "index": 14863 + } + }, + { + "items": [ + 7962.5, + 8.2816 + ], + "hints": { + "index": 14864 + } + }, + { + "items": [ + 7963, + 12.7374 + ], + "hints": { + "index": 14865 + } + }, + { + "items": [ + 7963.5, + 17.2188 + ], + "hints": { + "index": 14866 + } + }, + { + "items": [ + 7964, + 17.7148 + ], + "hints": { + "index": 14867 + } + }, + { + "items": [ + 7964.5, + 18.8814 + ], + "hints": { + "index": 14868 + } + }, + { + "items": [ + 7965, + 17.4229 + ], + "hints": { + "index": 14869 + } + }, + { + "items": [ + 7965.5, + 10.9173 + ], + "hints": { + "index": 14870 + } + }, + { + "items": [ + 7966, + 7.1073 + ], + "hints": { + "index": 14871 + } + }, + { + "items": [ + 7966.5, + 6.3003 + ], + "hints": { + "index": 14872 + } + }, + { + "items": [ + 7967, + 7.1086 + ], + "hints": { + "index": 14873 + } + }, + { + "items": [ + 7967.5, + 7.7393999099731436 + ], + "hints": { + "index": 14874 + } + }, + { + "items": [ + 7968, + 8.4043 + ], + "hints": { + "index": 14875 + } + }, + { + "items": [ + 7968.5, + 9.8453 + ], + "hints": { + "index": 14876 + } + }, + { + "items": [ + 7969, + 10.5958 + ], + "hints": { + "index": 14877 + } + }, + { + "items": [ + 7969.5, + 11.346 + ], + "hints": { + "index": 14878 + } + }, + { + "items": [ + 7970, + 10.1153 + ], + "hints": { + "index": 14879 + } + }, + { + "items": [ + 7970.5, + 7.0875 + ], + "hints": { + "index": 14880 + } + }, + { + "items": [ + 7971, + 5.2264 + ], + "hints": { + "index": 14881 + } + }, + { + "items": [ + 7971.5, + 4.2130999565124512 + ], + "hints": { + "index": 14882 + } + }, + { + "items": [ + 7972, + 4.5502 + ], + "hints": { + "index": 14883 + } + }, + { + "items": [ + 7972.5, + 4.9512 + ], + "hints": { + "index": 14884 + } + }, + { + "items": [ + 7973, + 5.9019 + ], + "hints": { + "index": 14885 + } + }, + { + "items": [ + 7973.5, + 6.5601 + ], + "hints": { + "index": 14886 + } + }, + { + "items": [ + 7974, + 6.4468 + ], + "hints": { + "index": 14887 + } + }, + { + "items": [ + 7974.5, + 4.4821000099182129 + ], + "hints": { + "index": 14888 + } + }, + { + "items": [ + 7975, + 3.4116 + ], + "hints": { + "index": 14889 + } + }, + { + "items": [ + 7975.5, + 2.886 + ], + "hints": { + "index": 14890 + } + }, + { + "items": [ + 7976, + 2.9095 + ], + "hints": { + "index": 14891 + } + }, + { + "items": [ + 7976.5, + 3.0587 + ], + "hints": { + "index": 14892 + } + }, + { + "items": [ + 7977, + 3.3286 + ], + "hints": { + "index": 14893 + } + }, + { + "items": [ + 7977.5, + 3.8701000213623047 + ], + "hints": { + "index": 14894 + } + }, + { + "items": [ + 7978, + 4.4860000610351563 + ], + "hints": { + "index": 14895 + } + }, + { + "items": [ + 7978.5, + 4.9675 + ], + "hints": { + "index": 14896 + } + }, + { + "items": [ + 7979, + 4.6149001121521 + ], + "hints": { + "index": 14897 + } + }, + { + "items": [ + 7979.5, + 3.8691 + ], + "hints": { + "index": 14898 + } + }, + { + "items": [ + 7980, + 3.4732000827789307 + ], + "hints": { + "index": 14899 + } + }, + { + "items": [ + 7980.5, + 3.436500072479248 + ], + "hints": { + "index": 14900 + } + }, + { + "items": [ + 7981, + 3.6589000225067134 + ], + "hints": { + "index": 14901 + } + }, + { + "items": [ + 7981.5, + 3.8027 + ], + "hints": { + "index": 14902 + } + }, + { + "items": [ + 7982, + 4.0975 + ], + "hints": { + "index": 14903 + } + }, + { + "items": [ + 7982.5, + 4.3263001441955566 + ], + "hints": { + "index": 14904 + } + }, + { + "items": [ + 7983, + 4.3335 + ], + "hints": { + "index": 14905 + } + }, + { + "items": [ + 7983.5, + 3.68179988861084 + ], + "hints": { + "index": 14906 + } + }, + { + "items": [ + 7984, + 3.2857000827789307 + ], + "hints": { + "index": 14907 + } + }, + { + "items": [ + 7984.5, + 3.3210000991821289 + ], + "hints": { + "index": 14908 + } + }, + { + "items": [ + 7985, + 3.5991001129150391 + ], + "hints": { + "index": 14909 + } + }, + { + "items": [ + 7985.5, + 3.8443999290466313 + ], + "hints": { + "index": 14910 + } + }, + { + "items": [ + 7986, + 3.9566 + ], + "hints": { + "index": 14911 + } + }, + { + "items": [ + 7986.5, + 4.3188 + ], + "hints": { + "index": 14912 + } + }, + { + "items": [ + 7987, + 5.0382 + ], + "hints": { + "index": 14913 + } + }, + { + "items": [ + 7987.5, + 5.4723 + ], + "hints": { + "index": 14914 + } + }, + { + "items": [ + 7988, + 4.8482 + ], + "hints": { + "index": 14915 + } + }, + { + "items": [ + 7988.5, + 3.8302 + ], + "hints": { + "index": 14916 + } + }, + { + "items": [ + 7989, + 3.2644000053405762 + ], + "hints": { + "index": 14917 + } + }, + { + "items": [ + 7989.5, + 3.1724998950958252 + ], + "hints": { + "index": 14918 + } + }, + { + "items": [ + 7990, + 3.2077 + ], + "hints": { + "index": 14919 + } + }, + { + "items": [ + 7990.5, + 3.5337 + ], + "hints": { + "index": 14920 + } + }, + { + "items": [ + 7991, + 4.0364 + ], + "hints": { + "index": 14921 + } + }, + { + "items": [ + 7991.5, + 4.5038 + ], + "hints": { + "index": 14922 + } + }, + { + "items": [ + 7992, + 4.6743998527526855 + ], + "hints": { + "index": 14923 + } + }, + { + "items": [ + 7992.5, + 4.3593997955322266 + ], + "hints": { + "index": 14924 + } + }, + { + "items": [ + 7993, + 3.71370005607605 + ], + "hints": { + "index": 14925 + } + }, + { + "items": [ + 7993.5, + 3.2823998928070068 + ], + "hints": { + "index": 14926 + } + }, + { + "items": [ + 7994, + 3.2899 + ], + "hints": { + "index": 14927 + } + }, + { + "items": [ + 7994.5, + 4.06220006942749 + ], + "hints": { + "index": 14928 + } + }, + { + "items": [ + 7995, + 5.0922999382019043 + ], + "hints": { + "index": 14929 + } + }, + { + "items": [ + 7995.5, + 5.607600212097168 + ], + "hints": { + "index": 14930 + } + }, + { + "items": [ + 7996, + 5.495999813079834 + ], + "hints": { + "index": 14931 + } + }, + { + "items": [ + 7996.5, + 5.24 + ], + "hints": { + "index": 14932 + } + }, + { + "items": [ + 7997, + 4.32889986038208 + ], + "hints": { + "index": 14933 + } + }, + { + "items": [ + 7997.5, + 3.4439 + ], + "hints": { + "index": 14934 + } + }, + { + "items": [ + 7998, + 3.0067 + ], + "hints": { + "index": 14935 + } + }, + { + "items": [ + 7998.5, + 3.4346 + ], + "hints": { + "index": 14936 + } + }, + { + "items": [ + 7999, + 3.91100001335144 + ], + "hints": { + "index": 14937 + } + }, + { + "items": [ + 7999.5, + 4.4716 + ], + "hints": { + "index": 14938 + } + }, + { + "items": [ + 8000, + 4.8876 + ], + "hints": { + "index": 14939 + } + }, + { + "items": [ + 8000.5, + 5.2292 + ], + "hints": { + "index": 14940 + } + }, + { + "items": [ + 8001, + 4.9418001174926758 + ], + "hints": { + "index": 14941 + } + }, + { + "items": [ + 8001.5, + 4.2836 + ], + "hints": { + "index": 14942 + } + }, + { + "items": [ + 8002, + 3.8676 + ], + "hints": { + "index": 14943 + } + }, + { + "items": [ + 8002.5, + 3.6302 + ], + "hints": { + "index": 14944 + } + }, + { + "items": [ + 8003, + 4.072199821472168 + ], + "hints": { + "index": 14945 + } + }, + { + "items": [ + 8003.5, + 4.9814000129699707 + ], + "hints": { + "index": 14946 + } + }, + { + "items": [ + 8004, + 6.1750001907348633 + ], + "hints": { + "index": 14947 + } + }, + { + "items": [ + 8004.5, + 6.6895999908447266 + ], + "hints": { + "index": 14948 + } + }, + { + "items": [ + 8005, + 6.3192000389099121 + ], + "hints": { + "index": 14949 + } + }, + { + "items": [ + 8005.5, + 5.3562 + ], + "hints": { + "index": 14950 + } + }, + { + "items": [ + 8006, + 4.0135002136230469 + ], + "hints": { + "index": 14951 + } + }, + { + "items": [ + 8006.5, + 3.2671 + ], + "hints": { + "index": 14952 + } + }, + { + "items": [ + 8007, + 2.9195001125335693 + ], + "hints": { + "index": 14953 + } + }, + { + "items": [ + 8007.5, + 2.8915 + ], + "hints": { + "index": 14954 + } + }, + { + "items": [ + 8008, + 3.3071000576019287 + ], + "hints": { + "index": 14955 + } + }, + { + "items": [ + 8008.5, + 4.3207998275756836 + ], + "hints": { + "index": 14956 + } + }, + { + "items": [ + 8009, + 5.64300012588501 + ], + "hints": { + "index": 14957 + } + }, + { + "items": [ + 8009.5, + 6.2699 + ], + "hints": { + "index": 14958 + } + }, + { + "items": [ + 8010, + 5.5606999397277832 + ], + "hints": { + "index": 14959 + } + }, + { + "items": [ + 8010.5, + 4.7593 + ], + "hints": { + "index": 14960 + } + }, + { + "items": [ + 8011, + 3.8695 + ], + "hints": { + "index": 14961 + } + }, + { + "items": [ + 8011.5, + 4.2159 + ], + "hints": { + "index": 14962 + } + }, + { + "items": [ + 8012, + 4.8265 + ], + "hints": { + "index": 14963 + } + }, + { + "items": [ + 8012.5, + 5.8983 + ], + "hints": { + "index": 14964 + } + }, + { + "items": [ + 8013, + 6.0809 + ], + "hints": { + "index": 14965 + } + }, + { + "items": [ + 8013.5, + 6.6841001510620117 + ], + "hints": { + "index": 14966 + } + }, + { + "items": [ + 8014, + 7.4001998901367188 + ], + "hints": { + "index": 14967 + } + }, + { + "items": [ + 8014.5, + 5.9271 + ], + "hints": { + "index": 14968 + } + }, + { + "items": [ + 8015, + 4.0356001853942871 + ], + "hints": { + "index": 14969 + } + }, + { + "items": [ + 8015.5, + 3.0627999305725098 + ], + "hints": { + "index": 14970 + } + }, + { + "items": [ + 8016, + 2.8680000305175781 + ], + "hints": { + "index": 14971 + } + }, + { + "items": [ + 8016.5, + 2.9977 + ], + "hints": { + "index": 14972 + } + }, + { + "items": [ + 8017, + 3.7558000087738042 + ], + "hints": { + "index": 14973 + } + }, + { + "items": [ + 8017.5, + 4.811 + ], + "hints": { + "index": 14974 + } + }, + { + "items": [ + 8018, + 6.1413002014160156 + ], + "hints": { + "index": 14975 + } + }, + { + "items": [ + 8018.5, + 5.5342 + ], + "hints": { + "index": 14976 + } + }, + { + "items": [ + 8019, + 4.80709981918335 + ], + "hints": { + "index": 14977 + } + }, + { + "items": [ + 8019.5, + 4.0272998809814453 + ], + "hints": { + "index": 14978 + } + }, + { + "items": [ + 8020, + 3.3891 + ], + "hints": { + "index": 14979 + } + }, + { + "items": [ + 8020.5, + 3.8766999244689946 + ], + "hints": { + "index": 14980 + } + }, + { + "items": [ + 8021, + 5.133 + ], + "hints": { + "index": 14981 + } + }, + { + "items": [ + 8021.5, + 7.2133 + ], + "hints": { + "index": 14982 + } + }, + { + "items": [ + 8022, + 7.4643001556396484 + ], + "hints": { + "index": 14983 + } + }, + { + "items": [ + 8022.5, + 7.6246 + ], + "hints": { + "index": 14984 + } + }, + { + "items": [ + 8023, + 6.6612000465393066 + ], + "hints": { + "index": 14985 + } + }, + { + "items": [ + 8023.5, + 4.7957000732421875 + ], + "hints": { + "index": 14986 + } + }, + { + "items": [ + 8024, + 3.5011000633239746 + ], + "hints": { + "index": 14987 + } + }, + { + "items": [ + 8024.5, + 2.9336 + ], + "hints": { + "index": 14988 + } + }, + { + "items": [ + 8025, + 3.0178999900817871 + ], + "hints": { + "index": 14989 + } + }, + { + "items": [ + 8025.5, + 3.0151 + ], + "hints": { + "index": 14990 + } + }, + { + "items": [ + 8026, + 3.8187000751495361 + ], + "hints": { + "index": 14991 + } + }, + { + "items": [ + 8026.5, + 4.6764 + ], + "hints": { + "index": 14992 + } + }, + { + "items": [ + 8027, + 6.4441 + ], + "hints": { + "index": 14993 + } + }, + { + "items": [ + 8027.5, + 6.2284 + ], + "hints": { + "index": 14994 + } + }, + { + "items": [ + 8028, + 4.9523000717163086 + ], + "hints": { + "index": 14995 + } + }, + { + "items": [ + 8028.5, + 3.7287 + ], + "hints": { + "index": 14996 + } + }, + { + "items": [ + 8029, + 3.2813000679016113 + ], + "hints": { + "index": 14997 + } + }, + { + "items": [ + 8029.5, + 3.0985 + ], + "hints": { + "index": 14998 + } + }, + { + "items": [ + 8030, + 3.2404000759124756 + ], + "hints": { + "index": 14999 + } + }, + { + "items": [ + 8030.5, + 3.8094 + ], + "hints": { + "index": 15000 + } + }, + { + "items": [ + 8031, + 4.6182999610900879 + ], + "hints": { + "index": 15001 + } + }, + { + "items": [ + 8031.5, + 5.5135002136230469 + ], + "hints": { + "index": 15002 + } + }, + { + "items": [ + 8032, + 4.800300121307373 + ], + "hints": { + "index": 15003 + } + }, + { + "items": [ + 8032.5, + 3.8512 + ], + "hints": { + "index": 15004 + } + }, + { + "items": [ + 8033, + 3.1867001056671143 + ], + "hints": { + "index": 15005 + } + }, + { + "items": [ + 8033.5, + 2.9135000705718994 + ], + "hints": { + "index": 15006 + } + }, + { + "items": [ + 8034, + 3.0025 + ], + "hints": { + "index": 15007 + } + }, + { + "items": [ + 8034.5, + 3.203 + ], + "hints": { + "index": 15008 + } + }, + { + "items": [ + 8035, + 3.9721 + ], + "hints": { + "index": 15009 + } + }, + { + "items": [ + 8035.5, + 5.0597000122070313 + ], + "hints": { + "index": 15010 + } + }, + { + "items": [ + 8036, + 6.3271 + ], + "hints": { + "index": 15011 + } + }, + { + "items": [ + 8036.5, + 5.0297999382019043 + ], + "hints": { + "index": 15012 + } + }, + { + "items": [ + 8037, + 3.8554000854492192 + ], + "hints": { + "index": 15013 + } + }, + { + "items": [ + 8037.5, + 3.1296999454498291 + ], + "hints": { + "index": 15014 + } + }, + { + "items": [ + 8038, + 2.9935998916625977 + ], + "hints": { + "index": 15015 + } + }, + { + "items": [ + 8038.5, + 3.3527 + ], + "hints": { + "index": 15016 + } + }, + { + "items": [ + 8039, + 4.4611001014709473 + ], + "hints": { + "index": 15017 + } + }, + { + "items": [ + 8039.5, + 5.7419 + ], + "hints": { + "index": 15018 + } + }, + { + "items": [ + 8040, + 6.58519983291626 + ], + "hints": { + "index": 15019 + } + }, + { + "items": [ + 8040.5, + 6.5986 + ], + "hints": { + "index": 15020 + } + }, + { + "items": [ + 8041, + 5.9628 + ], + "hints": { + "index": 15021 + } + }, + { + "items": [ + 8041.5, + 4.799 + ], + "hints": { + "index": 15022 + } + }, + { + "items": [ + 8042, + 3.6918 + ], + "hints": { + "index": 15023 + } + }, + { + "items": [ + 8042.5, + 3.252000093460083 + ], + "hints": { + "index": 15024 + } + }, + { + "items": [ + 8043, + 3.3188 + ], + "hints": { + "index": 15025 + } + }, + { + "items": [ + 8043.5, + 3.8821 + ], + "hints": { + "index": 15026 + } + }, + { + "items": [ + 8044, + 4.68720006942749 + ], + "hints": { + "index": 15027 + } + }, + { + "items": [ + 8044.5, + 6.203 + ], + "hints": { + "index": 15028 + } + }, + { + "items": [ + 8045, + 6.9415998458862305 + ], + "hints": { + "index": 15029 + } + }, + { + "items": [ + 8045.5, + 6.5348 + ], + "hints": { + "index": 15030 + } + }, + { + "items": [ + 8046, + 4.9158 + ], + "hints": { + "index": 15031 + } + }, + { + "items": [ + 8046.5, + 3.8866 + ], + "hints": { + "index": 15032 + } + }, + { + "items": [ + 8047, + 3.2835 + ], + "hints": { + "index": 15033 + } + }, + { + "items": [ + 8047.5, + 3.146 + ], + "hints": { + "index": 15034 + } + }, + { + "items": [ + 8048, + 3.4382 + ], + "hints": { + "index": 15035 + } + }, + { + "items": [ + 8048.5, + 4.1529 + ], + "hints": { + "index": 15036 + } + }, + { + "items": [ + 8049, + 5.174799919128418 + ], + "hints": { + "index": 15037 + } + }, + { + "items": [ + 8049.5, + 6.2699 + ], + "hints": { + "index": 15038 + } + }, + { + "items": [ + 8050, + 6.2972 + ], + "hints": { + "index": 15039 + } + }, + { + "items": [ + 8050.5, + 5.9297 + ], + "hints": { + "index": 15040 + } + }, + { + "items": [ + 8051, + 4.2993 + ], + "hints": { + "index": 15041 + } + }, + { + "items": [ + 8051.5, + 3.5999999046325684 + ], + "hints": { + "index": 15042 + } + }, + { + "items": [ + 8052, + 3.5523 + ], + "hints": { + "index": 15043 + } + }, + { + "items": [ + 8052.5, + 4.2559 + ], + "hints": { + "index": 15044 + } + }, + { + "items": [ + 8053, + 5.0556 + ], + "hints": { + "index": 15045 + } + }, + { + "items": [ + 8053.5, + 5.3812 + ], + "hints": { + "index": 15046 + } + }, + { + "items": [ + 8054, + 5.9611 + ], + "hints": { + "index": 15047 + } + }, + { + "items": [ + 8054.5, + 5.8103 + ], + "hints": { + "index": 15048 + } + }, + { + "items": [ + 8055, + 5.007 + ], + "hints": { + "index": 15049 + } + }, + { + "items": [ + 8055.5, + 3.7149999141693111 + ], + "hints": { + "index": 15050 + } + }, + { + "items": [ + 8056, + 3.2343 + ], + "hints": { + "index": 15051 + } + }, + { + "items": [ + 8056.5, + 3.1110000610351558 + ], + "hints": { + "index": 15052 + } + }, + { + "items": [ + 8057, + 3.6732 + ], + "hints": { + "index": 15053 + } + }, + { + "items": [ + 8057.5, + 4.7645 + ], + "hints": { + "index": 15054 + } + }, + { + "items": [ + 8058, + 6.5953001976013184 + ], + "hints": { + "index": 15055 + } + }, + { + "items": [ + 8058.5, + 8.1042995452880859 + ], + "hints": { + "index": 15056 + } + }, + { + "items": [ + 8059, + 8.1624002456665039 + ], + "hints": { + "index": 15057 + } + }, + { + "items": [ + 8059.5, + 6.5020999908447266 + ], + "hints": { + "index": 15058 + } + }, + { + "items": [ + 8060, + 4.5489997863769531 + ], + "hints": { + "index": 15059 + } + }, + { + "items": [ + 8060.5, + 3.6607 + ], + "hints": { + "index": 15060 + } + }, + { + "items": [ + 8061, + 3.3863999843597412 + ], + "hints": { + "index": 15061 + } + }, + { + "items": [ + 8061.5, + 3.4644999504089355 + ], + "hints": { + "index": 15062 + } + }, + { + "items": [ + 8062, + 3.7790999412536626 + ], + "hints": { + "index": 15063 + } + }, + { + "items": [ + 8062.5, + 4.47130012512207 + ], + "hints": { + "index": 15064 + } + }, + { + "items": [ + 8063, + 4.8972997665405273 + ], + "hints": { + "index": 15065 + } + }, + { + "items": [ + 8063.5, + 4.3818 + ], + "hints": { + "index": 15066 + } + }, + { + "items": [ + 8064, + 3.4300000667572021 + ], + "hints": { + "index": 15067 + } + }, + { + "items": [ + 8064.5, + 3.1043000221252441 + ], + "hints": { + "index": 15068 + } + }, + { + "items": [ + 8065, + 3.0715999603271484 + ], + "hints": { + "index": 15069 + } + }, + { + "items": [ + 8065.5, + 3.7995998859405522 + ], + "hints": { + "index": 15070 + } + }, + { + "items": [ + 8066, + 4.5604000091552734 + ], + "hints": { + "index": 15071 + } + }, + { + "items": [ + 8066.5, + 5.6774001121521 + ], + "hints": { + "index": 15072 + } + }, + { + "items": [ + 8067, + 5.5117998123168945 + ], + "hints": { + "index": 15073 + } + }, + { + "items": [ + 8067.5, + 5.258699893951416 + ], + "hints": { + "index": 15074 + } + }, + { + "items": [ + 8068, + 3.9876999855041504 + ], + "hints": { + "index": 15075 + } + }, + { + "items": [ + 8068.5, + 3.181 + ], + "hints": { + "index": 15076 + } + }, + { + "items": [ + 8069, + 2.7174999713897705 + ], + "hints": { + "index": 15077 + } + }, + { + "items": [ + 8069.5, + 2.765300035476685 + ], + "hints": { + "index": 15078 + } + }, + { + "items": [ + 8070, + 2.8698999881744385 + ], + "hints": { + "index": 15079 + } + }, + { + "items": [ + 8070.5, + 3.3164000511169434 + ], + "hints": { + "index": 15080 + } + }, + { + "items": [ + 8071, + 4.0619001388549805 + ], + "hints": { + "index": 15081 + } + }, + { + "items": [ + 8071.5, + 4.6496000289916992 + ], + "hints": { + "index": 15082 + } + }, + { + "items": [ + 8072, + 4.5282998085021973 + ], + "hints": { + "index": 15083 + } + }, + { + "items": [ + 8072.5, + 3.836 + ], + "hints": { + "index": 15084 + } + }, + { + "items": [ + 8073, + 3.3848 + ], + "hints": { + "index": 15085 + } + }, + { + "items": [ + 8073.5, + 3.1310999393463135 + ], + "hints": { + "index": 15086 + } + }, + { + "items": [ + 8074, + 2.9718999862670894 + ], + "hints": { + "index": 15087 + } + }, + { + "items": [ + 8074.5, + 2.9902999401092529 + ], + "hints": { + "index": 15088 + } + }, + { + "items": [ + 8075, + 2.9753999710083008 + ], + "hints": { + "index": 15089 + } + }, + { + "items": [ + 8075.5, + 3.0824999809265137 + ], + "hints": { + "index": 15090 + } + }, + { + "items": [ + 8076, + 3.214400053024292 + ], + "hints": { + "index": 15091 + } + }, + { + "items": [ + 8076.5, + 3.1803998947143555 + ], + "hints": { + "index": 15092 + } + }, + { + "items": [ + 8077, + 2.942500114440918 + ], + "hints": { + "index": 15093 + } + }, + { + "items": [ + 8077.5, + 2.8096001148223877 + ], + "hints": { + "index": 15094 + } + }, + { + "items": [ + 8078, + 2.8097999095916748 + ], + "hints": { + "index": 15095 + } + }, + { + "items": [ + 8078.5, + 2.7916998863220215 + ], + "hints": { + "index": 15096 + } + }, + { + "items": [ + 8079, + 2.7630000114440918 + ], + "hints": { + "index": 15097 + } + }, + { + "items": [ + 8079.5, + 2.7170999050140381 + ], + "hints": { + "index": 15098 + } + }, + { + "items": [ + 8080, + 2.799299955368042 + ], + "hints": { + "index": 15099 + } + }, + { + "items": [ + 8080.5, + 2.8406999111175537 + ], + "hints": { + "index": 15100 + } + }, + { + "items": [ + 8081, + 2.8940000534057617 + ], + "hints": { + "index": 15101 + } + }, + { + "items": [ + 8081.5, + 2.9037001132965088 + ], + "hints": { + "index": 15102 + } + }, + { + "items": [ + 8082, + 3.1526999473571777 + ], + "hints": { + "index": 15103 + } + }, + { + "items": [ + 8082.5, + 3.7186999320983887 + ], + "hints": { + "index": 15104 + } + }, + { + "items": [ + 8083, + 4.3032999038696289 + ], + "hints": { + "index": 15105 + } + }, + { + "items": [ + 8083.5, + 4.2729997634887695 + ], + "hints": { + "index": 15106 + } + }, + { + "items": [ + 8084, + 4.6075000762939453 + ], + "hints": { + "index": 15107 + } + }, + { + "items": [ + 8084.5, + 4.649899959564209 + ], + "hints": { + "index": 15108 + } + }, + { + "items": [ + 8085, + 5.43209981918335 + ], + "hints": { + "index": 15109 + } + }, + { + "items": [ + 8085.5, + 5.1083998680114746 + ], + "hints": { + "index": 15110 + } + }, + { + "items": [ + 8086, + 5.5328001976013184 + ], + "hints": { + "index": 15111 + } + }, + { + "items": [ + 8086.5, + 5.316500186920166 + ], + "hints": { + "index": 15112 + } + }, + { + "items": [ + 8087, + 4.9629998207092285 + ], + "hints": { + "index": 15113 + } + }, + { + "items": [ + 8087.5, + 4.9341001510620117 + ], + "hints": { + "index": 15114 + } + }, + { + "items": [ + 8088, + 4.492499828338623 + ], + "hints": { + "index": 15115 + } + }, + { + "items": [ + 8088.5, + 4.2093000411987305 + ], + "hints": { + "index": 15116 + } + }, + { + "items": [ + 8089, + 3.5903000831604004 + ], + "hints": { + "index": 15117 + } + }, + { + "items": [ + 8089.5, + 3.4144001007080078 + ], + "hints": { + "index": 15118 + } + }, + { + "items": [ + 8090, + 3.3977000713348389 + ], + "hints": { + "index": 15119 + } + }, + { + "items": [ + 8090.5, + 3.3364999294281006 + ], + "hints": { + "index": 15120 + } + }, + { + "items": [ + 8091, + 3.197700023651123 + ], + "hints": { + "index": 15121 + } + }, + { + "items": [ + 8091.5, + 3.074199914932251 + ], + "hints": { + "index": 15122 + } + }, + { + "items": [ + 8092, + 3.0438001155853271 + ], + "hints": { + "index": 15123 + } + }, + { + "items": [ + 8092.5, + 3.1071000099182129 + ], + "hints": { + "index": 15124 + } + }, + { + "items": [ + 8093, + 3.0455999374389648 + ], + "hints": { + "index": 15125 + } + }, + { + "items": [ + 8093.5, + 3.2283999919891357 + ], + "hints": { + "index": 15126 + } + }, + { + "items": [ + 8094, + 3.3812000751495361 + ], + "hints": { + "index": 15127 + } + }, + { + "items": [ + 8094.5, + 3.5146999359130859 + ], + "hints": { + "index": 15128 + } + }, + { + "items": [ + 8095, + 3.2012999057769775 + ], + "hints": { + "index": 15129 + } + }, + { + "items": [ + 8095.5, + 2.87719988822937 + ], + "hints": { + "index": 15130 + } + }, + { + "items": [ + 8096, + 2.8412001132965088 + ], + "hints": { + "index": 15131 + } + }, + { + "items": [ + 8096.5, + 2.9407999515533447 + ], + "hints": { + "index": 15132 + } + }, + { + "items": [ + 8097, + 3.2579998970031734 + ], + "hints": { + "index": 15133 + } + }, + { + "items": [ + 8097.5, + 4.0595002174377441 + ], + "hints": { + "index": 15134 + } + }, + { + "items": [ + 8098, + 5.2950000762939453 + ], + "hints": { + "index": 15135 + } + }, + { + "items": [ + 8098.5, + 6.4977998733520508 + ], + "hints": { + "index": 15136 + } + }, + { + "items": [ + 8099, + 6.30210018157959 + ], + "hints": { + "index": 15137 + } + }, + { + "items": [ + 8099.5, + 5.05709981918335 + ], + "hints": { + "index": 15138 + } + }, + { + "items": [ + 8100, + 3.9224998950958256 + ], + "hints": { + "index": 15139 + } + }, + { + "items": [ + 8100.5, + 3.2650001049041748 + ], + "hints": { + "index": 15140 + } + }, + { + "items": [ + 8101, + 3.1482000350952148 + ], + "hints": { + "index": 15141 + } + }, + { + "items": [ + 8101.5, + 3.3289000988006592 + ], + "hints": { + "index": 15142 + } + }, + { + "items": [ + 8102, + 3.8324000835418706 + ], + "hints": { + "index": 15143 + } + }, + { + "items": [ + 8102.5, + 4.7982997894287109 + ], + "hints": { + "index": 15144 + } + }, + { + "items": [ + 8103, + 5.7671999931335449 + ], + "hints": { + "index": 15145 + } + }, + { + "items": [ + 8103.5, + 6.4447999000549316 + ], + "hints": { + "index": 15146 + } + }, + { + "items": [ + 8104, + 6.2241001129150391 + ], + "hints": { + "index": 15147 + } + }, + { + "items": [ + 8104.5, + 5.3105998039245605 + ], + "hints": { + "index": 15148 + } + }, + { + "items": [ + 8105, + 4.379 + ], + "hints": { + "index": 15149 + } + }, + { + "items": [ + 8105.5, + 4.7364 + ], + "hints": { + "index": 15150 + } + }, + { + "items": [ + 8106, + 6.0609 + ], + "hints": { + "index": 15151 + } + }, + { + "items": [ + 8106.5, + 8.1261 + ], + "hints": { + "index": 15152 + } + }, + { + "items": [ + 8107, + 8.9893 + ], + "hints": { + "index": 15153 + } + }, + { + "items": [ + 8107.5, + 8.9686 + ], + "hints": { + "index": 15154 + } + }, + { + "items": [ + 8108, + 8.8993 + ], + "hints": { + "index": 15155 + } + }, + { + "items": [ + 8108.5, + 6.4023 + ], + "hints": { + "index": 15156 + } + }, + { + "items": [ + 8109, + 4.7413 + ], + "hints": { + "index": 15157 + } + }, + { + "items": [ + 8109.5, + 3.6953 + ], + "hints": { + "index": 15158 + } + }, + { + "items": [ + 8110, + 4.0115 + ], + "hints": { + "index": 15159 + } + }, + { + "items": [ + 8110.5, + 5.0175 + ], + "hints": { + "index": 15160 + } + }, + { + "items": [ + 8111, + 6.9479 + ], + "hints": { + "index": 15161 + } + }, + { + "items": [ + 8111.5, + 8.2121 + ], + "hints": { + "index": 15162 + } + }, + { + "items": [ + 8112, + 8.5746 + ], + "hints": { + "index": 15163 + } + }, + { + "items": [ + 8112.5, + 8.036 + ], + "hints": { + "index": 15164 + } + }, + { + "items": [ + 8113, + 7.0265 + ], + "hints": { + "index": 15165 + } + }, + { + "items": [ + 8113.5, + 5.2033 + ], + "hints": { + "index": 15166 + } + }, + { + "items": [ + 8114, + 4.4718 + ], + "hints": { + "index": 15167 + } + }, + { + "items": [ + 8114.5, + 4.5256 + ], + "hints": { + "index": 15168 + } + }, + { + "items": [ + 8115, + 5.1064 + ], + "hints": { + "index": 15169 + } + }, + { + "items": [ + 8115.5, + 5.3453 + ], + "hints": { + "index": 15170 + } + }, + { + "items": [ + 8116, + 5.94 + ], + "hints": { + "index": 15171 + } + }, + { + "items": [ + 8116.5, + 6.8367 + ], + "hints": { + "index": 15172 + } + }, + { + "items": [ + 8117, + 5.9569 + ], + "hints": { + "index": 15173 + } + }, + { + "items": [ + 8117.5, + 4.3224 + ], + "hints": { + "index": 15174 + } + }, + { + "items": [ + 8118, + 3.4429 + ], + "hints": { + "index": 15175 + } + }, + { + "items": [ + 8118.5, + 3.2784 + ], + "hints": { + "index": 15176 + } + }, + { + "items": [ + 8119, + 3.2065 + ], + "hints": { + "index": 15177 + } + }, + { + "items": [ + 8119.5, + 3.7579 + ], + "hints": { + "index": 15178 + } + }, + { + "items": [ + 8120, + 4.7054 + ], + "hints": { + "index": 15179 + } + }, + { + "items": [ + 8120.5, + 6.3712 + ], + "hints": { + "index": 15180 + } + }, + { + "items": [ + 8121, + 7.0627 + ], + "hints": { + "index": 15181 + } + }, + { + "items": [ + 8121.5, + 6.6075 + ], + "hints": { + "index": 15182 + } + }, + { + "items": [ + 8122, + 4.8243 + ], + "hints": { + "index": 15183 + } + }, + { + "items": [ + 8122.5, + 3.8388 + ], + "hints": { + "index": 15184 + } + }, + { + "items": [ + 8123, + 3.2385 + ], + "hints": { + "index": 15185 + } + }, + { + "items": [ + 8123.5, + 3.316 + ], + "hints": { + "index": 15186 + } + }, + { + "items": [ + 8124, + 3.5186 + ], + "hints": { + "index": 15187 + } + }, + { + "items": [ + 8124.5, + 5.1655 + ], + "hints": { + "index": 15188 + } + }, + { + "items": [ + 8125, + 6.917 + ], + "hints": { + "index": 15189 + } + }, + { + "items": [ + 8125.5, + 8.9758 + ], + "hints": { + "index": 15190 + } + }, + { + "items": [ + 8126, + 7.0713 + ], + "hints": { + "index": 15191 + } + }, + { + "items": [ + 8126.5, + 5.9734 + ], + "hints": { + "index": 15192 + } + }, + { + "items": [ + 8127, + 4.6791 + ], + "hints": { + "index": 15193 + } + }, + { + "items": [ + 8127.5, + 5.1281 + ], + "hints": { + "index": 15194 + } + }, + { + "items": [ + 8128, + 7.1662 + ], + "hints": { + "index": 15195 + } + }, + { + "items": [ + 8128.5, + 10.5238 + ], + "hints": { + "index": 15196 + } + }, + { + "items": [ + 8129, + 13.6127 + ], + "hints": { + "index": 15197 + } + }, + { + "items": [ + 8129.5, + 14.4908 + ], + "hints": { + "index": 15198 + } + }, + { + "items": [ + 8130, + 13.8752 + ], + "hints": { + "index": 15199 + } + }, + { + "items": [ + 8130.5, + 9.3252 + ], + "hints": { + "index": 15200 + } + }, + { + "items": [ + 8131, + 5.553 + ], + "hints": { + "index": 15201 + } + }, + { + "items": [ + 8131.5, + 4.4616 + ], + "hints": { + "index": 15202 + } + }, + { + "items": [ + 8132, + 4.513 + ], + "hints": { + "index": 15203 + } + }, + { + "items": [ + 8132.5, + 4.4857 + ], + "hints": { + "index": 15204 + } + }, + { + "items": [ + 8133, + 5.7891 + ], + "hints": { + "index": 15205 + } + }, + { + "items": [ + 8133.5, + 6.6036 + ], + "hints": { + "index": 15206 + } + }, + { + "items": [ + 8134, + 8.2825 + ], + "hints": { + "index": 15207 + } + }, + { + "items": [ + 8134.5, + 6.8136000633239746 + ], + "hints": { + "index": 15208 + } + }, + { + "items": [ + 8135, + 6.4332 + ], + "hints": { + "index": 15209 + } + }, + { + "items": [ + 8135.5, + 5.9407 + ], + "hints": { + "index": 15210 + } + }, + { + "items": [ + 8136, + 5.6449 + ], + "hints": { + "index": 15211 + } + }, + { + "items": [ + 8136.5, + 5.6434 + ], + "hints": { + "index": 15212 + } + }, + { + "items": [ + 8137, + 6.102 + ], + "hints": { + "index": 15213 + } + }, + { + "items": [ + 8137.5, + 6.7051 + ], + "hints": { + "index": 15214 + } + }, + { + "items": [ + 8138, + 7.7157 + ], + "hints": { + "index": 15215 + } + }, + { + "items": [ + 8138.5, + 6.7575 + ], + "hints": { + "index": 15216 + } + }, + { + "items": [ + 8139, + 5.2922 + ], + "hints": { + "index": 15217 + } + }, + { + "items": [ + 8139.5, + 4.419 + ], + "hints": { + "index": 15218 + } + }, + { + "items": [ + 8140, + 4.4793 + ], + "hints": { + "index": 15219 + } + }, + { + "items": [ + 8140.5, + 4.8117 + ], + "hints": { + "index": 15220 + } + }, + { + "items": [ + 8141, + 4.1495 + ], + "hints": { + "index": 15221 + } + }, + { + "items": [ + 8141.5, + 3.6485 + ], + "hints": { + "index": 15222 + } + }, + { + "items": [ + 8142, + 3.5949 + ], + "hints": { + "index": 15223 + } + }, + { + "items": [ + 8142.5, + 4.2786 + ], + "hints": { + "index": 15224 + } + }, + { + "items": [ + 8143, + 5.3319 + ], + "hints": { + "index": 15225 + } + }, + { + "items": [ + 8143.5, + 5.2195 + ], + "hints": { + "index": 15226 + } + }, + { + "items": [ + 8144, + 4.0283 + ], + "hints": { + "index": 15227 + } + }, + { + "items": [ + 8144.5, + 3.1847 + ], + "hints": { + "index": 15228 + } + }, + { + "items": [ + 8145, + 2.9307 + ], + "hints": { + "index": 15229 + } + }, + { + "items": [ + 8145.5, + 2.9164 + ], + "hints": { + "index": 15230 + } + }, + { + "items": [ + 8146, + 2.9073 + ], + "hints": { + "index": 15231 + } + }, + { + "items": [ + 8146.5, + 2.8755 + ], + "hints": { + "index": 15232 + } + }, + { + "items": [ + 8147, + 3.1676 + ], + "hints": { + "index": 15233 + } + }, + { + "items": [ + 8147.5, + 3.2399 + ], + "hints": { + "index": 15234 + } + }, + { + "items": [ + 8148, + 3.384 + ], + "hints": { + "index": 15235 + } + }, + { + "items": [ + 8148.5, + 3.059 + ], + "hints": { + "index": 15236 + } + }, + { + "items": [ + 8149, + 3.0342 + ], + "hints": { + "index": 15237 + } + }, + { + "items": [ + 8149.5, + 2.8967 + ], + "hints": { + "index": 15238 + } + }, + { + "items": [ + 8150, + 3.0638 + ], + "hints": { + "index": 15239 + } + }, + { + "items": [ + 8150.5, + 3.4276 + ], + "hints": { + "index": 15240 + } + }, + { + "items": [ + 8151, + 3.9794 + ], + "hints": { + "index": 15241 + } + }, + { + "items": [ + 8151.5, + 4.5059 + ], + "hints": { + "index": 15242 + } + }, + { + "items": [ + 8152, + 4.9424 + ], + "hints": { + "index": 15243 + } + }, + { + "items": [ + 8152.5, + 4.9527 + ], + "hints": { + "index": 15244 + } + }, + { + "items": [ + 8153, + 4.3721 + ], + "hints": { + "index": 15245 + } + }, + { + "items": [ + 8153.5, + 3.6194 + ], + "hints": { + "index": 15246 + } + }, + { + "items": [ + 8154, + 3.2848 + ], + "hints": { + "index": 15247 + } + }, + { + "items": [ + 8154.5, + 3.3488 + ], + "hints": { + "index": 15248 + } + }, + { + "items": [ + 8155, + 3.8384 + ], + "hints": { + "index": 15249 + } + }, + { + "items": [ + 8155.5, + 4.4478 + ], + "hints": { + "index": 15250 + } + }, + { + "items": [ + 8156, + 5.2369 + ], + "hints": { + "index": 15251 + } + }, + { + "items": [ + 8156.5, + 5.3963 + ], + "hints": { + "index": 15252 + } + }, + { + "items": [ + 8157, + 5.1693 + ], + "hints": { + "index": 15253 + } + }, + { + "items": [ + 8157.5, + 4.4378 + ], + "hints": { + "index": 15254 + } + }, + { + "items": [ + 8158, + 3.7846 + ], + "hints": { + "index": 15255 + } + }, + { + "items": [ + 8158.5, + 3.4772 + ], + "hints": { + "index": 15256 + } + }, + { + "items": [ + 8159, + 4.0907 + ], + "hints": { + "index": 15257 + } + }, + { + "items": [ + 8159.5, + 4.9587 + ], + "hints": { + "index": 15258 + } + }, + { + "items": [ + 8160, + 5.8764 + ], + "hints": { + "index": 15259 + } + }, + { + "items": [ + 8160.5, + 5.648 + ], + "hints": { + "index": 15260 + } + }, + { + "items": [ + 8161, + 5.5451 + ], + "hints": { + "index": 15261 + } + }, + { + "items": [ + 8161.5, + 4.6121 + ], + "hints": { + "index": 15262 + } + }, + { + "items": [ + 8162, + 3.7043 + ], + "hints": { + "index": 15263 + } + }, + { + "items": [ + 8162.5, + 3.0185 + ], + "hints": { + "index": 15264 + } + }, + { + "items": [ + 8163, + 2.9565 + ], + "hints": { + "index": 15265 + } + }, + { + "items": [ + 8163.5, + 3.1158 + ], + "hints": { + "index": 15266 + } + }, + { + "items": [ + 8164, + 3.7967 + ], + "hints": { + "index": 15267 + } + }, + { + "items": [ + 8164.5, + 4.9377 + ], + "hints": { + "index": 15268 + } + }, + { + "items": [ + 8165, + 5.9872 + ], + "hints": { + "index": 15269 + } + }, + { + "items": [ + 8165.5, + 5.8854 + ], + "hints": { + "index": 15270 + } + }, + { + "items": [ + 8166, + 5.266 + ], + "hints": { + "index": 15271 + } + }, + { + "items": [ + 8166.5, + 5.2596 + ], + "hints": { + "index": 15272 + } + }, + { + "items": [ + 8167, + 6.3481 + ], + "hints": { + "index": 15273 + } + }, + { + "items": [ + 8167.5, + 7.6527 + ], + "hints": { + "index": 15274 + } + }, + { + "items": [ + 8168, + 10.1378 + ], + "hints": { + "index": 15275 + } + }, + { + "items": [ + 8168.5, + 11.155 + ], + "hints": { + "index": 15276 + } + }, + { + "items": [ + 8169, + 11.9261 + ], + "hints": { + "index": 15277 + } + }, + { + "items": [ + 8169.5, + 10.1997 + ], + "hints": { + "index": 15278 + } + }, + { + "items": [ + 8170, + 7.9659 + ], + "hints": { + "index": 15279 + } + }, + { + "items": [ + 8170.5, + 5.6611 + ], + "hints": { + "index": 15280 + } + }, + { + "items": [ + 8171, + 4.1478 + ], + "hints": { + "index": 15281 + } + }, + { + "items": [ + 8171.5, + 3.5398 + ], + "hints": { + "index": 15282 + } + }, + { + "items": [ + 8172, + 3.8396 + ], + "hints": { + "index": 15283 + } + }, + { + "items": [ + 8172.5, + 4.785 + ], + "hints": { + "index": 15284 + } + }, + { + "items": [ + 8173, + 5.9782 + ], + "hints": { + "index": 15285 + } + }, + { + "items": [ + 8173.5, + 7.0581 + ], + "hints": { + "index": 15286 + } + }, + { + "items": [ + 8174, + 7.4885 + ], + "hints": { + "index": 15287 + } + }, + { + "items": [ + 8174.5, + 7.3311 + ], + "hints": { + "index": 15288 + } + }, + { + "items": [ + 8175, + 5.9134 + ], + "hints": { + "index": 15289 + } + }, + { + "items": [ + 8175.5, + 4.713 + ], + "hints": { + "index": 15290 + } + }, + { + "items": [ + 8176, + 4.1535 + ], + "hints": { + "index": 15291 + } + }, + { + "items": [ + 8176.5, + 3.8613 + ], + "hints": { + "index": 15292 + } + }, + { + "items": [ + 8177, + 4.7084 + ], + "hints": { + "index": 15293 + } + }, + { + "items": [ + 8177.5, + 6.1777 + ], + "hints": { + "index": 15294 + } + }, + { + "items": [ + 8178, + 8.7401 + ], + "hints": { + "index": 15295 + } + }, + { + "items": [ + 8178.5, + 9.0301 + ], + "hints": { + "index": 15296 + } + }, + { + "items": [ + 8179, + 8.3817 + ], + "hints": { + "index": 15297 + } + }, + { + "items": [ + 8179.5, + 7.8905 + ], + "hints": { + "index": 15298 + } + }, + { + "items": [ + 8180, + 5.7609 + ], + "hints": { + "index": 15299 + } + }, + { + "items": [ + 8180.5, + 4.4477 + ], + "hints": { + "index": 15300 + } + }, + { + "items": [ + 8181, + 3.5931 + ], + "hints": { + "index": 15301 + } + }, + { + "items": [ + 8181.5, + 4.2674 + ], + "hints": { + "index": 15302 + } + }, + { + "items": [ + 8182, + 5.5282 + ], + "hints": { + "index": 15303 + } + }, + { + "items": [ + 8182.5, + 6.6877 + ], + "hints": { + "index": 15304 + } + }, + { + "items": [ + 8183, + 5.8892 + ], + "hints": { + "index": 15305 + } + }, + { + "items": [ + 8183.5, + 4.8288 + ], + "hints": { + "index": 15306 + } + }, + { + "items": [ + 8184, + 5.0642 + ], + "hints": { + "index": 15307 + } + }, + { + "items": [ + 8184.5, + 5.8922 + ], + "hints": { + "index": 15308 + } + }, + { + "items": [ + 8185, + 6.4715 + ], + "hints": { + "index": 15309 + } + }, + { + "items": [ + 8185.5, + 6.104 + ], + "hints": { + "index": 15310 + } + }, + { + "items": [ + 8186, + 7.2472 + ], + "hints": { + "index": 15311 + } + }, + { + "items": [ + 8186.5, + 9.3298 + ], + "hints": { + "index": 15312 + } + }, + { + "items": [ + 8187, + 14.7817 + ], + "hints": { + "index": 15313 + } + }, + { + "items": [ + 8187.5, + 19.1327 + ], + "hints": { + "index": 15314 + } + }, + { + "items": [ + 8188, + 20.0049 + ], + "hints": { + "index": 15315 + } + }, + { + "items": [ + 8188.5, + 16.6142 + ], + "hints": { + "index": 15316 + } + }, + { + "items": [ + 8189, + 8.8755 + ], + "hints": { + "index": 15317 + } + }, + { + "items": [ + 8189.5, + 8.325 + ], + "hints": { + "index": 15318 + } + }, + { + "items": [ + 8190, + 8.9186 + ], + "hints": { + "index": 15319 + } + }, + { + "items": [ + 8190.5, + 12.1367 + ], + "hints": { + "index": 15320 + } + }, + { + "items": [ + 8191, + 12.3547 + ], + "hints": { + "index": 15321 + } + }, + { + "items": [ + 8191.5, + 13.8743 + ], + "hints": { + "index": 15322 + } + }, + { + "items": [ + 8192, + 14.544899940490724 + ], + "hints": { + "index": 15323 + } + }, + { + "items": [ + 8192.5, + 13.095000267028809 + ], + "hints": { + "index": 15324 + } + }, + { + "items": [ + 8193, + 7.5538997650146484 + ], + "hints": { + "index": 15325 + } + }, + { + "items": [ + 8193.5, + 5.101099967956543 + ], + "hints": { + "index": 15326 + } + }, + { + "items": [ + 8194, + 5.1870999336242676 + ], + "hints": { + "index": 15327 + } + }, + { + "items": [ + 8194.5, + 6.35230016708374 + ], + "hints": { + "index": 15328 + } + }, + { + "items": [ + 8195, + 8.79990005493164 + ], + "hints": { + "index": 15329 + } + }, + { + "items": [ + 8195.5, + 10.726699829101563 + ], + "hints": { + "index": 15330 + } + }, + { + "items": [ + 8196, + 11.931699752807615 + ], + "hints": { + "index": 15331 + } + }, + { + "items": [ + 8196.5, + 9.9540004730224609 + ], + "hints": { + "index": 15332 + } + }, + { + "items": [ + 8197, + 7.661099910736084 + ], + "hints": { + "index": 15333 + } + }, + { + "items": [ + 8197.5, + 5.6545000076293945 + ], + "hints": { + "index": 15334 + } + }, + { + "items": [ + 8198, + 4.5981001853942871 + ], + "hints": { + "index": 15335 + } + }, + { + "items": [ + 8198.5, + 4.032599925994873 + ], + "hints": { + "index": 15336 + } + }, + { + "items": [ + 8199, + 3.8764998912811279 + ], + "hints": { + "index": 15337 + } + }, + { + "items": [ + 8199.5, + 4.64109992980957 + ], + "hints": { + "index": 15338 + } + }, + { + "items": [ + 8200, + 5.6139998435974121 + ], + "hints": { + "index": 15339 + } + }, + { + "items": [ + 8200.5, + 6.16540002822876 + ], + "hints": { + "index": 15340 + } + }, + { + "items": [ + 8201, + 5.6364998817443848 + ], + "hints": { + "index": 15341 + } + }, + { + "items": [ + 8201.5, + 5.0799999237060547 + ], + "hints": { + "index": 15342 + } + }, + { + "items": [ + 8202, + 4.52869987487793 + ], + "hints": { + "index": 15343 + } + }, + { + "items": [ + 8202.5, + 4.0099000930786133 + ], + "hints": { + "index": 15344 + } + }, + { + "items": [ + 8203, + 3.801899909973145 + ], + "hints": { + "index": 15345 + } + }, + { + "items": [ + 8203.5, + 4.1150999069213867 + ], + "hints": { + "index": 15346 + } + }, + { + "items": [ + 8204, + 4.8401999473571777 + ], + "hints": { + "index": 15347 + } + }, + { + "items": [ + 8204.5, + 5.7168998718261719 + ], + "hints": { + "index": 15348 + } + }, + { + "items": [ + 8205, + 6.8722000122070313 + ], + "hints": { + "index": 15349 + } + }, + { + "items": [ + 8205.5, + 7.362999916076661 + ], + "hints": { + "index": 15350 + } + }, + { + "items": [ + 8206, + 6.9710001945495605 + ], + "hints": { + "index": 15351 + } + }, + { + "items": [ + 8206.5, + 5.306300163269043 + ], + "hints": { + "index": 15352 + } + }, + { + "items": [ + 8207, + 4.5588998794555664 + ], + "hints": { + "index": 15353 + } + }, + { + "items": [ + 8207.5, + 3.982199907302856 + ], + "hints": { + "index": 15354 + } + }, + { + "items": [ + 8208, + 3.96970009803772 + ], + "hints": { + "index": 15355 + } + }, + { + "items": [ + 8208.5, + 4.1786999702453613 + ], + "hints": { + "index": 15356 + } + }, + { + "items": [ + 8209, + 4.9931001663208008 + ], + "hints": { + "index": 15357 + } + }, + { + "items": [ + 8209.5, + 6.1308999061584473 + ], + "hints": { + "index": 15358 + } + }, + { + "items": [ + 8210, + 5.6894001960754395 + ], + "hints": { + "index": 15359 + } + }, + { + "items": [ + 8210.5, + 4.4793000221252441 + ], + "hints": { + "index": 15360 + } + }, + { + "items": [ + 8211, + 3.9368999004364018 + ], + "hints": { + "index": 15361 + } + }, + { + "items": [ + 8211.5, + 3.8273999691009521 + ], + "hints": { + "index": 15362 + } + }, + { + "items": [ + 8212, + 3.7834000587463374 + ], + "hints": { + "index": 15363 + } + }, + { + "items": [ + 8212.5, + 3.4296998977661133 + ], + "hints": { + "index": 15364 + } + }, + { + "items": [ + 8213, + 3.9135000705718994 + ], + "hints": { + "index": 15365 + } + }, + { + "items": [ + 8213.5, + 4.4478001594543457 + ], + "hints": { + "index": 15366 + } + }, + { + "items": [ + 8214, + 5.2645001411437988 + ], + "hints": { + "index": 15367 + } + }, + { + "items": [ + 8214.5, + 5.1318998336791992 + ], + "hints": { + "index": 15368 + } + }, + { + "items": [ + 8215, + 4.9085001945495605 + ], + "hints": { + "index": 15369 + } + }, + { + "items": [ + 8215.5, + 4.2927999496459961 + ], + "hints": { + "index": 15370 + } + }, + { + "items": [ + 8216, + 3.7369000911712646 + ], + "hints": { + "index": 15371 + } + }, + { + "items": [ + 8216.5, + 3.3889999389648442 + ], + "hints": { + "index": 15372 + } + }, + { + "items": [ + 8217, + 3.4948999881744385 + ], + "hints": { + "index": 15373 + } + }, + { + "items": [ + 8217.5, + 3.84850001335144 + ], + "hints": { + "index": 15374 + } + }, + { + "items": [ + 8218, + 4.5693001747131348 + ], + "hints": { + "index": 15375 + } + }, + { + "items": [ + 8218.5, + 5.4398999214172363 + ], + "hints": { + "index": 15376 + } + }, + { + "items": [ + 8219, + 5.7321000099182129 + ], + "hints": { + "index": 15377 + } + }, + { + "items": [ + 8219.5, + 4.84250020980835 + ], + "hints": { + "index": 15378 + } + }, + { + "items": [ + 8220, + 4.2350997924804688 + ], + "hints": { + "index": 15379 + } + }, + { + "items": [ + 8220.5, + 4.0753002166748047 + ], + "hints": { + "index": 15380 + } + }, + { + "items": [ + 8221, + 4.1869997978210449 + ], + "hints": { + "index": 15381 + } + }, + { + "items": [ + 8221.5, + 4.5831999778747559 + ], + "hints": { + "index": 15382 + } + }, + { + "items": [ + 8222, + 5.1101999282836914 + ], + "hints": { + "index": 15383 + } + }, + { + "items": [ + 8222.5, + 6.1305999755859375 + ], + "hints": { + "index": 15384 + } + }, + { + "items": [ + 8223, + 6.6216998100280762 + ], + "hints": { + "index": 15385 + } + }, + { + "items": [ + 8223.5, + 6.6269001960754395 + ], + "hints": { + "index": 15386 + } + }, + { + "items": [ + 8224, + 5.6406002044677734 + ], + "hints": { + "index": 15387 + } + }, + { + "items": [ + 8224.5, + 4.6202001571655273 + ], + "hints": { + "index": 15388 + } + }, + { + "items": [ + 8225, + 4.2323999404907227 + ], + "hints": { + "index": 15389 + } + }, + { + "items": [ + 8225.5, + 4.2239999771118164 + ], + "hints": { + "index": 15390 + } + }, + { + "items": [ + 8226, + 4.359799861907959 + ], + "hints": { + "index": 15391 + } + }, + { + "items": [ + 8226.5, + 4.5934000015258789 + ], + "hints": { + "index": 15392 + } + }, + { + "items": [ + 8227, + 5.3334999084472656 + ], + "hints": { + "index": 15393 + } + }, + { + "items": [ + 8227.5, + 5.417600154876709 + ], + "hints": { + "index": 15394 + } + }, + { + "items": [ + 8228, + 4.6174001693725586 + ], + "hints": { + "index": 15395 + } + }, + { + "items": [ + 8228.5, + 3.6391000747680664 + ], + "hints": { + "index": 15396 + } + }, + { + "items": [ + 8229, + 3.5023999214172363 + ], + "hints": { + "index": 15397 + } + }, + { + "items": [ + 8229.5, + 3.6024999618530273 + ], + "hints": { + "index": 15398 + } + }, + { + "items": [ + 8230, + 3.8334000110626225 + ], + "hints": { + "index": 15399 + } + }, + { + "items": [ + 8230.5, + 4.5148000717163086 + ], + "hints": { + "index": 15400 + } + }, + { + "items": [ + 8231, + 5.5725998878479 + ], + "hints": { + "index": 15401 + } + }, + { + "items": [ + 8231.5, + 6.9783000946044922 + ], + "hints": { + "index": 15402 + } + }, + { + "items": [ + 8232, + 7.5342998504638672 + ], + "hints": { + "index": 15403 + } + }, + { + "items": [ + 8232.5, + 7.060999870300293 + ], + "hints": { + "index": 15404 + } + }, + { + "items": [ + 8233, + 6.3067 + ], + "hints": { + "index": 15405 + } + }, + { + "items": [ + 8233.5, + 5.16 + ], + "hints": { + "index": 15406 + } + }, + { + "items": [ + 8234, + 4.0193 + ], + "hints": { + "index": 15407 + } + }, + { + "items": [ + 8234.5, + 3.4363 + ], + "hints": { + "index": 15408 + } + }, + { + "items": [ + 8235, + 3.702 + ], + "hints": { + "index": 15409 + } + }, + { + "items": [ + 8235.5, + 4.6224 + ], + "hints": { + "index": 15410 + } + }, + { + "items": [ + 8236, + 6.1879 + ], + "hints": { + "index": 15411 + } + }, + { + "items": [ + 8236.5, + 7.2048 + ], + "hints": { + "index": 15412 + } + }, + { + "items": [ + 8237, + 7.4483 + ], + "hints": { + "index": 15413 + } + }, + { + "items": [ + 8237.5, + 6.6114 + ], + "hints": { + "index": 15414 + } + }, + { + "items": [ + 8238, + 4.8791 + ], + "hints": { + "index": 15415 + } + }, + { + "items": [ + 8238.5, + 4.1334 + ], + "hints": { + "index": 15416 + } + }, + { + "items": [ + 8239, + 4.1083 + ], + "hints": { + "index": 15417 + } + }, + { + "items": [ + 8239.5, + 4.4889 + ], + "hints": { + "index": 15418 + } + }, + { + "items": [ + 8240, + 4.8301 + ], + "hints": { + "index": 15419 + } + }, + { + "items": [ + 8240.5, + 5.6308 + ], + "hints": { + "index": 15420 + } + }, + { + "items": [ + 8241, + 6.8469 + ], + "hints": { + "index": 15421 + } + }, + { + "items": [ + 8241.5, + 7.9202 + ], + "hints": { + "index": 15422 + } + }, + { + "items": [ + 8242, + 6.6213 + ], + "hints": { + "index": 15423 + } + }, + { + "items": [ + 8242.5, + 4.9691 + ], + "hints": { + "index": 15424 + } + }, + { + "items": [ + 8243, + 3.9373 + ], + "hints": { + "index": 15425 + } + }, + { + "items": [ + 8243.5, + 4.1005 + ], + "hints": { + "index": 15426 + } + }, + { + "items": [ + 8244, + 4.8387 + ], + "hints": { + "index": 15427 + } + }, + { + "items": [ + 8244.5, + 6.1693 + ], + "hints": { + "index": 15428 + } + }, + { + "items": [ + 8245, + 7.4757999999999996 + ], + "hints": { + "index": 15429 + } + }, + { + "items": [ + 8245.5, + 9.3774 + ], + "hints": { + "index": 15430 + } + }, + { + "items": [ + 8246, + 9.4773 + ], + "hints": { + "index": 15431 + } + }, + { + "items": [ + 8246.5, + 6.8572 + ], + "hints": { + "index": 15432 + } + }, + { + "items": [ + 8247, + 4.6308 + ], + "hints": { + "index": 15433 + } + }, + { + "items": [ + 8247.5, + 3.6167 + ], + "hints": { + "index": 15434 + } + }, + { + "items": [ + 8248, + 3.6946 + ], + "hints": { + "index": 15435 + } + }, + { + "items": [ + 8248.5, + 4.7936 + ], + "hints": { + "index": 15436 + } + }, + { + "items": [ + 8249, + 7.3319 + ], + "hints": { + "index": 15437 + } + }, + { + "items": [ + 8249.5, + 11.2424 + ], + "hints": { + "index": 15438 + } + }, + { + "items": [ + 8250, + 12.7496 + ], + "hints": { + "index": 15439 + } + }, + { + "items": [ + 8250.5, + 14.257 + ], + "hints": { + "index": 15440 + } + }, + { + "items": [ + 8251, + 13.9219 + ], + "hints": { + "index": 15441 + } + }, + { + "items": [ + 8251.5, + 10.0069 + ], + "hints": { + "index": 15442 + } + }, + { + "items": [ + 8252, + 8.0841 + ], + "hints": { + "index": 15443 + } + }, + { + "items": [ + 8252.5, + 8.0578 + ], + "hints": { + "index": 15444 + } + }, + { + "items": [ + 8253, + 10.6785 + ], + "hints": { + "index": 15445 + } + }, + { + "items": [ + 8253.5, + 9.4689 + ], + "hints": { + "index": 15446 + } + }, + { + "items": [ + 8254, + 9.773 + ], + "hints": { + "index": 15447 + } + }, + { + "items": [ + 8254.5, + 9.8738 + ], + "hints": { + "index": 15448 + } + }, + { + "items": [ + 8255, + 11.2303 + ], + "hints": { + "index": 15449 + } + }, + { + "items": [ + 8255.5, + 8.6463 + ], + "hints": { + "index": 15450 + } + }, + { + "items": [ + 8256, + 6.1608 + ], + "hints": { + "index": 15451 + } + }, + { + "items": [ + 8256.5, + 4.6807 + ], + "hints": { + "index": 15452 + } + }, + { + "items": [ + 8257, + 4.3296 + ], + "hints": { + "index": 15453 + } + }, + { + "items": [ + 8257.5, + 6.5947 + ], + "hints": { + "index": 15454 + } + }, + { + "items": [ + 8258, + 10.2182 + ], + "hints": { + "index": 15455 + } + }, + { + "items": [ + 8258.5, + 18.8731 + ], + "hints": { + "index": 15456 + } + }, + { + "items": [ + 8259, + 22.3268 + ], + "hints": { + "index": 15457 + } + }, + { + "items": [ + 8259.5, + 22.8396 + ], + "hints": { + "index": 15458 + } + }, + { + "items": [ + 8260, + 15.3391 + ], + "hints": { + "index": 15459 + } + }, + { + "items": [ + 8260.5, + 8.7998 + ], + "hints": { + "index": 15460 + } + }, + { + "items": [ + 8261, + 5.32 + ], + "hints": { + "index": 15461 + } + }, + { + "items": [ + 8261.5, + 4.1478 + ], + "hints": { + "index": 15462 + } + }, + { + "items": [ + 8262, + 4.7088 + ], + "hints": { + "index": 15463 + } + }, + { + "items": [ + 8262.5, + 5.4919 + ], + "hints": { + "index": 15464 + } + }, + { + "items": [ + 8263, + 7.1587 + ], + "hints": { + "index": 15465 + } + }, + { + "items": [ + 8263.5, + 8.1424 + ], + "hints": { + "index": 15466 + } + }, + { + "items": [ + 8264, + 9.9064 + ], + "hints": { + "index": 15467 + } + }, + { + "items": [ + 8264.5, + 8.0733 + ], + "hints": { + "index": 15468 + } + }, + { + "items": [ + 8265, + 6.4808 + ], + "hints": { + "index": 15469 + } + }, + { + "items": [ + 8265.5, + 5.2452 + ], + "hints": { + "index": 15470 + } + }, + { + "items": [ + 8266, + 5.2203 + ], + "hints": { + "index": 15471 + } + }, + { + "items": [ + 8266.5, + 5.0106 + ], + "hints": { + "index": 15472 + } + }, + { + "items": [ + 8267, + 6.3597 + ], + "hints": { + "index": 15473 + } + }, + { + "items": [ + 8267.5, + 7.9266 + ], + "hints": { + "index": 15474 + } + }, + { + "items": [ + 8268, + 12.2517 + ], + "hints": { + "index": 15475 + } + }, + { + "items": [ + 8268.5, + 12.4321 + ], + "hints": { + "index": 15476 + } + }, + { + "items": [ + 8269, + 9.4513 + ], + "hints": { + "index": 15477 + } + }, + { + "items": [ + 8269.5, + 5.9631 + ], + "hints": { + "index": 15478 + } + }, + { + "items": [ + 8270, + 5.7476 + ], + "hints": { + "index": 15479 + } + }, + { + "items": [ + 8270.5, + 6.5155 + ], + "hints": { + "index": 15480 + } + }, + { + "items": [ + 8271, + 8.8485 + ], + "hints": { + "index": 15481 + } + }, + { + "items": [ + 8271.5, + 10.3944 + ], + "hints": { + "index": 15482 + } + }, + { + "items": [ + 8272, + 10.5679 + ], + "hints": { + "index": 15483 + } + }, + { + "items": [ + 8272.5, + 8.6179 + ], + "hints": { + "index": 15484 + } + }, + { + "items": [ + 8273, + 6.1307 + ], + "hints": { + "index": 15485 + } + }, + { + "items": [ + 8273.5, + 4.6954 + ], + "hints": { + "index": 15486 + } + }, + { + "items": [ + 8274, + 4.0298 + ], + "hints": { + "index": 15487 + } + }, + { + "items": [ + 8274.5, + 4.241 + ], + "hints": { + "index": 15488 + } + }, + { + "items": [ + 8275, + 4.9968 + ], + "hints": { + "index": 15489 + } + }, + { + "items": [ + 8275.5, + 6.0501 + ], + "hints": { + "index": 15490 + } + }, + { + "items": [ + 8276, + 6.5387 + ], + "hints": { + "index": 15491 + } + }, + { + "items": [ + 8276.5, + 6.5546 + ], + "hints": { + "index": 15492 + } + }, + { + "items": [ + 8277, + 6.7089 + ], + "hints": { + "index": 15493 + } + }, + { + "items": [ + 8277.5, + 5.6682 + ], + "hints": { + "index": 15494 + } + }, + { + "items": [ + 8278, + 4.7368 + ], + "hints": { + "index": 15495 + } + }, + { + "items": [ + 8278.5, + 4.0636 + ], + "hints": { + "index": 15496 + } + }, + { + "items": [ + 8279, + 4.2515 + ], + "hints": { + "index": 15497 + } + }, + { + "items": [ + 8279.5, + 4.2802 + ], + "hints": { + "index": 15498 + } + }, + { + "items": [ + 8280, + 4.9821 + ], + "hints": { + "index": 15499 + } + }, + { + "items": [ + 8280.5, + 5.7888 + ], + "hints": { + "index": 15500 + } + }, + { + "items": [ + 8281, + 7.1701 + ], + "hints": { + "index": 15501 + } + }, + { + "items": [ + 8281.5, + 6.6892 + ], + "hints": { + "index": 15502 + } + }, + { + "items": [ + 8282, + 5.384 + ], + "hints": { + "index": 15503 + } + }, + { + "items": [ + 8282.5, + 4.2861 + ], + "hints": { + "index": 15504 + } + }, + { + "items": [ + 8283, + 3.8704 + ], + "hints": { + "index": 15505 + } + }, + { + "items": [ + 8283.5, + 4.2379 + ], + "hints": { + "index": 15506 + } + }, + { + "items": [ + 8284, + 4.8115 + ], + "hints": { + "index": 15507 + } + }, + { + "items": [ + 8284.5, + 5.7513 + ], + "hints": { + "index": 15508 + } + }, + { + "items": [ + 8285, + 7.0205 + ], + "hints": { + "index": 15509 + } + }, + { + "items": [ + 8285.5, + 8.6682 + ], + "hints": { + "index": 15510 + } + }, + { + "items": [ + 8286, + 9.8371 + ], + "hints": { + "index": 15511 + } + }, + { + "items": [ + 8286.5, + 7.6344 + ], + "hints": { + "index": 15512 + } + }, + { + "items": [ + 8287, + 4.9923 + ], + "hints": { + "index": 15513 + } + }, + { + "items": [ + 8287.5, + 3.9416 + ], + "hints": { + "index": 15514 + } + }, + { + "items": [ + 8288, + 4.0017 + ], + "hints": { + "index": 15515 + } + }, + { + "items": [ + 8288.5, + 5.2415 + ], + "hints": { + "index": 15516 + } + }, + { + "items": [ + 8289, + 7.4069 + ], + "hints": { + "index": 15517 + } + }, + { + "items": [ + 8289.5, + 10.1363 + ], + "hints": { + "index": 15518 + } + }, + { + "items": [ + 8290, + 11.2744 + ], + "hints": { + "index": 15519 + } + }, + { + "items": [ + 8290.5, + 9.9674 + ], + "hints": { + "index": 15520 + } + }, + { + "items": [ + 8291, + 7.763 + ], + "hints": { + "index": 15521 + } + }, + { + "items": [ + 8291.5, + 5.6148 + ], + "hints": { + "index": 15522 + } + }, + { + "items": [ + 8292, + 5.6165 + ], + "hints": { + "index": 15523 + } + }, + { + "items": [ + 8292.5, + 6.8042 + ], + "hints": { + "index": 15524 + } + }, + { + "items": [ + 8293, + 9.3564 + ], + "hints": { + "index": 15525 + } + }, + { + "items": [ + 8293.5, + 10.9547 + ], + "hints": { + "index": 15526 + } + }, + { + "items": [ + 8294, + 11.198 + ], + "hints": { + "index": 15527 + } + }, + { + "items": [ + 8294.5, + 9.9807 + ], + "hints": { + "index": 15528 + } + }, + { + "items": [ + 8295, + 8.0612 + ], + "hints": { + "index": 15529 + } + }, + { + "items": [ + 8295.5, + 6.7014 + ], + "hints": { + "index": 15530 + } + }, + { + "items": [ + 8296, + 6.3271 + ], + "hints": { + "index": 15531 + } + }, + { + "items": [ + 8296.5, + 5.774 + ], + "hints": { + "index": 15532 + } + }, + { + "items": [ + 8297, + 5.0437 + ], + "hints": { + "index": 15533 + } + }, + { + "items": [ + 8297.5, + 5.7628002166748047 + ], + "hints": { + "index": 15534 + } + }, + { + "items": [ + 8298, + 6.7685 + ], + "hints": { + "index": 15535 + } + }, + { + "items": [ + 8298.5, + 8.3037 + ], + "hints": { + "index": 15536 + } + }, + { + "items": [ + 8299, + 6.7867 + ], + "hints": { + "index": 15537 + } + }, + { + "items": [ + 8299.5, + 5.3987 + ], + "hints": { + "index": 15538 + } + }, + { + "items": [ + 8300, + 4.3414998054504395 + ], + "hints": { + "index": 15539 + } + }, + { + "items": [ + 8300.5, + 3.8956999778747559 + ], + "hints": { + "index": 15540 + } + }, + { + "items": [ + 8301, + 4.3689 + ], + "hints": { + "index": 15541 + } + }, + { + "items": [ + 8301.5, + 5.32919979095459 + ], + "hints": { + "index": 15542 + } + }, + { + "items": [ + 8302, + 6.6863 + ], + "hints": { + "index": 15543 + } + }, + { + "items": [ + 8302.5, + 7.3993000984191886 + ], + "hints": { + "index": 15544 + } + }, + { + "items": [ + 8303, + 7.9309 + ], + "hints": { + "index": 15545 + } + }, + { + "items": [ + 8303.5, + 9.1475 + ], + "hints": { + "index": 15546 + } + }, + { + "items": [ + 8304, + 9.0398998260498047 + ], + "hints": { + "index": 15547 + } + }, + { + "items": [ + 8304.5, + 6.6928000450134277 + ], + "hints": { + "index": 15548 + } + }, + { + "items": [ + 8305, + 5.6329 + ], + "hints": { + "index": 15549 + } + }, + { + "items": [ + 8305.5, + 5.1821999549865723 + ], + "hints": { + "index": 15550 + } + }, + { + "items": [ + 8306, + 5.913 + ], + "hints": { + "index": 15551 + } + }, + { + "items": [ + 8306.5, + 5.9335 + ], + "hints": { + "index": 15552 + } + }, + { + "items": [ + 8307, + 6.7411999702453613 + ], + "hints": { + "index": 15553 + } + }, + { + "items": [ + 8307.5, + 8.1751 + ], + "hints": { + "index": 15554 + } + }, + { + "items": [ + 8308, + 10.074399948120115 + ], + "hints": { + "index": 15555 + } + }, + { + "items": [ + 8308.5, + 10.422300338745115 + ], + "hints": { + "index": 15556 + } + }, + { + "items": [ + 8309, + 7.8159999847412109 + ], + "hints": { + "index": 15557 + } + }, + { + "items": [ + 8309.5, + 5.1673002243041992 + ], + "hints": { + "index": 15558 + } + }, + { + "items": [ + 8310, + 4.5369000434875488 + ], + "hints": { + "index": 15559 + } + }, + { + "items": [ + 8310.5, + 4.53879976272583 + ], + "hints": { + "index": 15560 + } + }, + { + "items": [ + 8311, + 5.2172 + ], + "hints": { + "index": 15561 + } + }, + { + "items": [ + 8311.5, + 6.4404997825622559 + ], + "hints": { + "index": 15562 + } + }, + { + "items": [ + 8312, + 8.43120002746582 + ], + "hints": { + "index": 15563 + } + }, + { + "items": [ + 8312.5, + 11.365900039672852 + ], + "hints": { + "index": 15564 + } + }, + { + "items": [ + 8313, + 10.9512 + ], + "hints": { + "index": 15565 + } + }, + { + "items": [ + 8313.5, + 8.2984 + ], + "hints": { + "index": 15566 + } + }, + { + "items": [ + 8314, + 6.1522998809814453 + ], + "hints": { + "index": 15567 + } + }, + { + "items": [ + 8314.5, + 4.4425 + ], + "hints": { + "index": 15568 + } + }, + { + "items": [ + 8315, + 4.1325998306274414 + ], + "hints": { + "index": 15569 + } + }, + { + "items": [ + 8315.5, + 4.3938999176025391 + ], + "hints": { + "index": 15570 + } + }, + { + "items": [ + 8316, + 5.296 + ], + "hints": { + "index": 15571 + } + }, + { + "items": [ + 8316.5, + 6.9482998847961426 + ], + "hints": { + "index": 15572 + } + }, + { + "items": [ + 8317, + 9.1608 + ], + "hints": { + "index": 15573 + } + }, + { + "items": [ + 8317.5, + 11.7647 + ], + "hints": { + "index": 15574 + } + }, + { + "items": [ + 8318, + 9.7847995758056641 + ], + "hints": { + "index": 15575 + } + }, + { + "items": [ + 8318.5, + 6.15939998626709 + ], + "hints": { + "index": 15576 + } + }, + { + "items": [ + 8319, + 4.7305998802185059 + ], + "hints": { + "index": 15577 + } + }, + { + "items": [ + 8319.5, + 4.8555998802185059 + ], + "hints": { + "index": 15578 + } + }, + { + "items": [ + 8320, + 5.4996 + ], + "hints": { + "index": 15579 + } + }, + { + "items": [ + 8320.5, + 6.5714998245239258 + ], + "hints": { + "index": 15580 + } + }, + { + "items": [ + 8321, + 7.8664 + ], + "hints": { + "index": 15581 + } + }, + { + "items": [ + 8321.5, + 8.9859 + ], + "hints": { + "index": 15582 + } + }, + { + "items": [ + 8322, + 9.3065 + ], + "hints": { + "index": 15583 + } + }, + { + "items": [ + 8322.5, + 6.9714999198913574 + ], + "hints": { + "index": 15584 + } + }, + { + "items": [ + 8323, + 6.1957001686096191 + ], + "hints": { + "index": 15585 + } + }, + { + "items": [ + 8323.5, + 5.1641998291015625 + ], + "hints": { + "index": 15586 + } + }, + { + "items": [ + 8324, + 4.9922 + ], + "hints": { + "index": 15587 + } + }, + { + "items": [ + 8324.5, + 4.9655 + ], + "hints": { + "index": 15588 + } + }, + { + "items": [ + 8325, + 6.3482999801635742 + ], + "hints": { + "index": 15589 + } + }, + { + "items": [ + 8325.5, + 8.0755996704101563 + ], + "hints": { + "index": 15590 + } + }, + { + "items": [ + 8326, + 9.5363998413085938 + ], + "hints": { + "index": 15591 + } + }, + { + "items": [ + 8326.5, + 8.7237997055053711 + ], + "hints": { + "index": 15592 + } + }, + { + "items": [ + 8327, + 7.7245001792907715 + ], + "hints": { + "index": 15593 + } + }, + { + "items": [ + 8327.5, + 6.1808 + ], + "hints": { + "index": 15594 + } + }, + { + "items": [ + 8328, + 5.1409997940063477 + ], + "hints": { + "index": 15595 + } + }, + { + "items": [ + 8328.5, + 4.7897000312805176 + ], + "hints": { + "index": 15596 + } + }, + { + "items": [ + 8329, + 4.9778 + ], + "hints": { + "index": 15597 + } + }, + { + "items": [ + 8329.5, + 5.3248 + ], + "hints": { + "index": 15598 + } + }, + { + "items": [ + 8330, + 5.982 + ], + "hints": { + "index": 15599 + } + }, + { + "items": [ + 8330.5, + 7.0253000259399414 + ], + "hints": { + "index": 15600 + } + }, + { + "items": [ + 8331, + 7.56 + ], + "hints": { + "index": 15601 + } + }, + { + "items": [ + 8331.5, + 7.0012998580932617 + ], + "hints": { + "index": 15602 + } + }, + { + "items": [ + 8332, + 5.4149 + ], + "hints": { + "index": 15603 + } + }, + { + "items": [ + 8332.5, + 4.29010009765625 + ], + "hints": { + "index": 15604 + } + }, + { + "items": [ + 8333, + 3.687999963760376 + ], + "hints": { + "index": 15605 + } + }, + { + "items": [ + 8333.5, + 3.7565999031066895 + ], + "hints": { + "index": 15606 + } + }, + { + "items": [ + 8334, + 4.2322001457214355 + ], + "hints": { + "index": 15607 + } + }, + { + "items": [ + 8334.5, + 5.5026001930236816 + ], + "hints": { + "index": 15608 + } + }, + { + "items": [ + 8335, + 7.1611 + ], + "hints": { + "index": 15609 + } + }, + { + "items": [ + 8335.5, + 8.66 + ], + "hints": { + "index": 15610 + } + }, + { + "items": [ + 8336, + 8.2798004150390625 + ], + "hints": { + "index": 15611 + } + }, + { + "items": [ + 8336.5, + 6.6887998580932617 + ], + "hints": { + "index": 15612 + } + }, + { + "items": [ + 8337, + 4.8521 + ], + "hints": { + "index": 15613 + } + }, + { + "items": [ + 8337.5, + 4.1798000335693359 + ], + "hints": { + "index": 15614 + } + }, + { + "items": [ + 8338, + 3.884 + ], + "hints": { + "index": 15615 + } + }, + { + "items": [ + 8338.5, + 4.1516 + ], + "hints": { + "index": 15616 + } + }, + { + "items": [ + 8339, + 4.3292 + ], + "hints": { + "index": 15617 + } + }, + { + "items": [ + 8339.5, + 5.2659001350402832 + ], + "hints": { + "index": 15618 + } + }, + { + "items": [ + 8340, + 6.4741 + ], + "hints": { + "index": 15619 + } + }, + { + "items": [ + 8340.5, + 7.6807999610900879 + ], + "hints": { + "index": 15620 + } + }, + { + "items": [ + 8341, + 6.3711 + ], + "hints": { + "index": 15621 + } + }, + { + "items": [ + 8341.5, + 4.7359 + ], + "hints": { + "index": 15622 + } + }, + { + "items": [ + 8342, + 4.107 + ], + "hints": { + "index": 15623 + } + }, + { + "items": [ + 8342.5, + 4.1985 + ], + "hints": { + "index": 15624 + } + }, + { + "items": [ + 8343, + 5.0057 + ], + "hints": { + "index": 15625 + } + }, + { + "items": [ + 8343.5, + 6.3656997680664063 + ], + "hints": { + "index": 15626 + } + }, + { + "items": [ + 8344, + 8.1203 + ], + "hints": { + "index": 15627 + } + }, + { + "items": [ + 8344.5, + 9.2749996185302734 + ], + "hints": { + "index": 15628 + } + }, + { + "items": [ + 8345, + 7.484799861907959 + ], + "hints": { + "index": 15629 + } + }, + { + "items": [ + 8345.5, + 6.3597 + ], + "hints": { + "index": 15630 + } + }, + { + "items": [ + 8346, + 5.056 + ], + "hints": { + "index": 15631 + } + }, + { + "items": [ + 8346.5, + 4.8210000991821289 + ], + "hints": { + "index": 15632 + } + }, + { + "items": [ + 8347, + 5.07 + ], + "hints": { + "index": 15633 + } + }, + { + "items": [ + 8347.5, + 6.44290018081665 + ], + "hints": { + "index": 15634 + } + }, + { + "items": [ + 8348, + 8.3212 + ], + "hints": { + "index": 15635 + } + }, + { + "items": [ + 8348.5, + 9.8357 + ], + "hints": { + "index": 15636 + } + }, + { + "items": [ + 8349, + 9.4879 + ], + "hints": { + "index": 15637 + } + }, + { + "items": [ + 8349.5, + 8.7204 + ], + "hints": { + "index": 15638 + } + }, + { + "items": [ + 8350, + 7.0448 + ], + "hints": { + "index": 15639 + } + }, + { + "items": [ + 8350.5, + 5.422299861907959 + ], + "hints": { + "index": 15640 + } + }, + { + "items": [ + 8351, + 5.263 + ], + "hints": { + "index": 15641 + } + }, + { + "items": [ + 8351.5, + 5.379 + ], + "hints": { + "index": 15642 + } + }, + { + "items": [ + 8352, + 5.8052000999450684 + ], + "hints": { + "index": 15643 + } + }, + { + "items": [ + 8352.5, + 5.7659 + ], + "hints": { + "index": 15644 + } + }, + { + "items": [ + 8353, + 6.5415 + ], + "hints": { + "index": 15645 + } + }, + { + "items": [ + 8353.5, + 7.1709 + ], + "hints": { + "index": 15646 + } + }, + { + "items": [ + 8354, + 6.6227 + ], + "hints": { + "index": 15647 + } + }, + { + "items": [ + 8354.5, + 5.055300235748291 + ], + "hints": { + "index": 15648 + } + }, + { + "items": [ + 8355, + 4.0125999450683594 + ], + "hints": { + "index": 15649 + } + }, + { + "items": [ + 8355.5, + 3.7343 + ], + "hints": { + "index": 15650 + } + }, + { + "items": [ + 8356, + 4.0461997985839844 + ], + "hints": { + "index": 15651 + } + }, + { + "items": [ + 8356.5, + 4.8837 + ], + "hints": { + "index": 15652 + } + }, + { + "items": [ + 8357, + 5.8112 + ], + "hints": { + "index": 15653 + } + }, + { + "items": [ + 8357.5, + 6.0815 + ], + "hints": { + "index": 15654 + } + }, + { + "items": [ + 8358, + 5.443699836730957 + ], + "hints": { + "index": 15655 + } + }, + { + "items": [ + 8358.5, + 4.6873998641967773 + ], + "hints": { + "index": 15656 + } + }, + { + "items": [ + 8359, + 4.5636000633239746 + ], + "hints": { + "index": 15657 + } + }, + { + "items": [ + 8359.5, + 4.263 + ], + "hints": { + "index": 15658 + } + }, + { + "items": [ + 8360, + 4.0647997856140137 + ], + "hints": { + "index": 15659 + } + }, + { + "items": [ + 8360.5, + 4.4648 + ], + "hints": { + "index": 15660 + } + }, + { + "items": [ + 8361, + 5.0346 + ], + "hints": { + "index": 15661 + } + }, + { + "items": [ + 8361.5, + 5.2426 + ], + "hints": { + "index": 15662 + } + }, + { + "items": [ + 8362, + 4.6069002151489258 + ], + "hints": { + "index": 15663 + } + }, + { + "items": [ + 8362.5, + 4.1807 + ], + "hints": { + "index": 15664 + } + }, + { + "items": [ + 8363, + 4.0808 + ], + "hints": { + "index": 15665 + } + }, + { + "items": [ + 8363.5, + 3.7132000923156734 + ], + "hints": { + "index": 15666 + } + }, + { + "items": [ + 8364, + 3.4397 + ], + "hints": { + "index": 15667 + } + }, + { + "items": [ + 8364.5, + 3.2070000171661377 + ], + "hints": { + "index": 15668 + } + }, + { + "items": [ + 8365, + 3.1943 + ], + "hints": { + "index": 15669 + } + }, + { + "items": [ + 8365.5, + 3.1668 + ], + "hints": { + "index": 15670 + } + }, + { + "items": [ + 8366, + 3.4467 + ], + "hints": { + "index": 15671 + } + }, + { + "items": [ + 8366.5, + 3.6376 + ], + "hints": { + "index": 15672 + } + }, + { + "items": [ + 8367, + 3.6557 + ], + "hints": { + "index": 15673 + } + }, + { + "items": [ + 8367.5, + 3.3631000518798828 + ], + "hints": { + "index": 15674 + } + }, + { + "items": [ + 8368, + 3.266 + ], + "hints": { + "index": 15675 + } + }, + { + "items": [ + 8368.5, + 3.2648 + ], + "hints": { + "index": 15676 + } + }, + { + "items": [ + 8369, + 3.176 + ], + "hints": { + "index": 15677 + } + }, + { + "items": [ + 8369.5, + 3.1034998893737793 + ], + "hints": { + "index": 15678 + } + }, + { + "items": [ + 8370, + 3.117 + ], + "hints": { + "index": 15679 + } + }, + { + "items": [ + 8370.5, + 3.0931000709533691 + ], + "hints": { + "index": 15680 + } + }, + { + "items": [ + 8371, + 3.0604 + ], + "hints": { + "index": 15681 + } + }, + { + "items": [ + 8371.5, + 3.1042 + ], + "hints": { + "index": 15682 + } + }, + { + "items": [ + 8372, + 3.1388 + ], + "hints": { + "index": 15683 + } + }, + { + "items": [ + 8372.5, + 3.1314 + ], + "hints": { + "index": 15684 + } + }, + { + "items": [ + 8373, + 3.0499 + ], + "hints": { + "index": 15685 + } + }, + { + "items": [ + 8373.5, + 3.0953 + ], + "hints": { + "index": 15686 + } + }, + { + "items": [ + 8374, + 3.0544 + ], + "hints": { + "index": 15687 + } + }, + { + "items": [ + 8374.5, + 3.0059 + ], + "hints": { + "index": 15688 + } + }, + { + "items": [ + 8375, + 2.9355 + ], + "hints": { + "index": 15689 + } + }, + { + "items": [ + 8375.5, + 2.9670999050140381 + ], + "hints": { + "index": 15690 + } + }, + { + "items": [ + 8376, + 3.0215 + ], + "hints": { + "index": 15691 + } + }, + { + "items": [ + 8376.5, + 3.1328 + ], + "hints": { + "index": 15692 + } + }, + { + "items": [ + 8377, + 3.1888 + ], + "hints": { + "index": 15693 + } + }, + { + "items": [ + 8377.5, + 3.1561999320983887 + ], + "hints": { + "index": 15694 + } + }, + { + "items": [ + 8378, + 3.0756 + ], + "hints": { + "index": 15695 + } + }, + { + "items": [ + 8378.5, + 3.1226000785827637 + ], + "hints": { + "index": 15696 + } + }, + { + "items": [ + 8379, + 3.4123 + ], + "hints": { + "index": 15697 + } + }, + { + "items": [ + 8379.5, + 3.8073 + ], + "hints": { + "index": 15698 + } + }, + { + "items": [ + 8380, + 4.1681 + ], + "hints": { + "index": 15699 + } + }, + { + "items": [ + 8380.5, + 4.1929998397827148 + ], + "hints": { + "index": 15700 + } + }, + { + "items": [ + 8381, + 4.1057 + ], + "hints": { + "index": 15701 + } + }, + { + "items": [ + 8381.5, + 3.7053999900817871 + ], + "hints": { + "index": 15702 + } + }, + { + "items": [ + 8382, + 3.4461 + ], + "hints": { + "index": 15703 + } + }, + { + "items": [ + 8382.5, + 3.2579 + ], + "hints": { + "index": 15704 + } + }, + { + "items": [ + 8383, + 3.28 + ], + "hints": { + "index": 15705 + } + }, + { + "items": [ + 8383.5, + 3.3532 + ], + "hints": { + "index": 15706 + } + }, + { + "items": [ + 8384, + 3.654 + ], + "hints": { + "index": 15707 + } + }, + { + "items": [ + 8384.5, + 3.9449 + ], + "hints": { + "index": 15708 + } + }, + { + "items": [ + 8385, + 4.0745 + ], + "hints": { + "index": 15709 + } + }, + { + "items": [ + 8385.5, + 3.9047999382019039 + ], + "hints": { + "index": 15710 + } + }, + { + "items": [ + 8386, + 3.7293 + ], + "hints": { + "index": 15711 + } + }, + { + "items": [ + 8386.5, + 3.7408 + ], + "hints": { + "index": 15712 + } + }, + { + "items": [ + 8387, + 3.5142 + ], + "hints": { + "index": 15713 + } + }, + { + "items": [ + 8387.5, + 3.5708 + ], + "hints": { + "index": 15714 + } + }, + { + "items": [ + 8388, + 3.778 + ], + "hints": { + "index": 15715 + } + }, + { + "items": [ + 8388.5, + 4.2883 + ], + "hints": { + "index": 15716 + } + }, + { + "items": [ + 8389, + 4.3627 + ], + "hints": { + "index": 15717 + } + }, + { + "items": [ + 8389.5, + 4.285099983215332 + ], + "hints": { + "index": 15718 + } + }, + { + "items": [ + 8390, + 4.7385 + ], + "hints": { + "index": 15719 + } + }, + { + "items": [ + 8390.5, + 5.6558 + ], + "hints": { + "index": 15720 + } + }, + { + "items": [ + 8391, + 5.5998 + ], + "hints": { + "index": 15721 + } + }, + { + "items": [ + 8391.5, + 4.3156 + ], + "hints": { + "index": 15722 + } + }, + { + "items": [ + 8392, + 3.6221001148223881 + ], + "hints": { + "index": 15723 + } + }, + { + "items": [ + 8392.5, + 3.7103 + ], + "hints": { + "index": 15724 + } + }, + { + "items": [ + 8393, + 4.3145 + ], + "hints": { + "index": 15725 + } + }, + { + "items": [ + 8393.5, + 5.0238 + ], + "hints": { + "index": 15726 + } + }, + { + "items": [ + 8394, + 5.8594999313354492 + ], + "hints": { + "index": 15727 + } + }, + { + "items": [ + 8394.5, + 6.0586 + ], + "hints": { + "index": 15728 + } + }, + { + "items": [ + 8395, + 5.6144 + ], + "hints": { + "index": 15729 + } + }, + { + "items": [ + 8395.5, + 5.0367 + ], + "hints": { + "index": 15730 + } + }, + { + "items": [ + 8396, + 4.4278 + ], + "hints": { + "index": 15731 + } + }, + { + "items": [ + 8396.5, + 3.8989999294281006 + ], + "hints": { + "index": 15732 + } + }, + { + "items": [ + 8397, + 3.9300000667572026 + ], + "hints": { + "index": 15733 + } + }, + { + "items": [ + 8397.5, + 4.4770002365112305 + ], + "hints": { + "index": 15734 + } + }, + { + "items": [ + 8398, + 5.4977 + ], + "hints": { + "index": 15735 + } + }, + { + "items": [ + 8398.5, + 6.4176998138427734 + ], + "hints": { + "index": 15736 + } + }, + { + "items": [ + 8399, + 6.5026001930236816 + ], + "hints": { + "index": 15737 + } + }, + { + "items": [ + 8399.5, + 6.3544 + ], + "hints": { + "index": 15738 + } + }, + { + "items": [ + 8400, + 5.8466 + ], + "hints": { + "index": 15739 + } + }, + { + "items": [ + 8400.5, + 4.7589001655578613 + ], + "hints": { + "index": 15740 + } + }, + { + "items": [ + 8401, + 4.19920015335083 + ], + "hints": { + "index": 15741 + } + }, + { + "items": [ + 8401.5, + 4.3095998764038086 + ], + "hints": { + "index": 15742 + } + }, + { + "items": [ + 8402, + 5.4177 + ], + "hints": { + "index": 15743 + } + }, + { + "items": [ + 8402.5, + 6.7129998207092285 + ], + "hints": { + "index": 15744 + } + }, + { + "items": [ + 8403, + 7.8426 + ], + "hints": { + "index": 15745 + } + }, + { + "items": [ + 8403.5, + 7.555300235748291 + ], + "hints": { + "index": 15746 + } + }, + { + "items": [ + 8404, + 7.2912 + ], + "hints": { + "index": 15747 + } + }, + { + "items": [ + 8404.5, + 6.0664000511169434 + ], + "hints": { + "index": 15748 + } + }, + { + "items": [ + 8405, + 4.9201998710632324 + ], + "hints": { + "index": 15749 + } + }, + { + "items": [ + 8405.5, + 4.0008001327514648 + ], + "hints": { + "index": 15750 + } + }, + { + "items": [ + 8406, + 3.8875 + ], + "hints": { + "index": 15751 + } + }, + { + "items": [ + 8406.5, + 4.1517000198364258 + ], + "hints": { + "index": 15752 + } + }, + { + "items": [ + 8407, + 4.7586002349853516 + ], + "hints": { + "index": 15753 + } + }, + { + "items": [ + 8407.5, + 5.7466 + ], + "hints": { + "index": 15754 + } + }, + { + "items": [ + 8408, + 5.6432 + ], + "hints": { + "index": 15755 + } + }, + { + "items": [ + 8408.5, + 4.9001 + ], + "hints": { + "index": 15756 + } + }, + { + "items": [ + 8409, + 3.7941999435424809 + ], + "hints": { + "index": 15757 + } + }, + { + "items": [ + 8409.5, + 3.7070999145507808 + ], + "hints": { + "index": 15758 + } + }, + { + "items": [ + 8410, + 3.5580000877380371 + ], + "hints": { + "index": 15759 + } + }, + { + "items": [ + 8410.5, + 3.6953001022338863 + ], + "hints": { + "index": 15760 + } + }, + { + "items": [ + 8411, + 3.9335999488830566 + ], + "hints": { + "index": 15761 + } + }, + { + "items": [ + 8411.5, + 4.7659001350402832 + ], + "hints": { + "index": 15762 + } + }, + { + "items": [ + 8412, + 5.9796 + ], + "hints": { + "index": 15763 + } + }, + { + "items": [ + 8412.5, + 6.7056999206542969 + ], + "hints": { + "index": 15764 + } + }, + { + "items": [ + 8413, + 6.4348998069763184 + ], + "hints": { + "index": 15765 + } + }, + { + "items": [ + 8413.5, + 5.3937997817993164 + ], + "hints": { + "index": 15766 + } + }, + { + "items": [ + 8414, + 4.3878 + ], + "hints": { + "index": 15767 + } + }, + { + "items": [ + 8414.5, + 3.8445999622344966 + ], + "hints": { + "index": 15768 + } + }, + { + "items": [ + 8415, + 3.8756 + ], + "hints": { + "index": 15769 + } + }, + { + "items": [ + 8415.5, + 4.4134001731872559 + ], + "hints": { + "index": 15770 + } + }, + { + "items": [ + 8416, + 5.1283 + ], + "hints": { + "index": 15771 + } + }, + { + "items": [ + 8416.5, + 6.2543001174926758 + ], + "hints": { + "index": 15772 + } + }, + { + "items": [ + 8417, + 6.137 + ], + "hints": { + "index": 15773 + } + }, + { + "items": [ + 8417.5, + 5.5967001914978027 + ], + "hints": { + "index": 15774 + } + }, + { + "items": [ + 8418, + 4.6561 + ], + "hints": { + "index": 15775 + } + }, + { + "items": [ + 8418.5, + 4.4217000007629395 + ], + "hints": { + "index": 15776 + } + }, + { + "items": [ + 8419, + 4.217 + ], + "hints": { + "index": 15777 + } + }, + { + "items": [ + 8419.5, + 4.49370002746582 + ], + "hints": { + "index": 15778 + } + }, + { + "items": [ + 8420, + 5.1855001449584961 + ], + "hints": { + "index": 15779 + } + }, + { + "items": [ + 8420.5, + 6.8907999992370605 + ], + "hints": { + "index": 15780 + } + }, + { + "items": [ + 8421, + 8.0423 + ], + "hints": { + "index": 15781 + } + }, + { + "items": [ + 8421.5, + 8.6045999526977539 + ], + "hints": { + "index": 15782 + } + }, + { + "items": [ + 8422, + 8.8644 + ], + "hints": { + "index": 15783 + } + }, + { + "items": [ + 8422.5, + 8.9138 + ], + "hints": { + "index": 15784 + } + }, + { + "items": [ + 8423, + 6.8884 + ], + "hints": { + "index": 15785 + } + }, + { + "items": [ + 8423.5, + 6.369 + ], + "hints": { + "index": 15786 + } + }, + { + "items": [ + 8424, + 5.5893 + ], + "hints": { + "index": 15787 + } + }, + { + "items": [ + 8424.5, + 5.6807 + ], + "hints": { + "index": 15788 + } + }, + { + "items": [ + 8425, + 4.8705 + ], + "hints": { + "index": 15789 + } + }, + { + "items": [ + 8425.5, + 4.5212 + ], + "hints": { + "index": 15790 + } + }, + { + "items": [ + 8426, + 4.3152 + ], + "hints": { + "index": 15791 + } + }, + { + "items": [ + 8426.5, + 4.1391 + ], + "hints": { + "index": 15792 + } + }, + { + "items": [ + 8427, + 4.122 + ], + "hints": { + "index": 15793 + } + }, + { + "items": [ + 8427.5, + 4.3369 + ], + "hints": { + "index": 15794 + } + }, + { + "items": [ + 8428, + 4.6124 + ], + "hints": { + "index": 15795 + } + }, + { + "items": [ + 8428.5, + 5.0206 + ], + "hints": { + "index": 15796 + } + }, + { + "items": [ + 8429, + 5.1915 + ], + "hints": { + "index": 15797 + } + }, + { + "items": [ + 8429.5, + 5.3144 + ], + "hints": { + "index": 15798 + } + }, + { + "items": [ + 8430, + 5.8021 + ], + "hints": { + "index": 15799 + } + }, + { + "items": [ + 8430.5, + 6.3993 + ], + "hints": { + "index": 15800 + } + }, + { + "items": [ + 8431, + 6.9077 + ], + "hints": { + "index": 15801 + } + }, + { + "items": [ + 8431.5, + 6.6245 + ], + "hints": { + "index": 15802 + } + }, + { + "items": [ + 8432, + 6.3124 + ], + "hints": { + "index": 15803 + } + }, + { + "items": [ + 8432.5, + 5.7474 + ], + "hints": { + "index": 15804 + } + }, + { + "items": [ + 8433, + 5.225 + ], + "hints": { + "index": 15805 + } + }, + { + "items": [ + 8433.5, + 5.1462 + ], + "hints": { + "index": 15806 + } + }, + { + "items": [ + 8434, + 6.0945 + ], + "hints": { + "index": 15807 + } + }, + { + "items": [ + 8434.5, + 7.8402 + ], + "hints": { + "index": 15808 + } + }, + { + "items": [ + 8435, + 8.8918 + ], + "hints": { + "index": 15809 + } + }, + { + "items": [ + 8435.5, + 7.9505 + ], + "hints": { + "index": 15810 + } + }, + { + "items": [ + 8436, + 6.9027 + ], + "hints": { + "index": 15811 + } + }, + { + "items": [ + 8436.5, + 6.5154 + ], + "hints": { + "index": 15812 + } + }, + { + "items": [ + 8437, + 5.4792 + ], + "hints": { + "index": 15813 + } + }, + { + "items": [ + 8437.5, + 5.1675 + ], + "hints": { + "index": 15814 + } + }, + { + "items": [ + 8438, + 5.1629 + ], + "hints": { + "index": 15815 + } + }, + { + "items": [ + 8438.5, + 6.2404 + ], + "hints": { + "index": 15816 + } + }, + { + "items": [ + 8439, + 7.4524 + ], + "hints": { + "index": 15817 + } + }, + { + "items": [ + 8439.5, + 8.1789 + ], + "hints": { + "index": 15818 + } + }, + { + "items": [ + 8440, + 7.3972 + ], + "hints": { + "index": 15819 + } + }, + { + "items": [ + 8440.5, + 6.5545 + ], + "hints": { + "index": 15820 + } + }, + { + "items": [ + 8441, + 6.0127 + ], + "hints": { + "index": 15821 + } + }, + { + "items": [ + 8441.5, + 5.3022 + ], + "hints": { + "index": 15822 + } + }, + { + "items": [ + 8442, + 5.2739 + ], + "hints": { + "index": 15823 + } + }, + { + "items": [ + 8442.5, + 5.6774 + ], + "hints": { + "index": 15824 + } + }, + { + "items": [ + 8443, + 7.1945 + ], + "hints": { + "index": 15825 + } + }, + { + "items": [ + 8443.5, + 9.292 + ], + "hints": { + "index": 15826 + } + }, + { + "items": [ + 8444, + 10.896 + ], + "hints": { + "index": 15827 + } + }, + { + "items": [ + 8444.5, + 10.3755 + ], + "hints": { + "index": 15828 + } + }, + { + "items": [ + 8445, + 8.9902 + ], + "hints": { + "index": 15829 + } + }, + { + "items": [ + 8445.5, + 6.3718 + ], + "hints": { + "index": 15830 + } + }, + { + "items": [ + 8446, + 5.3465 + ], + "hints": { + "index": 15831 + } + }, + { + "items": [ + 8446.5, + 4.9186 + ], + "hints": { + "index": 15832 + } + }, + { + "items": [ + 8447, + 5.2323 + ], + "hints": { + "index": 15833 + } + }, + { + "items": [ + 8447.5, + 5.4998 + ], + "hints": { + "index": 15834 + } + }, + { + "items": [ + 8448, + 5.7052 + ], + "hints": { + "index": 15835 + } + }, + { + "items": [ + 8448.5, + 6.0255 + ], + "hints": { + "index": 15836 + } + }, + { + "items": [ + 8449, + 6.1605 + ], + "hints": { + "index": 15837 + } + }, + { + "items": [ + 8449.5, + 6.1613 + ], + "hints": { + "index": 15838 + } + }, + { + "items": [ + 8450, + 5.8047 + ], + "hints": { + "index": 15839 + } + }, + { + "items": [ + 8450.5, + 5.3261 + ], + "hints": { + "index": 15840 + } + }, + { + "items": [ + 8451, + 4.8494 + ], + "hints": { + "index": 15841 + } + }, + { + "items": [ + 8451.5, + 4.8313 + ], + "hints": { + "index": 15842 + } + }, + { + "items": [ + 8452, + 5.106 + ], + "hints": { + "index": 15843 + } + }, + { + "items": [ + 8452.5, + 6.0061 + ], + "hints": { + "index": 15844 + } + }, + { + "items": [ + 8453, + 6.9128 + ], + "hints": { + "index": 15845 + } + }, + { + "items": [ + 8453.5, + 7.925 + ], + "hints": { + "index": 15846 + } + }, + { + "items": [ + 8454, + 7.1188 + ], + "hints": { + "index": 15847 + } + }, + { + "items": [ + 8454.5, + 6.07 + ], + "hints": { + "index": 15848 + } + }, + { + "items": [ + 8455, + 5.5389 + ], + "hints": { + "index": 15849 + } + }, + { + "items": [ + 8455.5, + 5.6463 + ], + "hints": { + "index": 15850 + } + }, + { + "items": [ + 8456, + 5.8349 + ], + "hints": { + "index": 15851 + } + }, + { + "items": [ + 8456.5, + 5.7057 + ], + "hints": { + "index": 15852 + } + }, + { + "items": [ + 8457, + 6.0457 + ], + "hints": { + "index": 15853 + } + }, + { + "items": [ + 8457.5, + 6.584 + ], + "hints": { + "index": 15854 + } + }, + { + "items": [ + 8458, + 6.4058 + ], + "hints": { + "index": 15855 + } + }, + { + "items": [ + 8458.5, + 5.7569 + ], + "hints": { + "index": 15856 + } + }, + { + "items": [ + 8459, + 5.1983 + ], + "hints": { + "index": 15857 + } + }, + { + "items": [ + 8459.5, + 5.3023 + ], + "hints": { + "index": 15858 + } + }, + { + "items": [ + 8460, + 5.1978 + ], + "hints": { + "index": 15859 + } + }, + { + "items": [ + 8460.5, + 5.099 + ], + "hints": { + "index": 15860 + } + }, + { + "items": [ + 8461, + 5.2124 + ], + "hints": { + "index": 15861 + } + }, + { + "items": [ + 8461.5, + 6.0772 + ], + "hints": { + "index": 15862 + } + }, + { + "items": [ + 8462, + 7.0637 + ], + "hints": { + "index": 15863 + } + }, + { + "items": [ + 8462.5, + 7.5537 + ], + "hints": { + "index": 15864 + } + }, + { + "items": [ + 8463, + 7.4439 + ], + "hints": { + "index": 15865 + } + }, + { + "items": [ + 8463.5, + 7.2619 + ], + "hints": { + "index": 15866 + } + }, + { + "items": [ + 8464, + 6.9232 + ], + "hints": { + "index": 15867 + } + }, + { + "items": [ + 8464.5, + 6.1041 + ], + "hints": { + "index": 15868 + } + }, + { + "items": [ + 8465, + 5.4795 + ], + "hints": { + "index": 15869 + } + }, + { + "items": [ + 8465.5, + 5.1941 + ], + "hints": { + "index": 15870 + } + }, + { + "items": [ + 8466, + 5.1722 + ], + "hints": { + "index": 15871 + } + }, + { + "items": [ + 8466.5, + 5.203 + ], + "hints": { + "index": 15872 + } + }, + { + "items": [ + 8467, + 5.0754 + ], + "hints": { + "index": 15873 + } + }, + { + "items": [ + 8467.5, + 5.0235 + ], + "hints": { + "index": 15874 + } + }, + { + "items": [ + 8468, + 5.1256 + ], + "hints": { + "index": 15875 + } + }, + { + "items": [ + 8468.5, + 5.1195 + ], + "hints": { + "index": 15876 + } + }, + { + "items": [ + 8469, + 5.0138 + ], + "hints": { + "index": 15877 + } + }, + { + "items": [ + 8469.5, + 4.8578 + ], + "hints": { + "index": 15878 + } + }, + { + "items": [ + 8470, + 4.7759 + ], + "hints": { + "index": 15879 + } + }, + { + "items": [ + 8470.5, + 4.7749 + ], + "hints": { + "index": 15880 + } + }, + { + "items": [ + 8471, + 4.6999 + ], + "hints": { + "index": 15881 + } + }, + { + "items": [ + 8471.5, + 4.7997 + ], + "hints": { + "index": 15882 + } + }, + { + "items": [ + 8472, + 4.8018 + ], + "hints": { + "index": 15883 + } + }, + { + "items": [ + 8472.5, + 4.9027 + ], + "hints": { + "index": 15884 + } + }, + { + "items": [ + 8473, + 4.9042 + ], + "hints": { + "index": 15885 + } + }, + { + "items": [ + 8473.5, + 5.1024 + ], + "hints": { + "index": 15886 + } + }, + { + "items": [ + 8474, + 5.2582 + ], + "hints": { + "index": 15887 + } + }, + { + "items": [ + 8474.5, + 5.4171 + ], + "hints": { + "index": 15888 + } + }, + { + "items": [ + 8475, + 5.3323 + ], + "hints": { + "index": 15889 + } + }, + { + "items": [ + 8475.5, + 5.2182 + ], + "hints": { + "index": 15890 + } + }, + { + "items": [ + 8476, + 5.068 + ], + "hints": { + "index": 15891 + } + }, + { + "items": [ + 8476.5, + 5.1569 + ], + "hints": { + "index": 15892 + } + }, + { + "items": [ + 8477, + 5.1259 + ], + "hints": { + "index": 15893 + } + }, + { + "items": [ + 8477.5, + 5.0335 + ], + "hints": { + "index": 15894 + } + }, + { + "items": [ + 8478, + 4.8782 + ], + "hints": { + "index": 15895 + } + }, + { + "items": [ + 8478.5, + 4.761 + ], + "hints": { + "index": 15896 + } + }, + { + "items": [ + 8479, + 4.7132 + ], + "hints": { + "index": 15897 + } + }, + { + "items": [ + 8479.5, + 4.6375 + ], + "hints": { + "index": 15898 + } + }, + { + "items": [ + 8480, + 4.6377 + ], + "hints": { + "index": 15899 + } + }, + { + "items": [ + 8480.5, + 4.6375 + ], + "hints": { + "index": 15900 + } + }, + { + "items": [ + 8481, + 4.6375 + ], + "hints": { + "index": 15901 + } + }, + { + "items": [ + 8481.5, + 4.6375 + ], + "hints": { + "index": 15902 + } + }, + { + "items": [ + 8482, + 4.6375 + ], + "hints": { + "index": 15903 + } + }, + { + "items": [ + 8482.5, + 4.6375 + ], + "hints": { + "index": 15904 + } + }, + { + "items": [ + 8483, + 4.6375 + ], + "hints": { + "index": 15905 + } + }, + { + "items": [ + 8483.5, + 4.6375 + ], + "hints": { + "index": 15906 + } + }, + { + "items": [ + 8484, + 4.6375 + ], + "hints": { + "index": 15907 + } + }, + { + "items": [ + 8484.5, + 4.6375 + ], + "hints": { + "index": 15908 + } + }, + { + "items": [ + 8485, + 4.6375 + ], + "hints": { + "index": 15909 + } + }, + { + "items": [ + 8485.5, + 4.6375 + ], + "hints": { + "index": 15910 + } + }, + { + "items": [ + 8486, + 4.6375 + ], + "hints": { + "index": 15911 + } + }, + { + "items": [ + 8486.5, + 4.6375 + ], + "hints": { + "index": 15912 + } + }, + { + "items": [ + 8487, + 4.6375 + ], + "hints": { + "index": 15913 + } + }, + { + "items": [ + 8487.5, + 4.6375 + ], + "hints": { + "index": 15914 + } + }, + { + "items": [ + 8488, + 4.6375 + ], + "hints": { + "index": 15915 + } + }, + { + "items": [ + 8488.5, + 4.6375 + ], + "hints": { + "index": 15916 + } + }, + { + "items": [ + 8489, + 4.6375 + ], + "hints": { + "index": 15917 + } + }, + { + "items": [ + 8489.5, + 4.6375 + ], + "hints": { + "index": 15918 + } + }, + { + "items": [ + 8490, + 4.6375 + ], + "hints": { + "index": 15919 + } + }, + { + "items": [ + 8490.5, + 4.6375 + ], + "hints": { + "index": 15920 + } + }, + { + "items": [ + 8491, + 4.6375 + ], + "hints": { + "index": 15921 + } + }, + { + "items": [ + 8491.5, + 4.6375 + ], + "hints": { + "index": 15922 + } + }, + { + "items": [ + 8492, + 4.6374998092651367 + ], + "hints": { + "index": 15923 + } + }, + { + "items": [ + 8492.5, + 4.6375 + ], + "hints": { + "index": 15924 + } + }, + { + "items": [ + 8493, + 4.6375 + ], + "hints": { + "index": 15925 + } + }, + { + "items": [ + 8493.5, + 4.6375 + ], + "hints": { + "index": 15926 + } + }, + { + "items": [ + 8494, + 4.6374998092651367 + ], + "hints": { + "index": 15927 + } + }, + { + "items": [ + 8494.5, + 4.6374998092651367 + ], + "hints": { + "index": 15928 + } + }, + { + "items": [ + 8495, + 4.6375 + ], + "hints": { + "index": 15929 + } + }, + { + "items": [ + 8495.5, + 4.6375 + ], + "hints": { + "index": 15930 + } + }, + { + "items": [ + 8496, + 4.6375 + ], + "hints": { + "index": 15931 + } + }, + { + "items": [ + 8496.5, + 4.6375 + ], + "hints": { + "index": 15932 + } + }, + { + "items": [ + 8497, + 4.6375 + ], + "hints": { + "index": 15933 + } + }, + { + "items": [ + 8497.5, + 4.6375 + ], + "hints": { + "index": 15934 + } + }, + { + "items": [ + 8498, + 4.6374998092651367 + ], + "hints": { + "index": 15935 + } + }, + { + "items": [ + 8498.5, + 4.6374998092651367 + ], + "hints": { + "index": 15936 + } + }, + { + "items": [ + 8499, + 4.6374998092651367 + ], + "hints": { + "index": 15937 + } + }, + { + "items": [ + 8499.5, + 4.6375 + ], + "hints": { + "index": 15938 + } + }, + { + "items": [ + 8500, + 4.6374998092651367 + ], + "hints": { + "index": 15939 + } + }, + { + "items": [ + 8500.5, + 4.6375 + ], + "hints": { + "index": 15940 + } + }, + { + "items": [ + 8501, + 4.6374998092651367 + ], + "hints": { + "index": 15941 + } + }, + { + "items": [ + 8501.5, + 4.6375 + ], + "hints": { + "index": 15942 + } + }, + { + "items": [ + 8502, + 4.6375 + ], + "hints": { + "index": 15943 + } + }, + { + "items": [ + 8502.5, + 4.6375 + ], + "hints": { + "index": 15944 + } + }, + { + "items": [ + 8503, + 4.6374998092651367 + ], + "hints": { + "index": 15945 + } + }, + { + "items": [ + 8503.5, + 4.6375 + ], + "hints": { + "index": 15946 + } + }, + { + "items": [ + 8504, + 4.6375 + ], + "hints": { + "index": 15947 + } + }, + { + "items": [ + 8504.5, + 4.6375 + ], + "hints": { + "index": 15948 + } + }, + { + "items": [ + 8505, + 4.6374998092651367 + ], + "hints": { + "index": 15949 + } + }, + { + "items": [ + 8505.5, + 4.6374998092651367 + ], + "hints": { + "index": 15950 + } + }, + { + "items": [ + 8506, + 4.6375 + ], + "hints": { + "index": 15951 + } + }, + { + "items": [ + 8506.5, + 4.6374998092651367 + ], + "hints": { + "index": 15952 + } + }, + { + "items": [ + 8507, + 4.6375 + ], + "hints": { + "index": 15953 + } + }, + { + "items": [ + 8507.5, + 4.6375 + ], + "hints": { + "index": 15954 + } + }, + { + "items": [ + 8508, + 4.6375 + ], + "hints": { + "index": 15955 + } + }, + { + "items": [ + 8508.5, + 4.6375 + ], + "hints": { + "index": 15956 + } + }, + { + "items": [ + 8509, + 4.6375 + ], + "hints": { + "index": 15957 + } + }, + { + "items": [ + 8509.5, + 4.6375 + ], + "hints": { + "index": 15958 + } + }, + { + "items": [ + 8510, + 4.6375 + ], + "hints": { + "index": 15959 + } + }, + { + "items": [ + 8510.5, + 4.6375 + ], + "hints": { + "index": 15960 + } + }, + { + "items": [ + 8511, + 4.6375 + ], + "hints": { + "index": 15961 + } + }, + { + "items": [ + 8511.5, + 4.6375 + ], + "hints": { + "index": 15962 + } + }, + { + "items": [ + 8512, + 4.7143 + ], + "hints": { + "index": 15963 + } + }, + { + "items": [ + 8512.5, + null + ], + "hints": { + "index": 15964 + } + }, + { + "items": [ + 8513, + null + ], + "hints": { + "index": 15965 + } + }, + { + "items": [ + 8513.5, + null + ], + "hints": { + "index": 15966 + } + }, + { + "items": [ + 8514, + null + ], + "hints": { + "index": 15967 + } + }, + { + "items": [ + 8514.5, + null + ], + "hints": { + "index": 15968 + } + }, + { + "items": [ + 8515, + null + ], + "hints": { + "index": 15969 + } + }, + { + "items": [ + 8515.5, + null + ], + "hints": { + "index": 15970 + } + }, + { + "items": [ + 8516, + null + ], + "hints": { + "index": 15971 + } + }, + { + "items": [ + 8516.5, + null + ], + "hints": { + "index": 15972 + } + }, + { + "items": [ + 8517, + null + ], + "hints": { + "index": 15973 + } + }, + { + "items": [ + 8517.5, + null + ], + "hints": { + "index": 15974 + } + }, + { + "items": [ + 8518, + null + ], + "hints": { + "index": 15975 + } + }, + { + "items": [ + 8518.5, + null + ], + "hints": { + "index": 15976 + } + }, + { + "items": [ + 8519, + null + ], + "hints": { + "index": 15977 + } + }, + { + "items": [ + 8519.5, + null + ], + "hints": { + "index": 15978 + } + }, + { + "items": [ + 8520, + null + ], + "hints": { + "index": 15979 + } + }, + { + "items": [ + 8520.5, + null + ], + "hints": { + "index": 15980 + } + }, + { + "items": [ + 8521, + null + ], + "hints": { + "index": 15981 + } + }, + { + "items": [ + 8521.5, + null + ], + "hints": { + "index": 15982 + } + }, + { + "items": [ + 8522, + null + ], + "hints": { + "index": 15983 + } + }, + { + "items": [ + 8522.5, + null + ], + "hints": { + "index": 15984 + } + }, + { + "items": [ + 8523, + null + ], + "hints": { + "index": 15985 + } + }, + { + "items": [ + 8523.5, + null + ], + "hints": { + "index": 15986 + } + }, + { + "items": [ + 8524, + null + ], + "hints": { + "index": 15987 + } + }, + { + "items": [ + 8524.5, + null + ], + "hints": { + "index": 15988 + } + }, + { + "items": [ + 8525, + null + ], + "hints": { + "index": 15989 + } + }, + { + "items": [ + 8525.5, + null + ], + "hints": { + "index": 15990 + } + }, + { + "items": [ + 8526, + null + ], + "hints": { + "index": 15991 + } + }, + { + "items": [ + 8526.5, + null + ], + "hints": { + "index": 15992 + } + }, + { + "items": [ + 8527, + null + ], + "hints": { + "index": 15993 + } + }, + { + "items": [ + 8527.5, + null + ], + "hints": { + "index": 15994 + } + }, + { + "items": [ + 8528, + null + ], + "hints": { + "index": 15995 + } + }, + { + "items": [ + 8528.5, + null + ], + "hints": { + "index": 15996 + } + }, + { + "items": [ + 8529, + null + ], + "hints": { + "index": 15997 + } + }, + { + "items": [ + 8529.5, + null + ], + "hints": { + "index": 15998 + } + }, + { + "items": [ + 8530, + null + ], + "hints": { + "index": 15999 + } + }, + { + "items": [ + 8530.5, + null + ], + "hints": { + "index": 16000 + } + }, + { + "items": [ + 8531, + null + ], + "hints": { + "index": 16001 + } + }, + { + "items": [ + 8531.5, + null + ], + "hints": { + "index": 16002 + } + }, + { + "items": [ + 8532, + null + ], + "hints": { + "index": 16003 + } + }, + { + "items": [ + 8532.5, + null + ], + "hints": { + "index": 16004 + } + }, + { + "items": [ + 8533, + null + ], + "hints": { + "index": 16005 + } + }, + { + "items": [ + 8533.5, + null + ], + "hints": { + "index": 16006 + } + }, + { + "items": [ + 8534, + null + ], + "hints": { + "index": 16007 + } + }, + { + "items": [ + 8534.5, + null + ], + "hints": { + "index": 16008 + } + }, + { + "items": [ + 8535, + null + ], + "hints": { + "index": 16009 + } + }, + { + "items": [ + 8535.5, + null + ], + "hints": { + "index": 16010 + } + }, + { + "items": [ + 8536, + null + ], + "hints": { + "index": 16011 + } + }, + { + "items": [ + 8536.5, + null + ], + "hints": { + "index": 16012 + } + }, + { + "items": [ + 8537, + null + ], + "hints": { + "index": 16013 + } + }, + { + "items": [ + 8537.5, + null + ], + "hints": { + "index": 16014 + } + }, + { + "items": [ + 8538, + null + ], + "hints": { + "index": 16015 + } + }, + { + "items": [ + 8538.5, + null + ], + "hints": { + "index": 16016 + } + }, + { + "items": [ + 8539, + null + ], + "hints": { + "index": 16017 + } + }, + { + "items": [ + 8539.5, + null + ], + "hints": { + "index": 16018 + } + }, + { + "items": [ + 8540, + null + ], + "hints": { + "index": 16019 + } + }, + { + "items": [ + 8540.5, + null + ], + "hints": { + "index": 16020 + } + }, + { + "items": [ + 8541, + null + ], + "hints": { + "index": 16021 + } + }, + { + "items": [ + 8541.5, + null + ], + "hints": { + "index": 16022 + } + }, + { + "items": [ + 8542, + null + ], + "hints": { + "index": 16023 + } + }, + { + "items": [ + 8542.5, + null + ], + "hints": { + "index": 16024 + } + }, + { + "items": [ + 8543, + null + ], + "hints": { + "index": 16025 + } + }, + { + "items": [ + 8543.5, + null + ], + "hints": { + "index": 16026 + } + }, + { + "items": [ + 8544, + null + ], + "hints": { + "index": 16027 + } + }, + { + "items": [ + 8544.5, + null + ], + "hints": { + "index": 16028 + } + }, + { + "items": [ + 8545, + null + ], + "hints": { + "index": 16029 + } + }, + { + "items": [ + 8545.5, + null + ], + "hints": { + "index": 16030 + } + }, + { + "items": [ + 8546, + null + ], + "hints": { + "index": 16031 + } + }, + { + "items": [ + 8546.5, + null + ], + "hints": { + "index": 16032 + } + }, + { + "items": [ + 8547, + null + ], + "hints": { + "index": 16033 + } + }, + { + "items": [ + 8547.5, + null + ], + "hints": { + "index": 16034 + } + }, + { + "items": [ + 8548, + null + ], + "hints": { + "index": 16035 + } + }, + { + "items": [ + 8548.5, + null + ], + "hints": { + "index": 16036 + } + }, + { + "items": [ + 8549, + null + ], + "hints": { + "index": 16037 + } + }, + { + "items": [ + 8549.5, + null + ], + "hints": { + "index": 16038 + } + }, + { + "items": [ + 8550, + null + ], + "hints": { + "index": 16039 + } + }, + { + "items": [ + 8550.5, + null + ], + "hints": { + "index": 16040 + } + }, + { + "items": [ + 8551, + null + ], + "hints": { + "index": 16041 + } + }, + { + "items": [ + 8551.5, + null + ], + "hints": { + "index": 16042 + } + }, + { + "items": [ + 8552, + null + ], + "hints": { + "index": 16043 + } + }, + { + "items": [ + 8552.5, + null + ], + "hints": { + "index": 16044 + } + }, + { + "items": [ + 8553, + null + ], + "hints": { + "index": 16045 + } + }, + { + "items": [ + 8553.5, + null + ], + "hints": { + "index": 16046 + } + }, + { + "items": [ + 8554, + null + ], + "hints": { + "index": 16047 + } + }, + { + "items": [ + 8554.5, + null + ], + "hints": { + "index": 16048 + } + }, + { + "items": [ + 8555, + null + ], + "hints": { + "index": 16049 + } + }, + { + "items": [ + 8555.5, + null + ], + "hints": { + "index": 16050 + } + }, + { + "items": [ + 8556, + null + ], + "hints": { + "index": 16051 + } + }, + { + "items": [ + 8556.5, + null + ], + "hints": { + "index": 16052 + } + }, + { + "items": [ + 8557, + null + ], + "hints": { + "index": 16053 + } + }, + { + "items": [ + 8557.5, + null + ], + "hints": { + "index": 16054 + } + }, + { + "items": [ + 8558, + null + ], + "hints": { + "index": 16055 + } + }, + { + "items": [ + 8558.5, + null + ], + "hints": { + "index": 16056 + } + }, + { + "items": [ + 8559, + null + ], + "hints": { + "index": 16057 + } + }, + { + "items": [ + 8559.5, + null + ], + "hints": { + "index": 16058 + } + }, + { + "items": [ + 8560, + null + ], + "hints": { + "index": 16059 + } + }, + { + "items": [ + 8560.5, + null + ], + "hints": { + "index": 16060 + } + }, + { + "items": [ + 8561, + null + ], + "hints": { + "index": 16061 + } + }, + { + "items": [ + 8561.5, + null + ], + "hints": { + "index": 16062 + } + }, + { + "items": [ + 8562, + null + ], + "hints": { + "index": 16063 + } + }, + { + "items": [ + 8562.5, + null + ], + "hints": { + "index": 16064 + } + }, + { + "items": [ + 8563, + null + ], + "hints": { + "index": 16065 + } + }, + { + "items": [ + 8563.5, + null + ], + "hints": { + "index": 16066 + } + }, + { + "items": [ + 8564, + null + ], + "hints": { + "index": 16067 + } + }, + { + "items": [ + 8564.5, + null + ], + "hints": { + "index": 16068 + } + }, + { + "items": [ + 8565, + null + ], + "hints": { + "index": 16069 + } + }, + { + "items": [ + 8565.5, + null + ], + "hints": { + "index": 16070 + } + }, + { + "items": [ + 8566, + null + ], + "hints": { + "index": 16071 + } + }, + { + "items": [ + 8566.5, + null + ], + "hints": { + "index": 16072 + } + }, + { + "items": [ + 8567, + null + ], + "hints": { + "index": 16073 + } + }, + { + "items": [ + 8567.5, + null + ], + "hints": { + "index": 16074 + } + }, + { + "items": [ + 8568, + null + ], + "hints": { + "index": 16075 + } + }, + { + "items": [ + 8568.5, + null + ], + "hints": { + "index": 16076 + } + }, + { + "items": [ + 8569, + null + ], + "hints": { + "index": 16077 + } + }, + { + "items": [ + 8569.5, + null + ], + "hints": { + "index": 16078 + } + }, + { + "items": [ + 8570, + null + ], + "hints": { + "index": 16079 + } + }, + { + "items": [ + 8570.5, + null + ], + "hints": { + "index": 16080 + } + }, + { + "items": [ + 8571, + null + ], + "hints": { + "index": 16081 + } + }, + { + "items": [ + 8571.5, + null + ], + "hints": { + "index": 16082 + } + }, + { + "items": [ + 8572, + null + ], + "hints": { + "index": 16083 + } + }, + { + "items": [ + 8572.5, + null + ], + "hints": { + "index": 16084 + } + }, + { + "items": [ + 8573, + null + ], + "hints": { + "index": 16085 + } + }, + { + "items": [ + 8573.5, + null + ], + "hints": { + "index": 16086 + } + }, + { + "items": [ + 8574, + null + ], + "hints": { + "index": 16087 + } + }, + { + "items": [ + 8574.5, + null + ], + "hints": { + "index": 16088 + } + }, + { + "items": [ + 8575, + null + ], + "hints": { + "index": 16089 + } + }, + { + "items": [ + 8575.5, + null + ], + "hints": { + "index": 16090 + } + }, + { + "items": [ + 8576, + null + ], + "hints": { + "index": 16091 + } + }, + { + "items": [ + 8576.5, + null + ], + "hints": { + "index": 16092 + } + }, + { + "items": [ + 8577, + null + ], + "hints": { + "index": 16093 + } + }, + { + "items": [ + 8577.5, + null + ], + "hints": { + "index": 16094 + } + }, + { + "items": [ + 8578, + null + ], + "hints": { + "index": 16095 + } + }, + { + "items": [ + 8578.5, + null + ], + "hints": { + "index": 16096 + } + }, + { + "items": [ + 8579, + null + ], + "hints": { + "index": 16097 + } + }, + { + "items": [ + 8579.5, + null + ], + "hints": { + "index": 16098 + } + }, + { + "items": [ + 8580, + null + ], + "hints": { + "index": 16099 + } + }, + { + "items": [ + 8580.5, + null + ], + "hints": { + "index": 16100 + } + }, + { + "items": [ + 8581, + null + ], + "hints": { + "index": 16101 + } + }, + { + "items": [ + 8581.5, + null + ], + "hints": { + "index": 16102 + } + }, + { + "items": [ + 8582, + null + ], + "hints": { + "index": 16103 + } + }, + { + "items": [ + 8582.5, + null + ], + "hints": { + "index": 16104 + } + }, + { + "items": [ + 8583, + null + ], + "hints": { + "index": 16105 + } + }, + { + "items": [ + 8583.5, + null + ], + "hints": { + "index": 16106 + } + }, + { + "items": [ + 8584, + null + ], + "hints": { + "index": 16107 + } + }, + { + "items": [ + 8584.5, + null + ], + "hints": { + "index": 16108 + } + }, + { + "items": [ + 8585, + null + ], + "hints": { + "index": 16109 + } + }, + { + "items": [ + 8585.5, + null + ], + "hints": { + "index": 16110 + } + }, + { + "items": [ + 8586, + null + ], + "hints": { + "index": 16111 + } + }, + { + "items": [ + 8586.5, + null + ], + "hints": { + "index": 16112 + } + }, + { + "items": [ + 8587, + null + ], + "hints": { + "index": 16113 + } + }, + { + "items": [ + 8587.5, + null + ], + "hints": { + "index": 16114 + } + }, + { + "items": [ + 8588, + null + ], + "hints": { + "index": 16115 + } + }, + { + "items": [ + 8588.5, + null + ], + "hints": { + "index": 16116 + } + }, + { + "items": [ + 8589, + null + ], + "hints": { + "index": 16117 + } + }, + { + "items": [ + 8589.5, + null + ], + "hints": { + "index": 16118 + } + }, + { + "items": [ + 8590, + null + ], + "hints": { + "index": 16119 + } + }, + { + "items": [ + 8590.5, + null + ], + "hints": { + "index": 16120 + } + }, + { + "items": [ + 8591, + null + ], + "hints": { + "index": 16121 + } + }, + { + "items": [ + 8591.5, + null + ], + "hints": { + "index": 16122 + } + }, + { + "items": [ + 8592, + null + ], + "hints": { + "index": 16123 + } + }, + { + "items": [ + 8592.5, + null + ], + "hints": { + "index": 16124 + } + }, + { + "items": [ + 8593, + null + ], + "hints": { + "index": 16125 + } + }, + { + "items": [ + 8593.5, + null + ], + "hints": { + "index": 16126 + } + }, + { + "items": [ + 8594, + null + ], + "hints": { + "index": 16127 + } + }, + { + "items": [ + 8594.5, + null + ], + "hints": { + "index": 16128 + } + }, + { + "items": [ + 8595, + null + ], + "hints": { + "index": 16129 + } + }, + { + "items": [ + 8595.5, + null + ], + "hints": { + "index": 16130 + } + }, + { + "items": [ + 8596, + null + ], + "hints": { + "index": 16131 + } + }, + { + "items": [ + 8596.5, + null + ], + "hints": { + "index": 16132 + } + }, + { + "items": [ + 8597, + null + ], + "hints": { + "index": 16133 + } + }, + { + "items": [ + 8597.5, + null + ], + "hints": { + "index": 16134 + } + }, + { + "items": [ + 8598, + null + ], + "hints": { + "index": 16135 + } + }, + { + "items": [ + 8598.5, + null + ], + "hints": { + "index": 16136 + } + }, + { + "items": [ + 8599, + null + ], + "hints": { + "index": 16137 + } + }, + { + "items": [ + 8599.5, + null + ], + "hints": { + "index": 16138 + } + }, + { + "items": [ + 8600, + null + ], + "hints": { + "index": 16139 + } + }, + { + "items": [ + 8600.5, + null + ], + "hints": { + "index": 16140 + } + }, + { + "items": [ + 8601, + null + ], + "hints": { + "index": 16141 + } + }, + { + "items": [ + 8601.5, + null + ], + "hints": { + "index": 16142 + } + }, + { + "items": [ + 8602, + null + ], + "hints": { + "index": 16143 + } + }, + { + "items": [ + 8602.5, + null + ], + "hints": { + "index": 16144 + } + }, + { + "items": [ + 8603, + null + ], + "hints": { + "index": 16145 + } + }, + { + "items": [ + 8603.5, + null + ], + "hints": { + "index": 16146 + } + }, + { + "items": [ + 8604, + null + ], + "hints": { + "index": 16147 + } + }, + { + "items": [ + 8604.5, + null + ], + "hints": { + "index": 16148 + } + }, + { + "items": [ + 8605, + null + ], + "hints": { + "index": 16149 + } + }, + { + "items": [ + 8605.5, + null + ], + "hints": { + "index": 16150 + } + }, + { + "items": [ + 8606, + null + ], + "hints": { + "index": 16151 + } + }, + { + "items": [ + 8606.5, + null + ], + "hints": { + "index": 16152 + } + }, + { + "items": [ + 8607, + null + ], + "hints": { + "index": 16153 + } + }, + { + "items": [ + 8607.5, + null + ], + "hints": { + "index": 16154 + } + }, + { + "items": [ + 8608, + null + ], + "hints": { + "index": 16155 + } + }, + { + "items": [ + 8608.5, + null + ], + "hints": { + "index": 16156 + } + }, + { + "items": [ + 8609, + null + ], + "hints": { + "index": 16157 + } + }, + { + "items": [ + 8609.5, + null + ], + "hints": { + "index": 16158 + } + }, + { + "items": [ + 8610, + null + ], + "hints": { + "index": 16159 + } + }, + { + "items": [ + 8610.5, + null + ], + "hints": { + "index": 16160 + } + }, + { + "items": [ + 8611, + null + ], + "hints": { + "index": 16161 + } + }, + { + "items": [ + 8611.5, + null + ], + "hints": { + "index": 16162 + } + }, + { + "items": [ + 8612, + null + ], + "hints": { + "index": 16163 + } + }, + { + "items": [ + 8612.5, + null + ], + "hints": { + "index": 16164 + } + }, + { + "items": [ + 8613, + null + ], + "hints": { + "index": 16165 + } + }, + { + "items": [ + 8613.5, + null + ], + "hints": { + "index": 16166 + } + }, + { + "items": [ + 8614, + null + ], + "hints": { + "index": 16167 + } + }, + { + "items": [ + 8614.5, + null + ], + "hints": { + "index": 16168 + } + }, + { + "items": [ + 8615, + null + ], + "hints": { + "index": 16169 + } + }, + { + "items": [ + 8615.5, + null + ], + "hints": { + "index": 16170 + } + }, + { + "items": [ + 8616, + null + ], + "hints": { + "index": 16171 + } + }, + { + "items": [ + 8616.5, + null + ], + "hints": { + "index": 16172 + } + }, + { + "items": [ + 8617, + null + ], + "hints": { + "index": 16173 + } + }, + { + "items": [ + 8617.5, + null + ], + "hints": { + "index": 16174 + } + }, + { + "items": [ + 8618, + null + ], + "hints": { + "index": 16175 + } + }, + { + "items": [ + 8618.5, + null + ], + "hints": { + "index": 16176 + } + }, + { + "items": [ + 8619, + null + ], + "hints": { + "index": 16177 + } + }, + { + "items": [ + 8619.5, + null + ], + "hints": { + "index": 16178 + } + }, + { + "items": [ + 8620, + null + ], + "hints": { + "index": 16179 + } + }, + { + "items": [ + 8620.5, + null + ], + "hints": { + "index": 16180 + } + }, + { + "items": [ + 8621, + null + ], + "hints": { + "index": 16181 + } + }, + { + "items": [ + 8621.5, + null + ], + "hints": { + "index": 16182 + } + }, + { + "items": [ + 8622, + null + ], + "hints": { + "index": 16183 + } + }, + { + "items": [ + 8622.5, + null + ], + "hints": { + "index": 16184 + } + }, + { + "items": [ + 8623, + null + ], + "hints": { + "index": 16185 + } + }, + { + "items": [ + 8623.5, + null + ], + "hints": { + "index": 16186 + } + }, + { + "items": [ + 8624, + null + ], + "hints": { + "index": 16187 + } + }, + { + "items": [ + 8624.5, + null + ], + "hints": { + "index": 16188 + } + }, + { + "items": [ + 8625, + null + ], + "hints": { + "index": 16189 + } + }, + { + "items": [ + 8625.5, + null + ], + "hints": { + "index": 16190 + } + }, + { + "items": [ + 8626, + null + ], + "hints": { + "index": 16191 + } + }, + { + "items": [ + 8626.5, + null + ], + "hints": { + "index": 16192 + } + }, + { + "items": [ + 8627, + null + ], + "hints": { + "index": 16193 + } + }, + { + "items": [ + 8627.5, + null + ], + "hints": { + "index": 16194 + } + }, + { + "items": [ + 8628, + null + ], + "hints": { + "index": 16195 + } + }, + { + "items": [ + 8628.5, + null + ], + "hints": { + "index": 16196 + } + }, + { + "items": [ + 8629, + null + ], + "hints": { + "index": 16197 + } + }, + { + "items": [ + 8629.5, + null + ], + "hints": { + "index": 16198 + } + }, + { + "items": [ + 8630, + null + ], + "hints": { + "index": 16199 + } + }, + { + "items": [ + 8630.5, + null + ], + "hints": { + "index": 16200 + } + }, + { + "items": [ + 8631, + null + ], + "hints": { + "index": 16201 + } + }, + { + "items": [ + 8631.5, + null + ], + "hints": { + "index": 16202 + } + }, + { + "items": [ + 8632, + null + ], + "hints": { + "index": 16203 + } + }, + { + "items": [ + 8632.5, + null + ], + "hints": { + "index": 16204 + } + }, + { + "items": [ + 8633, + null + ], + "hints": { + "index": 16205 + } + }, + { + "items": [ + 8633.5, + null + ], + "hints": { + "index": 16206 + } + }, + { + "items": [ + 8634, + null + ], + "hints": { + "index": 16207 + } + }, + { + "items": [ + 8634.5, + null + ], + "hints": { + "index": 16208 + } + }, + { + "items": [ + 8635, + null + ], + "hints": { + "index": 16209 + } + }, + { + "items": [ + 8635.5, + null + ], + "hints": { + "index": 16210 + } + }, + { + "items": [ + 8636, + null + ], + "hints": { + "index": 16211 + } + }, + { + "items": [ + 8636.5, + null + ], + "hints": { + "index": 16212 + } + }, + { + "items": [ + 8637, + null + ], + "hints": { + "index": 16213 + } + }, + { + "items": [ + 8637.5, + null + ], + "hints": { + "index": 16214 + } + }, + { + "items": [ + 8638, + null + ], + "hints": { + "index": 16215 + } + }, + { + "items": [ + 8638.5, + null + ], + "hints": { + "index": 16216 + } + }, + { + "items": [ + 8639, + null + ], + "hints": { + "index": 16217 + } + }, + { + "items": [ + 8639.5, + null + ], + "hints": { + "index": 16218 + } + }, + { + "items": [ + 8640, + null + ], + "hints": { + "index": 16219 + } + }, + { + "items": [ + 8640.5, + null + ], + "hints": { + "index": 16220 + } + }, + { + "items": [ + 8641, + null + ], + "hints": { + "index": 16221 + } + }, + { + "items": [ + 8641.5, + null + ], + "hints": { + "index": 16222 + } + }, + { + "items": [ + 8642, + null + ], + "hints": { + "index": 16223 + } + }, + { + "items": [ + 8642.5, + null + ], + "hints": { + "index": 16224 + } + }, + { + "items": [ + 8643, + null + ], + "hints": { + "index": 16225 + } + }, + { + "items": [ + 8643.5, + null + ], + "hints": { + "index": 16226 + } + }, + { + "items": [ + 8644, + null + ], + "hints": { + "index": 16227 + } + }, + { + "items": [ + 8644.5, + null + ], + "hints": { + "index": 16228 + } + }, + { + "items": [ + 8645, + null + ], + "hints": { + "index": 16229 + } + }, + { + "items": [ + 8645.5, + null + ], + "hints": { + "index": 16230 + } + }, + { + "items": [ + 8646, + null + ], + "hints": { + "index": 16231 + } + }, + { + "items": [ + 8646.5, + null + ], + "hints": { + "index": 16232 + } + }, + { + "items": [ + 8647, + null + ], + "hints": { + "index": 16233 + } + }, + { + "items": [ + 8647.5, + null + ], + "hints": { + "index": 16234 + } + }, + { + "items": [ + 8648, + null + ], + "hints": { + "index": 16235 + } + }, + { + "items": [ + 8648.5, + null + ], + "hints": { + "index": 16236 + } + }, + { + "items": [ + 8649, + null + ], + "hints": { + "index": 16237 + } + }, + { + "items": [ + 8649.5, + null + ], + "hints": { + "index": 16238 + } + }, + { + "items": [ + 8650, + null + ], + "hints": { + "index": 16239 + } + }, + { + "items": [ + 8650.5, + null + ], + "hints": { + "index": 16240 + } + }, + { + "items": [ + 8651, + null + ], + "hints": { + "index": 16241 + } + }, + { + "items": [ + 8651.5, + null + ], + "hints": { + "index": 16242 + } + }, + { + "items": [ + 8652, + null + ], + "hints": { + "index": 16243 + } + }, + { + "items": [ + 8652.5, + null + ], + "hints": { + "index": 16244 + } + }, + { + "items": [ + 8653, + null + ], + "hints": { + "index": 16245 + } + }, + { + "items": [ + 8653.5, + null + ], + "hints": { + "index": 16246 + } + }, + { + "items": [ + 8654, + null + ], + "hints": { + "index": 16247 + } + }, + { + "items": [ + 8654.5, + null + ], + "hints": { + "index": 16248 + } + }, + { + "items": [ + 8655, + null + ], + "hints": { + "index": 16249 + } + }, + { + "items": [ + 8655.5, + null + ], + "hints": { + "index": 16250 + } + }, + { + "items": [ + 8656, + null + ], + "hints": { + "index": 16251 + } + }, + { + "items": [ + 8656.5, + null + ], + "hints": { + "index": 16252 + } + }, + { + "items": [ + 8657, + null + ], + "hints": { + "index": 16253 + } + }, + { + "items": [ + 8657.5, + null + ], + "hints": { + "index": 16254 + } + }, + { + "items": [ + 8658, + null + ], + "hints": { + "index": 16255 + } + }, + { + "items": [ + 8658.5, + null + ], + "hints": { + "index": 16256 + } + }, + { + "items": [ + 8659, + null + ], + "hints": { + "index": 16257 + } + }, + { + "items": [ + 8659.5, + null + ], + "hints": { + "index": 16258 + } + }, + { + "items": [ + 8660, + null + ], + "hints": { + "index": 16259 + } + }, + { + "items": [ + 8660.5, + null + ], + "hints": { + "index": 16260 + } + }, + { + "items": [ + 8661, + null + ], + "hints": { + "index": 16261 + } + }, + { + "items": [ + 8661.5, + null + ], + "hints": { + "index": 16262 + } + }, + { + "items": [ + 8662, + null + ], + "hints": { + "index": 16263 + } + }, + { + "items": [ + 8662.5, + null + ], + "hints": { + "index": 16264 + } + }, + { + "items": [ + 8663, + null + ], + "hints": { + "index": 16265 + } + }, + { + "items": [ + 8663.5, + null + ], + "hints": { + "index": 16266 + } + }, + { + "items": [ + 8664, + null + ], + "hints": { + "index": 16267 + } + }, + { + "items": [ + 8664.5, + null + ], + "hints": { + "index": 16268 + } + }, + { + "items": [ + 8665, + null + ], + "hints": { + "index": 16269 + } + }, + { + "items": [ + 8665.5, + null + ], + "hints": { + "index": 16270 + } + }, + { + "items": [ + 8666, + null + ], + "hints": { + "index": 16271 + } + }, + { + "items": [ + 8666.5, + null + ], + "hints": { + "index": 16272 + } + }, + { + "items": [ + 8667, + null + ], + "hints": { + "index": 16273 + } + }, + { + "items": [ + 8667.5, + null + ], + "hints": { + "index": 16274 + } + }, + { + "items": [ + 8668, + null + ], + "hints": { + "index": 16275 + } + }, + { + "items": [ + 8668.5, + null + ], + "hints": { + "index": 16276 + } + }, + { + "items": [ + 8669, + null + ], + "hints": { + "index": 16277 + } + }, + { + "items": [ + 8669.5, + null + ], + "hints": { + "index": 16278 + } + }, + { + "items": [ + 8670, + null + ], + "hints": { + "index": 16279 + } + }, + { + "items": [ + 8670.5, + null + ], + "hints": { + "index": 16280 + } + }, + { + "items": [ + 8671, + null + ], + "hints": { + "index": 16281 + } + }, + { + "items": [ + 8671.5, + null + ], + "hints": { + "index": 16282 + } + }, + { + "items": [ + 8672, + null + ], + "hints": { + "index": 16283 + } + }, + { + "items": [ + 8672.5, + null + ], + "hints": { + "index": 16284 + } + }, + { + "items": [ + 8673, + null + ], + "hints": { + "index": 16285 + } + }, + { + "items": [ + 8673.5, + null + ], + "hints": { + "index": 16286 + } + }, + { + "items": [ + 8674, + null + ], + "hints": { + "index": 16287 + } + }, + { + "items": [ + 8674.5, + null + ], + "hints": { + "index": 16288 + } + }, + { + "items": [ + 8675, + null + ], + "hints": { + "index": 16289 + } + }, + { + "items": [ + 8675.5, + null + ], + "hints": { + "index": 16290 + } + }, + { + "items": [ + 8676, + null + ], + "hints": { + "index": 16291 + } + }, + { + "items": [ + 8676.5, + null + ], + "hints": { + "index": 16292 + } + }, + { + "items": [ + 8677, + null + ], + "hints": { + "index": 16293 + } + }, + { + "items": [ + 8677.5, + null + ], + "hints": { + "index": 16294 + } + }, + { + "items": [ + 8678, + null + ], + "hints": { + "index": 16295 + } + }, + { + "items": [ + 8678.5, + null + ], + "hints": { + "index": 16296 + } + }, + { + "items": [ + 8679, + null + ], + "hints": { + "index": 16297 + } + }, + { + "items": [ + 8679.5, + null + ], + "hints": { + "index": 16298 + } + }, + { + "items": [ + 8680, + null + ], + "hints": { + "index": 16299 + } + }, + { + "items": [ + 8680.5, + null + ], + "hints": { + "index": 16300 + } + }, + { + "items": [ + 8681, + null + ], + "hints": { + "index": 16301 + } + }, + { + "items": [ + 8681.5, + null + ], + "hints": { + "index": 16302 + } + }, + { + "items": [ + 8682, + null + ], + "hints": { + "index": 16303 + } + }, + { + "items": [ + 8682.5, + null + ], + "hints": { + "index": 16304 + } + }, + { + "items": [ + 8683, + null + ], + "hints": { + "index": 16305 + } + }, + { + "items": [ + 8683.5, + null + ], + "hints": { + "index": 16306 + } + }, + { + "items": [ + 8684, + null + ], + "hints": { + "index": 16307 + } + }, + { + "items": [ + 8684.5, + null + ], + "hints": { + "index": 16308 + } + }, + { + "items": [ + 8685, + null + ], + "hints": { + "index": 16309 + } + }, + { + "items": [ + 8685.5, + null + ], + "hints": { + "index": 16310 + } + }, + { + "items": [ + 8686, + null + ], + "hints": { + "index": 16311 + } + }, + { + "items": [ + 8686.5, + null + ], + "hints": { + "index": 16312 + } + }, + { + "items": [ + 8687, + null + ], + "hints": { + "index": 16313 + } + }, + { + "items": [ + 8687.5, + null + ], + "hints": { + "index": 16314 + } + }, + { + "items": [ + 8688, + null + ], + "hints": { + "index": 16315 + } + }, + { + "items": [ + 8688.5, + null + ], + "hints": { + "index": 16316 + } + }, + { + "items": [ + 8689, + null + ], + "hints": { + "index": 16317 + } + }, + { + "items": [ + 8689.5, + null + ], + "hints": { + "index": 16318 + } + }, + { + "items": [ + 8690, + null + ], + "hints": { + "index": 16319 + } + }, + { + "items": [ + 8690.5, + null + ], + "hints": { + "index": 16320 + } + }, + { + "items": [ + 8691, + null + ], + "hints": { + "index": 16321 + } + }, + { + "items": [ + 8691.5, + null + ], + "hints": { + "index": 16322 + } + }, + { + "items": [ + 8692, + null + ], + "hints": { + "index": 16323 + } + }, + { + "items": [ + 8692.5, + null + ], + "hints": { + "index": 16324 + } + }, + { + "items": [ + 8693, + null + ], + "hints": { + "index": 16325 + } + }, + { + "items": [ + 8693.5, + null + ], + "hints": { + "index": 16326 + } + }, + { + "items": [ + 8694, + null + ], + "hints": { + "index": 16327 + } + }, + { + "items": [ + 8694.5, + null + ], + "hints": { + "index": 16328 + } + }, + { + "items": [ + 8695, + null + ], + "hints": { + "index": 16329 + } + }, + { + "items": [ + 8695.5, + null + ], + "hints": { + "index": 16330 + } + }, + { + "items": [ + 8696, + null + ], + "hints": { + "index": 16331 + } + }, + { + "items": [ + 8696.5, + null + ], + "hints": { + "index": 16332 + } + }, + { + "items": [ + 8697, + null + ], + "hints": { + "index": 16333 + } + }, + { + "items": [ + 8697.5, + null + ], + "hints": { + "index": 16334 + } + }, + { + "items": [ + 8698, + null + ], + "hints": { + "index": 16335 + } + }, + { + "items": [ + 8698.5, + null + ], + "hints": { + "index": 16336 + } + }, + { + "items": [ + 8699, + null + ], + "hints": { + "index": 16337 + } + }, + { + "items": [ + 8699.5, + null + ], + "hints": { + "index": 16338 + } + }, + { + "items": [ + 8700, + null + ], + "hints": { + "index": 16339 + } + }, + { + "items": [ + 8700.5, + null + ], + "hints": { + "index": 16340 + } + }, + { + "items": [ + 8701, + null + ], + "hints": { + "index": 16341 + } + }, + { + "items": [ + 8701.5, + null + ], + "hints": { + "index": 16342 + } + }, + { + "items": [ + 8702, + null + ], + "hints": { + "index": 16343 + } + }, + { + "items": [ + 8702.5, + null + ], + "hints": { + "index": 16344 + } + }, + { + "items": [ + 8703, + null + ], + "hints": { + "index": 16345 + } + }, + { + "items": [ + 8703.5, + null + ], + "hints": { + "index": 16346 + } + }, + { + "items": [ + 8704, + null + ], + "hints": { + "index": 16347 + } + }, + { + "items": [ + 8704.5, + null + ], + "hints": { + "index": 16348 + } + }, + { + "items": [ + 8705, + null + ], + "hints": { + "index": 16349 + } + }, + { + "items": [ + 8705.5, + null + ], + "hints": { + "index": 16350 + } + }, + { + "items": [ + 8706, + null + ], + "hints": { + "index": 16351 + } + }, + { + "items": [ + 8706.5, + null + ], + "hints": { + "index": 16352 + } + }, + { + "items": [ + 8707, + null + ], + "hints": { + "index": 16353 + } + }, + { + "items": [ + 8707.5, + null + ], + "hints": { + "index": 16354 + } + }, + { + "items": [ + 8708, + null + ], + "hints": { + "index": 16355 + } + }, + { + "items": [ + 8708.5, + null + ], + "hints": { + "index": 16356 + } + }, + { + "items": [ + 8709, + null + ], + "hints": { + "index": 16357 + } + }, + { + "items": [ + 8709.5, + null + ], + "hints": { + "index": 16358 + } + }, + { + "items": [ + 8710, + null + ], + "hints": { + "index": 16359 + } + }, + { + "items": [ + 8710.5, + null + ], + "hints": { + "index": 16360 + } + }, + { + "items": [ + 8711, + null + ], + "hints": { + "index": 16361 + } + }, + { + "items": [ + 8711.5, + null + ], + "hints": { + "index": 16362 + } + }, + { + "items": [ + 8712, + null + ], + "hints": { + "index": 16363 + } + }, + { + "items": [ + 8712.5, + null + ], + "hints": { + "index": 16364 + } + }, + { + "items": [ + 8713, + null + ], + "hints": { + "index": 16365 + } + }, + { + "items": [ + 8713.5, + null + ], + "hints": { + "index": 16366 + } + }, + { + "items": [ + 8714, + null + ], + "hints": { + "index": 16367 + } + }, + { + "items": [ + 8714.5, + null + ], + "hints": { + "index": 16368 + } + }, + { + "items": [ + 8715, + null + ], + "hints": { + "index": 16369 + } + }, + { + "items": [ + 8715.5, + null + ], + "hints": { + "index": 16370 + } + }, + { + "items": [ + 8716, + null + ], + "hints": { + "index": 16371 + } + }, + { + "items": [ + 8716.5, + null + ], + "hints": { + "index": 16372 + } + }, + { + "items": [ + 8717, + null + ], + "hints": { + "index": 16373 + } + }, + { + "items": [ + 8717.5, + null + ], + "hints": { + "index": 16374 + } + }, + { + "items": [ + 8718, + null + ], + "hints": { + "index": 16375 + } + }, + { + "items": [ + 8718.5, + null + ], + "hints": { + "index": 16376 + } + }, + { + "items": [ + 8719, + null + ], + "hints": { + "index": 16377 + } + }, + { + "items": [ + 8719.5, + null + ], + "hints": { + "index": 16378 + } + }, + { + "items": [ + 8720, + null + ], + "hints": { + "index": 16379 + } + }, + { + "items": [ + 8720.5, + null + ], + "hints": { + "index": 16380 + } + }, + { + "items": [ + 8721, + null + ], + "hints": { + "index": 16381 + } + }, + { + "items": [ + 8721.5, + null + ], + "hints": { + "index": 16382 + } + }, + { + "items": [ + 8722, + null + ], + "hints": { + "index": 16383 + } + }, + { + "items": [ + 8722.5, + null + ], + "hints": { + "index": 16384 + } + }, + { + "items": [ + 8723, + null + ], + "hints": { + "index": 16385 + } + }, + { + "items": [ + 8723.5, + null + ], + "hints": { + "index": 16386 + } + }, + { + "items": [ + 8724, + null + ], + "hints": { + "index": 16387 + } + }, + { + "items": [ + 8724.5, + null + ], + "hints": { + "index": 16388 + } + }, + { + "items": [ + 8725, + null + ], + "hints": { + "index": 16389 + } + }, + { + "items": [ + 8725.5, + null + ], + "hints": { + "index": 16390 + } + }, + { + "items": [ + 8726, + null + ], + "hints": { + "index": 16391 + } + }, + { + "items": [ + 8726.5, + null + ], + "hints": { + "index": 16392 + } + }, + { + "items": [ + 8727, + null + ], + "hints": { + "index": 16393 + } + }, + { + "items": [ + 8727.5, + null + ], + "hints": { + "index": 16394 + } + }, + { + "items": [ + 8728, + null + ], + "hints": { + "index": 16395 + } + }, + { + "items": [ + 8728.5, + null + ], + "hints": { + "index": 16396 + } + }, + { + "items": [ + 8729, + null + ], + "hints": { + "index": 16397 + } + }, + { + "items": [ + 8729.5, + null + ], + "hints": { + "index": 16398 + } + }, + { + "items": [ + 8730, + null + ], + "hints": { + "index": 16399 + } + }, + { + "items": [ + 8730.5, + null + ], + "hints": { + "index": 16400 + } + }, + { + "items": [ + 8731, + null + ], + "hints": { + "index": 16401 + } + }, + { + "items": [ + 8731.5, + null + ], + "hints": { + "index": 16402 + } + }, + { + "items": [ + 8732, + null + ], + "hints": { + "index": 16403 + } + }, + { + "items": [ + 8732.5, + null + ], + "hints": { + "index": 16404 + } + }, + { + "items": [ + 8733, + null + ], + "hints": { + "index": 16405 + } + }, + { + "items": [ + 8733.5, + null + ], + "hints": { + "index": 16406 + } + }, + { + "items": [ + 8734, + null + ], + "hints": { + "index": 16407 + } + }, + { + "items": [ + 8734.5, + null + ], + "hints": { + "index": 16408 + } + }, + { + "items": [ + 8735, + null + ], + "hints": { + "index": 16409 + } + }, + { + "items": [ + 8735.5, + null + ], + "hints": { + "index": 16410 + } + }, + { + "items": [ + 8736, + null + ], + "hints": { + "index": 16411 + } + }, + { + "items": [ + 8736.5, + null + ], + "hints": { + "index": 16412 + } + }, + { + "items": [ + 8737, + null + ], + "hints": { + "index": 16413 + } + }, + { + "items": [ + 8737.5, + null + ], + "hints": { + "index": 16414 + } + }, + { + "items": [ + 8738, + null + ], + "hints": { + "index": 16415 + } + }, + { + "items": [ + 8738.5, + null + ], + "hints": { + "index": 16416 + } + }, + { + "items": [ + 8739, + null + ], + "hints": { + "index": 16417 + } + }, + { + "items": [ + 8739.5, + null + ], + "hints": { + "index": 16418 + } + }, + { + "items": [ + 8740, + null + ], + "hints": { + "index": 16419 + } + }, + { + "items": [ + 8740.5, + null + ], + "hints": { + "index": 16420 + } + }, + { + "items": [ + 8741, + null + ], + "hints": { + "index": 16421 + } + }, + { + "items": [ + 8741.5, + null + ], + "hints": { + "index": 16422 + } + }, + { + "items": [ + 8742, + null + ], + "hints": { + "index": 16423 + } + }, + { + "items": [ + 8742.5, + null + ], + "hints": { + "index": 16424 + } + }, + { + "items": [ + 8743, + null + ], + "hints": { + "index": 16425 + } + }, + { + "items": [ + 8743.5, + null + ], + "hints": { + "index": 16426 + } + }, + { + "items": [ + 8744, + null + ], + "hints": { + "index": 16427 + } + }, + { + "items": [ + 8744.5, + null + ], + "hints": { + "index": 16428 + } + }, + { + "items": [ + 8745, + null + ], + "hints": { + "index": 16429 + } + }, + { + "items": [ + 8745.5, + null + ], + "hints": { + "index": 16430 + } + }, + { + "items": [ + 8746, + null + ], + "hints": { + "index": 16431 + } + }, + { + "items": [ + 8746.5, + null + ], + "hints": { + "index": 16432 + } + }, + { + "items": [ + 8747, + null + ], + "hints": { + "index": 16433 + } + }, + { + "items": [ + 8747.5, + null + ], + "hints": { + "index": 16434 + } + }, + { + "items": [ + 8748, + null + ], + "hints": { + "index": 16435 + } + }, + { + "items": [ + 8748.5, + null + ], + "hints": { + "index": 16436 + } + }, + { + "items": [ + 8749, + null + ], + "hints": { + "index": 16437 + } + }, + { + "items": [ + 8749.5, + null + ], + "hints": { + "index": 16438 + } + }, + { + "items": [ + 8750, + null + ], + "hints": { + "index": 16439 + } + }, + { + "items": [ + 8750.5, + null + ], + "hints": { + "index": 16440 + } + }, + { + "items": [ + 8751, + null + ], + "hints": { + "index": 16441 + } + }, + { + "items": [ + 8751.5, + null + ], + "hints": { + "index": 16442 + } + }, + { + "items": [ + 8752, + null + ], + "hints": { + "index": 16443 + } + }, + { + "items": [ + 8752.5, + null + ], + "hints": { + "index": 16444 + } + }, + { + "items": [ + 8753, + null + ], + "hints": { + "index": 16445 + } + }, + { + "items": [ + 8753.5, + null + ], + "hints": { + "index": 16446 + } + }, + { + "items": [ + 8754, + null + ], + "hints": { + "index": 16447 + } + }, + { + "items": [ + 8754.5, + null + ], + "hints": { + "index": 16448 + } + }, + { + "items": [ + 8755, + null + ], + "hints": { + "index": 16449 + } + }, + { + "items": [ + 8755.5, + null + ], + "hints": { + "index": 16450 + } + }, + { + "items": [ + 8756, + null + ], + "hints": { + "index": 16451 + } + }, + { + "items": [ + 8756.5, + null + ], + "hints": { + "index": 16452 + } + }, + { + "items": [ + 8757, + null + ], + "hints": { + "index": 16453 + } + }, + { + "items": [ + 8757.5, + null + ], + "hints": { + "index": 16454 + } + }, + { + "items": [ + 8758, + null + ], + "hints": { + "index": 16455 + } + }, + { + "items": [ + 8758.5, + null + ], + "hints": { + "index": 16456 + } + }, + { + "items": [ + 8759, + null + ], + "hints": { + "index": 16457 + } + }, + { + "items": [ + 8759.5, + null + ], + "hints": { + "index": 16458 + } + }, + { + "items": [ + 8760, + null + ], + "hints": { + "index": 16459 + } + }, + { + "items": [ + 8760.5, + null + ], + "hints": { + "index": 16460 + } + }, + { + "items": [ + 8761, + null + ], + "hints": { + "index": 16461 + } + }, + { + "items": [ + 8761.5, + null + ], + "hints": { + "index": 16462 + } + }, + { + "items": [ + 8762, + null + ], + "hints": { + "index": 16463 + } + }, + { + "items": [ + 8762.5, + null + ], + "hints": { + "index": 16464 + } + }, + { + "items": [ + 8763, + null + ], + "hints": { + "index": 16465 + } + }, + { + "items": [ + 8763.5, + null + ], + "hints": { + "index": 16466 + } + }, + { + "items": [ + 8764, + null + ], + "hints": { + "index": 16467 + } + }, + { + "items": [ + 8764.5, + null + ], + "hints": { + "index": 16468 + } + }, + { + "items": [ + 8765, + null + ], + "hints": { + "index": 16469 + } + }, + { + "items": [ + 8765.5, + null + ], + "hints": { + "index": 16470 + } + }, + { + "items": [ + 8766, + null + ], + "hints": { + "index": 16471 + } + }, + { + "items": [ + 8766.5, + null + ], + "hints": { + "index": 16472 + } + }, + { + "items": [ + 8767, + null + ], + "hints": { + "index": 16473 + } + }, + { + "items": [ + 8767.5, + null + ], + "hints": { + "index": 16474 + } + }, + { + "items": [ + 8768, + null + ], + "hints": { + "index": 16475 + } + }, + { + "items": [ + 8768.5, + null + ], + "hints": { + "index": 16476 + } + }, + { + "items": [ + 8769, + null + ], + "hints": { + "index": 16477 + } + }, + { + "items": [ + 8769.5, + null + ], + "hints": { + "index": 16478 + } + }, + { + "items": [ + 8770, + null + ], + "hints": { + "index": 16479 + } + }, + { + "items": [ + 8770.5, + null + ], + "hints": { + "index": 16480 + } + }, + { + "items": [ + 8771, + null + ], + "hints": { + "index": 16481 + } + }, + { + "items": [ + 8771.5, + null + ], + "hints": { + "index": 16482 + } + }, + { + "items": [ + 8772, + null + ], + "hints": { + "index": 16483 + } + }, + { + "items": [ + 8772.5, + null + ], + "hints": { + "index": 16484 + } + }, + { + "items": [ + 8773, + null + ], + "hints": { + "index": 16485 + } + }, + { + "items": [ + 8773.5, + null + ], + "hints": { + "index": 16486 + } + }, + { + "items": [ + 8774, + null + ], + "hints": { + "index": 16487 + } + }, + { + "items": [ + 8774.5, + null + ], + "hints": { + "index": 16488 + } + }, + { + "items": [ + 8775, + null + ], + "hints": { + "index": 16489 + } + }, + { + "items": [ + 8775.5, + null + ], + "hints": { + "index": 16490 + } + }, + { + "items": [ + 8776, + null + ], + "hints": { + "index": 16491 + } + }, + { + "items": [ + 8776.5, + null + ], + "hints": { + "index": 16492 + } + }, + { + "items": [ + 8777, + null + ], + "hints": { + "index": 16493 + } + }, + { + "items": [ + 8777.5, + null + ], + "hints": { + "index": 16494 + } + }, + { + "items": [ + 8778, + null + ], + "hints": { + "index": 16495 + } + }, + { + "items": [ + 8778.5, + null + ], + "hints": { + "index": 16496 + } + }, + { + "items": [ + 8779, + null + ], + "hints": { + "index": 16497 + } + }, + { + "items": [ + 8779.5, + null + ], + "hints": { + "index": 16498 + } + }, + { + "items": [ + 8780, + null + ], + "hints": { + "index": 16499 + } + }, + { + "items": [ + 8780.5, + null + ], + "hints": { + "index": 16500 + } + }, + { + "items": [ + 8781, + null + ], + "hints": { + "index": 16501 + } + }, + { + "items": [ + 8781.5, + null + ], + "hints": { + "index": 16502 + } + }, + { + "items": [ + 8782, + null + ], + "hints": { + "index": 16503 + } + }, + { + "items": [ + 8782.5, + null + ], + "hints": { + "index": 16504 + } + }, + { + "items": [ + 8783, + null + ], + "hints": { + "index": 16505 + } + }, + { + "items": [ + 8783.5, + null + ], + "hints": { + "index": 16506 + } + }, + { + "items": [ + 8784, + null + ], + "hints": { + "index": 16507 + } + }, + { + "items": [ + 8784.5, + null + ], + "hints": { + "index": 16508 + } + }, + { + "items": [ + 8785, + null + ], + "hints": { + "index": 16509 + } + }, + { + "items": [ + 8785.5, + null + ], + "hints": { + "index": 16510 + } + }, + { + "items": [ + 8786, + null + ], + "hints": { + "index": 16511 + } + }, + { + "items": [ + 8786.5, + null + ], + "hints": { + "index": 16512 + } + }, + { + "items": [ + 8787, + null + ], + "hints": { + "index": 16513 + } + }, + { + "items": [ + 8787.5, + null + ], + "hints": { + "index": 16514 + } + }, + { + "items": [ + 8788, + null + ], + "hints": { + "index": 16515 + } + }, + { + "items": [ + 8788.5, + null + ], + "hints": { + "index": 16516 + } + }, + { + "items": [ + 8789, + null + ], + "hints": { + "index": 16517 + } + }, + { + "items": [ + 8789.5, + null + ], + "hints": { + "index": 16518 + } + }, + { + "items": [ + 8790, + null + ], + "hints": { + "index": 16519 + } + }, + { + "items": [ + 8790.5, + null + ], + "hints": { + "index": 16520 + } + }, + { + "items": [ + 8791, + null + ], + "hints": { + "index": 16521 + } + }, + { + "items": [ + 8791.5, + null + ], + "hints": { + "index": 16522 + } + }, + { + "items": [ + 8792, + null + ], + "hints": { + "index": 16523 + } + }, + { + "items": [ + 8792.5, + null + ], + "hints": { + "index": 16524 + } + }, + { + "items": [ + 8793, + null + ], + "hints": { + "index": 16525 + } + }, + { + "items": [ + 8793.5, + null + ], + "hints": { + "index": 16526 + } + }, + { + "items": [ + 8794, + null + ], + "hints": { + "index": 16527 + } + }, + { + "items": [ + 8794.5, + null + ], + "hints": { + "index": 16528 + } + }, + { + "items": [ + 8795, + null + ], + "hints": { + "index": 16529 + } + }, + { + "items": [ + 8795.5, + null + ], + "hints": { + "index": 16530 + } + }, + { + "items": [ + 8796, + null + ], + "hints": { + "index": 16531 + } + }, + { + "items": [ + 8796.5, + null + ], + "hints": { + "index": 16532 + } + }, + { + "items": [ + 8797, + null + ], + "hints": { + "index": 16533 + } + }, + { + "items": [ + 8797.5, + null + ], + "hints": { + "index": 16534 + } + }, + { + "items": [ + 8798, + null + ], + "hints": { + "index": 16535 + } + }, + { + "items": [ + 8798.5, + null + ], + "hints": { + "index": 16536 + } + }, + { + "items": [ + 8799, + null + ], + "hints": { + "index": 16537 + } + }, + { + "items": [ + 8799.5, + null + ], + "hints": { + "index": 16538 + } + }, + { + "items": [ + 8800, + null + ], + "hints": { + "index": 16539 + } + }, + { + "items": [ + 8800.5, + null + ], + "hints": { + "index": 16540 + } + }, + { + "items": [ + 8801, + null + ], + "hints": { + "index": 16541 + } + }, + { + "items": [ + 8801.5, + null + ], + "hints": { + "index": 16542 + } + }, + { + "items": [ + 8802, + null + ], + "hints": { + "index": 16543 + } + }, + { + "items": [ + 8802.5, + null + ], + "hints": { + "index": 16544 + } + }, + { + "items": [ + 8803, + null + ], + "hints": { + "index": 16545 + } + }, + { + "items": [ + 8803.5, + null + ], + "hints": { + "index": 16546 + } + }, + { + "items": [ + 8804, + null + ], + "hints": { + "index": 16547 + } + }, + { + "items": [ + 8804.5, + null + ], + "hints": { + "index": 16548 + } + }, + { + "items": [ + 8805, + null + ], + "hints": { + "index": 16549 + } + }, + { + "items": [ + 8805.5, + null + ], + "hints": { + "index": 16550 + } + }, + { + "items": [ + 8806, + null + ], + "hints": { + "index": 16551 + } + }, + { + "items": [ + 8806.5, + null + ], + "hints": { + "index": 16552 + } + }, + { + "items": [ + 8807, + null + ], + "hints": { + "index": 16553 + } + }, + { + "items": [ + 8807.5, + null + ], + "hints": { + "index": 16554 + } + }, + { + "items": [ + 8808, + null + ], + "hints": { + "index": 16555 + } + }, + { + "items": [ + 8808.5, + null + ], + "hints": { + "index": 16556 + } + }, + { + "items": [ + 8809, + null + ], + "hints": { + "index": 16557 + } + }, + { + "items": [ + 8809.5, + null + ], + "hints": { + "index": 16558 + } + }, + { + "items": [ + 8810, + null + ], + "hints": { + "index": 16559 + } + }, + { + "items": [ + 8810.5, + null + ], + "hints": { + "index": 16560 + } + }, + { + "items": [ + 8811, + null + ], + "hints": { + "index": 16561 + } + }, + { + "items": [ + 8811.5, + null + ], + "hints": { + "index": 16562 + } + }, + { + "items": [ + 8812, + null + ], + "hints": { + "index": 16563 + } + }, + { + "items": [ + 8812.5, + null + ], + "hints": { + "index": 16564 + } + }, + { + "items": [ + 8813, + null + ], + "hints": { + "index": 16565 + } + }, + { + "items": [ + 8813.5, + null + ], + "hints": { + "index": 16566 + } + }, + { + "items": [ + 8814, + null + ], + "hints": { + "index": 16567 + } + }, + { + "items": [ + 8814.5, + null + ], + "hints": { + "index": 16568 + } + }, + { + "items": [ + 8815, + null + ], + "hints": { + "index": 16569 + } + }, + { + "items": [ + 8815.5, + null + ], + "hints": { + "index": 16570 + } + }, + { + "items": [ + 8816, + null + ], + "hints": { + "index": 16571 + } + }, + { + "items": [ + 8816.5, + null + ], + "hints": { + "index": 16572 + } + }, + { + "items": [ + 8817, + null + ], + "hints": { + "index": 16573 + } + }, + { + "items": [ + 8817.5, + null + ], + "hints": { + "index": 16574 + } + }, + { + "items": [ + 8818, + null + ], + "hints": { + "index": 16575 + } + }, + { + "items": [ + 8818.5, + null + ], + "hints": { + "index": 16576 + } + }, + { + "items": [ + 8819, + null + ], + "hints": { + "index": 16577 + } + }, + { + "items": [ + 8819.5, + null + ], + "hints": { + "index": 16578 + } + }, + { + "items": [ + 8820, + null + ], + "hints": { + "index": 16579 + } + }, + { + "items": [ + 8820.5, + null + ], + "hints": { + "index": 16580 + } + }, + { + "items": [ + 8821, + null + ], + "hints": { + "index": 16581 + } + }, + { + "items": [ + 8821.5, + null + ], + "hints": { + "index": 16582 + } + }, + { + "items": [ + 8822, + null + ], + "hints": { + "index": 16583 + } + }, + { + "items": [ + 8822.5, + null + ], + "hints": { + "index": 16584 + } + }, + { + "items": [ + 8823, + null + ], + "hints": { + "index": 16585 + } + }, + { + "items": [ + 8823.5, + null + ], + "hints": { + "index": 16586 + } + }, + { + "items": [ + 8824, + null + ], + "hints": { + "index": 16587 + } + }, + { + "items": [ + 8824.5, + null + ], + "hints": { + "index": 16588 + } + }, + { + "items": [ + 8825, + null + ], + "hints": { + "index": 16589 + } + }, + { + "items": [ + 8825.5, + null + ], + "hints": { + "index": 16590 + } + }, + { + "items": [ + 8826, + null + ], + "hints": { + "index": 16591 + } + }, + { + "items": [ + 8826.5, + null + ], + "hints": { + "index": 16592 + } + }, + { + "items": [ + 8827, + null + ], + "hints": { + "index": 16593 + } + }, + { + "items": [ + 8827.5, + null + ], + "hints": { + "index": 16594 + } + }, + { + "items": [ + 8828, + null + ], + "hints": { + "index": 16595 + } + }, + { + "items": [ + 8828.5, + null + ], + "hints": { + "index": 16596 + } + }, + { + "items": [ + 8829, + null + ], + "hints": { + "index": 16597 + } + }, + { + "items": [ + 8829.5, + null + ], + "hints": { + "index": 16598 + } + }, + { + "items": [ + 8830, + null + ], + "hints": { + "index": 16599 + } + }, + { + "items": [ + 8830.5, + null + ], + "hints": { + "index": 16600 + } + }, + { + "items": [ + 8831, + null + ], + "hints": { + "index": 16601 + } + }, + { + "items": [ + 8831.5, + null + ], + "hints": { + "index": 16602 + } + }, + { + "items": [ + 8832, + null + ], + "hints": { + "index": 16603 + } + }, + { + "items": [ + 8832.5, + null + ], + "hints": { + "index": 16604 + } + }, + { + "items": [ + 8833, + null + ], + "hints": { + "index": 16605 + } + }, + { + "items": [ + 8833.5, + null + ], + "hints": { + "index": 16606 + } + }, + { + "items": [ + 8834, + null + ], + "hints": { + "index": 16607 + } + }, + { + "items": [ + 8834.5, + null + ], + "hints": { + "index": 16608 + } + }, + { + "items": [ + 8835, + null + ], + "hints": { + "index": 16609 + } + }, + { + "items": [ + 8835.5, + null + ], + "hints": { + "index": 16610 + } + }, + { + "items": [ + 8836, + null + ], + "hints": { + "index": 16611 + } + }, + { + "items": [ + 8836.5, + null + ], + "hints": { + "index": 16612 + } + }, + { + "items": [ + 8837, + null + ], + "hints": { + "index": 16613 + } + }, + { + "items": [ + 8837.5, + null + ], + "hints": { + "index": 16614 + } + }, + { + "items": [ + 8838, + null + ], + "hints": { + "index": 16615 + } + }, + { + "items": [ + 8838.5, + null + ], + "hints": { + "index": 16616 + } + }, + { + "items": [ + 8839, + null + ], + "hints": { + "index": 16617 + } + }, + { + "items": [ + 8839.5, + null + ], + "hints": { + "index": 16618 + } + }, + { + "items": [ + 8840, + null + ], + "hints": { + "index": 16619 + } + }, + { + "items": [ + 8840.5, + null + ], + "hints": { + "index": 16620 + } + }, + { + "items": [ + 8841, + null + ], + "hints": { + "index": 16621 + } + }, + { + "items": [ + 8841.5, + null + ], + "hints": { + "index": 16622 + } + }, + { + "items": [ + 8842, + null + ], + "hints": { + "index": 16623 + } + }, + { + "items": [ + 8842.5, + null + ], + "hints": { + "index": 16624 + } + }, + { + "items": [ + 8843, + null + ], + "hints": { + "index": 16625 + } + }, + { + "items": [ + 8843.5, + null + ], + "hints": { + "index": 16626 + } + }, + { + "items": [ + 8844, + null + ], + "hints": { + "index": 16627 + } + }, + { + "items": [ + 8844.5, + null + ], + "hints": { + "index": 16628 + } + }, + { + "items": [ + 8845, + null + ], + "hints": { + "index": 16629 + } + }, + { + "items": [ + 8845.5, + null + ], + "hints": { + "index": 16630 + } + }, + { + "items": [ + 8846, + null + ], + "hints": { + "index": 16631 + } + }, + { + "items": [ + 8846.5, + null + ], + "hints": { + "index": 16632 + } + }, + { + "items": [ + 8847, + null + ], + "hints": { + "index": 16633 + } + }, + { + "items": [ + 8847.5, + null + ], + "hints": { + "index": 16634 + } + }, + { + "items": [ + 8848, + null + ], + "hints": { + "index": 16635 + } + }, + { + "items": [ + 8848.5, + null + ], + "hints": { + "index": 16636 + } + }, + { + "items": [ + 8849, + null + ], + "hints": { + "index": 16637 + } + }, + { + "items": [ + 8849.5, + null + ], + "hints": { + "index": 16638 + } + }, + { + "items": [ + 8850, + null + ], + "hints": { + "index": 16639 + } + }, + { + "items": [ + 8850.5, + null + ], + "hints": { + "index": 16640 + } + }, + { + "items": [ + 8851, + null + ], + "hints": { + "index": 16641 + } + }, + { + "items": [ + 8851.5, + null + ], + "hints": { + "index": 16642 + } + }, + { + "items": [ + 8852, + null + ], + "hints": { + "index": 16643 + } + }, + { + "items": [ + 8852.5, + null + ], + "hints": { + "index": 16644 + } + }, + { + "items": [ + 8853, + null + ], + "hints": { + "index": 16645 + } + }, + { + "items": [ + 8853.5, + null + ], + "hints": { + "index": 16646 + } + }, + { + "items": [ + 8854, + null + ], + "hints": { + "index": 16647 + } + }, + { + "items": [ + 8854.5, + null + ], + "hints": { + "index": 16648 + } + }, + { + "items": [ + 8855, + null + ], + "hints": { + "index": 16649 + } + }, + { + "items": [ + 8855.5, + null + ], + "hints": { + "index": 16650 + } + }, + { + "items": [ + 8856, + null + ], + "hints": { + "index": 16651 + } + }, + { + "items": [ + 8856.5, + null + ], + "hints": { + "index": 16652 + } + }, + { + "items": [ + 8857, + null + ], + "hints": { + "index": 16653 + } + }, + { + "items": [ + 8857.5, + null + ], + "hints": { + "index": 16654 + } + }, + { + "items": [ + 8858, + null + ], + "hints": { + "index": 16655 + } + }, + { + "items": [ + 8858.5, + null + ], + "hints": { + "index": 16656 + } + }, + { + "items": [ + 8859, + null + ], + "hints": { + "index": 16657 + } + }, + { + "items": [ + 8859.5, + null + ], + "hints": { + "index": 16658 + } + }, + { + "items": [ + 8860, + null + ], + "hints": { + "index": 16659 + } + }, + { + "items": [ + 8860.5, + null + ], + "hints": { + "index": 16660 + } + }, + { + "items": [ + 8861, + null + ], + "hints": { + "index": 16661 + } + }, + { + "items": [ + 8861.5, + null + ], + "hints": { + "index": 16662 + } + }, + { + "items": [ + 8862, + null + ], + "hints": { + "index": 16663 + } + }, + { + "items": [ + 8862.5, + null + ], + "hints": { + "index": 16664 + } + }, + { + "items": [ + 8863, + null + ], + "hints": { + "index": 16665 + } + }, + { + "items": [ + 8863.5, + null + ], + "hints": { + "index": 16666 + } + }, + { + "items": [ + 8864, + null + ], + "hints": { + "index": 16667 + } + }, + { + "items": [ + 8864.5, + null + ], + "hints": { + "index": 16668 + } + }, + { + "items": [ + 8865, + null + ], + "hints": { + "index": 16669 + } + }, + { + "items": [ + 8865.5, + null + ], + "hints": { + "index": 16670 + } + }, + { + "items": [ + 8866, + null + ], + "hints": { + "index": 16671 + } + }, + { + "items": [ + 8866.5, + null + ], + "hints": { + "index": 16672 + } + }, + { + "items": [ + 8867, + null + ], + "hints": { + "index": 16673 + } + }, + { + "items": [ + 8867.5, + null + ], + "hints": { + "index": 16674 + } + }, + { + "items": [ + 8868, + null + ], + "hints": { + "index": 16675 + } + }, + { + "items": [ + 8868.5, + null + ], + "hints": { + "index": 16676 + } + }, + { + "items": [ + 8869, + null + ], + "hints": { + "index": 16677 + } + }, + { + "items": [ + 8869.5, + null + ], + "hints": { + "index": 16678 + } + }, + { + "items": [ + 8870, + null + ], + "hints": { + "index": 16679 + } + }, + { + "items": [ + 8870.5, + null + ], + "hints": { + "index": 16680 + } + }, + { + "items": [ + 8871, + null + ], + "hints": { + "index": 16681 + } + }, + { + "items": [ + 8871.5, + null + ], + "hints": { + "index": 16682 + } + }, + { + "items": [ + 8872, + null + ], + "hints": { + "index": 16683 + } + }, + { + "items": [ + 8872.5, + null + ], + "hints": { + "index": 16684 + } + }, + { + "items": [ + 8873, + null + ], + "hints": { + "index": 16685 + } + }, + { + "items": [ + 8873.5, + null + ], + "hints": { + "index": 16686 + } + }, + { + "items": [ + 8874, + null + ], + "hints": { + "index": 16687 + } + }, + { + "items": [ + 8874.5, + null + ], + "hints": { + "index": 16688 + } + }, + { + "items": [ + 8875, + null + ], + "hints": { + "index": 16689 + } + }, + { + "items": [ + 8875.5, + null + ], + "hints": { + "index": 16690 + } + }, + { + "items": [ + 8876, + null + ], + "hints": { + "index": 16691 + } + }, + { + "items": [ + 8876.5, + null + ], + "hints": { + "index": 16692 + } + }, + { + "items": [ + 8877, + null + ], + "hints": { + "index": 16693 + } + }, + { + "items": [ + 8877.5, + null + ], + "hints": { + "index": 16694 + } + }, + { + "items": [ + 8878, + null + ], + "hints": { + "index": 16695 + } + }, + { + "items": [ + 8878.5, + null + ], + "hints": { + "index": 16696 + } + }, + { + "items": [ + 8879, + null + ], + "hints": { + "index": 16697 + } + }, + { + "items": [ + 8879.5, + null + ], + "hints": { + "index": 16698 + } + }, + { + "items": [ + 8880, + null + ], + "hints": { + "index": 16699 + } + }, + { + "items": [ + 8880.5, + null + ], + "hints": { + "index": 16700 + } + }, + { + "items": [ + 8881, + null + ], + "hints": { + "index": 16701 + } + }, + { + "items": [ + 8881.5, + null + ], + "hints": { + "index": 16702 + } + }, + { + "items": [ + 8882, + null + ], + "hints": { + "index": 16703 + } + }, + { + "items": [ + 8882.5, + null + ], + "hints": { + "index": 16704 + } + }, + { + "items": [ + 8883, + null + ], + "hints": { + "index": 16705 + } + }, + { + "items": [ + 8883.5, + null + ], + "hints": { + "index": 16706 + } + }, + { + "items": [ + 8884, + null + ], + "hints": { + "index": 16707 + } + }, + { + "items": [ + 8884.5, + null + ], + "hints": { + "index": 16708 + } + }, + { + "items": [ + 8885, + null + ], + "hints": { + "index": 16709 + } + }, + { + "items": [ + 8885.5, + null + ], + "hints": { + "index": 16710 + } + }, + { + "items": [ + 8886, + null + ], + "hints": { + "index": 16711 + } + }, + { + "items": [ + 8886.5, + null + ], + "hints": { + "index": 16712 + } + }, + { + "items": [ + 8887, + null + ], + "hints": { + "index": 16713 + } + }, + { + "items": [ + 8887.5, + null + ], + "hints": { + "index": 16714 + } + }, + { + "items": [ + 8888, + null + ], + "hints": { + "index": 16715 + } + }, + { + "items": [ + 8888.5, + null + ], + "hints": { + "index": 16716 + } + }, + { + "items": [ + 8889, + null + ], + "hints": { + "index": 16717 + } + }, + { + "items": [ + 8889.5, + null + ], + "hints": { + "index": 16718 + } + }, + { + "items": [ + 8890, + null + ], + "hints": { + "index": 16719 + } + }, + { + "items": [ + 8890.5, + null + ], + "hints": { + "index": 16720 + } + }, + { + "items": [ + 8891, + null + ], + "hints": { + "index": 16721 + } + }, + { + "items": [ + 8891.5, + null + ], + "hints": { + "index": 16722 + } + }, + { + "items": [ + 8892, + null + ], + "hints": { + "index": 16723 + } + }, + { + "items": [ + 8892.5, + null + ], + "hints": { + "index": 16724 + } + }, + { + "items": [ + 8893, + null + ], + "hints": { + "index": 16725 + } + }, + { + "items": [ + 8893.5, + null + ], + "hints": { + "index": 16726 + } + }, + { + "items": [ + 8894, + null + ], + "hints": { + "index": 16727 + } + }, + { + "items": [ + 8894.5, + null + ], + "hints": { + "index": 16728 + } + }, + { + "items": [ + 8895, + null + ], + "hints": { + "index": 16729 + } + }, + { + "items": [ + 8895.5, + null + ], + "hints": { + "index": 16730 + } + }, + { + "items": [ + 8896, + null + ], + "hints": { + "index": 16731 + } + }, + { + "items": [ + 8896.5, + null + ], + "hints": { + "index": 16732 + } + }, + { + "items": [ + 8897, + null + ], + "hints": { + "index": 16733 + } + }, + { + "items": [ + 8897.5, + null + ], + "hints": { + "index": 16734 + } + }, + { + "items": [ + 8898, + null + ], + "hints": { + "index": 16735 + } + }, + { + "items": [ + 8898.5, + null + ], + "hints": { + "index": 16736 + } + }, + { + "items": [ + 8899, + null + ], + "hints": { + "index": 16737 + } + }, + { + "items": [ + 8899.5, + null + ], + "hints": { + "index": 16738 + } + }, + { + "items": [ + 8900, + null + ], + "hints": { + "index": 16739 + } + }, + { + "items": [ + 8900.5, + null + ], + "hints": { + "index": 16740 + } + }, + { + "items": [ + 8901, + null + ], + "hints": { + "index": 16741 + } + }, + { + "items": [ + 8901.5, + null + ], + "hints": { + "index": 16742 + } + }, + { + "items": [ + 8902, + null + ], + "hints": { + "index": 16743 + } + }, + { + "items": [ + 8902.5, + null + ], + "hints": { + "index": 16744 + } + }, + { + "items": [ + 8903, + null + ], + "hints": { + "index": 16745 + } + }, + { + "items": [ + 8903.5, + null + ], + "hints": { + "index": 16746 + } + }, + { + "items": [ + 8904, + null + ], + "hints": { + "index": 16747 + } + }, + { + "items": [ + 8904.5, + null + ], + "hints": { + "index": 16748 + } + }, + { + "items": [ + 8905, + null + ], + "hints": { + "index": 16749 + } + }, + { + "items": [ + 8905.5, + null + ], + "hints": { + "index": 16750 + } + }, + { + "items": [ + 8906, + null + ], + "hints": { + "index": 16751 + } + }, + { + "items": [ + 8906.5, + null + ], + "hints": { + "index": 16752 + } + }, + { + "items": [ + 8907, + null + ], + "hints": { + "index": 16753 + } + }, + { + "items": [ + 8907.5, + null + ], + "hints": { + "index": 16754 + } + }, + { + "items": [ + 8908, + null + ], + "hints": { + "index": 16755 + } + }, + { + "items": [ + 8908.5, + null + ], + "hints": { + "index": 16756 + } + }, + { + "items": [ + 8909, + null + ], + "hints": { + "index": 16757 + } + }, + { + "items": [ + 8909.5, + null + ], + "hints": { + "index": 16758 + } + }, + { + "items": [ + 8910, + null + ], + "hints": { + "index": 16759 + } + }, + { + "items": [ + 8910.5, + null + ], + "hints": { + "index": 16760 + } + }, + { + "items": [ + 8911, + null + ], + "hints": { + "index": 16761 + } + }, + { + "items": [ + 8911.5, + null + ], + "hints": { + "index": 16762 + } + }, + { + "items": [ + 8912, + null + ], + "hints": { + "index": 16763 + } + }, + { + "items": [ + 8912.5, + null + ], + "hints": { + "index": 16764 + } + }, + { + "items": [ + 8913, + null + ], + "hints": { + "index": 16765 + } + }, + { + "items": [ + 8913.5, + null + ], + "hints": { + "index": 16766 + } + }, + { + "items": [ + 8914, + null + ], + "hints": { + "index": 16767 + } + }, + { + "items": [ + 8914.5, + null + ], + "hints": { + "index": 16768 + } + }, + { + "items": [ + 8915, + null + ], + "hints": { + "index": 16769 + } + }, + { + "items": [ + 8915.5, + null + ], + "hints": { + "index": 16770 + } + }, + { + "items": [ + 8916, + null + ], + "hints": { + "index": 16771 + } + }, + { + "items": [ + 8916.5, + null + ], + "hints": { + "index": 16772 + } + }, + { + "items": [ + 8917, + null + ], + "hints": { + "index": 16773 + } + }, + { + "items": [ + 8917.5, + null + ], + "hints": { + "index": 16774 + } + }, + { + "items": [ + 8918, + null + ], + "hints": { + "index": 16775 + } + }, + { + "items": [ + 8918.5, + null + ], + "hints": { + "index": 16776 + } + }, + { + "items": [ + 8919, + null + ], + "hints": { + "index": 16777 + } + }, + { + "items": [ + 8919.5, + null + ], + "hints": { + "index": 16778 + } + }, + { + "items": [ + 8920, + null + ], + "hints": { + "index": 16779 + } + }, + { + "items": [ + 8920.5, + null + ], + "hints": { + "index": 16780 + } + }, + { + "items": [ + 8921, + null + ], + "hints": { + "index": 16781 + } + }, + { + "items": [ + 8921.5, + null + ], + "hints": { + "index": 16782 + } + }, + { + "items": [ + 8922, + null + ], + "hints": { + "index": 16783 + } + }, + { + "items": [ + 8922.5, + null + ], + "hints": { + "index": 16784 + } + }, + { + "items": [ + 8923, + null + ], + "hints": { + "index": 16785 + } + }, + { + "items": [ + 8923.5, + null + ], + "hints": { + "index": 16786 + } + }, + { + "items": [ + 8924, + null + ], + "hints": { + "index": 16787 + } + }, + { + "items": [ + 8924.5, + null + ], + "hints": { + "index": 16788 + } + }, + { + "items": [ + 8925, + null + ], + "hints": { + "index": 16789 + } + }, + { + "items": [ + 8925.5, + null + ], + "hints": { + "index": 16790 + } + }, + { + "items": [ + 8926, + null + ], + "hints": { + "index": 16791 + } + }, + { + "items": [ + 8926.5, + null + ], + "hints": { + "index": 16792 + } + }, + { + "items": [ + 8927, + null + ], + "hints": { + "index": 16793 + } + }, + { + "items": [ + 8927.5, + null + ], + "hints": { + "index": 16794 + } + }, + { + "items": [ + 8928, + null + ], + "hints": { + "index": 16795 + } + }, + { + "items": [ + 8928.5, + null + ], + "hints": { + "index": 16796 + } + }, + { + "items": [ + 8929, + null + ], + "hints": { + "index": 16797 + } + }, + { + "items": [ + 8929.5, + null + ], + "hints": { + "index": 16798 + } + }, + { + "items": [ + 8930, + null + ], + "hints": { + "index": 16799 + } + }, + { + "items": [ + 8930.5, + null + ], + "hints": { + "index": 16800 + } + }, + { + "items": [ + 8931, + null + ], + "hints": { + "index": 16801 + } + }, + { + "items": [ + 8931.5, + null + ], + "hints": { + "index": 16802 + } + }, + { + "items": [ + 8932, + null + ], + "hints": { + "index": 16803 + } + }, + { + "items": [ + 8932.5, + null + ], + "hints": { + "index": 16804 + } + }, + { + "items": [ + 8933, + null + ], + "hints": { + "index": 16805 + } + }, + { + "items": [ + 8933.5, + null + ], + "hints": { + "index": 16806 + } + }, + { + "items": [ + 8934, + null + ], + "hints": { + "index": 16807 + } + }, + { + "items": [ + 8934.5, + null + ], + "hints": { + "index": 16808 + } + }, + { + "items": [ + 8935, + null + ], + "hints": { + "index": 16809 + } + }, + { + "items": [ + 8935.5, + null + ], + "hints": { + "index": 16810 + } + }, + { + "items": [ + 8936, + null + ], + "hints": { + "index": 16811 + } + }, + { + "items": [ + 8936.5, + null + ], + "hints": { + "index": 16812 + } + }, + { + "items": [ + 8937, + null + ], + "hints": { + "index": 16813 + } + }, + { + "items": [ + 8937.5, + null + ], + "hints": { + "index": 16814 + } + }, + { + "items": [ + 8938, + null + ], + "hints": { + "index": 16815 + } + }, + { + "items": [ + 8938.5, + null + ], + "hints": { + "index": 16816 + } + }, + { + "items": [ + 8939, + null + ], + "hints": { + "index": 16817 + } + }, + { + "items": [ + 8939.5, + null + ], + "hints": { + "index": 16818 + } + }, + { + "items": [ + 8940, + null + ], + "hints": { + "index": 16819 + } + }, + { + "items": [ + 8940.5, + null + ], + "hints": { + "index": 16820 + } + }, + { + "items": [ + 8941, + null + ], + "hints": { + "index": 16821 + } + }, + { + "items": [ + 8941.5, + null + ], + "hints": { + "index": 16822 + } + }, + { + "items": [ + 8942, + null + ], + "hints": { + "index": 16823 + } + }, + { + "items": [ + 8942.5, + null + ], + "hints": { + "index": 16824 + } + }, + { + "items": [ + 8943, + null + ], + "hints": { + "index": 16825 + } + }, + { + "items": [ + 8943.5, + null + ], + "hints": { + "index": 16826 + } + }, + { + "items": [ + 8944, + null + ], + "hints": { + "index": 16827 + } + }, + { + "items": [ + 8944.5, + null + ], + "hints": { + "index": 16828 + } + }, + { + "items": [ + 8945, + null + ], + "hints": { + "index": 16829 + } + }, + { + "items": [ + 8945.5, + null + ], + "hints": { + "index": 16830 + } + }, + { + "items": [ + 8946, + null + ], + "hints": { + "index": 16831 + } + }, + { + "items": [ + 8946.5, + null + ], + "hints": { + "index": 16832 + } + }, + { + "items": [ + 8947, + null + ], + "hints": { + "index": 16833 + } + }, + { + "items": [ + 8947.5, + null + ], + "hints": { + "index": 16834 + } + }, + { + "items": [ + 8948, + null + ], + "hints": { + "index": 16835 + } + }, + { + "items": [ + 8948.5, + null + ], + "hints": { + "index": 16836 + } + }, + { + "items": [ + 8949, + null + ], + "hints": { + "index": 16837 + } + }, + { + "items": [ + 8949.5, + null + ], + "hints": { + "index": 16838 + } + }, + { + "items": [ + 8950, + null + ], + "hints": { + "index": 16839 + } + }, + { + "items": [ + 8950.5, + null + ], + "hints": { + "index": 16840 + } + }, + { + "items": [ + 8951, + null + ], + "hints": { + "index": 16841 + } + }, + { + "items": [ + 8951.5, + null + ], + "hints": { + "index": 16842 + } + }, + { + "items": [ + 8952, + null + ], + "hints": { + "index": 16843 + } + }, + { + "items": [ + 8952.5, + null + ], + "hints": { + "index": 16844 + } + }, + { + "items": [ + 8953, + null + ], + "hints": { + "index": 16845 + } + }, + { + "items": [ + 8953.5, + null + ], + "hints": { + "index": 16846 + } + }, + { + "items": [ + 8954, + null + ], + "hints": { + "index": 16847 + } + }, + { + "items": [ + 8954.5, + null + ], + "hints": { + "index": 16848 + } + }, + { + "items": [ + 8955, + null + ], + "hints": { + "index": 16849 + } + }, + { + "items": [ + 8955.5, + null + ], + "hints": { + "index": 16850 + } + }, + { + "items": [ + 8956, + null + ], + "hints": { + "index": 16851 + } + }, + { + "items": [ + 8956.5, + null + ], + "hints": { + "index": 16852 + } + }, + { + "items": [ + 8957, + null + ], + "hints": { + "index": 16853 + } + }, + { + "items": [ + 8957.5, + null + ], + "hints": { + "index": 16854 + } + }, + { + "items": [ + 8958, + null + ], + "hints": { + "index": 16855 + } + }, + { + "items": [ + 8958.5, + null + ], + "hints": { + "index": 16856 + } + }, + { + "items": [ + 8959, + null + ], + "hints": { + "index": 16857 + } + }, + { + "items": [ + 8959.5, + null + ], + "hints": { + "index": 16858 + } + }, + { + "items": [ + 8960, + null + ], + "hints": { + "index": 16859 + } + }, + { + "items": [ + 8960.5, + null + ], + "hints": { + "index": 16860 + } + }, + { + "items": [ + 8961, + null + ], + "hints": { + "index": 16861 + } + }, + { + "items": [ + 8961.5, + null + ], + "hints": { + "index": 16862 + } + }, + { + "items": [ + 8962, + null + ], + "hints": { + "index": 16863 + } + }, + { + "items": [ + 8962.5, + null + ], + "hints": { + "index": 16864 + } + }, + { + "items": [ + 8963, + null + ], + "hints": { + "index": 16865 + } + }, + { + "items": [ + 8963.5, + null + ], + "hints": { + "index": 16866 + } + }, + { + "items": [ + 8964, + null + ], + "hints": { + "index": 16867 + } + }, + { + "items": [ + 8964.5, + null + ], + "hints": { + "index": 16868 + } + }, + { + "items": [ + 8965, + null + ], + "hints": { + "index": 16869 + } + }, + { + "items": [ + 8965.5, + null + ], + "hints": { + "index": 16870 + } + }, + { + "items": [ + 8966, + null + ], + "hints": { + "index": 16871 + } + }, + { + "items": [ + 8966.5, + null + ], + "hints": { + "index": 16872 + } + }, + { + "items": [ + 8967, + null + ], + "hints": { + "index": 16873 + } + }, + { + "items": [ + 8967.5, + null + ], + "hints": { + "index": 16874 + } + }, + { + "items": [ + 8968, + null + ], + "hints": { + "index": 16875 + } + }, + { + "items": [ + 8968.5, + null + ], + "hints": { + "index": 16876 + } + }, + { + "items": [ + 8969, + null + ], + "hints": { + "index": 16877 + } + }, + { + "items": [ + 8969.5, + null + ], + "hints": { + "index": 16878 + } + }, + { + "items": [ + 8970, + null + ], + "hints": { + "index": 16879 + } + }, + { + "items": [ + 8970.5, + null + ], + "hints": { + "index": 16880 + } + }, + { + "items": [ + 8971, + null + ], + "hints": { + "index": 16881 + } + }, + { + "items": [ + 8971.5, + null + ], + "hints": { + "index": 16882 + } + }, + { + "items": [ + 8972, + null + ], + "hints": { + "index": 16883 + } + }, + { + "items": [ + 8972.5, + null + ], + "hints": { + "index": 16884 + } + }, + { + "items": [ + 8973, + null + ], + "hints": { + "index": 16885 + } + }, + { + "items": [ + 8973.5, + null + ], + "hints": { + "index": 16886 + } + }, + { + "items": [ + 8974, + null + ], + "hints": { + "index": 16887 + } + }, + { + "items": [ + 8974.5, + null + ], + "hints": { + "index": 16888 + } + }, + { + "items": [ + 8975, + null + ], + "hints": { + "index": 16889 + } + }, + { + "items": [ + 8975.5, + null + ], + "hints": { + "index": 16890 + } + }, + { + "items": [ + 8976, + null + ], + "hints": { + "index": 16891 + } + }, + { + "items": [ + 8976.5, + null + ], + "hints": { + "index": 16892 + } + }, + { + "items": [ + 8977, + null + ], + "hints": { + "index": 16893 + } + }, + { + "items": [ + 8977.5, + null + ], + "hints": { + "index": 16894 + } + }, + { + "items": [ + 8978, + null + ], + "hints": { + "index": 16895 + } + }, + { + "items": [ + 8978.5, + null + ], + "hints": { + "index": 16896 + } + }, + { + "items": [ + 8979, + null + ], + "hints": { + "index": 16897 + } + }, + { + "items": [ + 8979.5, + null + ], + "hints": { + "index": 16898 + } + }, + { + "items": [ + 8980, + null + ], + "hints": { + "index": 16899 + } + }, + { + "items": [ + 8980.5, + null + ], + "hints": { + "index": 16900 + } + }, + { + "items": [ + 8981, + null + ], + "hints": { + "index": 16901 + } + }, + { + "items": [ + 8981.5, + null + ], + "hints": { + "index": 16902 + } + }, + { + "items": [ + 8982, + null + ], + "hints": { + "index": 16903 + } + }, + { + "items": [ + 8982.5, + null + ], + "hints": { + "index": 16904 + } + }, + { + "items": [ + 8983, + null + ], + "hints": { + "index": 16905 + } + }, + { + "items": [ + 8983.5, + null + ], + "hints": { + "index": 16906 + } + }, + { + "items": [ + 8984, + null + ], + "hints": { + "index": 16907 + } + }, + { + "items": [ + 8984.5, + null + ], + "hints": { + "index": 16908 + } + }, + { + "items": [ + 8985, + null + ], + "hints": { + "index": 16909 + } + }, + { + "items": [ + 8985.5, + null + ], + "hints": { + "index": 16910 + } + }, + { + "items": [ + 8986, + null + ], + "hints": { + "index": 16911 + } + }, + { + "items": [ + 8986.5, + null + ], + "hints": { + "index": 16912 + } + }, + { + "items": [ + 8987, + null + ], + "hints": { + "index": 16913 + } + }, + { + "items": [ + 8987.5, + null + ], + "hints": { + "index": 16914 + } + }, + { + "items": [ + 8988, + null + ], + "hints": { + "index": 16915 + } + }, + { + "items": [ + 8988.5, + null + ], + "hints": { + "index": 16916 + } + }, + { + "items": [ + 8989, + null + ], + "hints": { + "index": 16917 + } + }, + { + "items": [ + 8989.5, + null + ], + "hints": { + "index": 16918 + } + }, + { + "items": [ + 8990, + null + ], + "hints": { + "index": 16919 + } + }, + { + "items": [ + 8990.5, + null + ], + "hints": { + "index": 16920 + } + }, + { + "items": [ + 8991, + null + ], + "hints": { + "index": 16921 + } + }, + { + "items": [ + 8991.5, + null + ], + "hints": { + "index": 16922 + } + }, + { + "items": [ + 8992, + null + ], + "hints": { + "index": 16923 + } + }, + { + "items": [ + 8992.5, + null + ], + "hints": { + "index": 16924 + } + }, + { + "items": [ + 8993, + null + ], + "hints": { + "index": 16925 + } + }, + { + "items": [ + 8993.5, + null + ], + "hints": { + "index": 16926 + } + }, + { + "items": [ + 8994, + null + ], + "hints": { + "index": 16927 + } + }, + { + "items": [ + 8994.5, + null + ], + "hints": { + "index": 16928 + } + }, + { + "items": [ + 8995, + null + ], + "hints": { + "index": 16929 + } + }, + { + "items": [ + 8995.5, + null + ], + "hints": { + "index": 16930 + } + }, + { + "items": [ + 8996, + null + ], + "hints": { + "index": 16931 + } + }, + { + "items": [ + 8996.5, + null + ], + "hints": { + "index": 16932 + } + }, + { + "items": [ + 8997, + null + ], + "hints": { + "index": 16933 + } + }, + { + "items": [ + 8997.5, + null + ], + "hints": { + "index": 16934 + } + }, + { + "items": [ + 8998, + null + ], + "hints": { + "index": 16935 + } + }, + { + "items": [ + 8998.5, + null + ], + "hints": { + "index": 16936 + } + }, + { + "items": [ + 8999, + null + ], + "hints": { + "index": 16937 + } + }, + { + "items": [ + 8999.5, + null + ], + "hints": { + "index": 16938 + } + }, + { + "items": [ + 9000, + null + ], + "hints": { + "index": 16939 + } + }, + { + "items": [ + 9000.5, + null + ], + "hints": { + "index": 16940 + } + }, + { + "items": [ + 9001, + null + ], + "hints": { + "index": 16941 + } + }, + { + "items": [ + 9001.5, + null + ], + "hints": { + "index": 16942 + } + }, + { + "items": [ + 9002, + null + ], + "hints": { + "index": 16943 + } + }, + { + "items": [ + 9002.5, + null + ], + "hints": { + "index": 16944 + } + }, + { + "items": [ + 9003, + null + ], + "hints": { + "index": 16945 + } + }, + { + "items": [ + 9003.5, + null + ], + "hints": { + "index": 16946 + } + }, + { + "items": [ + 9004, + null + ], + "hints": { + "index": 16947 + } + }, + { + "items": [ + 9004.5, + null + ], + "hints": { + "index": 16948 + } + }, + { + "items": [ + 9005, + null + ], + "hints": { + "index": 16949 + } + }, + { + "items": [ + 9005.5, + null + ], + "hints": { + "index": 16950 + } + }, + { + "items": [ + 9006, + null + ], + "hints": { + "index": 16951 + } + }, + { + "items": [ + 9006.5, + null + ], + "hints": { + "index": 16952 + } + }, + { + "items": [ + 9007, + null + ], + "hints": { + "index": 16953 + } + }, + { + "items": [ + 9007.5, + null + ], + "hints": { + "index": 16954 + } + }, + { + "items": [ + 9008, + null + ], + "hints": { + "index": 16955 + } + }, + { + "items": [ + 9008.5, + null + ], + "hints": { + "index": 16956 + } + }, + { + "items": [ + 9009, + null + ], + "hints": { + "index": 16957 + } + }, + { + "items": [ + 9009.5, + null + ], + "hints": { + "index": 16958 + } + }, + { + "items": [ + 9010, + null + ], + "hints": { + "index": 16959 + } + }, + { + "items": [ + 9010.5, + null + ], + "hints": { + "index": 16960 + } + }, + { + "items": [ + 9011, + null + ], + "hints": { + "index": 16961 + } + }, + { + "items": [ + 9011.5, + null + ], + "hints": { + "index": 16962 + } + }, + { + "items": [ + 9012, + null + ], + "hints": { + "index": 16963 + } + }, + { + "items": [ + 9012.5, + null + ], + "hints": { + "index": 16964 + } + }, + { + "items": [ + 9013, + null + ], + "hints": { + "index": 16965 + } + }, + { + "items": [ + 9013.5, + null + ], + "hints": { + "index": 16966 + } + }, + { + "items": [ + 9014, + null + ], + "hints": { + "index": 16967 + } + }, + { + "items": [ + 9014.5, + null + ], + "hints": { + "index": 16968 + } + }, + { + "items": [ + 9015, + null + ], + "hints": { + "index": 16969 + } + }, + { + "items": [ + 9015.5, + null + ], + "hints": { + "index": 16970 + } + }, + { + "items": [ + 9016, + null + ], + "hints": { + "index": 16971 + } + }, + { + "items": [ + 9016.5, + null + ], + "hints": { + "index": 16972 + } + }, + { + "items": [ + 9017, + null + ], + "hints": { + "index": 16973 + } + }, + { + "items": [ + 9017.5, + null + ], + "hints": { + "index": 16974 + } + }, + { + "items": [ + 9018, + null + ], + "hints": { + "index": 16975 + } + }, + { + "items": [ + 9018.5, + null + ], + "hints": { + "index": 16976 + } + }, + { + "items": [ + 9019, + null + ], + "hints": { + "index": 16977 + } + }, + { + "items": [ + 9019.5, + null + ], + "hints": { + "index": 16978 + } + }, + { + "items": [ + 9020, + null + ], + "hints": { + "index": 16979 + } + }, + { + "items": [ + 9020.5, + null + ], + "hints": { + "index": 16980 + } + }, + { + "items": [ + 9021, + null + ], + "hints": { + "index": 16981 + } + }, + { + "items": [ + 9021.5, + null + ], + "hints": { + "index": 16982 + } + }, + { + "items": [ + 9022, + null + ], + "hints": { + "index": 16983 + } + }, + { + "items": [ + 9022.5, + null + ], + "hints": { + "index": 16984 + } + }, + { + "items": [ + 9023, + null + ], + "hints": { + "index": 16985 + } + }, + { + "items": [ + 9023.5, + null + ], + "hints": { + "index": 16986 + } + }, + { + "items": [ + 9024, + null + ], + "hints": { + "index": 16987 + } + }, + { + "items": [ + 9024.5, + null + ], + "hints": { + "index": 16988 + } + }, + { + "items": [ + 9025, + null + ], + "hints": { + "index": 16989 + } + }, + { + "items": [ + 9025.5, + null + ], + "hints": { + "index": 16990 + } + }, + { + "items": [ + 9026, + null + ], + "hints": { + "index": 16991 + } + }, + { + "items": [ + 9026.5, + null + ], + "hints": { + "index": 16992 + } + }, + { + "items": [ + 9027, + null + ], + "hints": { + "index": 16993 + } + }, + { + "items": [ + 9027.5, + null + ], + "hints": { + "index": 16994 + } + }, + { + "items": [ + 9028, + null + ], + "hints": { + "index": 16995 + } + }, + { + "items": [ + 9028.5, + null + ], + "hints": { + "index": 16996 + } + }, + { + "items": [ + 9029, + null + ], + "hints": { + "index": 16997 + } + }, + { + "items": [ + 9029.5, + null + ], + "hints": { + "index": 16998 + } + }, + { + "items": [ + 9030, + null + ], + "hints": { + "index": 16999 + } + }, + { + "items": [ + 9030.5, + null + ], + "hints": { + "index": 17000 + } + }, + { + "items": [ + 9031, + null + ], + "hints": { + "index": 17001 + } + }, + { + "items": [ + 9031.5, + null + ], + "hints": { + "index": 17002 + } + }, + { + "items": [ + 9032, + null + ], + "hints": { + "index": 17003 + } + }, + { + "items": [ + 9032.5, + null + ], + "hints": { + "index": 17004 + } + }, + { + "items": [ + 9033, + null + ], + "hints": { + "index": 17005 + } + }, + { + "items": [ + 9033.5, + null + ], + "hints": { + "index": 17006 + } + }, + { + "items": [ + 9034, + null + ], + "hints": { + "index": 17007 + } + }, + { + "items": [ + 9034.5, + null + ], + "hints": { + "index": 17008 + } + }, + { + "items": [ + 9035, + null + ], + "hints": { + "index": 17009 + } + }, + { + "items": [ + 9035.5, + null + ], + "hints": { + "index": 17010 + } + }, + { + "items": [ + 9036, + null + ], + "hints": { + "index": 17011 + } + }, + { + "items": [ + 9036.5, + null + ], + "hints": { + "index": 17012 + } + }, + { + "items": [ + 9037, + null + ], + "hints": { + "index": 17013 + } + }, + { + "items": [ + 9037.5, + null + ], + "hints": { + "index": 17014 + } + }, + { + "items": [ + 9038, + null + ], + "hints": { + "index": 17015 + } + }, + { + "items": [ + 9038.5, + null + ], + "hints": { + "index": 17016 + } + }, + { + "items": [ + 9039, + null + ], + "hints": { + "index": 17017 + } + }, + { + "items": [ + 9039.5, + null + ], + "hints": { + "index": 17018 + } + }, + { + "items": [ + 9040, + null + ], + "hints": { + "index": 17019 + } + }, + { + "items": [ + 9040.5, + null + ], + "hints": { + "index": 17020 + } + }, + { + "items": [ + 9041, + null + ], + "hints": { + "index": 17021 + } + }, + { + "items": [ + 9041.5, + null + ], + "hints": { + "index": 17022 + } + }, + { + "items": [ + 9042, + null + ], + "hints": { + "index": 17023 + } + }, + { + "items": [ + 9042.5, + null + ], + "hints": { + "index": 17024 + } + }, + { + "items": [ + 9043, + null + ], + "hints": { + "index": 17025 + } + }, + { + "items": [ + 9043.5, + null + ], + "hints": { + "index": 17026 + } + }, + { + "items": [ + 9044, + null + ], + "hints": { + "index": 17027 + } + }, + { + "items": [ + 9044.5, + null + ], + "hints": { + "index": 17028 + } + }, + { + "items": [ + 9045, + null + ], + "hints": { + "index": 17029 + } + }, + { + "items": [ + 9045.5, + null + ], + "hints": { + "index": 17030 + } + }, + { + "items": [ + 9046, + null + ], + "hints": { + "index": 17031 + } + }, + { + "items": [ + 9046.5, + null + ], + "hints": { + "index": 17032 + } + }, + { + "items": [ + 9047, + null + ], + "hints": { + "index": 17033 + } + }, + { + "items": [ + 9047.5, + null + ], + "hints": { + "index": 17034 + } + }, + { + "items": [ + 9048, + null + ], + "hints": { + "index": 17035 + } + }, + { + "items": [ + 9048.5, + null + ], + "hints": { + "index": 17036 + } + }, + { + "items": [ + 9049, + null + ], + "hints": { + "index": 17037 + } + }, + { + "items": [ + 9049.5, + null + ], + "hints": { + "index": 17038 + } + }, + { + "items": [ + 9050, + null + ], + "hints": { + "index": 17039 + } + }, + { + "items": [ + 9050.5, + null + ], + "hints": { + "index": 17040 + } + }, + { + "items": [ + 9051, + null + ], + "hints": { + "index": 17041 + } + }, + { + "items": [ + 9051.5, + null + ], + "hints": { + "index": 17042 + } + }, + { + "items": [ + 9052, + null + ], + "hints": { + "index": 17043 + } + }, + { + "items": [ + 9052.5, + null + ], + "hints": { + "index": 17044 + } + }, + { + "items": [ + 9053, + null + ], + "hints": { + "index": 17045 + } + }, + { + "items": [ + 9053.5, + null + ], + "hints": { + "index": 17046 + } + }, + { + "items": [ + 9054, + null + ], + "hints": { + "index": 17047 + } + }, + { + "items": [ + 9054.5, + null + ], + "hints": { + "index": 17048 + } + }, + { + "items": [ + 9055, + null + ], + "hints": { + "index": 17049 + } + }, + { + "items": [ + 9055.5, + null + ], + "hints": { + "index": 17050 + } + }, + { + "items": [ + 9056, + null + ], + "hints": { + "index": 17051 + } + }, + { + "items": [ + 9056.5, + null + ], + "hints": { + "index": 17052 + } + }, + { + "items": [ + 9057, + null + ], + "hints": { + "index": 17053 + } + }, + { + "items": [ + 9057.5, + null + ], + "hints": { + "index": 17054 + } + }, + { + "items": [ + 9058, + null + ], + "hints": { + "index": 17055 + } + }, + { + "items": [ + 9058.5, + null + ], + "hints": { + "index": 17056 + } + }, + { + "items": [ + 9059, + null + ], + "hints": { + "index": 17057 + } + }, + { + "items": [ + 9059.5, + null + ], + "hints": { + "index": 17058 + } + }, + { + "items": [ + 9060, + null + ], + "hints": { + "index": 17059 + } + }, + { + "items": [ + 9060.5, + null + ], + "hints": { + "index": 17060 + } + }, + { + "items": [ + 9061, + null + ], + "hints": { + "index": 17061 + } + }, + { + "items": [ + 9061.5, + null + ], + "hints": { + "index": 17062 + } + }, + { + "items": [ + 9062, + null + ], + "hints": { + "index": 17063 + } + }, + { + "items": [ + 9062.5, + null + ], + "hints": { + "index": 17064 + } + }, + { + "items": [ + 9063, + null + ], + "hints": { + "index": 17065 + } + }, + { + "items": [ + 9063.5, + null + ], + "hints": { + "index": 17066 + } + }, + { + "items": [ + 9064, + null + ], + "hints": { + "index": 17067 + } + }, + { + "items": [ + 9064.5, + null + ], + "hints": { + "index": 17068 + } + }, + { + "items": [ + 9065, + null + ], + "hints": { + "index": 17069 + } + }, + { + "items": [ + 9065.5, + null + ], + "hints": { + "index": 17070 + } + }, + { + "items": [ + 9066, + null + ], + "hints": { + "index": 17071 + } + }, + { + "items": [ + 9066.5, + null + ], + "hints": { + "index": 17072 + } + }, + { + "items": [ + 9067, + null + ], + "hints": { + "index": 17073 + } + }, + { + "items": [ + 9067.5, + null + ], + "hints": { + "index": 17074 + } + }, + { + "items": [ + 9068, + null + ], + "hints": { + "index": 17075 + } + }, + { + "items": [ + 9068.5, + null + ], + "hints": { + "index": 17076 + } + }, + { + "items": [ + 9069, + null + ], + "hints": { + "index": 17077 + } + }, + { + "items": [ + 9069.5, + null + ], + "hints": { + "index": 17078 + } + }, + { + "items": [ + 9070, + null + ], + "hints": { + "index": 17079 + } + }, + { + "items": [ + 9070.5, + null + ], + "hints": { + "index": 17080 + } + }, + { + "items": [ + 9071, + null + ], + "hints": { + "index": 17081 + } + }, + { + "items": [ + 9071.5, + null + ], + "hints": { + "index": 17082 + } + }, + { + "items": [ + 9072, + null + ], + "hints": { + "index": 17083 + } + }, + { + "items": [ + 9072.5, + null + ], + "hints": { + "index": 17084 + } + }, + { + "items": [ + 9073, + null + ], + "hints": { + "index": 17085 + } + }, + { + "items": [ + 9073.5, + null + ], + "hints": { + "index": 17086 + } + }, + { + "items": [ + 9074, + null + ], + "hints": { + "index": 17087 + } + }, + { + "items": [ + 9074.5, + null + ], + "hints": { + "index": 17088 + } + }, + { + "items": [ + 9075, + null + ], + "hints": { + "index": 17089 + } + }, + { + "items": [ + 9075.5, + null + ], + "hints": { + "index": 17090 + } + }, + { + "items": [ + 9076, + null + ], + "hints": { + "index": 17091 + } + }, + { + "items": [ + 9076.5, + null + ], + "hints": { + "index": 17092 + } + }, + { + "items": [ + 9077, + null + ], + "hints": { + "index": 17093 + } + }, + { + "items": [ + 9077.5, + null + ], + "hints": { + "index": 17094 + } + }, + { + "items": [ + 9078, + null + ], + "hints": { + "index": 17095 + } + }, + { + "items": [ + 9078.5, + null + ], + "hints": { + "index": 17096 + } + }, + { + "items": [ + 9079, + null + ], + "hints": { + "index": 17097 + } + }, + { + "items": [ + 9079.5, + null + ], + "hints": { + "index": 17098 + } + }, + { + "items": [ + 9080, + null + ], + "hints": { + "index": 17099 + } + }, + { + "items": [ + 9080.5, + null + ], + "hints": { + "index": 17100 + } + }, + { + "items": [ + 9081, + null + ], + "hints": { + "index": 17101 + } + }, + { + "items": [ + 9081.5, + null + ], + "hints": { + "index": 17102 + } + }, + { + "items": [ + 9082, + null + ], + "hints": { + "index": 17103 + } + }, + { + "items": [ + 9082.5, + null + ], + "hints": { + "index": 17104 + } + }, + { + "items": [ + 9083, + null + ], + "hints": { + "index": 17105 + } + }, + { + "items": [ + 9083.5, + null + ], + "hints": { + "index": 17106 + } + }, + { + "items": [ + 9084, + null + ], + "hints": { + "index": 17107 + } + }, + { + "items": [ + 9084.5, + null + ], + "hints": { + "index": 17108 + } + }, + { + "items": [ + 9085, + null + ], + "hints": { + "index": 17109 + } + }, + { + "items": [ + 9085.5, + null + ], + "hints": { + "index": 17110 + } + }, + { + "items": [ + 9086, + null + ], + "hints": { + "index": 17111 + } + }, + { + "items": [ + 9086.5, + null + ], + "hints": { + "index": 17112 + } + }, + { + "items": [ + 9087, + null + ], + "hints": { + "index": 17113 + } + }, + { + "items": [ + 9087.5, + null + ], + "hints": { + "index": 17114 + } + }, + { + "items": [ + 9088, + null + ], + "hints": { + "index": 17115 + } + }, + { + "items": [ + 9088.5, + null + ], + "hints": { + "index": 17116 + } + }, + { + "items": [ + 9089, + null + ], + "hints": { + "index": 17117 + } + }, + { + "items": [ + 9089.5, + null + ], + "hints": { + "index": 17118 + } + }, + { + "items": [ + 9090, + null + ], + "hints": { + "index": 17119 + } + }, + { + "items": [ + 9090.5, + null + ], + "hints": { + "index": 17120 + } + }, + { + "items": [ + 9091, + null + ], + "hints": { + "index": 17121 + } + }, + { + "items": [ + 9091.5, + null + ], + "hints": { + "index": 17122 + } + }, + { + "items": [ + 9092, + null + ], + "hints": { + "index": 17123 + } + }, + { + "items": [ + 9092.5, + null + ], + "hints": { + "index": 17124 + } + }, + { + "items": [ + 9093, + null + ], + "hints": { + "index": 17125 + } + }, + { + "items": [ + 9093.5, + null + ], + "hints": { + "index": 17126 + } + }, + { + "items": [ + 9094, + null + ], + "hints": { + "index": 17127 + } + }, + { + "items": [ + 9094.5, + null + ], + "hints": { + "index": 17128 + } + }, + { + "items": [ + 9095, + null + ], + "hints": { + "index": 17129 + } + }, + { + "items": [ + 9095.5, + null + ], + "hints": { + "index": 17130 + } + }, + { + "items": [ + 9096, + null + ], + "hints": { + "index": 17131 + } + }, + { + "items": [ + 9096.5, + null + ], + "hints": { + "index": 17132 + } + }, + { + "items": [ + 9097, + null + ], + "hints": { + "index": 17133 + } + }, + { + "items": [ + 9097.5, + null + ], + "hints": { + "index": 17134 + } + }, + { + "items": [ + 9098, + null + ], + "hints": { + "index": 17135 + } + }, + { + "items": [ + 9098.5, + null + ], + "hints": { + "index": 17136 + } + }, + { + "items": [ + 9099, + null + ], + "hints": { + "index": 17137 + } + }, + { + "items": [ + 9099.5, + null + ], + "hints": { + "index": 17138 + } + }, + { + "items": [ + 9100, + null + ], + "hints": { + "index": 17139 + } + }, + { + "items": [ + 9100.5, + null + ], + "hints": { + "index": 17140 + } + }, + { + "items": [ + 9101, + null + ], + "hints": { + "index": 17141 + } + }, + { + "items": [ + 9101.5, + null + ], + "hints": { + "index": 17142 + } + }, + { + "items": [ + 9102, + null + ], + "hints": { + "index": 17143 + } + }, + { + "items": [ + 9102.5, + null + ], + "hints": { + "index": 17144 + } + }, + { + "items": [ + 9103, + null + ], + "hints": { + "index": 17145 + } + }, + { + "items": [ + 9103.5, + null + ], + "hints": { + "index": 17146 + } + }, + { + "items": [ + 9104, + null + ], + "hints": { + "index": 17147 + } + }, + { + "items": [ + 9104.5, + null + ], + "hints": { + "index": 17148 + } + }, + { + "items": [ + 9105, + null + ], + "hints": { + "index": 17149 + } + }, + { + "items": [ + 9105.5, + null + ], + "hints": { + "index": 17150 + } + }, + { + "items": [ + 9106, + null + ], + "hints": { + "index": 17151 + } + }, + { + "items": [ + 9106.5, + null + ], + "hints": { + "index": 17152 + } + }, + { + "items": [ + 9107, + null + ], + "hints": { + "index": 17153 + } + }, + { + "items": [ + 9107.5, + null + ], + "hints": { + "index": 17154 + } + }, + { + "items": [ + 9108, + null + ], + "hints": { + "index": 17155 + } + }, + { + "items": [ + 9108.5, + null + ], + "hints": { + "index": 17156 + } + }, + { + "items": [ + 9109, + null + ], + "hints": { + "index": 17157 + } + }, + { + "items": [ + 9109.5, + null + ], + "hints": { + "index": 17158 + } + }, + { + "items": [ + 9110, + null + ], + "hints": { + "index": 17159 + } + }, + { + "items": [ + 9110.5, + null + ], + "hints": { + "index": 17160 + } + }, + { + "items": [ + 9111, + null + ], + "hints": { + "index": 17161 + } + }, + { + "items": [ + 9111.5, + null + ], + "hints": { + "index": 17162 + } + }, + { + "items": [ + 9112, + null + ], + "hints": { + "index": 17163 + } + }, + { + "items": [ + 9112.5, + null + ], + "hints": { + "index": 17164 + } + }, + { + "items": [ + 9113, + null + ], + "hints": { + "index": 17165 + } + }, + { + "items": [ + 9113.5, + null + ], + "hints": { + "index": 17166 + } + }, + { + "items": [ + 9114, + null + ], + "hints": { + "index": 17167 + } + }, + { + "items": [ + 9114.5, + null + ], + "hints": { + "index": 17168 + } + }, + { + "items": [ + 9115, + null + ], + "hints": { + "index": 17169 + } + }, + { + "items": [ + 9115.5, + null + ], + "hints": { + "index": 17170 + } + }, + { + "items": [ + 9116, + null + ], + "hints": { + "index": 17171 + } + }, + { + "items": [ + 9116.5, + null + ], + "hints": { + "index": 17172 + } + }, + { + "items": [ + 9117, + null + ], + "hints": { + "index": 17173 + } + }, + { + "items": [ + 9117.5, + null + ], + "hints": { + "index": 17174 + } + }, + { + "items": [ + 9118, + null + ], + "hints": { + "index": 17175 + } + }, + { + "items": [ + 9118.5, + null + ], + "hints": { + "index": 17176 + } + }, + { + "items": [ + 9119, + null + ], + "hints": { + "index": 17177 + } + }, + { + "items": [ + 9119.5, + null + ], + "hints": { + "index": 17178 + } + }, + { + "items": [ + 9120, + null + ], + "hints": { + "index": 17179 + } + }, + { + "items": [ + 9120.5, + null + ], + "hints": { + "index": 17180 + } + }, + { + "items": [ + 9121, + null + ], + "hints": { + "index": 17181 + } + }, + { + "items": [ + 9121.5, + null + ], + "hints": { + "index": 17182 + } + }, + { + "items": [ + 9122, + null + ], + "hints": { + "index": 17183 + } + }, + { + "items": [ + 9122.5, + null + ], + "hints": { + "index": 17184 + } + }, + { + "items": [ + 9123, + null + ], + "hints": { + "index": 17185 + } + }, + { + "items": [ + 9123.5, + null + ], + "hints": { + "index": 17186 + } + }, + { + "items": [ + 9124, + null + ], + "hints": { + "index": 17187 + } + }, + { + "items": [ + 9124.5, + null + ], + "hints": { + "index": 17188 + } + }, + { + "items": [ + 9125, + null + ], + "hints": { + "index": 17189 + } + }, + { + "items": [ + 9125.5, + null + ], + "hints": { + "index": 17190 + } + }, + { + "items": [ + 9126, + null + ], + "hints": { + "index": 17191 + } + }, + { + "items": [ + 9126.5, + null + ], + "hints": { + "index": 17192 + } + }, + { + "items": [ + 9127, + null + ], + "hints": { + "index": 17193 + } + }, + { + "items": [ + 9127.5, + null + ], + "hints": { + "index": 17194 + } + }, + { + "items": [ + 9128, + null + ], + "hints": { + "index": 17195 + } + }, + { + "items": [ + 9128.5, + null + ], + "hints": { + "index": 17196 + } + }, + { + "items": [ + 9129, + null + ], + "hints": { + "index": 17197 + } + }, + { + "items": [ + 9129.5, + null + ], + "hints": { + "index": 17198 + } + }, + { + "items": [ + 9130, + null + ], + "hints": { + "index": 17199 + } + }, + { + "items": [ + 9130.5, + null + ], + "hints": { + "index": 17200 + } + }, + { + "items": [ + 9131, + null + ], + "hints": { + "index": 17201 + } + }, + { + "items": [ + 9131.5, + null + ], + "hints": { + "index": 17202 + } + }, + { + "items": [ + 9132, + null + ], + "hints": { + "index": 17203 + } + }, + { + "items": [ + 9132.5, + null + ], + "hints": { + "index": 17204 + } + }, + { + "items": [ + 9133, + null + ], + "hints": { + "index": 17205 + } + }, + { + "items": [ + 9133.5, + null + ], + "hints": { + "index": 17206 + } + }, + { + "items": [ + 9134, + null + ], + "hints": { + "index": 17207 + } + }, + { + "items": [ + 9134.5, + null + ], + "hints": { + "index": 17208 + } + }, + { + "items": [ + 9135, + null + ], + "hints": { + "index": 17209 + } + }, + { + "items": [ + 9135.5, + null + ], + "hints": { + "index": 17210 + } + }, + { + "items": [ + 9136, + null + ], + "hints": { + "index": 17211 + } + }, + { + "items": [ + 9136.5, + null + ], + "hints": { + "index": 17212 + } + }, + { + "items": [ + 9137, + null + ], + "hints": { + "index": 17213 + } + }, + { + "items": [ + 9137.5, + null + ], + "hints": { + "index": 17214 + } + }, + { + "items": [ + 9138, + null + ], + "hints": { + "index": 17215 + } + }, + { + "items": [ + 9138.5, + null + ], + "hints": { + "index": 17216 + } + }, + { + "items": [ + 9139, + null + ], + "hints": { + "index": 17217 + } + }, + { + "items": [ + 9139.5, + null + ], + "hints": { + "index": 17218 + } + }, + { + "items": [ + 9140, + null + ], + "hints": { + "index": 17219 + } + }, + { + "items": [ + 9140.5, + null + ], + "hints": { + "index": 17220 + } + }, + { + "items": [ + 9141, + null + ], + "hints": { + "index": 17221 + } + }, + { + "items": [ + 9141.5, + null + ], + "hints": { + "index": 17222 + } + }, + { + "items": [ + 9142, + null + ], + "hints": { + "index": 17223 + } + }, + { + "items": [ + 9142.5, + null + ], + "hints": { + "index": 17224 + } + }, + { + "items": [ + 9143, + null + ], + "hints": { + "index": 17225 + } + }, + { + "items": [ + 9143.5, + null + ], + "hints": { + "index": 17226 + } + }, + { + "items": [ + 9144, + null + ], + "hints": { + "index": 17227 + } + }, + { + "items": [ + 9144.5, + null + ], + "hints": { + "index": 17228 + } + }, + { + "items": [ + 9145, + null + ], + "hints": { + "index": 17229 + } + }, + { + "items": [ + 9145.5, + null + ], + "hints": { + "index": 17230 + } + }, + { + "items": [ + 9146, + null + ], + "hints": { + "index": 17231 + } + }, + { + "items": [ + 9146.5, + null + ], + "hints": { + "index": 17232 + } + }, + { + "items": [ + 9147, + null + ], + "hints": { + "index": 17233 + } + }, + { + "items": [ + 9147.5, + null + ], + "hints": { + "index": 17234 + } + }, + { + "items": [ + 9148, + null + ], + "hints": { + "index": 17235 + } + }, + { + "items": [ + 9148.5, + null + ], + "hints": { + "index": 17236 + } + }, + { + "items": [ + 9149, + null + ], + "hints": { + "index": 17237 + } + }, + { + "items": [ + 9149.5, + null + ], + "hints": { + "index": 17238 + } + }, + { + "items": [ + 9150, + null + ], + "hints": { + "index": 17239 + } + }, + { + "items": [ + 9150.5, + null + ], + "hints": { + "index": 17240 + } + }, + { + "items": [ + 9151, + null + ], + "hints": { + "index": 17241 + } + }, + { + "items": [ + 9151.5, + null + ], + "hints": { + "index": 17242 + } + }, + { + "items": [ + 9152, + null + ], + "hints": { + "index": 17243 + } + }, + { + "items": [ + 9152.5, + null + ], + "hints": { + "index": 17244 + } + }, + { + "items": [ + 9153, + null + ], + "hints": { + "index": 17245 + } + }, + { + "items": [ + 9153.5, + null + ], + "hints": { + "index": 17246 + } + }, + { + "items": [ + 9154, + null + ], + "hints": { + "index": 17247 + } + }, + { + "items": [ + 9154.5, + null + ], + "hints": { + "index": 17248 + } + }, + { + "items": [ + 9155, + null + ], + "hints": { + "index": 17249 + } + }, + { + "items": [ + 9155.5, + null + ], + "hints": { + "index": 17250 + } + }, + { + "items": [ + 9156, + null + ], + "hints": { + "index": 17251 + } + }, + { + "items": [ + 9156.5, + null + ], + "hints": { + "index": 17252 + } + }, + { + "items": [ + 9157, + null + ], + "hints": { + "index": 17253 + } + }, + { + "items": [ + 9157.5, + null + ], + "hints": { + "index": 17254 + } + }, + { + "items": [ + 9158, + null + ], + "hints": { + "index": 17255 + } + }, + { + "items": [ + 9158.5, + null + ], + "hints": { + "index": 17256 + } + }, + { + "items": [ + 9159, + null + ], + "hints": { + "index": 17257 + } + }, + { + "items": [ + 9159.5, + null + ], + "hints": { + "index": 17258 + } + }, + { + "items": [ + 9160, + null + ], + "hints": { + "index": 17259 + } + }, + { + "items": [ + 9160.5, + null + ], + "hints": { + "index": 17260 + } + }, + { + "items": [ + 9161, + null + ], + "hints": { + "index": 17261 + } + }, + { + "items": [ + 9161.5, + null + ], + "hints": { + "index": 17262 + } + }, + { + "items": [ + 9162, + null + ], + "hints": { + "index": 17263 + } + }, + { + "items": [ + 9162.5, + null + ], + "hints": { + "index": 17264 + } + }, + { + "items": [ + 9163, + null + ], + "hints": { + "index": 17265 + } + }, + { + "items": [ + 9163.5, + null + ], + "hints": { + "index": 17266 + } + }, + { + "items": [ + 9164, + null + ], + "hints": { + "index": 17267 + } + }, + { + "items": [ + 9164.5, + null + ], + "hints": { + "index": 17268 + } + }, + { + "items": [ + 9165, + null + ], + "hints": { + "index": 17269 + } + }, + { + "items": [ + 9165.5, + null + ], + "hints": { + "index": 17270 + } + }, + { + "items": [ + 9166, + null + ], + "hints": { + "index": 17271 + } + }, + { + "items": [ + 9166.5, + null + ], + "hints": { + "index": 17272 + } + }, + { + "items": [ + 9167, + null + ], + "hints": { + "index": 17273 + } + }, + { + "items": [ + 9167.5, + null + ], + "hints": { + "index": 17274 + } + }, + { + "items": [ + 9168, + null + ], + "hints": { + "index": 17275 + } + }, + { + "items": [ + 9168.5, + null + ], + "hints": { + "index": 17276 + } + }, + { + "items": [ + 9169, + null + ], + "hints": { + "index": 17277 + } + }, + { + "items": [ + 9169.5, + null + ], + "hints": { + "index": 17278 + } + }, + { + "items": [ + 9170, + null + ], + "hints": { + "index": 17279 + } + }, + { + "items": [ + 9170.5, + null + ], + "hints": { + "index": 17280 + } + }, + { + "items": [ + 9171, + null + ], + "hints": { + "index": 17281 + } + }, + { + "items": [ + 9171.5, + null + ], + "hints": { + "index": 17282 + } + }, + { + "items": [ + 9172, + null + ], + "hints": { + "index": 17283 + } + }, + { + "items": [ + 9172.5, + null + ], + "hints": { + "index": 17284 + } + }, + { + "items": [ + 9173, + null + ], + "hints": { + "index": 17285 + } + }, + { + "items": [ + 9173.5, + null + ], + "hints": { + "index": 17286 + } + }, + { + "items": [ + 9174, + null + ], + "hints": { + "index": 17287 + } + }, + { + "items": [ + 9174.5, + null + ], + "hints": { + "index": 17288 + } + }, + { + "items": [ + 9175, + null + ], + "hints": { + "index": 17289 + } + }, + { + "items": [ + 9175.5, + null + ], + "hints": { + "index": 17290 + } + }, + { + "items": [ + 9176, + null + ], + "hints": { + "index": 17291 + } + }, + { + "items": [ + 9176.5, + null + ], + "hints": { + "index": 17292 + } + }, + { + "items": [ + 9177, + null + ], + "hints": { + "index": 17293 + } + }, + { + "items": [ + 9177.5, + null + ], + "hints": { + "index": 17294 + } + }, + { + "items": [ + 9178, + null + ], + "hints": { + "index": 17295 + } + }, + { + "items": [ + 9178.5, + null + ], + "hints": { + "index": 17296 + } + }, + { + "items": [ + 9179, + null + ], + "hints": { + "index": 17297 + } + }, + { + "items": [ + 9179.5, + null + ], + "hints": { + "index": 17298 + } + }, + { + "items": [ + 9180, + null + ], + "hints": { + "index": 17299 + } + }, + { + "items": [ + 9180.5, + null + ], + "hints": { + "index": 17300 + } + }, + { + "items": [ + 9181, + null + ], + "hints": { + "index": 17301 + } + }, + { + "items": [ + 9181.5, + null + ], + "hints": { + "index": 17302 + } + }, + { + "items": [ + 9182, + null + ], + "hints": { + "index": 17303 + } + }, + { + "items": [ + 9182.5, + null + ], + "hints": { + "index": 17304 + } + }, + { + "items": [ + 9183, + null + ], + "hints": { + "index": 17305 + } + }, + { + "items": [ + 9183.5, + null + ], + "hints": { + "index": 17306 + } + }, + { + "items": [ + 9184, + null + ], + "hints": { + "index": 17307 + } + }, + { + "items": [ + 9184.5, + null + ], + "hints": { + "index": 17308 + } + }, + { + "items": [ + 9185, + null + ], + "hints": { + "index": 17309 + } + }, + { + "items": [ + 9185.5, + null + ], + "hints": { + "index": 17310 + } + }, + { + "items": [ + 9186, + null + ], + "hints": { + "index": 17311 + } + }, + { + "items": [ + 9186.5, + null + ], + "hints": { + "index": 17312 + } + }, + { + "items": [ + 9187, + null + ], + "hints": { + "index": 17313 + } + }, + { + "items": [ + 9187.5, + null + ], + "hints": { + "index": 17314 + } + }, + { + "items": [ + 9188, + null + ], + "hints": { + "index": 17315 + } + }, + { + "items": [ + 9188.5, + null + ], + "hints": { + "index": 17316 + } + }, + { + "items": [ + 9189, + null + ], + "hints": { + "index": 17317 + } + }, + { + "items": [ + 9189.5, + null + ], + "hints": { + "index": 17318 + } + }, + { + "items": [ + 9190, + null + ], + "hints": { + "index": 17319 + } + }, + { + "items": [ + 9190.5, + null + ], + "hints": { + "index": 17320 + } + }, + { + "items": [ + 9191, + null + ], + "hints": { + "index": 17321 + } + }, + { + "items": [ + 9191.5, + null + ], + "hints": { + "index": 17322 + } + }, + { + "items": [ + 9192, + null + ], + "hints": { + "index": 17323 + } + }, + { + "items": [ + 9192.5, + null + ], + "hints": { + "index": 17324 + } + }, + { + "items": [ + 9193, + null + ], + "hints": { + "index": 17325 + } + }, + { + "items": [ + 9193.5, + null + ], + "hints": { + "index": 17326 + } + }, + { + "items": [ + 9194, + null + ], + "hints": { + "index": 17327 + } + }, + { + "items": [ + 9194.5, + null + ], + "hints": { + "index": 17328 + } + }, + { + "items": [ + 9195, + null + ], + "hints": { + "index": 17329 + } + }, + { + "items": [ + 9195.5, + null + ], + "hints": { + "index": 17330 + } + }, + { + "items": [ + 9196, + null + ], + "hints": { + "index": 17331 + } + }, + { + "items": [ + 9196.5, + null + ], + "hints": { + "index": 17332 + } + }, + { + "items": [ + 9197, + null + ], + "hints": { + "index": 17333 + } + }, + { + "items": [ + 9197.5, + null + ], + "hints": { + "index": 17334 + } + }, + { + "items": [ + 9198, + null + ], + "hints": { + "index": 17335 + } + }, + { + "items": [ + 9198.5, + null + ], + "hints": { + "index": 17336 + } + }, + { + "items": [ + 9199, + null + ], + "hints": { + "index": 17337 + } + }, + { + "items": [ + 9199.5, + null + ], + "hints": { + "index": 17338 + } + }, + { + "items": [ + 9200, + null + ], + "hints": { + "index": 17339 + } + }, + { + "items": [ + 9200.5, + null + ], + "hints": { + "index": 17340 + } + }, + { + "items": [ + 9201, + null + ], + "hints": { + "index": 17341 + } + }, + { + "items": [ + 9201.5, + null + ], + "hints": { + "index": 17342 + } + }, + { + "items": [ + 9202, + null + ], + "hints": { + "index": 17343 + } + }, + { + "items": [ + 9202.5, + null + ], + "hints": { + "index": 17344 + } + }, + { + "items": [ + 9203, + null + ], + "hints": { + "index": 17345 + } + }, + { + "items": [ + 9203.5, + null + ], + "hints": { + "index": 17346 + } + }, + { + "items": [ + 9204, + null + ], + "hints": { + "index": 17347 + } + }, + { + "items": [ + 9204.5, + null + ], + "hints": { + "index": 17348 + } + }, + { + "items": [ + 9205, + null + ], + "hints": { + "index": 17349 + } + }, + { + "items": [ + 9205.5, + null + ], + "hints": { + "index": 17350 + } + }, + { + "items": [ + 9206, + null + ], + "hints": { + "index": 17351 + } + }, + { + "items": [ + 9206.5, + null + ], + "hints": { + "index": 17352 + } + }, + { + "items": [ + 9207, + null + ], + "hints": { + "index": 17353 + } + }, + { + "items": [ + 9207.5, + null + ], + "hints": { + "index": 17354 + } + }, + { + "items": [ + 9208, + null + ], + "hints": { + "index": 17355 + } + }, + { + "items": [ + 9208.5, + null + ], + "hints": { + "index": 17356 + } + }, + { + "items": [ + 9209, + null + ], + "hints": { + "index": 17357 + } + }, + { + "items": [ + 9209.5, + null + ], + "hints": { + "index": 17358 + } + }, + { + "items": [ + 9210, + null + ], + "hints": { + "index": 17359 + } + }, + { + "items": [ + 9210.5, + null + ], + "hints": { + "index": 17360 + } + }, + { + "items": [ + 9211, + null + ], + "hints": { + "index": 17361 + } + }, + { + "items": [ + 9211.5, + null + ], + "hints": { + "index": 17362 + } + }, + { + "items": [ + 9212, + null + ], + "hints": { + "index": 17363 + } + }, + { + "items": [ + 9212.5, + null + ], + "hints": { + "index": 17364 + } + }, + { + "items": [ + 9213, + null + ], + "hints": { + "index": 17365 + } + }, + { + "items": [ + 9213.5, + null + ], + "hints": { + "index": 17366 + } + }, + { + "items": [ + 9214, + null + ], + "hints": { + "index": 17367 + } + }, + { + "items": [ + 9214.5, + null + ], + "hints": { + "index": 17368 + } + }, + { + "items": [ + 9215, + null + ], + "hints": { + "index": 17369 + } + }, + { + "items": [ + 9215.5, + null + ], + "hints": { + "index": 17370 + } + }, + { + "items": [ + 9216, + null + ], + "hints": { + "index": 17371 + } + }, + { + "items": [ + 9216.5, + null + ], + "hints": { + "index": 17372 + } + }, + { + "items": [ + 9217, + null + ], + "hints": { + "index": 17373 + } + }, + { + "items": [ + 9217.5, + null + ], + "hints": { + "index": 17374 + } + }, + { + "items": [ + 9218, + null + ], + "hints": { + "index": 17375 + } + }, + { + "items": [ + 9218.5, + null + ], + "hints": { + "index": 17376 + } + }, + { + "items": [ + 9219, + null + ], + "hints": { + "index": 17377 + } + }, + { + "items": [ + 9219.5, + null + ], + "hints": { + "index": 17378 + } + }, + { + "items": [ + 9220, + null + ], + "hints": { + "index": 17379 + } + }, + { + "items": [ + 9220.5, + null + ], + "hints": { + "index": 17380 + } + }, + { + "items": [ + 9221, + null + ], + "hints": { + "index": 17381 + } + }, + { + "items": [ + 9221.5, + null + ], + "hints": { + "index": 17382 + } + }, + { + "items": [ + 9222, + null + ], + "hints": { + "index": 17383 + } + }, + { + "items": [ + 9222.5, + null + ], + "hints": { + "index": 17384 + } + }, + { + "items": [ + 9223, + null + ], + "hints": { + "index": 17385 + } + }, + { + "items": [ + 9223.5, + null + ], + "hints": { + "index": 17386 + } + }, + { + "items": [ + 9224, + null + ], + "hints": { + "index": 17387 + } + }, + { + "items": [ + 9224.5, + null + ], + "hints": { + "index": 17388 + } + }, + { + "items": [ + 9225, + null + ], + "hints": { + "index": 17389 + } + }, + { + "items": [ + 9225.5, + null + ], + "hints": { + "index": 17390 + } + }, + { + "items": [ + 9226, + null + ], + "hints": { + "index": 17391 + } + }, + { + "items": [ + 9226.5, + null + ], + "hints": { + "index": 17392 + } + }, + { + "items": [ + 9227, + null + ], + "hints": { + "index": 17393 + } + }, + { + "items": [ + 9227.5, + null + ], + "hints": { + "index": 17394 + } + }, + { + "items": [ + 9228, + null + ], + "hints": { + "index": 17395 + } + }, + { + "items": [ + 9228.5, + null + ], + "hints": { + "index": 17396 + } + }, + { + "items": [ + 9229, + null + ], + "hints": { + "index": 17397 + } + }, + { + "items": [ + 9229.5, + null + ], + "hints": { + "index": 17398 + } + }, + { + "items": [ + 9230, + null + ], + "hints": { + "index": 17399 + } + }, + { + "items": [ + 9230.5, + null + ], + "hints": { + "index": 17400 + } + }, + { + "items": [ + 9231, + null + ], + "hints": { + "index": 17401 + } + }, + { + "items": [ + 9231.5, + null + ], + "hints": { + "index": 17402 + } + }, + { + "items": [ + 9232, + null + ], + "hints": { + "index": 17403 + } + }, + { + "items": [ + 9232.5, + null + ], + "hints": { + "index": 17404 + } + }, + { + "items": [ + 9233, + null + ], + "hints": { + "index": 17405 + } + }, + { + "items": [ + 9233.5, + null + ], + "hints": { + "index": 17406 + } + }, + { + "items": [ + 9234, + null + ], + "hints": { + "index": 17407 + } + }, + { + "items": [ + 9234.5, + null + ], + "hints": { + "index": 17408 + } + }, + { + "items": [ + 9235, + null + ], + "hints": { + "index": 17409 + } + }, + { + "items": [ + 9235.5, + null + ], + "hints": { + "index": 17410 + } + }, + { + "items": [ + 9236, + null + ], + "hints": { + "index": 17411 + } + }, + { + "items": [ + 9236.5, + null + ], + "hints": { + "index": 17412 + } + }, + { + "items": [ + 9237, + null + ], + "hints": { + "index": 17413 + } + }, + { + "items": [ + 9237.5, + null + ], + "hints": { + "index": 17414 + } + }, + { + "items": [ + 9238, + null + ], + "hints": { + "index": 17415 + } + }, + { + "items": [ + 9238.5, + null + ], + "hints": { + "index": 17416 + } + }, + { + "items": [ + 9239, + null + ], + "hints": { + "index": 17417 + } + }, + { + "items": [ + 9239.5, + null + ], + "hints": { + "index": 17418 + } + }, + { + "items": [ + 9240, + null + ], + "hints": { + "index": 17419 + } + }, + { + "items": [ + 9240.5, + null + ], + "hints": { + "index": 17420 + } + }, + { + "items": [ + 9241, + null + ], + "hints": { + "index": 17421 + } + }, + { + "items": [ + 9241.5, + null + ], + "hints": { + "index": 17422 + } + }, + { + "items": [ + 9242, + null + ], + "hints": { + "index": 17423 + } + }, + { + "items": [ + 9242.5, + null + ], + "hints": { + "index": 17424 + } + }, + { + "items": [ + 9243, + null + ], + "hints": { + "index": 17425 + } + }, + { + "items": [ + 9243.5, + null + ], + "hints": { + "index": 17426 + } + }, + { + "items": [ + 9244, + null + ], + "hints": { + "index": 17427 + } + }, + { + "items": [ + 9244.5, + null + ], + "hints": { + "index": 17428 + } + }, + { + "items": [ + 9245, + null + ], + "hints": { + "index": 17429 + } + }, + { + "items": [ + 9245.5, + null + ], + "hints": { + "index": 17430 + } + }, + { + "items": [ + 9246, + null + ], + "hints": { + "index": 17431 + } + }, + { + "items": [ + 9246.5, + null + ], + "hints": { + "index": 17432 + } + }, + { + "items": [ + 9247, + null + ], + "hints": { + "index": 17433 + } + }, + { + "items": [ + 9247.5, + null + ], + "hints": { + "index": 17434 + } + }, + { + "items": [ + 9248, + null + ], + "hints": { + "index": 17435 + } + }, + { + "items": [ + 9248.5, + null + ], + "hints": { + "index": 17436 + } + }, + { + "items": [ + 9249, + null + ], + "hints": { + "index": 17437 + } + }, + { + "items": [ + 9249.5, + null + ], + "hints": { + "index": 17438 + } + }, + { + "items": [ + 9250, + null + ], + "hints": { + "index": 17439 + } + }, + { + "items": [ + 9250.5, + null + ], + "hints": { + "index": 17440 + } + }, + { + "items": [ + 9251, + null + ], + "hints": { + "index": 17441 + } + }, + { + "items": [ + 9251.5, + null + ], + "hints": { + "index": 17442 + } + }, + { + "items": [ + 9252, + null + ], + "hints": { + "index": 17443 + } + }, + { + "items": [ + 9252.5, + null + ], + "hints": { + "index": 17444 + } + }, + { + "items": [ + 9253, + null + ], + "hints": { + "index": 17445 + } + }, + { + "items": [ + 9253.5, + null + ], + "hints": { + "index": 17446 + } + }, + { + "items": [ + 9254, + null + ], + "hints": { + "index": 17447 + } + }, + { + "items": [ + 9254.5, + null + ], + "hints": { + "index": 17448 + } + }, + { + "items": [ + 9255, + null + ], + "hints": { + "index": 17449 + } + }, + { + "items": [ + 9255.5, + null + ], + "hints": { + "index": 17450 + } + }, + { + "items": [ + 9256, + null + ], + "hints": { + "index": 17451 + } + }, + { + "items": [ + 9256.5, + null + ], + "hints": { + "index": 17452 + } + }, + { + "items": [ + 9257, + null + ], + "hints": { + "index": 17453 + } + }, + { + "items": [ + 9257.5, + null + ], + "hints": { + "index": 17454 + } + }, + { + "items": [ + 9258, + null + ], + "hints": { + "index": 17455 + } + }, + { + "items": [ + 9258.5, + null + ], + "hints": { + "index": 17456 + } + }, + { + "items": [ + 9259, + null + ], + "hints": { + "index": 17457 + } + }, + { + "items": [ + 9259.5, + null + ], + "hints": { + "index": 17458 + } + }, + { + "items": [ + 9260, + null + ], + "hints": { + "index": 17459 + } + }, + { + "items": [ + 9260.5, + null + ], + "hints": { + "index": 17460 + } + }, + { + "items": [ + 9261, + null + ], + "hints": { + "index": 17461 + } + }, + { + "items": [ + 9261.5, + null + ], + "hints": { + "index": 17462 + } + }, + { + "items": [ + 9262, + null + ], + "hints": { + "index": 17463 + } + }, + { + "items": [ + 9262.5, + null + ], + "hints": { + "index": 17464 + } + }, + { + "items": [ + 9263, + null + ], + "hints": { + "index": 17465 + } + }, + { + "items": [ + 9263.5, + null + ], + "hints": { + "index": 17466 + } + }, + { + "items": [ + 9264, + null + ], + "hints": { + "index": 17467 + } + }, + { + "items": [ + 9264.5, + null + ], + "hints": { + "index": 17468 + } + }, + { + "items": [ + 9265, + null + ], + "hints": { + "index": 17469 + } + }, + { + "items": [ + 9265.5, + null + ], + "hints": { + "index": 17470 + } + }, + { + "items": [ + 9266, + null + ], + "hints": { + "index": 17471 + } + }, + { + "items": [ + 9266.5, + null + ], + "hints": { + "index": 17472 + } + }, + { + "items": [ + 9267, + null + ], + "hints": { + "index": 17473 + } + }, + { + "items": [ + 9267.5, + null + ], + "hints": { + "index": 17474 + } + }, + { + "items": [ + 9268, + null + ], + "hints": { + "index": 17475 + } + }, + { + "items": [ + 9268.5, + null + ], + "hints": { + "index": 17476 + } + }, + { + "items": [ + 9269, + null + ], + "hints": { + "index": 17477 + } + }, + { + "items": [ + 9269.5, + null + ], + "hints": { + "index": 17478 + } + }, + { + "items": [ + 9270, + null + ], + "hints": { + "index": 17479 + } + }, + { + "items": [ + 9270.5, + null + ], + "hints": { + "index": 17480 + } + }, + { + "items": [ + 9271, + null + ], + "hints": { + "index": 17481 + } + }, + { + "items": [ + 9271.5, + null + ], + "hints": { + "index": 17482 + } + }, + { + "items": [ + 9272, + null + ], + "hints": { + "index": 17483 + } + }, + { + "items": [ + 9272.5, + null + ], + "hints": { + "index": 17484 + } + }, + { + "items": [ + 9273, + null + ], + "hints": { + "index": 17485 + } + }, + { + "items": [ + 9273.5, + null + ], + "hints": { + "index": 17486 + } + }, + { + "items": [ + 9274, + null + ], + "hints": { + "index": 17487 + } + }, + { + "items": [ + 9274.5, + null + ], + "hints": { + "index": 17488 + } + }, + { + "items": [ + 9275, + null + ], + "hints": { + "index": 17489 + } + }, + { + "items": [ + 9275.5, + null + ], + "hints": { + "index": 17490 + } + }, + { + "items": [ + 9276, + null + ], + "hints": { + "index": 17491 + } + }, + { + "items": [ + 9276.5, + null + ], + "hints": { + "index": 17492 + } + }, + { + "items": [ + 9277, + null + ], + "hints": { + "index": 17493 + } + }, + { + "items": [ + 9277.5, + null + ], + "hints": { + "index": 17494 + } + }, + { + "items": [ + 9278, + null + ], + "hints": { + "index": 17495 + } + }, + { + "items": [ + 9278.5, + null + ], + "hints": { + "index": 17496 + } + }, + { + "items": [ + 9279, + null + ], + "hints": { + "index": 17497 + } + }, + { + "items": [ + 9279.5, + null + ], + "hints": { + "index": 17498 + } + }, + { + "items": [ + 9280, + null + ], + "hints": { + "index": 17499 + } + }, + { + "items": [ + 9280.5, + null + ], + "hints": { + "index": 17500 + } + }, + { + "items": [ + 9281, + null + ], + "hints": { + "index": 17501 + } + }, + { + "items": [ + 9281.5, + null + ], + "hints": { + "index": 17502 + } + }, + { + "items": [ + 9282, + null + ], + "hints": { + "index": 17503 + } + }, + { + "items": [ + 9282.5, + null + ], + "hints": { + "index": 17504 + } + }, + { + "items": [ + 9283, + null + ], + "hints": { + "index": 17505 + } + }, + { + "items": [ + 9283.5, + null + ], + "hints": { + "index": 17506 + } + }, + { + "items": [ + 9284, + null + ], + "hints": { + "index": 17507 + } + }, + { + "items": [ + 9284.5, + null + ], + "hints": { + "index": 17508 + } + }, + { + "items": [ + 9285, + null + ], + "hints": { + "index": 17509 + } + }, + { + "items": [ + 9285.5, + null + ], + "hints": { + "index": 17510 + } + }, + { + "items": [ + 9286, + null + ], + "hints": { + "index": 17511 + } + }, + { + "items": [ + 9286.5, + null + ], + "hints": { + "index": 17512 + } + }, + { + "items": [ + 9287, + null + ], + "hints": { + "index": 17513 + } + }, + { + "items": [ + 9287.5, + null + ], + "hints": { + "index": 17514 + } + }, + { + "items": [ + 9288, + null + ], + "hints": { + "index": 17515 + } + }, + { + "items": [ + 9288.5, + null + ], + "hints": { + "index": 17516 + } + }, + { + "items": [ + 9289, + null + ], + "hints": { + "index": 17517 + } + }, + { + "items": [ + 9289.5, + null + ], + "hints": { + "index": 17518 + } + }, + { + "items": [ + 9290, + null + ], + "hints": { + "index": 17519 + } + }, + { + "items": [ + 9290.5, + null + ], + "hints": { + "index": 17520 + } + }, + { + "items": [ + 9291, + null + ], + "hints": { + "index": 17521 + } + }, + { + "items": [ + 9291.5, + null + ], + "hints": { + "index": 17522 + } + }, + { + "items": [ + 9292, + null + ], + "hints": { + "index": 17523 + } + }, + { + "items": [ + 9292.5, + null + ], + "hints": { + "index": 17524 + } + }, + { + "items": [ + 9293, + null + ], + "hints": { + "index": 17525 + } + }, + { + "items": [ + 9293.5, + null + ], + "hints": { + "index": 17526 + } + }, + { + "items": [ + 9294, + null + ], + "hints": { + "index": 17527 + } + }, + { + "items": [ + 9294.5, + null + ], + "hints": { + "index": 17528 + } + }, + { + "items": [ + 9295, + null + ], + "hints": { + "index": 17529 + } + }, + { + "items": [ + 9295.5, + null + ], + "hints": { + "index": 17530 + } + }, + { + "items": [ + 9296, + null + ], + "hints": { + "index": 17531 + } + }, + { + "items": [ + 9296.5, + null + ], + "hints": { + "index": 17532 + } + }, + { + "items": [ + 9297, + null + ], + "hints": { + "index": 17533 + } + }, + { + "items": [ + 9297.5, + null + ], + "hints": { + "index": 17534 + } + }, + { + "items": [ + 9298, + null + ], + "hints": { + "index": 17535 + } + }, + { + "items": [ + 9298.5, + null + ], + "hints": { + "index": 17536 + } + }, + { + "items": [ + 9299, + null + ], + "hints": { + "index": 17537 + } + }, + { + "items": [ + 9299.5, + null + ], + "hints": { + "index": 17538 + } + }, + { + "items": [ + 9300, + null + ], + "hints": { + "index": 17539 + } + }, + { + "items": [ + 9300.5, + null + ], + "hints": { + "index": 17540 + } + }, + { + "items": [ + 9301, + null + ], + "hints": { + "index": 17541 + } + }, + { + "items": [ + 9301.5, + null + ], + "hints": { + "index": 17542 + } + }, + { + "items": [ + 9302, + null + ], + "hints": { + "index": 17543 + } + }, + { + "items": [ + 9302.5, + null + ], + "hints": { + "index": 17544 + } + }, + { + "items": [ + 9303, + null + ], + "hints": { + "index": 17545 + } + }, + { + "items": [ + 9303.5, + null + ], + "hints": { + "index": 17546 + } + }, + { + "items": [ + 9304, + null + ], + "hints": { + "index": 17547 + } + }, + { + "items": [ + 9304.5, + null + ], + "hints": { + "index": 17548 + } + }, + { + "items": [ + 9305, + null + ], + "hints": { + "index": 17549 + } + }, + { + "items": [ + 9305.5, + null + ], + "hints": { + "index": 17550 + } + }, + { + "items": [ + 9306, + null + ], + "hints": { + "index": 17551 + } + }, + { + "items": [ + 9306.5, + null + ], + "hints": { + "index": 17552 + } + }, + { + "items": [ + 9307, + null + ], + "hints": { + "index": 17553 + } + }, + { + "items": [ + 9307.5, + null + ], + "hints": { + "index": 17554 + } + }, + { + "items": [ + 9308, + null + ], + "hints": { + "index": 17555 + } + }, + { + "items": [ + 9308.5, + null + ], + "hints": { + "index": 17556 + } + }, + { + "items": [ + 9309, + null + ], + "hints": { + "index": 17557 + } + }, + { + "items": [ + 9309.5, + null + ], + "hints": { + "index": 17558 + } + }, + { + "items": [ + 9310, + null + ], + "hints": { + "index": 17559 + } + }, + { + "items": [ + 9310.5, + null + ], + "hints": { + "index": 17560 + } + }, + { + "items": [ + 9311, + null + ], + "hints": { + "index": 17561 + } + }, + { + "items": [ + 9311.5, + null + ], + "hints": { + "index": 17562 + } + }, + { + "items": [ + 9312, + null + ], + "hints": { + "index": 17563 + } + }, + { + "items": [ + 9312.5, + null + ], + "hints": { + "index": 17564 + } + }, + { + "items": [ + 9313, + null + ], + "hints": { + "index": 17565 + } + }, + { + "items": [ + 9313.5, + null + ], + "hints": { + "index": 17566 + } + }, + { + "items": [ + 9314, + null + ], + "hints": { + "index": 17567 + } + }, + { + "items": [ + 9314.5, + null + ], + "hints": { + "index": 17568 + } + }, + { + "items": [ + 9315, + null + ], + "hints": { + "index": 17569 + } + }, + { + "items": [ + 9315.5, + null + ], + "hints": { + "index": 17570 + } + }, + { + "items": [ + 9316, + null + ], + "hints": { + "index": 17571 + } + }, + { + "items": [ + 9316.5, + null + ], + "hints": { + "index": 17572 + } + }, + { + "items": [ + 9317, + null + ], + "hints": { + "index": 17573 + } + }, + { + "items": [ + 9317.5, + null + ], + "hints": { + "index": 17574 + } + }, + { + "items": [ + 9318, + null + ], + "hints": { + "index": 17575 + } + }, + { + "items": [ + 9318.5, + null + ], + "hints": { + "index": 17576 + } + }, + { + "items": [ + 9319, + null + ], + "hints": { + "index": 17577 + } + }, + { + "items": [ + 9319.5, + null + ], + "hints": { + "index": 17578 + } + }, + { + "items": [ + 9320, + null + ], + "hints": { + "index": 17579 + } + }, + { + "items": [ + 9320.5, + null + ], + "hints": { + "index": 17580 + } + }, + { + "items": [ + 9321, + null + ], + "hints": { + "index": 17581 + } + }, + { + "items": [ + 9321.5, + null + ], + "hints": { + "index": 17582 + } + }, + { + "items": [ + 9322, + null + ], + "hints": { + "index": 17583 + } + }, + { + "items": [ + 9322.5, + null + ], + "hints": { + "index": 17584 + } + }, + { + "items": [ + 9323, + null + ], + "hints": { + "index": 17585 + } + }, + { + "items": [ + 9323.5, + null + ], + "hints": { + "index": 17586 + } + }, + { + "items": [ + 9324, + null + ], + "hints": { + "index": 17587 + } + }, + { + "items": [ + 9324.5, + null + ], + "hints": { + "index": 17588 + } + }, + { + "items": [ + 9325, + null + ], + "hints": { + "index": 17589 + } + }, + { + "items": [ + 9325.5, + null + ], + "hints": { + "index": 17590 + } + }, + { + "items": [ + 9326, + null + ], + "hints": { + "index": 17591 + } + }, + { + "items": [ + 9326.5, + null + ], + "hints": { + "index": 17592 + } + }, + { + "items": [ + 9327, + null + ], + "hints": { + "index": 17593 + } + }, + { + "items": [ + 9327.5, + null + ], + "hints": { + "index": 17594 + } + }, + { + "items": [ + 9328, + null + ], + "hints": { + "index": 17595 + } + }, + { + "items": [ + 9328.5, + null + ], + "hints": { + "index": 17596 + } + }, + { + "items": [ + 9329, + null + ], + "hints": { + "index": 17597 + } + }, + { + "items": [ + 9329.5, + null + ], + "hints": { + "index": 17598 + } + }, + { + "items": [ + 9330, + null + ], + "hints": { + "index": 17599 + } + }, + { + "items": [ + 9330.5, + null + ], + "hints": { + "index": 17600 + } + }, + { + "items": [ + 9331, + null + ], + "hints": { + "index": 17601 + } + }, + { + "items": [ + 9331.5, + null + ], + "hints": { + "index": 17602 + } + }, + { + "items": [ + 9332, + null + ], + "hints": { + "index": 17603 + } + }, + { + "items": [ + 9332.5, + null + ], + "hints": { + "index": 17604 + } + }, + { + "items": [ + 9333, + null + ], + "hints": { + "index": 17605 + } + }, + { + "items": [ + 9333.5, + null + ], + "hints": { + "index": 17606 + } + }, + { + "items": [ + 9334, + null + ], + "hints": { + "index": 17607 + } + }, + { + "items": [ + 9334.5, + null + ], + "hints": { + "index": 17608 + } + }, + { + "items": [ + 9335, + null + ], + "hints": { + "index": 17609 + } + }, + { + "items": [ + 9335.5, + null + ], + "hints": { + "index": 17610 + } + }, + { + "items": [ + 9336, + null + ], + "hints": { + "index": 17611 + } + }, + { + "items": [ + 9336.5, + null + ], + "hints": { + "index": 17612 + } + }, + { + "items": [ + 9337, + null + ], + "hints": { + "index": 17613 + } + }, + { + "items": [ + 9337.5, + null + ], + "hints": { + "index": 17614 + } + }, + { + "items": [ + 9338, + null + ], + "hints": { + "index": 17615 + } + }, + { + "items": [ + 9338.5, + null + ], + "hints": { + "index": 17616 + } + }, + { + "items": [ + 9339, + null + ], + "hints": { + "index": 17617 + } + }, + { + "items": [ + 9339.5, + null + ], + "hints": { + "index": 17618 + } + }, + { + "items": [ + 9340, + null + ], + "hints": { + "index": 17619 + } + }, + { + "items": [ + 9340.5, + null + ], + "hints": { + "index": 17620 + } + }, + { + "items": [ + 9341, + null + ], + "hints": { + "index": 17621 + } + }, + { + "items": [ + 9341.5, + null + ], + "hints": { + "index": 17622 + } + }, + { + "items": [ + 9342, + null + ], + "hints": { + "index": 17623 + } + }, + { + "items": [ + 9342.5, + null + ], + "hints": { + "index": 17624 + } + }, + { + "items": [ + 9343, + null + ], + "hints": { + "index": 17625 + } + }, + { + "items": [ + 9343.5, + null + ], + "hints": { + "index": 17626 + } + }, + { + "items": [ + 9344, + null + ], + "hints": { + "index": 17627 + } + }, + { + "items": [ + 9344.5, + null + ], + "hints": { + "index": 17628 + } + }, + { + "items": [ + 9345, + null + ], + "hints": { + "index": 17629 + } + }, + { + "items": [ + 9345.5, + null + ], + "hints": { + "index": 17630 + } + }, + { + "items": [ + 9346, + null + ], + "hints": { + "index": 17631 + } + }, + { + "items": [ + 9346.5, + null + ], + "hints": { + "index": 17632 + } + }, + { + "items": [ + 9347, + null + ], + "hints": { + "index": 17633 + } + }, + { + "items": [ + 9347.5, + null + ], + "hints": { + "index": 17634 + } + }, + { + "items": [ + 9348, + null + ], + "hints": { + "index": 17635 + } + }, + { + "items": [ + 9348.5, + null + ], + "hints": { + "index": 17636 + } + }, + { + "items": [ + 9349, + null + ], + "hints": { + "index": 17637 + } + }, + { + "items": [ + 9349.5, + null + ], + "hints": { + "index": 17638 + } + }, + { + "items": [ + 9350, + null + ], + "hints": { + "index": 17639 + } + }, + { + "items": [ + 9350.5, + null + ], + "hints": { + "index": 17640 + } + }, + { + "items": [ + 9351, + null + ], + "hints": { + "index": 17641 + } + }, + { + "items": [ + 9351.5, + null + ], + "hints": { + "index": 17642 + } + }, + { + "items": [ + 9352, + null + ], + "hints": { + "index": 17643 + } + }, + { + "items": [ + 9352.5, + null + ], + "hints": { + "index": 17644 + } + }, + { + "items": [ + 9353, + null + ], + "hints": { + "index": 17645 + } + }, + { + "items": [ + 9353.5, + null + ], + "hints": { + "index": 17646 + } + }, + { + "items": [ + 9354, + null + ], + "hints": { + "index": 17647 + } + }, + { + "items": [ + 9354.5, + null + ], + "hints": { + "index": 17648 + } + }, + { + "items": [ + 9355, + null + ], + "hints": { + "index": 17649 + } + }, + { + "items": [ + 9355.5, + null + ], + "hints": { + "index": 17650 + } + }, + { + "items": [ + 9356, + null + ], + "hints": { + "index": 17651 + } + }, + { + "items": [ + 9356.5, + null + ], + "hints": { + "index": 17652 + } + }, + { + "items": [ + 9357, + null + ], + "hints": { + "index": 17653 + } + }, + { + "items": [ + 9357.5, + null + ], + "hints": { + "index": 17654 + } + }, + { + "items": [ + 9358, + null + ], + "hints": { + "index": 17655 + } + }, + { + "items": [ + 9358.5, + null + ], + "hints": { + "index": 17656 + } + }, + { + "items": [ + 9359, + null + ], + "hints": { + "index": 17657 + } + }, + { + "items": [ + 9359.5, + null + ], + "hints": { + "index": 17658 + } + }, + { + "items": [ + 9360, + null + ], + "hints": { + "index": 17659 + } + }, + { + "items": [ + 9360.5, + null + ], + "hints": { + "index": 17660 + } + }, + { + "items": [ + 9361, + null + ], + "hints": { + "index": 17661 + } + }, + { + "items": [ + 9361.5, + null + ], + "hints": { + "index": 17662 + } + }, + { + "items": [ + 9362, + null + ], + "hints": { + "index": 17663 + } + }, + { + "items": [ + 9362.5, + null + ], + "hints": { + "index": 17664 + } + }, + { + "items": [ + 9363, + null + ], + "hints": { + "index": 17665 + } + }, + { + "items": [ + 9363.5, + null + ], + "hints": { + "index": 17666 + } + }, + { + "items": [ + 9364, + null + ], + "hints": { + "index": 17667 + } + }, + { + "items": [ + 9364.5, + null + ], + "hints": { + "index": 17668 + } + }, + { + "items": [ + 9365, + null + ], + "hints": { + "index": 17669 + } + }, + { + "items": [ + 9365.5, + null + ], + "hints": { + "index": 17670 + } + }, + { + "items": [ + 9366, + null + ], + "hints": { + "index": 17671 + } + }, + { + "items": [ + 9366.5, + null + ], + "hints": { + "index": 17672 + } + }, + { + "items": [ + 9367, + null + ], + "hints": { + "index": 17673 + } + }, + { + "items": [ + 9367.5, + null + ], + "hints": { + "index": 17674 + } + }, + { + "items": [ + 9368, + null + ], + "hints": { + "index": 17675 + } + }, + { + "items": [ + 9368.5, + null + ], + "hints": { + "index": 17676 + } + }, + { + "items": [ + 9369, + null + ], + "hints": { + "index": 17677 + } + }, + { + "items": [ + 9369.5, + null + ], + "hints": { + "index": 17678 + } + }, + { + "items": [ + 9370, + null + ], + "hints": { + "index": 17679 + } + }, + { + "items": [ + 9370.5, + null + ], + "hints": { + "index": 17680 + } + }, + { + "items": [ + 9371, + null + ], + "hints": { + "index": 17681 + } + }, + { + "items": [ + 9371.5, + null + ], + "hints": { + "index": 17682 + } + }, + { + "items": [ + 9372, + null + ], + "hints": { + "index": 17683 + } + }, + { + "items": [ + 9372.5, + null + ], + "hints": { + "index": 17684 + } + }, + { + "items": [ + 9373, + null + ], + "hints": { + "index": 17685 + } + }, + { + "items": [ + 9373.5, + null + ], + "hints": { + "index": 17686 + } + }, + { + "items": [ + 9374, + null + ], + "hints": { + "index": 17687 + } + }, + { + "items": [ + 9374.5, + null + ], + "hints": { + "index": 17688 + } + }, + { + "items": [ + 9375, + null + ], + "hints": { + "index": 17689 + } + }, + { + "items": [ + 9375.5, + null + ], + "hints": { + "index": 17690 + } + }, + { + "items": [ + 9376, + null + ], + "hints": { + "index": 17691 + } + }, + { + "items": [ + 9376.5, + null + ], + "hints": { + "index": 17692 + } + }, + { + "items": [ + 9377, + null + ], + "hints": { + "index": 17693 + } + }, + { + "items": [ + 9377.5, + null + ], + "hints": { + "index": 17694 + } + }, + { + "items": [ + 9378, + null + ], + "hints": { + "index": 17695 + } + }, + { + "items": [ + 9378.5, + null + ], + "hints": { + "index": 17696 + } + }, + { + "items": [ + 9379, + null + ], + "hints": { + "index": 17697 + } + }, + { + "items": [ + 9379.5, + null + ], + "hints": { + "index": 17698 + } + }, + { + "items": [ + 9380, + null + ], + "hints": { + "index": 17699 + } + }, + { + "items": [ + 9380.5, + null + ], + "hints": { + "index": 17700 + } + }, + { + "items": [ + 9381, + null + ], + "hints": { + "index": 17701 + } + }, + { + "items": [ + 9381.5, + null + ], + "hints": { + "index": 17702 + } + }, + { + "items": [ + 9382, + null + ], + "hints": { + "index": 17703 + } + }, + { + "items": [ + 9382.5, + null + ], + "hints": { + "index": 17704 + } + }, + { + "items": [ + 9383, + null + ], + "hints": { + "index": 17705 + } + }, + { + "items": [ + 9383.5, + null + ], + "hints": { + "index": 17706 + } + }, + { + "items": [ + 9384, + null + ], + "hints": { + "index": 17707 + } + }, + { + "items": [ + 9384.5, + null + ], + "hints": { + "index": 17708 + } + }, + { + "items": [ + 9385, + null + ], + "hints": { + "index": 17709 + } + }, + { + "items": [ + 9385.5, + null + ], + "hints": { + "index": 17710 + } + }, + { + "items": [ + 9386, + null + ], + "hints": { + "index": 17711 + } + }, + { + "items": [ + 9386.5, + null + ], + "hints": { + "index": 17712 + } + }, + { + "items": [ + 9387, + null + ], + "hints": { + "index": 17713 + } + }, + { + "items": [ + 9387.5, + null + ], + "hints": { + "index": 17714 + } + }, + { + "items": [ + 9388, + null + ], + "hints": { + "index": 17715 + } + }, + { + "items": [ + 9388.5, + null + ], + "hints": { + "index": 17716 + } + }, + { + "items": [ + 9389, + null + ], + "hints": { + "index": 17717 + } + }, + { + "items": [ + 9389.5, + null + ], + "hints": { + "index": 17718 + } + }, + { + "items": [ + 9390, + null + ], + "hints": { + "index": 17719 + } + }, + { + "items": [ + 9390.5, + null + ], + "hints": { + "index": 17720 + } + }, + { + "items": [ + 9391, + null + ], + "hints": { + "index": 17721 + } + }, + { + "items": [ + 9391.5, + null + ], + "hints": { + "index": 17722 + } + }, + { + "items": [ + 9392, + null + ], + "hints": { + "index": 17723 + } + }, + { + "items": [ + 9392.5, + null + ], + "hints": { + "index": 17724 + } + }, + { + "items": [ + 9393, + null + ], + "hints": { + "index": 17725 + } + }, + { + "items": [ + 9393.5, + null + ], + "hints": { + "index": 17726 + } + }, + { + "items": [ + 9394, + null + ], + "hints": { + "index": 17727 + } + }, + { + "items": [ + 9394.5, + null + ], + "hints": { + "index": 17728 + } + }, + { + "items": [ + 9395, + null + ], + "hints": { + "index": 17729 + } + }, + { + "items": [ + 9395.5, + null + ], + "hints": { + "index": 17730 + } + }, + { + "items": [ + 9396, + null + ], + "hints": { + "index": 17731 + } + }, + { + "items": [ + 9396.5, + null + ], + "hints": { + "index": 17732 + } + }, + { + "items": [ + 9397, + null + ], + "hints": { + "index": 17733 + } + }, + { + "items": [ + 9397.5, + null + ], + "hints": { + "index": 17734 + } + }, + { + "items": [ + 9398, + null + ], + "hints": { + "index": 17735 + } + }, + { + "items": [ + 9398.5, + null + ], + "hints": { + "index": 17736 + } + }, + { + "items": [ + 9399, + null + ], + "hints": { + "index": 17737 + } + }, + { + "items": [ + 9399.5, + null + ], + "hints": { + "index": 17738 + } + }, + { + "items": [ + 9400, + null + ], + "hints": { + "index": 17739 + } + }, + { + "items": [ + 9400.5, + null + ], + "hints": { + "index": 17740 + } + }, + { + "items": [ + 9401, + null + ], + "hints": { + "index": 17741 + } + }, + { + "items": [ + 9401.5, + null + ], + "hints": { + "index": 17742 + } + }, + { + "items": [ + 9402, + null + ], + "hints": { + "index": 17743 + } + }, + { + "items": [ + 9402.5, + null + ], + "hints": { + "index": 17744 + } + }, + { + "items": [ + 9403, + null + ], + "hints": { + "index": 17745 + } + }, + { + "items": [ + 9403.5, + null + ], + "hints": { + "index": 17746 + } + }, + { + "items": [ + 9404, + null + ], + "hints": { + "index": 17747 + } + }, + { + "items": [ + 9404.5, + null + ], + "hints": { + "index": 17748 + } + }, + { + "items": [ + 9405, + null + ], + "hints": { + "index": 17749 + } + }, + { + "items": [ + 9405.5, + null + ], + "hints": { + "index": 17750 + } + }, + { + "items": [ + 9406, + null + ], + "hints": { + "index": 17751 + } + }, + { + "items": [ + 9406.5, + null + ], + "hints": { + "index": 17752 + } + }, + { + "items": [ + 9407, + null + ], + "hints": { + "index": 17753 + } + }, + { + "items": [ + 9407.5, + null + ], + "hints": { + "index": 17754 + } + }, + { + "items": [ + 9408, + null + ], + "hints": { + "index": 17755 + } + }, + { + "items": [ + 9408.5, + null + ], + "hints": { + "index": 17756 + } + }, + { + "items": [ + 9409, + null + ], + "hints": { + "index": 17757 + } + }, + { + "items": [ + 9409.5, + null + ], + "hints": { + "index": 17758 + } + }, + { + "items": [ + 9410, + null + ], + "hints": { + "index": 17759 + } + }, + { + "items": [ + 9410.5, + null + ], + "hints": { + "index": 17760 + } + }, + { + "items": [ + 9411, + null + ], + "hints": { + "index": 17761 + } + }, + { + "items": [ + 9411.5, + null + ], + "hints": { + "index": 17762 + } + }, + { + "items": [ + 9412, + null + ], + "hints": { + "index": 17763 + } + }, + { + "items": [ + 9412.5, + null + ], + "hints": { + "index": 17764 + } + }, + { + "items": [ + 9413, + null + ], + "hints": { + "index": 17765 + } + }, + { + "items": [ + 9413.5, + null + ], + "hints": { + "index": 17766 + } + }, + { + "items": [ + 9414, + null + ], + "hints": { + "index": 17767 + } + }, + { + "items": [ + 9414.5, + null + ], + "hints": { + "index": 17768 + } + }, + { + "items": [ + 9415, + null + ], + "hints": { + "index": 17769 + } + }, + { + "items": [ + 9415.5, + null + ], + "hints": { + "index": 17770 + } + }, + { + "items": [ + 9416, + null + ], + "hints": { + "index": 17771 + } + }, + { + "items": [ + 9416.5, + null + ], + "hints": { + "index": 17772 + } + }, + { + "items": [ + 9417, + null + ], + "hints": { + "index": 17773 + } + }, + { + "items": [ + 9417.5, + null + ], + "hints": { + "index": 17774 + } + }, + { + "items": [ + 9418, + null + ], + "hints": { + "index": 17775 + } + }, + { + "items": [ + 9418.5, + null + ], + "hints": { + "index": 17776 + } + }, + { + "items": [ + 9419, + null + ], + "hints": { + "index": 17777 + } + }, + { + "items": [ + 9419.5, + null + ], + "hints": { + "index": 17778 + } + }, + { + "items": [ + 9420, + null + ], + "hints": { + "index": 17779 + } + }, + { + "items": [ + 9420.5, + null + ], + "hints": { + "index": 17780 + } + }, + { + "items": [ + 9421, + null + ], + "hints": { + "index": 17781 + } + }, + { + "items": [ + 9421.5, + null + ], + "hints": { + "index": 17782 + } + }, + { + "items": [ + 9422, + null + ], + "hints": { + "index": 17783 + } + }, + { + "items": [ + 9422.5, + null + ], + "hints": { + "index": 17784 + } + }, + { + "items": [ + 9423, + null + ], + "hints": { + "index": 17785 + } + }, + { + "items": [ + 9423.5, + null + ], + "hints": { + "index": 17786 + } + }, + { + "items": [ + 9424, + null + ], + "hints": { + "index": 17787 + } + }, + { + "items": [ + 9424.5, + null + ], + "hints": { + "index": 17788 + } + }, + { + "items": [ + 9425, + null + ], + "hints": { + "index": 17789 + } + }, + { + "items": [ + 9425.5, + null + ], + "hints": { + "index": 17790 + } + }, + { + "items": [ + 9426, + null + ], + "hints": { + "index": 17791 + } + }, + { + "items": [ + 9426.5, + null + ], + "hints": { + "index": 17792 + } + }, + { + "items": [ + 9427, + null + ], + "hints": { + "index": 17793 + } + }, + { + "items": [ + 9427.5, + null + ], + "hints": { + "index": 17794 + } + }, + { + "items": [ + 9428, + null + ], + "hints": { + "index": 17795 + } + }, + { + "items": [ + 9428.5, + null + ], + "hints": { + "index": 17796 + } + }, + { + "items": [ + 9429, + null + ], + "hints": { + "index": 17797 + } + }, + { + "items": [ + 9429.5, + null + ], + "hints": { + "index": 17798 + } + }, + { + "items": [ + 9430, + null + ], + "hints": { + "index": 17799 + } + }, + { + "items": [ + 9430.5, + null + ], + "hints": { + "index": 17800 + } + }, + { + "items": [ + 9431, + null + ], + "hints": { + "index": 17801 + } + }, + { + "items": [ + 9431.5, + null + ], + "hints": { + "index": 17802 + } + }, + { + "items": [ + 9432, + null + ], + "hints": { + "index": 17803 + } + }, + { + "items": [ + 9432.5, + null + ], + "hints": { + "index": 17804 + } + }, + { + "items": [ + 9433, + null + ], + "hints": { + "index": 17805 + } + }, + { + "items": [ + 9433.5, + null + ], + "hints": { + "index": 17806 + } + }, + { + "items": [ + 9434, + null + ], + "hints": { + "index": 17807 + } + }, + { + "items": [ + 9434.5, + null + ], + "hints": { + "index": 17808 + } + }, + { + "items": [ + 9435, + null + ], + "hints": { + "index": 17809 + } + }, + { + "items": [ + 9435.5, + null + ], + "hints": { + "index": 17810 + } + }, + { + "items": [ + 9436, + null + ], + "hints": { + "index": 17811 + } + }, + { + "items": [ + 9436.5, + null + ], + "hints": { + "index": 17812 + } + }, + { + "items": [ + 9437, + null + ], + "hints": { + "index": 17813 + } + }, + { + "items": [ + 9437.5, + null + ], + "hints": { + "index": 17814 + } + }, + { + "items": [ + 9438, + null + ], + "hints": { + "index": 17815 + } + }, + { + "items": [ + 9438.5, + null + ], + "hints": { + "index": 17816 + } + }, + { + "items": [ + 9439, + null + ], + "hints": { + "index": 17817 + } + }, + { + "items": [ + 9439.5, + null + ], + "hints": { + "index": 17818 + } + }, + { + "items": [ + 9440, + null + ], + "hints": { + "index": 17819 + } + }, + { + "items": [ + 9440.5, + null + ], + "hints": { + "index": 17820 + } + }, + { + "items": [ + 9441, + null + ], + "hints": { + "index": 17821 + } + }, + { + "items": [ + 9441.5, + null + ], + "hints": { + "index": 17822 + } + }, + { + "items": [ + 9442, + null + ], + "hints": { + "index": 17823 + } + }, + { + "items": [ + 9442.5, + null + ], + "hints": { + "index": 17824 + } + }, + { + "items": [ + 9443, + null + ], + "hints": { + "index": 17825 + } + }, + { + "items": [ + 9443.5, + null + ], + "hints": { + "index": 17826 + } + }, + { + "items": [ + 9444, + null + ], + "hints": { + "index": 17827 + } + }, + { + "items": [ + 9444.5, + null + ], + "hints": { + "index": 17828 + } + }, + { + "items": [ + 9445, + null + ], + "hints": { + "index": 17829 + } + }, + { + "items": [ + 9445.5, + null + ], + "hints": { + "index": 17830 + } + }, + { + "items": [ + 9446, + null + ], + "hints": { + "index": 17831 + } + }, + { + "items": [ + 9446.5, + null + ], + "hints": { + "index": 17832 + } + }, + { + "items": [ + 9447, + null + ], + "hints": { + "index": 17833 + } + }, + { + "items": [ + 9447.5, + null + ], + "hints": { + "index": 17834 + } + }, + { + "items": [ + 9448, + null + ], + "hints": { + "index": 17835 + } + }, + { + "items": [ + 9448.5, + null + ], + "hints": { + "index": 17836 + } + }, + { + "items": [ + 9449, + null + ], + "hints": { + "index": 17837 + } + }, + { + "items": [ + 9449.5, + null + ], + "hints": { + "index": 17838 + } + }, + { + "items": [ + 9450, + null + ], + "hints": { + "index": 17839 + } + }, + { + "items": [ + 9450.5, + null + ], + "hints": { + "index": 17840 + } + }, + { + "items": [ + 9451, + null + ], + "hints": { + "index": 17841 + } + }, + { + "items": [ + 9451.5, + null + ], + "hints": { + "index": 17842 + } + }, + { + "items": [ + 9452, + null + ], + "hints": { + "index": 17843 + } + }, + { + "items": [ + 9452.5, + null + ], + "hints": { + "index": 17844 + } + }, + { + "items": [ + 9453, + null + ], + "hints": { + "index": 17845 + } + }, + { + "items": [ + 9453.5, + null + ], + "hints": { + "index": 17846 + } + }, + { + "items": [ + 9454, + null + ], + "hints": { + "index": 17847 + } + }, + { + "items": [ + 9454.5, + null + ], + "hints": { + "index": 17848 + } + }, + { + "items": [ + 9455, + null + ], + "hints": { + "index": 17849 + } + }, + { + "items": [ + 9455.5, + null + ], + "hints": { + "index": 17850 + } + }, + { + "items": [ + 9456, + null + ], + "hints": { + "index": 17851 + } + }, + { + "items": [ + 9456.5, + null + ], + "hints": { + "index": 17852 + } + }, + { + "items": [ + 9457, + null + ], + "hints": { + "index": 17853 + } + }, + { + "items": [ + 9457.5, + null + ], + "hints": { + "index": 17854 + } + }, + { + "items": [ + 9458, + null + ], + "hints": { + "index": 17855 + } + }, + { + "items": [ + 9458.5, + null + ], + "hints": { + "index": 17856 + } + }, + { + "items": [ + 9459, + null + ], + "hints": { + "index": 17857 + } + }, + { + "items": [ + 9459.5, + null + ], + "hints": { + "index": 17858 + } + }, + { + "items": [ + 9460, + null + ], + "hints": { + "index": 17859 + } + }, + { + "items": [ + 9460.5, + null + ], + "hints": { + "index": 17860 + } + }, + { + "items": [ + 9461, + null + ], + "hints": { + "index": 17861 + } + }, + { + "items": [ + 9461.5, + null + ], + "hints": { + "index": 17862 + } + }, + { + "items": [ + 9462, + null + ], + "hints": { + "index": 17863 + } + }, + { + "items": [ + 9462.5, + null + ], + "hints": { + "index": 17864 + } + }, + { + "items": [ + 9463, + null + ], + "hints": { + "index": 17865 + } + }, + { + "items": [ + 9463.5, + null + ], + "hints": { + "index": 17866 + } + }, + { + "items": [ + 9464, + null + ], + "hints": { + "index": 17867 + } + }, + { + "items": [ + 9464.5, + null + ], + "hints": { + "index": 17868 + } + }, + { + "items": [ + 9465, + null + ], + "hints": { + "index": 17869 + } + }, + { + "items": [ + 9465.5, + null + ], + "hints": { + "index": 17870 + } + }, + { + "items": [ + 9466, + null + ], + "hints": { + "index": 17871 + } + }, + { + "items": [ + 9466.5, + null + ], + "hints": { + "index": 17872 + } + }, + { + "items": [ + 9467, + null + ], + "hints": { + "index": 17873 + } + }, + { + "items": [ + 9467.5, + null + ], + "hints": { + "index": 17874 + } + }, + { + "items": [ + 9468, + null + ], + "hints": { + "index": 17875 + } + }, + { + "items": [ + 9468.5, + null + ], + "hints": { + "index": 17876 + } + }, + { + "items": [ + 9469, + null + ], + "hints": { + "index": 17877 + } + }, + { + "items": [ + 9469.5, + null + ], + "hints": { + "index": 17878 + } + }, + { + "items": [ + 9470, + null + ], + "hints": { + "index": 17879 + } + }, + { + "items": [ + 9470.5, + null + ], + "hints": { + "index": 17880 + } + }, + { + "items": [ + 9471, + null + ], + "hints": { + "index": 17881 + } + }, + { + "items": [ + 9471.5, + null + ], + "hints": { + "index": 17882 + } + }, + { + "items": [ + 9472, + null + ], + "hints": { + "index": 17883 + } + }, + { + "items": [ + 9472.5, + null + ], + "hints": { + "index": 17884 + } + }, + { + "items": [ + 9473, + null + ], + "hints": { + "index": 17885 + } + }, + { + "items": [ + 9473.5, + null + ], + "hints": { + "index": 17886 + } + }, + { + "items": [ + 9474, + null + ], + "hints": { + "index": 17887 + } + }, + { + "items": [ + 9474.5, + null + ], + "hints": { + "index": 17888 + } + }, + { + "items": [ + 9475, + null + ], + "hints": { + "index": 17889 + } + }, + { + "items": [ + 9475.5, + null + ], + "hints": { + "index": 17890 + } + }, + { + "items": [ + 9476, + null + ], + "hints": { + "index": 17891 + } + }, + { + "items": [ + 9476.5, + null + ], + "hints": { + "index": 17892 + } + }, + { + "items": [ + 9477, + null + ], + "hints": { + "index": 17893 + } + }, + { + "items": [ + 9477.5, + null + ], + "hints": { + "index": 17894 + } + }, + { + "items": [ + 9478, + null + ], + "hints": { + "index": 17895 + } + }, + { + "items": [ + 9478.5, + null + ], + "hints": { + "index": 17896 + } + }, + { + "items": [ + 9479, + null + ], + "hints": { + "index": 17897 + } + }, + { + "items": [ + 9479.5, + null + ], + "hints": { + "index": 17898 + } + }, + { + "items": [ + 9480, + null + ], + "hints": { + "index": 17899 + } + }, + { + "items": [ + 9480.5, + null + ], + "hints": { + "index": 17900 + } + }, + { + "items": [ + 9481, + null + ], + "hints": { + "index": 17901 + } + }, + { + "items": [ + 9481.5, + null + ], + "hints": { + "index": 17902 + } + }, + { + "items": [ + 9482, + null + ], + "hints": { + "index": 17903 + } + }, + { + "items": [ + 9482.5, + null + ], + "hints": { + "index": 17904 + } + }, + { + "items": [ + 9483, + null + ], + "hints": { + "index": 17905 + } + }, + { + "items": [ + 9483.5, + null + ], + "hints": { + "index": 17906 + } + }, + { + "items": [ + 9484, + null + ], + "hints": { + "index": 17907 + } + }, + { + "items": [ + 9484.5, + null + ], + "hints": { + "index": 17908 + } + }, + { + "items": [ + 9485, + null + ], + "hints": { + "index": 17909 + } + }, + { + "items": [ + 9485.5, + null + ], + "hints": { + "index": 17910 + } + }, + { + "items": [ + 9486, + null + ], + "hints": { + "index": 17911 + } + }, + { + "items": [ + 9486.5, + null + ], + "hints": { + "index": 17912 + } + }, + { + "items": [ + 9487, + null + ], + "hints": { + "index": 17913 + } + }, + { + "items": [ + 9487.5, + null + ], + "hints": { + "index": 17914 + } + }, + { + "items": [ + 9488, + null + ], + "hints": { + "index": 17915 + } + }, + { + "items": [ + 9488.5, + null + ], + "hints": { + "index": 17916 + } + }, + { + "items": [ + 9489, + null + ], + "hints": { + "index": 17917 + } + }, + { + "items": [ + 9489.5, + null + ], + "hints": { + "index": 17918 + } + }, + { + "items": [ + 9490, + null + ], + "hints": { + "index": 17919 + } + }, + { + "items": [ + 9490.5, + null + ], + "hints": { + "index": 17920 + } + }, + { + "items": [ + 9491, + null + ], + "hints": { + "index": 17921 + } + }, + { + "items": [ + 9491.5, + null + ], + "hints": { + "index": 17922 + } + }, + { + "items": [ + 9492, + null + ], + "hints": { + "index": 17923 + } + }, + { + "items": [ + 9492.5, + null + ], + "hints": { + "index": 17924 + } + }, + { + "items": [ + 9493, + null + ], + "hints": { + "index": 17925 + } + }, + { + "items": [ + 9493.5, + null + ], + "hints": { + "index": 17926 + } + }, + { + "items": [ + 9494, + null + ], + "hints": { + "index": 17927 + } + }, + { + "items": [ + 9494.5, + null + ], + "hints": { + "index": 17928 + } + }, + { + "items": [ + 9495, + null + ], + "hints": { + "index": 17929 + } + }, + { + "items": [ + 9495.5, + null + ], + "hints": { + "index": 17930 + } + }, + { + "items": [ + 9496, + null + ], + "hints": { + "index": 17931 + } + }, + { + "items": [ + 9496.5, + null + ], + "hints": { + "index": 17932 + } + }, + { + "items": [ + 9497, + null + ], + "hints": { + "index": 17933 + } + }, + { + "items": [ + 9497.5, + null + ], + "hints": { + "index": 17934 + } + }, + { + "items": [ + 9498, + null + ], + "hints": { + "index": 17935 + } + }, + { + "items": [ + 9498.5, + null + ], + "hints": { + "index": 17936 + } + }, + { + "items": [ + 9499, + null + ], + "hints": { + "index": 17937 + } + }, + { + "items": [ + 9499.5, + null + ], + "hints": { + "index": 17938 + } + }, + { + "items": [ + 9500, + null + ], + "hints": { + "index": 17939 + } + }, + { + "items": [ + 9500.5, + null + ], + "hints": { + "index": 17940 + } + }, + { + "items": [ + 9501, + null + ], + "hints": { + "index": 17941 + } + }, + { + "items": [ + 9501.5, + null + ], + "hints": { + "index": 17942 + } + }, + { + "items": [ + 9502, + null + ], + "hints": { + "index": 17943 + } + }, + { + "items": [ + 9502.5, + null + ], + "hints": { + "index": 17944 + } + }, + { + "items": [ + 9503, + null + ], + "hints": { + "index": 17945 + } + }, + { + "items": [ + 9503.5, + null + ], + "hints": { + "index": 17946 + } + }, + { + "items": [ + 9504, + null + ], + "hints": { + "index": 17947 + } + }, + { + "items": [ + 9504.5, + null + ], + "hints": { + "index": 17948 + } + }, + { + "items": [ + 9505, + null + ], + "hints": { + "index": 17949 + } + }, + { + "items": [ + 9505.5, + null + ], + "hints": { + "index": 17950 + } + }, + { + "items": [ + 9506, + null + ], + "hints": { + "index": 17951 + } + }, + { + "items": [ + 9506.5, + null + ], + "hints": { + "index": 17952 + } + }, + { + "items": [ + 9507, + null + ], + "hints": { + "index": 17953 + } + }, + { + "items": [ + 9507.5, + null + ], + "hints": { + "index": 17954 + } + }, + { + "items": [ + 9508, + null + ], + "hints": { + "index": 17955 + } + }, + { + "items": [ + 9508.5, + null + ], + "hints": { + "index": 17956 + } + }, + { + "items": [ + 9509, + null + ], + "hints": { + "index": 17957 + } + }, + { + "items": [ + 9509.5, + null + ], + "hints": { + "index": 17958 + } + }, + { + "items": [ + 9510, + null + ], + "hints": { + "index": 17959 + } + }, + { + "items": [ + 9510.5, + null + ], + "hints": { + "index": 17960 + } + }, + { + "items": [ + 9511, + null + ], + "hints": { + "index": 17961 + } + }, + { + "items": [ + 9511.5, + null + ], + "hints": { + "index": 17962 + } + }, + { + "items": [ + 9512, + null + ], + "hints": { + "index": 17963 + } + }, + { + "items": [ + 9512.5, + null + ], + "hints": { + "index": 17964 + } + }, + { + "items": [ + 9513, + null + ], + "hints": { + "index": 17965 + } + }, + { + "items": [ + 9513.5, + null + ], + "hints": { + "index": 17966 + } + }, + { + "items": [ + 9514, + null + ], + "hints": { + "index": 17967 + } + }, + { + "items": [ + 9514.5, + null + ], + "hints": { + "index": 17968 + } + }, + { + "items": [ + 9515, + null + ], + "hints": { + "index": 17969 + } + }, + { + "items": [ + 9515.5, + null + ], + "hints": { + "index": 17970 + } + }, + { + "items": [ + 9516, + null + ], + "hints": { + "index": 17971 + } + }, + { + "items": [ + 9516.5, + null + ], + "hints": { + "index": 17972 + } + }, + { + "items": [ + 9517, + null + ], + "hints": { + "index": 17973 + } + }, + { + "items": [ + 9517.5, + null + ], + "hints": { + "index": 17974 + } + }, + { + "items": [ + 9518, + null + ], + "hints": { + "index": 17975 + } + }, + { + "items": [ + 9518.5, + null + ], + "hints": { + "index": 17976 + } + }, + { + "items": [ + 9519, + null + ], + "hints": { + "index": 17977 + } + }, + { + "items": [ + 9519.5, + null + ], + "hints": { + "index": 17978 + } + }, + { + "items": [ + 9520, + null + ], + "hints": { + "index": 17979 + } + }, + { + "items": [ + 9520.5, + null + ], + "hints": { + "index": 17980 + } + }, + { + "items": [ + 9521, + null + ], + "hints": { + "index": 17981 + } + }, + { + "items": [ + 9521.5, + null + ], + "hints": { + "index": 17982 + } + }, + { + "items": [ + 9522, + null + ], + "hints": { + "index": 17983 + } + }, + { + "items": [ + 9522.5, + null + ], + "hints": { + "index": 17984 + } + }, + { + "items": [ + 9523, + null + ], + "hints": { + "index": 17985 + } + }, + { + "items": [ + 9523.5, + null + ], + "hints": { + "index": 17986 + } + }, + { + "items": [ + 9524, + null + ], + "hints": { + "index": 17987 + } + }, + { + "items": [ + 9524.5, + null + ], + "hints": { + "index": 17988 + } + }, + { + "items": [ + 9525, + null + ], + "hints": { + "index": 17989 + } + }, + { + "items": [ + 9525.5, + null + ], + "hints": { + "index": 17990 + } + }, + { + "items": [ + 9526, + null + ], + "hints": { + "index": 17991 + } + }, + { + "items": [ + 9526.5, + null + ], + "hints": { + "index": 17992 + } + }, + { + "items": [ + 9527, + null + ], + "hints": { + "index": 17993 + } + }, + { + "items": [ + 9527.5, + null + ], + "hints": { + "index": 17994 + } + }, + { + "items": [ + 9528, + null + ], + "hints": { + "index": 17995 + } + }, + { + "items": [ + 9528.5, + null + ], + "hints": { + "index": 17996 + } + }, + { + "items": [ + 9529, + null + ], + "hints": { + "index": 17997 + } + }, + { + "items": [ + 9529.5, + null + ], + "hints": { + "index": 17998 + } + }, + { + "items": [ + 9530, + null + ], + "hints": { + "index": 17999 + } + }, + { + "items": [ + 9530.5, + null + ], + "hints": { + "index": 18000 + } + }, + { + "items": [ + 9531, + null + ], + "hints": { + "index": 18001 + } + }, + { + "items": [ + 9531.5, + null + ], + "hints": { + "index": 18002 + } + }, + { + "items": [ + 9532, + null + ], + "hints": { + "index": 18003 + } + }, + { + "items": [ + 9532.5, + null + ], + "hints": { + "index": 18004 + } + }, + { + "items": [ + 9533, + null + ], + "hints": { + "index": 18005 + } + }, + { + "items": [ + 9533.5, + null + ], + "hints": { + "index": 18006 + } + }, + { + "items": [ + 9534, + null + ], + "hints": { + "index": 18007 + } + }, + { + "items": [ + 9534.5, + null + ], + "hints": { + "index": 18008 + } + }, + { + "items": [ + 9535, + null + ], + "hints": { + "index": 18009 + } + }, + { + "items": [ + 9535.5, + null + ], + "hints": { + "index": 18010 + } + }, + { + "items": [ + 9536, + null + ], + "hints": { + "index": 18011 + } + }, + { + "items": [ + 9536.5, + null + ], + "hints": { + "index": 18012 + } + }, + { + "items": [ + 9537, + null + ], + "hints": { + "index": 18013 + } + }, + { + "items": [ + 9537.5, + null + ], + "hints": { + "index": 18014 + } + }, + { + "items": [ + 9538, + null + ], + "hints": { + "index": 18015 + } + }, + { + "items": [ + 9538.5, + null + ], + "hints": { + "index": 18016 + } + }, + { + "items": [ + 9539, + null + ], + "hints": { + "index": 18017 + } + }, + { + "items": [ + 9539.5, + null + ], + "hints": { + "index": 18018 + } + }, + { + "items": [ + 9540, + null + ], + "hints": { + "index": 18019 + } + }, + { + "items": [ + 9540.5, + null + ], + "hints": { + "index": 18020 + } + }, + { + "items": [ + 9541, + null + ], + "hints": { + "index": 18021 + } + }, + { + "items": [ + 9541.5, + null + ], + "hints": { + "index": 18022 + } + }, + { + "items": [ + 9542, + null + ], + "hints": { + "index": 18023 + } + }, + { + "items": [ + 9542.5, + null + ], + "hints": { + "index": 18024 + } + }, + { + "items": [ + 9543, + null + ], + "hints": { + "index": 18025 + } + }, + { + "items": [ + 9543.5, + null + ], + "hints": { + "index": 18026 + } + }, + { + "items": [ + 9544, + null + ], + "hints": { + "index": 18027 + } + }, + { + "items": [ + 9544.5, + null + ], + "hints": { + "index": 18028 + } + }, + { + "items": [ + 9545, + null + ], + "hints": { + "index": 18029 + } + }, + { + "items": [ + 9545.5, + null + ], + "hints": { + "index": 18030 + } + }, + { + "items": [ + 9546, + null + ], + "hints": { + "index": 18031 + } + }, + { + "items": [ + 9546.5, + null + ], + "hints": { + "index": 18032 + } + }, + { + "items": [ + 9547, + null + ], + "hints": { + "index": 18033 + } + }, + { + "items": [ + 9547.5, + null + ], + "hints": { + "index": 18034 + } + }, + { + "items": [ + 9548, + null + ], + "hints": { + "index": 18035 + } + }, + { + "items": [ + 9548.5, + null + ], + "hints": { + "index": 18036 + } + }, + { + "items": [ + 9549, + null + ], + "hints": { + "index": 18037 + } + }, + { + "items": [ + 9549.5, + null + ], + "hints": { + "index": 18038 + } + }, + { + "items": [ + 9550, + null + ], + "hints": { + "index": 18039 + } + }, + { + "items": [ + 9550.5, + null + ], + "hints": { + "index": 18040 + } + }, + { + "items": [ + 9551, + null + ], + "hints": { + "index": 18041 + } + }, + { + "items": [ + 9551.5, + null + ], + "hints": { + "index": 18042 + } + }, + { + "items": [ + 9552, + null + ], + "hints": { + "index": 18043 + } + }, + { + "items": [ + 9552.5, + null + ], + "hints": { + "index": 18044 + } + }, + { + "items": [ + 9553, + null + ], + "hints": { + "index": 18045 + } + }, + { + "items": [ + 9553.5, + null + ], + "hints": { + "index": 18046 + } + }, + { + "items": [ + 9554, + null + ], + "hints": { + "index": 18047 + } + }, + { + "items": [ + 9554.5, + null + ], + "hints": { + "index": 18048 + } + }, + { + "items": [ + 9555, + null + ], + "hints": { + "index": 18049 + } + }, + { + "items": [ + 9555.5, + null + ], + "hints": { + "index": 18050 + } + }, + { + "items": [ + 9556, + null + ], + "hints": { + "index": 18051 + } + }, + { + "items": [ + 9556.5, + null + ], + "hints": { + "index": 18052 + } + }, + { + "items": [ + 9557, + null + ], + "hints": { + "index": 18053 + } + }, + { + "items": [ + 9557.5, + null + ], + "hints": { + "index": 18054 + } + }, + { + "items": [ + 9558, + null + ], + "hints": { + "index": 18055 + } + }, + { + "items": [ + 9558.5, + null + ], + "hints": { + "index": 18056 + } + }, + { + "items": [ + 9559, + null + ], + "hints": { + "index": 18057 + } + }, + { + "items": [ + 9559.5, + null + ], + "hints": { + "index": 18058 + } + }, + { + "items": [ + 9560, + null + ], + "hints": { + "index": 18059 + } + }, + { + "items": [ + 9560.5, + null + ], + "hints": { + "index": 18060 + } + }, + { + "items": [ + 9561, + null + ], + "hints": { + "index": 18061 + } + }, + { + "items": [ + 9561.5, + null + ], + "hints": { + "index": 18062 + } + }, + { + "items": [ + 9562, + null + ], + "hints": { + "index": 18063 + } + }, + { + "items": [ + 9562.5, + null + ], + "hints": { + "index": 18064 + } + }, + { + "items": [ + 9563, + null + ], + "hints": { + "index": 18065 + } + }, + { + "items": [ + 9563.5, + null + ], + "hints": { + "index": 18066 + } + }, + { + "items": [ + 9564, + null + ], + "hints": { + "index": 18067 + } + }, + { + "items": [ + 9564.5, + null + ], + "hints": { + "index": 18068 + } + }, + { + "items": [ + 9565, + null + ], + "hints": { + "index": 18069 + } + }, + { + "items": [ + 9565.5, + null + ], + "hints": { + "index": 18070 + } + }, + { + "items": [ + 9566, + null + ], + "hints": { + "index": 18071 + } + }, + { + "items": [ + 9566.5, + null + ], + "hints": { + "index": 18072 + } + }, + { + "items": [ + 9567, + null + ], + "hints": { + "index": 18073 + } + }, + { + "items": [ + 9567.5, + null + ], + "hints": { + "index": 18074 + } + }, + { + "items": [ + 9568, + null + ], + "hints": { + "index": 18075 + } + }, + { + "items": [ + 9568.5, + null + ], + "hints": { + "index": 18076 + } + }, + { + "items": [ + 9569, + null + ], + "hints": { + "index": 18077 + } + }, + { + "items": [ + 9569.5, + null + ], + "hints": { + "index": 18078 + } + }, + { + "items": [ + 9570, + null + ], + "hints": { + "index": 18079 + } + }, + { + "items": [ + 9570.5, + null + ], + "hints": { + "index": 18080 + } + }, + { + "items": [ + 9571, + null + ], + "hints": { + "index": 18081 + } + }, + { + "items": [ + 9571.5, + null + ], + "hints": { + "index": 18082 + } + }, + { + "items": [ + 9572, + null + ], + "hints": { + "index": 18083 + } + }, + { + "items": [ + 9572.5, + null + ], + "hints": { + "index": 18084 + } + }, + { + "items": [ + 9573, + null + ], + "hints": { + "index": 18085 + } + }, + { + "items": [ + 9573.5, + null + ], + "hints": { + "index": 18086 + } + }, + { + "items": [ + 9574, + null + ], + "hints": { + "index": 18087 + } + }, + { + "items": [ + 9574.5, + null + ], + "hints": { + "index": 18088 + } + }, + { + "items": [ + 9575, + null + ], + "hints": { + "index": 18089 + } + }, + { + "items": [ + 9575.5, + null + ], + "hints": { + "index": 18090 + } + }, + { + "items": [ + 9576, + null + ], + "hints": { + "index": 18091 + } + }, + { + "items": [ + 9576.5, + null + ], + "hints": { + "index": 18092 + } + }, + { + "items": [ + 9577, + null + ], + "hints": { + "index": 18093 + } + }, + { + "items": [ + 9577.5, + null + ], + "hints": { + "index": 18094 + } + }, + { + "items": [ + 9578, + null + ], + "hints": { + "index": 18095 + } + }, + { + "items": [ + 9578.5, + null + ], + "hints": { + "index": 18096 + } + }, + { + "items": [ + 9579, + null + ], + "hints": { + "index": 18097 + } + }, + { + "items": [ + 9579.5, + null + ], + "hints": { + "index": 18098 + } + }, + { + "items": [ + 9580, + null + ], + "hints": { + "index": 18099 + } + }, + { + "items": [ + 9580.5, + null + ], + "hints": { + "index": 18100 + } + }, + { + "items": [ + 9581, + null + ], + "hints": { + "index": 18101 + } + }, + { + "items": [ + 9581.5, + null + ], + "hints": { + "index": 18102 + } + }, + { + "items": [ + 9582, + null + ], + "hints": { + "index": 18103 + } + }, + { + "items": [ + 9582.5, + null + ], + "hints": { + "index": 18104 + } + }, + { + "items": [ + 9583, + null + ], + "hints": { + "index": 18105 + } + }, + { + "items": [ + 9583.5, + null + ], + "hints": { + "index": 18106 + } + }, + { + "items": [ + 9584, + null + ], + "hints": { + "index": 18107 + } + }, + { + "items": [ + 9584.5, + null + ], + "hints": { + "index": 18108 + } + }, + { + "items": [ + 9585, + null + ], + "hints": { + "index": 18109 + } + }, + { + "items": [ + 9585.5, + null + ], + "hints": { + "index": 18110 + } + }, + { + "items": [ + 9586, + null + ], + "hints": { + "index": 18111 + } + }, + { + "items": [ + 9586.5, + null + ], + "hints": { + "index": 18112 + } + }, + { + "items": [ + 9587, + null + ], + "hints": { + "index": 18113 + } + }, + { + "items": [ + 9587.5, + null + ], + "hints": { + "index": 18114 + } + }, + { + "items": [ + 9588, + null + ], + "hints": { + "index": 18115 + } + }, + { + "items": [ + 9588.5, + null + ], + "hints": { + "index": 18116 + } + }, + { + "items": [ + 9589, + null + ], + "hints": { + "index": 18117 + } + }, + { + "items": [ + 9589.5, + null + ], + "hints": { + "index": 18118 + } + }, + { + "items": [ + 9590, + null + ], + "hints": { + "index": 18119 + } + }, + { + "items": [ + 9590.5, + null + ], + "hints": { + "index": 18120 + } + }, + { + "items": [ + 9591, + null + ], + "hints": { + "index": 18121 + } + }, + { + "items": [ + 9591.5, + null + ], + "hints": { + "index": 18122 + } + }, + { + "items": [ + 9592, + null + ], + "hints": { + "index": 18123 + } + }, + { + "items": [ + 9592.5, + null + ], + "hints": { + "index": 18124 + } + }, + { + "items": [ + 9593, + null + ], + "hints": { + "index": 18125 + } + }, + { + "items": [ + 9593.5, + null + ], + "hints": { + "index": 18126 + } + }, + { + "items": [ + 9594, + null + ], + "hints": { + "index": 18127 + } + }, + { + "items": [ + 9594.5, + null + ], + "hints": { + "index": 18128 + } + }, + { + "items": [ + 9595, + null + ], + "hints": { + "index": 18129 + } + }, + { + "items": [ + 9595.5, + null + ], + "hints": { + "index": 18130 + } + }, + { + "items": [ + 9596, + null + ], + "hints": { + "index": 18131 + } + }, + { + "items": [ + 9596.5, + null + ], + "hints": { + "index": 18132 + } + }, + { + "items": [ + 9597, + null + ], + "hints": { + "index": 18133 + } + }, + { + "items": [ + 9597.5, + null + ], + "hints": { + "index": 18134 + } + }, + { + "items": [ + 9598, + null + ], + "hints": { + "index": 18135 + } + }, + { + "items": [ + 9598.5, + null + ], + "hints": { + "index": 18136 + } + }, + { + "items": [ + 9599, + null + ], + "hints": { + "index": 18137 + } + }, + { + "items": [ + 9599.5, + null + ], + "hints": { + "index": 18138 + } + }, + { + "items": [ + 9600, + null + ], + "hints": { + "index": 18139 + } + }, + { + "items": [ + 9600.5, + null + ], + "hints": { + "index": 18140 + } + }, + { + "items": [ + 9601, + null + ], + "hints": { + "index": 18141 + } + }, + { + "items": [ + 9601.5, + null + ], + "hints": { + "index": 18142 + } + }, + { + "items": [ + 9602, + null + ], + "hints": { + "index": 18143 + } + }, + { + "items": [ + 9602.5, + null + ], + "hints": { + "index": 18144 + } + }, + { + "items": [ + 9603, + null + ], + "hints": { + "index": 18145 + } + }, + { + "items": [ + 9603.5, + null + ], + "hints": { + "index": 18146 + } + }, + { + "items": [ + 9604, + null + ], + "hints": { + "index": 18147 + } + }, + { + "items": [ + 9604.5, + null + ], + "hints": { + "index": 18148 + } + }, + { + "items": [ + 9605, + null + ], + "hints": { + "index": 18149 + } + }, + { + "items": [ + 9605.5, + null + ], + "hints": { + "index": 18150 + } + }, + { + "items": [ + 9606, + null + ], + "hints": { + "index": 18151 + } + }, + { + "items": [ + 9606.5, + null + ], + "hints": { + "index": 18152 + } + }, + { + "items": [ + 9607, + null + ], + "hints": { + "index": 18153 + } + }, + { + "items": [ + 9607.5, + null + ], + "hints": { + "index": 18154 + } + }, + { + "items": [ + 9608, + null + ], + "hints": { + "index": 18155 + } + }, + { + "items": [ + 9608.5, + null + ], + "hints": { + "index": 18156 + } + }, + { + "items": [ + 9609, + null + ], + "hints": { + "index": 18157 + } + }, + { + "items": [ + 9609.5, + null + ], + "hints": { + "index": 18158 + } + }, + { + "items": [ + 9610, + null + ], + "hints": { + "index": 18159 + } + }, + { + "items": [ + 9610.5, + null + ], + "hints": { + "index": 18160 + } + }, + { + "items": [ + 9611, + null + ], + "hints": { + "index": 18161 + } + }, + { + "items": [ + 9611.5, + null + ], + "hints": { + "index": 18162 + } + }, + { + "items": [ + 9612, + null + ], + "hints": { + "index": 18163 + } + }, + { + "items": [ + 9612.5, + null + ], + "hints": { + "index": 18164 + } + }, + { + "items": [ + 9613, + null + ], + "hints": { + "index": 18165 + } + }, + { + "items": [ + 9613.5, + null + ], + "hints": { + "index": 18166 + } + }, + { + "items": [ + 9614, + null + ], + "hints": { + "index": 18167 + } + }, + { + "items": [ + 9614.5, + null + ], + "hints": { + "index": 18168 + } + }, + { + "items": [ + 9615, + null + ], + "hints": { + "index": 18169 + } + }, + { + "items": [ + 9615.5, + null + ], + "hints": { + "index": 18170 + } + }, + { + "items": [ + 9616, + null + ], + "hints": { + "index": 18171 + } + }, + { + "items": [ + 9616.5, + null + ], + "hints": { + "index": 18172 + } + }, + { + "items": [ + 9617, + null + ], + "hints": { + "index": 18173 + } + }, + { + "items": [ + 9617.5, + null + ], + "hints": { + "index": 18174 + } + }, + { + "items": [ + 9618, + null + ], + "hints": { + "index": 18175 + } + }, + { + "items": [ + 9618.5, + null + ], + "hints": { + "index": 18176 + } + }, + { + "items": [ + 9619, + null + ], + "hints": { + "index": 18177 + } + }, + { + "items": [ + 9619.5, + null + ], + "hints": { + "index": 18178 + } + }, + { + "items": [ + 9620, + null + ], + "hints": { + "index": 18179 + } + }, + { + "items": [ + 9620.5, + null + ], + "hints": { + "index": 18180 + } + }, + { + "items": [ + 9621, + null + ], + "hints": { + "index": 18181 + } + }, + { + "items": [ + 9621.5, + null + ], + "hints": { + "index": 18182 + } + }, + { + "items": [ + 9622, + null + ], + "hints": { + "index": 18183 + } + }, + { + "items": [ + 9622.5, + null + ], + "hints": { + "index": 18184 + } + }, + { + "items": [ + 9623, + null + ], + "hints": { + "index": 18185 + } + }, + { + "items": [ + 9623.5, + null + ], + "hints": { + "index": 18186 + } + }, + { + "items": [ + 9624, + null + ], + "hints": { + "index": 18187 + } + }, + { + "items": [ + 9624.5, + null + ], + "hints": { + "index": 18188 + } + }, + { + "items": [ + 9625, + null + ], + "hints": { + "index": 18189 + } + }, + { + "items": [ + 9625.5, + null + ], + "hints": { + "index": 18190 + } + }, + { + "items": [ + 9626, + null + ], + "hints": { + "index": 18191 + } + }, + { + "items": [ + 9626.5, + null + ], + "hints": { + "index": 18192 + } + }, + { + "items": [ + 9627, + null + ], + "hints": { + "index": 18193 + } + }, + { + "items": [ + 9627.5, + null + ], + "hints": { + "index": 18194 + } + }, + { + "items": [ + 9628, + null + ], + "hints": { + "index": 18195 + } + }, + { + "items": [ + 9628.5, + null + ], + "hints": { + "index": 18196 + } + }, + { + "items": [ + 9629, + null + ], + "hints": { + "index": 18197 + } + }, + { + "items": [ + 9629.5, + null + ], + "hints": { + "index": 18198 + } + }, + { + "items": [ + 9630, + null + ], + "hints": { + "index": 18199 + } + }, + { + "items": [ + 9630.5, + null + ], + "hints": { + "index": 18200 + } + }, + { + "items": [ + 9631, + null + ], + "hints": { + "index": 18201 + } + }, + { + "items": [ + 9631.5, + null + ], + "hints": { + "index": 18202 + } + }, + { + "items": [ + 9632, + null + ], + "hints": { + "index": 18203 + } + }, + { + "items": [ + 9632.5, + null + ], + "hints": { + "index": 18204 + } + }, + { + "items": [ + 9633, + null + ], + "hints": { + "index": 18205 + } + }, + { + "items": [ + 9633.5, + null + ], + "hints": { + "index": 18206 + } + }, + { + "items": [ + 9634, + null + ], + "hints": { + "index": 18207 + } + }, + { + "items": [ + 9634.5, + null + ], + "hints": { + "index": 18208 + } + }, + { + "items": [ + 9635, + null + ], + "hints": { + "index": 18209 + } + }, + { + "items": [ + 9635.5, + null + ], + "hints": { + "index": 18210 + } + }, + { + "items": [ + 9636, + null + ], + "hints": { + "index": 18211 + } + }, + { + "items": [ + 9636.5, + null + ], + "hints": { + "index": 18212 + } + }, + { + "items": [ + 9637, + null + ], + "hints": { + "index": 18213 + } + }, + { + "items": [ + 9637.5, + null + ], + "hints": { + "index": 18214 + } + }, + { + "items": [ + 9638, + null + ], + "hints": { + "index": 18215 + } + }, + { + "items": [ + 9638.5, + null + ], + "hints": { + "index": 18216 + } + }, + { + "items": [ + 9639, + null + ], + "hints": { + "index": 18217 + } + }, + { + "items": [ + 9639.5, + null + ], + "hints": { + "index": 18218 + } + }, + { + "items": [ + 9640, + null + ], + "hints": { + "index": 18219 + } + }, + { + "items": [ + 9640.5, + null + ], + "hints": { + "index": 18220 + } + }, + { + "items": [ + 9641, + null + ], + "hints": { + "index": 18221 + } + }, + { + "items": [ + 9641.5, + null + ], + "hints": { + "index": 18222 + } + }, + { + "items": [ + 9642, + null + ], + "hints": { + "index": 18223 + } + }, + { + "items": [ + 9642.5, + null + ], + "hints": { + "index": 18224 + } + }, + { + "items": [ + 9643, + null + ], + "hints": { + "index": 18225 + } + }, + { + "items": [ + 9643.5, + null + ], + "hints": { + "index": 18226 + } + }, + { + "items": [ + 9644, + null + ], + "hints": { + "index": 18227 + } + }, + { + "items": [ + 9644.5, + null + ], + "hints": { + "index": 18228 + } + }, + { + "items": [ + 9645, + null + ], + "hints": { + "index": 18229 + } + }, + { + "items": [ + 9645.5, + null + ], + "hints": { + "index": 18230 + } + }, + { + "items": [ + 9646, + null + ], + "hints": { + "index": 18231 + } + }, + { + "items": [ + 9646.5, + null + ], + "hints": { + "index": 18232 + } + }, + { + "items": [ + 9647, + null + ], + "hints": { + "index": 18233 + } + }, + { + "items": [ + 9647.5, + null + ], + "hints": { + "index": 18234 + } + }, + { + "items": [ + 9648, + null + ], + "hints": { + "index": 18235 + } + }, + { + "items": [ + 9648.5, + null + ], + "hints": { + "index": 18236 + } + }, + { + "items": [ + 9649, + null + ], + "hints": { + "index": 18237 + } + }, + { + "items": [ + 9649.5, + null + ], + "hints": { + "index": 18238 + } + }, + { + "items": [ + 9650, + null + ], + "hints": { + "index": 18239 + } + }, + { + "items": [ + 9650.5, + null + ], + "hints": { + "index": 18240 + } + }, + { + "items": [ + 9651, + null + ], + "hints": { + "index": 18241 + } + }, + { + "items": [ + 9651.5, + null + ], + "hints": { + "index": 18242 + } + }, + { + "items": [ + 9652, + null + ], + "hints": { + "index": 18243 + } + }, + { + "items": [ + 9652.5, + null + ], + "hints": { + "index": 18244 + } + }, + { + "items": [ + 9653, + null + ], + "hints": { + "index": 18245 + } + }, + { + "items": [ + 9653.5, + null + ], + "hints": { + "index": 18246 + } + }, + { + "items": [ + 9654, + null + ], + "hints": { + "index": 18247 + } + }, + { + "items": [ + 9654.5, + null + ], + "hints": { + "index": 18248 + } + }, + { + "items": [ + 9655, + null + ], + "hints": { + "index": 18249 + } + }, + { + "items": [ + 9655.5, + null + ], + "hints": { + "index": 18250 + } + }, + { + "items": [ + 9656, + null + ], + "hints": { + "index": 18251 + } + }, + { + "items": [ + 9656.5, + null + ], + "hints": { + "index": 18252 + } + }, + { + "items": [ + 9657, + null + ], + "hints": { + "index": 18253 + } + }, + { + "items": [ + 9657.5, + null + ], + "hints": { + "index": 18254 + } + }, + { + "items": [ + 9658, + null + ], + "hints": { + "index": 18255 + } + }, + { + "items": [ + 9658.5, + null + ], + "hints": { + "index": 18256 + } + }, + { + "items": [ + 9659, + null + ], + "hints": { + "index": 18257 + } + }, + { + "items": [ + 9659.5, + null + ], + "hints": { + "index": 18258 + } + }, + { + "items": [ + 9660, + null + ], + "hints": { + "index": 18259 + } + }, + { + "items": [ + 9660.5, + null + ], + "hints": { + "index": 18260 + } + }, + { + "items": [ + 9661, + null + ], + "hints": { + "index": 18261 + } + }, + { + "items": [ + 9661.5, + null + ], + "hints": { + "index": 18262 + } + }, + { + "items": [ + 9662, + null + ], + "hints": { + "index": 18263 + } + }, + { + "items": [ + 9662.5, + null + ], + "hints": { + "index": 18264 + } + }, + { + "items": [ + 9663, + null + ], + "hints": { + "index": 18265 + } + }, + { + "items": [ + 9663.5, + null + ], + "hints": { + "index": 18266 + } + }, + { + "items": [ + 9664, + null + ], + "hints": { + "index": 18267 + } + }, + { + "items": [ + 9664.5, + null + ], + "hints": { + "index": 18268 + } + }, + { + "items": [ + 9665, + null + ], + "hints": { + "index": 18269 + } + }, + { + "items": [ + 9665.5, + null + ], + "hints": { + "index": 18270 + } + }, + { + "items": [ + 9666, + null + ], + "hints": { + "index": 18271 + } + }, + { + "items": [ + 9666.5, + null + ], + "hints": { + "index": 18272 + } + }, + { + "items": [ + 9667, + null + ], + "hints": { + "index": 18273 + } + }, + { + "items": [ + 9667.5, + null + ], + "hints": { + "index": 18274 + } + }, + { + "items": [ + 9668, + null + ], + "hints": { + "index": 18275 + } + }, + { + "items": [ + 9668.5, + null + ], + "hints": { + "index": 18276 + } + }, + { + "items": [ + 9669, + null + ], + "hints": { + "index": 18277 + } + }, + { + "items": [ + 9669.5, + null + ], + "hints": { + "index": 18278 + } + }, + { + "items": [ + 9670, + null + ], + "hints": { + "index": 18279 + } + }, + { + "items": [ + 9670.5, + null + ], + "hints": { + "index": 18280 + } + }, + { + "items": [ + 9671, + null + ], + "hints": { + "index": 18281 + } + }, + { + "items": [ + 9671.5, + null + ], + "hints": { + "index": 18282 + } + }, + { + "items": [ + 9672, + null + ], + "hints": { + "index": 18283 + } + }, + { + "items": [ + 9672.5, + null + ], + "hints": { + "index": 18284 + } + }, + { + "items": [ + 9673, + null + ], + "hints": { + "index": 18285 + } + }, + { + "items": [ + 9673.5, + null + ], + "hints": { + "index": 18286 + } + }, + { + "items": [ + 9674, + null + ], + "hints": { + "index": 18287 + } + }, + { + "items": [ + 9674.5, + null + ], + "hints": { + "index": 18288 + } + }, + { + "items": [ + 9675, + null + ], + "hints": { + "index": 18289 + } + }, + { + "items": [ + 9675.5, + null + ], + "hints": { + "index": 18290 + } + }, + { + "items": [ + 9676, + null + ], + "hints": { + "index": 18291 + } + }, + { + "items": [ + 9676.5, + null + ], + "hints": { + "index": 18292 + } + }, + { + "items": [ + 9677, + null + ], + "hints": { + "index": 18293 + } + }, + { + "items": [ + 9677.5, + null + ], + "hints": { + "index": 18294 + } + }, + { + "items": [ + 9678, + null + ], + "hints": { + "index": 18295 + } + }, + { + "items": [ + 9678.5, + null + ], + "hints": { + "index": 18296 + } + }, + { + "items": [ + 9679, + null + ], + "hints": { + "index": 18297 + } + }, + { + "items": [ + 9679.5, + null + ], + "hints": { + "index": 18298 + } + }, + { + "items": [ + 9680, + null + ], + "hints": { + "index": 18299 + } + }, + { + "items": [ + 9680.5, + null + ], + "hints": { + "index": 18300 + } + }, + { + "items": [ + 9681, + null + ], + "hints": { + "index": 18301 + } + }, + { + "items": [ + 9681.5, + null + ], + "hints": { + "index": 18302 + } + }, + { + "items": [ + 9682, + null + ], + "hints": { + "index": 18303 + } + }, + { + "items": [ + 9682.5, + null + ], + "hints": { + "index": 18304 + } + }, + { + "items": [ + 9683, + null + ], + "hints": { + "index": 18305 + } + }, + { + "items": [ + 9683.5, + null + ], + "hints": { + "index": 18306 + } + }, + { + "items": [ + 9684, + null + ], + "hints": { + "index": 18307 + } + }, + { + "items": [ + 9684.5, + null + ], + "hints": { + "index": 18308 + } + }, + { + "items": [ + 9685, + null + ], + "hints": { + "index": 18309 + } + }, + { + "items": [ + 9685.5, + null + ], + "hints": { + "index": 18310 + } + }, + { + "items": [ + 9686, + null + ], + "hints": { + "index": 18311 + } + }, + { + "items": [ + 9686.5, + null + ], + "hints": { + "index": 18312 + } + }, + { + "items": [ + 9687, + null + ], + "hints": { + "index": 18313 + } + }, + { + "items": [ + 9687.5, + null + ], + "hints": { + "index": 18314 + } + }, + { + "items": [ + 9688, + null + ], + "hints": { + "index": 18315 + } + }, + { + "items": [ + 9688.5, + null + ], + "hints": { + "index": 18316 + } + }, + { + "items": [ + 9689, + null + ], + "hints": { + "index": 18317 + } + }, + { + "items": [ + 9689.5, + null + ], + "hints": { + "index": 18318 + } + }, + { + "items": [ + 9690, + null + ], + "hints": { + "index": 18319 + } + }, + { + "items": [ + 9690.5, + null + ], + "hints": { + "index": 18320 + } + }, + { + "items": [ + 9691, + null + ], + "hints": { + "index": 18321 + } + }, + { + "items": [ + 9691.5, + null + ], + "hints": { + "index": 18322 + } + }, + { + "items": [ + 9692, + null + ], + "hints": { + "index": 18323 + } + }, + { + "items": [ + 9692.5, + null + ], + "hints": { + "index": 18324 + } + }, + { + "items": [ + 9693, + null + ], + "hints": { + "index": 18325 + } + }, + { + "items": [ + 9693.5, + null + ], + "hints": { + "index": 18326 + } + }, + { + "items": [ + 9694, + null + ], + "hints": { + "index": 18327 + } + }, + { + "items": [ + 9694.5, + null + ], + "hints": { + "index": 18328 + } + }, + { + "items": [ + 9695, + null + ], + "hints": { + "index": 18329 + } + }, + { + "items": [ + 9695.5, + null + ], + "hints": { + "index": 18330 + } + }, + { + "items": [ + 9696, + null + ], + "hints": { + "index": 18331 + } + }, + { + "items": [ + 9696.5, + null + ], + "hints": { + "index": 18332 + } + }, + { + "items": [ + 9697, + null + ], + "hints": { + "index": 18333 + } + }, + { + "items": [ + 9697.5, + null + ], + "hints": { + "index": 18334 + } + }, + { + "items": [ + 9698, + null + ], + "hints": { + "index": 18335 + } + }, + { + "items": [ + 9698.5, + null + ], + "hints": { + "index": 18336 + } + }, + { + "items": [ + 9699, + null + ], + "hints": { + "index": 18337 + } + }, + { + "items": [ + 9699.5, + null + ], + "hints": { + "index": 18338 + } + }, + { + "items": [ + 9700, + null + ], + "hints": { + "index": 18339 + } + }, + { + "items": [ + 9700.5, + null + ], + "hints": { + "index": 18340 + } + }, + { + "items": [ + 9701, + null + ], + "hints": { + "index": 18341 + } + }, + { + "items": [ + 9701.5, + null + ], + "hints": { + "index": 18342 + } + }, + { + "items": [ + 9702, + null + ], + "hints": { + "index": 18343 + } + }, + { + "items": [ + 9702.5, + null + ], + "hints": { + "index": 18344 + } + }, + { + "items": [ + 9703, + null + ], + "hints": { + "index": 18345 + } + }, + { + "items": [ + 9703.5, + null + ], + "hints": { + "index": 18346 + } + }, + { + "items": [ + 9704, + null + ], + "hints": { + "index": 18347 + } + }, + { + "items": [ + 9704.5, + null + ], + "hints": { + "index": 18348 + } + }, + { + "items": [ + 9705, + null + ], + "hints": { + "index": 18349 + } + }, + { + "items": [ + 9705.5, + null + ], + "hints": { + "index": 18350 + } + }, + { + "items": [ + 9706, + null + ], + "hints": { + "index": 18351 + } + }, + { + "items": [ + 9706.5, + null + ], + "hints": { + "index": 18352 + } + }, + { + "items": [ + 9707, + null + ], + "hints": { + "index": 18353 + } + }, + { + "items": [ + 9707.5, + null + ], + "hints": { + "index": 18354 + } + }, + { + "items": [ + 9708, + null + ], + "hints": { + "index": 18355 + } + }, + { + "items": [ + 9708.5, + null + ], + "hints": { + "index": 18356 + } + }, + { + "items": [ + 9709, + null + ], + "hints": { + "index": 18357 + } + }, + { + "items": [ + 9709.5, + null + ], + "hints": { + "index": 18358 + } + }, + { + "items": [ + 9710, + null + ], + "hints": { + "index": 18359 + } + }, + { + "items": [ + 9710.5, + null + ], + "hints": { + "index": 18360 + } + }, + { + "items": [ + 9711, + null + ], + "hints": { + "index": 18361 + } + }, + { + "items": [ + 9711.5, + null + ], + "hints": { + "index": 18362 + } + }, + { + "items": [ + 9712, + null + ], + "hints": { + "index": 18363 + } + }, + { + "items": [ + 9712.5, + null + ], + "hints": { + "index": 18364 + } + }, + { + "items": [ + 9713, + null + ], + "hints": { + "index": 18365 + } + }, + { + "items": [ + 9713.5, + null + ], + "hints": { + "index": 18366 + } + }, + { + "items": [ + 9714, + null + ], + "hints": { + "index": 18367 + } + }, + { + "items": [ + 9714.5, + null + ], + "hints": { + "index": 18368 + } + }, + { + "items": [ + 9715, + null + ], + "hints": { + "index": 18369 + } + }, + { + "items": [ + 9715.5, + null + ], + "hints": { + "index": 18370 + } + }, + { + "items": [ + 9716, + null + ], + "hints": { + "index": 18371 + } + }, + { + "items": [ + 9716.5, + null + ], + "hints": { + "index": 18372 + } + }, + { + "items": [ + 9717, + null + ], + "hints": { + "index": 18373 + } + }, + { + "items": [ + 9717.5, + null + ], + "hints": { + "index": 18374 + } + }, + { + "items": [ + 9718, + null + ], + "hints": { + "index": 18375 + } + }, + { + "items": [ + 9718.5, + null + ], + "hints": { + "index": 18376 + } + }, + { + "items": [ + 9719, + null + ], + "hints": { + "index": 18377 + } + }, + { + "items": [ + 9719.5, + null + ], + "hints": { + "index": 18378 + } + }, + { + "items": [ + 9720, + null + ], + "hints": { + "index": 18379 + } + }, + { + "items": [ + 9720.5, + null + ], + "hints": { + "index": 18380 + } + }, + { + "items": [ + 9721, + null + ], + "hints": { + "index": 18381 + } + }, + { + "items": [ + 9721.5, + null + ], + "hints": { + "index": 18382 + } + }, + { + "items": [ + 9722, + null + ], + "hints": { + "index": 18383 + } + }, + { + "items": [ + 9722.5, + null + ], + "hints": { + "index": 18384 + } + }, + { + "items": [ + 9723, + null + ], + "hints": { + "index": 18385 + } + }, + { + "items": [ + 9723.5, + null + ], + "hints": { + "index": 18386 + } + }, + { + "items": [ + 9724, + null + ], + "hints": { + "index": 18387 + } + }, + { + "items": [ + 9724.5, + null + ], + "hints": { + "index": 18388 + } + }, + { + "items": [ + 9725, + null + ], + "hints": { + "index": 18389 + } + }, + { + "items": [ + 9725.5, + null + ], + "hints": { + "index": 18390 + } + }, + { + "items": [ + 9726, + null + ], + "hints": { + "index": 18391 + } + }, + { + "items": [ + 9726.5, + null + ], + "hints": { + "index": 18392 + } + }, + { + "items": [ + 9727, + null + ], + "hints": { + "index": 18393 + } + }, + { + "items": [ + 9727.5, + null + ], + "hints": { + "index": 18394 + } + }, + { + "items": [ + 9728, + null + ], + "hints": { + "index": 18395 + } + }, + { + "items": [ + 9728.5, + null + ], + "hints": { + "index": 18396 + } + }, + { + "items": [ + 9729, + null + ], + "hints": { + "index": 18397 + } + }, + { + "items": [ + 9729.5, + null + ], + "hints": { + "index": 18398 + } + }, + { + "items": [ + 9730, + null + ], + "hints": { + "index": 18399 + } + }, + { + "items": [ + 9730.5, + 16.9251 + ], + "hints": { + "index": 18400 + } + }, + { + "items": [ + 9731, + 16.0078 + ], + "hints": { + "index": 18401 + } + }, + { + "items": [ + 9731.5, + 12.226799964904783 + ], + "hints": { + "index": 18402 + } + }, + { + "items": [ + 9732, + 12.888199806213381 + ], + "hints": { + "index": 18403 + } + }, + { + "items": [ + 9732.5, + 15.41450023651123 + ], + "hints": { + "index": 18404 + } + }, + { + "items": [ + 9733, + 17.296 + ], + "hints": { + "index": 18405 + } + }, + { + "items": [ + 9733.5, + 17.4681 + ], + "hints": { + "index": 18406 + } + }, + { + "items": [ + 9734, + 17.158300399780273 + ], + "hints": { + "index": 18407 + } + }, + { + "items": [ + 9734.5, + 17.575300216674805 + ], + "hints": { + "index": 18408 + } + }, + { + "items": [ + 9735, + 17.5141 + ], + "hints": { + "index": 18409 + } + }, + { + "items": [ + 9735.5, + 17.4969 + ], + "hints": { + "index": 18410 + } + }, + { + "items": [ + 9736, + 17.5705 + ], + "hints": { + "index": 18411 + } + }, + { + "items": [ + 9736.5, + 10.7461 + ], + "hints": { + "index": 18412 + } + }, + { + "items": [ + 9737, + -9.2503 + ], + "hints": { + "index": 18413 + } + }, + { + "items": [ + 9737.5, + -17.1648 + ], + "hints": { + "index": 18414 + } + }, + { + "items": [ + 9738, + 103.75530242919922 + ], + "hints": { + "index": 18415 + } + }, + { + "items": [ + 9738.5, + -639.9952 + ], + "hints": { + "index": 18416 + } + }, + { + "items": [ + 9739, + 49.267799377441406 + ], + "hints": { + "index": 18417 + } + }, + { + "items": [ + 9739.5, + 1.649399995803833 + ], + "hints": { + "index": 18418 + } + }, + { + "items": [ + 9740, + 11.097000122070313 + ], + "hints": { + "index": 18419 + } + }, + { + "items": [ + 9740.5, + 6.9727 + ], + "hints": { + "index": 18420 + } + }, + { + "items": [ + 9741, + 5.2842 + ], + "hints": { + "index": 18421 + } + }, + { + "items": [ + 9741.5, + 5.0233 + ], + "hints": { + "index": 18422 + } + }, + { + "items": [ + 9742, + 5.1924 + ], + "hints": { + "index": 18423 + } + }, + { + "items": [ + 9742.5, + 5.5937 + ], + "hints": { + "index": 18424 + } + }, + { + "items": [ + 9743, + 6.6504 + ], + "hints": { + "index": 18425 + } + }, + { + "items": [ + 9743.5, + 8.9985 + ], + "hints": { + "index": 18426 + } + }, + { + "items": [ + 9744, + 11.2429 + ], + "hints": { + "index": 18427 + } + }, + { + "items": [ + 9744.5, + 15.4659 + ], + "hints": { + "index": 18428 + } + }, + { + "items": [ + 9745, + 35.4469 + ], + "hints": { + "index": 18429 + } + }, + { + "items": [ + 9745.5, + 29.487499237060547 + ], + "hints": { + "index": 18430 + } + }, + { + "items": [ + 9746, + 28.5372 + ], + "hints": { + "index": 18431 + } + }, + { + "items": [ + 9746.5, + 22.6509 + ], + "hints": { + "index": 18432 + } + }, + { + "items": [ + 9747, + 30.517499923706055 + ], + "hints": { + "index": 18433 + } + }, + { + "items": [ + 9747.5, + 10.809 + ], + "hints": { + "index": 18434 + } + }, + { + "items": [ + 9748, + 6.8280000686645508 + ], + "hints": { + "index": 18435 + } + }, + { + "items": [ + 9748.5, + 5.2094001770019531 + ], + "hints": { + "index": 18436 + } + }, + { + "items": [ + 9749, + 5.0907 + ], + "hints": { + "index": 18437 + } + }, + { + "items": [ + 9749.5, + 4.3519001007080078 + ], + "hints": { + "index": 18438 + } + }, + { + "items": [ + 9750, + 3.9245998859405522 + ], + "hints": { + "index": 18439 + } + }, + { + "items": [ + 9750.5, + 4.2221999168396 + ], + "hints": { + "index": 18440 + } + }, + { + "items": [ + 9751, + 5.92609977722168 + ], + "hints": { + "index": 18441 + } + }, + { + "items": [ + 9751.5, + 5.8443999290466309 + ], + "hints": { + "index": 18442 + } + }, + { + "items": [ + 9752, + 4.3016 + ], + "hints": { + "index": 18443 + } + }, + { + "items": [ + 9752.5, + 3.4223 + ], + "hints": { + "index": 18444 + } + }, + { + "items": [ + 9753, + 3.1075 + ], + "hints": { + "index": 18445 + } + }, + { + "items": [ + 9753.5, + 3.0783998966217041 + ], + "hints": { + "index": 18446 + } + }, + { + "items": [ + 9754, + 2.9581000804901123 + ], + "hints": { + "index": 18447 + } + }, + { + "items": [ + 9754.5, + 2.86080002784729 + ], + "hints": { + "index": 18448 + } + }, + { + "items": [ + 9755, + 2.7804999351501465 + ], + "hints": { + "index": 18449 + } + }, + { + "items": [ + 9755.5, + 2.894 + ], + "hints": { + "index": 18450 + } + }, + { + "items": [ + 9756, + 3.1313 + ], + "hints": { + "index": 18451 + } + }, + { + "items": [ + 9756.5, + 3.752 + ], + "hints": { + "index": 18452 + } + }, + { + "items": [ + 9757, + 3.819 + ], + "hints": { + "index": 18453 + } + }, + { + "items": [ + 9757.5, + 3.6189999580383305 + ], + "hints": { + "index": 18454 + } + }, + { + "items": [ + 9758, + 3.2849 + ], + "hints": { + "index": 18455 + } + }, + { + "items": [ + 9758.5, + 3.3011999130249023 + ], + "hints": { + "index": 18456 + } + }, + { + "items": [ + 9759, + 3.3136999607086186 + ], + "hints": { + "index": 18457 + } + }, + { + "items": [ + 9759.5, + 3.0813999176025391 + ], + "hints": { + "index": 18458 + } + }, + { + "items": [ + 9760, + 2.8125998973846436 + ], + "hints": { + "index": 18459 + } + }, + { + "items": [ + 9760.5, + 2.6344 + ], + "hints": { + "index": 18460 + } + }, + { + "items": [ + 9761, + 2.7116 + ], + "hints": { + "index": 18461 + } + }, + { + "items": [ + 9761.5, + 2.9098 + ], + "hints": { + "index": 18462 + } + }, + { + "items": [ + 9762, + 3.1141 + ], + "hints": { + "index": 18463 + } + }, + { + "items": [ + 9762.5, + 3.0360000133514404 + ], + "hints": { + "index": 18464 + } + }, + { + "items": [ + 9763, + 2.8579 + ], + "hints": { + "index": 18465 + } + }, + { + "items": [ + 9763.5, + 2.7516999244689941 + ], + "hints": { + "index": 18466 + } + }, + { + "items": [ + 9764, + 2.7758998870849609 + ], + "hints": { + "index": 18467 + } + }, + { + "items": [ + 9764.5, + 2.7235000133514404 + ], + "hints": { + "index": 18468 + } + }, + { + "items": [ + 9765, + 2.6991000175476074 + ], + "hints": { + "index": 18469 + } + }, + { + "items": [ + 9765.5, + 2.65 + ], + "hints": { + "index": 18470 + } + }, + { + "items": [ + 9766, + 2.6765000820159912 + ], + "hints": { + "index": 18471 + } + }, + { + "items": [ + 9766.5, + 2.611799955368042 + ], + "hints": { + "index": 18472 + } + }, + { + "items": [ + 9767, + 2.5165998935699463 + ], + "hints": { + "index": 18473 + } + }, + { + "items": [ + 9767.5, + 2.47760009765625 + ], + "hints": { + "index": 18474 + } + }, + { + "items": [ + 9768, + 2.5225 + ], + "hints": { + "index": 18475 + } + }, + { + "items": [ + 9768.5, + 2.6068000793457031 + ], + "hints": { + "index": 18476 + } + }, + { + "items": [ + 9769, + 2.7021999359130859 + ], + "hints": { + "index": 18477 + } + }, + { + "items": [ + 9769.5, + 2.7543 + ], + "hints": { + "index": 18478 + } + }, + { + "items": [ + 9770, + 2.8087999820709229 + ], + "hints": { + "index": 18479 + } + }, + { + "items": [ + 9770.5, + 2.7561 + ], + "hints": { + "index": 18480 + } + }, + { + "items": [ + 9771, + 2.7307999134063721 + ], + "hints": { + "index": 18481 + } + }, + { + "items": [ + 9771.5, + 2.6904 + ], + "hints": { + "index": 18482 + } + }, + { + "items": [ + 9772, + 2.6296000480651855 + ], + "hints": { + "index": 18483 + } + }, + { + "items": [ + 9772.5, + 2.6177999973297119 + ], + "hints": { + "index": 18484 + } + }, + { + "items": [ + 9773, + 2.6867 + ], + "hints": { + "index": 18485 + } + }, + { + "items": [ + 9773.5, + 2.8889000415802 + ], + "hints": { + "index": 18486 + } + }, + { + "items": [ + 9774, + 2.7904999256134033 + ], + "hints": { + "index": 18487 + } + }, + { + "items": [ + 9774.5, + 2.7462 + ], + "hints": { + "index": 18488 + } + }, + { + "items": [ + 9775, + 2.5561 + ], + "hints": { + "index": 18489 + } + }, + { + "items": [ + 9775.5, + 2.6741 + ], + "hints": { + "index": 18490 + } + }, + { + "items": [ + 9776, + 2.7157 + ], + "hints": { + "index": 18491 + } + }, + { + "items": [ + 9776.5, + 2.7328 + ], + "hints": { + "index": 18492 + } + }, + { + "items": [ + 9777, + 2.7605 + ], + "hints": { + "index": 18493 + } + }, + { + "items": [ + 9777.5, + 2.6803 + ], + "hints": { + "index": 18494 + } + }, + { + "items": [ + 9778, + 2.8062 + ], + "hints": { + "index": 18495 + } + }, + { + "items": [ + 9778.5, + 2.7888998985290527 + ], + "hints": { + "index": 18496 + } + }, + { + "items": [ + 9779, + 2.692 + ], + "hints": { + "index": 18497 + } + }, + { + "items": [ + 9779.5, + 2.5273 + ], + "hints": { + "index": 18498 + } + }, + { + "items": [ + 9780, + 2.503 + ], + "hints": { + "index": 18499 + } + }, + { + "items": [ + 9780.5, + 2.5666 + ], + "hints": { + "index": 18500 + } + }, + { + "items": [ + 9781, + 2.7118 + ], + "hints": { + "index": 18501 + } + }, + { + "items": [ + 9781.5, + 2.7237 + ], + "hints": { + "index": 18502 + } + }, + { + "items": [ + 9782, + 2.7506000995635982 + ], + "hints": { + "index": 18503 + } + }, + { + "items": [ + 9782.5, + 2.68969988822937 + ], + "hints": { + "index": 18504 + } + }, + { + "items": [ + 9783, + 2.7585 + ], + "hints": { + "index": 18505 + } + }, + { + "items": [ + 9783.5, + 2.8678998947143555 + ], + "hints": { + "index": 18506 + } + }, + { + "items": [ + 9784, + 2.8786 + ], + "hints": { + "index": 18507 + } + }, + { + "items": [ + 9784.5, + 2.6735999584198 + ], + "hints": { + "index": 18508 + } + }, + { + "items": [ + 9785, + 2.6110999584198 + ], + "hints": { + "index": 18509 + } + }, + { + "items": [ + 9785.5, + 2.6579000949859619 + ], + "hints": { + "index": 18510 + } + }, + { + "items": [ + 9786, + 2.8708999156951904 + ], + "hints": { + "index": 18511 + } + }, + { + "items": [ + 9786.5, + 2.8138 + ], + "hints": { + "index": 18512 + } + }, + { + "items": [ + 9787, + 2.8258 + ], + "hints": { + "index": 18513 + } + }, + { + "items": [ + 9787.5, + 2.7743 + ], + "hints": { + "index": 18514 + } + }, + { + "items": [ + 9788, + 2.8474 + ], + "hints": { + "index": 18515 + } + }, + { + "items": [ + 9788.5, + 2.7796 + ], + "hints": { + "index": 18516 + } + }, + { + "items": [ + 9789, + 2.7025 + ], + "hints": { + "index": 18517 + } + }, + { + "items": [ + 9789.5, + 2.7888998985290527 + ], + "hints": { + "index": 18518 + } + }, + { + "items": [ + 9790, + 2.8561999797821045 + ], + "hints": { + "index": 18519 + } + }, + { + "items": [ + 9790.5, + 2.9536 + ], + "hints": { + "index": 18520 + } + }, + { + "items": [ + 9791, + 2.8209 + ], + "hints": { + "index": 18521 + } + }, + { + "items": [ + 9791.5, + 2.803 + ], + "hints": { + "index": 18522 + } + }, + { + "items": [ + 9792, + 2.7093 + ], + "hints": { + "index": 18523 + } + }, + { + "items": [ + 9792.5, + 2.7741999626159668 + ], + "hints": { + "index": 18524 + } + }, + { + "items": [ + 9793, + 2.7790999412536621 + ], + "hints": { + "index": 18525 + } + }, + { + "items": [ + 9793.5, + 2.8362998962402344 + ], + "hints": { + "index": 18526 + } + }, + { + "items": [ + 9794, + 3.0297000408172607 + ], + "hints": { + "index": 18527 + } + }, + { + "items": [ + 9794.5, + 3.1263999938964844 + ], + "hints": { + "index": 18528 + } + }, + { + "items": [ + 9795, + 3.1415998935699463 + ], + "hints": { + "index": 18529 + } + }, + { + "items": [ + 9795.5, + 2.986299991607666 + ], + "hints": { + "index": 18530 + } + }, + { + "items": [ + 9796, + 2.9923000335693359 + ], + "hints": { + "index": 18531 + } + }, + { + "items": [ + 9796.5, + 3.0899 + ], + "hints": { + "index": 18532 + } + }, + { + "items": [ + 9797, + 3.1835000514984131 + ], + "hints": { + "index": 18533 + } + }, + { + "items": [ + 9797.5, + 3.0556 + ], + "hints": { + "index": 18534 + } + }, + { + "items": [ + 9798, + 2.9506 + ], + "hints": { + "index": 18535 + } + }, + { + "items": [ + 9798.5, + 2.7365999221801758 + ], + "hints": { + "index": 18536 + } + }, + { + "items": [ + 9799, + 2.7314 + ], + "hints": { + "index": 18537 + } + }, + { + "items": [ + 9799.5, + 2.6298999786376953 + ], + "hints": { + "index": 18538 + } + }, + { + "items": [ + 9800, + 2.7095 + ], + "hints": { + "index": 18539 + } + }, + { + "items": [ + 9800.5, + 2.7132999897003174 + ], + "hints": { + "index": 18540 + } + }, + { + "items": [ + 9801, + 2.7754 + ], + "hints": { + "index": 18541 + } + }, + { + "items": [ + 9801.5, + 2.7757 + ], + "hints": { + "index": 18542 + } + }, + { + "items": [ + 9802, + 2.6493 + ], + "hints": { + "index": 18543 + } + }, + { + "items": [ + 9802.5, + 2.6233000755310059 + ], + "hints": { + "index": 18544 + } + }, + { + "items": [ + 9803, + 2.7307 + ], + "hints": { + "index": 18545 + } + }, + { + "items": [ + 9803.5, + 3.0471000671386719 + ], + "hints": { + "index": 18546 + } + }, + { + "items": [ + 9804, + 3.0023000240325928 + ], + "hints": { + "index": 18547 + } + }, + { + "items": [ + 9804.5, + 2.8643999099731445 + ], + "hints": { + "index": 18548 + } + }, + { + "items": [ + 9805, + 2.8375999927520752 + ], + "hints": { + "index": 18549 + } + }, + { + "items": [ + 9805.5, + 2.9648 + ], + "hints": { + "index": 18550 + } + }, + { + "items": [ + 9806, + 2.97979998588562 + ], + "hints": { + "index": 18551 + } + }, + { + "items": [ + 9806.5, + 2.8069999217987061 + ], + "hints": { + "index": 18552 + } + }, + { + "items": [ + 9807, + 2.6876 + ], + "hints": { + "index": 18553 + } + }, + { + "items": [ + 9807.5, + 2.7118 + ], + "hints": { + "index": 18554 + } + }, + { + "items": [ + 9808, + 2.7399 + ], + "hints": { + "index": 18555 + } + }, + { + "items": [ + 9808.5, + 2.76 + ], + "hints": { + "index": 18556 + } + }, + { + "items": [ + 9809, + 2.6783 + ], + "hints": { + "index": 18557 + } + }, + { + "items": [ + 9809.5, + 2.6247 + ], + "hints": { + "index": 18558 + } + }, + { + "items": [ + 9810, + 2.6914999485015869 + ], + "hints": { + "index": 18559 + } + }, + { + "items": [ + 9810.5, + 2.8138 + ], + "hints": { + "index": 18560 + } + }, + { + "items": [ + 9811, + 2.9655001163482666 + ], + "hints": { + "index": 18561 + } + }, + { + "items": [ + 9811.5, + 2.946199893951416 + ], + "hints": { + "index": 18562 + } + }, + { + "items": [ + 9812, + 2.8169000148773193 + ], + "hints": { + "index": 18563 + } + }, + { + "items": [ + 9812.5, + 2.6916 + ], + "hints": { + "index": 18564 + } + }, + { + "items": [ + 9813, + 2.6185 + ], + "hints": { + "index": 18565 + } + }, + { + "items": [ + 9813.5, + 2.6369 + ], + "hints": { + "index": 18566 + } + }, + { + "items": [ + 9814, + 2.7371 + ], + "hints": { + "index": 18567 + } + }, + { + "items": [ + 9814.5, + 2.7263 + ], + "hints": { + "index": 18568 + } + }, + { + "items": [ + 9815, + 2.6721 + ], + "hints": { + "index": 18569 + } + }, + { + "items": [ + 9815.5, + 2.6101 + ], + "hints": { + "index": 18570 + } + }, + { + "items": [ + 9816, + 2.6051 + ], + "hints": { + "index": 18571 + } + }, + { + "items": [ + 9816.5, + 2.7051000595092773 + ], + "hints": { + "index": 18572 + } + }, + { + "items": [ + 9817, + 2.635 + ], + "hints": { + "index": 18573 + } + }, + { + "items": [ + 9817.5, + 2.6324999332427979 + ], + "hints": { + "index": 18574 + } + }, + { + "items": [ + 9818, + 2.5766000747680664 + ], + "hints": { + "index": 18575 + } + }, + { + "items": [ + 9818.5, + 2.5785999298095703 + ], + "hints": { + "index": 18576 + } + }, + { + "items": [ + 9819, + 2.5724000930786133 + ], + "hints": { + "index": 18577 + } + }, + { + "items": [ + 9819.5, + 2.5972 + ], + "hints": { + "index": 18578 + } + }, + { + "items": [ + 9820, + 2.637 + ], + "hints": { + "index": 18579 + } + }, + { + "items": [ + 9820.5, + 2.7025001049041748 + ], + "hints": { + "index": 18580 + } + }, + { + "items": [ + 9821, + 2.70770001411438 + ], + "hints": { + "index": 18581 + } + }, + { + "items": [ + 9821.5, + 2.709399938583374 + ], + "hints": { + "index": 18582 + } + }, + { + "items": [ + 9822, + 2.7645 + ], + "hints": { + "index": 18583 + } + }, + { + "items": [ + 9822.5, + 2.8329 + ], + "hints": { + "index": 18584 + } + }, + { + "items": [ + 9823, + 2.8870999813079834 + ], + "hints": { + "index": 18585 + } + }, + { + "items": [ + 9823.5, + 2.7374 + ], + "hints": { + "index": 18586 + } + }, + { + "items": [ + 9824, + 2.7083 + ], + "hints": { + "index": 18587 + } + }, + { + "items": [ + 9824.5, + 2.7443 + ], + "hints": { + "index": 18588 + } + }, + { + "items": [ + 9825, + 2.7323 + ], + "hints": { + "index": 18589 + } + }, + { + "items": [ + 9825.5, + 2.690000057220459 + ], + "hints": { + "index": 18590 + } + }, + { + "items": [ + 9826, + 2.5892000198364258 + ], + "hints": { + "index": 18591 + } + }, + { + "items": [ + 9826.5, + 2.630000114440918 + ], + "hints": { + "index": 18592 + } + }, + { + "items": [ + 9827, + 2.6705999374389648 + ], + "hints": { + "index": 18593 + } + }, + { + "items": [ + 9827.5, + 2.6795001029968266 + ], + "hints": { + "index": 18594 + } + }, + { + "items": [ + 9828, + 2.7125999927520752 + ], + "hints": { + "index": 18595 + } + }, + { + "items": [ + 9828.5, + 2.7060999870300293 + ], + "hints": { + "index": 18596 + } + }, + { + "items": [ + 9829, + 2.6784999370574951 + ], + "hints": { + "index": 18597 + } + }, + { + "items": [ + 9829.5, + 2.6731998920440674 + ], + "hints": { + "index": 18598 + } + }, + { + "items": [ + 9830, + 2.6334 + ], + "hints": { + "index": 18599 + } + }, + { + "items": [ + 9830.5, + 2.5805 + ], + "hints": { + "index": 18600 + } + }, + { + "items": [ + 9831, + 2.5408 + ], + "hints": { + "index": 18601 + } + }, + { + "items": [ + 9831.5, + 2.4928 + ], + "hints": { + "index": 18602 + } + }, + { + "items": [ + 9832, + 2.5422 + ], + "hints": { + "index": 18603 + } + }, + { + "items": [ + 9832.5, + 2.5418 + ], + "hints": { + "index": 18604 + } + }, + { + "items": [ + 9833, + 2.6238 + ], + "hints": { + "index": 18605 + } + }, + { + "items": [ + 9833.5, + 2.630000114440918 + ], + "hints": { + "index": 18606 + } + }, + { + "items": [ + 9834, + 2.6282999515533447 + ], + "hints": { + "index": 18607 + } + }, + { + "items": [ + 9834.5, + 2.5892000198364258 + ], + "hints": { + "index": 18608 + } + }, + { + "items": [ + 9835, + 2.6616001129150391 + ], + "hints": { + "index": 18609 + } + }, + { + "items": [ + 9835.5, + 2.700200080871582 + ], + "hints": { + "index": 18610 + } + }, + { + "items": [ + 9836, + 2.7218999862670894 + ], + "hints": { + "index": 18611 + } + }, + { + "items": [ + 9836.5, + 2.6343998908996582 + ], + "hints": { + "index": 18612 + } + }, + { + "items": [ + 9837, + 2.6321001052856445 + ], + "hints": { + "index": 18613 + } + }, + { + "items": [ + 9837.5, + 2.6461999416351318 + ], + "hints": { + "index": 18614 + } + }, + { + "items": [ + 9838, + 2.7411999702453613 + ], + "hints": { + "index": 18615 + } + }, + { + "items": [ + 9838.5, + 2.6923999786376953 + ], + "hints": { + "index": 18616 + } + }, + { + "items": [ + 9839, + 2.603100061416626 + ], + "hints": { + "index": 18617 + } + }, + { + "items": [ + 9839.5, + 2.5388000011444092 + ], + "hints": { + "index": 18618 + } + }, + { + "items": [ + 9840, + 2.5834 + ], + "hints": { + "index": 18619 + } + }, + { + "items": [ + 9840.5, + 2.6857 + ], + "hints": { + "index": 18620 + } + }, + { + "items": [ + 9841, + 2.6226 + ], + "hints": { + "index": 18621 + } + }, + { + "items": [ + 9841.5, + 2.6349 + ], + "hints": { + "index": 18622 + } + }, + { + "items": [ + 9842, + 2.6256 + ], + "hints": { + "index": 18623 + } + }, + { + "items": [ + 9842.5, + 2.7511 + ], + "hints": { + "index": 18624 + } + }, + { + "items": [ + 9843, + 2.8687999248504639 + ], + "hints": { + "index": 18625 + } + }, + { + "items": [ + 9843.5, + 2.9603 + ], + "hints": { + "index": 18626 + } + }, + { + "items": [ + 9844, + 2.9017999172210693 + ], + "hints": { + "index": 18627 + } + }, + { + "items": [ + 9844.5, + 2.8219 + ], + "hints": { + "index": 18628 + } + }, + { + "items": [ + 9845, + 2.7552 + ], + "hints": { + "index": 18629 + } + }, + { + "items": [ + 9845.5, + 2.6601 + ], + "hints": { + "index": 18630 + } + }, + { + "items": [ + 9846, + 2.5810999870300293 + ], + "hints": { + "index": 18631 + } + }, + { + "items": [ + 9846.5, + 2.6023 + ], + "hints": { + "index": 18632 + } + }, + { + "items": [ + 9847, + 2.713 + ], + "hints": { + "index": 18633 + } + }, + { + "items": [ + 9847.5, + 2.7281 + ], + "hints": { + "index": 18634 + } + }, + { + "items": [ + 9848, + 2.7833 + ], + "hints": { + "index": 18635 + } + }, + { + "items": [ + 9848.5, + 2.8168001174926758 + ], + "hints": { + "index": 18636 + } + }, + { + "items": [ + 9849, + 2.8580000400543213 + ], + "hints": { + "index": 18637 + } + }, + { + "items": [ + 9849.5, + 2.7425000667572021 + ], + "hints": { + "index": 18638 + } + }, + { + "items": [ + 9850, + 2.7176001071929932 + ], + "hints": { + "index": 18639 + } + }, + { + "items": [ + 9850.5, + 2.8872001171112061 + ], + "hints": { + "index": 18640 + } + }, + { + "items": [ + 9851, + 3.0909 + ], + "hints": { + "index": 18641 + } + }, + { + "items": [ + 9851.5, + 3.0436 + ], + "hints": { + "index": 18642 + } + }, + { + "items": [ + 9852, + 2.7803 + ], + "hints": { + "index": 18643 + } + }, + { + "items": [ + 9852.5, + 2.5385000705718994 + ], + "hints": { + "index": 18644 + } + }, + { + "items": [ + 9853, + 2.4899001121520996 + ], + "hints": { + "index": 18645 + } + }, + { + "items": [ + 9853.5, + 2.5519 + ], + "hints": { + "index": 18646 + } + }, + { + "items": [ + 9854, + 2.689 + ], + "hints": { + "index": 18647 + } + }, + { + "items": [ + 9854.5, + 2.7313001155853271 + ], + "hints": { + "index": 18648 + } + }, + { + "items": [ + 9855, + 2.7876999378204346 + ], + "hints": { + "index": 18649 + } + }, + { + "items": [ + 9855.5, + 2.6949999332427979 + ], + "hints": { + "index": 18650 + } + }, + { + "items": [ + 9856, + 2.7967000007629395 + ], + "hints": { + "index": 18651 + } + }, + { + "items": [ + 9856.5, + 2.8415000438690186 + ], + "hints": { + "index": 18652 + } + }, + { + "items": [ + 9857, + 2.8582000732421875 + ], + "hints": { + "index": 18653 + } + }, + { + "items": [ + 9857.5, + 2.8334999084472656 + ], + "hints": { + "index": 18654 + } + }, + { + "items": [ + 9858, + 2.8821001052856445 + ], + "hints": { + "index": 18655 + } + }, + { + "items": [ + 9858.5, + 2.8857 + ], + "hints": { + "index": 18656 + } + }, + { + "items": [ + 9859, + 2.8196 + ], + "hints": { + "index": 18657 + } + }, + { + "items": [ + 9859.5, + 2.6634 + ], + "hints": { + "index": 18658 + } + }, + { + "items": [ + 9860, + 2.6724 + ], + "hints": { + "index": 18659 + } + }, + { + "items": [ + 9860.5, + 2.6413 + ], + "hints": { + "index": 18660 + } + }, + { + "items": [ + 9861, + 2.7476 + ], + "hints": { + "index": 18661 + } + }, + { + "items": [ + 9861.5, + 2.7425000667572021 + ], + "hints": { + "index": 18662 + } + }, + { + "items": [ + 9862, + 3.1457 + ], + "hints": { + "index": 18663 + } + }, + { + "items": [ + 9862.5, + 3.2884 + ], + "hints": { + "index": 18664 + } + }, + { + "items": [ + 9863, + 3.5209999084472656 + ], + "hints": { + "index": 18665 + } + }, + { + "items": [ + 9863.5, + 3.350600004196167 + ], + "hints": { + "index": 18666 + } + }, + { + "items": [ + 9864, + 3.2137999534606938 + ], + "hints": { + "index": 18667 + } + }, + { + "items": [ + 9864.5, + 3.0591 + ], + "hints": { + "index": 18668 + } + }, + { + "items": [ + 9865, + 2.8348000049591064 + ], + "hints": { + "index": 18669 + } + }, + { + "items": [ + 9865.5, + 2.7592000961303711 + ], + "hints": { + "index": 18670 + } + }, + { + "items": [ + 9866, + 2.6433 + ], + "hints": { + "index": 18671 + } + }, + { + "items": [ + 9866.5, + 2.6124 + ], + "hints": { + "index": 18672 + } + }, + { + "items": [ + 9867, + 2.5337 + ], + "hints": { + "index": 18673 + } + }, + { + "items": [ + 9867.5, + 2.5177 + ], + "hints": { + "index": 18674 + } + }, + { + "items": [ + 9868, + 2.4721999168395996 + ], + "hints": { + "index": 18675 + } + }, + { + "items": [ + 9868.5, + 2.536099910736084 + ], + "hints": { + "index": 18676 + } + }, + { + "items": [ + 9869, + 2.6652 + ], + "hints": { + "index": 18677 + } + }, + { + "items": [ + 9869.5, + 2.75570011138916 + ], + "hints": { + "index": 18678 + } + }, + { + "items": [ + 9870, + 2.7218 + ], + "hints": { + "index": 18679 + } + }, + { + "items": [ + 9870.5, + 2.761 + ], + "hints": { + "index": 18680 + } + }, + { + "items": [ + 9871, + 2.7469 + ], + "hints": { + "index": 18681 + } + }, + { + "items": [ + 9871.5, + 2.7199 + ], + "hints": { + "index": 18682 + } + }, + { + "items": [ + 9872, + 2.5884 + ], + "hints": { + "index": 18683 + } + }, + { + "items": [ + 9872.5, + 2.5439 + ], + "hints": { + "index": 18684 + } + }, + { + "items": [ + 9873, + 2.50600004196167 + ], + "hints": { + "index": 18685 + } + }, + { + "items": [ + 9873.5, + 2.6513 + ], + "hints": { + "index": 18686 + } + }, + { + "items": [ + 9874, + 2.7125 + ], + "hints": { + "index": 18687 + } + }, + { + "items": [ + 9874.5, + 2.7634 + ], + "hints": { + "index": 18688 + } + }, + { + "items": [ + 9875, + 2.6705 + ], + "hints": { + "index": 18689 + } + }, + { + "items": [ + 9875.5, + 2.7008 + ], + "hints": { + "index": 18690 + } + }, + { + "items": [ + 9876, + 2.7874 + ], + "hints": { + "index": 18691 + } + }, + { + "items": [ + 9876.5, + 2.8071 + ], + "hints": { + "index": 18692 + } + }, + { + "items": [ + 9877, + 2.8313 + ], + "hints": { + "index": 18693 + } + }, + { + "items": [ + 9877.5, + 2.8252999782562256 + ], + "hints": { + "index": 18694 + } + }, + { + "items": [ + 9878, + 2.9366 + ], + "hints": { + "index": 18695 + } + }, + { + "items": [ + 9878.5, + 2.9331998825073242 + ], + "hints": { + "index": 18696 + } + }, + { + "items": [ + 9879, + 2.975600004196167 + ], + "hints": { + "index": 18697 + } + }, + { + "items": [ + 9879.5, + 2.8901000022888184 + ], + "hints": { + "index": 18698 + } + }, + { + "items": [ + 9880, + 2.787100076675415 + ], + "hints": { + "index": 18699 + } + }, + { + "items": [ + 9880.5, + 2.691 + ], + "hints": { + "index": 18700 + } + }, + { + "items": [ + 9881, + 2.6255 + ], + "hints": { + "index": 18701 + } + }, + { + "items": [ + 9881.5, + 2.6822 + ], + "hints": { + "index": 18702 + } + }, + { + "items": [ + 9882, + 2.7383 + ], + "hints": { + "index": 18703 + } + }, + { + "items": [ + 9882.5, + 2.788599967956543 + ], + "hints": { + "index": 18704 + } + }, + { + "items": [ + 9883, + 2.7113 + ], + "hints": { + "index": 18705 + } + }, + { + "items": [ + 9883.5, + 2.7481999397277832 + ], + "hints": { + "index": 18706 + } + }, + { + "items": [ + 9884, + 2.7195 + ], + "hints": { + "index": 18707 + } + }, + { + "items": [ + 9884.5, + 2.8256 + ], + "hints": { + "index": 18708 + } + }, + { + "items": [ + 9885, + 2.7253999710083008 + ], + "hints": { + "index": 18709 + } + }, + { + "items": [ + 9885.5, + 2.7779 + ], + "hints": { + "index": 18710 + } + }, + { + "items": [ + 9886, + 2.8303 + ], + "hints": { + "index": 18711 + } + }, + { + "items": [ + 9886.5, + 2.9472000598907471 + ], + "hints": { + "index": 18712 + } + }, + { + "items": [ + 9887, + 2.8848 + ], + "hints": { + "index": 18713 + } + }, + { + "items": [ + 9887.5, + 2.7829 + ], + "hints": { + "index": 18714 + } + }, + { + "items": [ + 9888, + 2.773 + ], + "hints": { + "index": 18715 + } + }, + { + "items": [ + 9888.5, + 2.8317000865936279 + ], + "hints": { + "index": 18716 + } + }, + { + "items": [ + 9889, + 2.8234999179840088 + ], + "hints": { + "index": 18717 + } + }, + { + "items": [ + 9889.5, + 2.7596 + ], + "hints": { + "index": 18718 + } + }, + { + "items": [ + 9890, + 2.8039999008178711 + ], + "hints": { + "index": 18719 + } + }, + { + "items": [ + 9890.5, + 2.7794 + ], + "hints": { + "index": 18720 + } + }, + { + "items": [ + 9891, + 2.7899 + ], + "hints": { + "index": 18721 + } + }, + { + "items": [ + 9891.5, + 2.6012 + ], + "hints": { + "index": 18722 + } + }, + { + "items": [ + 9892, + 2.6272 + ], + "hints": { + "index": 18723 + } + }, + { + "items": [ + 9892.5, + 2.5937 + ], + "hints": { + "index": 18724 + } + }, + { + "items": [ + 9893, + 2.6286 + ], + "hints": { + "index": 18725 + } + }, + { + "items": [ + 9893.5, + 2.6119 + ], + "hints": { + "index": 18726 + } + }, + { + "items": [ + 9894, + 2.5619 + ], + "hints": { + "index": 18727 + } + }, + { + "items": [ + 9894.5, + 2.5827 + ], + "hints": { + "index": 18728 + } + }, + { + "items": [ + 9895, + 2.5293 + ], + "hints": { + "index": 18729 + } + }, + { + "items": [ + 9895.5, + 2.6133999824523926 + ], + "hints": { + "index": 18730 + } + }, + { + "items": [ + 9896, + 2.7063999176025391 + ], + "hints": { + "index": 18731 + } + }, + { + "items": [ + 9896.5, + 2.8073999881744385 + ], + "hints": { + "index": 18732 + } + }, + { + "items": [ + 9897, + 2.7846999168395996 + ], + "hints": { + "index": 18733 + } + }, + { + "items": [ + 9897.5, + 2.7492001056671143 + ], + "hints": { + "index": 18734 + } + }, + { + "items": [ + 9898, + 2.8512 + ], + "hints": { + "index": 18735 + } + }, + { + "items": [ + 9898.5, + 2.9022998809814453 + ], + "hints": { + "index": 18736 + } + }, + { + "items": [ + 9899, + 2.9667 + ], + "hints": { + "index": 18737 + } + }, + { + "items": [ + 9899.5, + 2.8517 + ], + "hints": { + "index": 18738 + } + }, + { + "items": [ + 9900, + 2.8539 + ], + "hints": { + "index": 18739 + } + }, + { + "items": [ + 9900.5, + 2.7716 + ], + "hints": { + "index": 18740 + } + }, + { + "items": [ + 9901, + 2.7174 + ], + "hints": { + "index": 18741 + } + }, + { + "items": [ + 9901.5, + 2.7389 + ], + "hints": { + "index": 18742 + } + }, + { + "items": [ + 9902, + 2.7995 + ], + "hints": { + "index": 18743 + } + }, + { + "items": [ + 9902.5, + 2.887 + ], + "hints": { + "index": 18744 + } + }, + { + "items": [ + 9903, + 2.8089 + ], + "hints": { + "index": 18745 + } + }, + { + "items": [ + 9903.5, + 2.67 + ], + "hints": { + "index": 18746 + } + }, + { + "items": [ + 9904, + 2.6020998954772949 + ], + "hints": { + "index": 18747 + } + }, + { + "items": [ + 9904.5, + 2.6933 + ], + "hints": { + "index": 18748 + } + }, + { + "items": [ + 9905, + 2.7221999168395996 + ], + "hints": { + "index": 18749 + } + }, + { + "items": [ + 9905.5, + 2.7613999843597412 + ], + "hints": { + "index": 18750 + } + }, + { + "items": [ + 9906, + 2.8794000148773193 + ], + "hints": { + "index": 18751 + } + }, + { + "items": [ + 9906.5, + 2.9618000984191895 + ], + "hints": { + "index": 18752 + } + }, + { + "items": [ + 9907, + 2.9660000801086426 + ], + "hints": { + "index": 18753 + } + }, + { + "items": [ + 9907.5, + 2.832 + ], + "hints": { + "index": 18754 + } + }, + { + "items": [ + 9908, + 2.7997 + ], + "hints": { + "index": 18755 + } + }, + { + "items": [ + 9908.5, + 2.8084 + ], + "hints": { + "index": 18756 + } + }, + { + "items": [ + 9909, + 2.8538 + ], + "hints": { + "index": 18757 + } + }, + { + "items": [ + 9909.5, + 2.7715001106262207 + ], + "hints": { + "index": 18758 + } + }, + { + "items": [ + 9910, + 2.7506999969482422 + ], + "hints": { + "index": 18759 + } + }, + { + "items": [ + 9910.5, + 2.6711 + ], + "hints": { + "index": 18760 + } + }, + { + "items": [ + 9911, + 2.6640000343322754 + ], + "hints": { + "index": 18761 + } + }, + { + "items": [ + 9911.5, + 2.6359999179840088 + ], + "hints": { + "index": 18762 + } + }, + { + "items": [ + 9912, + 2.6522 + ], + "hints": { + "index": 18763 + } + }, + { + "items": [ + 9912.5, + 2.6354999542236328 + ], + "hints": { + "index": 18764 + } + }, + { + "items": [ + 9913, + 2.5929999351501465 + ], + "hints": { + "index": 18765 + } + }, + { + "items": [ + 9913.5, + 2.5843 + ], + "hints": { + "index": 18766 + } + }, + { + "items": [ + 9914, + 2.60260009765625 + ], + "hints": { + "index": 18767 + } + }, + { + "items": [ + 9914.5, + 2.6334 + ], + "hints": { + "index": 18768 + } + }, + { + "items": [ + 9915, + 2.7553000450134277 + ], + "hints": { + "index": 18769 + } + }, + { + "items": [ + 9915.5, + 3.0302 + ], + "hints": { + "index": 18770 + } + }, + { + "items": [ + 9916, + 3.250999927520752 + ], + "hints": { + "index": 18771 + } + }, + { + "items": [ + 9916.5, + 3.1875 + ], + "hints": { + "index": 18772 + } + }, + { + "items": [ + 9917, + 2.957 + ], + "hints": { + "index": 18773 + } + }, + { + "items": [ + 9917.5, + 2.8145999908447266 + ], + "hints": { + "index": 18774 + } + }, + { + "items": [ + 9918, + 2.7132000923156734 + ], + "hints": { + "index": 18775 + } + }, + { + "items": [ + 9918.5, + 2.7469 + ], + "hints": { + "index": 18776 + } + }, + { + "items": [ + 9919, + 2.7353000640869141 + ], + "hints": { + "index": 18777 + } + }, + { + "items": [ + 9919.5, + 2.7339000701904297 + ], + "hints": { + "index": 18778 + } + }, + { + "items": [ + 9920, + 2.6916999816894531 + ], + "hints": { + "index": 18779 + } + }, + { + "items": [ + 9920.5, + 2.9005000591278076 + ], + "hints": { + "index": 18780 + } + }, + { + "items": [ + 9921, + 3.0343 + ], + "hints": { + "index": 18781 + } + }, + { + "items": [ + 9921.5, + 2.9588 + ], + "hints": { + "index": 18782 + } + }, + { + "items": [ + 9922, + 2.7173 + ], + "hints": { + "index": 18783 + } + }, + { + "items": [ + 9922.5, + 2.6226 + ], + "hints": { + "index": 18784 + } + }, + { + "items": [ + 9923, + 2.6619999408721924 + ], + "hints": { + "index": 18785 + } + }, + { + "items": [ + 9923.5, + 2.758699893951416 + ], + "hints": { + "index": 18786 + } + }, + { + "items": [ + 9924, + 2.9124000072479248 + ], + "hints": { + "index": 18787 + } + }, + { + "items": [ + 9924.5, + 2.8842999935150142 + ], + "hints": { + "index": 18788 + } + }, + { + "items": [ + 9925, + 2.8341999053955078 + ], + "hints": { + "index": 18789 + } + }, + { + "items": [ + 9925.5, + 2.624 + ], + "hints": { + "index": 18790 + } + }, + { + "items": [ + 9926, + 2.6566998958587646 + ], + "hints": { + "index": 18791 + } + }, + { + "items": [ + 9926.5, + 2.6617000102996826 + ], + "hints": { + "index": 18792 + } + }, + { + "items": [ + 9927, + 2.7867 + ], + "hints": { + "index": 18793 + } + }, + { + "items": [ + 9927.5, + 2.7515 + ], + "hints": { + "index": 18794 + } + }, + { + "items": [ + 9928, + 2.8131 + ], + "hints": { + "index": 18795 + } + }, + { + "items": [ + 9928.5, + 3.0084 + ], + "hints": { + "index": 18796 + } + }, + { + "items": [ + 9929, + 3.0959000587463379 + ], + "hints": { + "index": 18797 + } + }, + { + "items": [ + 9929.5, + 3.1326 + ], + "hints": { + "index": 18798 + } + }, + { + "items": [ + 9930, + 2.8953 + ], + "hints": { + "index": 18799 + } + }, + { + "items": [ + 9930.5, + 2.8896000385284424 + ], + "hints": { + "index": 18800 + } + }, + { + "items": [ + 9931, + 2.75979995727539 + ], + "hints": { + "index": 18801 + } + }, + { + "items": [ + 9931.5, + 2.7920999526977539 + ], + "hints": { + "index": 18802 + } + }, + { + "items": [ + 9932, + 2.6786 + ], + "hints": { + "index": 18803 + } + }, + { + "items": [ + 9932.5, + 2.6928 + ], + "hints": { + "index": 18804 + } + }, + { + "items": [ + 9933, + 2.6163 + ], + "hints": { + "index": 18805 + } + }, + { + "items": [ + 9933.5, + 2.5949 + ], + "hints": { + "index": 18806 + } + }, + { + "items": [ + 9934, + 2.5848 + ], + "hints": { + "index": 18807 + } + }, + { + "items": [ + 9934.5, + 2.6191000938415527 + ], + "hints": { + "index": 18808 + } + }, + { + "items": [ + 9935, + 2.7234 + ], + "hints": { + "index": 18809 + } + }, + { + "items": [ + 9935.5, + 2.7752 + ], + "hints": { + "index": 18810 + } + }, + { + "items": [ + 9936, + 2.7197 + ], + "hints": { + "index": 18811 + } + }, + { + "items": [ + 9936.5, + 2.7211000919342041 + ], + "hints": { + "index": 18812 + } + }, + { + "items": [ + 9937, + 2.685 + ], + "hints": { + "index": 18813 + } + }, + { + "items": [ + 9937.5, + 2.8046000003814697 + ], + "hints": { + "index": 18814 + } + }, + { + "items": [ + 9938, + 2.815000057220459 + ], + "hints": { + "index": 18815 + } + }, + { + "items": [ + 9938.5, + 2.9776 + ], + "hints": { + "index": 18816 + } + }, + { + "items": [ + 9939, + 3.0183 + ], + "hints": { + "index": 18817 + } + }, + { + "items": [ + 9939.5, + 3.0424 + ], + "hints": { + "index": 18818 + } + }, + { + "items": [ + 9940, + 2.8407 + ], + "hints": { + "index": 18819 + } + }, + { + "items": [ + 9940.5, + 2.6258 + ], + "hints": { + "index": 18820 + } + }, + { + "items": [ + 9941, + 2.4569 + ], + "hints": { + "index": 18821 + } + }, + { + "items": [ + 9941.5, + 2.4188 + ], + "hints": { + "index": 18822 + } + }, + { + "items": [ + 9942, + 2.4489 + ], + "hints": { + "index": 18823 + } + }, + { + "items": [ + 9942.5, + 2.4707000255584717 + ], + "hints": { + "index": 18824 + } + }, + { + "items": [ + 9943, + 2.529400110244751 + ], + "hints": { + "index": 18825 + } + }, + { + "items": [ + 9943.5, + 2.5165998935699463 + ], + "hints": { + "index": 18826 + } + }, + { + "items": [ + 9944, + 2.6027 + ], + "hints": { + "index": 18827 + } + }, + { + "items": [ + 9944.5, + 2.6284999847412109 + ], + "hints": { + "index": 18828 + } + }, + { + "items": [ + 9945, + 2.635200023651123 + ], + "hints": { + "index": 18829 + } + }, + { + "items": [ + 9945.5, + 2.5910999774932861 + ], + "hints": { + "index": 18830 + } + }, + { + "items": [ + 9946, + 2.550800085067749 + ], + "hints": { + "index": 18831 + } + }, + { + "items": [ + 9946.5, + 2.6157999038696289 + ], + "hints": { + "index": 18832 + } + }, + { + "items": [ + 9947, + 2.6171 + ], + "hints": { + "index": 18833 + } + }, + { + "items": [ + 9947.5, + 2.67770004272461 + ], + "hints": { + "index": 18834 + } + }, + { + "items": [ + 9948, + 2.6496999263763428 + ], + "hints": { + "index": 18835 + } + }, + { + "items": [ + 9948.5, + 2.6553 + ], + "hints": { + "index": 18836 + } + }, + { + "items": [ + 9949, + 2.5748999118804932 + ], + "hints": { + "index": 18837 + } + }, + { + "items": [ + 9949.5, + 2.6068000793457031 + ], + "hints": { + "index": 18838 + } + }, + { + "items": [ + 9950, + 2.7229 + ], + "hints": { + "index": 18839 + } + }, + { + "items": [ + 9950.5, + 2.7694 + ], + "hints": { + "index": 18840 + } + }, + { + "items": [ + 9951, + 2.7989 + ], + "hints": { + "index": 18841 + } + }, + { + "items": [ + 9951.5, + 2.8358 + ], + "hints": { + "index": 18842 + } + }, + { + "items": [ + 9952, + 2.9024 + ], + "hints": { + "index": 18843 + } + }, + { + "items": [ + 9952.5, + 3.0307 + ], + "hints": { + "index": 18844 + } + }, + { + "items": [ + 9953, + 3.0494 + ], + "hints": { + "index": 18845 + } + }, + { + "items": [ + 9953.5, + 2.9954 + ], + "hints": { + "index": 18846 + } + }, + { + "items": [ + 9954, + 2.9869 + ], + "hints": { + "index": 18847 + } + }, + { + "items": [ + 9954.5, + 2.9329 + ], + "hints": { + "index": 18848 + } + }, + { + "items": [ + 9955, + 2.8231 + ], + "hints": { + "index": 18849 + } + }, + { + "items": [ + 9955.5, + 2.7038 + ], + "hints": { + "index": 18850 + } + }, + { + "items": [ + 9956, + 2.6508 + ], + "hints": { + "index": 18851 + } + }, + { + "items": [ + 9956.5, + 2.6477 + ], + "hints": { + "index": 18852 + } + }, + { + "items": [ + 9957, + 2.6509 + ], + "hints": { + "index": 18853 + } + }, + { + "items": [ + 9957.5, + 2.678 + ], + "hints": { + "index": 18854 + } + }, + { + "items": [ + 9958, + 2.7629001140594478 + ], + "hints": { + "index": 18855 + } + }, + { + "items": [ + 9958.5, + 2.73799991607666 + ], + "hints": { + "index": 18856 + } + }, + { + "items": [ + 9959, + 2.6196000576019287 + ], + "hints": { + "index": 18857 + } + }, + { + "items": [ + 9959.5, + 2.6308000087738037 + ], + "hints": { + "index": 18858 + } + }, + { + "items": [ + 9960, + 2.5666000843048096 + ], + "hints": { + "index": 18859 + } + }, + { + "items": [ + 9960.5, + 2.7014000415802 + ], + "hints": { + "index": 18860 + } + }, + { + "items": [ + 9961, + 2.7265000343322754 + ], + "hints": { + "index": 18861 + } + }, + { + "items": [ + 9961.5, + 2.8715000152587891 + ], + "hints": { + "index": 18862 + } + }, + { + "items": [ + 9962, + 2.834399938583374 + ], + "hints": { + "index": 18863 + } + }, + { + "items": [ + 9962.5, + 2.9295001029968266 + ], + "hints": { + "index": 18864 + } + }, + { + "items": [ + 9963, + 3.1537001132965088 + ], + "hints": { + "index": 18865 + } + }, + { + "items": [ + 9963.5, + 3.1988999843597412 + ], + "hints": { + "index": 18866 + } + }, + { + "items": [ + 9964, + 2.9983999729156494 + ], + "hints": { + "index": 18867 + } + }, + { + "items": [ + 9964.5, + 2.7867000102996826 + ], + "hints": { + "index": 18868 + } + }, + { + "items": [ + 9965, + 2.7130999565124512 + ], + "hints": { + "index": 18869 + } + }, + { + "items": [ + 9965.5, + 2.7084999084472656 + ], + "hints": { + "index": 18870 + } + }, + { + "items": [ + 9966, + 2.6466999053955078 + ], + "hints": { + "index": 18871 + } + }, + { + "items": [ + 9966.5, + 2.6180999279022217 + ], + "hints": { + "index": 18872 + } + }, + { + "items": [ + 9967, + 2.6096000671386719 + ], + "hints": { + "index": 18873 + } + }, + { + "items": [ + 9967.5, + 2.6663000583648682 + ], + "hints": { + "index": 18874 + } + }, + { + "items": [ + 9968, + 2.697700023651123 + ], + "hints": { + "index": 18875 + } + }, + { + "items": [ + 9968.5, + 2.646899938583374 + ], + "hints": { + "index": 18876 + } + }, + { + "items": [ + 9969, + 2.5910000801086426 + ], + "hints": { + "index": 18877 + } + }, + { + "items": [ + 9969.5, + 2.6226999759674072 + ], + "hints": { + "index": 18878 + } + }, + { + "items": [ + 9970, + 2.646399974822998 + ], + "hints": { + "index": 18879 + } + }, + { + "items": [ + 9970.5, + 2.6781001091003418 + ], + "hints": { + "index": 18880 + } + }, + { + "items": [ + 9971, + 2.6050000190734863 + ], + "hints": { + "index": 18881 + } + }, + { + "items": [ + 9971.5, + 2.6303000450134277 + ], + "hints": { + "index": 18882 + } + }, + { + "items": [ + 9972, + 2.5427000522613525 + ], + "hints": { + "index": 18883 + } + }, + { + "items": [ + 9972.5, + 2.62719988822937 + ], + "hints": { + "index": 18884 + } + }, + { + "items": [ + 9973, + 2.6435999870300293 + ], + "hints": { + "index": 18885 + } + }, + { + "items": [ + 9973.5, + 2.7046000957489018 + ], + "hints": { + "index": 18886 + } + }, + { + "items": [ + 9974, + 2.6154000759124756 + ], + "hints": { + "index": 18887 + } + }, + { + "items": [ + 9974.5, + 2.5794000625610352 + ], + "hints": { + "index": 18888 + } + }, + { + "items": [ + 9975, + 2.6940999031066895 + ], + "hints": { + "index": 18889 + } + }, + { + "items": [ + 9975.5, + 2.6686000823974609 + ], + "hints": { + "index": 18890 + } + }, + { + "items": [ + 9976, + 2.7035999298095703 + ], + "hints": { + "index": 18891 + } + }, + { + "items": [ + 9976.5, + 2.663000106811523 + ], + "hints": { + "index": 18892 + } + }, + { + "items": [ + 9977, + 2.7946000099182129 + ], + "hints": { + "index": 18893 + } + }, + { + "items": [ + 9977.5, + 2.7678000926971436 + ], + "hints": { + "index": 18894 + } + }, + { + "items": [ + 9978, + 2.6607999801635742 + ], + "hints": { + "index": 18895 + } + }, + { + "items": [ + 9978.5, + 2.5480000972747803 + ], + "hints": { + "index": 18896 + } + }, + { + "items": [ + 9979, + 2.6222000122070313 + ], + "hints": { + "index": 18897 + } + }, + { + "items": [ + 9979.5, + 2.7053000926971436 + ], + "hints": { + "index": 18898 + } + }, + { + "items": [ + 9980, + 2.6963999271392822 + ], + "hints": { + "index": 18899 + } + }, + { + "items": [ + 9980.5, + 2.6284999847412109 + ], + "hints": { + "index": 18900 + } + }, + { + "items": [ + 9981, + 2.6802999973297119 + ], + "hints": { + "index": 18901 + } + }, + { + "items": [ + 9981.5, + 2.7676999568939209 + ], + "hints": { + "index": 18902 + } + }, + { + "items": [ + 9982, + 2.8568999767303467 + ], + "hints": { + "index": 18903 + } + }, + { + "items": [ + 9982.5, + 2.8422000408172607 + ], + "hints": { + "index": 18904 + } + }, + { + "items": [ + 9983, + 2.8336999416351318 + ], + "hints": { + "index": 18905 + } + }, + { + "items": [ + 9983.5, + 2.7869000434875488 + ], + "hints": { + "index": 18906 + } + }, + { + "items": [ + 9984, + 2.6881000995635982 + ], + "hints": { + "index": 18907 + } + }, + { + "items": [ + 9984.5, + 2.8141999244689941 + ], + "hints": { + "index": 18908 + } + }, + { + "items": [ + 9985, + 2.9635000228881836 + ], + "hints": { + "index": 18909 + } + }, + { + "items": [ + 9985.5, + 3.0637 + ], + "hints": { + "index": 18910 + } + }, + { + "items": [ + 9986, + 2.872499942779541 + ], + "hints": { + "index": 18911 + } + }, + { + "items": [ + 9986.5, + 2.7504 + ], + "hints": { + "index": 18912 + } + }, + { + "items": [ + 9987, + 2.7571 + ], + "hints": { + "index": 18913 + } + }, + { + "items": [ + 9987.5, + 2.777 + ], + "hints": { + "index": 18914 + } + }, + { + "items": [ + 9988, + 2.7736 + ], + "hints": { + "index": 18915 + } + }, + { + "items": [ + 9988.5, + 2.6546 + ], + "hints": { + "index": 18916 + } + }, + { + "items": [ + 9989, + 2.7232 + ], + "hints": { + "index": 18917 + } + }, + { + "items": [ + 9989.5, + 2.7576 + ], + "hints": { + "index": 18918 + } + }, + { + "items": [ + 9990, + 2.8420999050140381 + ], + "hints": { + "index": 18919 + } + }, + { + "items": [ + 9990.5, + 2.8631999492645264 + ], + "hints": { + "index": 18920 + } + }, + { + "items": [ + 9991, + 2.861799955368042 + ], + "hints": { + "index": 18921 + } + }, + { + "items": [ + 9991.5, + 3.1535999774932861 + ], + "hints": { + "index": 18922 + } + }, + { + "items": [ + 9992, + 3.1912000179290771 + ], + "hints": { + "index": 18923 + } + }, + { + "items": [ + 9992.5, + 3.1503000259399414 + ], + "hints": { + "index": 18924 + } + }, + { + "items": [ + 9993, + 2.8845000267028809 + ], + "hints": { + "index": 18925 + } + }, + { + "items": [ + 9993.5, + 2.8773999214172363 + ], + "hints": { + "index": 18926 + } + }, + { + "items": [ + 9994, + 3.1187000274658203 + ], + "hints": { + "index": 18927 + } + }, + { + "items": [ + 9994.5, + 3.2593998908996582 + ], + "hints": { + "index": 18928 + } + }, + { + "items": [ + 9995, + 3.1212999820709229 + ], + "hints": { + "index": 18929 + } + }, + { + "items": [ + 9995.5, + 2.7925000190734863 + ], + "hints": { + "index": 18930 + } + }, + { + "items": [ + 9996, + 2.5847001075744629 + ], + "hints": { + "index": 18931 + } + }, + { + "items": [ + 9996.5, + 2.5934998989105225 + ], + "hints": { + "index": 18932 + } + }, + { + "items": [ + 9997, + 2.6609001159667969 + ], + "hints": { + "index": 18933 + } + }, + { + "items": [ + 9997.5, + 2.687000036239624 + ], + "hints": { + "index": 18934 + } + }, + { + "items": [ + 9998, + 2.7476000785827637 + ], + "hints": { + "index": 18935 + } + }, + { + "items": [ + 9998.5, + 2.7588999271392822 + ], + "hints": { + "index": 18936 + } + }, + { + "items": [ + 9999, + 2.8513000011444092 + ], + "hints": { + "index": 18937 + } + }, + { + "items": [ + 9999.5, + 2.8914999961853027 + ], + "hints": { + "index": 18938 + } + }, + { + "items": [ + 10000, + 2.9932000637054443 + ], + "hints": { + "index": 18939 + } + }, + { + "items": [ + 10000.5, + 2.9709999561309814 + ], + "hints": { + "index": 18940 + } + }, + { + "items": [ + 10001, + 2.9267001152038574 + ], + "hints": { + "index": 18941 + } + }, + { + "items": [ + 10001.5, + 2.8743999004364018 + ], + "hints": { + "index": 18942 + } + }, + { + "items": [ + 10002, + 2.8705 + ], + "hints": { + "index": 18943 + } + }, + { + "items": [ + 10002.5, + 2.7728 + ], + "hints": { + "index": 18944 + } + }, + { + "items": [ + 10003, + 2.5987 + ], + "hints": { + "index": 18945 + } + }, + { + "items": [ + 10003.5, + 2.5942 + ], + "hints": { + "index": 18946 + } + }, + { + "items": [ + 10004, + 2.6022 + ], + "hints": { + "index": 18947 + } + }, + { + "items": [ + 10004.5, + 2.7877 + ], + "hints": { + "index": 18948 + } + }, + { + "items": [ + 10005, + 2.9056 + ], + "hints": { + "index": 18949 + } + }, + { + "items": [ + 10005.5, + 3.1039 + ], + "hints": { + "index": 18950 + } + }, + { + "items": [ + 10006, + 3.29010009765625 + ], + "hints": { + "index": 18951 + } + }, + { + "items": [ + 10006.5, + 3.2404 + ], + "hints": { + "index": 18952 + } + }, + { + "items": [ + 10007, + 3.1452 + ], + "hints": { + "index": 18953 + } + }, + { + "items": [ + 10007.5, + 3.1342 + ], + "hints": { + "index": 18954 + } + }, + { + "items": [ + 10008, + 3.1671 + ], + "hints": { + "index": 18955 + } + }, + { + "items": [ + 10008.5, + 3.1345 + ], + "hints": { + "index": 18956 + } + }, + { + "items": [ + 10009, + 3.1311 + ], + "hints": { + "index": 18957 + } + }, + { + "items": [ + 10009.5, + 3.0781 + ], + "hints": { + "index": 18958 + } + }, + { + "items": [ + 10010, + 2.933 + ], + "hints": { + "index": 18959 + } + }, + { + "items": [ + 10010.5, + 2.7604 + ], + "hints": { + "index": 18960 + } + }, + { + "items": [ + 10011, + 2.7677 + ], + "hints": { + "index": 18961 + } + }, + { + "items": [ + 10011.5, + 2.7685 + ], + "hints": { + "index": 18962 + } + }, + { + "items": [ + 10012, + 2.8408 + ], + "hints": { + "index": 18963 + } + }, + { + "items": [ + 10012.5, + 2.8474 + ], + "hints": { + "index": 18964 + } + }, + { + "items": [ + 10013, + 3.1197 + ], + "hints": { + "index": 18965 + } + }, + { + "items": [ + 10013.5, + 3.0972 + ], + "hints": { + "index": 18966 + } + }, + { + "items": [ + 10014, + 3.0847001075744629 + ], + "hints": { + "index": 18967 + } + }, + { + "items": [ + 10014.5, + 2.8986 + ], + "hints": { + "index": 18968 + } + }, + { + "items": [ + 10015, + 2.9576 + ], + "hints": { + "index": 18969 + } + }, + { + "items": [ + 10015.5, + 3.0079 + ], + "hints": { + "index": 18970 + } + }, + { + "items": [ + 10016, + 3.2395 + ], + "hints": { + "index": 18971 + } + }, + { + "items": [ + 10016.5, + 3.114 + ], + "hints": { + "index": 18972 + } + }, + { + "items": [ + 10017, + 2.9401 + ], + "hints": { + "index": 18973 + } + }, + { + "items": [ + 10017.5, + 2.6767 + ], + "hints": { + "index": 18974 + } + }, + { + "items": [ + 10018, + 2.7746000289916992 + ], + "hints": { + "index": 18975 + } + }, + { + "items": [ + 10018.5, + 2.9118 + ], + "hints": { + "index": 18976 + } + }, + { + "items": [ + 10019, + 2.8793 + ], + "hints": { + "index": 18977 + } + }, + { + "items": [ + 10019.5, + 2.7352 + ], + "hints": { + "index": 18978 + } + }, + { + "items": [ + 10020, + 2.6261 + ], + "hints": { + "index": 18979 + } + }, + { + "items": [ + 10020.5, + 2.6811 + ], + "hints": { + "index": 18980 + } + }, + { + "items": [ + 10021, + 2.6366 + ], + "hints": { + "index": 18981 + } + }, + { + "items": [ + 10021.5, + 2.6335 + ], + "hints": { + "index": 18982 + } + }, + { + "items": [ + 10022, + 2.5528 + ], + "hints": { + "index": 18983 + } + }, + { + "items": [ + 10022.5, + 2.5880999565124512 + ], + "hints": { + "index": 18984 + } + }, + { + "items": [ + 10023, + 2.5077 + ], + "hints": { + "index": 18985 + } + }, + { + "items": [ + 10023.5, + 2.5515 + ], + "hints": { + "index": 18986 + } + }, + { + "items": [ + 10024, + 2.5119 + ], + "hints": { + "index": 18987 + } + }, + { + "items": [ + 10024.5, + 2.529 + ], + "hints": { + "index": 18988 + } + }, + { + "items": [ + 10025, + 2.4925 + ], + "hints": { + "index": 18989 + } + }, + { + "items": [ + 10025.5, + 2.5612 + ], + "hints": { + "index": 18990 + } + }, + { + "items": [ + 10026, + 2.6767 + ], + "hints": { + "index": 18991 + } + }, + { + "items": [ + 10026.5, + 2.7495 + ], + "hints": { + "index": 18992 + } + }, + { + "items": [ + 10027, + 2.7446 + ], + "hints": { + "index": 18993 + } + }, + { + "items": [ + 10027.5, + 2.6879000663757324 + ], + "hints": { + "index": 18994 + } + }, + { + "items": [ + 10028, + 2.6886 + ], + "hints": { + "index": 18995 + } + }, + { + "items": [ + 10028.5, + 2.8362 + ], + "hints": { + "index": 18996 + } + }, + { + "items": [ + 10029, + 2.8711 + ], + "hints": { + "index": 18997 + } + }, + { + "items": [ + 10029.5, + 2.8770999908447266 + ], + "hints": { + "index": 18998 + } + }, + { + "items": [ + 10030, + 2.6761999130249023 + ], + "hints": { + "index": 18999 + } + }, + { + "items": [ + 10030.5, + 2.6282000541687012 + ], + "hints": { + "index": 19000 + } + }, + { + "items": [ + 10031, + 2.6862 + ], + "hints": { + "index": 19001 + } + }, + { + "items": [ + 10031.5, + 2.6352 + ], + "hints": { + "index": 19002 + } + }, + { + "items": [ + 10032, + 2.6366000175476074 + ], + "hints": { + "index": 19003 + } + }, + { + "items": [ + 10032.5, + 2.5341999530792236 + ], + "hints": { + "index": 19004 + } + }, + { + "items": [ + 10033, + 2.5222 + ], + "hints": { + "index": 19005 + } + }, + { + "items": [ + 10033.5, + 2.4856 + ], + "hints": { + "index": 19006 + } + }, + { + "items": [ + 10034, + 2.5336999893188477 + ], + "hints": { + "index": 19007 + } + }, + { + "items": [ + 10034.5, + 2.6194 + ], + "hints": { + "index": 19008 + } + }, + { + "items": [ + 10035, + 2.7501 + ], + "hints": { + "index": 19009 + } + }, + { + "items": [ + 10035.5, + 2.7558 + ], + "hints": { + "index": 19010 + } + }, + { + "items": [ + 10036, + 2.8139998912811279 + ], + "hints": { + "index": 19011 + } + }, + { + "items": [ + 10036.5, + 2.7663 + ], + "hints": { + "index": 19012 + } + }, + { + "items": [ + 10037, + 2.7627999782562256 + ], + "hints": { + "index": 19013 + } + }, + { + "items": [ + 10037.5, + 2.7907 + ], + "hints": { + "index": 19014 + } + }, + { + "items": [ + 10038, + 2.7592 + ], + "hints": { + "index": 19015 + } + }, + { + "items": [ + 10038.5, + 2.7070999145507813 + ], + "hints": { + "index": 19016 + } + }, + { + "items": [ + 10039, + 2.7182 + ], + "hints": { + "index": 19017 + } + }, + { + "items": [ + 10039.5, + 2.7834999561309814 + ], + "hints": { + "index": 19018 + } + }, + { + "items": [ + 10040, + 2.8218998908996582 + ], + "hints": { + "index": 19019 + } + }, + { + "items": [ + 10040.5, + 2.7437 + ], + "hints": { + "index": 19020 + } + }, + { + "items": [ + 10041, + 2.6986 + ], + "hints": { + "index": 19021 + } + }, + { + "items": [ + 10041.5, + 2.7284 + ], + "hints": { + "index": 19022 + } + }, + { + "items": [ + 10042, + 2.8251 + ], + "hints": { + "index": 19023 + } + }, + { + "items": [ + 10042.5, + 2.9825 + ], + "hints": { + "index": 19024 + } + }, + { + "items": [ + 10043, + 3.0073 + ], + "hints": { + "index": 19025 + } + }, + { + "items": [ + 10043.5, + 2.8343 + ], + "hints": { + "index": 19026 + } + }, + { + "items": [ + 10044, + 2.7190001010894775 + ], + "hints": { + "index": 19027 + } + }, + { + "items": [ + 10044.5, + 2.6054 + ], + "hints": { + "index": 19028 + } + }, + { + "items": [ + 10045, + 2.7056 + ], + "hints": { + "index": 19029 + } + }, + { + "items": [ + 10045.5, + 2.68530011177063 + ], + "hints": { + "index": 19030 + } + }, + { + "items": [ + 10046, + 2.715 + ], + "hints": { + "index": 19031 + } + }, + { + "items": [ + 10046.5, + 2.658 + ], + "hints": { + "index": 19032 + } + }, + { + "items": [ + 10047, + 2.5562000274658203 + ], + "hints": { + "index": 19033 + } + }, + { + "items": [ + 10047.5, + 2.6072 + ], + "hints": { + "index": 19034 + } + }, + { + "items": [ + 10048, + 2.6540000438690186 + ], + "hints": { + "index": 19035 + } + }, + { + "items": [ + 10048.5, + 2.6582999229431152 + ], + "hints": { + "index": 19036 + } + }, + { + "items": [ + 10049, + 2.7083 + ], + "hints": { + "index": 19037 + } + }, + { + "items": [ + 10049.5, + 2.6522 + ], + "hints": { + "index": 19038 + } + }, + { + "items": [ + 10050, + 2.6819000244140625 + ], + "hints": { + "index": 19039 + } + }, + { + "items": [ + 10050.5, + 2.638200044631958 + ], + "hints": { + "index": 19040 + } + }, + { + "items": [ + 10051, + 2.7407 + ], + "hints": { + "index": 19041 + } + }, + { + "items": [ + 10051.5, + 2.7727 + ], + "hints": { + "index": 19042 + } + }, + { + "items": [ + 10052, + 2.7509000301361084 + ], + "hints": { + "index": 19043 + } + }, + { + "items": [ + 10052.5, + 2.6246 + ], + "hints": { + "index": 19044 + } + }, + { + "items": [ + 10053, + 2.6423 + ], + "hints": { + "index": 19045 + } + }, + { + "items": [ + 10053.5, + 2.6636 + ], + "hints": { + "index": 19046 + } + }, + { + "items": [ + 10054, + 2.6139 + ], + "hints": { + "index": 19047 + } + }, + { + "items": [ + 10054.5, + 2.6166000366210938 + ], + "hints": { + "index": 19048 + } + }, + { + "items": [ + 10055, + 2.6540000438690186 + ], + "hints": { + "index": 19049 + } + }, + { + "items": [ + 10055.5, + 2.7637999057769775 + ], + "hints": { + "index": 19050 + } + }, + { + "items": [ + 10056, + 2.8164999485015869 + ], + "hints": { + "index": 19051 + } + }, + { + "items": [ + 10056.5, + 2.6872000694274902 + ], + "hints": { + "index": 19052 + } + }, + { + "items": [ + 10057, + 2.5969 + ], + "hints": { + "index": 19053 + } + }, + { + "items": [ + 10057.5, + 2.5594000816345215 + ], + "hints": { + "index": 19054 + } + }, + { + "items": [ + 10058, + 2.807499885559082 + ], + "hints": { + "index": 19055 + } + }, + { + "items": [ + 10058.5, + 3.2177999019622803 + ], + "hints": { + "index": 19056 + } + }, + { + "items": [ + 10059, + 3.4288 + ], + "hints": { + "index": 19057 + } + }, + { + "items": [ + 10059.5, + 3.19320011138916 + ], + "hints": { + "index": 19058 + } + }, + { + "items": [ + 10060, + 3.0088000297546387 + ], + "hints": { + "index": 19059 + } + }, + { + "items": [ + 10060.5, + 2.8331999778747559 + ], + "hints": { + "index": 19060 + } + }, + { + "items": [ + 10061, + 2.8640000820159912 + ], + "hints": { + "index": 19061 + } + }, + { + "items": [ + 10061.5, + 2.7602999210357666 + ], + "hints": { + "index": 19062 + } + }, + { + "items": [ + 10062, + 2.6858000755310059 + ], + "hints": { + "index": 19063 + } + }, + { + "items": [ + 10062.5, + 2.6487998962402344 + ], + "hints": { + "index": 19064 + } + }, + { + "items": [ + 10063, + 2.6246 + ], + "hints": { + "index": 19065 + } + }, + { + "items": [ + 10063.5, + 2.7492001056671143 + ], + "hints": { + "index": 19066 + } + }, + { + "items": [ + 10064, + 2.8066999912261963 + ], + "hints": { + "index": 19067 + } + }, + { + "items": [ + 10064.5, + 2.8396000862121582 + ], + "hints": { + "index": 19068 + } + }, + { + "items": [ + 10065, + 2.7107999324798584 + ], + "hints": { + "index": 19069 + } + }, + { + "items": [ + 10065.5, + 2.7170999050140381 + ], + "hints": { + "index": 19070 + } + }, + { + "items": [ + 10066, + 2.7170000076293945 + ], + "hints": { + "index": 19071 + } + }, + { + "items": [ + 10066.5, + 2.8722000122070313 + ], + "hints": { + "index": 19072 + } + }, + { + "items": [ + 10067, + 2.7750999927520752 + ], + "hints": { + "index": 19073 + } + }, + { + "items": [ + 10067.5, + 2.8004000186920166 + ], + "hints": { + "index": 19074 + } + }, + { + "items": [ + 10068, + 2.729700088500977 + ], + "hints": { + "index": 19075 + } + }, + { + "items": [ + 10068.5, + 2.8408000469207764 + ], + "hints": { + "index": 19076 + } + }, + { + "items": [ + 10069, + 2.7679998874664307 + ], + "hints": { + "index": 19077 + } + }, + { + "items": [ + 10069.5, + 2.7309999465942383 + ], + "hints": { + "index": 19078 + } + }, + { + "items": [ + 10070, + 2.6175000667572021 + ], + "hints": { + "index": 19079 + } + }, + { + "items": [ + 10070.5, + 2.6951000690460205 + ], + "hints": { + "index": 19080 + } + }, + { + "items": [ + 10071, + 2.8622000217437744 + ], + "hints": { + "index": 19081 + } + }, + { + "items": [ + 10071.5, + 2.970599889755249 + ], + "hints": { + "index": 19082 + } + }, + { + "items": [ + 10072, + 2.9760000705718994 + ], + "hints": { + "index": 19083 + } + }, + { + "items": [ + 10072.5, + 2.880000114440918 + ], + "hints": { + "index": 19084 + } + }, + { + "items": [ + 10073, + 2.8448998928070068 + ], + "hints": { + "index": 19085 + } + }, + { + "items": [ + 10073.5, + 2.8526999950408936 + ], + "hints": { + "index": 19086 + } + }, + { + "items": [ + 10074, + 2.8849999904632568 + ], + "hints": { + "index": 19087 + } + }, + { + "items": [ + 10074.5, + 2.81820011138916 + ], + "hints": { + "index": 19088 + } + }, + { + "items": [ + 10075, + 2.8155999183654785 + ], + "hints": { + "index": 19089 + } + }, + { + "items": [ + 10075.5, + 2.7639999389648442 + ], + "hints": { + "index": 19090 + } + }, + { + "items": [ + 10076, + 2.7543001174926758 + ], + "hints": { + "index": 19091 + } + }, + { + "items": [ + 10076.5, + 2.7328000068664551 + ], + "hints": { + "index": 19092 + } + }, + { + "items": [ + 10077, + 2.6861999034881592 + ], + "hints": { + "index": 19093 + } + }, + { + "items": [ + 10077.5, + 2.7801001071929932 + ], + "hints": { + "index": 19094 + } + }, + { + "items": [ + 10078, + 2.8406999111175537 + ], + "hints": { + "index": 19095 + } + }, + { + "items": [ + 10078.5, + 2.9063000679016113 + ], + "hints": { + "index": 19096 + } + }, + { + "items": [ + 10079, + 2.8833000659942627 + ], + "hints": { + "index": 19097 + } + }, + { + "items": [ + 10079.5, + 2.8106000423431396 + ], + "hints": { + "index": 19098 + } + }, + { + "items": [ + 10080, + 2.7730998992919922 + ], + "hints": { + "index": 19099 + } + }, + { + "items": [ + 10080.5, + 2.703200101852417 + ], + "hints": { + "index": 19100 + } + }, + { + "items": [ + 10081, + 2.6628000736236572 + ], + "hints": { + "index": 19101 + } + }, + { + "items": [ + 10081.5, + 2.6951000690460205 + ], + "hints": { + "index": 19102 + } + }, + { + "items": [ + 10082, + 2.7116000652313232 + ], + "hints": { + "index": 19103 + } + }, + { + "items": [ + 10082.5, + 2.6628000736236572 + ], + "hints": { + "index": 19104 + } + }, + { + "items": [ + 10083, + 2.612299919128418 + ], + "hints": { + "index": 19105 + } + }, + { + "items": [ + 10083.5, + 2.6480998992919922 + ], + "hints": { + "index": 19106 + } + }, + { + "items": [ + 10084, + 2.7097001075744629 + ], + "hints": { + "index": 19107 + } + }, + { + "items": [ + 10084.5, + 2.6967000961303711 + ], + "hints": { + "index": 19108 + } + }, + { + "items": [ + 10085, + 2.6451001167297363 + ], + "hints": { + "index": 19109 + } + }, + { + "items": [ + 10085.5, + 2.5529999732971191 + ], + "hints": { + "index": 19110 + } + }, + { + "items": [ + 10086, + 2.5160000324249268 + ], + "hints": { + "index": 19111 + } + }, + { + "items": [ + 10086.5, + 2.41729998588562 + ], + "hints": { + "index": 19112 + } + }, + { + "items": [ + 10087, + 2.4605998992919922 + ], + "hints": { + "index": 19113 + } + }, + { + "items": [ + 10087.5, + 2.54040002822876 + ], + "hints": { + "index": 19114 + } + }, + { + "items": [ + 10088, + 2.6048998832702637 + ], + "hints": { + "index": 19115 + } + }, + { + "items": [ + 10088.5, + 2.6984999179840088 + ], + "hints": { + "index": 19116 + } + }, + { + "items": [ + 10089, + 2.6771 + ], + "hints": { + "index": 19117 + } + }, + { + "items": [ + 10089.5, + 2.7782 + ], + "hints": { + "index": 19118 + } + }, + { + "items": [ + 10090, + 2.6317 + ], + "hints": { + "index": 19119 + } + }, + { + "items": [ + 10090.5, + 2.5905 + ], + "hints": { + "index": 19120 + } + }, + { + "items": [ + 10091, + 2.5312 + ], + "hints": { + "index": 19121 + } + }, + { + "items": [ + 10091.5, + 2.6479 + ], + "hints": { + "index": 19122 + } + }, + { + "items": [ + 10092, + 2.5875 + ], + "hints": { + "index": 19123 + } + }, + { + "items": [ + 10092.5, + 2.6693 + ], + "hints": { + "index": 19124 + } + }, + { + "items": [ + 10093, + 2.6938 + ], + "hints": { + "index": 19125 + } + }, + { + "items": [ + 10093.5, + 2.7373 + ], + "hints": { + "index": 19126 + } + }, + { + "items": [ + 10094, + 2.5998 + ], + "hints": { + "index": 19127 + } + }, + { + "items": [ + 10094.5, + 2.5316 + ], + "hints": { + "index": 19128 + } + }, + { + "items": [ + 10095, + 2.5652 + ], + "hints": { + "index": 19129 + } + }, + { + "items": [ + 10095.5, + 2.5666 + ], + "hints": { + "index": 19130 + } + }, + { + "items": [ + 10096, + 2.548 + ], + "hints": { + "index": 19131 + } + }, + { + "items": [ + 10096.5, + 2.5066 + ], + "hints": { + "index": 19132 + } + }, + { + "items": [ + 10097, + 2.5387 + ], + "hints": { + "index": 19133 + } + }, + { + "items": [ + 10097.5, + 2.4734 + ], + "hints": { + "index": 19134 + } + }, + { + "items": [ + 10098, + 2.4772 + ], + "hints": { + "index": 19135 + } + }, + { + "items": [ + 10098.5, + 2.5128 + ], + "hints": { + "index": 19136 + } + }, + { + "items": [ + 10099, + 2.4731 + ], + "hints": { + "index": 19137 + } + }, + { + "items": [ + 10099.5, + 2.4648 + ], + "hints": { + "index": 19138 + } + }, + { + "items": [ + 10100, + 2.4233 + ], + "hints": { + "index": 19139 + } + }, + { + "items": [ + 10100.5, + 2.5322 + ], + "hints": { + "index": 19140 + } + }, + { + "items": [ + 10101, + 2.5554 + ], + "hints": { + "index": 19141 + } + }, + { + "items": [ + 10101.5, + 2.5073 + ], + "hints": { + "index": 19142 + } + }, + { + "items": [ + 10102, + 2.4126 + ], + "hints": { + "index": 19143 + } + }, + { + "items": [ + 10102.5, + 2.4709 + ], + "hints": { + "index": 19144 + } + }, + { + "items": [ + 10103, + 2.5761 + ], + "hints": { + "index": 19145 + } + }, + { + "items": [ + 10103.5, + 2.7044 + ], + "hints": { + "index": 19146 + } + }, + { + "items": [ + 10104, + 2.5736 + ], + "hints": { + "index": 19147 + } + }, + { + "items": [ + 10104.5, + 2.4909 + ], + "hints": { + "index": 19148 + } + }, + { + "items": [ + 10105, + 2.4468 + ], + "hints": { + "index": 19149 + } + }, + { + "items": [ + 10105.5, + 2.4135 + ], + "hints": { + "index": 19150 + } + }, + { + "items": [ + 10106, + 2.4301 + ], + "hints": { + "index": 19151 + } + }, + { + "items": [ + 10106.5, + 2.4894 + ], + "hints": { + "index": 19152 + } + }, + { + "items": [ + 10107, + 2.6342 + ], + "hints": { + "index": 19153 + } + }, + { + "items": [ + 10107.5, + 2.6913 + ], + "hints": { + "index": 19154 + } + }, + { + "items": [ + 10108, + 2.6671 + ], + "hints": { + "index": 19155 + } + }, + { + "items": [ + 10108.5, + 2.6262 + ], + "hints": { + "index": 19156 + } + }, + { + "items": [ + 10109, + 2.5407 + ], + "hints": { + "index": 19157 + } + }, + { + "items": [ + 10109.5, + 2.5296 + ], + "hints": { + "index": 19158 + } + }, + { + "items": [ + 10110, + 2.588 + ], + "hints": { + "index": 19159 + } + }, + { + "items": [ + 10110.5, + 2.6425 + ], + "hints": { + "index": 19160 + } + }, + { + "items": [ + 10111, + 2.652 + ], + "hints": { + "index": 19161 + } + }, + { + "items": [ + 10111.5, + 2.5798 + ], + "hints": { + "index": 19162 + } + }, + { + "items": [ + 10112, + 2.5167 + ], + "hints": { + "index": 19163 + } + }, + { + "items": [ + 10112.5, + 2.4311 + ], + "hints": { + "index": 19164 + } + }, + { + "items": [ + 10113, + 2.4892 + ], + "hints": { + "index": 19165 + } + }, + { + "items": [ + 10113.5, + 2.4985 + ], + "hints": { + "index": 19166 + } + }, + { + "items": [ + 10114, + 2.4805 + ], + "hints": { + "index": 19167 + } + }, + { + "items": [ + 10114.5, + 2.4607 + ], + "hints": { + "index": 19168 + } + }, + { + "items": [ + 10115, + 2.453 + ], + "hints": { + "index": 19169 + } + }, + { + "items": [ + 10115.5, + 2.5083 + ], + "hints": { + "index": 19170 + } + }, + { + "items": [ + 10116, + 2.4761 + ], + "hints": { + "index": 19171 + } + }, + { + "items": [ + 10116.5, + 2.525 + ], + "hints": { + "index": 19172 + } + }, + { + "items": [ + 10117, + 2.4876 + ], + "hints": { + "index": 19173 + } + }, + { + "items": [ + 10117.5, + 2.4729 + ], + "hints": { + "index": 19174 + } + }, + { + "items": [ + 10118, + 2.4969 + ], + "hints": { + "index": 19175 + } + }, + { + "items": [ + 10118.5, + 2.5599 + ], + "hints": { + "index": 19176 + } + }, + { + "items": [ + 10119, + 2.5002 + ], + "hints": { + "index": 19177 + } + }, + { + "items": [ + 10119.5, + 2.4852 + ], + "hints": { + "index": 19178 + } + }, + { + "items": [ + 10120, + 2.4481 + ], + "hints": { + "index": 19179 + } + }, + { + "items": [ + 10120.5, + 2.5726 + ], + "hints": { + "index": 19180 + } + }, + { + "items": [ + 10121, + 2.6018 + ], + "hints": { + "index": 19181 + } + }, + { + "items": [ + 10121.5, + 2.6078 + ], + "hints": { + "index": 19182 + } + }, + { + "items": [ + 10122, + 2.54 + ], + "hints": { + "index": 19183 + } + }, + { + "items": [ + 10122.5, + 2.5382 + ], + "hints": { + "index": 19184 + } + }, + { + "items": [ + 10123, + 2.5828 + ], + "hints": { + "index": 19185 + } + }, + { + "items": [ + 10123.5, + 2.6965999603271484 + ], + "hints": { + "index": 19186 + } + }, + { + "items": [ + 10124, + 2.7646000385284424 + ], + "hints": { + "index": 19187 + } + }, + { + "items": [ + 10124.5, + 2.7392001152038574 + ], + "hints": { + "index": 19188 + } + }, + { + "items": [ + 10125, + 2.6665999889373779 + ], + "hints": { + "index": 19189 + } + }, + { + "items": [ + 10125.5, + 2.6902999877929688 + ], + "hints": { + "index": 19190 + } + }, + { + "items": [ + 10126, + 2.8350999355316162 + ], + "hints": { + "index": 19191 + } + }, + { + "items": [ + 10126.5, + 2.8508999347686768 + ], + "hints": { + "index": 19192 + } + }, + { + "items": [ + 10127, + 2.8097000122070313 + ], + "hints": { + "index": 19193 + } + }, + { + "items": [ + 10127.5, + 2.7234001159667969 + ], + "hints": { + "index": 19194 + } + }, + { + "items": [ + 10128, + 2.6958999633789063 + ], + "hints": { + "index": 19195 + } + }, + { + "items": [ + 10128.5, + 2.619999885559082 + ], + "hints": { + "index": 19196 + } + }, + { + "items": [ + 10129, + 2.7486999034881592 + ], + "hints": { + "index": 19197 + } + }, + { + "items": [ + 10129.5, + 2.874500036239624 + ], + "hints": { + "index": 19198 + } + }, + { + "items": [ + 10130, + 2.9730000495910645 + ], + "hints": { + "index": 19199 + } + }, + { + "items": [ + 10130.5, + 3.16129994392395 + ], + "hints": { + "index": 19200 + } + }, + { + "items": [ + 10131, + 3.1405999660491943 + ], + "hints": { + "index": 19201 + } + }, + { + "items": [ + 10131.5, + 2.9637 + ], + "hints": { + "index": 19202 + } + }, + { + "items": [ + 10132, + 2.6462 + ], + "hints": { + "index": 19203 + } + }, + { + "items": [ + 10132.5, + 2.5625 + ], + "hints": { + "index": 19204 + } + }, + { + "items": [ + 10133, + 2.5027000904083252 + ], + "hints": { + "index": 19205 + } + }, + { + "items": [ + 10133.5, + 2.6034 + ], + "hints": { + "index": 19206 + } + }, + { + "items": [ + 10134, + 2.6145999431610107 + ], + "hints": { + "index": 19207 + } + }, + { + "items": [ + 10134.5, + 2.6891000270843506 + ], + "hints": { + "index": 19208 + } + }, + { + "items": [ + 10135, + 2.6428 + ], + "hints": { + "index": 19209 + } + }, + { + "items": [ + 10135.5, + 2.6559998989105225 + ], + "hints": { + "index": 19210 + } + }, + { + "items": [ + 10136, + 2.666 + ], + "hints": { + "index": 19211 + } + }, + { + "items": [ + 10136.5, + 2.6716 + ], + "hints": { + "index": 19212 + } + }, + { + "items": [ + 10137, + 2.6856 + ], + "hints": { + "index": 19213 + } + }, + { + "items": [ + 10137.5, + 2.7472999095916748 + ], + "hints": { + "index": 19214 + } + }, + { + "items": [ + 10138, + 2.7637 + ], + "hints": { + "index": 19215 + } + }, + { + "items": [ + 10138.5, + 2.7344999313354492 + ], + "hints": { + "index": 19216 + } + }, + { + "items": [ + 10139, + 2.8158 + ], + "hints": { + "index": 19217 + } + }, + { + "items": [ + 10139.5, + 2.8714001178741455 + ], + "hints": { + "index": 19218 + } + }, + { + "items": [ + 10140, + 2.7536 + ], + "hints": { + "index": 19219 + } + }, + { + "items": [ + 10140.5, + 2.5859000682830811 + ], + "hints": { + "index": 19220 + } + }, + { + "items": [ + 10141, + 2.5085000991821289 + ], + "hints": { + "index": 19221 + } + }, + { + "items": [ + 10141.5, + 2.6068000793457031 + ], + "hints": { + "index": 19222 + } + }, + { + "items": [ + 10142, + 2.7406001091003418 + ], + "hints": { + "index": 19223 + } + }, + { + "items": [ + 10142.5, + 2.8691999912261963 + ], + "hints": { + "index": 19224 + } + }, + { + "items": [ + 10143, + 2.9583001136779785 + ], + "hints": { + "index": 19225 + } + }, + { + "items": [ + 10143.5, + 2.9174 + ], + "hints": { + "index": 19226 + } + }, + { + "items": [ + 10144, + 2.8971 + ], + "hints": { + "index": 19227 + } + }, + { + "items": [ + 10144.5, + 2.8347001075744629 + ], + "hints": { + "index": 19228 + } + }, + { + "items": [ + 10145, + 2.9079000949859619 + ], + "hints": { + "index": 19229 + } + }, + { + "items": [ + 10145.5, + 2.8506 + ], + "hints": { + "index": 19230 + } + }, + { + "items": [ + 10146, + 2.9321000576019287 + ], + "hints": { + "index": 19231 + } + }, + { + "items": [ + 10146.5, + 3.0611999034881592 + ], + "hints": { + "index": 19232 + } + }, + { + "items": [ + 10147, + 3.2746 + ], + "hints": { + "index": 19233 + } + }, + { + "items": [ + 10147.5, + 3.4508 + ], + "hints": { + "index": 19234 + } + }, + { + "items": [ + 10148, + 3.1005 + ], + "hints": { + "index": 19235 + } + }, + { + "items": [ + 10148.5, + 2.8833000659942627 + ], + "hints": { + "index": 19236 + } + }, + { + "items": [ + 10149, + 2.6887 + ], + "hints": { + "index": 19237 + } + }, + { + "items": [ + 10149.5, + 2.7554 + ], + "hints": { + "index": 19238 + } + }, + { + "items": [ + 10150, + 2.799299955368042 + ], + "hints": { + "index": 19239 + } + }, + { + "items": [ + 10150.5, + 2.8345 + ], + "hints": { + "index": 19240 + } + }, + { + "items": [ + 10151, + 2.7741999626159668 + ], + "hints": { + "index": 19241 + } + }, + { + "items": [ + 10151.5, + 2.6695 + ], + "hints": { + "index": 19242 + } + }, + { + "items": [ + 10152, + 2.6896 + ], + "hints": { + "index": 19243 + } + }, + { + "items": [ + 10152.5, + 2.7592000961303711 + ], + "hints": { + "index": 19244 + } + }, + { + "items": [ + 10153, + 2.8534 + ], + "hints": { + "index": 19245 + } + }, + { + "items": [ + 10153.5, + 2.8103 + ], + "hints": { + "index": 19246 + } + }, + { + "items": [ + 10154, + 2.8118 + ], + "hints": { + "index": 19247 + } + }, + { + "items": [ + 10154.5, + 2.7677 + ], + "hints": { + "index": 19248 + } + }, + { + "items": [ + 10155, + 2.7427999973297119 + ], + "hints": { + "index": 19249 + } + }, + { + "items": [ + 10155.5, + 2.7895 + ], + "hints": { + "index": 19250 + } + }, + { + "items": [ + 10156, + 2.7766 + ], + "hints": { + "index": 19251 + } + }, + { + "items": [ + 10156.5, + 2.7552 + ], + "hints": { + "index": 19252 + } + }, + { + "items": [ + 10157, + 2.6178 + ], + "hints": { + "index": 19253 + } + }, + { + "items": [ + 10157.5, + 2.5388998985290527 + ], + "hints": { + "index": 19254 + } + }, + { + "items": [ + 10158, + 2.4474 + ], + "hints": { + "index": 19255 + } + }, + { + "items": [ + 10158.5, + 2.4233999252319336 + ], + "hints": { + "index": 19256 + } + }, + { + "items": [ + 10159, + 2.464400053024292 + ], + "hints": { + "index": 19257 + } + }, + { + "items": [ + 10159.5, + 2.5079998970031734 + ], + "hints": { + "index": 19258 + } + }, + { + "items": [ + 10160, + 2.5014998912811279 + ], + "hints": { + "index": 19259 + } + }, + { + "items": [ + 10160.5, + 2.5598 + ], + "hints": { + "index": 19260 + } + }, + { + "items": [ + 10161, + 2.6416 + ], + "hints": { + "index": 19261 + } + }, + { + "items": [ + 10161.5, + 2.6967999935150142 + ], + "hints": { + "index": 19262 + } + }, + { + "items": [ + 10162, + 2.5476999282836914 + ], + "hints": { + "index": 19263 + } + }, + { + "items": [ + 10162.5, + 2.6678 + ], + "hints": { + "index": 19264 + } + }, + { + "items": [ + 10163, + 2.7323000431060791 + ], + "hints": { + "index": 19265 + } + }, + { + "items": [ + 10163.5, + 2.8738999366760254 + ], + "hints": { + "index": 19266 + } + }, + { + "items": [ + 10164, + 2.6542999744415283 + ], + "hints": { + "index": 19267 + } + }, + { + "items": [ + 10164.5, + 2.6105000972747803 + ], + "hints": { + "index": 19268 + } + }, + { + "items": [ + 10165, + 2.6612000465393062 + ], + "hints": { + "index": 19269 + } + }, + { + "items": [ + 10165.5, + 2.6901 + ], + "hints": { + "index": 19270 + } + }, + { + "items": [ + 10166, + 2.7202999591827393 + ], + "hints": { + "index": 19271 + } + }, + { + "items": [ + 10166.5, + 2.5963 + ], + "hints": { + "index": 19272 + } + }, + { + "items": [ + 10167, + 2.63700008392334 + ], + "hints": { + "index": 19273 + } + }, + { + "items": [ + 10167.5, + 2.6693999767303467 + ], + "hints": { + "index": 19274 + } + }, + { + "items": [ + 10168, + 2.7574000358581543 + ], + "hints": { + "index": 19275 + } + }, + { + "items": [ + 10168.5, + 2.6402 + ], + "hints": { + "index": 19276 + } + }, + { + "items": [ + 10169, + 2.5369 + ], + "hints": { + "index": 19277 + } + }, + { + "items": [ + 10169.5, + 2.5052 + ], + "hints": { + "index": 19278 + } + }, + { + "items": [ + 10170, + 2.6182 + ], + "hints": { + "index": 19279 + } + }, + { + "items": [ + 10170.5, + 2.7281 + ], + "hints": { + "index": 19280 + } + }, + { + "items": [ + 10171, + 2.7694 + ], + "hints": { + "index": 19281 + } + }, + { + "items": [ + 10171.5, + 2.7613000869750977 + ], + "hints": { + "index": 19282 + } + }, + { + "items": [ + 10172, + 2.6649 + ], + "hints": { + "index": 19283 + } + }, + { + "items": [ + 10172.5, + 2.6126999855041504 + ], + "hints": { + "index": 19284 + } + }, + { + "items": [ + 10173, + 2.5683 + ], + "hints": { + "index": 19285 + } + }, + { + "items": [ + 10173.5, + 2.5185000896453857 + ], + "hints": { + "index": 19286 + } + }, + { + "items": [ + 10174, + 2.4802 + ], + "hints": { + "index": 19287 + } + }, + { + "items": [ + 10174.5, + 2.5204999446868896 + ], + "hints": { + "index": 19288 + } + }, + { + "items": [ + 10175, + 2.6048 + ], + "hints": { + "index": 19289 + } + }, + { + "items": [ + 10175.5, + 2.7196 + ], + "hints": { + "index": 19290 + } + }, + { + "items": [ + 10176, + 2.7818 + ], + "hints": { + "index": 19291 + } + }, + { + "items": [ + 10176.5, + 2.7596 + ], + "hints": { + "index": 19292 + } + }, + { + "items": [ + 10177, + 2.6831 + ], + "hints": { + "index": 19293 + } + }, + { + "items": [ + 10177.5, + 2.6206 + ], + "hints": { + "index": 19294 + } + }, + { + "items": [ + 10178, + 2.6507 + ], + "hints": { + "index": 19295 + } + }, + { + "items": [ + 10178.5, + 2.6639 + ], + "hints": { + "index": 19296 + } + }, + { + "items": [ + 10179, + 2.6673 + ], + "hints": { + "index": 19297 + } + }, + { + "items": [ + 10179.5, + 2.6351 + ], + "hints": { + "index": 19298 + } + }, + { + "items": [ + 10180, + 2.5295 + ], + "hints": { + "index": 19299 + } + }, + { + "items": [ + 10180.5, + 2.5299 + ], + "hints": { + "index": 19300 + } + }, + { + "items": [ + 10181, + 2.4975 + ], + "hints": { + "index": 19301 + } + }, + { + "items": [ + 10181.5, + 2.6288 + ], + "hints": { + "index": 19302 + } + }, + { + "items": [ + 10182, + 2.5809 + ], + "hints": { + "index": 19303 + } + }, + { + "items": [ + 10182.5, + 2.5495 + ], + "hints": { + "index": 19304 + } + }, + { + "items": [ + 10183, + 2.49 + ], + "hints": { + "index": 19305 + } + }, + { + "items": [ + 10183.5, + 2.4836 + ], + "hints": { + "index": 19306 + } + }, + { + "items": [ + 10184, + 2.5902 + ], + "hints": { + "index": 19307 + } + }, + { + "items": [ + 10184.5, + 2.6719 + ], + "hints": { + "index": 19308 + } + }, + { + "items": [ + 10185, + 2.7243 + ], + "hints": { + "index": 19309 + } + }, + { + "items": [ + 10185.5, + 2.5956 + ], + "hints": { + "index": 19310 + } + }, + { + "items": [ + 10186, + 2.5575 + ], + "hints": { + "index": 19311 + } + }, + { + "items": [ + 10186.5, + 2.5855 + ], + "hints": { + "index": 19312 + } + }, + { + "items": [ + 10187, + 2.6108 + ], + "hints": { + "index": 19313 + } + }, + { + "items": [ + 10187.5, + 2.5711 + ], + "hints": { + "index": 19314 + } + }, + { + "items": [ + 10188, + 2.4332 + ], + "hints": { + "index": 19315 + } + }, + { + "items": [ + 10188.5, + 2.4691 + ], + "hints": { + "index": 19316 + } + }, + { + "items": [ + 10189, + 2.4805 + ], + "hints": { + "index": 19317 + } + }, + { + "items": [ + 10189.5, + 2.6323 + ], + "hints": { + "index": 19318 + } + }, + { + "items": [ + 10190, + 2.7385 + ], + "hints": { + "index": 19319 + } + }, + { + "items": [ + 10190.5, + 2.814 + ], + "hints": { + "index": 19320 + } + }, + { + "items": [ + 10191, + 2.8366999626159668 + ], + "hints": { + "index": 19321 + } + }, + { + "items": [ + 10191.5, + 2.8273000717163086 + ], + "hints": { + "index": 19322 + } + }, + { + "items": [ + 10192, + 2.8661999702453613 + ], + "hints": { + "index": 19323 + } + }, + { + "items": [ + 10192.5, + 2.8533999919891357 + ], + "hints": { + "index": 19324 + } + }, + { + "items": [ + 10193, + 2.8431999683380127 + ], + "hints": { + "index": 19325 + } + }, + { + "items": [ + 10193.5, + 2.791100025177002 + ], + "hints": { + "index": 19326 + } + }, + { + "items": [ + 10194, + 2.7660999298095703 + ], + "hints": { + "index": 19327 + } + }, + { + "items": [ + 10194.5, + 2.6761999130249023 + ], + "hints": { + "index": 19328 + } + }, + { + "items": [ + 10195, + 2.63070011138916 + ], + "hints": { + "index": 19329 + } + }, + { + "items": [ + 10195.5, + 2.6856999397277832 + ], + "hints": { + "index": 19330 + } + }, + { + "items": [ + 10196, + 2.75 + ], + "hints": { + "index": 19331 + } + }, + { + "items": [ + 10196.5, + 2.7555000782012939 + ], + "hints": { + "index": 19332 + } + }, + { + "items": [ + 10197, + 2.6575000286102295 + ], + "hints": { + "index": 19333 + } + }, + { + "items": [ + 10197.5, + 2.6154000759124756 + ], + "hints": { + "index": 19334 + } + }, + { + "items": [ + 10198, + 2.5571 + ], + "hints": { + "index": 19335 + } + }, + { + "items": [ + 10198.5, + 2.6171998977661133 + ], + "hints": { + "index": 19336 + } + }, + { + "items": [ + 10199, + 2.5956 + ], + "hints": { + "index": 19337 + } + }, + { + "items": [ + 10199.5, + 2.7276 + ], + "hints": { + "index": 19338 + } + }, + { + "items": [ + 10200, + 2.6255 + ], + "hints": { + "index": 19339 + } + }, + { + "items": [ + 10200.5, + 2.7463 + ], + "hints": { + "index": 19340 + } + }, + { + "items": [ + 10201, + 2.72 + ], + "hints": { + "index": 19341 + } + }, + { + "items": [ + 10201.5, + 2.7157 + ], + "hints": { + "index": 19342 + } + }, + { + "items": [ + 10202, + 2.7074 + ], + "hints": { + "index": 19343 + } + }, + { + "items": [ + 10202.5, + 2.7322 + ], + "hints": { + "index": 19344 + } + }, + { + "items": [ + 10203, + 2.8647 + ], + "hints": { + "index": 19345 + } + }, + { + "items": [ + 10203.5, + 2.7285 + ], + "hints": { + "index": 19346 + } + }, + { + "items": [ + 10204, + 2.6331 + ], + "hints": { + "index": 19347 + } + }, + { + "items": [ + 10204.5, + 2.4957 + ], + "hints": { + "index": 19348 + } + }, + { + "items": [ + 10205, + 2.588 + ], + "hints": { + "index": 19349 + } + }, + { + "items": [ + 10205.5, + 2.6539 + ], + "hints": { + "index": 19350 + } + }, + { + "items": [ + 10206, + 2.7983 + ], + "hints": { + "index": 19351 + } + }, + { + "items": [ + 10206.5, + 2.6715 + ], + "hints": { + "index": 19352 + } + }, + { + "items": [ + 10207, + 2.6266 + ], + "hints": { + "index": 19353 + } + }, + { + "items": [ + 10207.5, + 2.568 + ], + "hints": { + "index": 19354 + } + }, + { + "items": [ + 10208, + 2.6419 + ], + "hints": { + "index": 19355 + } + }, + { + "items": [ + 10208.5, + 2.6556 + ], + "hints": { + "index": 19356 + } + }, + { + "items": [ + 10209, + 2.7209 + ], + "hints": { + "index": 19357 + } + }, + { + "items": [ + 10209.5, + 2.675 + ], + "hints": { + "index": 19358 + } + }, + { + "items": [ + 10210, + 2.7743 + ], + "hints": { + "index": 19359 + } + }, + { + "items": [ + 10210.5, + 2.7434 + ], + "hints": { + "index": 19360 + } + }, + { + "items": [ + 10211, + 2.9046 + ], + "hints": { + "index": 19361 + } + }, + { + "items": [ + 10211.5, + 2.8275 + ], + "hints": { + "index": 19362 + } + }, + { + "items": [ + 10212, + 2.6728 + ], + "hints": { + "index": 19363 + } + }, + { + "items": [ + 10212.5, + 2.5491 + ], + "hints": { + "index": 19364 + } + }, + { + "items": [ + 10213, + 2.4519 + ], + "hints": { + "index": 19365 + } + }, + { + "items": [ + 10213.5, + 2.5368 + ], + "hints": { + "index": 19366 + } + }, + { + "items": [ + 10214, + 2.4876 + ], + "hints": { + "index": 19367 + } + }, + { + "items": [ + 10214.5, + 2.6530001163482666 + ], + "hints": { + "index": 19368 + } + }, + { + "items": [ + 10215, + 2.6291999816894531 + ], + "hints": { + "index": 19369 + } + }, + { + "items": [ + 10215.5, + 2.58459997177124 + ], + "hints": { + "index": 19370 + } + }, + { + "items": [ + 10216, + 2.4911999702453613 + ], + "hints": { + "index": 19371 + } + }, + { + "items": [ + 10216.5, + 2.5169000625610352 + ], + "hints": { + "index": 19372 + } + }, + { + "items": [ + 10217, + 2.6953001022338867 + ], + "hints": { + "index": 19373 + } + }, + { + "items": [ + 10217.5, + 2.6723001003265381 + ], + "hints": { + "index": 19374 + } + }, + { + "items": [ + 10218, + 2.6933999061584473 + ], + "hints": { + "index": 19375 + } + }, + { + "items": [ + 10218.5, + 2.5752999782562256 + ], + "hints": { + "index": 19376 + } + }, + { + "items": [ + 10219, + 2.5998001098632813 + ], + "hints": { + "index": 19377 + } + }, + { + "items": [ + 10219.5, + 2.559499979019165 + ], + "hints": { + "index": 19378 + } + }, + { + "items": [ + 10220, + 2.598099946975708 + ], + "hints": { + "index": 19379 + } + }, + { + "items": [ + 10220.5, + 2.6020998954772949 + ], + "hints": { + "index": 19380 + } + }, + { + "items": [ + 10221, + 2.6447999477386475 + ], + "hints": { + "index": 19381 + } + }, + { + "items": [ + 10221.5, + 2.6556000709533691 + ], + "hints": { + "index": 19382 + } + }, + { + "items": [ + 10222, + 2.6422998905181885 + ], + "hints": { + "index": 19383 + } + }, + { + "items": [ + 10222.5, + 2.7197000980377197 + ], + "hints": { + "index": 19384 + } + }, + { + "items": [ + 10223, + 2.6916999816894531 + ], + "hints": { + "index": 19385 + } + }, + { + "items": [ + 10223.5, + 2.6612000465393062 + ], + "hints": { + "index": 19386 + } + }, + { + "items": [ + 10224, + 2.576200008392334 + ], + "hints": { + "index": 19387 + } + }, + { + "items": [ + 10224.5, + 2.6387999057769775 + ], + "hints": { + "index": 19388 + } + }, + { + "items": [ + 10225, + 2.72979998588562 + ], + "hints": { + "index": 19389 + } + }, + { + "items": [ + 10225.5, + 2.676399946212769 + ], + "hints": { + "index": 19390 + } + }, + { + "items": [ + 10226, + 2.5957000255584717 + ], + "hints": { + "index": 19391 + } + }, + { + "items": [ + 10226.5, + 2.5164999961853027 + ], + "hints": { + "index": 19392 + } + }, + { + "items": [ + 10227, + 2.5836999416351318 + ], + "hints": { + "index": 19393 + } + }, + { + "items": [ + 10227.5, + 2.5899999141693115 + ], + "hints": { + "index": 19394 + } + }, + { + "items": [ + 10228, + 2.5360000133514404 + ], + "hints": { + "index": 19395 + } + }, + { + "items": [ + 10228.5, + 2.5130999088287354 + ], + "hints": { + "index": 19396 + } + }, + { + "items": [ + 10229, + 2.5188999176025391 + ], + "hints": { + "index": 19397 + } + }, + { + "items": [ + 10229.5, + 2.614300012588501 + ], + "hints": { + "index": 19398 + } + }, + { + "items": [ + 10230, + 2.6012001037597656 + ], + "hints": { + "index": 19399 + } + }, + { + "items": [ + 10230.5, + 2.5927000045776367 + ], + "hints": { + "index": 19400 + } + }, + { + "items": [ + 10231, + 2.4921998977661133 + ], + "hints": { + "index": 19401 + } + }, + { + "items": [ + 10231.5, + 2.4666 + ], + "hints": { + "index": 19402 + } + }, + { + "items": [ + 10232, + 2.4687 + ], + "hints": { + "index": 19403 + } + }, + { + "items": [ + 10232.5, + 2.5566999912261963 + ], + "hints": { + "index": 19404 + } + }, + { + "items": [ + 10233, + 2.6150000095367432 + ], + "hints": { + "index": 19405 + } + }, + { + "items": [ + 10233.5, + 2.6375000476837158 + ], + "hints": { + "index": 19406 + } + }, + { + "items": [ + 10234, + 2.5556 + ], + "hints": { + "index": 19407 + } + }, + { + "items": [ + 10234.5, + 2.5403 + ], + "hints": { + "index": 19408 + } + }, + { + "items": [ + 10235, + 2.5111 + ], + "hints": { + "index": 19409 + } + }, + { + "items": [ + 10235.5, + 2.4693 + ], + "hints": { + "index": 19410 + } + }, + { + "items": [ + 10236, + 2.5092000961303711 + ], + "hints": { + "index": 19411 + } + }, + { + "items": [ + 10236.5, + 2.5502 + ], + "hints": { + "index": 19412 + } + }, + { + "items": [ + 10237, + 2.6857 + ], + "hints": { + "index": 19413 + } + }, + { + "items": [ + 10237.5, + 2.6928 + ], + "hints": { + "index": 19414 + } + }, + { + "items": [ + 10238, + 2.6753999999999998 + ], + "hints": { + "index": 19415 + } + }, + { + "items": [ + 10238.5, + 2.6767001152038574 + ], + "hints": { + "index": 19416 + } + }, + { + "items": [ + 10239, + 2.575700044631958 + ], + "hints": { + "index": 19417 + } + }, + { + "items": [ + 10239.5, + 2.5742 + ], + "hints": { + "index": 19418 + } + }, + { + "items": [ + 10240, + 2.5355 + ], + "hints": { + "index": 19419 + } + }, + { + "items": [ + 10240.5, + 2.537600040435791 + ], + "hints": { + "index": 19420 + } + }, + { + "items": [ + 10241, + 2.5495998859405522 + ], + "hints": { + "index": 19421 + } + }, + { + "items": [ + 10241.5, + 2.5727 + ], + "hints": { + "index": 19422 + } + }, + { + "items": [ + 10242, + 2.6672 + ], + "hints": { + "index": 19423 + } + }, + { + "items": [ + 10242.5, + 2.72790002822876 + ], + "hints": { + "index": 19424 + } + }, + { + "items": [ + 10243, + 2.7562999725341797 + ], + "hints": { + "index": 19425 + } + }, + { + "items": [ + 10243.5, + 2.663100004196167 + ], + "hints": { + "index": 19426 + } + }, + { + "items": [ + 10244, + 2.6508998870849609 + ], + "hints": { + "index": 19427 + } + }, + { + "items": [ + 10244.5, + 2.7154 + ], + "hints": { + "index": 19428 + } + }, + { + "items": [ + 10245, + 2.7317 + ], + "hints": { + "index": 19429 + } + }, + { + "items": [ + 10245.5, + 2.6705999374389648 + ], + "hints": { + "index": 19430 + } + }, + { + "items": [ + 10246, + 2.5562999248504639 + ], + "hints": { + "index": 19431 + } + }, + { + "items": [ + 10246.5, + 2.5710999965667725 + ], + "hints": { + "index": 19432 + } + }, + { + "items": [ + 10247, + 2.5469000339508057 + ], + "hints": { + "index": 19433 + } + }, + { + "items": [ + 10247.5, + 2.5383 + ], + "hints": { + "index": 19434 + } + }, + { + "items": [ + 10248, + 2.5574 + ], + "hints": { + "index": 19435 + } + }, + { + "items": [ + 10248.5, + 2.6182000637054443 + ], + "hints": { + "index": 19436 + } + }, + { + "items": [ + 10249, + 2.6687 + ], + "hints": { + "index": 19437 + } + }, + { + "items": [ + 10249.5, + 2.6495 + ], + "hints": { + "index": 19438 + } + }, + { + "items": [ + 10250, + 2.6555 + ], + "hints": { + "index": 19439 + } + }, + { + "items": [ + 10250.5, + 2.5597999095916748 + ], + "hints": { + "index": 19440 + } + }, + { + "items": [ + 10251, + 2.607 + ], + "hints": { + "index": 19441 + } + }, + { + "items": [ + 10251.5, + 2.5550999641418457 + ], + "hints": { + "index": 19442 + } + }, + { + "items": [ + 10252, + 2.6953999996185303 + ], + "hints": { + "index": 19443 + } + }, + { + "items": [ + 10252.5, + 2.6772 + ], + "hints": { + "index": 19444 + } + }, + { + "items": [ + 10253, + 2.6685 + ], + "hints": { + "index": 19445 + } + }, + { + "items": [ + 10253.5, + 2.5766000747680664 + ], + "hints": { + "index": 19446 + } + }, + { + "items": [ + 10254, + 2.5399 + ], + "hints": { + "index": 19447 + } + }, + { + "items": [ + 10254.5, + 2.5362000465393062 + ], + "hints": { + "index": 19448 + } + }, + { + "items": [ + 10255, + 2.5799000263214111 + ], + "hints": { + "index": 19449 + } + }, + { + "items": [ + 10255.5, + 2.56030011177063 + ], + "hints": { + "index": 19450 + } + }, + { + "items": [ + 10256, + 2.5414 + ], + "hints": { + "index": 19451 + } + }, + { + "items": [ + 10256.5, + 2.4791998863220215 + ], + "hints": { + "index": 19452 + } + }, + { + "items": [ + 10257, + 2.5683 + ], + "hints": { + "index": 19453 + } + }, + { + "items": [ + 10257.5, + 2.6235001087188721 + ], + "hints": { + "index": 19454 + } + }, + { + "items": [ + 10258, + 2.7143 + ], + "hints": { + "index": 19455 + } + }, + { + "items": [ + 10258.5, + 2.6221 + ], + "hints": { + "index": 19456 + } + }, + { + "items": [ + 10259, + 2.657 + ], + "hints": { + "index": 19457 + } + }, + { + "items": [ + 10259.5, + 2.73799991607666 + ], + "hints": { + "index": 19458 + } + }, + { + "items": [ + 10260, + 2.8284 + ], + "hints": { + "index": 19459 + } + }, + { + "items": [ + 10260.5, + 2.9202001094818115 + ], + "hints": { + "index": 19460 + } + }, + { + "items": [ + 10261, + 2.9139 + ], + "hints": { + "index": 19461 + } + }, + { + "items": [ + 10261.5, + 2.9047 + ], + "hints": { + "index": 19462 + } + }, + { + "items": [ + 10262, + 2.819 + ], + "hints": { + "index": 19463 + } + }, + { + "items": [ + 10262.5, + 2.7541000843048096 + ], + "hints": { + "index": 19464 + } + }, + { + "items": [ + 10263, + 2.7952001094818115 + ], + "hints": { + "index": 19465 + } + }, + { + "items": [ + 10263.5, + 2.92770004272461 + ], + "hints": { + "index": 19466 + } + }, + { + "items": [ + 10264, + 3.0397 + ], + "hints": { + "index": 19467 + } + }, + { + "items": [ + 10264.5, + 3.0016999244689941 + ], + "hints": { + "index": 19468 + } + }, + { + "items": [ + 10265, + 2.8912 + ], + "hints": { + "index": 19469 + } + }, + { + "items": [ + 10265.5, + 2.6956000328063965 + ], + "hints": { + "index": 19470 + } + }, + { + "items": [ + 10266, + 2.8236 + ], + "hints": { + "index": 19471 + } + }, + { + "items": [ + 10266.5, + 2.7574000358581543 + ], + "hints": { + "index": 19472 + } + }, + { + "items": [ + 10267, + 2.7839999198913574 + ], + "hints": { + "index": 19473 + } + }, + { + "items": [ + 10267.5, + 2.65339994430542 + ], + "hints": { + "index": 19474 + } + }, + { + "items": [ + 10268, + 2.6602001190185547 + ], + "hints": { + "index": 19475 + } + }, + { + "items": [ + 10268.5, + 2.7021000385284424 + ], + "hints": { + "index": 19476 + } + }, + { + "items": [ + 10269, + 2.5754 + ], + "hints": { + "index": 19477 + } + }, + { + "items": [ + 10269.5, + 2.5690000057220459 + ], + "hints": { + "index": 19478 + } + }, + { + "items": [ + 10270, + 2.5332 + ], + "hints": { + "index": 19479 + } + }, + { + "items": [ + 10270.5, + 2.524499893188477 + ], + "hints": { + "index": 19480 + } + }, + { + "items": [ + 10271, + 2.5082 + ], + "hints": { + "index": 19481 + } + }, + { + "items": [ + 10271.5, + 2.630000114440918 + ], + "hints": { + "index": 19482 + } + }, + { + "items": [ + 10272, + 2.8081 + ], + "hints": { + "index": 19483 + } + }, + { + "items": [ + 10272.5, + 2.871999979019165 + ], + "hints": { + "index": 19484 + } + }, + { + "items": [ + 10273, + 2.7586 + ], + "hints": { + "index": 19485 + } + }, + { + "items": [ + 10273.5, + 2.7641 + ], + "hints": { + "index": 19486 + } + }, + { + "items": [ + 10274, + 2.7613 + ], + "hints": { + "index": 19487 + } + }, + { + "items": [ + 10274.5, + 2.7631 + ], + "hints": { + "index": 19488 + } + }, + { + "items": [ + 10275, + 2.7864 + ], + "hints": { + "index": 19489 + } + }, + { + "items": [ + 10275.5, + 2.659 + ], + "hints": { + "index": 19490 + } + }, + { + "items": [ + 10276, + 2.7327 + ], + "hints": { + "index": 19491 + } + }, + { + "items": [ + 10276.5, + 2.6153 + ], + "hints": { + "index": 19492 + } + }, + { + "items": [ + 10277, + 2.7017 + ], + "hints": { + "index": 19493 + } + }, + { + "items": [ + 10277.5, + 2.5643 + ], + "hints": { + "index": 19494 + } + }, + { + "items": [ + 10278, + 2.6124 + ], + "hints": { + "index": 19495 + } + }, + { + "items": [ + 10278.5, + 2.568 + ], + "hints": { + "index": 19496 + } + }, + { + "items": [ + 10279, + 2.57669997215271 + ], + "hints": { + "index": 19497 + } + }, + { + "items": [ + 10279.5, + 2.5552 + ], + "hints": { + "index": 19498 + } + }, + { + "items": [ + 10280, + 2.6112000942230225 + ], + "hints": { + "index": 19499 + } + }, + { + "items": [ + 10280.5, + 2.5481 + ], + "hints": { + "index": 19500 + } + }, + { + "items": [ + 10281, + 2.5439000129699707 + ], + "hints": { + "index": 19501 + } + }, + { + "items": [ + 10281.5, + 2.4696 + ], + "hints": { + "index": 19502 + } + }, + { + "items": [ + 10282, + 2.491 + ], + "hints": { + "index": 19503 + } + }, + { + "items": [ + 10282.5, + 2.5468 + ], + "hints": { + "index": 19504 + } + }, + { + "items": [ + 10283, + 2.577 + ], + "hints": { + "index": 19505 + } + }, + { + "items": [ + 10283.5, + 2.6598999500274658 + ], + "hints": { + "index": 19506 + } + }, + { + "items": [ + 10284, + 2.6114 + ], + "hints": { + "index": 19507 + } + }, + { + "items": [ + 10284.5, + 2.5813999176025391 + ], + "hints": { + "index": 19508 + } + }, + { + "items": [ + 10285, + 2.5793 + ], + "hints": { + "index": 19509 + } + }, + { + "items": [ + 10285.5, + 2.5503999999999998 + ], + "hints": { + "index": 19510 + } + }, + { + "items": [ + 10286, + 2.6211 + ], + "hints": { + "index": 19511 + } + }, + { + "items": [ + 10286.5, + 2.6525 + ], + "hints": { + "index": 19512 + } + }, + { + "items": [ + 10287, + 2.6662 + ], + "hints": { + "index": 19513 + } + }, + { + "items": [ + 10287.5, + 2.6277 + ], + "hints": { + "index": 19514 + } + }, + { + "items": [ + 10288, + 2.5496 + ], + "hints": { + "index": 19515 + } + }, + { + "items": [ + 10288.5, + 2.5284 + ], + "hints": { + "index": 19516 + } + }, + { + "items": [ + 10289, + 2.5191 + ], + "hints": { + "index": 19517 + } + }, + { + "items": [ + 10289.5, + 2.6139 + ], + "hints": { + "index": 19518 + } + }, + { + "items": [ + 10290, + 2.6916 + ], + "hints": { + "index": 19519 + } + }, + { + "items": [ + 10290.5, + 2.6944 + ], + "hints": { + "index": 19520 + } + }, + { + "items": [ + 10291, + 2.6599 + ], + "hints": { + "index": 19521 + } + }, + { + "items": [ + 10291.5, + 2.6088 + ], + "hints": { + "index": 19522 + } + }, + { + "items": [ + 10292, + 2.6415 + ], + "hints": { + "index": 19523 + } + }, + { + "items": [ + 10292.5, + 2.5861 + ], + "hints": { + "index": 19524 + } + }, + { + "items": [ + 10293, + 2.6268 + ], + "hints": { + "index": 19525 + } + }, + { + "items": [ + 10293.5, + 2.6217999458312988 + ], + "hints": { + "index": 19526 + } + }, + { + "items": [ + 10294, + 2.7372 + ], + "hints": { + "index": 19527 + } + }, + { + "items": [ + 10294.5, + 2.7361 + ], + "hints": { + "index": 19528 + } + }, + { + "items": [ + 10295, + 2.6867 + ], + "hints": { + "index": 19529 + } + }, + { + "items": [ + 10295.5, + 2.642 + ], + "hints": { + "index": 19530 + } + }, + { + "items": [ + 10296, + 2.6985 + ], + "hints": { + "index": 19531 + } + }, + { + "items": [ + 10296.5, + 2.7415 + ], + "hints": { + "index": 19532 + } + }, + { + "items": [ + 10297, + 2.6812 + ], + "hints": { + "index": 19533 + } + }, + { + "items": [ + 10297.5, + 2.5381 + ], + "hints": { + "index": 19534 + } + }, + { + "items": [ + 10298, + 2.529 + ], + "hints": { + "index": 19535 + } + }, + { + "items": [ + 10298.5, + 2.5744 + ], + "hints": { + "index": 19536 + } + }, + { + "items": [ + 10299, + 2.6592 + ], + "hints": { + "index": 19537 + } + }, + { + "items": [ + 10299.5, + 2.6922 + ], + "hints": { + "index": 19538 + } + }, + { + "items": [ + 10300, + 2.691 + ], + "hints": { + "index": 19539 + } + }, + { + "items": [ + 10300.5, + 2.695 + ], + "hints": { + "index": 19540 + } + }, + { + "items": [ + 10301, + 2.6268 + ], + "hints": { + "index": 19541 + } + }, + { + "items": [ + 10301.5, + 2.5953 + ], + "hints": { + "index": 19542 + } + }, + { + "items": [ + 10302, + 2.5972 + ], + "hints": { + "index": 19543 + } + }, + { + "items": [ + 10302.5, + 2.6224 + ], + "hints": { + "index": 19544 + } + }, + { + "items": [ + 10303, + 2.7234 + ], + "hints": { + "index": 19545 + } + }, + { + "items": [ + 10303.5, + 2.7727 + ], + "hints": { + "index": 19546 + } + }, + { + "items": [ + 10304, + 2.8261 + ], + "hints": { + "index": 19547 + } + }, + { + "items": [ + 10304.5, + 2.7878 + ], + "hints": { + "index": 19548 + } + }, + { + "items": [ + 10305, + 2.7401 + ], + "hints": { + "index": 19549 + } + }, + { + "items": [ + 10305.5, + 2.7245 + ], + "hints": { + "index": 19550 + } + }, + { + "items": [ + 10306, + 2.8104 + ], + "hints": { + "index": 19551 + } + }, + { + "items": [ + 10306.5, + 2.7939 + ], + "hints": { + "index": 19552 + } + }, + { + "items": [ + 10307, + 2.8804 + ], + "hints": { + "index": 19553 + } + }, + { + "items": [ + 10307.5, + 2.8727 + ], + "hints": { + "index": 19554 + } + }, + { + "items": [ + 10308, + 2.9202 + ], + "hints": { + "index": 19555 + } + }, + { + "items": [ + 10308.5, + 2.9009 + ], + "hints": { + "index": 19556 + } + }, + { + "items": [ + 10309, + 2.7754 + ], + "hints": { + "index": 19557 + } + }, + { + "items": [ + 10309.5, + 2.7464 + ], + "hints": { + "index": 19558 + } + }, + { + "items": [ + 10310, + 2.7054 + ], + "hints": { + "index": 19559 + } + }, + { + "items": [ + 10310.5, + 2.6830000877380371 + ], + "hints": { + "index": 19560 + } + }, + { + "items": [ + 10311, + 2.6142001152038574 + ], + "hints": { + "index": 19561 + } + }, + { + "items": [ + 10311.5, + 2.638200044631958 + ], + "hints": { + "index": 19562 + } + }, + { + "items": [ + 10312, + 2.687000036239624 + ], + "hints": { + "index": 19563 + } + }, + { + "items": [ + 10312.5, + 2.7943999767303467 + ], + "hints": { + "index": 19564 + } + }, + { + "items": [ + 10313, + 2.9003000259399414 + ], + "hints": { + "index": 19565 + } + }, + { + "items": [ + 10313.5, + 2.8921999931335449 + ], + "hints": { + "index": 19566 + } + }, + { + "items": [ + 10314, + 2.8259000778198242 + ], + "hints": { + "index": 19567 + } + }, + { + "items": [ + 10314.5, + 2.6846001148223877 + ], + "hints": { + "index": 19568 + } + }, + { + "items": [ + 10315, + 2.71589994430542 + ], + "hints": { + "index": 19569 + } + }, + { + "items": [ + 10315.5, + 2.6903998851776123 + ], + "hints": { + "index": 19570 + } + }, + { + "items": [ + 10316, + 2.6854000091552734 + ], + "hints": { + "index": 19571 + } + }, + { + "items": [ + 10316.5, + 2.6624000072479248 + ], + "hints": { + "index": 19572 + } + }, + { + "items": [ + 10317, + 2.7037999629974365 + ], + "hints": { + "index": 19573 + } + }, + { + "items": [ + 10317.5, + 2.7025001049041748 + ], + "hints": { + "index": 19574 + } + }, + { + "items": [ + 10318, + 2.6819999217987061 + ], + "hints": { + "index": 19575 + } + }, + { + "items": [ + 10318.5, + 2.7186999320983887 + ], + "hints": { + "index": 19576 + } + }, + { + "items": [ + 10319, + 2.788100004196167 + ], + "hints": { + "index": 19577 + } + }, + { + "items": [ + 10319.5, + 2.8062000274658203 + ], + "hints": { + "index": 19578 + } + }, + { + "items": [ + 10320, + 2.8492000102996826 + ], + "hints": { + "index": 19579 + } + }, + { + "items": [ + 10320.5, + 2.8526999950408936 + ], + "hints": { + "index": 19580 + } + }, + { + "items": [ + 10321, + 2.8217999935150142 + ], + "hints": { + "index": 19581 + } + }, + { + "items": [ + 10321.5, + 2.7811000347137451 + ], + "hints": { + "index": 19582 + } + }, + { + "items": [ + 10322, + 2.8245999813079834 + ], + "hints": { + "index": 19583 + } + }, + { + "items": [ + 10322.5, + 2.8157999515533447 + ], + "hints": { + "index": 19584 + } + }, + { + "items": [ + 10323, + 2.7593998908996582 + ], + "hints": { + "index": 19585 + } + }, + { + "items": [ + 10323.5, + 2.6242001056671143 + ], + "hints": { + "index": 19586 + } + }, + { + "items": [ + 10324, + 2.7302000522613525 + ], + "hints": { + "index": 19587 + } + }, + { + "items": [ + 10324.5, + 2.7535998821258545 + ], + "hints": { + "index": 19588 + } + }, + { + "items": [ + 10325, + 2.8262999057769775 + ], + "hints": { + "index": 19589 + } + }, + { + "items": [ + 10325.5, + 2.7732999324798584 + ], + "hints": { + "index": 19590 + } + }, + { + "items": [ + 10326, + 2.7406001091003418 + ], + "hints": { + "index": 19591 + } + }, + { + "items": [ + 10326.5, + 2.7370998859405522 + ], + "hints": { + "index": 19592 + } + }, + { + "items": [ + 10327, + 2.6775000095367432 + ], + "hints": { + "index": 19593 + } + }, + { + "items": [ + 10327.5, + 2.7318999767303467 + ], + "hints": { + "index": 19594 + } + }, + { + "items": [ + 10328, + 2.7441999912261963 + ], + "hints": { + "index": 19595 + } + }, + { + "items": [ + 10328.5, + 2.7291998863220215 + ], + "hints": { + "index": 19596 + } + }, + { + "items": [ + 10329, + 2.6902000904083252 + ], + "hints": { + "index": 19597 + } + }, + { + "items": [ + 10329.5, + 2.6563000679016113 + ], + "hints": { + "index": 19598 + } + }, + { + "items": [ + 10330, + 2.8311998844146729 + ], + "hints": { + "index": 19599 + } + }, + { + "items": [ + 10330.5, + 3.0099000930786133 + ], + "hints": { + "index": 19600 + } + }, + { + "items": [ + 10331, + 2.9173998832702637 + ], + "hints": { + "index": 19601 + } + }, + { + "items": [ + 10331.5, + 2.8410999774932861 + ], + "hints": { + "index": 19602 + } + }, + { + "items": [ + 10332, + 2.6916000843048096 + ], + "hints": { + "index": 19603 + } + }, + { + "items": [ + 10332.5, + 2.7650001049041748 + ], + "hints": { + "index": 19604 + } + }, + { + "items": [ + 10333, + 2.7116999626159668 + ], + "hints": { + "index": 19605 + } + }, + { + "items": [ + 10333.5, + 2.7599000930786133 + ], + "hints": { + "index": 19606 + } + }, + { + "items": [ + 10334, + 2.7558000087738037 + ], + "hints": { + "index": 19607 + } + }, + { + "items": [ + 10334.5, + 2.774499893188477 + ], + "hints": { + "index": 19608 + } + }, + { + "items": [ + 10335, + 2.7776000499725342 + ], + "hints": { + "index": 19609 + } + }, + { + "items": [ + 10335.5, + 2.7716999053955078 + ], + "hints": { + "index": 19610 + } + }, + { + "items": [ + 10336, + 2.7785000801086426 + ], + "hints": { + "index": 19611 + } + }, + { + "items": [ + 10336.5, + 2.7855000495910645 + ], + "hints": { + "index": 19612 + } + }, + { + "items": [ + 10337, + 2.8919000625610352 + ], + "hints": { + "index": 19613 + } + }, + { + "items": [ + 10337.5, + 2.8884000778198242 + ], + "hints": { + "index": 19614 + } + }, + { + "items": [ + 10338, + 2.9214000701904297 + ], + "hints": { + "index": 19615 + } + }, + { + "items": [ + 10338.5, + 2.8401000499725342 + ], + "hints": { + "index": 19616 + } + }, + { + "items": [ + 10339, + 2.7778000831604004 + ], + "hints": { + "index": 19617 + } + }, + { + "items": [ + 10339.5, + 2.6170001029968266 + ], + "hints": { + "index": 19618 + } + }, + { + "items": [ + 10340, + 2.5692999362945557 + ], + "hints": { + "index": 19619 + } + }, + { + "items": [ + 10340.5, + 2.6373000144958496 + ], + "hints": { + "index": 19620 + } + }, + { + "items": [ + 10341, + 2.7578001022338867 + ], + "hints": { + "index": 19621 + } + }, + { + "items": [ + 10341.5, + 2.8403999805450439 + ], + "hints": { + "index": 19622 + } + }, + { + "items": [ + 10342, + 2.8464000225067139 + ], + "hints": { + "index": 19623 + } + }, + { + "items": [ + 10342.5, + 2.8001999855041504 + ], + "hints": { + "index": 19624 + } + }, + { + "items": [ + 10343, + 2.7590999603271484 + ], + "hints": { + "index": 19625 + } + }, + { + "items": [ + 10343.5, + 2.6877999305725098 + ], + "hints": { + "index": 19626 + } + }, + { + "items": [ + 10344, + 2.62280011177063 + ], + "hints": { + "index": 19627 + } + }, + { + "items": [ + 10344.5, + 2.625 + ], + "hints": { + "index": 19628 + } + }, + { + "items": [ + 10345, + 2.6947000026702881 + ], + "hints": { + "index": 19629 + } + }, + { + "items": [ + 10345.5, + 2.7918999195098877 + ], + "hints": { + "index": 19630 + } + }, + { + "items": [ + 10346, + 2.7046000957489018 + ], + "hints": { + "index": 19631 + } + }, + { + "items": [ + 10346.5, + 2.5553998947143555 + ], + "hints": { + "index": 19632 + } + }, + { + "items": [ + 10347, + 2.483799934387207 + ], + "hints": { + "index": 19633 + } + }, + { + "items": [ + 10347.5, + 2.5511 + ], + "hints": { + "index": 19634 + } + }, + { + "items": [ + 10348, + 2.6208000183105469 + ], + "hints": { + "index": 19635 + } + }, + { + "items": [ + 10348.5, + 2.6767 + ], + "hints": { + "index": 19636 + } + }, + { + "items": [ + 10349, + 2.6987 + ], + "hints": { + "index": 19637 + } + }, + { + "items": [ + 10349.5, + 2.6589000225067139 + ], + "hints": { + "index": 19638 + } + }, + { + "items": [ + 10350, + 2.6757 + ], + "hints": { + "index": 19639 + } + }, + { + "items": [ + 10350.5, + 2.6025 + ], + "hints": { + "index": 19640 + } + }, + { + "items": [ + 10351, + 2.6419000625610352 + ], + "hints": { + "index": 19641 + } + }, + { + "items": [ + 10351.5, + 2.5427999496459961 + ], + "hints": { + "index": 19642 + } + }, + { + "items": [ + 10352, + 2.6745998859405522 + ], + "hints": { + "index": 19643 + } + }, + { + "items": [ + 10352.5, + 2.7277 + ], + "hints": { + "index": 19644 + } + }, + { + "items": [ + 10353, + 2.7265000343322754 + ], + "hints": { + "index": 19645 + } + }, + { + "items": [ + 10353.5, + 2.5942 + ], + "hints": { + "index": 19646 + } + }, + { + "items": [ + 10354, + 2.52839994430542 + ], + "hints": { + "index": 19647 + } + }, + { + "items": [ + 10354.5, + 2.6009 + ], + "hints": { + "index": 19648 + } + }, + { + "items": [ + 10355, + 2.652 + ], + "hints": { + "index": 19649 + } + }, + { + "items": [ + 10355.5, + 2.709399938583374 + ], + "hints": { + "index": 19650 + } + }, + { + "items": [ + 10356, + 2.6263000965118408 + ], + "hints": { + "index": 19651 + } + }, + { + "items": [ + 10356.5, + 2.5764000415802 + ], + "hints": { + "index": 19652 + } + }, + { + "items": [ + 10357, + 2.5446 + ], + "hints": { + "index": 19653 + } + }, + { + "items": [ + 10357.5, + 2.6317000389099121 + ], + "hints": { + "index": 19654 + } + }, + { + "items": [ + 10358, + 2.6879 + ], + "hints": { + "index": 19655 + } + }, + { + "items": [ + 10358.5, + 2.6403999328613281 + ], + "hints": { + "index": 19656 + } + }, + { + "items": [ + 10359, + 2.6277000904083252 + ], + "hints": { + "index": 19657 + } + }, + { + "items": [ + 10359.5, + 2.6194 + ], + "hints": { + "index": 19658 + } + }, + { + "items": [ + 10360, + 2.7474 + ], + "hints": { + "index": 19659 + } + }, + { + "items": [ + 10360.5, + 2.8141000270843506 + ], + "hints": { + "index": 19660 + } + }, + { + "items": [ + 10361, + 2.905 + ], + "hints": { + "index": 19661 + } + }, + { + "items": [ + 10361.5, + 2.9189999103546143 + ], + "hints": { + "index": 19662 + } + }, + { + "items": [ + 10362, + 2.9149999618530273 + ], + "hints": { + "index": 19663 + } + }, + { + "items": [ + 10362.5, + 2.9110000133514404 + ], + "hints": { + "index": 19664 + } + }, + { + "items": [ + 10363, + 2.7855000495910645 + ], + "hints": { + "index": 19665 + } + }, + { + "items": [ + 10363.5, + 2.8110001087188721 + ], + "hints": { + "index": 19666 + } + }, + { + "items": [ + 10364, + 2.7638 + ], + "hints": { + "index": 19667 + } + }, + { + "items": [ + 10364.5, + 2.9992 + ], + "hints": { + "index": 19668 + } + }, + { + "items": [ + 10365, + 2.928800106048584 + ], + "hints": { + "index": 19669 + } + }, + { + "items": [ + 10365.5, + 2.913 + ], + "hints": { + "index": 19670 + } + }, + { + "items": [ + 10366, + 2.7693 + ], + "hints": { + "index": 19671 + } + }, + { + "items": [ + 10366.5, + 2.6478 + ], + "hints": { + "index": 19672 + } + }, + { + "items": [ + 10367, + 2.61 + ], + "hints": { + "index": 19673 + } + }, + { + "items": [ + 10367.5, + 2.6655 + ], + "hints": { + "index": 19674 + } + }, + { + "items": [ + 10368, + 2.7353 + ], + "hints": { + "index": 19675 + } + }, + { + "items": [ + 10368.5, + 2.7381 + ], + "hints": { + "index": 19676 + } + }, + { + "items": [ + 10369, + 2.6265 + ], + "hints": { + "index": 19677 + } + }, + { + "items": [ + 10369.5, + 2.6704 + ], + "hints": { + "index": 19678 + } + }, + { + "items": [ + 10370, + 2.6600000858306885 + ], + "hints": { + "index": 19679 + } + }, + { + "items": [ + 10370.5, + 2.7248001098632813 + ], + "hints": { + "index": 19680 + } + }, + { + "items": [ + 10371, + 2.6528 + ], + "hints": { + "index": 19681 + } + }, + { + "items": [ + 10371.5, + 2.5597999095916748 + ], + "hints": { + "index": 19682 + } + }, + { + "items": [ + 10372, + 2.4793999195098877 + ], + "hints": { + "index": 19683 + } + }, + { + "items": [ + 10372.5, + 2.4846 + ], + "hints": { + "index": 19684 + } + }, + { + "items": [ + 10373, + 2.5994000434875488 + ], + "hints": { + "index": 19685 + } + }, + { + "items": [ + 10373.5, + 2.658099889755249 + ], + "hints": { + "index": 19686 + } + }, + { + "items": [ + 10374, + 2.7288 + ], + "hints": { + "index": 19687 + } + }, + { + "items": [ + 10374.5, + 2.698699951171875 + ], + "hints": { + "index": 19688 + } + }, + { + "items": [ + 10375, + 2.7646999359130859 + ], + "hints": { + "index": 19689 + } + }, + { + "items": [ + 10375.5, + 2.7133998870849609 + ], + "hints": { + "index": 19690 + } + }, + { + "items": [ + 10376, + 2.7121999263763428 + ], + "hints": { + "index": 19691 + } + }, + { + "items": [ + 10376.5, + 2.6087 + ], + "hints": { + "index": 19692 + } + }, + { + "items": [ + 10377, + 2.7859001159667969 + ], + "hints": { + "index": 19693 + } + }, + { + "items": [ + 10377.5, + 2.8714 + ], + "hints": { + "index": 19694 + } + }, + { + "items": [ + 10378, + 2.8838999271392822 + ], + "hints": { + "index": 19695 + } + }, + { + "items": [ + 10378.5, + 2.6522998809814453 + ], + "hints": { + "index": 19696 + } + }, + { + "items": [ + 10379, + 2.6238999366760254 + ], + "hints": { + "index": 19697 + } + }, + { + "items": [ + 10379.5, + 2.7019999027252197 + ], + "hints": { + "index": 19698 + } + }, + { + "items": [ + 10380, + 2.720599889755249 + ], + "hints": { + "index": 19699 + } + }, + { + "items": [ + 10380.5, + 2.6768 + ], + "hints": { + "index": 19700 + } + }, + { + "items": [ + 10381, + 2.6552999019622803 + ], + "hints": { + "index": 19701 + } + }, + { + "items": [ + 10381.5, + 2.6489999294281006 + ], + "hints": { + "index": 19702 + } + }, + { + "items": [ + 10382, + 2.7634999752044682 + ], + "hints": { + "index": 19703 + } + }, + { + "items": [ + 10382.5, + 2.7299 + ], + "hints": { + "index": 19704 + } + }, + { + "items": [ + 10383, + 2.7239999771118164 + ], + "hints": { + "index": 19705 + } + }, + { + "items": [ + 10383.5, + 2.6610000133514404 + ], + "hints": { + "index": 19706 + } + }, + { + "items": [ + 10384, + 2.6617999076843266 + ], + "hints": { + "index": 19707 + } + }, + { + "items": [ + 10384.5, + 2.7187 + ], + "hints": { + "index": 19708 + } + }, + { + "items": [ + 10385, + 2.7192 + ], + "hints": { + "index": 19709 + } + }, + { + "items": [ + 10385.5, + 2.6902 + ], + "hints": { + "index": 19710 + } + }, + { + "items": [ + 10386, + 2.5797 + ], + "hints": { + "index": 19711 + } + }, + { + "items": [ + 10386.5, + 2.496999979019165 + ], + "hints": { + "index": 19712 + } + }, + { + "items": [ + 10387, + 2.5207 + ], + "hints": { + "index": 19713 + } + }, + { + "items": [ + 10387.5, + 2.6262 + ], + "hints": { + "index": 19714 + } + }, + { + "items": [ + 10388, + 2.6905 + ], + "hints": { + "index": 19715 + } + }, + { + "items": [ + 10388.5, + 2.6909 + ], + "hints": { + "index": 19716 + } + }, + { + "items": [ + 10389, + 2.7383 + ], + "hints": { + "index": 19717 + } + }, + { + "items": [ + 10389.5, + 2.6663 + ], + "hints": { + "index": 19718 + } + }, + { + "items": [ + 10390, + 2.7507 + ], + "hints": { + "index": 19719 + } + }, + { + "items": [ + 10390.5, + 2.7201 + ], + "hints": { + "index": 19720 + } + }, + { + "items": [ + 10391, + 2.8065 + ], + "hints": { + "index": 19721 + } + }, + { + "items": [ + 10391.5, + 2.6849 + ], + "hints": { + "index": 19722 + } + }, + { + "items": [ + 10392, + 2.6312 + ], + "hints": { + "index": 19723 + } + }, + { + "items": [ + 10392.5, + 2.5460999011993408 + ], + "hints": { + "index": 19724 + } + }, + { + "items": [ + 10393, + 2.5611999034881592 + ], + "hints": { + "index": 19725 + } + }, + { + "items": [ + 10393.5, + 2.6217000484466553 + ], + "hints": { + "index": 19726 + } + }, + { + "items": [ + 10394, + 2.6719999313354492 + ], + "hints": { + "index": 19727 + } + }, + { + "items": [ + 10394.5, + 2.6323 + ], + "hints": { + "index": 19728 + } + }, + { + "items": [ + 10395, + 2.5704998970031734 + ], + "hints": { + "index": 19729 + } + }, + { + "items": [ + 10395.5, + 2.5999999046325684 + ], + "hints": { + "index": 19730 + } + }, + { + "items": [ + 10396, + 2.6867001056671143 + ], + "hints": { + "index": 19731 + } + }, + { + "items": [ + 10396.5, + 2.6495 + ], + "hints": { + "index": 19732 + } + }, + { + "items": [ + 10397, + 2.6127998828887939 + ], + "hints": { + "index": 19733 + } + }, + { + "items": [ + 10397.5, + 2.5905001163482666 + ], + "hints": { + "index": 19734 + } + }, + { + "items": [ + 10398, + 2.6417000293731689 + ], + "hints": { + "index": 19735 + } + }, + { + "items": [ + 10398.5, + 2.589 + ], + "hints": { + "index": 19736 + } + }, + { + "items": [ + 10399, + 2.6372001171112061 + ], + "hints": { + "index": 19737 + } + }, + { + "items": [ + 10399.5, + 2.5934000015258789 + ], + "hints": { + "index": 19738 + } + }, + { + "items": [ + 10400, + 2.6185998916625977 + ], + "hints": { + "index": 19739 + } + }, + { + "items": [ + 10400.5, + 2.5766 + ], + "hints": { + "index": 19740 + } + }, + { + "items": [ + 10401, + 2.70770001411438 + ], + "hints": { + "index": 19741 + } + }, + { + "items": [ + 10401.5, + 2.7590000629425049 + ], + "hints": { + "index": 19742 + } + }, + { + "items": [ + 10402, + 2.7734000682830811 + ], + "hints": { + "index": 19743 + } + }, + { + "items": [ + 10402.5, + 2.6673998832702637 + ], + "hints": { + "index": 19744 + } + }, + { + "items": [ + 10403, + 2.7025001049041748 + ], + "hints": { + "index": 19745 + } + }, + { + "items": [ + 10403.5, + 2.6273000240325928 + ], + "hints": { + "index": 19746 + } + }, + { + "items": [ + 10404, + 2.6935999393463135 + ], + "hints": { + "index": 19747 + } + }, + { + "items": [ + 10404.5, + 2.7108 + ], + "hints": { + "index": 19748 + } + }, + { + "items": [ + 10405, + 2.7887001037597656 + ], + "hints": { + "index": 19749 + } + }, + { + "items": [ + 10405.5, + 2.7564001083374023 + ], + "hints": { + "index": 19750 + } + }, + { + "items": [ + 10406, + 2.6217000484466553 + ], + "hints": { + "index": 19751 + } + }, + { + "items": [ + 10406.5, + 2.6222999095916748 + ], + "hints": { + "index": 19752 + } + }, + { + "items": [ + 10407, + 2.6626999378204346 + ], + "hints": { + "index": 19753 + } + }, + { + "items": [ + 10407.5, + 2.7281999588012695 + ], + "hints": { + "index": 19754 + } + }, + { + "items": [ + 10408, + 2.7660999298095703 + ], + "hints": { + "index": 19755 + } + }, + { + "items": [ + 10408.5, + 2.6707000732421875 + ], + "hints": { + "index": 19756 + } + }, + { + "items": [ + 10409, + 2.6765999794006348 + ], + "hints": { + "index": 19757 + } + }, + { + "items": [ + 10409.5, + 2.551800012588501 + ], + "hints": { + "index": 19758 + } + }, + { + "items": [ + 10410, + 2.5861001014709473 + ], + "hints": { + "index": 19759 + } + }, + { + "items": [ + 10410.5, + 2.6465 + ], + "hints": { + "index": 19760 + } + }, + { + "items": [ + 10411, + 2.6807000637054443 + ], + "hints": { + "index": 19761 + } + }, + { + "items": [ + 10411.5, + 2.6858000755310059 + ], + "hints": { + "index": 19762 + } + }, + { + "items": [ + 10412, + 2.6078000068664551 + ], + "hints": { + "index": 19763 + } + }, + { + "items": [ + 10412.5, + 2.6889 + ], + "hints": { + "index": 19764 + } + }, + { + "items": [ + 10413, + 2.5875000953674316 + ], + "hints": { + "index": 19765 + } + }, + { + "items": [ + 10413.5, + 2.6327 + ], + "hints": { + "index": 19766 + } + }, + { + "items": [ + 10414, + 2.524 + ], + "hints": { + "index": 19767 + } + }, + { + "items": [ + 10414.5, + 2.6 + ], + "hints": { + "index": 19768 + } + }, + { + "items": [ + 10415, + 2.5109 + ], + "hints": { + "index": 19769 + } + }, + { + "items": [ + 10415.5, + 2.5012 + ], + "hints": { + "index": 19770 + } + }, + { + "items": [ + 10416, + 2.5545 + ], + "hints": { + "index": 19771 + } + }, + { + "items": [ + 10416.5, + 2.6045 + ], + "hints": { + "index": 19772 + } + }, + { + "items": [ + 10417, + 2.6297 + ], + "hints": { + "index": 19773 + } + }, + { + "items": [ + 10417.5, + 2.6187 + ], + "hints": { + "index": 19774 + } + }, + { + "items": [ + 10418, + 2.5868 + ], + "hints": { + "index": 19775 + } + }, + { + "items": [ + 10418.5, + 2.6324 + ], + "hints": { + "index": 19776 + } + }, + { + "items": [ + 10419, + 2.6464 + ], + "hints": { + "index": 19777 + } + }, + { + "items": [ + 10419.5, + 2.6876 + ], + "hints": { + "index": 19778 + } + }, + { + "items": [ + 10420, + 2.7422 + ], + "hints": { + "index": 19779 + } + }, + { + "items": [ + 10420.5, + 2.6799 + ], + "hints": { + "index": 19780 + } + }, + { + "items": [ + 10421, + 2.6734 + ], + "hints": { + "index": 19781 + } + }, + { + "items": [ + 10421.5, + 2.6153 + ], + "hints": { + "index": 19782 + } + }, + { + "items": [ + 10422, + 2.6313 + ], + "hints": { + "index": 19783 + } + }, + { + "items": [ + 10422.5, + 2.6638 + ], + "hints": { + "index": 19784 + } + }, + { + "items": [ + 10423, + 2.8201 + ], + "hints": { + "index": 19785 + } + }, + { + "items": [ + 10423.5, + 2.8094 + ], + "hints": { + "index": 19786 + } + }, + { + "items": [ + 10424, + 2.7211 + ], + "hints": { + "index": 19787 + } + }, + { + "items": [ + 10424.5, + 2.5467000007629395 + ], + "hints": { + "index": 19788 + } + }, + { + "items": [ + 10425, + 2.5201001167297363 + ], + "hints": { + "index": 19789 + } + }, + { + "items": [ + 10425.5, + 2.5940999984741211 + ], + "hints": { + "index": 19790 + } + }, + { + "items": [ + 10426, + 2.7276999950408936 + ], + "hints": { + "index": 19791 + } + }, + { + "items": [ + 10426.5, + 2.8845999240875244 + ], + "hints": { + "index": 19792 + } + }, + { + "items": [ + 10427, + 2.7760000228881836 + ], + "hints": { + "index": 19793 + } + }, + { + "items": [ + 10427.5, + 2.6549999713897705 + ], + "hints": { + "index": 19794 + } + }, + { + "items": [ + 10428, + 2.5578999519348145 + ], + "hints": { + "index": 19795 + } + }, + { + "items": [ + 10428.5, + 2.6647999286651611 + ], + "hints": { + "index": 19796 + } + }, + { + "items": [ + 10429, + 2.7499001026153564 + ], + "hints": { + "index": 19797 + } + }, + { + "items": [ + 10429.5, + 2.7834999561309814 + ], + "hints": { + "index": 19798 + } + }, + { + "items": [ + 10430, + 2.8452999591827393 + ], + "hints": { + "index": 19799 + } + }, + { + "items": [ + 10430.5, + 2.7563 + ], + "hints": { + "index": 19800 + } + }, + { + "items": [ + 10431, + 2.7623000144958496 + ], + "hints": { + "index": 19801 + } + }, + { + "items": [ + 10431.5, + 2.651900053024292 + ], + "hints": { + "index": 19802 + } + }, + { + "items": [ + 10432, + 2.6212000846862793 + ], + "hints": { + "index": 19803 + } + }, + { + "items": [ + 10432.5, + 2.6619999408721924 + ], + "hints": { + "index": 19804 + } + }, + { + "items": [ + 10433, + 2.7315 + ], + "hints": { + "index": 19805 + } + }, + { + "items": [ + 10433.5, + 2.7873 + ], + "hints": { + "index": 19806 + } + }, + { + "items": [ + 10434, + 2.6592 + ], + "hints": { + "index": 19807 + } + }, + { + "items": [ + 10434.5, + 2.6401 + ], + "hints": { + "index": 19808 + } + }, + { + "items": [ + 10435, + 2.6752 + ], + "hints": { + "index": 19809 + } + }, + { + "items": [ + 10435.5, + 2.6917 + ], + "hints": { + "index": 19810 + } + }, + { + "items": [ + 10436, + 2.7143 + ], + "hints": { + "index": 19811 + } + }, + { + "items": [ + 10436.5, + 2.8265 + ], + "hints": { + "index": 19812 + } + }, + { + "items": [ + 10437, + 2.8574 + ], + "hints": { + "index": 19813 + } + }, + { + "items": [ + 10437.5, + 2.7337 + ], + "hints": { + "index": 19814 + } + }, + { + "items": [ + 10438, + 2.5217 + ], + "hints": { + "index": 19815 + } + }, + { + "items": [ + 10438.5, + 2.5771 + ], + "hints": { + "index": 19816 + } + }, + { + "items": [ + 10439, + 2.6809 + ], + "hints": { + "index": 19817 + } + }, + { + "items": [ + 10439.5, + 2.7897 + ], + "hints": { + "index": 19818 + } + }, + { + "items": [ + 10440, + 2.6049 + ], + "hints": { + "index": 19819 + } + }, + { + "items": [ + 10440.5, + 2.5394999980926514 + ], + "hints": { + "index": 19820 + } + }, + { + "items": [ + 10441, + 2.5494999885559082 + ], + "hints": { + "index": 19821 + } + }, + { + "items": [ + 10441.5, + 2.6115999221801758 + ], + "hints": { + "index": 19822 + } + }, + { + "items": [ + 10442, + 2.5692999362945557 + ], + "hints": { + "index": 19823 + } + }, + { + "items": [ + 10442.5, + 2.5984001159667969 + ], + "hints": { + "index": 19824 + } + }, + { + "items": [ + 10443, + 2.6519999504089355 + ], + "hints": { + "index": 19825 + } + }, + { + "items": [ + 10443.5, + 2.8252999782562256 + ], + "hints": { + "index": 19826 + } + }, + { + "items": [ + 10444, + 2.7781 + ], + "hints": { + "index": 19827 + } + }, + { + "items": [ + 10444.5, + 2.6505 + ], + "hints": { + "index": 19828 + } + }, + { + "items": [ + 10445, + 2.4974 + ], + "hints": { + "index": 19829 + } + }, + { + "items": [ + 10445.5, + 2.5129 + ], + "hints": { + "index": 19830 + } + }, + { + "items": [ + 10446, + 2.5864 + ], + "hints": { + "index": 19831 + } + }, + { + "items": [ + 10446.5, + 2.5984 + ], + "hints": { + "index": 19832 + } + }, + { + "items": [ + 10447, + 2.555 + ], + "hints": { + "index": 19833 + } + }, + { + "items": [ + 10447.5, + 2.5693 + ], + "hints": { + "index": 19834 + } + }, + { + "items": [ + 10448, + 2.6929 + ], + "hints": { + "index": 19835 + } + }, + { + "items": [ + 10448.5, + 2.7421998977661133 + ], + "hints": { + "index": 19836 + } + }, + { + "items": [ + 10449, + 2.738899946212769 + ], + "hints": { + "index": 19837 + } + }, + { + "items": [ + 10449.5, + 2.6607000827789307 + ], + "hints": { + "index": 19838 + } + }, + { + "items": [ + 10450, + 2.6573 + ], + "hints": { + "index": 19839 + } + }, + { + "items": [ + 10450.5, + 2.6782 + ], + "hints": { + "index": 19840 + } + }, + { + "items": [ + 10451, + 2.7071 + ], + "hints": { + "index": 19841 + } + }, + { + "items": [ + 10451.5, + 2.633 + ], + "hints": { + "index": 19842 + } + }, + { + "items": [ + 10452, + 2.6378 + ], + "hints": { + "index": 19843 + } + }, + { + "items": [ + 10452.5, + 2.6458001136779785 + ], + "hints": { + "index": 19844 + } + }, + { + "items": [ + 10453, + 2.7527000904083252 + ], + "hints": { + "index": 19845 + } + }, + { + "items": [ + 10453.5, + 2.8097 + ], + "hints": { + "index": 19846 + } + }, + { + "items": [ + 10454, + 2.7617 + ], + "hints": { + "index": 19847 + } + }, + { + "items": [ + 10454.5, + 2.779900074005127 + ], + "hints": { + "index": 19848 + } + }, + { + "items": [ + 10455, + 2.7498 + ], + "hints": { + "index": 19849 + } + }, + { + "items": [ + 10455.5, + 2.7885 + ], + "hints": { + "index": 19850 + } + }, + { + "items": [ + 10456, + 2.8051 + ], + "hints": { + "index": 19851 + } + }, + { + "items": [ + 10456.5, + 2.7986 + ], + "hints": { + "index": 19852 + } + }, + { + "items": [ + 10457, + 2.7986 + ], + "hints": { + "index": 19853 + } + }, + { + "items": [ + 10457.5, + 2.7541 + ], + "hints": { + "index": 19854 + } + }, + { + "items": [ + 10458, + 2.7528 + ], + "hints": { + "index": 19855 + } + }, + { + "items": [ + 10458.5, + 2.7501 + ], + "hints": { + "index": 19856 + } + }, + { + "items": [ + 10459, + 2.7216 + ], + "hints": { + "index": 19857 + } + }, + { + "items": [ + 10459.5, + 2.6518 + ], + "hints": { + "index": 19858 + } + }, + { + "items": [ + 10460, + 2.6401 + ], + "hints": { + "index": 19859 + } + }, + { + "items": [ + 10460.5, + 2.5978999137878418 + ], + "hints": { + "index": 19860 + } + }, + { + "items": [ + 10461, + 2.7451 + ], + "hints": { + "index": 19861 + } + }, + { + "items": [ + 10461.5, + 2.7146 + ], + "hints": { + "index": 19862 + } + }, + { + "items": [ + 10462, + 2.6751999855041504 + ], + "hints": { + "index": 19863 + } + }, + { + "items": [ + 10462.5, + 2.53410005569458 + ], + "hints": { + "index": 19864 + } + }, + { + "items": [ + 10463, + 2.5613999366760254 + ], + "hints": { + "index": 19865 + } + }, + { + "items": [ + 10463.5, + 2.6505 + ], + "hints": { + "index": 19866 + } + }, + { + "items": [ + 10464, + 2.6535000801086426 + ], + "hints": { + "index": 19867 + } + }, + { + "items": [ + 10464.5, + 2.6733999252319336 + ], + "hints": { + "index": 19868 + } + }, + { + "items": [ + 10465, + 2.6359999179840088 + ], + "hints": { + "index": 19869 + } + }, + { + "items": [ + 10465.5, + 2.6702 + ], + "hints": { + "index": 19870 + } + }, + { + "items": [ + 10466, + 2.6343998908996582 + ], + "hints": { + "index": 19871 + } + }, + { + "items": [ + 10466.5, + 2.5724999904632568 + ], + "hints": { + "index": 19872 + } + }, + { + "items": [ + 10467, + 2.6166 + ], + "hints": { + "index": 19873 + } + }, + { + "items": [ + 10467.5, + 2.6232 + ], + "hints": { + "index": 19874 + } + }, + { + "items": [ + 10468, + 2.6576 + ], + "hints": { + "index": 19875 + } + }, + { + "items": [ + 10468.5, + 2.6194000244140625 + ], + "hints": { + "index": 19876 + } + }, + { + "items": [ + 10469, + 2.5471000671386719 + ], + "hints": { + "index": 19877 + } + }, + { + "items": [ + 10469.5, + 2.69 + ], + "hints": { + "index": 19878 + } + }, + { + "items": [ + 10470, + 2.9689 + ], + "hints": { + "index": 19879 + } + }, + { + "items": [ + 10470.5, + 3.1544 + ], + "hints": { + "index": 19880 + } + }, + { + "items": [ + 10471, + 3.0438 + ], + "hints": { + "index": 19881 + } + }, + { + "items": [ + 10471.5, + 2.795 + ], + "hints": { + "index": 19882 + } + }, + { + "items": [ + 10472, + 2.9054000377655029 + ], + "hints": { + "index": 19883 + } + }, + { + "items": [ + 10472.5, + 3.0293 + ], + "hints": { + "index": 19884 + } + }, + { + "items": [ + 10473, + 3.0415000915527344 + ], + "hints": { + "index": 19885 + } + }, + { + "items": [ + 10473.5, + 2.812999963760376 + ], + "hints": { + "index": 19886 + } + }, + { + "items": [ + 10474, + 2.6012001037597656 + ], + "hints": { + "index": 19887 + } + }, + { + "items": [ + 10474.5, + 2.5192 + ], + "hints": { + "index": 19888 + } + }, + { + "items": [ + 10475, + 2.5056 + ], + "hints": { + "index": 19889 + } + }, + { + "items": [ + 10475.5, + 2.6634 + ], + "hints": { + "index": 19890 + } + }, + { + "items": [ + 10476, + 2.661 + ], + "hints": { + "index": 19891 + } + }, + { + "items": [ + 10476.5, + 2.696 + ], + "hints": { + "index": 19892 + } + }, + { + "items": [ + 10477, + 2.6586999893188477 + ], + "hints": { + "index": 19893 + } + }, + { + "items": [ + 10477.5, + 2.69950008392334 + ], + "hints": { + "index": 19894 + } + }, + { + "items": [ + 10478, + 2.7660999298095703 + ], + "hints": { + "index": 19895 + } + }, + { + "items": [ + 10478.5, + 2.8047 + ], + "hints": { + "index": 19896 + } + }, + { + "items": [ + 10479, + 2.7558999061584473 + ], + "hints": { + "index": 19897 + } + }, + { + "items": [ + 10479.5, + 2.7242999076843266 + ], + "hints": { + "index": 19898 + } + }, + { + "items": [ + 10480, + 2.6586000919342041 + ], + "hints": { + "index": 19899 + } + }, + { + "items": [ + 10480.5, + 2.5834000110626221 + ], + "hints": { + "index": 19900 + } + }, + { + "items": [ + 10481, + 2.561500072479248 + ], + "hints": { + "index": 19901 + } + }, + { + "items": [ + 10481.5, + 2.6036999225616455 + ], + "hints": { + "index": 19902 + } + }, + { + "items": [ + 10482, + 2.6891 + ], + "hints": { + "index": 19903 + } + }, + { + "items": [ + 10482.5, + 2.6685 + ], + "hints": { + "index": 19904 + } + }, + { + "items": [ + 10483, + 2.6435 + ], + "hints": { + "index": 19905 + } + }, + { + "items": [ + 10483.5, + 2.676 + ], + "hints": { + "index": 19906 + } + }, + { + "items": [ + 10484, + 2.7827999591827393 + ], + "hints": { + "index": 19907 + } + }, + { + "items": [ + 10484.5, + 2.7905 + ], + "hints": { + "index": 19908 + } + }, + { + "items": [ + 10485, + 2.774 + ], + "hints": { + "index": 19909 + } + }, + { + "items": [ + 10485.5, + 2.6514 + ], + "hints": { + "index": 19910 + } + }, + { + "items": [ + 10486, + 2.6119 + ], + "hints": { + "index": 19911 + } + }, + { + "items": [ + 10486.5, + 2.6286 + ], + "hints": { + "index": 19912 + } + }, + { + "items": [ + 10487, + 2.7172 + ], + "hints": { + "index": 19913 + } + }, + { + "items": [ + 10487.5, + 2.7283 + ], + "hints": { + "index": 19914 + } + }, + { + "items": [ + 10488, + 2.6986 + ], + "hints": { + "index": 19915 + } + }, + { + "items": [ + 10488.5, + 2.6837 + ], + "hints": { + "index": 19916 + } + }, + { + "items": [ + 10489, + 2.7068 + ], + "hints": { + "index": 19917 + } + }, + { + "items": [ + 10489.5, + 2.681 + ], + "hints": { + "index": 19918 + } + }, + { + "items": [ + 10490, + 2.6465 + ], + "hints": { + "index": 19919 + } + }, + { + "items": [ + 10490.5, + 2.6085000038146973 + ], + "hints": { + "index": 19920 + } + }, + { + "items": [ + 10491, + 2.6519999504089355 + ], + "hints": { + "index": 19921 + } + }, + { + "items": [ + 10491.5, + 2.6577000617980957 + ], + "hints": { + "index": 19922 + } + }, + { + "items": [ + 10492, + 2.6382999420166016 + ], + "hints": { + "index": 19923 + } + }, + { + "items": [ + 10492.5, + 2.6738998889923096 + ], + "hints": { + "index": 19924 + } + }, + { + "items": [ + 10493, + 2.5624001026153564 + ], + "hints": { + "index": 19925 + } + }, + { + "items": [ + 10493.5, + 2.5566999912261963 + ], + "hints": { + "index": 19926 + } + }, + { + "items": [ + 10494, + 2.5861001014709473 + ], + "hints": { + "index": 19927 + } + }, + { + "items": [ + 10494.5, + 2.7788999080657959 + ], + "hints": { + "index": 19928 + } + }, + { + "items": [ + 10495, + 2.8334000110626221 + ], + "hints": { + "index": 19929 + } + }, + { + "items": [ + 10495.5, + 2.750999927520752 + ], + "hints": { + "index": 19930 + } + }, + { + "items": [ + 10496, + 2.6849000453948975 + ], + "hints": { + "index": 19931 + } + }, + { + "items": [ + 10496.5, + 2.7320001125335693 + ], + "hints": { + "index": 19932 + } + }, + { + "items": [ + 10497, + 2.7398 + ], + "hints": { + "index": 19933 + } + }, + { + "items": [ + 10497.5, + 2.6987 + ], + "hints": { + "index": 19934 + } + }, + { + "items": [ + 10498, + 2.6471 + ], + "hints": { + "index": 19935 + } + }, + { + "items": [ + 10498.5, + 2.6517 + ], + "hints": { + "index": 19936 + } + }, + { + "items": [ + 10499, + 2.7697 + ], + "hints": { + "index": 19937 + } + }, + { + "items": [ + 10499.5, + 2.7685 + ], + "hints": { + "index": 19938 + } + }, + { + "items": [ + 10500, + 2.7699 + ], + "hints": { + "index": 19939 + } + }, + { + "items": [ + 10500.5, + 2.652 + ], + "hints": { + "index": 19940 + } + }, + { + "items": [ + 10501, + 2.6287 + ], + "hints": { + "index": 19941 + } + }, + { + "items": [ + 10501.5, + 2.75 + ], + "hints": { + "index": 19942 + } + }, + { + "items": [ + 10502, + 2.9539 + ], + "hints": { + "index": 19943 + } + }, + { + "items": [ + 10502.5, + 2.919 + ], + "hints": { + "index": 19944 + } + }, + { + "items": [ + 10503, + 2.7173 + ], + "hints": { + "index": 19945 + } + }, + { + "items": [ + 10503.5, + 2.5175 + ], + "hints": { + "index": 19946 + } + }, + { + "items": [ + 10504, + 2.664 + ], + "hints": { + "index": 19947 + } + }, + { + "items": [ + 10504.5, + 2.8558 + ], + "hints": { + "index": 19948 + } + }, + { + "items": [ + 10505, + 3.2568 + ], + "hints": { + "index": 19949 + } + }, + { + "items": [ + 10505.5, + 3.3285 + ], + "hints": { + "index": 19950 + } + }, + { + "items": [ + 10506, + 3.1761 + ], + "hints": { + "index": 19951 + } + }, + { + "items": [ + 10506.5, + 2.8247 + ], + "hints": { + "index": 19952 + } + }, + { + "items": [ + 10507, + 2.7479 + ], + "hints": { + "index": 19953 + } + }, + { + "items": [ + 10507.5, + 2.8204 + ], + "hints": { + "index": 19954 + } + }, + { + "items": [ + 10508, + 2.8925 + ], + "hints": { + "index": 19955 + } + }, + { + "items": [ + 10508.5, + 3.1757 + ], + "hints": { + "index": 19956 + } + }, + { + "items": [ + 10509, + 3.251 + ], + "hints": { + "index": 19957 + } + }, + { + "items": [ + 10509.5, + 3.0126 + ], + "hints": { + "index": 19958 + } + }, + { + "items": [ + 10510, + 2.6485 + ], + "hints": { + "index": 19959 + } + }, + { + "items": [ + 10510.5, + 2.6016 + ], + "hints": { + "index": 19960 + } + }, + { + "items": [ + 10511, + 2.8067 + ], + "hints": { + "index": 19961 + } + }, + { + "items": [ + 10511.5, + 3.0206 + ], + "hints": { + "index": 19962 + } + }, + { + "items": [ + 10512, + 2.9155 + ], + "hints": { + "index": 19963 + } + }, + { + "items": [ + 10512.5, + 2.6492 + ], + "hints": { + "index": 19964 + } + }, + { + "items": [ + 10513, + 2.5508 + ], + "hints": { + "index": 19965 + } + }, + { + "items": [ + 10513.5, + 2.5836 + ], + "hints": { + "index": 19966 + } + }, + { + "items": [ + 10514, + 2.7335 + ], + "hints": { + "index": 19967 + } + }, + { + "items": [ + 10514.5, + 2.7175 + ], + "hints": { + "index": 19968 + } + }, + { + "items": [ + 10515, + 2.6717 + ], + "hints": { + "index": 19969 + } + }, + { + "items": [ + 10515.5, + 2.6644 + ], + "hints": { + "index": 19970 + } + }, + { + "items": [ + 10516, + 2.6427 + ], + "hints": { + "index": 19971 + } + }, + { + "items": [ + 10516.5, + 2.7356 + ], + "hints": { + "index": 19972 + } + }, + { + "items": [ + 10517, + 2.7549 + ], + "hints": { + "index": 19973 + } + }, + { + "items": [ + 10517.5, + 2.7099 + ], + "hints": { + "index": 19974 + } + }, + { + "items": [ + 10518, + 2.6606 + ], + "hints": { + "index": 19975 + } + }, + { + "items": [ + 10518.5, + 2.6328 + ], + "hints": { + "index": 19976 + } + }, + { + "items": [ + 10519, + 2.7165 + ], + "hints": { + "index": 19977 + } + }, + { + "items": [ + 10519.5, + 2.6553 + ], + "hints": { + "index": 19978 + } + }, + { + "items": [ + 10520, + 2.6469 + ], + "hints": { + "index": 19979 + } + }, + { + "items": [ + 10520.5, + 2.61 + ], + "hints": { + "index": 19980 + } + }, + { + "items": [ + 10521, + 2.6238 + ], + "hints": { + "index": 19981 + } + }, + { + "items": [ + 10521.5, + 2.535 + ], + "hints": { + "index": 19982 + } + }, + { + "items": [ + 10522, + 2.6425 + ], + "hints": { + "index": 19983 + } + }, + { + "items": [ + 10522.5, + 2.6577 + ], + "hints": { + "index": 19984 + } + }, + { + "items": [ + 10523, + 2.6988 + ], + "hints": { + "index": 19985 + } + }, + { + "items": [ + 10523.5, + 2.5659 + ], + "hints": { + "index": 19986 + } + }, + { + "items": [ + 10524, + 2.6212 + ], + "hints": { + "index": 19987 + } + }, + { + "items": [ + 10524.5, + 2.7511000633239746 + ], + "hints": { + "index": 19988 + } + }, + { + "items": [ + 10525, + 2.7999000549316406 + ], + "hints": { + "index": 19989 + } + }, + { + "items": [ + 10525.5, + 2.7155001163482666 + ], + "hints": { + "index": 19990 + } + }, + { + "items": [ + 10526, + 2.59 + ], + "hints": { + "index": 19991 + } + }, + { + "items": [ + 10526.5, + 2.589900016784668 + ], + "hints": { + "index": 19992 + } + }, + { + "items": [ + 10527, + 2.5989999771118164 + ], + "hints": { + "index": 19993 + } + }, + { + "items": [ + 10527.5, + 2.61680006980896 + ], + "hints": { + "index": 19994 + } + }, + { + "items": [ + 10528, + 2.5660998821258545 + ], + "hints": { + "index": 19995 + } + }, + { + "items": [ + 10528.5, + 2.5464999675750732 + ], + "hints": { + "index": 19996 + } + }, + { + "items": [ + 10529, + 2.5344 + ], + "hints": { + "index": 19997 + } + }, + { + "items": [ + 10529.5, + 2.5382 + ], + "hints": { + "index": 19998 + } + }, + { + "items": [ + 10530, + 2.5507 + ], + "hints": { + "index": 19999 + } + }, + { + "items": [ + 10530.5, + 2.5617 + ], + "hints": { + "index": 20000 + } + }, + { + "items": [ + 10531, + 2.5663 + ], + "hints": { + "index": 20001 + } + }, + { + "items": [ + 10531.5, + 2.5297 + ], + "hints": { + "index": 20002 + } + }, + { + "items": [ + 10532, + 2.5196 + ], + "hints": { + "index": 20003 + } + }, + { + "items": [ + 10532.5, + 2.5179 + ], + "hints": { + "index": 20004 + } + }, + { + "items": [ + 10533, + 2.5451 + ], + "hints": { + "index": 20005 + } + }, + { + "items": [ + 10533.5, + 2.5779 + ], + "hints": { + "index": 20006 + } + }, + { + "items": [ + 10534, + 2.5955 + ], + "hints": { + "index": 20007 + } + }, + { + "items": [ + 10534.5, + 2.623 + ], + "hints": { + "index": 20008 + } + }, + { + "items": [ + 10535, + 2.6629 + ], + "hints": { + "index": 20009 + } + }, + { + "items": [ + 10535.5, + 2.6854 + ], + "hints": { + "index": 20010 + } + }, + { + "items": [ + 10536, + 2.712 + ], + "hints": { + "index": 20011 + } + }, + { + "items": [ + 10536.5, + 2.7252 + ], + "hints": { + "index": 20012 + } + }, + { + "items": [ + 10537, + 2.8103 + ], + "hints": { + "index": 20013 + } + }, + { + "items": [ + 10537.5, + 2.7498 + ], + "hints": { + "index": 20014 + } + }, + { + "items": [ + 10538, + 2.5592 + ], + "hints": { + "index": 20015 + } + }, + { + "items": [ + 10538.5, + 2.4552 + ], + "hints": { + "index": 20016 + } + }, + { + "items": [ + 10539, + 2.4807 + ], + "hints": { + "index": 20017 + } + }, + { + "items": [ + 10539.5, + 2.639 + ], + "hints": { + "index": 20018 + } + }, + { + "items": [ + 10540, + 2.6024 + ], + "hints": { + "index": 20019 + } + }, + { + "items": [ + 10540.5, + 2.5647 + ], + "hints": { + "index": 20020 + } + }, + { + "items": [ + 10541, + 2.5289 + ], + "hints": { + "index": 20021 + } + }, + { + "items": [ + 10541.5, + 2.5891 + ], + "hints": { + "index": 20022 + } + }, + { + "items": [ + 10542, + 2.6466000080108643 + ], + "hints": { + "index": 20023 + } + }, + { + "items": [ + 10542.5, + 2.6438999176025391 + ], + "hints": { + "index": 20024 + } + }, + { + "items": [ + 10543, + 2.6368999481201172 + ], + "hints": { + "index": 20025 + } + }, + { + "items": [ + 10543.5, + 2.6001999378204346 + ], + "hints": { + "index": 20026 + } + }, + { + "items": [ + 10544, + 2.6242001056671143 + ], + "hints": { + "index": 20027 + } + }, + { + "items": [ + 10544.5, + 2.6386001110076904 + ], + "hints": { + "index": 20028 + } + }, + { + "items": [ + 10545, + 2.7244000434875488 + ], + "hints": { + "index": 20029 + } + }, + { + "items": [ + 10545.5, + 2.716900110244751 + ], + "hints": { + "index": 20030 + } + }, + { + "items": [ + 10546, + 2.6394999027252197 + ], + "hints": { + "index": 20031 + } + }, + { + "items": [ + 10546.5, + 2.5906999111175537 + ], + "hints": { + "index": 20032 + } + }, + { + "items": [ + 10547, + 2.6445000171661377 + ], + "hints": { + "index": 20033 + } + }, + { + "items": [ + 10547.5, + 2.7104001045227051 + ], + "hints": { + "index": 20034 + } + }, + { + "items": [ + 10548, + 2.628000020980835 + ], + "hints": { + "index": 20035 + } + }, + { + "items": [ + 10548.5, + 2.5583999156951904 + ], + "hints": { + "index": 20036 + } + }, + { + "items": [ + 10549, + 2.6170001029968266 + ], + "hints": { + "index": 20037 + } + }, + { + "items": [ + 10549.5, + 2.6909000873565674 + ], + "hints": { + "index": 20038 + } + }, + { + "items": [ + 10550, + 2.699199914932251 + ], + "hints": { + "index": 20039 + } + }, + { + "items": [ + 10550.5, + 2.6993000507354736 + ], + "hints": { + "index": 20040 + } + }, + { + "items": [ + 10551, + 2.651400089263916 + ], + "hints": { + "index": 20041 + } + }, + { + "items": [ + 10551.5, + 2.6521000862121582 + ], + "hints": { + "index": 20042 + } + }, + { + "items": [ + 10552, + 2.6066999435424805 + ], + "hints": { + "index": 20043 + } + }, + { + "items": [ + 10552.5, + 2.6243999004364018 + ], + "hints": { + "index": 20044 + } + }, + { + "items": [ + 10553, + 2.7131 + ], + "hints": { + "index": 20045 + } + }, + { + "items": [ + 10553.5, + 2.774399995803833 + ], + "hints": { + "index": 20046 + } + }, + { + "items": [ + 10554, + 2.862299919128418 + ], + "hints": { + "index": 20047 + } + }, + { + "items": [ + 10554.5, + 2.7086999416351318 + ], + "hints": { + "index": 20048 + } + }, + { + "items": [ + 10555, + 2.5940999984741211 + ], + "hints": { + "index": 20049 + } + }, + { + "items": [ + 10555.5, + 2.5204000473022461 + ], + "hints": { + "index": 20050 + } + }, + { + "items": [ + 10556, + 2.5697999000549316 + ], + "hints": { + "index": 20051 + } + }, + { + "items": [ + 10556.5, + 2.6321001052856445 + ], + "hints": { + "index": 20052 + } + }, + { + "items": [ + 10557, + 2.6482000350952148 + ], + "hints": { + "index": 20053 + } + }, + { + "items": [ + 10557.5, + 2.6565001010894775 + ], + "hints": { + "index": 20054 + } + }, + { + "items": [ + 10558, + 2.7030000686645508 + ], + "hints": { + "index": 20055 + } + }, + { + "items": [ + 10558.5, + 2.7304999828338623 + ], + "hints": { + "index": 20056 + } + }, + { + "items": [ + 10559, + 2.8078000545501709 + ], + "hints": { + "index": 20057 + } + }, + { + "items": [ + 10559.5, + 2.7837998867034912 + ], + "hints": { + "index": 20058 + } + }, + { + "items": [ + 10560, + 2.8124001026153564 + ], + "hints": { + "index": 20059 + } + }, + { + "items": [ + 10560.5, + 2.8160998821258545 + ], + "hints": { + "index": 20060 + } + }, + { + "items": [ + 10561, + 2.7506999969482422 + ], + "hints": { + "index": 20061 + } + }, + { + "items": [ + 10561.5, + 2.6198000907897949 + ], + "hints": { + "index": 20062 + } + }, + { + "items": [ + 10562, + 2.5713000297546387 + ], + "hints": { + "index": 20063 + } + }, + { + "items": [ + 10562.5, + 2.5613999366760254 + ], + "hints": { + "index": 20064 + } + }, + { + "items": [ + 10563, + 2.6124000549316406 + ], + "hints": { + "index": 20065 + } + }, + { + "items": [ + 10563.5, + 2.5668001174926758 + ], + "hints": { + "index": 20066 + } + }, + { + "items": [ + 10564, + 2.624000072479248 + ], + "hints": { + "index": 20067 + } + }, + { + "items": [ + 10564.5, + 2.6891 + ], + "hints": { + "index": 20068 + } + }, + { + "items": [ + 10565, + 2.7833 + ], + "hints": { + "index": 20069 + } + }, + { + "items": [ + 10565.5, + 2.8304998874664307 + ], + "hints": { + "index": 20070 + } + }, + { + "items": [ + 10566, + 2.7832 + ], + "hints": { + "index": 20071 + } + }, + { + "items": [ + 10566.5, + 2.746 + ], + "hints": { + "index": 20072 + } + }, + { + "items": [ + 10567, + 2.7088 + ], + "hints": { + "index": 20073 + } + }, + { + "items": [ + 10567.5, + 2.7074999809265137 + ], + "hints": { + "index": 20074 + } + }, + { + "items": [ + 10568, + 2.6078 + ], + "hints": { + "index": 20075 + } + }, + { + "items": [ + 10568.5, + 2.5308 + ], + "hints": { + "index": 20076 + } + }, + { + "items": [ + 10569, + 2.5991001129150391 + ], + "hints": { + "index": 20077 + } + }, + { + "items": [ + 10569.5, + 2.595 + ], + "hints": { + "index": 20078 + } + }, + { + "items": [ + 10570, + 2.6186 + ], + "hints": { + "index": 20079 + } + }, + { + "items": [ + 10570.5, + 2.6303 + ], + "hints": { + "index": 20080 + } + }, + { + "items": [ + 10571, + 2.6891 + ], + "hints": { + "index": 20081 + } + }, + { + "items": [ + 10571.5, + 2.7167 + ], + "hints": { + "index": 20082 + } + }, + { + "items": [ + 10572, + 2.6108 + ], + "hints": { + "index": 20083 + } + }, + { + "items": [ + 10572.5, + 2.595 + ], + "hints": { + "index": 20084 + } + }, + { + "items": [ + 10573, + 2.5859999656677246 + ], + "hints": { + "index": 20085 + } + }, + { + "items": [ + 10573.5, + 2.6239 + ], + "hints": { + "index": 20086 + } + }, + { + "items": [ + 10574, + 2.64709997177124 + ], + "hints": { + "index": 20087 + } + }, + { + "items": [ + 10574.5, + 2.6638 + ], + "hints": { + "index": 20088 + } + }, + { + "items": [ + 10575, + 2.6876 + ], + "hints": { + "index": 20089 + } + }, + { + "items": [ + 10575.5, + 2.7039999961853027 + ], + "hints": { + "index": 20090 + } + }, + { + "items": [ + 10576, + 2.6446 + ], + "hints": { + "index": 20091 + } + }, + { + "items": [ + 10576.5, + 2.5592000484466553 + ], + "hints": { + "index": 20092 + } + }, + { + "items": [ + 10577, + 2.6023 + ], + "hints": { + "index": 20093 + } + }, + { + "items": [ + 10577.5, + 2.704 + ], + "hints": { + "index": 20094 + } + }, + { + "items": [ + 10578, + 2.7631 + ], + "hints": { + "index": 20095 + } + }, + { + "items": [ + 10578.5, + 2.7126 + ], + "hints": { + "index": 20096 + } + }, + { + "items": [ + 10579, + 2.574 + ], + "hints": { + "index": 20097 + } + }, + { + "items": [ + 10579.5, + 2.5885 + ], + "hints": { + "index": 20098 + } + }, + { + "items": [ + 10580, + 2.546 + ], + "hints": { + "index": 20099 + } + }, + { + "items": [ + 10580.5, + 2.645299911499023 + ], + "hints": { + "index": 20100 + } + }, + { + "items": [ + 10581, + 2.6252999305725098 + ], + "hints": { + "index": 20101 + } + }, + { + "items": [ + 10581.5, + 2.6637001037597656 + ], + "hints": { + "index": 20102 + } + }, + { + "items": [ + 10582, + 2.69350004196167 + ], + "hints": { + "index": 20103 + } + }, + { + "items": [ + 10582.5, + 2.6714 + ], + "hints": { + "index": 20104 + } + }, + { + "items": [ + 10583, + 2.6659 + ], + "hints": { + "index": 20105 + } + }, + { + "items": [ + 10583.5, + 2.5847001075744629 + ], + "hints": { + "index": 20106 + } + }, + { + "items": [ + 10584, + 2.6191999912261963 + ], + "hints": { + "index": 20107 + } + }, + { + "items": [ + 10584.5, + 2.6483 + ], + "hints": { + "index": 20108 + } + }, + { + "items": [ + 10585, + 2.63100004196167 + ], + "hints": { + "index": 20109 + } + }, + { + "items": [ + 10585.5, + 2.6798 + ], + "hints": { + "index": 20110 + } + }, + { + "items": [ + 10586, + 2.6595 + ], + "hints": { + "index": 20111 + } + }, + { + "items": [ + 10586.5, + 2.5836999416351318 + ], + "hints": { + "index": 20112 + } + }, + { + "items": [ + 10587, + 2.5304999351501465 + ], + "hints": { + "index": 20113 + } + }, + { + "items": [ + 10587.5, + 2.521 + ], + "hints": { + "index": 20114 + } + }, + { + "items": [ + 10588, + 2.5315001010894775 + ], + "hints": { + "index": 20115 + } + }, + { + "items": [ + 10588.5, + 2.5266 + ], + "hints": { + "index": 20116 + } + }, + { + "items": [ + 10589, + 2.59879994392395 + ], + "hints": { + "index": 20117 + } + }, + { + "items": [ + 10589.5, + 2.6752998828887939 + ], + "hints": { + "index": 20118 + } + }, + { + "items": [ + 10590, + 2.6383 + ], + "hints": { + "index": 20119 + } + }, + { + "items": [ + 10590.5, + 2.5782999992370605 + ], + "hints": { + "index": 20120 + } + }, + { + "items": [ + 10591, + 2.6521999835968018 + ], + "hints": { + "index": 20121 + } + }, + { + "items": [ + 10591.5, + 2.66540002822876 + ], + "hints": { + "index": 20122 + } + }, + { + "items": [ + 10592, + 2.6993999481201172 + ], + "hints": { + "index": 20123 + } + }, + { + "items": [ + 10592.5, + 2.6510000228881836 + ], + "hints": { + "index": 20124 + } + }, + { + "items": [ + 10593, + 2.6510000228881836 + ], + "hints": { + "index": 20125 + } + }, + { + "items": [ + 10593.5, + 2.6684999465942383 + ], + "hints": { + "index": 20126 + } + }, + { + "items": [ + 10594, + 2.7883 + ], + "hints": { + "index": 20127 + } + }, + { + "items": [ + 10594.5, + 2.832 + ], + "hints": { + "index": 20128 + } + }, + { + "items": [ + 10595, + 2.7681000232696533 + ], + "hints": { + "index": 20129 + } + }, + { + "items": [ + 10595.5, + 2.6598000526428223 + ], + "hints": { + "index": 20130 + } + }, + { + "items": [ + 10596, + 2.6265 + ], + "hints": { + "index": 20131 + } + }, + { + "items": [ + 10596.5, + 2.6477 + ], + "hints": { + "index": 20132 + } + }, + { + "items": [ + 10597, + 2.6472001075744629 + ], + "hints": { + "index": 20133 + } + }, + { + "items": [ + 10597.5, + 2.6663000583648682 + ], + "hints": { + "index": 20134 + } + }, + { + "items": [ + 10598, + 2.633699893951416 + ], + "hints": { + "index": 20135 + } + }, + { + "items": [ + 10598.5, + 2.6363000869750977 + ], + "hints": { + "index": 20136 + } + }, + { + "items": [ + 10599, + 2.6947999000549316 + ], + "hints": { + "index": 20137 + } + }, + { + "items": [ + 10599.5, + 2.6937999725341797 + ], + "hints": { + "index": 20138 + } + }, + { + "items": [ + 10600, + 2.6487998962402344 + ], + "hints": { + "index": 20139 + } + }, + { + "items": [ + 10600.5, + 2.640700101852417 + ], + "hints": { + "index": 20140 + } + }, + { + "items": [ + 10601, + 2.7241 + ], + "hints": { + "index": 20141 + } + }, + { + "items": [ + 10601.5, + 2.7204999923706055 + ], + "hints": { + "index": 20142 + } + }, + { + "items": [ + 10602, + 2.6451 + ], + "hints": { + "index": 20143 + } + }, + { + "items": [ + 10602.5, + 2.6210999488830566 + ], + "hints": { + "index": 20144 + } + }, + { + "items": [ + 10603, + 2.6991000175476074 + ], + "hints": { + "index": 20145 + } + }, + { + "items": [ + 10603.5, + 2.7046999931335449 + ], + "hints": { + "index": 20146 + } + }, + { + "items": [ + 10604, + 2.7044999599456787 + ], + "hints": { + "index": 20147 + } + }, + { + "items": [ + 10604.5, + 2.724600076675415 + ], + "hints": { + "index": 20148 + } + }, + { + "items": [ + 10605, + 2.7671999931335449 + ], + "hints": { + "index": 20149 + } + }, + { + "items": [ + 10605.5, + 2.7967000007629395 + ], + "hints": { + "index": 20150 + } + }, + { + "items": [ + 10606, + 2.8097000122070313 + ], + "hints": { + "index": 20151 + } + }, + { + "items": [ + 10606.5, + 2.7263998985290527 + ], + "hints": { + "index": 20152 + } + }, + { + "items": [ + 10607, + 2.65120005607605 + ], + "hints": { + "index": 20153 + } + }, + { + "items": [ + 10607.5, + 2.5497000217437744 + ], + "hints": { + "index": 20154 + } + }, + { + "items": [ + 10608, + 2.5849 + ], + "hints": { + "index": 20155 + } + }, + { + "items": [ + 10608.5, + 2.6133999824523926 + ], + "hints": { + "index": 20156 + } + }, + { + "items": [ + 10609, + 2.6102 + ], + "hints": { + "index": 20157 + } + }, + { + "items": [ + 10609.5, + 2.6391 + ], + "hints": { + "index": 20158 + } + }, + { + "items": [ + 10610, + 2.5525 + ], + "hints": { + "index": 20159 + } + }, + { + "items": [ + 10610.5, + 2.4984 + ], + "hints": { + "index": 20160 + } + }, + { + "items": [ + 10611, + 2.538000106811523 + ], + "hints": { + "index": 20161 + } + }, + { + "items": [ + 10611.5, + 2.7179999351501465 + ], + "hints": { + "index": 20162 + } + }, + { + "items": [ + 10612, + 2.9632000923156734 + ], + "hints": { + "index": 20163 + } + }, + { + "items": [ + 10612.5, + 3.0158998966217041 + ], + "hints": { + "index": 20164 + } + }, + { + "items": [ + 10613, + 2.9291999340057373 + ], + "hints": { + "index": 20165 + } + }, + { + "items": [ + 10613.5, + 2.7948 + ], + "hints": { + "index": 20166 + } + }, + { + "items": [ + 10614, + 2.6779000759124756 + ], + "hints": { + "index": 20167 + } + }, + { + "items": [ + 10614.5, + 2.6398999691009521 + ], + "hints": { + "index": 20168 + } + }, + { + "items": [ + 10615, + 2.7181000709533691 + ], + "hints": { + "index": 20169 + } + }, + { + "items": [ + 10615.5, + 2.8037 + ], + "hints": { + "index": 20170 + } + }, + { + "items": [ + 10616, + 2.8979001045227051 + ], + "hints": { + "index": 20171 + } + }, + { + "items": [ + 10616.5, + 2.864300012588501 + ], + "hints": { + "index": 20172 + } + }, + { + "items": [ + 10617, + 2.8612 + ], + "hints": { + "index": 20173 + } + }, + { + "items": [ + 10617.5, + 2.8382000923156734 + ], + "hints": { + "index": 20174 + } + }, + { + "items": [ + 10618, + 2.7516999244689941 + ], + "hints": { + "index": 20175 + } + }, + { + "items": [ + 10618.5, + 2.6877999305725098 + ], + "hints": { + "index": 20176 + } + }, + { + "items": [ + 10619, + 2.6145999431610107 + ], + "hints": { + "index": 20177 + } + }, + { + "items": [ + 10619.5, + 2.6982998847961426 + ], + "hints": { + "index": 20178 + } + }, + { + "items": [ + 10620, + 2.7140998840332031 + ], + "hints": { + "index": 20179 + } + }, + { + "items": [ + 10620.5, + 2.7111001014709473 + ], + "hints": { + "index": 20180 + } + }, + { + "items": [ + 10621, + 2.6356000900268555 + ], + "hints": { + "index": 20181 + } + }, + { + "items": [ + 10621.5, + 2.6831998825073242 + ], + "hints": { + "index": 20182 + } + }, + { + "items": [ + 10622, + 2.8081998825073242 + ], + "hints": { + "index": 20183 + } + }, + { + "items": [ + 10622.5, + 2.8826000690460205 + ], + "hints": { + "index": 20184 + } + }, + { + "items": [ + 10623, + 2.8517999649047852 + ], + "hints": { + "index": 20185 + } + }, + { + "items": [ + 10623.5, + 2.8315000534057617 + ], + "hints": { + "index": 20186 + } + }, + { + "items": [ + 10624, + 2.8162000179290771 + ], + "hints": { + "index": 20187 + } + }, + { + "items": [ + 10624.5, + 2.8355000019073486 + ], + "hints": { + "index": 20188 + } + }, + { + "items": [ + 10625, + 2.6989998817443848 + ], + "hints": { + "index": 20189 + } + }, + { + "items": [ + 10625.5, + 2.6930999755859375 + ], + "hints": { + "index": 20190 + } + }, + { + "items": [ + 10626, + 2.6881000995635982 + ], + "hints": { + "index": 20191 + } + }, + { + "items": [ + 10626.5, + 2.8073999881744385 + ], + "hints": { + "index": 20192 + } + }, + { + "items": [ + 10627, + 2.81850004196167 + ], + "hints": { + "index": 20193 + } + }, + { + "items": [ + 10627.5, + 2.7486000061035156 + ], + "hints": { + "index": 20194 + } + }, + { + "items": [ + 10628, + 2.7377998828887939 + ], + "hints": { + "index": 20195 + } + }, + { + "items": [ + 10628.5, + 2.6277000904083252 + ], + "hints": { + "index": 20196 + } + }, + { + "items": [ + 10629, + 2.6078999042510982 + ], + "hints": { + "index": 20197 + } + }, + { + "items": [ + 10629.5, + 2.5106000900268555 + ], + "hints": { + "index": 20198 + } + }, + { + "items": [ + 10630, + 2.5948998928070068 + ], + "hints": { + "index": 20199 + } + }, + { + "items": [ + 10630.5, + 2.6496000289916992 + ], + "hints": { + "index": 20200 + } + }, + { + "items": [ + 10631, + 2.8577001094818115 + ], + "hints": { + "index": 20201 + } + }, + { + "items": [ + 10631.5, + 3.0415000915527344 + ], + "hints": { + "index": 20202 + } + }, + { + "items": [ + 10632, + 3.184999942779541 + ], + "hints": { + "index": 20203 + } + }, + { + "items": [ + 10632.5, + 3.1236999034881592 + ], + "hints": { + "index": 20204 + } + }, + { + "items": [ + 10633, + 2.9802999496459961 + ], + "hints": { + "index": 20205 + } + }, + { + "items": [ + 10633.5, + 2.8635001182556152 + ], + "hints": { + "index": 20206 + } + }, + { + "items": [ + 10634, + 2.72979998588562 + ], + "hints": { + "index": 20207 + } + }, + { + "items": [ + 10634.5, + 2.5847001075744629 + ], + "hints": { + "index": 20208 + } + }, + { + "items": [ + 10635, + 2.5625998973846436 + ], + "hints": { + "index": 20209 + } + }, + { + "items": [ + 10635.5, + 2.5625 + ], + "hints": { + "index": 20210 + } + }, + { + "items": [ + 10636, + 2.6280999183654785 + ], + "hints": { + "index": 20211 + } + }, + { + "items": [ + 10636.5, + 2.6693999767303467 + ], + "hints": { + "index": 20212 + } + }, + { + "items": [ + 10637, + 2.69569993019104 + ], + "hints": { + "index": 20213 + } + }, + { + "items": [ + 10637.5, + 2.6735999584198 + ], + "hints": { + "index": 20214 + } + }, + { + "items": [ + 10638, + 2.6278998851776123 + ], + "hints": { + "index": 20215 + } + }, + { + "items": [ + 10638.5, + 2.6400001049041748 + ], + "hints": { + "index": 20216 + } + }, + { + "items": [ + 10639, + 2.6398999691009521 + ], + "hints": { + "index": 20217 + } + }, + { + "items": [ + 10639.5, + 2.5690000057220459 + ], + "hints": { + "index": 20218 + } + }, + { + "items": [ + 10640, + 2.49429988861084 + ], + "hints": { + "index": 20219 + } + }, + { + "items": [ + 10640.5, + 2.57450008392334 + ], + "hints": { + "index": 20220 + } + }, + { + "items": [ + 10641, + 2.6307 + ], + "hints": { + "index": 20221 + } + }, + { + "items": [ + 10641.5, + 2.669 + ], + "hints": { + "index": 20222 + } + }, + { + "items": [ + 10642, + 2.6502 + ], + "hints": { + "index": 20223 + } + }, + { + "items": [ + 10642.5, + 2.6836 + ], + "hints": { + "index": 20224 + } + }, + { + "items": [ + 10643, + 2.6344 + ], + "hints": { + "index": 20225 + } + }, + { + "items": [ + 10643.5, + 2.5703 + ], + "hints": { + "index": 20226 + } + }, + { + "items": [ + 10644, + 2.5803 + ], + "hints": { + "index": 20227 + } + }, + { + "items": [ + 10644.5, + 2.6651 + ], + "hints": { + "index": 20228 + } + }, + { + "items": [ + 10645, + 2.6961 + ], + "hints": { + "index": 20229 + } + }, + { + "items": [ + 10645.5, + 2.7131 + ], + "hints": { + "index": 20230 + } + }, + { + "items": [ + 10646, + 2.641 + ], + "hints": { + "index": 20231 + } + }, + { + "items": [ + 10646.5, + 2.6876 + ], + "hints": { + "index": 20232 + } + }, + { + "items": [ + 10647, + 2.6424 + ], + "hints": { + "index": 20233 + } + }, + { + "items": [ + 10647.5, + 2.6881 + ], + "hints": { + "index": 20234 + } + }, + { + "items": [ + 10648, + 2.6321 + ], + "hints": { + "index": 20235 + } + }, + { + "items": [ + 10648.5, + 2.6785 + ], + "hints": { + "index": 20236 + } + }, + { + "items": [ + 10649, + 2.7233 + ], + "hints": { + "index": 20237 + } + }, + { + "items": [ + 10649.5, + 2.7841 + ], + "hints": { + "index": 20238 + } + }, + { + "items": [ + 10650, + 2.7703 + ], + "hints": { + "index": 20239 + } + }, + { + "items": [ + 10650.5, + 2.8089 + ], + "hints": { + "index": 20240 + } + }, + { + "items": [ + 10651, + 2.8309 + ], + "hints": { + "index": 20241 + } + }, + { + "items": [ + 10651.5, + 2.7425 + ], + "hints": { + "index": 20242 + } + }, + { + "items": [ + 10652, + 2.6485 + ], + "hints": { + "index": 20243 + } + }, + { + "items": [ + 10652.5, + 2.6083 + ], + "hints": { + "index": 20244 + } + }, + { + "items": [ + 10653, + 2.8906 + ], + "hints": { + "index": 20245 + } + }, + { + "items": [ + 10653.5, + 3.3198 + ], + "hints": { + "index": 20246 + } + }, + { + "items": [ + 10654, + 3.4507 + ], + "hints": { + "index": 20247 + } + }, + { + "items": [ + 10654.5, + 3.1205 + ], + "hints": { + "index": 20248 + } + }, + { + "items": [ + 10655, + 2.9134 + ], + "hints": { + "index": 20249 + } + }, + { + "items": [ + 10655.5, + 2.7412 + ], + "hints": { + "index": 20250 + } + }, + { + "items": [ + 10656, + 2.7263 + ], + "hints": { + "index": 20251 + } + }, + { + "items": [ + 10656.5, + 2.6441 + ], + "hints": { + "index": 20252 + } + }, + { + "items": [ + 10657, + 2.6241 + ], + "hints": { + "index": 20253 + } + }, + { + "items": [ + 10657.5, + 2.6461 + ], + "hints": { + "index": 20254 + } + }, + { + "items": [ + 10658, + 2.7528 + ], + "hints": { + "index": 20255 + } + }, + { + "items": [ + 10658.5, + 2.8742 + ], + "hints": { + "index": 20256 + } + }, + { + "items": [ + 10659, + 2.825 + ], + "hints": { + "index": 20257 + } + }, + { + "items": [ + 10659.5, + 2.8005 + ], + "hints": { + "index": 20258 + } + }, + { + "items": [ + 10660, + 2.9366 + ], + "hints": { + "index": 20259 + } + }, + { + "items": [ + 10660.5, + 3.3841 + ], + "hints": { + "index": 20260 + } + }, + { + "items": [ + 10661, + 3.4818 + ], + "hints": { + "index": 20261 + } + }, + { + "items": [ + 10661.5, + 3.1075 + ], + "hints": { + "index": 20262 + } + }, + { + "items": [ + 10662, + 2.7727 + ], + "hints": { + "index": 20263 + } + }, + { + "items": [ + 10662.5, + 2.6445 + ], + "hints": { + "index": 20264 + } + }, + { + "items": [ + 10663, + 2.6988 + ], + "hints": { + "index": 20265 + } + }, + { + "items": [ + 10663.5, + 2.7614 + ], + "hints": { + "index": 20266 + } + }, + { + "items": [ + 10664, + 2.7668 + ], + "hints": { + "index": 20267 + } + }, + { + "items": [ + 10664.5, + 2.719 + ], + "hints": { + "index": 20268 + } + }, + { + "items": [ + 10665, + 2.7329 + ], + "hints": { + "index": 20269 + } + }, + { + "items": [ + 10665.5, + 2.7177 + ], + "hints": { + "index": 20270 + } + }, + { + "items": [ + 10666, + 2.6406 + ], + "hints": { + "index": 20271 + } + }, + { + "items": [ + 10666.5, + 2.5633 + ], + "hints": { + "index": 20272 + } + }, + { + "items": [ + 10667, + 2.5423 + ], + "hints": { + "index": 20273 + } + }, + { + "items": [ + 10667.5, + 2.5541 + ], + "hints": { + "index": 20274 + } + }, + { + "items": [ + 10668, + 2.6546 + ], + "hints": { + "index": 20275 + } + }, + { + "items": [ + 10668.5, + 2.6779999732971191 + ], + "hints": { + "index": 20276 + } + }, + { + "items": [ + 10669, + 2.8121 + ], + "hints": { + "index": 20277 + } + }, + { + "items": [ + 10669.5, + 2.9847 + ], + "hints": { + "index": 20278 + } + }, + { + "items": [ + 10670, + 3.4013 + ], + "hints": { + "index": 20279 + } + }, + { + "items": [ + 10670.5, + 3.4393 + ], + "hints": { + "index": 20280 + } + }, + { + "items": [ + 10671, + 3.3013 + ], + "hints": { + "index": 20281 + } + }, + { + "items": [ + 10671.5, + 3.311500072479248 + ], + "hints": { + "index": 20282 + } + }, + { + "items": [ + 10672, + 3.0686 + ], + "hints": { + "index": 20283 + } + }, + { + "items": [ + 10672.5, + 2.95770001411438 + ], + "hints": { + "index": 20284 + } + }, + { + "items": [ + 10673, + 2.7024 + ], + "hints": { + "index": 20285 + } + }, + { + "items": [ + 10673.5, + 2.8382000923156734 + ], + "hints": { + "index": 20286 + } + }, + { + "items": [ + 10674, + 2.9586 + ], + "hints": { + "index": 20287 + } + }, + { + "items": [ + 10674.5, + 2.9518 + ], + "hints": { + "index": 20288 + } + }, + { + "items": [ + 10675, + 2.8456 + ], + "hints": { + "index": 20289 + } + }, + { + "items": [ + 10675.5, + 2.9112000465393062 + ], + "hints": { + "index": 20290 + } + }, + { + "items": [ + 10676, + 3.1309 + ], + "hints": { + "index": 20291 + } + }, + { + "items": [ + 10676.5, + 3.2077 + ], + "hints": { + "index": 20292 + } + }, + { + "items": [ + 10677, + 2.9333999156951904 + ], + "hints": { + "index": 20293 + } + }, + { + "items": [ + 10677.5, + 2.777 + ], + "hints": { + "index": 20294 + } + }, + { + "items": [ + 10678, + 2.9123 + ], + "hints": { + "index": 20295 + } + }, + { + "items": [ + 10678.5, + 3.0687 + ], + "hints": { + "index": 20296 + } + }, + { + "items": [ + 10679, + 3.1572 + ], + "hints": { + "index": 20297 + } + }, + { + "items": [ + 10679.5, + 2.9512999057769775 + ], + "hints": { + "index": 20298 + } + }, + { + "items": [ + 10680, + 2.9412999153137207 + ], + "hints": { + "index": 20299 + } + }, + { + "items": [ + 10680.5, + 3.1185998916625977 + ], + "hints": { + "index": 20300 + } + }, + { + "items": [ + 10681, + 3.368 + ], + "hints": { + "index": 20301 + } + }, + { + "items": [ + 10681.5, + 3.6013 + ], + "hints": { + "index": 20302 + } + }, + { + "items": [ + 10682, + 3.3856 + ], + "hints": { + "index": 20303 + } + }, + { + "items": [ + 10682.5, + 3.1226 + ], + "hints": { + "index": 20304 + } + }, + { + "items": [ + 10683, + 2.8577001094818115 + ], + "hints": { + "index": 20305 + } + }, + { + "items": [ + 10683.5, + 2.9881000518798828 + ], + "hints": { + "index": 20306 + } + }, + { + "items": [ + 10684, + 3.0191 + ], + "hints": { + "index": 20307 + } + }, + { + "items": [ + 10684.5, + 2.9579999446868896 + ], + "hints": { + "index": 20308 + } + }, + { + "items": [ + 10685, + 2.7835 + ], + "hints": { + "index": 20309 + } + }, + { + "items": [ + 10685.5, + 2.7497999668121338 + ], + "hints": { + "index": 20310 + } + }, + { + "items": [ + 10686, + 2.8357999324798584 + ], + "hints": { + "index": 20311 + } + }, + { + "items": [ + 10686.5, + 2.701 + ], + "hints": { + "index": 20312 + } + }, + { + "items": [ + 10687, + 2.6329 + ], + "hints": { + "index": 20313 + } + }, + { + "items": [ + 10687.5, + 2.5169999599456787 + ], + "hints": { + "index": 20314 + } + }, + { + "items": [ + 10688, + 2.6656999588012695 + ], + "hints": { + "index": 20315 + } + }, + { + "items": [ + 10688.5, + 2.7692000865936279 + ], + "hints": { + "index": 20316 + } + }, + { + "items": [ + 10689, + 2.8271999359130859 + ], + "hints": { + "index": 20317 + } + }, + { + "items": [ + 10689.5, + 2.7481 + ], + "hints": { + "index": 20318 + } + }, + { + "items": [ + 10690, + 2.627000093460083 + ], + "hints": { + "index": 20319 + } + }, + { + "items": [ + 10690.5, + 2.5588 + ], + "hints": { + "index": 20320 + } + }, + { + "items": [ + 10691, + 2.6344 + ], + "hints": { + "index": 20321 + } + }, + { + "items": [ + 10691.5, + 2.7502999305725098 + ], + "hints": { + "index": 20322 + } + }, + { + "items": [ + 10692, + 2.7655000686645508 + ], + "hints": { + "index": 20323 + } + }, + { + "items": [ + 10692.5, + 2.6559000015258789 + ], + "hints": { + "index": 20324 + } + }, + { + "items": [ + 10693, + 2.5971000194549561 + ], + "hints": { + "index": 20325 + } + }, + { + "items": [ + 10693.5, + 2.6616001129150391 + ], + "hints": { + "index": 20326 + } + }, + { + "items": [ + 10694, + 2.7973001003265381 + ], + "hints": { + "index": 20327 + } + }, + { + "items": [ + 10694.5, + 2.7525999546051025 + ], + "hints": { + "index": 20328 + } + }, + { + "items": [ + 10695, + 2.6835 + ], + "hints": { + "index": 20329 + } + }, + { + "items": [ + 10695.5, + 2.5687 + ], + "hints": { + "index": 20330 + } + }, + { + "items": [ + 10696, + 2.6930999755859375 + ], + "hints": { + "index": 20331 + } + }, + { + "items": [ + 10696.5, + 2.8180999755859375 + ], + "hints": { + "index": 20332 + } + }, + { + "items": [ + 10697, + 2.7644000053405762 + ], + "hints": { + "index": 20333 + } + }, + { + "items": [ + 10697.5, + 2.5957999229431152 + ], + "hints": { + "index": 20334 + } + }, + { + "items": [ + 10698, + 2.5474998950958252 + ], + "hints": { + "index": 20335 + } + }, + { + "items": [ + 10698.5, + 2.6572000980377197 + ], + "hints": { + "index": 20336 + } + }, + { + "items": [ + 10699, + 2.7634 + ], + "hints": { + "index": 20337 + } + }, + { + "items": [ + 10699.5, + 2.7918999195098877 + ], + "hints": { + "index": 20338 + } + }, + { + "items": [ + 10700, + 2.7288000583648682 + ], + "hints": { + "index": 20339 + } + }, + { + "items": [ + 10700.5, + 2.6703999042510982 + ], + "hints": { + "index": 20340 + } + }, + { + "items": [ + 10701, + 2.652 + ], + "hints": { + "index": 20341 + } + }, + { + "items": [ + 10701.5, + 2.6839 + ], + "hints": { + "index": 20342 + } + }, + { + "items": [ + 10702, + 2.6869 + ], + "hints": { + "index": 20343 + } + }, + { + "items": [ + 10702.5, + 2.6197 + ], + "hints": { + "index": 20344 + } + }, + { + "items": [ + 10703, + 2.625999927520752 + ], + "hints": { + "index": 20345 + } + }, + { + "items": [ + 10703.5, + 2.7781999111175537 + ], + "hints": { + "index": 20346 + } + }, + { + "items": [ + 10704, + 2.9506 + ], + "hints": { + "index": 20347 + } + }, + { + "items": [ + 10704.5, + 3.0220000743865967 + ], + "hints": { + "index": 20348 + } + }, + { + "items": [ + 10705, + 3.0284 + ], + "hints": { + "index": 20349 + } + }, + { + "items": [ + 10705.5, + 2.8624 + ], + "hints": { + "index": 20350 + } + }, + { + "items": [ + 10706, + 2.9006 + ], + "hints": { + "index": 20351 + } + }, + { + "items": [ + 10706.5, + 2.9134 + ], + "hints": { + "index": 20352 + } + }, + { + "items": [ + 10707, + 3.0899 + ], + "hints": { + "index": 20353 + } + }, + { + "items": [ + 10707.5, + 3.18530011177063 + ], + "hints": { + "index": 20354 + } + }, + { + "items": [ + 10708, + 3.1255 + ], + "hints": { + "index": 20355 + } + }, + { + "items": [ + 10708.5, + 3.128000020980835 + ], + "hints": { + "index": 20356 + } + }, + { + "items": [ + 10709, + 3.0178 + ], + "hints": { + "index": 20357 + } + }, + { + "items": [ + 10709.5, + 3.0506000518798828 + ], + "hints": { + "index": 20358 + } + }, + { + "items": [ + 10710, + 2.9311 + ], + "hints": { + "index": 20359 + } + }, + { + "items": [ + 10710.5, + 2.9248 + ], + "hints": { + "index": 20360 + } + }, + { + "items": [ + 10711, + 2.735 + ], + "hints": { + "index": 20361 + } + }, + { + "items": [ + 10711.5, + 2.7822999954223633 + ], + "hints": { + "index": 20362 + } + }, + { + "items": [ + 10712, + 2.7427999973297119 + ], + "hints": { + "index": 20363 + } + }, + { + "items": [ + 10712.5, + 2.8975 + ], + "hints": { + "index": 20364 + } + }, + { + "items": [ + 10713, + 2.8087999820709229 + ], + "hints": { + "index": 20365 + } + }, + { + "items": [ + 10713.5, + 2.8367 + ], + "hints": { + "index": 20366 + } + }, + { + "items": [ + 10714, + 2.8021 + ], + "hints": { + "index": 20367 + } + }, + { + "items": [ + 10714.5, + 2.8257 + ], + "hints": { + "index": 20368 + } + }, + { + "items": [ + 10715, + 2.7507 + ], + "hints": { + "index": 20369 + } + }, + { + "items": [ + 10715.5, + 2.7188999652862549 + ], + "hints": { + "index": 20370 + } + }, + { + "items": [ + 10716, + 2.6966 + ], + "hints": { + "index": 20371 + } + }, + { + "items": [ + 10716.5, + 2.8713 + ], + "hints": { + "index": 20372 + } + }, + { + "items": [ + 10717, + 2.9138 + ], + "hints": { + "index": 20373 + } + }, + { + "items": [ + 10717.5, + 3.0852 + ], + "hints": { + "index": 20374 + } + }, + { + "items": [ + 10718, + 2.9125 + ], + "hints": { + "index": 20375 + } + }, + { + "items": [ + 10718.5, + 2.9026999473571777 + ], + "hints": { + "index": 20376 + } + }, + { + "items": [ + 10719, + 2.8854999542236328 + ], + "hints": { + "index": 20377 + } + }, + { + "items": [ + 10719.5, + 3.0113000869750977 + ], + "hints": { + "index": 20378 + } + }, + { + "items": [ + 10720, + 2.9906 + ], + "hints": { + "index": 20379 + } + }, + { + "items": [ + 10720.5, + 2.799799919128418 + ], + "hints": { + "index": 20380 + } + }, + { + "items": [ + 10721, + 2.6111 + ], + "hints": { + "index": 20381 + } + }, + { + "items": [ + 10721.5, + 2.6619999408721924 + ], + "hints": { + "index": 20382 + } + }, + { + "items": [ + 10722, + 2.7359 + ], + "hints": { + "index": 20383 + } + }, + { + "items": [ + 10722.5, + 2.7785999774932861 + ], + "hints": { + "index": 20384 + } + }, + { + "items": [ + 10723, + 2.6637001037597656 + ], + "hints": { + "index": 20385 + } + }, + { + "items": [ + 10723.5, + 2.63100004196167 + ], + "hints": { + "index": 20386 + } + }, + { + "items": [ + 10724, + 2.6552000045776367 + ], + "hints": { + "index": 20387 + } + }, + { + "items": [ + 10724.5, + 2.6484000682830811 + ], + "hints": { + "index": 20388 + } + }, + { + "items": [ + 10725, + 2.6704 + ], + "hints": { + "index": 20389 + } + }, + { + "items": [ + 10725.5, + 2.6730999946594238 + ], + "hints": { + "index": 20390 + } + }, + { + "items": [ + 10726, + 2.6828 + ], + "hints": { + "index": 20391 + } + }, + { + "items": [ + 10726.5, + 2.6443 + ], + "hints": { + "index": 20392 + } + }, + { + "items": [ + 10727, + 2.5913 + ], + "hints": { + "index": 20393 + } + }, + { + "items": [ + 10727.5, + 2.5028998851776123 + ], + "hints": { + "index": 20394 + } + }, + { + "items": [ + 10728, + 2.6110000610351558 + ], + "hints": { + "index": 20395 + } + }, + { + "items": [ + 10728.5, + 2.7002999782562256 + ], + "hints": { + "index": 20396 + } + }, + { + "items": [ + 10729, + 2.7861 + ], + "hints": { + "index": 20397 + } + }, + { + "items": [ + 10729.5, + 2.6558001041412354 + ], + "hints": { + "index": 20398 + } + }, + { + "items": [ + 10730, + 2.5466001033782959 + ], + "hints": { + "index": 20399 + } + }, + { + "items": [ + 10730.5, + 2.5299 + ], + "hints": { + "index": 20400 + } + }, + { + "items": [ + 10731, + 2.6953001022338867 + ], + "hints": { + "index": 20401 + } + }, + { + "items": [ + 10731.5, + 2.8110001087188721 + ], + "hints": { + "index": 20402 + } + }, + { + "items": [ + 10732, + 2.813499927520752 + ], + "hints": { + "index": 20403 + } + }, + { + "items": [ + 10732.5, + 2.6231999397277832 + ], + "hints": { + "index": 20404 + } + }, + { + "items": [ + 10733, + 2.6365 + ], + "hints": { + "index": 20405 + } + }, + { + "items": [ + 10733.5, + 2.7468 + ], + "hints": { + "index": 20406 + } + }, + { + "items": [ + 10734, + 2.8846 + ], + "hints": { + "index": 20407 + } + }, + { + "items": [ + 10734.5, + 2.886199951171875 + ], + "hints": { + "index": 20408 + } + }, + { + "items": [ + 10735, + 2.8659000396728516 + ], + "hints": { + "index": 20409 + } + }, + { + "items": [ + 10735.5, + 2.8736999034881592 + ], + "hints": { + "index": 20410 + } + }, + { + "items": [ + 10736, + 2.8024001121520996 + ], + "hints": { + "index": 20411 + } + }, + { + "items": [ + 10736.5, + 2.7507 + ], + "hints": { + "index": 20412 + } + }, + { + "items": [ + 10737, + 2.7095 + ], + "hints": { + "index": 20413 + } + }, + { + "items": [ + 10737.5, + 2.7672 + ], + "hints": { + "index": 20414 + } + }, + { + "items": [ + 10738, + 2.7787001132965088 + ], + "hints": { + "index": 20415 + } + }, + { + "items": [ + 10738.5, + 2.7901 + ], + "hints": { + "index": 20416 + } + }, + { + "items": [ + 10739, + 2.8290998935699463 + ], + "hints": { + "index": 20417 + } + }, + { + "items": [ + 10739.5, + 2.8461 + ], + "hints": { + "index": 20418 + } + }, + { + "items": [ + 10740, + 2.7425000667572021 + ], + "hints": { + "index": 20419 + } + }, + { + "items": [ + 10740.5, + 2.6019 + ], + "hints": { + "index": 20420 + } + }, + { + "items": [ + 10741, + 2.5952 + ], + "hints": { + "index": 20421 + } + }, + { + "items": [ + 10741.5, + 2.6455 + ], + "hints": { + "index": 20422 + } + }, + { + "items": [ + 10742, + 2.7197 + ], + "hints": { + "index": 20423 + } + }, + { + "items": [ + 10742.5, + 2.70740008354187 + ], + "hints": { + "index": 20424 + } + }, + { + "items": [ + 10743, + 2.8106999397277832 + ], + "hints": { + "index": 20425 + } + }, + { + "items": [ + 10743.5, + 2.77839994430542 + ], + "hints": { + "index": 20426 + } + }, + { + "items": [ + 10744, + 2.8646 + ], + "hints": { + "index": 20427 + } + }, + { + "items": [ + 10744.5, + 2.8273999691009521 + ], + "hints": { + "index": 20428 + } + }, + { + "items": [ + 10745, + 2.8252 + ], + "hints": { + "index": 20429 + } + }, + { + "items": [ + 10745.5, + 2.6484000682830811 + ], + "hints": { + "index": 20430 + } + }, + { + "items": [ + 10746, + 2.5924999713897705 + ], + "hints": { + "index": 20431 + } + }, + { + "items": [ + 10746.5, + 2.646899938583374 + ], + "hints": { + "index": 20432 + } + }, + { + "items": [ + 10747, + 2.8006999492645264 + ], + "hints": { + "index": 20433 + } + }, + { + "items": [ + 10747.5, + 2.7869999408721924 + ], + "hints": { + "index": 20434 + } + }, + { + "items": [ + 10748, + 2.7081999778747559 + ], + "hints": { + "index": 20435 + } + }, + { + "items": [ + 10748.5, + 2.6442000865936279 + ], + "hints": { + "index": 20436 + } + }, + { + "items": [ + 10749, + 2.767 + ], + "hints": { + "index": 20437 + } + }, + { + "items": [ + 10749.5, + 2.886100053787231 + ], + "hints": { + "index": 20438 + } + }, + { + "items": [ + 10750, + 2.7332000732421875 + ], + "hints": { + "index": 20439 + } + }, + { + "items": [ + 10750.5, + 2.5727 + ], + "hints": { + "index": 20440 + } + }, + { + "items": [ + 10751, + 2.4943 + ], + "hints": { + "index": 20441 + } + }, + { + "items": [ + 10751.5, + 2.6426000595092773 + ], + "hints": { + "index": 20442 + } + }, + { + "items": [ + 10752, + 2.8672 + ], + "hints": { + "index": 20443 + } + }, + { + "items": [ + 10752.5, + 2.9431 + ], + "hints": { + "index": 20444 + } + }, + { + "items": [ + 10753, + 2.8778 + ], + "hints": { + "index": 20445 + } + }, + { + "items": [ + 10753.5, + 2.6559 + ], + "hints": { + "index": 20446 + } + }, + { + "items": [ + 10754, + 2.5924 + ], + "hints": { + "index": 20447 + } + }, + { + "items": [ + 10754.5, + 2.7207 + ], + "hints": { + "index": 20448 + } + }, + { + "items": [ + 10755, + 2.8275 + ], + "hints": { + "index": 20449 + } + }, + { + "items": [ + 10755.5, + 2.755000114440918 + ], + "hints": { + "index": 20450 + } + }, + { + "items": [ + 10756, + 2.640700101852417 + ], + "hints": { + "index": 20451 + } + }, + { + "items": [ + 10756.5, + 2.696199893951416 + ], + "hints": { + "index": 20452 + } + }, + { + "items": [ + 10757, + 2.8498 + ], + "hints": { + "index": 20453 + } + }, + { + "items": [ + 10757.5, + 2.838 + ], + "hints": { + "index": 20454 + } + }, + { + "items": [ + 10758, + 2.7479000091552734 + ], + "hints": { + "index": 20455 + } + }, + { + "items": [ + 10758.5, + 2.6198000907897949 + ], + "hints": { + "index": 20456 + } + }, + { + "items": [ + 10759, + 2.6303 + ], + "hints": { + "index": 20457 + } + }, + { + "items": [ + 10759.5, + 2.7079 + ], + "hints": { + "index": 20458 + } + }, + { + "items": [ + 10760, + 2.7373 + ], + "hints": { + "index": 20459 + } + }, + { + "items": [ + 10760.5, + 2.699 + ], + "hints": { + "index": 20460 + } + }, + { + "items": [ + 10761, + 2.6645 + ], + "hints": { + "index": 20461 + } + }, + { + "items": [ + 10761.5, + 2.679 + ], + "hints": { + "index": 20462 + } + }, + { + "items": [ + 10762, + 2.7072999477386475 + ], + "hints": { + "index": 20463 + } + }, + { + "items": [ + 10762.5, + 2.7364 + ], + "hints": { + "index": 20464 + } + }, + { + "items": [ + 10763, + 2.7688000202178955 + ], + "hints": { + "index": 20465 + } + }, + { + "items": [ + 10763.5, + 2.7407999038696289 + ], + "hints": { + "index": 20466 + } + }, + { + "items": [ + 10764, + 2.7788000106811523 + ], + "hints": { + "index": 20467 + } + }, + { + "items": [ + 10764.5, + 2.7901 + ], + "hints": { + "index": 20468 + } + }, + { + "items": [ + 10765, + 2.8789 + ], + "hints": { + "index": 20469 + } + }, + { + "items": [ + 10765.5, + 2.7644 + ], + "hints": { + "index": 20470 + } + }, + { + "items": [ + 10766, + 2.6839 + ], + "hints": { + "index": 20471 + } + }, + { + "items": [ + 10766.5, + 2.6768 + ], + "hints": { + "index": 20472 + } + }, + { + "items": [ + 10767, + 2.6882 + ], + "hints": { + "index": 20473 + } + }, + { + "items": [ + 10767.5, + 2.7414 + ], + "hints": { + "index": 20474 + } + }, + { + "items": [ + 10768, + 2.768 + ], + "hints": { + "index": 20475 + } + }, + { + "items": [ + 10768.5, + 2.7003 + ], + "hints": { + "index": 20476 + } + }, + { + "items": [ + 10769, + 2.6713 + ], + "hints": { + "index": 20477 + } + }, + { + "items": [ + 10769.5, + 2.6447999477386475 + ], + "hints": { + "index": 20478 + } + }, + { + "items": [ + 10770, + 2.7945 + ], + "hints": { + "index": 20479 + } + }, + { + "items": [ + 10770.5, + 3.0252 + ], + "hints": { + "index": 20480 + } + }, + { + "items": [ + 10771, + 3.0362000465393062 + ], + "hints": { + "index": 20481 + } + }, + { + "items": [ + 10771.5, + 2.8436 + ], + "hints": { + "index": 20482 + } + }, + { + "items": [ + 10772, + 2.687000036239624 + ], + "hints": { + "index": 20483 + } + }, + { + "items": [ + 10772.5, + 2.6198000907897949 + ], + "hints": { + "index": 20484 + } + }, + { + "items": [ + 10773, + 2.6233 + ], + "hints": { + "index": 20485 + } + }, + { + "items": [ + 10773.5, + 2.6096000671386719 + ], + "hints": { + "index": 20486 + } + }, + { + "items": [ + 10774, + 2.6335000991821289 + ], + "hints": { + "index": 20487 + } + }, + { + "items": [ + 10774.5, + 2.6868000030517578 + ], + "hints": { + "index": 20488 + } + }, + { + "items": [ + 10775, + 2.6914000511169434 + ], + "hints": { + "index": 20489 + } + }, + { + "items": [ + 10775.5, + 2.7005999088287354 + ], + "hints": { + "index": 20490 + } + }, + { + "items": [ + 10776, + 2.7089 + ], + "hints": { + "index": 20491 + } + }, + { + "items": [ + 10776.5, + 2.748 + ], + "hints": { + "index": 20492 + } + }, + { + "items": [ + 10777, + 2.8919 + ], + "hints": { + "index": 20493 + } + }, + { + "items": [ + 10777.5, + 3.0251998901367188 + ], + "hints": { + "index": 20494 + } + }, + { + "items": [ + 10778, + 2.9291000366210938 + ], + "hints": { + "index": 20495 + } + }, + { + "items": [ + 10778.5, + 2.7811000347137451 + ], + "hints": { + "index": 20496 + } + }, + { + "items": [ + 10779, + 2.7351000308990479 + ], + "hints": { + "index": 20497 + } + }, + { + "items": [ + 10779.5, + 2.7941 + ], + "hints": { + "index": 20498 + } + }, + { + "items": [ + 10780, + 2.8594 + ], + "hints": { + "index": 20499 + } + }, + { + "items": [ + 10780.5, + 2.8118 + ], + "hints": { + "index": 20500 + } + }, + { + "items": [ + 10781, + 2.7106 + ], + "hints": { + "index": 20501 + } + }, + { + "items": [ + 10781.5, + 2.6175999641418457 + ], + "hints": { + "index": 20502 + } + }, + { + "items": [ + 10782, + 2.6516 + ], + "hints": { + "index": 20503 + } + }, + { + "items": [ + 10782.5, + 2.8138999938964844 + ], + "hints": { + "index": 20504 + } + }, + { + "items": [ + 10783, + 2.99429988861084 + ], + "hints": { + "index": 20505 + } + }, + { + "items": [ + 10783.5, + 2.9456000328063965 + ], + "hints": { + "index": 20506 + } + }, + { + "items": [ + 10784, + 2.7850000858306885 + ], + "hints": { + "index": 20507 + } + }, + { + "items": [ + 10784.5, + 2.8467 + ], + "hints": { + "index": 20508 + } + }, + { + "items": [ + 10785, + 2.9003 + ], + "hints": { + "index": 20509 + } + }, + { + "items": [ + 10785.5, + 3.016 + ], + "hints": { + "index": 20510 + } + }, + { + "items": [ + 10786, + 2.8879 + ], + "hints": { + "index": 20511 + } + }, + { + "items": [ + 10786.5, + 3.0450999736785889 + ], + "hints": { + "index": 20512 + } + }, + { + "items": [ + 10787, + 3.1308 + ], + "hints": { + "index": 20513 + } + }, + { + "items": [ + 10787.5, + 3.161099910736084 + ], + "hints": { + "index": 20514 + } + }, + { + "items": [ + 10788, + 2.94350004196167 + ], + "hints": { + "index": 20515 + } + }, + { + "items": [ + 10788.5, + 2.8271999359130859 + ], + "hints": { + "index": 20516 + } + }, + { + "items": [ + 10789, + 2.8422999382019043 + ], + "hints": { + "index": 20517 + } + }, + { + "items": [ + 10789.5, + 2.8749 + ], + "hints": { + "index": 20518 + } + }, + { + "items": [ + 10790, + 2.8677999973297119 + ], + "hints": { + "index": 20519 + } + }, + { + "items": [ + 10790.5, + 2.6988999843597412 + ], + "hints": { + "index": 20520 + } + }, + { + "items": [ + 10791, + 2.6398000717163086 + ], + "hints": { + "index": 20521 + } + }, + { + "items": [ + 10791.5, + 2.8208999633789063 + ], + "hints": { + "index": 20522 + } + }, + { + "items": [ + 10792, + 3.1154 + ], + "hints": { + "index": 20523 + } + }, + { + "items": [ + 10792.5, + 3.1563000679016113 + ], + "hints": { + "index": 20524 + } + }, + { + "items": [ + 10793, + 2.8150999546051025 + ], + "hints": { + "index": 20525 + } + }, + { + "items": [ + 10793.5, + 2.5137 + ], + "hints": { + "index": 20526 + } + }, + { + "items": [ + 10794, + 2.4356999397277832 + ], + "hints": { + "index": 20527 + } + }, + { + "items": [ + 10794.5, + 2.5422 + ], + "hints": { + "index": 20528 + } + }, + { + "items": [ + 10795, + 2.65339994430542 + ], + "hints": { + "index": 20529 + } + }, + { + "items": [ + 10795.5, + 2.723 + ], + "hints": { + "index": 20530 + } + }, + { + "items": [ + 10796, + 2.6440000534057617 + ], + "hints": { + "index": 20531 + } + }, + { + "items": [ + 10796.5, + 2.6043000221252441 + ], + "hints": { + "index": 20532 + } + }, + { + "items": [ + 10797, + 2.5693 + ], + "hints": { + "index": 20533 + } + }, + { + "items": [ + 10797.5, + 2.5940001010894775 + ], + "hints": { + "index": 20534 + } + }, + { + "items": [ + 10798, + 2.575200080871582 + ], + "hints": { + "index": 20535 + } + }, + { + "items": [ + 10798.5, + 2.6005 + ], + "hints": { + "index": 20536 + } + }, + { + "items": [ + 10799, + 2.682 + ], + "hints": { + "index": 20537 + } + }, + { + "items": [ + 10799.5, + 2.7243 + ], + "hints": { + "index": 20538 + } + }, + { + "items": [ + 10800, + 2.8158 + ], + "hints": { + "index": 20539 + } + }, + { + "items": [ + 10800.5, + 2.7357 + ], + "hints": { + "index": 20540 + } + }, + { + "items": [ + 10801, + 2.7501 + ], + "hints": { + "index": 20541 + } + }, + { + "items": [ + 10801.5, + 2.6837 + ], + "hints": { + "index": 20542 + } + }, + { + "items": [ + 10802, + 2.7806 + ], + "hints": { + "index": 20543 + } + }, + { + "items": [ + 10802.5, + 2.9342000484466553 + ], + "hints": { + "index": 20544 + } + }, + { + "items": [ + 10803, + 2.9608 + ], + "hints": { + "index": 20545 + } + }, + { + "items": [ + 10803.5, + 2.9381999969482422 + ], + "hints": { + "index": 20546 + } + }, + { + "items": [ + 10804, + 2.7903 + ], + "hints": { + "index": 20547 + } + }, + { + "items": [ + 10804.5, + 2.7795 + ], + "hints": { + "index": 20548 + } + }, + { + "items": [ + 10805, + 2.7557 + ], + "hints": { + "index": 20549 + } + }, + { + "items": [ + 10805.5, + 2.8503999710083008 + ], + "hints": { + "index": 20550 + } + }, + { + "items": [ + 10806, + 2.7822 + ], + "hints": { + "index": 20551 + } + }, + { + "items": [ + 10806.5, + 2.7341001033782959 + ], + "hints": { + "index": 20552 + } + }, + { + "items": [ + 10807, + 2.595599889755249 + ], + "hints": { + "index": 20553 + } + }, + { + "items": [ + 10807.5, + 2.575200080871582 + ], + "hints": { + "index": 20554 + } + }, + { + "items": [ + 10808, + 2.609699964523315 + ], + "hints": { + "index": 20555 + } + }, + { + "items": [ + 10808.5, + 2.648 + ], + "hints": { + "index": 20556 + } + }, + { + "items": [ + 10809, + 2.8015000820159912 + ], + "hints": { + "index": 20557 + } + }, + { + "items": [ + 10809.5, + 2.79830002784729 + ], + "hints": { + "index": 20558 + } + }, + { + "items": [ + 10810, + 2.7720000743865967 + ], + "hints": { + "index": 20559 + } + }, + { + "items": [ + 10810.5, + 2.6648 + ], + "hints": { + "index": 20560 + } + }, + { + "items": [ + 10811, + 2.6679000854492188 + ], + "hints": { + "index": 20561 + } + }, + { + "items": [ + 10811.5, + 2.6893 + ], + "hints": { + "index": 20562 + } + }, + { + "items": [ + 10812, + 2.6974999904632568 + ], + "hints": { + "index": 20563 + } + }, + { + "items": [ + 10812.5, + 2.7576999664306641 + ], + "hints": { + "index": 20564 + } + }, + { + "items": [ + 10813, + 2.7781999111175537 + ], + "hints": { + "index": 20565 + } + }, + { + "items": [ + 10813.5, + 2.7391 + ], + "hints": { + "index": 20566 + } + }, + { + "items": [ + 10814, + 2.7363998889923096 + ], + "hints": { + "index": 20567 + } + }, + { + "items": [ + 10814.5, + 2.6492 + ], + "hints": { + "index": 20568 + } + }, + { + "items": [ + 10815, + 2.686 + ], + "hints": { + "index": 20569 + } + }, + { + "items": [ + 10815.5, + 2.6231999397277832 + ], + "hints": { + "index": 20570 + } + }, + { + "items": [ + 10816, + 2.6945 + ], + "hints": { + "index": 20571 + } + }, + { + "items": [ + 10816.5, + 2.7799 + ], + "hints": { + "index": 20572 + } + }, + { + "items": [ + 10817, + 2.9206 + ], + "hints": { + "index": 20573 + } + }, + { + "items": [ + 10817.5, + 2.916 + ], + "hints": { + "index": 20574 + } + }, + { + "items": [ + 10818, + 3.0318 + ], + "hints": { + "index": 20575 + } + }, + { + "items": [ + 10818.5, + 2.8614 + ], + "hints": { + "index": 20576 + } + }, + { + "items": [ + 10819, + 2.8686 + ], + "hints": { + "index": 20577 + } + }, + { + "items": [ + 10819.5, + 2.7251 + ], + "hints": { + "index": 20578 + } + }, + { + "items": [ + 10820, + 2.8384 + ], + "hints": { + "index": 20579 + } + }, + { + "items": [ + 10820.5, + 2.9461 + ], + "hints": { + "index": 20580 + } + }, + { + "items": [ + 10821, + 3.04010009765625 + ], + "hints": { + "index": 20581 + } + }, + { + "items": [ + 10821.5, + 2.931 + ], + "hints": { + "index": 20582 + } + }, + { + "items": [ + 10822, + 2.8085 + ], + "hints": { + "index": 20583 + } + }, + { + "items": [ + 10822.5, + 2.7065999507904053 + ], + "hints": { + "index": 20584 + } + }, + { + "items": [ + 10823, + 2.6827 + ], + "hints": { + "index": 20585 + } + }, + { + "items": [ + 10823.5, + 2.7356998920440674 + ], + "hints": { + "index": 20586 + } + }, + { + "items": [ + 10824, + 2.7263 + ], + "hints": { + "index": 20587 + } + }, + { + "items": [ + 10824.5, + 2.947700023651123 + ], + "hints": { + "index": 20588 + } + }, + { + "items": [ + 10825, + 2.9638 + ], + "hints": { + "index": 20589 + } + }, + { + "items": [ + 10825.5, + 2.9485 + ], + "hints": { + "index": 20590 + } + }, + { + "items": [ + 10826, + 2.7022 + ], + "hints": { + "index": 20591 + } + }, + { + "items": [ + 10826.5, + 2.657599925994873 + ], + "hints": { + "index": 20592 + } + }, + { + "items": [ + 10827, + 2.6851 + ], + "hints": { + "index": 20593 + } + }, + { + "items": [ + 10827.5, + 2.6682000160217285 + ], + "hints": { + "index": 20594 + } + }, + { + "items": [ + 10828, + 2.64520001411438 + ], + "hints": { + "index": 20595 + } + }, + { + "items": [ + 10828.5, + 2.6354000568389893 + ], + "hints": { + "index": 20596 + } + }, + { + "items": [ + 10829, + 2.7304000854492188 + ], + "hints": { + "index": 20597 + } + }, + { + "items": [ + 10829.5, + 2.7672 + ], + "hints": { + "index": 20598 + } + }, + { + "items": [ + 10830, + 2.8752999305725098 + ], + "hints": { + "index": 20599 + } + }, + { + "items": [ + 10830.5, + 3.0362000465393062 + ], + "hints": { + "index": 20600 + } + }, + { + "items": [ + 10831, + 3.1412 + ], + "hints": { + "index": 20601 + } + }, + { + "items": [ + 10831.5, + 3.0748 + ], + "hints": { + "index": 20602 + } + }, + { + "items": [ + 10832, + 3.006 + ], + "hints": { + "index": 20603 + } + }, + { + "items": [ + 10832.5, + 3.1242 + ], + "hints": { + "index": 20604 + } + }, + { + "items": [ + 10833, + 3.2461 + ], + "hints": { + "index": 20605 + } + }, + { + "items": [ + 10833.5, + 3.2937 + ], + "hints": { + "index": 20606 + } + }, + { + "items": [ + 10834, + 3.2414000034332275 + ], + "hints": { + "index": 20607 + } + }, + { + "items": [ + 10834.5, + 3.2986 + ], + "hints": { + "index": 20608 + } + }, + { + "items": [ + 10835, + 3.2284998893737793 + ], + "hints": { + "index": 20609 + } + }, + { + "items": [ + 10835.5, + 3.225600004196167 + ], + "hints": { + "index": 20610 + } + }, + { + "items": [ + 10836, + 3.202800035476685 + ], + "hints": { + "index": 20611 + } + }, + { + "items": [ + 10836.5, + 3.1828 + ], + "hints": { + "index": 20612 + } + }, + { + "items": [ + 10837, + 2.9794 + ], + "hints": { + "index": 20613 + } + }, + { + "items": [ + 10837.5, + 2.7533 + ], + "hints": { + "index": 20614 + } + }, + { + "items": [ + 10838, + 2.6776 + ], + "hints": { + "index": 20615 + } + }, + { + "items": [ + 10838.5, + 2.8419 + ], + "hints": { + "index": 20616 + } + }, + { + "items": [ + 10839, + 3.052299976348877 + ], + "hints": { + "index": 20617 + } + }, + { + "items": [ + 10839.5, + 3.1222999095916748 + ], + "hints": { + "index": 20618 + } + }, + { + "items": [ + 10840, + 3.127500057220459 + ], + "hints": { + "index": 20619 + } + }, + { + "items": [ + 10840.5, + 3.0100998878479004 + ], + "hints": { + "index": 20620 + } + }, + { + "items": [ + 10841, + 3.087 + ], + "hints": { + "index": 20621 + } + }, + { + "items": [ + 10841.5, + 3.0431 + ], + "hints": { + "index": 20622 + } + }, + { + "items": [ + 10842, + 3.0772 + ], + "hints": { + "index": 20623 + } + }, + { + "items": [ + 10842.5, + 3.0412 + ], + "hints": { + "index": 20624 + } + }, + { + "items": [ + 10843, + 2.9614999294281006 + ], + "hints": { + "index": 20625 + } + }, + { + "items": [ + 10843.5, + 2.9365 + ], + "hints": { + "index": 20626 + } + }, + { + "items": [ + 10844, + 2.9068999290466309 + ], + "hints": { + "index": 20627 + } + }, + { + "items": [ + 10844.5, + 2.8642 + ], + "hints": { + "index": 20628 + } + }, + { + "items": [ + 10845, + 2.8821001052856445 + ], + "hints": { + "index": 20629 + } + }, + { + "items": [ + 10845.5, + 2.8380999565124512 + ], + "hints": { + "index": 20630 + } + }, + { + "items": [ + 10846, + 2.9410998821258545 + ], + "hints": { + "index": 20631 + } + }, + { + "items": [ + 10846.5, + 2.9244999885559082 + ], + "hints": { + "index": 20632 + } + }, + { + "items": [ + 10847, + 2.9855000972747803 + ], + "hints": { + "index": 20633 + } + }, + { + "items": [ + 10847.5, + 2.9068999290466309 + ], + "hints": { + "index": 20634 + } + }, + { + "items": [ + 10848, + 2.9275999069213867 + ], + "hints": { + "index": 20635 + } + }, + { + "items": [ + 10848.5, + 2.910599946975708 + ], + "hints": { + "index": 20636 + } + }, + { + "items": [ + 10849, + 2.9986 + ], + "hints": { + "index": 20637 + } + }, + { + "items": [ + 10849.5, + 2.9367 + ], + "hints": { + "index": 20638 + } + }, + { + "items": [ + 10850, + 2.8928 + ], + "hints": { + "index": 20639 + } + }, + { + "items": [ + 10850.5, + 2.7862 + ], + "hints": { + "index": 20640 + } + }, + { + "items": [ + 10851, + 2.8011 + ], + "hints": { + "index": 20641 + } + }, + { + "items": [ + 10851.5, + 2.7013 + ], + "hints": { + "index": 20642 + } + }, + { + "items": [ + 10852, + 2.6788 + ], + "hints": { + "index": 20643 + } + }, + { + "items": [ + 10852.5, + 2.6347 + ], + "hints": { + "index": 20644 + } + }, + { + "items": [ + 10853, + 2.7107 + ], + "hints": { + "index": 20645 + } + }, + { + "items": [ + 10853.5, + 2.8304 + ], + "hints": { + "index": 20646 + } + }, + { + "items": [ + 10854, + 2.8227 + ], + "hints": { + "index": 20647 + } + }, + { + "items": [ + 10854.5, + 2.7491 + ], + "hints": { + "index": 20648 + } + }, + { + "items": [ + 10855, + 2.6795001029968266 + ], + "hints": { + "index": 20649 + } + }, + { + "items": [ + 10855.5, + 2.7464001178741455 + ], + "hints": { + "index": 20650 + } + }, + { + "items": [ + 10856, + 2.7846000194549561 + ], + "hints": { + "index": 20651 + } + }, + { + "items": [ + 10856.5, + 2.7604000568389893 + ], + "hints": { + "index": 20652 + } + }, + { + "items": [ + 10857, + 2.8101000785827637 + ], + "hints": { + "index": 20653 + } + }, + { + "items": [ + 10857.5, + 3.0088999271392822 + ], + "hints": { + "index": 20654 + } + }, + { + "items": [ + 10858, + 3.1401998996734619 + ], + "hints": { + "index": 20655 + } + }, + { + "items": [ + 10858.5, + 3.0385000705718994 + ], + "hints": { + "index": 20656 + } + }, + { + "items": [ + 10859, + 2.8578999042510982 + ], + "hints": { + "index": 20657 + } + }, + { + "items": [ + 10859.5, + 2.7374999523162842 + ], + "hints": { + "index": 20658 + } + }, + { + "items": [ + 10860, + 2.7012999057769775 + ], + "hints": { + "index": 20659 + } + }, + { + "items": [ + 10860.5, + 2.7676000595092773 + ], + "hints": { + "index": 20660 + } + }, + { + "items": [ + 10861, + 3.0169000625610352 + ], + "hints": { + "index": 20661 + } + }, + { + "items": [ + 10861.5, + 3.1709001064300537 + ], + "hints": { + "index": 20662 + } + }, + { + "items": [ + 10862, + 3.0322999954223633 + ], + "hints": { + "index": 20663 + } + }, + { + "items": [ + 10862.5, + 2.7004001140594478 + ], + "hints": { + "index": 20664 + } + }, + { + "items": [ + 10863, + 2.6217999458312988 + ], + "hints": { + "index": 20665 + } + }, + { + "items": [ + 10863.5, + 2.7688999176025391 + ], + "hints": { + "index": 20666 + } + }, + { + "items": [ + 10864, + 2.8506 + ], + "hints": { + "index": 20667 + } + }, + { + "items": [ + 10864.5, + 2.7895 + ], + "hints": { + "index": 20668 + } + }, + { + "items": [ + 10865, + 2.725100040435791 + ], + "hints": { + "index": 20669 + } + }, + { + "items": [ + 10865.5, + 2.711899995803833 + ], + "hints": { + "index": 20670 + } + }, + { + "items": [ + 10866, + 2.6411 + ], + "hints": { + "index": 20671 + } + }, + { + "items": [ + 10866.5, + 2.6020998954772949 + ], + "hints": { + "index": 20672 + } + }, + { + "items": [ + 10867, + 2.5871 + ], + "hints": { + "index": 20673 + } + }, + { + "items": [ + 10867.5, + 2.6222 + ], + "hints": { + "index": 20674 + } + }, + { + "items": [ + 10868, + 2.6164 + ], + "hints": { + "index": 20675 + } + }, + { + "items": [ + 10868.5, + 2.6071999073028564 + ], + "hints": { + "index": 20676 + } + }, + { + "items": [ + 10869, + 2.6946 + ], + "hints": { + "index": 20677 + } + }, + { + "items": [ + 10869.5, + 2.6515998840332031 + ], + "hints": { + "index": 20678 + } + }, + { + "items": [ + 10870, + 2.6015999317169189 + ], + "hints": { + "index": 20679 + } + }, + { + "items": [ + 10870.5, + 2.5834 + ], + "hints": { + "index": 20680 + } + }, + { + "items": [ + 10871, + 2.661099910736084 + ], + "hints": { + "index": 20681 + } + }, + { + "items": [ + 10871.5, + 2.7888998985290527 + ], + "hints": { + "index": 20682 + } + }, + { + "items": [ + 10872, + 2.8359000682830811 + ], + "hints": { + "index": 20683 + } + }, + { + "items": [ + 10872.5, + 2.9302 + ], + "hints": { + "index": 20684 + } + }, + { + "items": [ + 10873, + 2.8064000606536865 + ], + "hints": { + "index": 20685 + } + }, + { + "items": [ + 10873.5, + 2.8673999309539795 + ], + "hints": { + "index": 20686 + } + }, + { + "items": [ + 10874, + 2.8742001056671143 + ], + "hints": { + "index": 20687 + } + }, + { + "items": [ + 10874.5, + 2.951 + ], + "hints": { + "index": 20688 + } + }, + { + "items": [ + 10875, + 2.8566 + ], + "hints": { + "index": 20689 + } + }, + { + "items": [ + 10875.5, + 2.6186 + ], + "hints": { + "index": 20690 + } + }, + { + "items": [ + 10876, + 2.4904999732971191 + ], + "hints": { + "index": 20691 + } + }, + { + "items": [ + 10876.5, + 2.4676 + ], + "hints": { + "index": 20692 + } + }, + { + "items": [ + 10877, + 2.6695 + ], + "hints": { + "index": 20693 + } + }, + { + "items": [ + 10877.5, + 2.8332 + ], + "hints": { + "index": 20694 + } + }, + { + "items": [ + 10878, + 2.768 + ], + "hints": { + "index": 20695 + } + }, + { + "items": [ + 10878.5, + 2.7308 + ], + "hints": { + "index": 20696 + } + }, + { + "items": [ + 10879, + 2.7013 + ], + "hints": { + "index": 20697 + } + }, + { + "items": [ + 10879.5, + 2.7298 + ], + "hints": { + "index": 20698 + } + }, + { + "items": [ + 10880, + 2.6448 + ], + "hints": { + "index": 20699 + } + }, + { + "items": [ + 10880.5, + 2.6842999458312988 + ], + "hints": { + "index": 20700 + } + }, + { + "items": [ + 10881, + 2.7960000038146973 + ], + "hints": { + "index": 20701 + } + }, + { + "items": [ + 10881.5, + 2.80430006980896 + ], + "hints": { + "index": 20702 + } + }, + { + "items": [ + 10882, + 2.8250000476837158 + ], + "hints": { + "index": 20703 + } + }, + { + "items": [ + 10882.5, + 2.8296 + ], + "hints": { + "index": 20704 + } + }, + { + "items": [ + 10883, + 2.8853 + ], + "hints": { + "index": 20705 + } + }, + { + "items": [ + 10883.5, + 2.8125 + ], + "hints": { + "index": 20706 + } + }, + { + "items": [ + 10884, + 2.7069 + ], + "hints": { + "index": 20707 + } + }, + { + "items": [ + 10884.5, + 2.6863 + ], + "hints": { + "index": 20708 + } + }, + { + "items": [ + 10885, + 2.7127 + ], + "hints": { + "index": 20709 + } + }, + { + "items": [ + 10885.5, + 2.7155001163482666 + ], + "hints": { + "index": 20710 + } + }, + { + "items": [ + 10886, + 2.6765000820159912 + ], + "hints": { + "index": 20711 + } + }, + { + "items": [ + 10886.5, + 2.6508998870849609 + ], + "hints": { + "index": 20712 + } + }, + { + "items": [ + 10887, + 2.8359999656677246 + ], + "hints": { + "index": 20713 + } + }, + { + "items": [ + 10887.5, + 2.9386999607086186 + ], + "hints": { + "index": 20714 + } + }, + { + "items": [ + 10888, + 2.9460000991821289 + ], + "hints": { + "index": 20715 + } + }, + { + "items": [ + 10888.5, + 2.7462000846862793 + ], + "hints": { + "index": 20716 + } + }, + { + "items": [ + 10889, + 2.5998001098632813 + ], + "hints": { + "index": 20717 + } + }, + { + "items": [ + 10889.5, + 2.586899995803833 + ], + "hints": { + "index": 20718 + } + }, + { + "items": [ + 10890, + 2.58240008354187 + ], + "hints": { + "index": 20719 + } + }, + { + "items": [ + 10890.5, + 2.6282000541687012 + ], + "hints": { + "index": 20720 + } + }, + { + "items": [ + 10891, + 2.635 + ], + "hints": { + "index": 20721 + } + }, + { + "items": [ + 10891.5, + 2.6616 + ], + "hints": { + "index": 20722 + } + }, + { + "items": [ + 10892, + 2.7478 + ], + "hints": { + "index": 20723 + } + }, + { + "items": [ + 10892.5, + 2.8794 + ], + "hints": { + "index": 20724 + } + }, + { + "items": [ + 10893, + 2.8917 + ], + "hints": { + "index": 20725 + } + }, + { + "items": [ + 10893.5, + 2.8561 + ], + "hints": { + "index": 20726 + } + }, + { + "items": [ + 10894, + 2.7927000522613525 + ], + "hints": { + "index": 20727 + } + }, + { + "items": [ + 10894.5, + 2.8104000091552734 + ], + "hints": { + "index": 20728 + } + }, + { + "items": [ + 10895, + 2.6935 + ], + "hints": { + "index": 20729 + } + }, + { + "items": [ + 10895.5, + 2.6562 + ], + "hints": { + "index": 20730 + } + }, + { + "items": [ + 10896, + 2.583 + ], + "hints": { + "index": 20731 + } + }, + { + "items": [ + 10896.5, + 2.6816999912261963 + ], + "hints": { + "index": 20732 + } + }, + { + "items": [ + 10897, + 2.7948000431060791 + ], + "hints": { + "index": 20733 + } + }, + { + "items": [ + 10897.5, + 2.9305 + ], + "hints": { + "index": 20734 + } + }, + { + "items": [ + 10898, + 3.1339 + ], + "hints": { + "index": 20735 + } + }, + { + "items": [ + 10898.5, + 3.1679 + ], + "hints": { + "index": 20736 + } + }, + { + "items": [ + 10899, + 3.4427 + ], + "hints": { + "index": 20737 + } + }, + { + "items": [ + 10899.5, + 3.5182 + ], + "hints": { + "index": 20738 + } + }, + { + "items": [ + 10900, + 3.8347001075744633 + ], + "hints": { + "index": 20739 + } + }, + { + "items": [ + 10900.5, + 3.7045 + ], + "hints": { + "index": 20740 + } + }, + { + "items": [ + 10901, + 3.5036 + ], + "hints": { + "index": 20741 + } + }, + { + "items": [ + 10901.5, + 3.3782 + ], + "hints": { + "index": 20742 + } + }, + { + "items": [ + 10902, + 3.3382000923156734 + ], + "hints": { + "index": 20743 + } + }, + { + "items": [ + 10902.5, + 3.5556 + ], + "hints": { + "index": 20744 + } + }, + { + "items": [ + 10903, + 3.5496 + ], + "hints": { + "index": 20745 + } + }, + { + "items": [ + 10903.5, + 3.6168 + ], + "hints": { + "index": 20746 + } + }, + { + "items": [ + 10904, + 3.6923 + ], + "hints": { + "index": 20747 + } + }, + { + "items": [ + 10904.5, + 3.7636 + ], + "hints": { + "index": 20748 + } + }, + { + "items": [ + 10905, + 3.823699951171875 + ], + "hints": { + "index": 20749 + } + }, + { + "items": [ + 10905.5, + 3.6373000144958496 + ], + "hints": { + "index": 20750 + } + }, + { + "items": [ + 10906, + 3.5002999305725098 + ], + "hints": { + "index": 20751 + } + }, + { + "items": [ + 10906.5, + 3.1846001148223877 + ], + "hints": { + "index": 20752 + } + }, + { + "items": [ + 10907, + 3.0238 + ], + "hints": { + "index": 20753 + } + }, + { + "items": [ + 10907.5, + 2.9354 + ], + "hints": { + "index": 20754 + } + }, + { + "items": [ + 10908, + 2.8869 + ], + "hints": { + "index": 20755 + } + }, + { + "items": [ + 10908.5, + 2.8659 + ], + "hints": { + "index": 20756 + } + }, + { + "items": [ + 10909, + 2.8568 + ], + "hints": { + "index": 20757 + } + }, + { + "items": [ + 10909.5, + 3.03410005569458 + ], + "hints": { + "index": 20758 + } + }, + { + "items": [ + 10910, + 3.065000057220459 + ], + "hints": { + "index": 20759 + } + }, + { + "items": [ + 10910.5, + 3.0480000972747803 + ], + "hints": { + "index": 20760 + } + }, + { + "items": [ + 10911, + 2.896899938583374 + ], + "hints": { + "index": 20761 + } + }, + { + "items": [ + 10911.5, + 2.7767000198364258 + ], + "hints": { + "index": 20762 + } + }, + { + "items": [ + 10912, + 2.7476000785827637 + ], + "hints": { + "index": 20763 + } + }, + { + "items": [ + 10912.5, + 2.7572000026702881 + ], + "hints": { + "index": 20764 + } + }, + { + "items": [ + 10913, + 2.8578999042510982 + ], + "hints": { + "index": 20765 + } + }, + { + "items": [ + 10913.5, + 2.9098000526428223 + ], + "hints": { + "index": 20766 + } + }, + { + "items": [ + 10914, + 2.9714000225067139 + ], + "hints": { + "index": 20767 + } + }, + { + "items": [ + 10914.5, + 2.976099967956543 + ], + "hints": { + "index": 20768 + } + }, + { + "items": [ + 10915, + 2.9878 + ], + "hints": { + "index": 20769 + } + }, + { + "items": [ + 10915.5, + 2.9928 + ], + "hints": { + "index": 20770 + } + }, + { + "items": [ + 10916, + 2.9989 + ], + "hints": { + "index": 20771 + } + }, + { + "items": [ + 10916.5, + 2.8518 + ], + "hints": { + "index": 20772 + } + }, + { + "items": [ + 10917, + 2.7114 + ], + "hints": { + "index": 20773 + } + }, + { + "items": [ + 10917.5, + 2.6421999931335449 + ], + "hints": { + "index": 20774 + } + }, + { + "items": [ + 10918, + 2.763700008392334 + ], + "hints": { + "index": 20775 + } + }, + { + "items": [ + 10918.5, + 2.8326001167297363 + ], + "hints": { + "index": 20776 + } + }, + { + "items": [ + 10919, + 2.9175000190734863 + ], + "hints": { + "index": 20777 + } + }, + { + "items": [ + 10919.5, + 2.7356998920440674 + ], + "hints": { + "index": 20778 + } + }, + { + "items": [ + 10920, + 2.6673998832702637 + ], + "hints": { + "index": 20779 + } + }, + { + "items": [ + 10920.5, + 2.589400053024292 + ], + "hints": { + "index": 20780 + } + }, + { + "items": [ + 10921, + 2.7420001029968266 + ], + "hints": { + "index": 20781 + } + }, + { + "items": [ + 10921.5, + 2.8117 + ], + "hints": { + "index": 20782 + } + }, + { + "items": [ + 10922, + 2.8536 + ], + "hints": { + "index": 20783 + } + }, + { + "items": [ + 10922.5, + 2.8664000034332275 + ], + "hints": { + "index": 20784 + } + }, + { + "items": [ + 10923, + 2.9274001121520996 + ], + "hints": { + "index": 20785 + } + }, + { + "items": [ + 10923.5, + 2.9697000980377197 + ], + "hints": { + "index": 20786 + } + }, + { + "items": [ + 10924, + 2.8837 + ], + "hints": { + "index": 20787 + } + }, + { + "items": [ + 10924.5, + 2.8478 + ], + "hints": { + "index": 20788 + } + }, + { + "items": [ + 10925, + 2.7377998828887939 + ], + "hints": { + "index": 20789 + } + }, + { + "items": [ + 10925.5, + 2.8044 + ], + "hints": { + "index": 20790 + } + }, + { + "items": [ + 10926, + 2.8104 + ], + "hints": { + "index": 20791 + } + }, + { + "items": [ + 10926.5, + 3.0111 + ], + "hints": { + "index": 20792 + } + }, + { + "items": [ + 10927, + 3.0167 + ], + "hints": { + "index": 20793 + } + }, + { + "items": [ + 10927.5, + 2.9651 + ], + "hints": { + "index": 20794 + } + }, + { + "items": [ + 10928, + 2.8801 + ], + "hints": { + "index": 20795 + } + }, + { + "items": [ + 10928.5, + 2.7671999931335449 + ], + "hints": { + "index": 20796 + } + }, + { + "items": [ + 10929, + 2.8494000434875488 + ], + "hints": { + "index": 20797 + } + }, + { + "items": [ + 10929.5, + 2.8468000888824463 + ], + "hints": { + "index": 20798 + } + }, + { + "items": [ + 10930, + 2.9362 + ], + "hints": { + "index": 20799 + } + }, + { + "items": [ + 10930.5, + 2.8485000133514404 + ], + "hints": { + "index": 20800 + } + }, + { + "items": [ + 10931, + 2.9342 + ], + "hints": { + "index": 20801 + } + }, + { + "items": [ + 10931.5, + 2.9558 + ], + "hints": { + "index": 20802 + } + }, + { + "items": [ + 10932, + 2.9936 + ], + "hints": { + "index": 20803 + } + }, + { + "items": [ + 10932.5, + 2.8670001029968266 + ], + "hints": { + "index": 20804 + } + }, + { + "items": [ + 10933, + 2.8211 + ], + "hints": { + "index": 20805 + } + }, + { + "items": [ + 10933.5, + 2.763 + ], + "hints": { + "index": 20806 + } + }, + { + "items": [ + 10934, + 2.7468 + ], + "hints": { + "index": 20807 + } + }, + { + "items": [ + 10934.5, + 2.6908 + ], + "hints": { + "index": 20808 + } + }, + { + "items": [ + 10935, + 2.7289 + ], + "hints": { + "index": 20809 + } + }, + { + "items": [ + 10935.5, + 2.7741999626159668 + ], + "hints": { + "index": 20810 + } + }, + { + "items": [ + 10936, + 2.7448 + ], + "hints": { + "index": 20811 + } + }, + { + "items": [ + 10936.5, + 2.753 + ], + "hints": { + "index": 20812 + } + }, + { + "items": [ + 10937, + 2.6948 + ], + "hints": { + "index": 20813 + } + }, + { + "items": [ + 10937.5, + 2.7822000980377197 + ], + "hints": { + "index": 20814 + } + }, + { + "items": [ + 10938, + 2.6975 + ], + "hints": { + "index": 20815 + } + }, + { + "items": [ + 10938.5, + 2.6921 + ], + "hints": { + "index": 20816 + } + }, + { + "items": [ + 10939, + 2.7254 + ], + "hints": { + "index": 20817 + } + }, + { + "items": [ + 10939.5, + 2.8886 + ], + "hints": { + "index": 20818 + } + }, + { + "items": [ + 10940, + 2.9092 + ], + "hints": { + "index": 20819 + } + }, + { + "items": [ + 10940.5, + 2.916100025177002 + ], + "hints": { + "index": 20820 + } + }, + { + "items": [ + 10941, + 2.8678 + ], + "hints": { + "index": 20821 + } + }, + { + "items": [ + 10941.5, + 2.7827000617980957 + ], + "hints": { + "index": 20822 + } + }, + { + "items": [ + 10942, + 2.734299898147583 + ], + "hints": { + "index": 20823 + } + }, + { + "items": [ + 10942.5, + 2.6575 + ], + "hints": { + "index": 20824 + } + }, + { + "items": [ + 10943, + 2.8368 + ], + "hints": { + "index": 20825 + } + }, + { + "items": [ + 10943.5, + 2.826 + ], + "hints": { + "index": 20826 + } + }, + { + "items": [ + 10944, + 2.8343 + ], + "hints": { + "index": 20827 + } + }, + { + "items": [ + 10944.5, + 2.6905 + ], + "hints": { + "index": 20828 + } + }, + { + "items": [ + 10945, + 2.6359000205993652 + ], + "hints": { + "index": 20829 + } + }, + { + "items": [ + 10945.5, + 2.764 + ], + "hints": { + "index": 20830 + } + }, + { + "items": [ + 10946, + 2.8018 + ], + "hints": { + "index": 20831 + } + }, + { + "items": [ + 10946.5, + 2.9375 + ], + "hints": { + "index": 20832 + } + }, + { + "items": [ + 10947, + 2.8644 + ], + "hints": { + "index": 20833 + } + }, + { + "items": [ + 10947.5, + 2.8263 + ], + "hints": { + "index": 20834 + } + }, + { + "items": [ + 10948, + 2.912 + ], + "hints": { + "index": 20835 + } + }, + { + "items": [ + 10948.5, + 2.8255 + ], + "hints": { + "index": 20836 + } + }, + { + "items": [ + 10949, + 2.9047000408172607 + ], + "hints": { + "index": 20837 + } + }, + { + "items": [ + 10949.5, + 2.7309 + ], + "hints": { + "index": 20838 + } + }, + { + "items": [ + 10950, + 2.7663 + ], + "hints": { + "index": 20839 + } + }, + { + "items": [ + 10950.5, + 2.6795001029968266 + ], + "hints": { + "index": 20840 + } + }, + { + "items": [ + 10951, + 2.809 + ], + "hints": { + "index": 20841 + } + }, + { + "items": [ + 10951.5, + 2.8795 + ], + "hints": { + "index": 20842 + } + }, + { + "items": [ + 10952, + 2.8911 + ], + "hints": { + "index": 20843 + } + }, + { + "items": [ + 10952.5, + 2.7865 + ], + "hints": { + "index": 20844 + } + }, + { + "items": [ + 10953, + 2.7381 + ], + "hints": { + "index": 20845 + } + }, + { + "items": [ + 10953.5, + 2.7151 + ], + "hints": { + "index": 20846 + } + }, + { + "items": [ + 10954, + 2.6899 + ], + "hints": { + "index": 20847 + } + }, + { + "items": [ + 10954.5, + 2.7209 + ], + "hints": { + "index": 20848 + } + }, + { + "items": [ + 10955, + 2.761699914932251 + ], + "hints": { + "index": 20849 + } + }, + { + "items": [ + 10955.5, + 2.7244 + ], + "hints": { + "index": 20850 + } + }, + { + "items": [ + 10956, + 2.5822000503540039 + ], + "hints": { + "index": 20851 + } + }, + { + "items": [ + 10956.5, + 2.5232000350952148 + ], + "hints": { + "index": 20852 + } + }, + { + "items": [ + 10957, + 2.5327000617980957 + ], + "hints": { + "index": 20853 + } + }, + { + "items": [ + 10957.5, + 2.6020998954772949 + ], + "hints": { + "index": 20854 + } + }, + { + "items": [ + 10958, + 2.6256999969482422 + ], + "hints": { + "index": 20855 + } + }, + { + "items": [ + 10958.5, + 2.5734000205993652 + ], + "hints": { + "index": 20856 + } + }, + { + "items": [ + 10959, + 2.5065000057220459 + ], + "hints": { + "index": 20857 + } + }, + { + "items": [ + 10959.5, + 2.5423998832702637 + ], + "hints": { + "index": 20858 + } + }, + { + "items": [ + 10960, + 2.6519999504089355 + ], + "hints": { + "index": 20859 + } + }, + { + "items": [ + 10960.5, + 2.7843000888824463 + ], + "hints": { + "index": 20860 + } + }, + { + "items": [ + 10961, + 2.8176000118255615 + ], + "hints": { + "index": 20861 + } + }, + { + "items": [ + 10961.5, + 2.7500998973846436 + ], + "hints": { + "index": 20862 + } + }, + { + "items": [ + 10962, + 2.7790000438690186 + ], + "hints": { + "index": 20863 + } + }, + { + "items": [ + 10962.5, + 2.8997 + ], + "hints": { + "index": 20864 + } + }, + { + "items": [ + 10963, + 3.1227 + ], + "hints": { + "index": 20865 + } + }, + { + "items": [ + 10963.5, + 3.098599910736084 + ], + "hints": { + "index": 20866 + } + }, + { + "items": [ + 10964, + 2.8798 + ], + "hints": { + "index": 20867 + } + }, + { + "items": [ + 10964.5, + 2.6953 + ], + "hints": { + "index": 20868 + } + }, + { + "items": [ + 10965, + 2.7245 + ], + "hints": { + "index": 20869 + } + }, + { + "items": [ + 10965.5, + 2.9010000228881836 + ], + "hints": { + "index": 20870 + } + }, + { + "items": [ + 10966, + 2.9932000637054443 + ], + "hints": { + "index": 20871 + } + }, + { + "items": [ + 10966.5, + 2.9683 + ], + "hints": { + "index": 20872 + } + }, + { + "items": [ + 10967, + 2.8265 + ], + "hints": { + "index": 20873 + } + }, + { + "items": [ + 10967.5, + 2.8250000476837158 + ], + "hints": { + "index": 20874 + } + }, + { + "items": [ + 10968, + 2.8879001140594478 + ], + "hints": { + "index": 20875 + } + }, + { + "items": [ + 10968.5, + 2.9389 + ], + "hints": { + "index": 20876 + } + }, + { + "items": [ + 10969, + 2.9753 + ], + "hints": { + "index": 20877 + } + }, + { + "items": [ + 10969.5, + 2.9442 + ], + "hints": { + "index": 20878 + } + }, + { + "items": [ + 10970, + 2.8801999092102051 + ], + "hints": { + "index": 20879 + } + }, + { + "items": [ + 10970.5, + 2.9026999473571777 + ], + "hints": { + "index": 20880 + } + }, + { + "items": [ + 10971, + 2.8710000514984131 + ], + "hints": { + "index": 20881 + } + }, + { + "items": [ + 10971.5, + 3.0143 + ], + "hints": { + "index": 20882 + } + }, + { + "items": [ + 10972, + 3.0499999523162842 + ], + "hints": { + "index": 20883 + } + }, + { + "items": [ + 10972.5, + 3.1263000965118408 + ], + "hints": { + "index": 20884 + } + }, + { + "items": [ + 10973, + 3.1627 + ], + "hints": { + "index": 20885 + } + }, + { + "items": [ + 10973.5, + 3.1254 + ], + "hints": { + "index": 20886 + } + }, + { + "items": [ + 10974, + 3.0997 + ], + "hints": { + "index": 20887 + } + }, + { + "items": [ + 10974.5, + 2.9937999248504639 + ], + "hints": { + "index": 20888 + } + }, + { + "items": [ + 10975, + 2.808 + ], + "hints": { + "index": 20889 + } + }, + { + "items": [ + 10975.5, + 2.6721000671386719 + ], + "hints": { + "index": 20890 + } + }, + { + "items": [ + 10976, + 2.6540999412536621 + ], + "hints": { + "index": 20891 + } + }, + { + "items": [ + 10976.5, + 2.6454999446868896 + ], + "hints": { + "index": 20892 + } + }, + { + "items": [ + 10977, + 2.6332 + ], + "hints": { + "index": 20893 + } + }, + { + "items": [ + 10977.5, + 2.58240008354187 + ], + "hints": { + "index": 20894 + } + }, + { + "items": [ + 10978, + 2.611799955368042 + ], + "hints": { + "index": 20895 + } + }, + { + "items": [ + 10978.5, + 2.7109000682830811 + ], + "hints": { + "index": 20896 + } + }, + { + "items": [ + 10979, + 2.6649000644683838 + ], + "hints": { + "index": 20897 + } + }, + { + "items": [ + 10979.5, + 2.7309000492095947 + ], + "hints": { + "index": 20898 + } + }, + { + "items": [ + 10980, + 2.7657999992370605 + ], + "hints": { + "index": 20899 + } + }, + { + "items": [ + 10980.5, + 2.9231998920440674 + ], + "hints": { + "index": 20900 + } + }, + { + "items": [ + 10981, + 2.8269 + ], + "hints": { + "index": 20901 + } + }, + { + "items": [ + 10981.5, + 2.8164 + ], + "hints": { + "index": 20902 + } + }, + { + "items": [ + 10982, + 2.7742 + ], + "hints": { + "index": 20903 + } + }, + { + "items": [ + 10982.5, + 2.6978 + ], + "hints": { + "index": 20904 + } + }, + { + "items": [ + 10983, + 2.5780000686645508 + ], + "hints": { + "index": 20905 + } + }, + { + "items": [ + 10983.5, + 2.4159998893737793 + ], + "hints": { + "index": 20906 + } + }, + { + "items": [ + 10984, + 2.3633999824523926 + ], + "hints": { + "index": 20907 + } + }, + { + "items": [ + 10984.5, + 2.3297 + ], + "hints": { + "index": 20908 + } + }, + { + "items": [ + 10985, + 2.4488000869750977 + ], + "hints": { + "index": 20909 + } + }, + { + "items": [ + 10985.5, + 2.5861 + ], + "hints": { + "index": 20910 + } + }, + { + "items": [ + 10986, + 2.6984999179840088 + ], + "hints": { + "index": 20911 + } + }, + { + "items": [ + 10986.5, + 2.691 + ], + "hints": { + "index": 20912 + } + }, + { + "items": [ + 10987, + 2.6987 + ], + "hints": { + "index": 20913 + } + }, + { + "items": [ + 10987.5, + 2.6807 + ], + "hints": { + "index": 20914 + } + }, + { + "items": [ + 10988, + 2.6772000789642334 + ], + "hints": { + "index": 20915 + } + }, + { + "items": [ + 10988.5, + 2.6092 + ], + "hints": { + "index": 20916 + } + }, + { + "items": [ + 10989, + 2.5326 + ], + "hints": { + "index": 20917 + } + }, + { + "items": [ + 10989.5, + 2.4797 + ], + "hints": { + "index": 20918 + } + }, + { + "items": [ + 10990, + 2.5429000854492188 + ], + "hints": { + "index": 20919 + } + }, + { + "items": [ + 10990.5, + 2.6150999069213867 + ], + "hints": { + "index": 20920 + } + }, + { + "items": [ + 10991, + 2.5885999202728271 + ], + "hints": { + "index": 20921 + } + }, + { + "items": [ + 10991.5, + 2.5555 + ], + "hints": { + "index": 20922 + } + }, + { + "items": [ + 10992, + 2.5537 + ], + "hints": { + "index": 20923 + } + }, + { + "items": [ + 10992.5, + 2.6466 + ], + "hints": { + "index": 20924 + } + }, + { + "items": [ + 10993, + 2.637700080871582 + ], + "hints": { + "index": 20925 + } + }, + { + "items": [ + 10993.5, + 2.5948 + ], + "hints": { + "index": 20926 + } + }, + { + "items": [ + 10994, + 2.6119999885559082 + ], + "hints": { + "index": 20927 + } + }, + { + "items": [ + 10994.5, + 2.6364998817443848 + ], + "hints": { + "index": 20928 + } + }, + { + "items": [ + 10995, + 2.6796 + ], + "hints": { + "index": 20929 + } + }, + { + "items": [ + 10995.5, + 2.6645 + ], + "hints": { + "index": 20930 + } + }, + { + "items": [ + 10996, + 2.6888000965118408 + ], + "hints": { + "index": 20931 + } + }, + { + "items": [ + 10996.5, + 2.6758999824523926 + ], + "hints": { + "index": 20932 + } + }, + { + "items": [ + 10997, + 2.6756 + ], + "hints": { + "index": 20933 + } + }, + { + "items": [ + 10997.5, + 2.6497 + ], + "hints": { + "index": 20934 + } + }, + { + "items": [ + 10998, + 2.5677 + ], + "hints": { + "index": 20935 + } + }, + { + "items": [ + 10998.5, + 2.485 + ], + "hints": { + "index": 20936 + } + }, + { + "items": [ + 10999, + 2.5151000022888184 + ], + "hints": { + "index": 20937 + } + }, + { + "items": [ + 10999.5, + 2.6589 + ], + "hints": { + "index": 20938 + } + }, + { + "items": [ + 11000, + 2.8055 + ], + "hints": { + "index": 20939 + } + }, + { + "items": [ + 11000.5, + 2.7511 + ], + "hints": { + "index": 20940 + } + }, + { + "items": [ + 11001, + 2.5948998928070068 + ], + "hints": { + "index": 20941 + } + }, + { + "items": [ + 11001.5, + 2.4784998893737793 + ], + "hints": { + "index": 20942 + } + }, + { + "items": [ + 11002, + 2.538000106811523 + ], + "hints": { + "index": 20943 + } + }, + { + "items": [ + 11002.5, + 2.5744 + ], + "hints": { + "index": 20944 + } + }, + { + "items": [ + 11003, + 2.6122 + ], + "hints": { + "index": 20945 + } + }, + { + "items": [ + 11003.5, + 2.5548 + ], + "hints": { + "index": 20946 + } + }, + { + "items": [ + 11004, + 2.6456000804901123 + ], + "hints": { + "index": 20947 + } + }, + { + "items": [ + 11004.5, + 2.6856999397277832 + ], + "hints": { + "index": 20948 + } + }, + { + "items": [ + 11005, + 2.7402 + ], + "hints": { + "index": 20949 + } + }, + { + "items": [ + 11005.5, + 2.7555999755859375 + ], + "hints": { + "index": 20950 + } + }, + { + "items": [ + 11006, + 2.6721000671386719 + ], + "hints": { + "index": 20951 + } + }, + { + "items": [ + 11006.5, + 2.6528 + ], + "hints": { + "index": 20952 + } + }, + { + "items": [ + 11007, + 2.5594 + ], + "hints": { + "index": 20953 + } + }, + { + "items": [ + 11007.5, + 2.641200065612793 + ], + "hints": { + "index": 20954 + } + }, + { + "items": [ + 11008, + 2.6203000545501709 + ], + "hints": { + "index": 20955 + } + }, + { + "items": [ + 11008.5, + 2.6705 + ], + "hints": { + "index": 20956 + } + }, + { + "items": [ + 11009, + 2.6283 + ], + "hints": { + "index": 20957 + } + }, + { + "items": [ + 11009.5, + 2.6222 + ], + "hints": { + "index": 20958 + } + }, + { + "items": [ + 11010, + 2.7035 + ], + "hints": { + "index": 20959 + } + }, + { + "items": [ + 11010.5, + 2.7527000904083252 + ], + "hints": { + "index": 20960 + } + }, + { + "items": [ + 11011, + 2.82 + ], + "hints": { + "index": 20961 + } + }, + { + "items": [ + 11011.5, + 2.8012 + ], + "hints": { + "index": 20962 + } + }, + { + "items": [ + 11012, + 2.864799976348877 + ], + "hints": { + "index": 20963 + } + }, + { + "items": [ + 11012.5, + 2.9121 + ], + "hints": { + "index": 20964 + } + }, + { + "items": [ + 11013, + 2.8346 + ], + "hints": { + "index": 20965 + } + }, + { + "items": [ + 11013.5, + 2.8255 + ], + "hints": { + "index": 20966 + } + }, + { + "items": [ + 11014, + 2.809999942779541 + ], + "hints": { + "index": 20967 + } + }, + { + "items": [ + 11014.5, + 2.7995 + ], + "hints": { + "index": 20968 + } + }, + { + "items": [ + 11015, + 2.79229998588562 + ], + "hints": { + "index": 20969 + } + }, + { + "items": [ + 11015.5, + 2.7969000339508057 + ], + "hints": { + "index": 20970 + } + }, + { + "items": [ + 11016, + 2.8853 + ], + "hints": { + "index": 20971 + } + }, + { + "items": [ + 11016.5, + 2.8980998992919922 + ], + "hints": { + "index": 20972 + } + }, + { + "items": [ + 11017, + 2.8512 + ], + "hints": { + "index": 20973 + } + }, + { + "items": [ + 11017.5, + 2.8357000350952148 + ], + "hints": { + "index": 20974 + } + }, + { + "items": [ + 11018, + 2.8153998851776123 + ], + "hints": { + "index": 20975 + } + }, + { + "items": [ + 11018.5, + 2.8863 + ], + "hints": { + "index": 20976 + } + }, + { + "items": [ + 11019, + 2.9528 + ], + "hints": { + "index": 20977 + } + }, + { + "items": [ + 11019.5, + 2.974600076675415 + ], + "hints": { + "index": 20978 + } + }, + { + "items": [ + 11020, + 2.9539 + ], + "hints": { + "index": 20979 + } + }, + { + "items": [ + 11020.5, + 2.9637999534606938 + ], + "hints": { + "index": 20980 + } + }, + { + "items": [ + 11021, + 2.9426000118255615 + ], + "hints": { + "index": 20981 + } + }, + { + "items": [ + 11021.5, + 2.9591999053955078 + ], + "hints": { + "index": 20982 + } + }, + { + "items": [ + 11022, + 2.9495999813079834 + ], + "hints": { + "index": 20983 + } + }, + { + "items": [ + 11022.5, + 3.11929988861084 + ], + "hints": { + "index": 20984 + } + }, + { + "items": [ + 11023, + 3.1868 + ], + "hints": { + "index": 20985 + } + }, + { + "items": [ + 11023.5, + 3.0673 + ], + "hints": { + "index": 20986 + } + }, + { + "items": [ + 11024, + 2.8472 + ], + "hints": { + "index": 20987 + } + }, + { + "items": [ + 11024.5, + 2.7322 + ], + "hints": { + "index": 20988 + } + }, + { + "items": [ + 11025, + 2.73799991607666 + ], + "hints": { + "index": 20989 + } + }, + { + "items": [ + 11025.5, + 2.9170999526977539 + ], + "hints": { + "index": 20990 + } + }, + { + "items": [ + 11026, + 2.9342999458312988 + ], + "hints": { + "index": 20991 + } + }, + { + "items": [ + 11026.5, + 2.9495999813079834 + ], + "hints": { + "index": 20992 + } + }, + { + "items": [ + 11027, + 2.700200080871582 + ], + "hints": { + "index": 20993 + } + }, + { + "items": [ + 11027.5, + 2.6122 + ], + "hints": { + "index": 20994 + } + }, + { + "items": [ + 11028, + 2.6259000301361084 + ], + "hints": { + "index": 20995 + } + }, + { + "items": [ + 11028.5, + 2.699199914932251 + ], + "hints": { + "index": 20996 + } + }, + { + "items": [ + 11029, + 2.7959001064300537 + ], + "hints": { + "index": 20997 + } + }, + { + "items": [ + 11029.5, + 2.7528998851776123 + ], + "hints": { + "index": 20998 + } + }, + { + "items": [ + 11030, + 2.6949999332427979 + ], + "hints": { + "index": 20999 + } + }, + { + "items": [ + 11030.5, + 2.6305000782012939 + ], + "hints": { + "index": 21000 + } + }, + { + "items": [ + 11031, + 2.6873 + ], + "hints": { + "index": 21001 + } + }, + { + "items": [ + 11031.5, + 2.7795999050140381 + ], + "hints": { + "index": 21002 + } + }, + { + "items": [ + 11032, + 2.9066 + ], + "hints": { + "index": 21003 + } + }, + { + "items": [ + 11032.5, + 2.779 + ], + "hints": { + "index": 21004 + } + }, + { + "items": [ + 11033, + 2.799299955368042 + ], + "hints": { + "index": 21005 + } + }, + { + "items": [ + 11033.5, + 2.7609999179840088 + ], + "hints": { + "index": 21006 + } + }, + { + "items": [ + 11034, + 2.9416999816894531 + ], + "hints": { + "index": 21007 + } + }, + { + "items": [ + 11034.5, + 2.9086999893188477 + ], + "hints": { + "index": 21008 + } + }, + { + "items": [ + 11035, + 2.9872000217437744 + ], + "hints": { + "index": 21009 + } + }, + { + "items": [ + 11035.5, + 3.0481998920440674 + ], + "hints": { + "index": 21010 + } + }, + { + "items": [ + 11036, + 3.3081998825073242 + ], + "hints": { + "index": 21011 + } + }, + { + "items": [ + 11036.5, + 3.387700080871582 + ], + "hints": { + "index": 21012 + } + }, + { + "items": [ + 11037, + 3.2485001087188721 + ], + "hints": { + "index": 21013 + } + }, + { + "items": [ + 11037.5, + 2.9767000675201416 + ], + "hints": { + "index": 21014 + } + }, + { + "items": [ + 11038, + 2.8380999565124512 + ], + "hints": { + "index": 21015 + } + }, + { + "items": [ + 11038.5, + 3.0643999576568604 + ], + "hints": { + "index": 21016 + } + }, + { + "items": [ + 11039, + 3.3175 + ], + "hints": { + "index": 21017 + } + }, + { + "items": [ + 11039.5, + 3.3653 + ], + "hints": { + "index": 21018 + } + }, + { + "items": [ + 11040, + 3.1565999984741211 + ], + "hints": { + "index": 21019 + } + }, + { + "items": [ + 11040.5, + 2.9900000095367432 + ], + "hints": { + "index": 21020 + } + }, + { + "items": [ + 11041, + 3.0653998851776123 + ], + "hints": { + "index": 21021 + } + }, + { + "items": [ + 11041.5, + 3.1212 + ], + "hints": { + "index": 21022 + } + }, + { + "items": [ + 11042, + 3.1436 + ], + "hints": { + "index": 21023 + } + }, + { + "items": [ + 11042.5, + 2.9523 + ], + "hints": { + "index": 21024 + } + }, + { + "items": [ + 11043, + 2.7986 + ], + "hints": { + "index": 21025 + } + }, + { + "items": [ + 11043.5, + 2.7316 + ], + "hints": { + "index": 21026 + } + }, + { + "items": [ + 11044, + 2.7019 + ], + "hints": { + "index": 21027 + } + }, + { + "items": [ + 11044.5, + 2.7188 + ], + "hints": { + "index": 21028 + } + }, + { + "items": [ + 11045, + 2.6826 + ], + "hints": { + "index": 21029 + } + }, + { + "items": [ + 11045.5, + 2.7268 + ], + "hints": { + "index": 21030 + } + }, + { + "items": [ + 11046, + 2.7169 + ], + "hints": { + "index": 21031 + } + }, + { + "items": [ + 11046.5, + 2.7518 + ], + "hints": { + "index": 21032 + } + }, + { + "items": [ + 11047, + 2.7498 + ], + "hints": { + "index": 21033 + } + }, + { + "items": [ + 11047.5, + 2.8347 + ], + "hints": { + "index": 21034 + } + }, + { + "items": [ + 11048, + 2.8877999782562256 + ], + "hints": { + "index": 21035 + } + }, + { + "items": [ + 11048.5, + 3.188499927520752 + ], + "hints": { + "index": 21036 + } + }, + { + "items": [ + 11049, + 3.1133 + ], + "hints": { + "index": 21037 + } + }, + { + "items": [ + 11049.5, + 2.8749001026153564 + ], + "hints": { + "index": 21038 + } + }, + { + "items": [ + 11050, + 2.653 + ], + "hints": { + "index": 21039 + } + }, + { + "items": [ + 11050.5, + 2.7439 + ], + "hints": { + "index": 21040 + } + }, + { + "items": [ + 11051, + 3.29830002784729 + ], + "hints": { + "index": 21041 + } + }, + { + "items": [ + 11051.5, + 3.3162999153137207 + ], + "hints": { + "index": 21042 + } + }, + { + "items": [ + 11052, + 3.359299898147583 + ], + "hints": { + "index": 21043 + } + }, + { + "items": [ + 11052.5, + 2.8250999450683594 + ], + "hints": { + "index": 21044 + } + }, + { + "items": [ + 11053, + 2.7847 + ], + "hints": { + "index": 21045 + } + }, + { + "items": [ + 11053.5, + 2.6431999206542969 + ], + "hints": { + "index": 21046 + } + }, + { + "items": [ + 11054, + 2.7202999591827393 + ], + "hints": { + "index": 21047 + } + }, + { + "items": [ + 11054.5, + 2.8532 + ], + "hints": { + "index": 21048 + } + }, + { + "items": [ + 11055, + 3.1152 + ], + "hints": { + "index": 21049 + } + }, + { + "items": [ + 11055.5, + 3.2737 + ], + "hints": { + "index": 21050 + } + }, + { + "items": [ + 11056, + 3.2679 + ], + "hints": { + "index": 21051 + } + }, + { + "items": [ + 11056.5, + 3.3229 + ], + "hints": { + "index": 21052 + } + }, + { + "items": [ + 11057, + 3.4758 + ], + "hints": { + "index": 21053 + } + }, + { + "items": [ + 11057.5, + 3.6328999996185303 + ], + "hints": { + "index": 21054 + } + }, + { + "items": [ + 11058, + 3.4161 + ], + "hints": { + "index": 21055 + } + }, + { + "items": [ + 11058.5, + 3.1764 + ], + "hints": { + "index": 21056 + } + }, + { + "items": [ + 11059, + 3.3392999172210693 + ], + "hints": { + "index": 21057 + } + }, + { + "items": [ + 11059.5, + 3.5254 + ], + "hints": { + "index": 21058 + } + }, + { + "items": [ + 11060, + 3.4918 + ], + "hints": { + "index": 21059 + } + }, + { + "items": [ + 11060.5, + 3.0203 + ], + "hints": { + "index": 21060 + } + }, + { + "items": [ + 11061, + 2.9496 + ], + "hints": { + "index": 21061 + } + }, + { + "items": [ + 11061.5, + 3.2005 + ], + "hints": { + "index": 21062 + } + }, + { + "items": [ + 11062, + 3.3792 + ], + "hints": { + "index": 21063 + } + }, + { + "items": [ + 11062.5, + 3.2434999942779541 + ], + "hints": { + "index": 21064 + } + }, + { + "items": [ + 11063, + 2.9038999080657959 + ], + "hints": { + "index": 21065 + } + }, + { + "items": [ + 11063.5, + 2.9753 + ], + "hints": { + "index": 21066 + } + }, + { + "items": [ + 11064, + 3.0547 + ], + "hints": { + "index": 21067 + } + }, + { + "items": [ + 11064.5, + 3.0982999801635742 + ], + "hints": { + "index": 21068 + } + }, + { + "items": [ + 11065, + 3.2806 + ], + "hints": { + "index": 21069 + } + }, + { + "items": [ + 11065.5, + 3.5364 + ], + "hints": { + "index": 21070 + } + }, + { + "items": [ + 11066, + 3.9195 + ], + "hints": { + "index": 21071 + } + }, + { + "items": [ + 11066.5, + 3.7301 + ], + "hints": { + "index": 21072 + } + }, + { + "items": [ + 11067, + 3.4316 + ], + "hints": { + "index": 21073 + } + }, + { + "items": [ + 11067.5, + 3.2486 + ], + "hints": { + "index": 21074 + } + }, + { + "items": [ + 11068, + 3.3279 + ], + "hints": { + "index": 21075 + } + }, + { + "items": [ + 11068.5, + 3.5432000160217285 + ], + "hints": { + "index": 21076 + } + }, + { + "items": [ + 11069, + 3.7788999080657959 + ], + "hints": { + "index": 21077 + } + }, + { + "items": [ + 11069.5, + 3.5127999782562256 + ], + "hints": { + "index": 21078 + } + }, + { + "items": [ + 11070, + 3.2875 + ], + "hints": { + "index": 21079 + } + }, + { + "items": [ + 11070.5, + 3.1189000606536865 + ], + "hints": { + "index": 21080 + } + }, + { + "items": [ + 11071, + 3.216900110244751 + ], + "hints": { + "index": 21081 + } + }, + { + "items": [ + 11071.5, + 3.3015999794006348 + ], + "hints": { + "index": 21082 + } + }, + { + "items": [ + 11072, + 3.3132998943328857 + ], + "hints": { + "index": 21083 + } + }, + { + "items": [ + 11072.5, + 3.1317999362945557 + ], + "hints": { + "index": 21084 + } + }, + { + "items": [ + 11073, + 3.0016999244689941 + ], + "hints": { + "index": 21085 + } + }, + { + "items": [ + 11073.5, + 2.9231998920440674 + ], + "hints": { + "index": 21086 + } + }, + { + "items": [ + 11074, + 3.0062000751495361 + ], + "hints": { + "index": 21087 + } + }, + { + "items": [ + 11074.5, + 2.9553999900817871 + ], + "hints": { + "index": 21088 + } + }, + { + "items": [ + 11075, + 2.8652999401092529 + ], + "hints": { + "index": 21089 + } + }, + { + "items": [ + 11075.5, + 2.811500072479248 + ], + "hints": { + "index": 21090 + } + }, + { + "items": [ + 11076, + 2.9463999271392822 + ], + "hints": { + "index": 21091 + } + }, + { + "items": [ + 11076.5, + 3.0829999446868896 + ], + "hints": { + "index": 21092 + } + }, + { + "items": [ + 11077, + 3.2381000518798828 + ], + "hints": { + "index": 21093 + } + }, + { + "items": [ + 11077.5, + 3.1208000183105469 + ], + "hints": { + "index": 21094 + } + }, + { + "items": [ + 11078, + 3.07069993019104 + ], + "hints": { + "index": 21095 + } + }, + { + "items": [ + 11078.5, + 3.0882 + ], + "hints": { + "index": 21096 + } + }, + { + "items": [ + 11079, + 3.1774 + ], + "hints": { + "index": 21097 + } + }, + { + "items": [ + 11079.5, + 3.2555 + ], + "hints": { + "index": 21098 + } + }, + { + "items": [ + 11080, + 3.0408 + ], + "hints": { + "index": 21099 + } + }, + { + "items": [ + 11080.5, + 2.9587 + ], + "hints": { + "index": 21100 + } + }, + { + "items": [ + 11081, + 3.0134 + ], + "hints": { + "index": 21101 + } + }, + { + "items": [ + 11081.5, + 3.2055 + ], + "hints": { + "index": 21102 + } + }, + { + "items": [ + 11082, + 3.1297 + ], + "hints": { + "index": 21103 + } + }, + { + "items": [ + 11082.5, + 2.9766 + ], + "hints": { + "index": 21104 + } + }, + { + "items": [ + 11083, + 2.9937 + ], + "hints": { + "index": 21105 + } + }, + { + "items": [ + 11083.5, + 3.1775000095367432 + ], + "hints": { + "index": 21106 + } + }, + { + "items": [ + 11084, + 3.1757 + ], + "hints": { + "index": 21107 + } + }, + { + "items": [ + 11084.5, + 2.9989 + ], + "hints": { + "index": 21108 + } + }, + { + "items": [ + 11085, + 2.8617 + ], + "hints": { + "index": 21109 + } + }, + { + "items": [ + 11085.5, + 2.8959999084472656 + ], + "hints": { + "index": 21110 + } + }, + { + "items": [ + 11086, + 2.873 + ], + "hints": { + "index": 21111 + } + }, + { + "items": [ + 11086.5, + 2.941 + ], + "hints": { + "index": 21112 + } + }, + { + "items": [ + 11087, + 2.8349 + ], + "hints": { + "index": 21113 + } + }, + { + "items": [ + 11087.5, + 2.7874000072479248 + ], + "hints": { + "index": 21114 + } + }, + { + "items": [ + 11088, + 2.7596 + ], + "hints": { + "index": 21115 + } + }, + { + "items": [ + 11088.5, + 2.859 + ], + "hints": { + "index": 21116 + } + }, + { + "items": [ + 11089, + 2.9564 + ], + "hints": { + "index": 21117 + } + }, + { + "items": [ + 11089.5, + 2.9556000232696533 + ], + "hints": { + "index": 21118 + } + }, + { + "items": [ + 11090, + 2.6939 + ], + "hints": { + "index": 21119 + } + }, + { + "items": [ + 11090.5, + 2.7192 + ], + "hints": { + "index": 21120 + } + }, + { + "items": [ + 11091, + 2.7242000102996826 + ], + "hints": { + "index": 21121 + } + }, + { + "items": [ + 11091.5, + 2.8949 + ], + "hints": { + "index": 21122 + } + }, + { + "items": [ + 11092, + 2.7814 + ], + "hints": { + "index": 21123 + } + }, + { + "items": [ + 11092.5, + 2.6277 + ], + "hints": { + "index": 21124 + } + }, + { + "items": [ + 11093, + 2.5798 + ], + "hints": { + "index": 21125 + } + }, + { + "items": [ + 11093.5, + 2.6410999298095703 + ], + "hints": { + "index": 21126 + } + }, + { + "items": [ + 11094, + 2.8425 + ], + "hints": { + "index": 21127 + } + }, + { + "items": [ + 11094.5, + 2.9535 + ], + "hints": { + "index": 21128 + } + }, + { + "items": [ + 11095, + 2.9026999473571777 + ], + "hints": { + "index": 21129 + } + }, + { + "items": [ + 11095.5, + 2.734699964523315 + ], + "hints": { + "index": 21130 + } + }, + { + "items": [ + 11096, + 2.6541 + ], + "hints": { + "index": 21131 + } + }, + { + "items": [ + 11096.5, + 2.6133 + ], + "hints": { + "index": 21132 + } + }, + { + "items": [ + 11097, + 2.6445 + ], + "hints": { + "index": 21133 + } + }, + { + "items": [ + 11097.5, + 2.6068000793457031 + ], + "hints": { + "index": 21134 + } + }, + { + "items": [ + 11098, + 2.6285 + ], + "hints": { + "index": 21135 + } + }, + { + "items": [ + 11098.5, + 2.6072 + ], + "hints": { + "index": 21136 + } + }, + { + "items": [ + 11099, + 2.5674 + ], + "hints": { + "index": 21137 + } + }, + { + "items": [ + 11099.5, + 2.5590999126434326 + ], + "hints": { + "index": 21138 + } + }, + { + "items": [ + 11100, + 2.595 + ], + "hints": { + "index": 21139 + } + }, + { + "items": [ + 11100.5, + 2.7318 + ], + "hints": { + "index": 21140 + } + }, + { + "items": [ + 11101, + 2.7743000984191895 + ], + "hints": { + "index": 21141 + } + }, + { + "items": [ + 11101.5, + 2.7882 + ], + "hints": { + "index": 21142 + } + }, + { + "items": [ + 11102, + 2.6565 + ], + "hints": { + "index": 21143 + } + }, + { + "items": [ + 11102.5, + 2.6556999683380127 + ], + "hints": { + "index": 21144 + } + }, + { + "items": [ + 11103, + 2.6508998870849609 + ], + "hints": { + "index": 21145 + } + }, + { + "items": [ + 11103.5, + 2.831 + ], + "hints": { + "index": 21146 + } + }, + { + "items": [ + 11104, + 2.9096000194549561 + ], + "hints": { + "index": 21147 + } + }, + { + "items": [ + 11104.5, + 2.9286999702453613 + ], + "hints": { + "index": 21148 + } + }, + { + "items": [ + 11105, + 2.7888998985290527 + ], + "hints": { + "index": 21149 + } + }, + { + "items": [ + 11105.5, + 2.6968998908996582 + ], + "hints": { + "index": 21150 + } + }, + { + "items": [ + 11106, + 2.662600040435791 + ], + "hints": { + "index": 21151 + } + }, + { + "items": [ + 11106.5, + 2.7164 + ], + "hints": { + "index": 21152 + } + }, + { + "items": [ + 11107, + 2.6542000770568848 + ], + "hints": { + "index": 21153 + } + }, + { + "items": [ + 11107.5, + 2.7809000015258789 + ], + "hints": { + "index": 21154 + } + }, + { + "items": [ + 11108, + 2.7197 + ], + "hints": { + "index": 21155 + } + }, + { + "items": [ + 11108.5, + 2.7418 + ], + "hints": { + "index": 21156 + } + }, + { + "items": [ + 11109, + 2.6134 + ], + "hints": { + "index": 21157 + } + }, + { + "items": [ + 11109.5, + 2.5933 + ], + "hints": { + "index": 21158 + } + }, + { + "items": [ + 11110, + 2.5963 + ], + "hints": { + "index": 21159 + } + }, + { + "items": [ + 11110.5, + 2.66540002822876 + ], + "hints": { + "index": 21160 + } + }, + { + "items": [ + 11111, + 2.7362000942230225 + ], + "hints": { + "index": 21161 + } + }, + { + "items": [ + 11111.5, + 2.8229 + ], + "hints": { + "index": 21162 + } + }, + { + "items": [ + 11112, + 2.7651998996734619 + ], + "hints": { + "index": 21163 + } + }, + { + "items": [ + 11112.5, + 2.70959997177124 + ], + "hints": { + "index": 21164 + } + }, + { + "items": [ + 11113, + 2.6582000255584717 + ], + "hints": { + "index": 21165 + } + }, + { + "items": [ + 11113.5, + 2.7411 + ], + "hints": { + "index": 21166 + } + }, + { + "items": [ + 11114, + 2.7936000823974609 + ], + "hints": { + "index": 21167 + } + }, + { + "items": [ + 11114.5, + 2.7662999629974365 + ], + "hints": { + "index": 21168 + } + }, + { + "items": [ + 11115, + 2.6222000122070313 + ], + "hints": { + "index": 21169 + } + }, + { + "items": [ + 11115.5, + 2.6068000793457031 + ], + "hints": { + "index": 21170 + } + }, + { + "items": [ + 11116, + 2.5982 + ], + "hints": { + "index": 21171 + } + }, + { + "items": [ + 11116.5, + 2.6380999088287354 + ], + "hints": { + "index": 21172 + } + }, + { + "items": [ + 11117, + 2.5882000923156734 + ], + "hints": { + "index": 21173 + } + }, + { + "items": [ + 11117.5, + 2.4909000396728516 + ], + "hints": { + "index": 21174 + } + }, + { + "items": [ + 11118, + 2.4414000511169434 + ], + "hints": { + "index": 21175 + } + }, + { + "items": [ + 11118.5, + 2.4358999729156494 + ], + "hints": { + "index": 21176 + } + }, + { + "items": [ + 11119, + 2.5736 + ], + "hints": { + "index": 21177 + } + }, + { + "items": [ + 11119.5, + 2.6626 + ], + "hints": { + "index": 21178 + } + }, + { + "items": [ + 11120, + 2.7334 + ], + "hints": { + "index": 21179 + } + }, + { + "items": [ + 11120.5, + 2.7269 + ], + "hints": { + "index": 21180 + } + }, + { + "items": [ + 11121, + 2.7838 + ], + "hints": { + "index": 21181 + } + }, + { + "items": [ + 11121.5, + 2.848 + ], + "hints": { + "index": 21182 + } + }, + { + "items": [ + 11122, + 2.7545 + ], + "hints": { + "index": 21183 + } + }, + { + "items": [ + 11122.5, + 2.7267 + ], + "hints": { + "index": 21184 + } + }, + { + "items": [ + 11123, + 2.7099 + ], + "hints": { + "index": 21185 + } + }, + { + "items": [ + 11123.5, + 2.8166000843048096 + ], + "hints": { + "index": 21186 + } + }, + { + "items": [ + 11124, + 2.72379994392395 + ], + "hints": { + "index": 21187 + } + }, + { + "items": [ + 11124.5, + 2.601099967956543 + ], + "hints": { + "index": 21188 + } + }, + { + "items": [ + 11125, + 2.6340000629425049 + ], + "hints": { + "index": 21189 + } + }, + { + "items": [ + 11125.5, + 2.6930999755859375 + ], + "hints": { + "index": 21190 + } + }, + { + "items": [ + 11126, + 2.7302000522613525 + ], + "hints": { + "index": 21191 + } + }, + { + "items": [ + 11126.5, + 2.5673 + ], + "hints": { + "index": 21192 + } + }, + { + "items": [ + 11127, + 2.54259991645813 + ], + "hints": { + "index": 21193 + } + }, + { + "items": [ + 11127.5, + 2.6236999034881592 + ], + "hints": { + "index": 21194 + } + }, + { + "items": [ + 11128, + 2.7762999534606938 + ], + "hints": { + "index": 21195 + } + }, + { + "items": [ + 11128.5, + 2.9275 + ], + "hints": { + "index": 21196 + } + }, + { + "items": [ + 11129, + 2.837399959564209 + ], + "hints": { + "index": 21197 + } + }, + { + "items": [ + 11129.5, + 2.7578001022338867 + ], + "hints": { + "index": 21198 + } + }, + { + "items": [ + 11130, + 2.7209000587463379 + ], + "hints": { + "index": 21199 + } + }, + { + "items": [ + 11130.5, + 2.7785000801086426 + ], + "hints": { + "index": 21200 + } + }, + { + "items": [ + 11131, + 2.7978000640869141 + ], + "hints": { + "index": 21201 + } + }, + { + "items": [ + 11131.5, + 2.7083001136779785 + ], + "hints": { + "index": 21202 + } + }, + { + "items": [ + 11132, + 2.6867001056671143 + ], + "hints": { + "index": 21203 + } + }, + { + "items": [ + 11132.5, + 2.6741 + ], + "hints": { + "index": 21204 + } + }, + { + "items": [ + 11133, + 2.7797 + ], + "hints": { + "index": 21205 + } + }, + { + "items": [ + 11133.5, + 2.907 + ], + "hints": { + "index": 21206 + } + }, + { + "items": [ + 11134, + 2.9885 + ], + "hints": { + "index": 21207 + } + }, + { + "items": [ + 11134.5, + 2.8914 + ], + "hints": { + "index": 21208 + } + }, + { + "items": [ + 11135, + 2.7272 + ], + "hints": { + "index": 21209 + } + }, + { + "items": [ + 11135.5, + 2.697700023651123 + ], + "hints": { + "index": 21210 + } + }, + { + "items": [ + 11136, + 2.7822000980377197 + ], + "hints": { + "index": 21211 + } + }, + { + "items": [ + 11136.5, + 2.854700088500977 + ], + "hints": { + "index": 21212 + } + }, + { + "items": [ + 11137, + 2.9388000965118408 + ], + "hints": { + "index": 21213 + } + }, + { + "items": [ + 11137.5, + 2.9934999942779541 + ], + "hints": { + "index": 21214 + } + }, + { + "items": [ + 11138, + 2.913599967956543 + ], + "hints": { + "index": 21215 + } + }, + { + "items": [ + 11138.5, + 2.9077000617980957 + ], + "hints": { + "index": 21216 + } + }, + { + "items": [ + 11139, + 2.8399999141693115 + ], + "hints": { + "index": 21217 + } + }, + { + "items": [ + 11139.5, + 2.8675999641418457 + ], + "hints": { + "index": 21218 + } + }, + { + "items": [ + 11140, + 2.7760000228881836 + ], + "hints": { + "index": 21219 + } + }, + { + "items": [ + 11140.5, + 2.7638 + ], + "hints": { + "index": 21220 + } + }, + { + "items": [ + 11141, + 2.8417 + ], + "hints": { + "index": 21221 + } + }, + { + "items": [ + 11141.5, + 2.898 + ], + "hints": { + "index": 21222 + } + }, + { + "items": [ + 11142, + 2.816 + ], + "hints": { + "index": 21223 + } + }, + { + "items": [ + 11142.5, + 2.8168 + ], + "hints": { + "index": 21224 + } + }, + { + "items": [ + 11143, + 2.834 + ], + "hints": { + "index": 21225 + } + }, + { + "items": [ + 11143.5, + 2.8838 + ], + "hints": { + "index": 21226 + } + }, + { + "items": [ + 11144, + 2.7542 + ], + "hints": { + "index": 21227 + } + }, + { + "items": [ + 11144.5, + 2.6641 + ], + "hints": { + "index": 21228 + } + }, + { + "items": [ + 11145, + 2.7261 + ], + "hints": { + "index": 21229 + } + }, + { + "items": [ + 11145.5, + 2.7823 + ], + "hints": { + "index": 21230 + } + }, + { + "items": [ + 11146, + 2.756 + ], + "hints": { + "index": 21231 + } + }, + { + "items": [ + 11146.5, + 2.8063 + ], + "hints": { + "index": 21232 + } + }, + { + "items": [ + 11147, + 2.7925 + ], + "hints": { + "index": 21233 + } + }, + { + "items": [ + 11147.5, + 2.8273 + ], + "hints": { + "index": 21234 + } + }, + { + "items": [ + 11148, + 2.7476 + ], + "hints": { + "index": 21235 + } + }, + { + "items": [ + 11148.5, + 2.8005 + ], + "hints": { + "index": 21236 + } + }, + { + "items": [ + 11149, + 2.868 + ], + "hints": { + "index": 21237 + } + }, + { + "items": [ + 11149.5, + 2.8158 + ], + "hints": { + "index": 21238 + } + }, + { + "items": [ + 11150, + 2.7732 + ], + "hints": { + "index": 21239 + } + }, + { + "items": [ + 11150.5, + 2.7585000991821289 + ], + "hints": { + "index": 21240 + } + }, + { + "items": [ + 11151, + 2.736299991607666 + ], + "hints": { + "index": 21241 + } + }, + { + "items": [ + 11151.5, + 2.7906999588012695 + ], + "hints": { + "index": 21242 + } + }, + { + "items": [ + 11152, + 2.848099946975708 + ], + "hints": { + "index": 21243 + } + }, + { + "items": [ + 11152.5, + 2.8921000957489018 + ], + "hints": { + "index": 21244 + } + }, + { + "items": [ + 11153, + 2.7572000026702881 + ], + "hints": { + "index": 21245 + } + }, + { + "items": [ + 11153.5, + 2.601099967956543 + ], + "hints": { + "index": 21246 + } + }, + { + "items": [ + 11154, + 2.6085999011993408 + ], + "hints": { + "index": 21247 + } + }, + { + "items": [ + 11154.5, + 2.728 + ], + "hints": { + "index": 21248 + } + }, + { + "items": [ + 11155, + 2.8341 + ], + "hints": { + "index": 21249 + } + }, + { + "items": [ + 11155.5, + 2.8777000904083252 + ], + "hints": { + "index": 21250 + } + }, + { + "items": [ + 11156, + 2.8331 + ], + "hints": { + "index": 21251 + } + }, + { + "items": [ + 11156.5, + 2.9166998863220215 + ], + "hints": { + "index": 21252 + } + }, + { + "items": [ + 11157, + 3.0359001159667969 + ], + "hints": { + "index": 21253 + } + }, + { + "items": [ + 11157.5, + 3.0843 + ], + "hints": { + "index": 21254 + } + }, + { + "items": [ + 11158, + 3.0055 + ], + "hints": { + "index": 21255 + } + }, + { + "items": [ + 11158.5, + 2.808 + ], + "hints": { + "index": 21256 + } + }, + { + "items": [ + 11159, + 2.7501 + ], + "hints": { + "index": 21257 + } + }, + { + "items": [ + 11159.5, + 2.8175 + ], + "hints": { + "index": 21258 + } + }, + { + "items": [ + 11160, + 2.9145 + ], + "hints": { + "index": 21259 + } + }, + { + "items": [ + 11160.5, + 2.9921 + ], + "hints": { + "index": 21260 + } + }, + { + "items": [ + 11161, + 2.8631 + ], + "hints": { + "index": 21261 + } + }, + { + "items": [ + 11161.5, + 2.8395 + ], + "hints": { + "index": 21262 + } + }, + { + "items": [ + 11162, + 2.73799991607666 + ], + "hints": { + "index": 21263 + } + }, + { + "items": [ + 11162.5, + 2.8096001148223877 + ], + "hints": { + "index": 21264 + } + }, + { + "items": [ + 11163, + 2.7321999073028564 + ], + "hints": { + "index": 21265 + } + }, + { + "items": [ + 11163.5, + 2.6843 + ], + "hints": { + "index": 21266 + } + }, + { + "items": [ + 11164, + 2.6598 + ], + "hints": { + "index": 21267 + } + }, + { + "items": [ + 11164.5, + 2.6335000991821289 + ], + "hints": { + "index": 21268 + } + }, + { + "items": [ + 11165, + 2.7313001155853271 + ], + "hints": { + "index": 21269 + } + }, + { + "items": [ + 11165.5, + 2.6366000175476074 + ], + "hints": { + "index": 21270 + } + }, + { + "items": [ + 11166, + 2.619999885559082 + ], + "hints": { + "index": 21271 + } + }, + { + "items": [ + 11166.5, + 2.5473001003265381 + ], + "hints": { + "index": 21272 + } + }, + { + "items": [ + 11167, + 2.6821999549865723 + ], + "hints": { + "index": 21273 + } + }, + { + "items": [ + 11167.5, + 2.7109999656677246 + ], + "hints": { + "index": 21274 + } + }, + { + "items": [ + 11168, + 2.7435 + ], + "hints": { + "index": 21275 + } + }, + { + "items": [ + 11168.5, + 2.6617999076843266 + ], + "hints": { + "index": 21276 + } + }, + { + "items": [ + 11169, + 2.6423 + ], + "hints": { + "index": 21277 + } + }, + { + "items": [ + 11169.5, + 2.6855 + ], + "hints": { + "index": 21278 + } + }, + { + "items": [ + 11170, + 2.6604 + ], + "hints": { + "index": 21279 + } + }, + { + "items": [ + 11170.5, + 2.6133 + ], + "hints": { + "index": 21280 + } + }, + { + "items": [ + 11171, + 2.5531 + ], + "hints": { + "index": 21281 + } + }, + { + "items": [ + 11171.5, + 2.5574 + ], + "hints": { + "index": 21282 + } + }, + { + "items": [ + 11172, + 2.6696999073028564 + ], + "hints": { + "index": 21283 + } + }, + { + "items": [ + 11172.5, + 2.6825 + ], + "hints": { + "index": 21284 + } + }, + { + "items": [ + 11173, + 2.6561999320983887 + ], + "hints": { + "index": 21285 + } + }, + { + "items": [ + 11173.5, + 2.5382 + ], + "hints": { + "index": 21286 + } + }, + { + "items": [ + 11174, + 2.5344998836517334 + ], + "hints": { + "index": 21287 + } + }, + { + "items": [ + 11174.5, + 2.5778 + ], + "hints": { + "index": 21288 + } + }, + { + "items": [ + 11175, + 2.6122 + ], + "hints": { + "index": 21289 + } + }, + { + "items": [ + 11175.5, + 2.6609 + ], + "hints": { + "index": 21290 + } + }, + { + "items": [ + 11176, + 2.6604 + ], + "hints": { + "index": 21291 + } + }, + { + "items": [ + 11176.5, + 2.6933999061584473 + ], + "hints": { + "index": 21292 + } + }, + { + "items": [ + 11177, + 2.7497000694274902 + ], + "hints": { + "index": 21293 + } + }, + { + "items": [ + 11177.5, + 2.7548999786376953 + ], + "hints": { + "index": 21294 + } + }, + { + "items": [ + 11178, + 2.7929999828338623 + ], + "hints": { + "index": 21295 + } + }, + { + "items": [ + 11178.5, + 2.7047 + ], + "hints": { + "index": 21296 + } + }, + { + "items": [ + 11179, + 2.6832 + ], + "hints": { + "index": 21297 + } + }, + { + "items": [ + 11179.5, + 2.7427 + ], + "hints": { + "index": 21298 + } + }, + { + "items": [ + 11180, + 2.856 + ], + "hints": { + "index": 21299 + } + }, + { + "items": [ + 11180.5, + 2.9393999576568604 + ], + "hints": { + "index": 21300 + } + }, + { + "items": [ + 11181, + 2.8926999568939209 + ], + "hints": { + "index": 21301 + } + }, + { + "items": [ + 11181.5, + 2.8544 + ], + "hints": { + "index": 21302 + } + }, + { + "items": [ + 11182, + 2.9637999534606938 + ], + "hints": { + "index": 21303 + } + }, + { + "items": [ + 11182.5, + 3.0818 + ], + "hints": { + "index": 21304 + } + }, + { + "items": [ + 11183, + 3.0886 + ], + "hints": { + "index": 21305 + } + }, + { + "items": [ + 11183.5, + 2.948 + ], + "hints": { + "index": 21306 + } + }, + { + "items": [ + 11184, + 2.8921999931335449 + ], + "hints": { + "index": 21307 + } + }, + { + "items": [ + 11184.5, + 2.9343 + ], + "hints": { + "index": 21308 + } + }, + { + "items": [ + 11185, + 3.0737 + ], + "hints": { + "index": 21309 + } + }, + { + "items": [ + 11185.5, + 3.0278999805450439 + ], + "hints": { + "index": 21310 + } + }, + { + "items": [ + 11186, + 2.9026 + ], + "hints": { + "index": 21311 + } + }, + { + "items": [ + 11186.5, + 2.8361 + ], + "hints": { + "index": 21312 + } + }, + { + "items": [ + 11187, + 2.821 + ], + "hints": { + "index": 21313 + } + }, + { + "items": [ + 11187.5, + 2.8441998958587646 + ], + "hints": { + "index": 21314 + } + }, + { + "items": [ + 11188, + 2.7876 + ], + "hints": { + "index": 21315 + } + }, + { + "items": [ + 11188.5, + 2.8556 + ], + "hints": { + "index": 21316 + } + }, + { + "items": [ + 11189, + 2.8678998947143555 + ], + "hints": { + "index": 21317 + } + }, + { + "items": [ + 11189.5, + 3.0495 + ], + "hints": { + "index": 21318 + } + }, + { + "items": [ + 11190, + 3.1212 + ], + "hints": { + "index": 21319 + } + }, + { + "items": [ + 11190.5, + 3.1953 + ], + "hints": { + "index": 21320 + } + }, + { + "items": [ + 11191, + 3.2239 + ], + "hints": { + "index": 21321 + } + }, + { + "items": [ + 11191.5, + 3.211999893188477 + ], + "hints": { + "index": 21322 + } + }, + { + "items": [ + 11192, + 3.2551999092102051 + ], + "hints": { + "index": 21323 + } + }, + { + "items": [ + 11192.5, + 2.988899946212769 + ], + "hints": { + "index": 21324 + } + }, + { + "items": [ + 11193, + 2.8643 + ], + "hints": { + "index": 21325 + } + }, + { + "items": [ + 11193.5, + 2.7499 + ], + "hints": { + "index": 21326 + } + }, + { + "items": [ + 11194, + 2.7138 + ], + "hints": { + "index": 21327 + } + }, + { + "items": [ + 11194.5, + 2.6947 + ], + "hints": { + "index": 21328 + } + }, + { + "items": [ + 11195, + 2.7023000717163086 + ], + "hints": { + "index": 21329 + } + }, + { + "items": [ + 11195.5, + 2.7778999805450439 + ], + "hints": { + "index": 21330 + } + }, + { + "items": [ + 11196, + 2.7661 + ], + "hints": { + "index": 21331 + } + }, + { + "items": [ + 11196.5, + 2.7811999320983887 + ], + "hints": { + "index": 21332 + } + }, + { + "items": [ + 11197, + 2.7086000442504883 + ], + "hints": { + "index": 21333 + } + }, + { + "items": [ + 11197.5, + 2.5875 + ], + "hints": { + "index": 21334 + } + }, + { + "items": [ + 11198, + 2.5472 + ], + "hints": { + "index": 21335 + } + }, + { + "items": [ + 11198.5, + 2.515 + ], + "hints": { + "index": 21336 + } + }, + { + "items": [ + 11199, + 2.6256 + ], + "hints": { + "index": 21337 + } + }, + { + "items": [ + 11199.5, + 2.5882999897003174 + ], + "hints": { + "index": 21338 + } + }, + { + "items": [ + 11200, + 2.6045999526977539 + ], + "hints": { + "index": 21339 + } + }, + { + "items": [ + 11200.5, + 2.6264998912811279 + ], + "hints": { + "index": 21340 + } + }, + { + "items": [ + 11201, + 2.6375000476837158 + ], + "hints": { + "index": 21341 + } + }, + { + "items": [ + 11201.5, + 2.6180999279022217 + ], + "hints": { + "index": 21342 + } + }, + { + "items": [ + 11202, + 2.568 + ], + "hints": { + "index": 21343 + } + }, + { + "items": [ + 11202.5, + 2.5710000991821289 + ], + "hints": { + "index": 21344 + } + }, + { + "items": [ + 11203, + 2.6296000480651855 + ], + "hints": { + "index": 21345 + } + }, + { + "items": [ + 11203.5, + 2.6401998996734619 + ], + "hints": { + "index": 21346 + } + }, + { + "items": [ + 11204, + 2.5964000225067139 + ], + "hints": { + "index": 21347 + } + }, + { + "items": [ + 11204.5, + 2.601099967956543 + ], + "hints": { + "index": 21348 + } + }, + { + "items": [ + 11205, + 2.661099910736084 + ], + "hints": { + "index": 21349 + } + }, + { + "items": [ + 11205.5, + 2.787600040435791 + ], + "hints": { + "index": 21350 + } + }, + { + "items": [ + 11206, + 2.7618999481201172 + ], + "hints": { + "index": 21351 + } + }, + { + "items": [ + 11206.5, + 2.6914000511169434 + ], + "hints": { + "index": 21352 + } + }, + { + "items": [ + 11207, + 2.6516 + ], + "hints": { + "index": 21353 + } + }, + { + "items": [ + 11207.5, + 2.7012999057769775 + ], + "hints": { + "index": 21354 + } + }, + { + "items": [ + 11208, + 2.7883999347686768 + ], + "hints": { + "index": 21355 + } + }, + { + "items": [ + 11208.5, + 2.7871 + ], + "hints": { + "index": 21356 + } + }, + { + "items": [ + 11209, + 2.7429 + ], + "hints": { + "index": 21357 + } + }, + { + "items": [ + 11209.5, + 2.6809 + ], + "hints": { + "index": 21358 + } + }, + { + "items": [ + 11210, + 2.6832 + ], + "hints": { + "index": 21359 + } + }, + { + "items": [ + 11210.5, + 2.5992999076843266 + ], + "hints": { + "index": 21360 + } + }, + { + "items": [ + 11211, + 2.5538 + ], + "hints": { + "index": 21361 + } + }, + { + "items": [ + 11211.5, + 2.5132 + ], + "hints": { + "index": 21362 + } + }, + { + "items": [ + 11212, + 2.5308 + ], + "hints": { + "index": 21363 + } + }, + { + "items": [ + 11212.5, + 2.5643 + ], + "hints": { + "index": 21364 + } + }, + { + "items": [ + 11213, + 2.61929988861084 + ], + "hints": { + "index": 21365 + } + }, + { + "items": [ + 11213.5, + 2.7251999378204346 + ], + "hints": { + "index": 21366 + } + }, + { + "items": [ + 11214, + 2.7307 + ], + "hints": { + "index": 21367 + } + }, + { + "items": [ + 11214.5, + 2.6166999340057373 + ], + "hints": { + "index": 21368 + } + }, + { + "items": [ + 11215, + 2.6335000991821289 + ], + "hints": { + "index": 21369 + } + }, + { + "items": [ + 11215.5, + 2.6698999404907227 + ], + "hints": { + "index": 21370 + } + }, + { + "items": [ + 11216, + 2.818 + ], + "hints": { + "index": 21371 + } + }, + { + "items": [ + 11216.5, + 2.7479000091552734 + ], + "hints": { + "index": 21372 + } + }, + { + "items": [ + 11217, + 2.6699 + ], + "hints": { + "index": 21373 + } + }, + { + "items": [ + 11217.5, + 2.601 + ], + "hints": { + "index": 21374 + } + }, + { + "items": [ + 11218, + 2.6634 + ], + "hints": { + "index": 21375 + } + }, + { + "items": [ + 11218.5, + 2.7619 + ], + "hints": { + "index": 21376 + } + }, + { + "items": [ + 11219, + 2.7302 + ], + "hints": { + "index": 21377 + } + }, + { + "items": [ + 11219.5, + 2.6082000732421875 + ], + "hints": { + "index": 21378 + } + }, + { + "items": [ + 11220, + 2.5254 + ], + "hints": { + "index": 21379 + } + }, + { + "items": [ + 11220.5, + 2.53410005569458 + ], + "hints": { + "index": 21380 + } + }, + { + "items": [ + 11221, + 2.6033 + ], + "hints": { + "index": 21381 + } + }, + { + "items": [ + 11221.5, + 2.5578999519348145 + ], + "hints": { + "index": 21382 + } + }, + { + "items": [ + 11222, + 2.5923 + ], + "hints": { + "index": 21383 + } + }, + { + "items": [ + 11222.5, + 2.5766 + ], + "hints": { + "index": 21384 + } + }, + { + "items": [ + 11223, + 2.7327 + ], + "hints": { + "index": 21385 + } + }, + { + "items": [ + 11223.5, + 2.7046999931335449 + ], + "hints": { + "index": 21386 + } + }, + { + "items": [ + 11224, + 2.7065999507904053 + ], + "hints": { + "index": 21387 + } + }, + { + "items": [ + 11224.5, + 2.6081 + ], + "hints": { + "index": 21388 + } + }, + { + "items": [ + 11225, + 2.7005999088287354 + ], + "hints": { + "index": 21389 + } + }, + { + "items": [ + 11225.5, + 2.7679 + ], + "hints": { + "index": 21390 + } + }, + { + "items": [ + 11226, + 2.7965 + ], + "hints": { + "index": 21391 + } + }, + { + "items": [ + 11226.5, + 2.7147 + ], + "hints": { + "index": 21392 + } + }, + { + "items": [ + 11227, + 2.6546 + ], + "hints": { + "index": 21393 + } + }, + { + "items": [ + 11227.5, + 2.7456998825073242 + ], + "hints": { + "index": 21394 + } + }, + { + "items": [ + 11228, + 2.754 + ], + "hints": { + "index": 21395 + } + }, + { + "items": [ + 11228.5, + 2.6705 + ], + "hints": { + "index": 21396 + } + }, + { + "items": [ + 11229, + 2.6099 + ], + "hints": { + "index": 21397 + } + }, + { + "items": [ + 11229.5, + 2.7237 + ], + "hints": { + "index": 21398 + } + }, + { + "items": [ + 11230, + 2.931 + ], + "hints": { + "index": 21399 + } + }, + { + "items": [ + 11230.5, + 2.9065001010894775 + ], + "hints": { + "index": 21400 + } + }, + { + "items": [ + 11231, + 2.7929999828338623 + ], + "hints": { + "index": 21401 + } + }, + { + "items": [ + 11231.5, + 2.6760001182556152 + ], + "hints": { + "index": 21402 + } + }, + { + "items": [ + 11232, + 2.743 + ], + "hints": { + "index": 21403 + } + }, + { + "items": [ + 11232.5, + 2.8822000026702881 + ], + "hints": { + "index": 21404 + } + }, + { + "items": [ + 11233, + 3.1074 + ], + "hints": { + "index": 21405 + } + }, + { + "items": [ + 11233.5, + 3.1545000076293945 + ], + "hints": { + "index": 21406 + } + }, + { + "items": [ + 11234, + 3.0164 + ], + "hints": { + "index": 21407 + } + }, + { + "items": [ + 11234.5, + 2.9007999897003174 + ], + "hints": { + "index": 21408 + } + }, + { + "items": [ + 11235, + 2.904400110244751 + ], + "hints": { + "index": 21409 + } + }, + { + "items": [ + 11235.5, + 3.0151000022888184 + ], + "hints": { + "index": 21410 + } + }, + { + "items": [ + 11236, + 3.002500057220459 + ], + "hints": { + "index": 21411 + } + }, + { + "items": [ + 11236.5, + 2.8533999919891357 + ], + "hints": { + "index": 21412 + } + }, + { + "items": [ + 11237, + 2.7347 + ], + "hints": { + "index": 21413 + } + }, + { + "items": [ + 11237.5, + 2.7351999282836914 + ], + "hints": { + "index": 21414 + } + }, + { + "items": [ + 11238, + 2.8977 + ], + "hints": { + "index": 21415 + } + }, + { + "items": [ + 11238.5, + 2.9678 + ], + "hints": { + "index": 21416 + } + }, + { + "items": [ + 11239, + 2.9562 + ], + "hints": { + "index": 21417 + } + }, + { + "items": [ + 11239.5, + 2.7990000247955318 + ], + "hints": { + "index": 21418 + } + }, + { + "items": [ + 11240, + 2.6798000335693359 + ], + "hints": { + "index": 21419 + } + }, + { + "items": [ + 11240.5, + 2.6505999565124512 + ], + "hints": { + "index": 21420 + } + }, + { + "items": [ + 11241, + 2.7742 + ], + "hints": { + "index": 21421 + } + }, + { + "items": [ + 11241.5, + 2.9883999824523926 + ], + "hints": { + "index": 21422 + } + }, + { + "items": [ + 11242, + 2.9091999530792236 + ], + "hints": { + "index": 21423 + } + }, + { + "items": [ + 11242.5, + 2.6918 + ], + "hints": { + "index": 21424 + } + }, + { + "items": [ + 11243, + 2.5176000595092773 + ], + "hints": { + "index": 21425 + } + }, + { + "items": [ + 11243.5, + 2.5973000526428223 + ], + "hints": { + "index": 21426 + } + }, + { + "items": [ + 11244, + 2.7302999496459961 + ], + "hints": { + "index": 21427 + } + }, + { + "items": [ + 11244.5, + 2.8168001174926758 + ], + "hints": { + "index": 21428 + } + }, + { + "items": [ + 11245, + 2.8363 + ], + "hints": { + "index": 21429 + } + }, + { + "items": [ + 11245.5, + 2.8405 + ], + "hints": { + "index": 21430 + } + }, + { + "items": [ + 11246, + 2.8108 + ], + "hints": { + "index": 21431 + } + }, + { + "items": [ + 11246.5, + 2.814500093460083 + ], + "hints": { + "index": 21432 + } + }, + { + "items": [ + 11247, + 2.7418999671936035 + ], + "hints": { + "index": 21433 + } + }, + { + "items": [ + 11247.5, + 2.8017001152038574 + ], + "hints": { + "index": 21434 + } + }, + { + "items": [ + 11248, + 2.9119999408721924 + ], + "hints": { + "index": 21435 + } + }, + { + "items": [ + 11248.5, + 2.9781 + ], + "hints": { + "index": 21436 + } + }, + { + "items": [ + 11249, + 2.8104 + ], + "hints": { + "index": 21437 + } + }, + { + "items": [ + 11249.5, + 2.6381 + ], + "hints": { + "index": 21438 + } + }, + { + "items": [ + 11250, + 2.609699964523315 + ], + "hints": { + "index": 21439 + } + }, + { + "items": [ + 11250.5, + 2.9138 + ], + "hints": { + "index": 21440 + } + }, + { + "items": [ + 11251, + 2.9660999774932861 + ], + "hints": { + "index": 21441 + } + }, + { + "items": [ + 11251.5, + 2.9265 + ], + "hints": { + "index": 21442 + } + }, + { + "items": [ + 11252, + 2.5880000591278076 + ], + "hints": { + "index": 21443 + } + }, + { + "items": [ + 11252.5, + 2.4823 + ], + "hints": { + "index": 21444 + } + }, + { + "items": [ + 11253, + 2.5502 + ], + "hints": { + "index": 21445 + } + }, + { + "items": [ + 11253.5, + 2.6625 + ], + "hints": { + "index": 21446 + } + }, + { + "items": [ + 11254, + 2.7892 + ], + "hints": { + "index": 21447 + } + }, + { + "items": [ + 11254.5, + 2.638700008392334 + ], + "hints": { + "index": 21448 + } + }, + { + "items": [ + 11255, + 2.58459997177124 + ], + "hints": { + "index": 21449 + } + }, + { + "items": [ + 11255.5, + 2.5278999805450439 + ], + "hints": { + "index": 21450 + } + }, + { + "items": [ + 11256, + 2.7303 + ], + "hints": { + "index": 21451 + } + }, + { + "items": [ + 11256.5, + 2.866300106048584 + ], + "hints": { + "index": 21452 + } + }, + { + "items": [ + 11257, + 2.9523 + ], + "hints": { + "index": 21453 + } + }, + { + "items": [ + 11257.5, + 2.7123000621795654 + ], + "hints": { + "index": 21454 + } + }, + { + "items": [ + 11258, + 2.6184000968933105 + ], + "hints": { + "index": 21455 + } + }, + { + "items": [ + 11258.5, + 2.66729998588562 + ], + "hints": { + "index": 21456 + } + }, + { + "items": [ + 11259, + 2.8685998916625977 + ], + "hints": { + "index": 21457 + } + }, + { + "items": [ + 11259.5, + 2.8996999263763428 + ], + "hints": { + "index": 21458 + } + }, + { + "items": [ + 11260, + 2.7053000926971436 + ], + "hints": { + "index": 21459 + } + }, + { + "items": [ + 11260.5, + 2.6135001182556152 + ], + "hints": { + "index": 21460 + } + }, + { + "items": [ + 11261, + 2.7232 + ], + "hints": { + "index": 21461 + } + }, + { + "items": [ + 11261.5, + 2.8963000774383545 + ], + "hints": { + "index": 21462 + } + }, + { + "items": [ + 11262, + 2.88479995727539 + ], + "hints": { + "index": 21463 + } + }, + { + "items": [ + 11262.5, + 2.7522 + ], + "hints": { + "index": 21464 + } + }, + { + "items": [ + 11263, + 2.6957 + ], + "hints": { + "index": 21465 + } + }, + { + "items": [ + 11263.5, + 2.7651998996734619 + ], + "hints": { + "index": 21466 + } + }, + { + "items": [ + 11264, + 2.8875 + ], + "hints": { + "index": 21467 + } + }, + { + "items": [ + 11264.5, + 2.8985 + ], + "hints": { + "index": 21468 + } + }, + { + "items": [ + 11265, + 2.7109 + ], + "hints": { + "index": 21469 + } + }, + { + "items": [ + 11265.5, + 2.7171 + ], + "hints": { + "index": 21470 + } + }, + { + "items": [ + 11266, + 2.7617 + ], + "hints": { + "index": 21471 + } + }, + { + "items": [ + 11266.5, + 2.9379 + ], + "hints": { + "index": 21472 + } + }, + { + "items": [ + 11267, + 2.8543 + ], + "hints": { + "index": 21473 + } + }, + { + "items": [ + 11267.5, + 2.7878999710083008 + ], + "hints": { + "index": 21474 + } + }, + { + "items": [ + 11268, + 2.8066000938415527 + ], + "hints": { + "index": 21475 + } + }, + { + "items": [ + 11268.5, + 2.9128999710083008 + ], + "hints": { + "index": 21476 + } + }, + { + "items": [ + 11269, + 2.9586 + ], + "hints": { + "index": 21477 + } + }, + { + "items": [ + 11269.5, + 2.8034 + ], + "hints": { + "index": 21478 + } + }, + { + "items": [ + 11270, + 2.6289000511169434 + ], + "hints": { + "index": 21479 + } + }, + { + "items": [ + 11270.5, + 2.6321001052856445 + ], + "hints": { + "index": 21480 + } + }, + { + "items": [ + 11271, + 2.769 + ], + "hints": { + "index": 21481 + } + }, + { + "items": [ + 11271.5, + 2.92 + ], + "hints": { + "index": 21482 + } + }, + { + "items": [ + 11272, + 2.8556 + ], + "hints": { + "index": 21483 + } + }, + { + "items": [ + 11272.5, + 2.8709 + ], + "hints": { + "index": 21484 + } + }, + { + "items": [ + 11273, + 2.7433 + ], + "hints": { + "index": 21485 + } + }, + { + "items": [ + 11273.5, + 2.7599999904632568 + ], + "hints": { + "index": 21486 + } + }, + { + "items": [ + 11274, + 2.6872999668121338 + ], + "hints": { + "index": 21487 + } + }, + { + "items": [ + 11274.5, + 2.7606000900268555 + ], + "hints": { + "index": 21488 + } + }, + { + "items": [ + 11275, + 2.7553000450134277 + ], + "hints": { + "index": 21489 + } + }, + { + "items": [ + 11275.5, + 2.8313999176025391 + ], + "hints": { + "index": 21490 + } + }, + { + "items": [ + 11276, + 2.8269999027252197 + ], + "hints": { + "index": 21491 + } + }, + { + "items": [ + 11276.5, + 2.9401 + ], + "hints": { + "index": 21492 + } + }, + { + "items": [ + 11277, + 2.8916 + ], + "hints": { + "index": 21493 + } + }, + { + "items": [ + 11277.5, + 2.8283998966217041 + ], + "hints": { + "index": 21494 + } + }, + { + "items": [ + 11278, + 2.7679998874664307 + ], + "hints": { + "index": 21495 + } + }, + { + "items": [ + 11278.5, + 2.7678000926971436 + ], + "hints": { + "index": 21496 + } + }, + { + "items": [ + 11279, + 2.675800085067749 + ], + "hints": { + "index": 21497 + } + }, + { + "items": [ + 11279.5, + 2.6999 + ], + "hints": { + "index": 21498 + } + }, + { + "items": [ + 11280, + 2.6929 + ], + "hints": { + "index": 21499 + } + }, + { + "items": [ + 11280.5, + 2.8619 + ], + "hints": { + "index": 21500 + } + }, + { + "items": [ + 11281, + 2.8223 + ], + "hints": { + "index": 21501 + } + }, + { + "items": [ + 11281.5, + 2.836999893188477 + ], + "hints": { + "index": 21502 + } + }, + { + "items": [ + 11282, + 2.7274000644683838 + ], + "hints": { + "index": 21503 + } + }, + { + "items": [ + 11282.5, + 2.5888 + ], + "hints": { + "index": 21504 + } + }, + { + "items": [ + 11283, + 2.5754 + ], + "hints": { + "index": 21505 + } + }, + { + "items": [ + 11283.5, + 2.5547 + ], + "hints": { + "index": 21506 + } + }, + { + "items": [ + 11284, + 2.6486 + ], + "hints": { + "index": 21507 + } + }, + { + "items": [ + 11284.5, + 2.7311999797821045 + ], + "hints": { + "index": 21508 + } + }, + { + "items": [ + 11285, + 2.7713000774383545 + ], + "hints": { + "index": 21509 + } + }, + { + "items": [ + 11285.5, + 2.8141999244689941 + ], + "hints": { + "index": 21510 + } + }, + { + "items": [ + 11286, + 2.6677999496459961 + ], + "hints": { + "index": 21511 + } + }, + { + "items": [ + 11286.5, + 2.7607998847961426 + ], + "hints": { + "index": 21512 + } + }, + { + "items": [ + 11287, + 2.7293999195098877 + ], + "hints": { + "index": 21513 + } + }, + { + "items": [ + 11287.5, + 2.7348 + ], + "hints": { + "index": 21514 + } + }, + { + "items": [ + 11288, + 2.6431999206542969 + ], + "hints": { + "index": 21515 + } + }, + { + "items": [ + 11288.5, + 2.7425999641418457 + ], + "hints": { + "index": 21516 + } + }, + { + "items": [ + 11289, + 2.7604 + ], + "hints": { + "index": 21517 + } + }, + { + "items": [ + 11289.5, + 2.6969 + ], + "hints": { + "index": 21518 + } + }, + { + "items": [ + 11290, + 2.5364000797271729 + ], + "hints": { + "index": 21519 + } + }, + { + "items": [ + 11290.5, + 2.5304 + ], + "hints": { + "index": 21520 + } + }, + { + "items": [ + 11291, + 2.7237 + ], + "hints": { + "index": 21521 + } + }, + { + "items": [ + 11291.5, + 2.8171000480651855 + ], + "hints": { + "index": 21522 + } + }, + { + "items": [ + 11292, + 2.7932 + ], + "hints": { + "index": 21523 + } + }, + { + "items": [ + 11292.5, + 2.6291 + ], + "hints": { + "index": 21524 + } + }, + { + "items": [ + 11293, + 2.5871999263763428 + ], + "hints": { + "index": 21525 + } + }, + { + "items": [ + 11293.5, + 2.7230000495910645 + ], + "hints": { + "index": 21526 + } + }, + { + "items": [ + 11294, + 2.8218 + ], + "hints": { + "index": 21527 + } + }, + { + "items": [ + 11294.5, + 2.8501 + ], + "hints": { + "index": 21528 + } + }, + { + "items": [ + 11295, + 2.69569993019104 + ], + "hints": { + "index": 21529 + } + }, + { + "items": [ + 11295.5, + 2.5915999412536621 + ], + "hints": { + "index": 21530 + } + }, + { + "items": [ + 11296, + 2.6078000068664551 + ], + "hints": { + "index": 21531 + } + }, + { + "items": [ + 11296.5, + 2.7086999416351318 + ], + "hints": { + "index": 21532 + } + }, + { + "items": [ + 11297, + 2.7509000301361084 + ], + "hints": { + "index": 21533 + } + }, + { + "items": [ + 11297.5, + 2.7135999202728271 + ], + "hints": { + "index": 21534 + } + }, + { + "items": [ + 11298, + 2.6840999126434326 + ], + "hints": { + "index": 21535 + } + }, + { + "items": [ + 11298.5, + 2.7111001014709473 + ], + "hints": { + "index": 21536 + } + }, + { + "items": [ + 11299, + 2.8929 + ], + "hints": { + "index": 21537 + } + }, + { + "items": [ + 11299.5, + 2.9363 + ], + "hints": { + "index": 21538 + } + }, + { + "items": [ + 11300, + 2.8603 + ], + "hints": { + "index": 21539 + } + }, + { + "items": [ + 11300.5, + 2.8092999458312988 + ], + "hints": { + "index": 21540 + } + }, + { + "items": [ + 11301, + 2.7593 + ], + "hints": { + "index": 21541 + } + }, + { + "items": [ + 11301.5, + 2.8368 + ], + "hints": { + "index": 21542 + } + }, + { + "items": [ + 11302, + 2.8331 + ], + "hints": { + "index": 21543 + } + }, + { + "items": [ + 11302.5, + 2.9323 + ], + "hints": { + "index": 21544 + } + }, + { + "items": [ + 11303, + 3.0242 + ], + "hints": { + "index": 21545 + } + }, + { + "items": [ + 11303.5, + 3.0155999660491943 + ], + "hints": { + "index": 21546 + } + }, + { + "items": [ + 11304, + 2.9901 + ], + "hints": { + "index": 21547 + } + }, + { + "items": [ + 11304.5, + 2.987 + ], + "hints": { + "index": 21548 + } + }, + { + "items": [ + 11305, + 2.9968 + ], + "hints": { + "index": 21549 + } + }, + { + "items": [ + 11305.5, + 2.9542000293731689 + ], + "hints": { + "index": 21550 + } + }, + { + "items": [ + 11306, + 2.8563 + ], + "hints": { + "index": 21551 + } + }, + { + "items": [ + 11306.5, + 2.8059 + ], + "hints": { + "index": 21552 + } + }, + { + "items": [ + 11307, + 2.8668 + ], + "hints": { + "index": 21553 + } + }, + { + "items": [ + 11307.5, + 3.1839 + ], + "hints": { + "index": 21554 + } + }, + { + "items": [ + 11308, + 3.58270001411438 + ], + "hints": { + "index": 21555 + } + }, + { + "items": [ + 11308.5, + 3.3914000988006592 + ], + "hints": { + "index": 21556 + } + }, + { + "items": [ + 11309, + 3.0599000453948975 + ], + "hints": { + "index": 21557 + } + }, + { + "items": [ + 11309.5, + 2.8350999355316162 + ], + "hints": { + "index": 21558 + } + }, + { + "items": [ + 11310, + 3.09 + ], + "hints": { + "index": 21559 + } + }, + { + "items": [ + 11310.5, + 3.0773000717163086 + ], + "hints": { + "index": 21560 + } + }, + { + "items": [ + 11311, + 3.0169 + ], + "hints": { + "index": 21561 + } + }, + { + "items": [ + 11311.5, + 2.8622 + ], + "hints": { + "index": 21562 + } + }, + { + "items": [ + 11312, + 2.8022 + ], + "hints": { + "index": 21563 + } + }, + { + "items": [ + 11312.5, + 2.8211 + ], + "hints": { + "index": 21564 + } + }, + { + "items": [ + 11313, + 2.8184 + ], + "hints": { + "index": 21565 + } + }, + { + "items": [ + 11313.5, + 3.1268999576568604 + ], + "hints": { + "index": 21566 + } + }, + { + "items": [ + 11314, + 3.6835999488830566 + ], + "hints": { + "index": 21567 + } + }, + { + "items": [ + 11314.5, + 4.1376 + ], + "hints": { + "index": 21568 + } + }, + { + "items": [ + 11315, + 3.5575 + ], + "hints": { + "index": 21569 + } + }, + { + "items": [ + 11315.5, + 3.0729 + ], + "hints": { + "index": 21570 + } + }, + { + "items": [ + 11316, + 2.9705 + ], + "hints": { + "index": 21571 + } + }, + { + "items": [ + 11316.5, + 3.3431 + ], + "hints": { + "index": 21572 + } + }, + { + "items": [ + 11317, + 3.2532999515533447 + ], + "hints": { + "index": 21573 + } + }, + { + "items": [ + 11317.5, + 2.994999885559082 + ], + "hints": { + "index": 21574 + } + }, + { + "items": [ + 11318, + 2.8036 + ], + "hints": { + "index": 21575 + } + }, + { + "items": [ + 11318.5, + 2.9286999702453613 + ], + "hints": { + "index": 21576 + } + }, + { + "items": [ + 11319, + 3.050800085067749 + ], + "hints": { + "index": 21577 + } + }, + { + "items": [ + 11319.5, + 2.9769999980926514 + ], + "hints": { + "index": 21578 + } + }, + { + "items": [ + 11320, + 2.8403999805450439 + ], + "hints": { + "index": 21579 + } + }, + { + "items": [ + 11320.5, + 2.8533999919891357 + ], + "hints": { + "index": 21580 + } + }, + { + "items": [ + 11321, + 2.9289999008178711 + ], + "hints": { + "index": 21581 + } + }, + { + "items": [ + 11321.5, + 3.0074000358581543 + ], + "hints": { + "index": 21582 + } + }, + { + "items": [ + 11322, + 2.9728999137878418 + ], + "hints": { + "index": 21583 + } + }, + { + "items": [ + 11322.5, + 2.7978 + ], + "hints": { + "index": 21584 + } + }, + { + "items": [ + 11323, + 2.7125 + ], + "hints": { + "index": 21585 + } + }, + { + "items": [ + 11323.5, + 2.7274 + ], + "hints": { + "index": 21586 + } + }, + { + "items": [ + 11324, + 2.8157 + ], + "hints": { + "index": 21587 + } + }, + { + "items": [ + 11324.5, + 2.770299911499023 + ], + "hints": { + "index": 21588 + } + }, + { + "items": [ + 11325, + 2.6339 + ], + "hints": { + "index": 21589 + } + }, + { + "items": [ + 11325.5, + 2.6312 + ], + "hints": { + "index": 21590 + } + }, + { + "items": [ + 11326, + 2.7235000133514404 + ], + "hints": { + "index": 21591 + } + }, + { + "items": [ + 11326.5, + 2.8559000492095947 + ], + "hints": { + "index": 21592 + } + }, + { + "items": [ + 11327, + 2.823199987411499 + ], + "hints": { + "index": 21593 + } + }, + { + "items": [ + 11327.5, + 2.7349 + ], + "hints": { + "index": 21594 + } + }, + { + "items": [ + 11328, + 2.6402 + ], + "hints": { + "index": 21595 + } + }, + { + "items": [ + 11328.5, + 2.6042 + ], + "hints": { + "index": 21596 + } + }, + { + "items": [ + 11329, + 2.6582000255584717 + ], + "hints": { + "index": 21597 + } + }, + { + "items": [ + 11329.5, + 2.6683 + ], + "hints": { + "index": 21598 + } + }, + { + "items": [ + 11330, + 2.6513 + ], + "hints": { + "index": 21599 + } + }, + { + "items": [ + 11330.5, + 2.5407 + ], + "hints": { + "index": 21600 + } + }, + { + "items": [ + 11331, + 2.6289 + ], + "hints": { + "index": 21601 + } + }, + { + "items": [ + 11331.5, + 2.8159000873565674 + ], + "hints": { + "index": 21602 + } + }, + { + "items": [ + 11332, + 2.791 + ], + "hints": { + "index": 21603 + } + }, + { + "items": [ + 11332.5, + 2.7067999839782715 + ], + "hints": { + "index": 21604 + } + }, + { + "items": [ + 11333, + 2.4934 + ], + "hints": { + "index": 21605 + } + }, + { + "items": [ + 11333.5, + 2.5262999534606938 + ], + "hints": { + "index": 21606 + } + }, + { + "items": [ + 11334, + 2.5552 + ], + "hints": { + "index": 21607 + } + }, + { + "items": [ + 11334.5, + 2.6874001026153564 + ], + "hints": { + "index": 21608 + } + }, + { + "items": [ + 11335, + 2.7115 + ], + "hints": { + "index": 21609 + } + }, + { + "items": [ + 11335.5, + 2.7343 + ], + "hints": { + "index": 21610 + } + }, + { + "items": [ + 11336, + 2.61 + ], + "hints": { + "index": 21611 + } + }, + { + "items": [ + 11336.5, + 2.6532 + ], + "hints": { + "index": 21612 + } + }, + { + "items": [ + 11337, + 2.6082000732421875 + ], + "hints": { + "index": 21613 + } + }, + { + "items": [ + 11337.5, + 2.7434000968933105 + ], + "hints": { + "index": 21614 + } + }, + { + "items": [ + 11338, + 2.6941 + ], + "hints": { + "index": 21615 + } + }, + { + "items": [ + 11338.5, + 2.7511 + ], + "hints": { + "index": 21616 + } + }, + { + "items": [ + 11339, + 2.7969000339508057 + ], + "hints": { + "index": 21617 + } + }, + { + "items": [ + 11339.5, + 2.7546999454498291 + ], + "hints": { + "index": 21618 + } + }, + { + "items": [ + 11340, + 2.6131000518798828 + ], + "hints": { + "index": 21619 + } + }, + { + "items": [ + 11340.5, + 2.5714 + ], + "hints": { + "index": 21620 + } + }, + { + "items": [ + 11341, + 2.7548 + ], + "hints": { + "index": 21621 + } + }, + { + "items": [ + 11341.5, + 2.9811999797821045 + ], + "hints": { + "index": 21622 + } + }, + { + "items": [ + 11342, + 2.8963000774383545 + ], + "hints": { + "index": 21623 + } + }, + { + "items": [ + 11342.5, + 2.7202999591827393 + ], + "hints": { + "index": 21624 + } + }, + { + "items": [ + 11343, + 2.5751 + ], + "hints": { + "index": 21625 + } + }, + { + "items": [ + 11343.5, + 2.6377999782562256 + ], + "hints": { + "index": 21626 + } + }, + { + "items": [ + 11344, + 2.6554999351501465 + ], + "hints": { + "index": 21627 + } + }, + { + "items": [ + 11344.5, + 2.5808 + ], + "hints": { + "index": 21628 + } + }, + { + "items": [ + 11345, + 2.4683 + ], + "hints": { + "index": 21629 + } + }, + { + "items": [ + 11345.5, + 2.4709000587463379 + ], + "hints": { + "index": 21630 + } + }, + { + "items": [ + 11346, + 2.5906999111175537 + ], + "hints": { + "index": 21631 + } + }, + { + "items": [ + 11346.5, + 2.83270001411438 + ], + "hints": { + "index": 21632 + } + }, + { + "items": [ + 11347, + 2.9040999412536621 + ], + "hints": { + "index": 21633 + } + }, + { + "items": [ + 11347.5, + 2.8906 + ], + "hints": { + "index": 21634 + } + }, + { + "items": [ + 11348, + 2.6369 + ], + "hints": { + "index": 21635 + } + }, + { + "items": [ + 11348.5, + 2.5972 + ], + "hints": { + "index": 21636 + } + }, + { + "items": [ + 11349, + 2.6243000030517578 + ], + "hints": { + "index": 21637 + } + }, + { + "items": [ + 11349.5, + 2.6958 + ], + "hints": { + "index": 21638 + } + }, + { + "items": [ + 11350, + 2.6834 + ], + "hints": { + "index": 21639 + } + }, + { + "items": [ + 11350.5, + 2.6319 + ], + "hints": { + "index": 21640 + } + }, + { + "items": [ + 11351, + 2.6921999454498291 + ], + "hints": { + "index": 21641 + } + }, + { + "items": [ + 11351.5, + 2.7909 + ], + "hints": { + "index": 21642 + } + }, + { + "items": [ + 11352, + 2.834399938583374 + ], + "hints": { + "index": 21643 + } + }, + { + "items": [ + 11352.5, + 2.717 + ], + "hints": { + "index": 21644 + } + }, + { + "items": [ + 11353, + 2.6494 + ], + "hints": { + "index": 21645 + } + }, + { + "items": [ + 11353.5, + 2.6611 + ], + "hints": { + "index": 21646 + } + }, + { + "items": [ + 11354, + 2.7775 + ], + "hints": { + "index": 21647 + } + }, + { + "items": [ + 11354.5, + 2.724600076675415 + ], + "hints": { + "index": 21648 + } + }, + { + "items": [ + 11355, + 2.6607 + ], + "hints": { + "index": 21649 + } + }, + { + "items": [ + 11355.5, + 2.6963 + ], + "hints": { + "index": 21650 + } + }, + { + "items": [ + 11356, + 2.9084 + ], + "hints": { + "index": 21651 + } + }, + { + "items": [ + 11356.5, + 3.0947000980377197 + ], + "hints": { + "index": 21652 + } + }, + { + "items": [ + 11357, + 3.0144 + ], + "hints": { + "index": 21653 + } + }, + { + "items": [ + 11357.5, + 2.9786999225616455 + ], + "hints": { + "index": 21654 + } + }, + { + "items": [ + 11358, + 2.8696 + ], + "hints": { + "index": 21655 + } + }, + { + "items": [ + 11358.5, + 2.9171 + ], + "hints": { + "index": 21656 + } + }, + { + "items": [ + 11359, + 3.0637 + ], + "hints": { + "index": 21657 + } + }, + { + "items": [ + 11359.5, + 3.0501999855041504 + ], + "hints": { + "index": 21658 + } + }, + { + "items": [ + 11360, + 2.8934 + ], + "hints": { + "index": 21659 + } + }, + { + "items": [ + 11360.5, + 2.6688 + ], + "hints": { + "index": 21660 + } + }, + { + "items": [ + 11361, + 2.6356000900268555 + ], + "hints": { + "index": 21661 + } + }, + { + "items": [ + 11361.5, + 2.7479000091552734 + ], + "hints": { + "index": 21662 + } + }, + { + "items": [ + 11362, + 2.785 + ], + "hints": { + "index": 21663 + } + }, + { + "items": [ + 11362.5, + 2.7052 + ], + "hints": { + "index": 21664 + } + }, + { + "items": [ + 11363, + 2.6319000720977783 + ], + "hints": { + "index": 21665 + } + }, + { + "items": [ + 11363.5, + 2.6001999378204346 + ], + "hints": { + "index": 21666 + } + }, + { + "items": [ + 11364, + 2.762700080871582 + ], + "hints": { + "index": 21667 + } + }, + { + "items": [ + 11364.5, + 2.8440999984741211 + ], + "hints": { + "index": 21668 + } + }, + { + "items": [ + 11365, + 2.8826999664306641 + ], + "hints": { + "index": 21669 + } + }, + { + "items": [ + 11365.5, + 2.8561 + ], + "hints": { + "index": 21670 + } + }, + { + "items": [ + 11366, + 2.8357 + ], + "hints": { + "index": 21671 + } + }, + { + "items": [ + 11366.5, + 3.0032 + ], + "hints": { + "index": 21672 + } + }, + { + "items": [ + 11367, + 2.953200101852417 + ], + "hints": { + "index": 21673 + } + }, + { + "items": [ + 11367.5, + 2.9248 + ], + "hints": { + "index": 21674 + } + }, + { + "items": [ + 11368, + 2.7123000621795654 + ], + "hints": { + "index": 21675 + } + }, + { + "items": [ + 11368.5, + 2.6457 + ], + "hints": { + "index": 21676 + } + }, + { + "items": [ + 11369, + 2.7481 + ], + "hints": { + "index": 21677 + } + }, + { + "items": [ + 11369.5, + 2.8332 + ], + "hints": { + "index": 21678 + } + }, + { + "items": [ + 11370, + 2.7953999042510982 + ], + "hints": { + "index": 21679 + } + }, + { + "items": [ + 11370.5, + 2.6512 + ], + "hints": { + "index": 21680 + } + }, + { + "items": [ + 11371, + 2.6073 + ], + "hints": { + "index": 21681 + } + }, + { + "items": [ + 11371.5, + 2.6721000671386719 + ], + "hints": { + "index": 21682 + } + }, + { + "items": [ + 11372, + 2.7352 + ], + "hints": { + "index": 21683 + } + }, + { + "items": [ + 11372.5, + 2.7391 + ], + "hints": { + "index": 21684 + } + }, + { + "items": [ + 11373, + 2.7173 + ], + "hints": { + "index": 21685 + } + }, + { + "items": [ + 11373.5, + 2.7051 + ], + "hints": { + "index": 21686 + } + }, + { + "items": [ + 11374, + 2.7786 + ], + "hints": { + "index": 21687 + } + }, + { + "items": [ + 11374.5, + 2.8512 + ], + "hints": { + "index": 21688 + } + }, + { + "items": [ + 11375, + 2.7462999820709229 + ], + "hints": { + "index": 21689 + } + }, + { + "items": [ + 11375.5, + 2.6821999549865723 + ], + "hints": { + "index": 21690 + } + }, + { + "items": [ + 11376, + 2.6448 + ], + "hints": { + "index": 21691 + } + }, + { + "items": [ + 11376.5, + 2.7347 + ], + "hints": { + "index": 21692 + } + }, + { + "items": [ + 11377, + 2.6579999923706055 + ], + "hints": { + "index": 21693 + } + }, + { + "items": [ + 11377.5, + 2.603100061416626 + ], + "hints": { + "index": 21694 + } + }, + { + "items": [ + 11378, + 2.5421 + ], + "hints": { + "index": 21695 + } + }, + { + "items": [ + 11378.5, + 2.5327999591827393 + ], + "hints": { + "index": 21696 + } + }, + { + "items": [ + 11379, + 2.6006999015808105 + ], + "hints": { + "index": 21697 + } + }, + { + "items": [ + 11379.5, + 2.6652 + ], + "hints": { + "index": 21698 + } + }, + { + "items": [ + 11380, + 2.7729001045227051 + ], + "hints": { + "index": 21699 + } + }, + { + "items": [ + 11380.5, + 2.7974 + ], + "hints": { + "index": 21700 + } + }, + { + "items": [ + 11381, + 2.9107000827789307 + ], + "hints": { + "index": 21701 + } + }, + { + "items": [ + 11381.5, + 2.9904000759124756 + ], + "hints": { + "index": 21702 + } + }, + { + "items": [ + 11382, + 2.9033000469207764 + ], + "hints": { + "index": 21703 + } + }, + { + "items": [ + 11382.5, + 2.7708001136779785 + ], + "hints": { + "index": 21704 + } + }, + { + "items": [ + 11383, + 2.65339994430542 + ], + "hints": { + "index": 21705 + } + }, + { + "items": [ + 11383.5, + 2.703700065612793 + ], + "hints": { + "index": 21706 + } + }, + { + "items": [ + 11384, + 2.7186 + ], + "hints": { + "index": 21707 + } + }, + { + "items": [ + 11384.5, + 2.7291 + ], + "hints": { + "index": 21708 + } + }, + { + "items": [ + 11385, + 2.612299919128418 + ], + "hints": { + "index": 21709 + } + }, + { + "items": [ + 11385.5, + 2.502000093460083 + ], + "hints": { + "index": 21710 + } + }, + { + "items": [ + 11386, + 2.5774 + ], + "hints": { + "index": 21711 + } + }, + { + "items": [ + 11386.5, + 2.6253 + ], + "hints": { + "index": 21712 + } + }, + { + "items": [ + 11387, + 2.8022 + ], + "hints": { + "index": 21713 + } + }, + { + "items": [ + 11387.5, + 2.7412 + ], + "hints": { + "index": 21714 + } + }, + { + "items": [ + 11388, + 2.67930006980896 + ], + "hints": { + "index": 21715 + } + }, + { + "items": [ + 11388.5, + 2.6435000896453857 + ], + "hints": { + "index": 21716 + } + }, + { + "items": [ + 11389, + 2.7630000114440918 + ], + "hints": { + "index": 21717 + } + }, + { + "items": [ + 11389.5, + 3.1056 + ], + "hints": { + "index": 21718 + } + }, + { + "items": [ + 11390, + 3.1173000335693359 + ], + "hints": { + "index": 21719 + } + }, + { + "items": [ + 11390.5, + 3.0561 + ], + "hints": { + "index": 21720 + } + }, + { + "items": [ + 11391, + 2.8843998908996582 + ], + "hints": { + "index": 21721 + } + }, + { + "items": [ + 11391.5, + 2.8314 + ], + "hints": { + "index": 21722 + } + }, + { + "items": [ + 11392, + 2.7356998920440674 + ], + "hints": { + "index": 21723 + } + }, + { + "items": [ + 11392.5, + 2.7351 + ], + "hints": { + "index": 21724 + } + }, + { + "items": [ + 11393, + 2.7681 + ], + "hints": { + "index": 21725 + } + }, + { + "items": [ + 11393.5, + 2.7964 + ], + "hints": { + "index": 21726 + } + }, + { + "items": [ + 11394, + 2.754 + ], + "hints": { + "index": 21727 + } + }, + { + "items": [ + 11394.5, + 2.7595 + ], + "hints": { + "index": 21728 + } + }, + { + "items": [ + 11395, + 2.7878 + ], + "hints": { + "index": 21729 + } + }, + { + "items": [ + 11395.5, + 2.7086 + ], + "hints": { + "index": 21730 + } + }, + { + "items": [ + 11396, + 2.6616 + ], + "hints": { + "index": 21731 + } + }, + { + "items": [ + 11396.5, + 2.627 + ], + "hints": { + "index": 21732 + } + }, + { + "items": [ + 11397, + 2.7806000709533691 + ], + "hints": { + "index": 21733 + } + }, + { + "items": [ + 11397.5, + 2.8506999015808105 + ], + "hints": { + "index": 21734 + } + }, + { + "items": [ + 11398, + 2.841 + ], + "hints": { + "index": 21735 + } + }, + { + "items": [ + 11398.5, + 2.7349998950958252 + ], + "hints": { + "index": 21736 + } + }, + { + "items": [ + 11399, + 2.61520004272461 + ], + "hints": { + "index": 21737 + } + }, + { + "items": [ + 11399.5, + 2.6602001190185547 + ], + "hints": { + "index": 21738 + } + }, + { + "items": [ + 11400, + 2.6842999458312988 + ], + "hints": { + "index": 21739 + } + }, + { + "items": [ + 11400.5, + 2.8517999649047852 + ], + "hints": { + "index": 21740 + } + }, + { + "items": [ + 11401, + 2.799299955368042 + ], + "hints": { + "index": 21741 + } + }, + { + "items": [ + 11401.5, + 2.8647 + ], + "hints": { + "index": 21742 + } + }, + { + "items": [ + 11402, + 2.8754000663757324 + ], + "hints": { + "index": 21743 + } + }, + { + "items": [ + 11402.5, + 2.8646 + ], + "hints": { + "index": 21744 + } + }, + { + "items": [ + 11403, + 2.8241000175476074 + ], + "hints": { + "index": 21745 + } + }, + { + "items": [ + 11403.5, + 2.7009000778198242 + ], + "hints": { + "index": 21746 + } + }, + { + "items": [ + 11404, + 2.7868 + ], + "hints": { + "index": 21747 + } + }, + { + "items": [ + 11404.5, + 2.8487 + ], + "hints": { + "index": 21748 + } + }, + { + "items": [ + 11405, + 2.8585000038146973 + ], + "hints": { + "index": 21749 + } + }, + { + "items": [ + 11405.5, + 2.7688999176025391 + ], + "hints": { + "index": 21750 + } + }, + { + "items": [ + 11406, + 2.6191999912261963 + ], + "hints": { + "index": 21751 + } + }, + { + "items": [ + 11406.5, + 2.6738998889923096 + ], + "hints": { + "index": 21752 + } + }, + { + "items": [ + 11407, + 2.7449 + ], + "hints": { + "index": 21753 + } + }, + { + "items": [ + 11407.5, + 2.7436 + ], + "hints": { + "index": 21754 + } + }, + { + "items": [ + 11408, + 2.7290000915527344 + ], + "hints": { + "index": 21755 + } + }, + { + "items": [ + 11408.5, + 2.6486999988555908 + ], + "hints": { + "index": 21756 + } + }, + { + "items": [ + 11409, + 2.7086999416351318 + ], + "hints": { + "index": 21757 + } + }, + { + "items": [ + 11409.5, + 2.7771999835968018 + ], + "hints": { + "index": 21758 + } + }, + { + "items": [ + 11410, + 2.8679 + ], + "hints": { + "index": 21759 + } + }, + { + "items": [ + 11410.5, + 3.1195 + ], + "hints": { + "index": 21760 + } + }, + { + "items": [ + 11411, + 3.1681 + ], + "hints": { + "index": 21761 + } + }, + { + "items": [ + 11411.5, + 3.2334 + ], + "hints": { + "index": 21762 + } + }, + { + "items": [ + 11412, + 3.2062 + ], + "hints": { + "index": 21763 + } + }, + { + "items": [ + 11412.5, + 3.0992 + ], + "hints": { + "index": 21764 + } + }, + { + "items": [ + 11413, + 3.017 + ], + "hints": { + "index": 21765 + } + }, + { + "items": [ + 11413.5, + 2.8913 + ], + "hints": { + "index": 21766 + } + }, + { + "items": [ + 11414, + 2.7755 + ], + "hints": { + "index": 21767 + } + }, + { + "items": [ + 11414.5, + 2.8547 + ], + "hints": { + "index": 21768 + } + }, + { + "items": [ + 11415, + 2.8682 + ], + "hints": { + "index": 21769 + } + }, + { + "items": [ + 11415.5, + 3.0577 + ], + "hints": { + "index": 21770 + } + }, + { + "items": [ + 11416, + 2.8728 + ], + "hints": { + "index": 21771 + } + }, + { + "items": [ + 11416.5, + 2.7608 + ], + "hints": { + "index": 21772 + } + }, + { + "items": [ + 11417, + 2.6721 + ], + "hints": { + "index": 21773 + } + }, + { + "items": [ + 11417.5, + 2.7277 + ], + "hints": { + "index": 21774 + } + }, + { + "items": [ + 11418, + 2.7776 + ], + "hints": { + "index": 21775 + } + }, + { + "items": [ + 11418.5, + 2.7803 + ], + "hints": { + "index": 21776 + } + }, + { + "items": [ + 11419, + 2.723599910736084 + ], + "hints": { + "index": 21777 + } + }, + { + "items": [ + 11419.5, + 2.7553 + ], + "hints": { + "index": 21778 + } + }, + { + "items": [ + 11420, + 2.804 + ], + "hints": { + "index": 21779 + } + }, + { + "items": [ + 11420.5, + 2.8691999912261963 + ], + "hints": { + "index": 21780 + } + }, + { + "items": [ + 11421, + 2.755000114440918 + ], + "hints": { + "index": 21781 + } + }, + { + "items": [ + 11421.5, + 2.7132 + ], + "hints": { + "index": 21782 + } + }, + { + "items": [ + 11422, + 2.7241 + ], + "hints": { + "index": 21783 + } + }, + { + "items": [ + 11422.5, + 2.8132 + ], + "hints": { + "index": 21784 + } + }, + { + "items": [ + 11423, + 2.7836 + ], + "hints": { + "index": 21785 + } + }, + { + "items": [ + 11423.5, + 2.7306 + ], + "hints": { + "index": 21786 + } + }, + { + "items": [ + 11424, + 2.6172 + ], + "hints": { + "index": 21787 + } + }, + { + "items": [ + 11424.5, + 2.6878 + ], + "hints": { + "index": 21788 + } + }, + { + "items": [ + 11425, + 2.7061 + ], + "hints": { + "index": 21789 + } + }, + { + "items": [ + 11425.5, + 2.7453000545501709 + ], + "hints": { + "index": 21790 + } + }, + { + "items": [ + 11426, + 2.647 + ], + "hints": { + "index": 21791 + } + }, + { + "items": [ + 11426.5, + 2.7743 + ], + "hints": { + "index": 21792 + } + }, + { + "items": [ + 11427, + 2.9528999328613281 + ], + "hints": { + "index": 21793 + } + }, + { + "items": [ + 11427.5, + 2.9488999843597412 + ], + "hints": { + "index": 21794 + } + }, + { + "items": [ + 11428, + 2.8829998970031734 + ], + "hints": { + "index": 21795 + } + }, + { + "items": [ + 11428.5, + 2.7727999687194824 + ], + "hints": { + "index": 21796 + } + }, + { + "items": [ + 11429, + 2.8458 + ], + "hints": { + "index": 21797 + } + }, + { + "items": [ + 11429.5, + 2.838900089263916 + ], + "hints": { + "index": 21798 + } + }, + { + "items": [ + 11430, + 2.8813 + ], + "hints": { + "index": 21799 + } + }, + { + "items": [ + 11430.5, + 2.8713 + ], + "hints": { + "index": 21800 + } + }, + { + "items": [ + 11431, + 2.8376 + ], + "hints": { + "index": 21801 + } + }, + { + "items": [ + 11431.5, + 2.8290998935699463 + ], + "hints": { + "index": 21802 + } + }, + { + "items": [ + 11432, + 2.7908000946044922 + ], + "hints": { + "index": 21803 + } + }, + { + "items": [ + 11432.5, + 2.6624999046325684 + ], + "hints": { + "index": 21804 + } + }, + { + "items": [ + 11433, + 2.5005 + ], + "hints": { + "index": 21805 + } + }, + { + "items": [ + 11433.5, + 2.6175999641418457 + ], + "hints": { + "index": 21806 + } + }, + { + "items": [ + 11434, + 2.7974 + ], + "hints": { + "index": 21807 + } + }, + { + "items": [ + 11434.5, + 2.9572 + ], + "hints": { + "index": 21808 + } + }, + { + "items": [ + 11435, + 2.798 + ], + "hints": { + "index": 21809 + } + }, + { + "items": [ + 11435.5, + 2.7983 + ], + "hints": { + "index": 21810 + } + }, + { + "items": [ + 11436, + 2.9278 + ], + "hints": { + "index": 21811 + } + }, + { + "items": [ + 11436.5, + 2.9357 + ], + "hints": { + "index": 21812 + } + }, + { + "items": [ + 11437, + 2.8973 + ], + "hints": { + "index": 21813 + } + }, + { + "items": [ + 11437.5, + 2.7218 + ], + "hints": { + "index": 21814 + } + }, + { + "items": [ + 11438, + 2.5882 + ], + "hints": { + "index": 21815 + } + }, + { + "items": [ + 11438.5, + 2.6416 + ], + "hints": { + "index": 21816 + } + }, + { + "items": [ + 11439, + 2.6947 + ], + "hints": { + "index": 21817 + } + }, + { + "items": [ + 11439.5, + 2.8048 + ], + "hints": { + "index": 21818 + } + }, + { + "items": [ + 11440, + 2.6897 + ], + "hints": { + "index": 21819 + } + }, + { + "items": [ + 11440.5, + 2.6447 + ], + "hints": { + "index": 21820 + } + }, + { + "items": [ + 11441, + 2.6262 + ], + "hints": { + "index": 21821 + } + }, + { + "items": [ + 11441.5, + 2.7767999172210693 + ], + "hints": { + "index": 21822 + } + }, + { + "items": [ + 11442, + 2.7233 + ], + "hints": { + "index": 21823 + } + }, + { + "items": [ + 11442.5, + 2.7376 + ], + "hints": { + "index": 21824 + } + }, + { + "items": [ + 11443, + 2.571 + ], + "hints": { + "index": 21825 + } + }, + { + "items": [ + 11443.5, + 2.6545000076293945 + ], + "hints": { + "index": 21826 + } + }, + { + "items": [ + 11444, + 2.7688 + ], + "hints": { + "index": 21827 + } + }, + { + "items": [ + 11444.5, + 3.0549 + ], + "hints": { + "index": 21828 + } + }, + { + "items": [ + 11445, + 3.0225999355316162 + ], + "hints": { + "index": 21829 + } + }, + { + "items": [ + 11445.5, + 2.8919 + ], + "hints": { + "index": 21830 + } + }, + { + "items": [ + 11446, + 2.7695 + ], + "hints": { + "index": 21831 + } + }, + { + "items": [ + 11446.5, + 2.783 + ], + "hints": { + "index": 21832 + } + }, + { + "items": [ + 11447, + 2.9454 + ], + "hints": { + "index": 21833 + } + }, + { + "items": [ + 11447.5, + 2.901900053024292 + ], + "hints": { + "index": 21834 + } + }, + { + "items": [ + 11448, + 2.8582000732421875 + ], + "hints": { + "index": 21835 + } + }, + { + "items": [ + 11448.5, + 2.6552999019622803 + ], + "hints": { + "index": 21836 + } + }, + { + "items": [ + 11449, + 2.7384 + ], + "hints": { + "index": 21837 + } + }, + { + "items": [ + 11449.5, + 2.9109 + ], + "hints": { + "index": 21838 + } + }, + { + "items": [ + 11450, + 3.0641 + ], + "hints": { + "index": 21839 + } + }, + { + "items": [ + 11450.5, + 2.903 + ], + "hints": { + "index": 21840 + } + }, + { + "items": [ + 11451, + 2.8282999992370605 + ], + "hints": { + "index": 21841 + } + }, + { + "items": [ + 11451.5, + 2.8777999877929688 + ], + "hints": { + "index": 21842 + } + }, + { + "items": [ + 11452, + 2.9827 + ], + "hints": { + "index": 21843 + } + }, + { + "items": [ + 11452.5, + 3.0914 + ], + "hints": { + "index": 21844 + } + }, + { + "items": [ + 11453, + 2.91729998588562 + ], + "hints": { + "index": 21845 + } + }, + { + "items": [ + 11453.5, + 2.8106 + ], + "hints": { + "index": 21846 + } + }, + { + "items": [ + 11454, + 2.7461 + ], + "hints": { + "index": 21847 + } + }, + { + "items": [ + 11454.5, + 2.8329 + ], + "hints": { + "index": 21848 + } + }, + { + "items": [ + 11455, + 2.9965000152587891 + ], + "hints": { + "index": 21849 + } + }, + { + "items": [ + 11455.5, + 2.9303998947143555 + ], + "hints": { + "index": 21850 + } + }, + { + "items": [ + 11456, + 2.8417999744415283 + ], + "hints": { + "index": 21851 + } + }, + { + "items": [ + 11456.5, + 2.7276999950408936 + ], + "hints": { + "index": 21852 + } + }, + { + "items": [ + 11457, + 2.7781000137329106 + ], + "hints": { + "index": 21853 + } + }, + { + "items": [ + 11457.5, + 2.8770999908447266 + ], + "hints": { + "index": 21854 + } + }, + { + "items": [ + 11458, + 2.8339 + ], + "hints": { + "index": 21855 + } + }, + { + "items": [ + 11458.5, + 2.8203001022338867 + ], + "hints": { + "index": 21856 + } + }, + { + "items": [ + 11459, + 2.8494999408721924 + ], + "hints": { + "index": 21857 + } + }, + { + "items": [ + 11459.5, + 3.0285000801086426 + ], + "hints": { + "index": 21858 + } + }, + { + "items": [ + 11460, + 2.9558999538421631 + ], + "hints": { + "index": 21859 + } + }, + { + "items": [ + 11460.5, + 2.9110000133514404 + ], + "hints": { + "index": 21860 + } + }, + { + "items": [ + 11461, + 2.7400999069213867 + ], + "hints": { + "index": 21861 + } + }, + { + "items": [ + 11461.5, + 2.9100000858306885 + ], + "hints": { + "index": 21862 + } + }, + { + "items": [ + 11462, + 3.089400053024292 + ], + "hints": { + "index": 21863 + } + }, + { + "items": [ + 11462.5, + 3.2328999042510982 + ], + "hints": { + "index": 21864 + } + }, + { + "items": [ + 11463, + 3.1439 + ], + "hints": { + "index": 21865 + } + }, + { + "items": [ + 11463.5, + 2.9734001159667969 + ], + "hints": { + "index": 21866 + } + }, + { + "items": [ + 11464, + 2.8956000804901123 + ], + "hints": { + "index": 21867 + } + }, + { + "items": [ + 11464.5, + 3.0613 + ], + "hints": { + "index": 21868 + } + }, + { + "items": [ + 11465, + 3.1108999252319336 + ], + "hints": { + "index": 21869 + } + }, + { + "items": [ + 11465.5, + 2.9782 + ], + "hints": { + "index": 21870 + } + }, + { + "items": [ + 11466, + 2.7839000225067139 + ], + "hints": { + "index": 21871 + } + }, + { + "items": [ + 11466.5, + 2.9038999080657959 + ], + "hints": { + "index": 21872 + } + }, + { + "items": [ + 11467, + 2.9600999355316162 + ], + "hints": { + "index": 21873 + } + }, + { + "items": [ + 11467.5, + 2.9570000171661377 + ], + "hints": { + "index": 21874 + } + }, + { + "items": [ + 11468, + 2.7625999450683594 + ], + "hints": { + "index": 21875 + } + }, + { + "items": [ + 11468.5, + 2.8320000171661377 + ], + "hints": { + "index": 21876 + } + }, + { + "items": [ + 11469, + 2.9539999961853027 + ], + "hints": { + "index": 21877 + } + }, + { + "items": [ + 11469.5, + 3.1731 + ], + "hints": { + "index": 21878 + } + }, + { + "items": [ + 11470, + 3.3473999500274658 + ], + "hints": { + "index": 21879 + } + }, + { + "items": [ + 11470.5, + 3.3394 + ], + "hints": { + "index": 21880 + } + }, + { + "items": [ + 11471, + 3.212899923324585 + ], + "hints": { + "index": 21881 + } + }, + { + "items": [ + 11471.5, + 3.4038999080657959 + ], + "hints": { + "index": 21882 + } + }, + { + "items": [ + 11472, + 3.3098 + ], + "hints": { + "index": 21883 + } + }, + { + "items": [ + 11472.5, + 3.3492000102996826 + ], + "hints": { + "index": 21884 + } + }, + { + "items": [ + 11473, + 2.9295 + ], + "hints": { + "index": 21885 + } + }, + { + "items": [ + 11473.5, + 2.9405 + ], + "hints": { + "index": 21886 + } + }, + { + "items": [ + 11474, + 2.9197 + ], + "hints": { + "index": 21887 + } + }, + { + "items": [ + 11474.5, + 3.0961 + ], + "hints": { + "index": 21888 + } + }, + { + "items": [ + 11475, + 2.9883 + ], + "hints": { + "index": 21889 + } + }, + { + "items": [ + 11475.5, + 2.9035999774932861 + ], + "hints": { + "index": 21890 + } + }, + { + "items": [ + 11476, + 2.8022 + ], + "hints": { + "index": 21891 + } + }, + { + "items": [ + 11476.5, + 2.8928999900817871 + ], + "hints": { + "index": 21892 + } + }, + { + "items": [ + 11477, + 2.9517 + ], + "hints": { + "index": 21893 + } + }, + { + "items": [ + 11477.5, + 2.86899995803833 + ], + "hints": { + "index": 21894 + } + }, + { + "items": [ + 11478, + 2.8571 + ], + "hints": { + "index": 21895 + } + }, + { + "items": [ + 11478.5, + 2.6915 + ], + "hints": { + "index": 21896 + } + }, + { + "items": [ + 11479, + 2.7195 + ], + "hints": { + "index": 21897 + } + }, + { + "items": [ + 11479.5, + 2.7674000263214111 + ], + "hints": { + "index": 21898 + } + }, + { + "items": [ + 11480, + 2.8136999607086186 + ], + "hints": { + "index": 21899 + } + }, + { + "items": [ + 11480.5, + 2.8146 + ], + "hints": { + "index": 21900 + } + }, + { + "items": [ + 11481, + 2.83489990234375 + ], + "hints": { + "index": 21901 + } + }, + { + "items": [ + 11481.5, + 2.978 + ], + "hints": { + "index": 21902 + } + }, + { + "items": [ + 11482, + 3.2318 + ], + "hints": { + "index": 21903 + } + }, + { + "items": [ + 11482.5, + 3.1685 + ], + "hints": { + "index": 21904 + } + }, + { + "items": [ + 11483, + 3.0053 + ], + "hints": { + "index": 21905 + } + }, + { + "items": [ + 11483.5, + 2.8222000598907471 + ], + "hints": { + "index": 21906 + } + }, + { + "items": [ + 11484, + 2.771 + ], + "hints": { + "index": 21907 + } + }, + { + "items": [ + 11484.5, + 2.685 + ], + "hints": { + "index": 21908 + } + }, + { + "items": [ + 11485, + 2.6213 + ], + "hints": { + "index": 21909 + } + }, + { + "items": [ + 11485.5, + 2.6275 + ], + "hints": { + "index": 21910 + } + }, + { + "items": [ + 11486, + 2.7575 + ], + "hints": { + "index": 21911 + } + }, + { + "items": [ + 11486.5, + 2.81850004196167 + ], + "hints": { + "index": 21912 + } + }, + { + "items": [ + 11487, + 2.8203001022338867 + ], + "hints": { + "index": 21913 + } + }, + { + "items": [ + 11487.5, + 2.8020000457763672 + ], + "hints": { + "index": 21914 + } + }, + { + "items": [ + 11488, + 2.6889 + ], + "hints": { + "index": 21915 + } + }, + { + "items": [ + 11488.5, + 2.6559000015258789 + ], + "hints": { + "index": 21916 + } + }, + { + "items": [ + 11489, + 2.6563 + ], + "hints": { + "index": 21917 + } + }, + { + "items": [ + 11489.5, + 2.7302999496459961 + ], + "hints": { + "index": 21918 + } + }, + { + "items": [ + 11490, + 2.7874 + ], + "hints": { + "index": 21919 + } + }, + { + "items": [ + 11490.5, + 2.7658998966217041 + ], + "hints": { + "index": 21920 + } + }, + { + "items": [ + 11491, + 2.7270998954772949 + ], + "hints": { + "index": 21921 + } + }, + { + "items": [ + 11491.5, + 2.684499979019165 + ], + "hints": { + "index": 21922 + } + }, + { + "items": [ + 11492, + 2.7140998840332031 + ], + "hints": { + "index": 21923 + } + }, + { + "items": [ + 11492.5, + 2.8443000316619873 + ], + "hints": { + "index": 21924 + } + }, + { + "items": [ + 11493, + 2.9924 + ], + "hints": { + "index": 21925 + } + }, + { + "items": [ + 11493.5, + 3.111799955368042 + ], + "hints": { + "index": 21926 + } + }, + { + "items": [ + 11494, + 3.5554 + ], + "hints": { + "index": 21927 + } + }, + { + "items": [ + 11494.5, + 4.3091 + ], + "hints": { + "index": 21928 + } + }, + { + "items": [ + 11495, + 4.6618 + ], + "hints": { + "index": 21929 + } + }, + { + "items": [ + 11495.5, + 4.09689998626709 + ], + "hints": { + "index": 21930 + } + }, + { + "items": [ + 11496, + 3.4553000926971436 + ], + "hints": { + "index": 21931 + } + }, + { + "items": [ + 11496.5, + 3.4712998867034912 + ], + "hints": { + "index": 21932 + } + }, + { + "items": [ + 11497, + 3.4374 + ], + "hints": { + "index": 21933 + } + }, + { + "items": [ + 11497.5, + 3.5717000961303711 + ], + "hints": { + "index": 21934 + } + }, + { + "items": [ + 11498, + 3.2804000377655029 + ], + "hints": { + "index": 21935 + } + }, + { + "items": [ + 11498.5, + 3.1282 + ], + "hints": { + "index": 21936 + } + }, + { + "items": [ + 11499, + 3.1414000988006592 + ], + "hints": { + "index": 21937 + } + }, + { + "items": [ + 11499.5, + 3.1582000255584717 + ], + "hints": { + "index": 21938 + } + }, + { + "items": [ + 11500, + 3.167200088500977 + ], + "hints": { + "index": 21939 + } + }, + { + "items": [ + 11500.5, + 2.8842000961303711 + ], + "hints": { + "index": 21940 + } + }, + { + "items": [ + 11501, + 2.8395 + ], + "hints": { + "index": 21941 + } + }, + { + "items": [ + 11501.5, + 2.9128 + ], + "hints": { + "index": 21942 + } + }, + { + "items": [ + 11502, + 3.136 + ], + "hints": { + "index": 21943 + } + }, + { + "items": [ + 11502.5, + 3.075700044631958 + ], + "hints": { + "index": 21944 + } + }, + { + "items": [ + 11503, + 2.8373000621795654 + ], + "hints": { + "index": 21945 + } + }, + { + "items": [ + 11503.5, + 2.7441999912261963 + ], + "hints": { + "index": 21946 + } + }, + { + "items": [ + 11504, + 2.9281001091003418 + ], + "hints": { + "index": 21947 + } + }, + { + "items": [ + 11504.5, + 3.1434 + ], + "hints": { + "index": 21948 + } + }, + { + "items": [ + 11505, + 3.08 + ], + "hints": { + "index": 21949 + } + }, + { + "items": [ + 11505.5, + 2.8933 + ], + "hints": { + "index": 21950 + } + }, + { + "items": [ + 11506, + 2.8382000923156734 + ], + "hints": { + "index": 21951 + } + }, + { + "items": [ + 11506.5, + 2.974 + ], + "hints": { + "index": 21952 + } + }, + { + "items": [ + 11507, + 2.9660000801086426 + ], + "hints": { + "index": 21953 + } + }, + { + "items": [ + 11507.5, + 2.9733 + ], + "hints": { + "index": 21954 + } + }, + { + "items": [ + 11508, + 2.77620005607605 + ], + "hints": { + "index": 21955 + } + }, + { + "items": [ + 11508.5, + 2.8868 + ], + "hints": { + "index": 21956 + } + }, + { + "items": [ + 11509, + 2.9055 + ], + "hints": { + "index": 21957 + } + }, + { + "items": [ + 11509.5, + 3.079 + ], + "hints": { + "index": 21958 + } + }, + { + "items": [ + 11510, + 2.9634 + ], + "hints": { + "index": 21959 + } + }, + { + "items": [ + 11510.5, + 2.9479999542236328 + ], + "hints": { + "index": 21960 + } + }, + { + "items": [ + 11511, + 2.872999906539917 + ], + "hints": { + "index": 21961 + } + }, + { + "items": [ + 11511.5, + 2.8554000854492188 + ], + "hints": { + "index": 21962 + } + }, + { + "items": [ + 11512, + 2.9803 + ], + "hints": { + "index": 21963 + } + }, + { + "items": [ + 11512.5, + 3.0329000949859619 + ], + "hints": { + "index": 21964 + } + }, + { + "items": [ + 11513, + 3.0596 + ], + "hints": { + "index": 21965 + } + }, + { + "items": [ + 11513.5, + 2.8694999217987061 + ], + "hints": { + "index": 21966 + } + }, + { + "items": [ + 11514, + 2.8389999866485596 + ], + "hints": { + "index": 21967 + } + }, + { + "items": [ + 11514.5, + 2.894399881362915 + ], + "hints": { + "index": 21968 + } + }, + { + "items": [ + 11515, + 3.0348999500274658 + ], + "hints": { + "index": 21969 + } + }, + { + "items": [ + 11515.5, + 3.0555000305175781 + ], + "hints": { + "index": 21970 + } + }, + { + "items": [ + 11516, + 2.9711000919342041 + ], + "hints": { + "index": 21971 + } + }, + { + "items": [ + 11516.5, + 2.8515999317169189 + ], + "hints": { + "index": 21972 + } + }, + { + "items": [ + 11517, + 2.9307 + ], + "hints": { + "index": 21973 + } + }, + { + "items": [ + 11517.5, + 3.0027000904083252 + ], + "hints": { + "index": 21974 + } + }, + { + "items": [ + 11518, + 2.940000057220459 + ], + "hints": { + "index": 21975 + } + }, + { + "items": [ + 11518.5, + 2.8239 + ], + "hints": { + "index": 21976 + } + }, + { + "items": [ + 11519, + 2.8607 + ], + "hints": { + "index": 21977 + } + }, + { + "items": [ + 11519.5, + 3.086899995803833 + ], + "hints": { + "index": 21978 + } + }, + { + "items": [ + 11520, + 3.2685 + ], + "hints": { + "index": 21979 + } + }, + { + "items": [ + 11520.5, + 3.2417 + ], + "hints": { + "index": 21980 + } + }, + { + "items": [ + 11521, + 2.9491 + ], + "hints": { + "index": 21981 + } + }, + { + "items": [ + 11521.5, + 2.8176 + ], + "hints": { + "index": 21982 + } + }, + { + "items": [ + 11522, + 2.7873 + ], + "hints": { + "index": 21983 + } + }, + { + "items": [ + 11522.5, + 2.9673 + ], + "hints": { + "index": 21984 + } + }, + { + "items": [ + 11523, + 3.109 + ], + "hints": { + "index": 21985 + } + }, + { + "items": [ + 11523.5, + 3.1468000411987305 + ], + "hints": { + "index": 21986 + } + }, + { + "items": [ + 11524, + 2.9770998954772949 + ], + "hints": { + "index": 21987 + } + }, + { + "items": [ + 11524.5, + 3.088900089263916 + ], + "hints": { + "index": 21988 + } + }, + { + "items": [ + 11525, + 3.2567 + ], + "hints": { + "index": 21989 + } + }, + { + "items": [ + 11525.5, + 3.3935 + ], + "hints": { + "index": 21990 + } + }, + { + "items": [ + 11526, + 3.1584000587463379 + ], + "hints": { + "index": 21991 + } + }, + { + "items": [ + 11526.5, + 2.799799919128418 + ], + "hints": { + "index": 21992 + } + }, + { + "items": [ + 11527, + 2.7469 + ], + "hints": { + "index": 21993 + } + }, + { + "items": [ + 11527.5, + 2.8514 + ], + "hints": { + "index": 21994 + } + }, + { + "items": [ + 11528, + 3.2203 + ], + "hints": { + "index": 21995 + } + }, + { + "items": [ + 11528.5, + 3.2595 + ], + "hints": { + "index": 21996 + } + }, + { + "items": [ + 11529, + 3.0124 + ], + "hints": { + "index": 21997 + } + }, + { + "items": [ + 11529.5, + 2.7361 + ], + "hints": { + "index": 21998 + } + }, + { + "items": [ + 11530, + 2.7722001075744629 + ], + "hints": { + "index": 21999 + } + }, + { + "items": [ + 11530.5, + 2.8986001014709473 + ], + "hints": { + "index": 22000 + } + }, + { + "items": [ + 11531, + 2.9124999046325684 + ], + "hints": { + "index": 22001 + } + }, + { + "items": [ + 11531.5, + 2.743 + ], + "hints": { + "index": 22002 + } + }, + { + "items": [ + 11532, + 2.787100076675415 + ], + "hints": { + "index": 22003 + } + }, + { + "items": [ + 11532.5, + 2.8266 + ], + "hints": { + "index": 22004 + } + }, + { + "items": [ + 11533, + 2.92770004272461 + ], + "hints": { + "index": 22005 + } + }, + { + "items": [ + 11533.5, + 2.8145999908447266 + ], + "hints": { + "index": 22006 + } + }, + { + "items": [ + 11534, + 2.9040999412536621 + ], + "hints": { + "index": 22007 + } + }, + { + "items": [ + 11534.5, + 2.9530999660491943 + ], + "hints": { + "index": 22008 + } + }, + { + "items": [ + 11535, + 2.9386000633239746 + ], + "hints": { + "index": 22009 + } + }, + { + "items": [ + 11535.5, + 2.8227999210357666 + ], + "hints": { + "index": 22010 + } + }, + { + "items": [ + 11536, + 2.7978999614715576 + ], + "hints": { + "index": 22011 + } + }, + { + "items": [ + 11536.5, + 2.8629000186920166 + ], + "hints": { + "index": 22012 + } + }, + { + "items": [ + 11537, + 2.8321 + ], + "hints": { + "index": 22013 + } + }, + { + "items": [ + 11537.5, + 2.8187 + ], + "hints": { + "index": 22014 + } + }, + { + "items": [ + 11538, + 2.7522 + ], + "hints": { + "index": 22015 + } + }, + { + "items": [ + 11538.5, + 2.8464 + ], + "hints": { + "index": 22016 + } + }, + { + "items": [ + 11539, + 2.9237 + ], + "hints": { + "index": 22017 + } + }, + { + "items": [ + 11539.5, + 3.1703 + ], + "hints": { + "index": 22018 + } + }, + { + "items": [ + 11540, + 3.431 + ], + "hints": { + "index": 22019 + } + }, + { + "items": [ + 11540.5, + 3.5520999431610107 + ], + "hints": { + "index": 22020 + } + }, + { + "items": [ + 11541, + 3.3359000682830811 + ], + "hints": { + "index": 22021 + } + }, + { + "items": [ + 11541.5, + 3.0732998847961426 + ], + "hints": { + "index": 22022 + } + }, + { + "items": [ + 11542, + 3.0532000064849858 + ], + "hints": { + "index": 22023 + } + }, + { + "items": [ + 11542.5, + 3.2504 + ], + "hints": { + "index": 22024 + } + }, + { + "items": [ + 11543, + 3.3420999050140381 + ], + "hints": { + "index": 22025 + } + }, + { + "items": [ + 11543.5, + 3.1510000228881836 + ], + "hints": { + "index": 22026 + } + }, + { + "items": [ + 11544, + 2.813499927520752 + ], + "hints": { + "index": 22027 + } + }, + { + "items": [ + 11544.5, + 2.7136 + ], + "hints": { + "index": 22028 + } + }, + { + "items": [ + 11545, + 2.9309 + ], + "hints": { + "index": 22029 + } + }, + { + "items": [ + 11545.5, + 3.1168 + ], + "hints": { + "index": 22030 + } + }, + { + "items": [ + 11546, + 3.1571 + ], + "hints": { + "index": 22031 + } + }, + { + "items": [ + 11546.5, + 2.9445 + ], + "hints": { + "index": 22032 + } + }, + { + "items": [ + 11547, + 2.9622 + ], + "hints": { + "index": 22033 + } + }, + { + "items": [ + 11547.5, + 3.0358 + ], + "hints": { + "index": 22034 + } + }, + { + "items": [ + 11548, + 3.2296 + ], + "hints": { + "index": 22035 + } + }, + { + "items": [ + 11548.5, + 3.1615 + ], + "hints": { + "index": 22036 + } + }, + { + "items": [ + 11549, + 2.97790002822876 + ], + "hints": { + "index": 22037 + } + }, + { + "items": [ + 11549.5, + 2.8029 + ], + "hints": { + "index": 22038 + } + }, + { + "items": [ + 11550, + 2.9642 + ], + "hints": { + "index": 22039 + } + }, + { + "items": [ + 11550.5, + 3.1266999244689941 + ], + "hints": { + "index": 22040 + } + }, + { + "items": [ + 11551, + 3.1941 + ], + "hints": { + "index": 22041 + } + }, + { + "items": [ + 11551.5, + 2.9908 + ], + "hints": { + "index": 22042 + } + }, + { + "items": [ + 11552, + 2.8427999019622803 + ], + "hints": { + "index": 22043 + } + }, + { + "items": [ + 11552.5, + 2.9165000915527344 + ], + "hints": { + "index": 22044 + } + }, + { + "items": [ + 11553, + 3.11680006980896 + ], + "hints": { + "index": 22045 + } + }, + { + "items": [ + 11553.5, + 3.2725999355316162 + ], + "hints": { + "index": 22046 + } + }, + { + "items": [ + 11554, + 3.0761001110076904 + ], + "hints": { + "index": 22047 + } + }, + { + "items": [ + 11554.5, + 2.8341999053955078 + ], + "hints": { + "index": 22048 + } + }, + { + "items": [ + 11555, + 2.8076 + ], + "hints": { + "index": 22049 + } + }, + { + "items": [ + 11555.5, + 2.8581 + ], + "hints": { + "index": 22050 + } + }, + { + "items": [ + 11556, + 2.9448 + ], + "hints": { + "index": 22051 + } + }, + { + "items": [ + 11556.5, + 2.8575000762939453 + ], + "hints": { + "index": 22052 + } + }, + { + "items": [ + 11557, + 2.859699964523315 + ], + "hints": { + "index": 22053 + } + }, + { + "items": [ + 11557.5, + 3.0004000663757324 + ], + "hints": { + "index": 22054 + } + }, + { + "items": [ + 11558, + 3.0620999336242676 + ], + "hints": { + "index": 22055 + } + }, + { + "items": [ + 11558.5, + 3.0420000553131104 + ], + "hints": { + "index": 22056 + } + }, + { + "items": [ + 11559, + 2.850600004196167 + ], + "hints": { + "index": 22057 + } + }, + { + "items": [ + 11559.5, + 2.8001 + ], + "hints": { + "index": 22058 + } + }, + { + "items": [ + 11560, + 2.7883 + ], + "hints": { + "index": 22059 + } + }, + { + "items": [ + 11560.5, + 2.7093 + ], + "hints": { + "index": 22060 + } + }, + { + "items": [ + 11561, + 2.6518 + ], + "hints": { + "index": 22061 + } + }, + { + "items": [ + 11561.5, + 2.54259991645813 + ], + "hints": { + "index": 22062 + } + }, + { + "items": [ + 11562, + 2.5901000499725342 + ], + "hints": { + "index": 22063 + } + }, + { + "items": [ + 11562.5, + 2.6644 + ], + "hints": { + "index": 22064 + } + }, + { + "items": [ + 11563, + 2.8369 + ], + "hints": { + "index": 22065 + } + }, + { + "items": [ + 11563.5, + 2.9131 + ], + "hints": { + "index": 22066 + } + }, + { + "items": [ + 11564, + 2.8568000793457031 + ], + "hints": { + "index": 22067 + } + }, + { + "items": [ + 11564.5, + 2.9008 + ], + "hints": { + "index": 22068 + } + }, + { + "items": [ + 11565, + 2.8513 + ], + "hints": { + "index": 22069 + } + }, + { + "items": [ + 11565.5, + 2.8768 + ], + "hints": { + "index": 22070 + } + }, + { + "items": [ + 11566, + 2.7211 + ], + "hints": { + "index": 22071 + } + }, + { + "items": [ + 11566.5, + 2.6902 + ], + "hints": { + "index": 22072 + } + }, + { + "items": [ + 11567, + 2.7475 + ], + "hints": { + "index": 22073 + } + }, + { + "items": [ + 11567.5, + 2.8436 + ], + "hints": { + "index": 22074 + } + }, + { + "items": [ + 11568, + 2.9008998870849609 + ], + "hints": { + "index": 22075 + } + }, + { + "items": [ + 11568.5, + 2.7638 + ], + "hints": { + "index": 22076 + } + }, + { + "items": [ + 11569, + 2.7025001049041748 + ], + "hints": { + "index": 22077 + } + }, + { + "items": [ + 11569.5, + 2.7145 + ], + "hints": { + "index": 22078 + } + }, + { + "items": [ + 11570, + 2.7364 + ], + "hints": { + "index": 22079 + } + }, + { + "items": [ + 11570.5, + 2.7119 + ], + "hints": { + "index": 22080 + } + }, + { + "items": [ + 11571, + 2.6788 + ], + "hints": { + "index": 22081 + } + }, + { + "items": [ + 11571.5, + 2.7365 + ], + "hints": { + "index": 22082 + } + }, + { + "items": [ + 11572, + 2.8209 + ], + "hints": { + "index": 22083 + } + }, + { + "items": [ + 11572.5, + 2.9551000595092773 + ], + "hints": { + "index": 22084 + } + }, + { + "items": [ + 11573, + 2.8715 + ], + "hints": { + "index": 22085 + } + }, + { + "items": [ + 11573.5, + 2.7698 + ], + "hints": { + "index": 22086 + } + }, + { + "items": [ + 11574, + 2.643 + ], + "hints": { + "index": 22087 + } + }, + { + "items": [ + 11574.5, + 2.7998 + ], + "hints": { + "index": 22088 + } + }, + { + "items": [ + 11575, + 2.9099 + ], + "hints": { + "index": 22089 + } + }, + { + "items": [ + 11575.5, + 3.0206000804901123 + ], + "hints": { + "index": 22090 + } + }, + { + "items": [ + 11576, + 2.8931999206542969 + ], + "hints": { + "index": 22091 + } + }, + { + "items": [ + 11576.5, + 2.9636 + ], + "hints": { + "index": 22092 + } + }, + { + "items": [ + 11577, + 3.0003 + ], + "hints": { + "index": 22093 + } + }, + { + "items": [ + 11577.5, + 3.0845000743865967 + ], + "hints": { + "index": 22094 + } + }, + { + "items": [ + 11578, + 3.0727999210357666 + ], + "hints": { + "index": 22095 + } + }, + { + "items": [ + 11578.5, + 2.9047 + ], + "hints": { + "index": 22096 + } + }, + { + "items": [ + 11579, + 2.843 + ], + "hints": { + "index": 22097 + } + }, + { + "items": [ + 11579.5, + 2.8305 + ], + "hints": { + "index": 22098 + } + }, + { + "items": [ + 11580, + 2.9148 + ], + "hints": { + "index": 22099 + } + }, + { + "items": [ + 11580.5, + 2.9951999187469478 + ], + "hints": { + "index": 22100 + } + }, + { + "items": [ + 11581, + 2.9533998966217041 + ], + "hints": { + "index": 22101 + } + }, + { + "items": [ + 11581.5, + 2.9054 + ], + "hints": { + "index": 22102 + } + }, + { + "items": [ + 11582, + 2.951200008392334 + ], + "hints": { + "index": 22103 + } + }, + { + "items": [ + 11582.5, + 3.1065 + ], + "hints": { + "index": 22104 + } + }, + { + "items": [ + 11583, + 3.222 + ], + "hints": { + "index": 22105 + } + }, + { + "items": [ + 11583.5, + 3.0893 + ], + "hints": { + "index": 22106 + } + }, + { + "items": [ + 11584, + 2.8962 + ], + "hints": { + "index": 22107 + } + }, + { + "items": [ + 11584.5, + 2.9205 + ], + "hints": { + "index": 22108 + } + }, + { + "items": [ + 11585, + 3.0566 + ], + "hints": { + "index": 22109 + } + }, + { + "items": [ + 11585.5, + 3.3391 + ], + "hints": { + "index": 22110 + } + }, + { + "items": [ + 11586, + 3.2711000442504883 + ], + "hints": { + "index": 22111 + } + }, + { + "items": [ + 11586.5, + 3.0546998977661133 + ], + "hints": { + "index": 22112 + } + }, + { + "items": [ + 11587, + 2.7193999290466309 + ], + "hints": { + "index": 22113 + } + }, + { + "items": [ + 11587.5, + 2.7248 + ], + "hints": { + "index": 22114 + } + }, + { + "items": [ + 11588, + 2.8765 + ], + "hints": { + "index": 22115 + } + }, + { + "items": [ + 11588.5, + 3.0959 + ], + "hints": { + "index": 22116 + } + }, + { + "items": [ + 11589, + 3.2939 + ], + "hints": { + "index": 22117 + } + }, + { + "items": [ + 11589.5, + 3.400399923324585 + ], + "hints": { + "index": 22118 + } + }, + { + "items": [ + 11590, + 3.2298 + ], + "hints": { + "index": 22119 + } + }, + { + "items": [ + 11590.5, + 3.0744 + ], + "hints": { + "index": 22120 + } + }, + { + "items": [ + 11591, + 3.0118999481201172 + ], + "hints": { + "index": 22121 + } + }, + { + "items": [ + 11591.5, + 2.9017999172210693 + ], + "hints": { + "index": 22122 + } + }, + { + "items": [ + 11592, + 2.7039000988006592 + ], + "hints": { + "index": 22123 + } + }, + { + "items": [ + 11592.5, + 2.6598999500274658 + ], + "hints": { + "index": 22124 + } + }, + { + "items": [ + 11593, + 2.7307000160217285 + ], + "hints": { + "index": 22125 + } + }, + { + "items": [ + 11593.5, + 2.8578999042510982 + ], + "hints": { + "index": 22126 + } + }, + { + "items": [ + 11594, + 2.8131 + ], + "hints": { + "index": 22127 + } + }, + { + "items": [ + 11594.5, + 2.878 + ], + "hints": { + "index": 22128 + } + }, + { + "items": [ + 11595, + 2.8474 + ], + "hints": { + "index": 22129 + } + }, + { + "items": [ + 11595.5, + 2.9599 + ], + "hints": { + "index": 22130 + } + }, + { + "items": [ + 11596, + 2.9571 + ], + "hints": { + "index": 22131 + } + }, + { + "items": [ + 11596.5, + 3.0473999977111816 + ], + "hints": { + "index": 22132 + } + }, + { + "items": [ + 11597, + 2.9588 + ], + "hints": { + "index": 22133 + } + }, + { + "items": [ + 11597.5, + 2.9665 + ], + "hints": { + "index": 22134 + } + }, + { + "items": [ + 11598, + 2.9958 + ], + "hints": { + "index": 22135 + } + }, + { + "items": [ + 11598.5, + 3.1098999977111816 + ], + "hints": { + "index": 22136 + } + }, + { + "items": [ + 11599, + 3.0037000179290771 + ], + "hints": { + "index": 22137 + } + }, + { + "items": [ + 11599.5, + 2.7884 + ], + "hints": { + "index": 22138 + } + }, + { + "items": [ + 11600, + 2.7307 + ], + "hints": { + "index": 22139 + } + }, + { + "items": [ + 11600.5, + 2.8584 + ], + "hints": { + "index": 22140 + } + }, + { + "items": [ + 11601, + 3.0216 + ], + "hints": { + "index": 22141 + } + }, + { + "items": [ + 11601.5, + 2.957799911499023 + ], + "hints": { + "index": 22142 + } + }, + { + "items": [ + 11602, + 2.8552999496459961 + ], + "hints": { + "index": 22143 + } + }, + { + "items": [ + 11602.5, + 2.9033 + ], + "hints": { + "index": 22144 + } + }, + { + "items": [ + 11603, + 2.9937000274658203 + ], + "hints": { + "index": 22145 + } + }, + { + "items": [ + 11603.5, + 3.0920999050140381 + ], + "hints": { + "index": 22146 + } + }, + { + "items": [ + 11604, + 3.0585999488830566 + ], + "hints": { + "index": 22147 + } + }, + { + "items": [ + 11604.5, + 3.0212 + ], + "hints": { + "index": 22148 + } + }, + { + "items": [ + 11605, + 2.9885 + ], + "hints": { + "index": 22149 + } + }, + { + "items": [ + 11605.5, + 3.0687999725341797 + ], + "hints": { + "index": 22150 + } + }, + { + "items": [ + 11606, + 3.1823 + ], + "hints": { + "index": 22151 + } + }, + { + "items": [ + 11606.5, + 3.1702 + ], + "hints": { + "index": 22152 + } + }, + { + "items": [ + 11607, + 3.0215 + ], + "hints": { + "index": 22153 + } + }, + { + "items": [ + 11607.5, + 2.8708000183105469 + ], + "hints": { + "index": 22154 + } + }, + { + "items": [ + 11608, + 2.9015998840332031 + ], + "hints": { + "index": 22155 + } + }, + { + "items": [ + 11608.5, + 3.0813 + ], + "hints": { + "index": 22156 + } + }, + { + "items": [ + 11609, + 3.2209999561309814 + ], + "hints": { + "index": 22157 + } + }, + { + "items": [ + 11609.5, + 3.2027 + ], + "hints": { + "index": 22158 + } + }, + { + "items": [ + 11610, + 3.2091 + ], + "hints": { + "index": 22159 + } + }, + { + "items": [ + 11610.5, + 3.1781 + ], + "hints": { + "index": 22160 + } + }, + { + "items": [ + 11611, + 3.2454 + ], + "hints": { + "index": 22161 + } + }, + { + "items": [ + 11611.5, + 3.2555999755859375 + ], + "hints": { + "index": 22162 + } + }, + { + "items": [ + 11612, + 3.1935 + ], + "hints": { + "index": 22163 + } + }, + { + "items": [ + 11612.5, + 2.9651 + ], + "hints": { + "index": 22164 + } + }, + { + "items": [ + 11613, + 2.9878 + ], + "hints": { + "index": 22165 + } + }, + { + "items": [ + 11613.5, + 3.0919 + ], + "hints": { + "index": 22166 + } + }, + { + "items": [ + 11614, + 3.38 + ], + "hints": { + "index": 22167 + } + }, + { + "items": [ + 11614.5, + 3.301300048828125 + ], + "hints": { + "index": 22168 + } + }, + { + "items": [ + 11615, + 3.2263998985290527 + ], + "hints": { + "index": 22169 + } + }, + { + "items": [ + 11615.5, + 3.0618000030517578 + ], + "hints": { + "index": 22170 + } + }, + { + "items": [ + 11616, + 2.8935 + ], + "hints": { + "index": 22171 + } + }, + { + "items": [ + 11616.5, + 2.7655999660491943 + ], + "hints": { + "index": 22172 + } + }, + { + "items": [ + 11617, + 2.8782 + ], + "hints": { + "index": 22173 + } + }, + { + "items": [ + 11617.5, + 2.94729995727539 + ], + "hints": { + "index": 22174 + } + }, + { + "items": [ + 11618, + 3.0194 + ], + "hints": { + "index": 22175 + } + }, + { + "items": [ + 11618.5, + 2.9323999881744385 + ], + "hints": { + "index": 22176 + } + }, + { + "items": [ + 11619, + 2.9567999839782715 + ], + "hints": { + "index": 22177 + } + }, + { + "items": [ + 11619.5, + 2.9588000774383545 + ], + "hints": { + "index": 22178 + } + }, + { + "items": [ + 11620, + 2.9331998825073242 + ], + "hints": { + "index": 22179 + } + }, + { + "items": [ + 11620.5, + 3.0220000743865967 + ], + "hints": { + "index": 22180 + } + }, + { + "items": [ + 11621, + 2.9894 + ], + "hints": { + "index": 22181 + } + }, + { + "items": [ + 11621.5, + 3.023900032043457 + ], + "hints": { + "index": 22182 + } + }, + { + "items": [ + 11622, + 2.8813 + ], + "hints": { + "index": 22183 + } + }, + { + "items": [ + 11622.5, + 2.9872 + ], + "hints": { + "index": 22184 + } + }, + { + "items": [ + 11623, + 2.966 + ], + "hints": { + "index": 22185 + } + }, + { + "items": [ + 11623.5, + 3.000499963760376 + ], + "hints": { + "index": 22186 + } + }, + { + "items": [ + 11624, + 2.9844999313354492 + ], + "hints": { + "index": 22187 + } + }, + { + "items": [ + 11624.5, + 2.9986999034881592 + ], + "hints": { + "index": 22188 + } + }, + { + "items": [ + 11625, + 3.2934 + ], + "hints": { + "index": 22189 + } + }, + { + "items": [ + 11625.5, + 3.3148999214172363 + ], + "hints": { + "index": 22190 + } + }, + { + "items": [ + 11626, + 3.2337000370025635 + ], + "hints": { + "index": 22191 + } + }, + { + "items": [ + 11626.5, + 2.9032 + ], + "hints": { + "index": 22192 + } + }, + { + "items": [ + 11627, + 2.9442000389099121 + ], + "hints": { + "index": 22193 + } + }, + { + "items": [ + 11627.5, + 3.0961000919342041 + ], + "hints": { + "index": 22194 + } + }, + { + "items": [ + 11628, + 3.1912999153137207 + ], + "hints": { + "index": 22195 + } + }, + { + "items": [ + 11628.5, + 2.9226999282836914 + ], + "hints": { + "index": 22196 + } + }, + { + "items": [ + 11629, + 2.7961 + ], + "hints": { + "index": 22197 + } + }, + { + "items": [ + 11629.5, + 2.7978 + ], + "hints": { + "index": 22198 + } + }, + { + "items": [ + 11630, + 3.0563 + ], + "hints": { + "index": 22199 + } + }, + { + "items": [ + 11630.5, + 3.100500106811523 + ], + "hints": { + "index": 22200 + } + }, + { + "items": [ + 11631, + 3.0088999271392822 + ], + "hints": { + "index": 22201 + } + }, + { + "items": [ + 11631.5, + 2.8329999446868896 + ], + "hints": { + "index": 22202 + } + }, + { + "items": [ + 11632, + 2.8124001026153564 + ], + "hints": { + "index": 22203 + } + }, + { + "items": [ + 11632.5, + 2.8761 + ], + "hints": { + "index": 22204 + } + }, + { + "items": [ + 11633, + 2.9307 + ], + "hints": { + "index": 22205 + } + }, + { + "items": [ + 11633.5, + 2.8310999870300293 + ], + "hints": { + "index": 22206 + } + }, + { + "items": [ + 11634, + 2.7249999046325684 + ], + "hints": { + "index": 22207 + } + }, + { + "items": [ + 11634.5, + 2.7162001132965088 + ], + "hints": { + "index": 22208 + } + }, + { + "items": [ + 11635, + 2.8015000820159912 + ], + "hints": { + "index": 22209 + } + }, + { + "items": [ + 11635.5, + 2.854 + ], + "hints": { + "index": 22210 + } + }, + { + "items": [ + 11636, + 2.8636000156402588 + ], + "hints": { + "index": 22211 + } + }, + { + "items": [ + 11636.5, + 2.8868000507354736 + ], + "hints": { + "index": 22212 + } + }, + { + "items": [ + 11637, + 2.978100061416626 + ], + "hints": { + "index": 22213 + } + }, + { + "items": [ + 11637.5, + 3.1035 + ], + "hints": { + "index": 22214 + } + }, + { + "items": [ + 11638, + 3.2295 + ], + "hints": { + "index": 22215 + } + }, + { + "items": [ + 11638.5, + 3.2654 + ], + "hints": { + "index": 22216 + } + }, + { + "items": [ + 11639, + 3.28410005569458 + ], + "hints": { + "index": 22217 + } + }, + { + "items": [ + 11639.5, + 3.4064 + ], + "hints": { + "index": 22218 + } + }, + { + "items": [ + 11640, + 3.3406999111175537 + ], + "hints": { + "index": 22219 + } + }, + { + "items": [ + 11640.5, + 3.367 + ], + "hints": { + "index": 22220 + } + }, + { + "items": [ + 11641, + 3.2332 + ], + "hints": { + "index": 22221 + } + }, + { + "items": [ + 11641.5, + 3.1291999816894531 + ], + "hints": { + "index": 22222 + } + }, + { + "items": [ + 11642, + 2.9527 + ], + "hints": { + "index": 22223 + } + }, + { + "items": [ + 11642.5, + 2.901 + ], + "hints": { + "index": 22224 + } + }, + { + "items": [ + 11643, + 3.0193 + ], + "hints": { + "index": 22225 + } + }, + { + "items": [ + 11643.5, + 2.9472 + ], + "hints": { + "index": 22226 + } + }, + { + "items": [ + 11644, + 2.9204 + ], + "hints": { + "index": 22227 + } + }, + { + "items": [ + 11644.5, + 2.8554000854492188 + ], + "hints": { + "index": 22228 + } + }, + { + "items": [ + 11645, + 3.0020999908447266 + ], + "hints": { + "index": 22229 + } + }, + { + "items": [ + 11645.5, + 3.0749 + ], + "hints": { + "index": 22230 + } + }, + { + "items": [ + 11646, + 3.1043999195098877 + ], + "hints": { + "index": 22231 + } + }, + { + "items": [ + 11646.5, + 3.0861001014709473 + ], + "hints": { + "index": 22232 + } + }, + { + "items": [ + 11647, + 3.0676999092102051 + ], + "hints": { + "index": 22233 + } + }, + { + "items": [ + 11647.5, + 2.9811000823974609 + ], + "hints": { + "index": 22234 + } + }, + { + "items": [ + 11648, + 2.95 + ], + "hints": { + "index": 22235 + } + }, + { + "items": [ + 11648.5, + 2.8078 + ], + "hints": { + "index": 22236 + } + }, + { + "items": [ + 11649, + 2.8779 + ], + "hints": { + "index": 22237 + } + }, + { + "items": [ + 11649.5, + 2.9688 + ], + "hints": { + "index": 22238 + } + }, + { + "items": [ + 11650, + 3.1647999286651611 + ], + "hints": { + "index": 22239 + } + }, + { + "items": [ + 11650.5, + 3.1194000244140625 + ], + "hints": { + "index": 22240 + } + }, + { + "items": [ + 11651, + 2.952 + ], + "hints": { + "index": 22241 + } + }, + { + "items": [ + 11651.5, + 2.9056 + ], + "hints": { + "index": 22242 + } + }, + { + "items": [ + 11652, + 3.1128 + ], + "hints": { + "index": 22243 + } + }, + { + "items": [ + 11652.5, + 3.2781 + ], + "hints": { + "index": 22244 + } + }, + { + "items": [ + 11653, + 3.1454 + ], + "hints": { + "index": 22245 + } + }, + { + "items": [ + 11653.5, + 2.9974000453948975 + ], + "hints": { + "index": 22246 + } + }, + { + "items": [ + 11654, + 2.94729995727539 + ], + "hints": { + "index": 22247 + } + }, + { + "items": [ + 11654.5, + 3.1928999423980713 + ], + "hints": { + "index": 22248 + } + }, + { + "items": [ + 11655, + 3.2898 + ], + "hints": { + "index": 22249 + } + }, + { + "items": [ + 11655.5, + 3.2046 + ], + "hints": { + "index": 22250 + } + }, + { + "items": [ + 11656, + 3.1219 + ], + "hints": { + "index": 22251 + } + }, + { + "items": [ + 11656.5, + 3.0213000774383545 + ], + "hints": { + "index": 22252 + } + }, + { + "items": [ + 11657, + 3.2130000591278076 + ], + "hints": { + "index": 22253 + } + }, + { + "items": [ + 11657.5, + 3.2478 + ], + "hints": { + "index": 22254 + } + }, + { + "items": [ + 11658, + 3.1565001010894775 + ], + "hints": { + "index": 22255 + } + }, + { + "items": [ + 11658.5, + 2.9996 + ], + "hints": { + "index": 22256 + } + }, + { + "items": [ + 11659, + 2.8486 + ], + "hints": { + "index": 22257 + } + }, + { + "items": [ + 11659.5, + 3.0104 + ], + "hints": { + "index": 22258 + } + }, + { + "items": [ + 11660, + 3.0941998958587646 + ], + "hints": { + "index": 22259 + } + }, + { + "items": [ + 11660.5, + 3.1321001052856445 + ], + "hints": { + "index": 22260 + } + }, + { + "items": [ + 11661, + 2.9721000194549561 + ], + "hints": { + "index": 22261 + } + }, + { + "items": [ + 11661.5, + 2.8285 + ], + "hints": { + "index": 22262 + } + }, + { + "items": [ + 11662, + 2.9316000938415527 + ], + "hints": { + "index": 22263 + } + }, + { + "items": [ + 11662.5, + 3.086999893188477 + ], + "hints": { + "index": 22264 + } + }, + { + "items": [ + 11663, + 3.1706 + ], + "hints": { + "index": 22265 + } + }, + { + "items": [ + 11663.5, + 3.0185 + ], + "hints": { + "index": 22266 + } + }, + { + "items": [ + 11664, + 2.7669000625610352 + ], + "hints": { + "index": 22267 + } + }, + { + "items": [ + 11664.5, + 2.6315 + ], + "hints": { + "index": 22268 + } + }, + { + "items": [ + 11665, + 2.6372 + ], + "hints": { + "index": 22269 + } + }, + { + "items": [ + 11665.5, + 2.706 + ], + "hints": { + "index": 22270 + } + }, + { + "items": [ + 11666, + 2.7335999011993408 + ], + "hints": { + "index": 22271 + } + }, + { + "items": [ + 11666.5, + 2.706899881362915 + ], + "hints": { + "index": 22272 + } + }, + { + "items": [ + 11667, + 2.7662 + ], + "hints": { + "index": 22273 + } + }, + { + "items": [ + 11667.5, + 2.8436000347137451 + ], + "hints": { + "index": 22274 + } + }, + { + "items": [ + 11668, + 2.91759991645813 + ], + "hints": { + "index": 22275 + } + }, + { + "items": [ + 11668.5, + 2.8053998947143555 + ], + "hints": { + "index": 22276 + } + }, + { + "items": [ + 11669, + 2.7483 + ], + "hints": { + "index": 22277 + } + }, + { + "items": [ + 11669.5, + 2.813499927520752 + ], + "hints": { + "index": 22278 + } + }, + { + "items": [ + 11670, + 3.2363 + ], + "hints": { + "index": 22279 + } + }, + { + "items": [ + 11670.5, + 3.6278 + ], + "hints": { + "index": 22280 + } + }, + { + "items": [ + 11671, + 3.6391 + ], + "hints": { + "index": 22281 + } + }, + { + "items": [ + 11671.5, + 3.2725999355316162 + ], + "hints": { + "index": 22282 + } + }, + { + "items": [ + 11672, + 3.1652998924255371 + ], + "hints": { + "index": 22283 + } + }, + { + "items": [ + 11672.5, + 3.3833 + ], + "hints": { + "index": 22284 + } + }, + { + "items": [ + 11673, + 3.5613999366760254 + ], + "hints": { + "index": 22285 + } + }, + { + "items": [ + 11673.5, + 3.4772 + ], + "hints": { + "index": 22286 + } + }, + { + "items": [ + 11674, + 3.2798 + ], + "hints": { + "index": 22287 + } + }, + { + "items": [ + 11674.5, + 3.1829 + ], + "hints": { + "index": 22288 + } + }, + { + "items": [ + 11675, + 3.4342 + ], + "hints": { + "index": 22289 + } + }, + { + "items": [ + 11675.5, + 3.5876998901367188 + ], + "hints": { + "index": 22290 + } + }, + { + "items": [ + 11676, + 3.3988 + ], + "hints": { + "index": 22291 + } + }, + { + "items": [ + 11676.5, + 3.0002 + ], + "hints": { + "index": 22292 + } + }, + { + "items": [ + 11677, + 2.8975 + ], + "hints": { + "index": 22293 + } + }, + { + "items": [ + 11677.5, + 2.9992 + ], + "hints": { + "index": 22294 + } + }, + { + "items": [ + 11678, + 3.0468 + ], + "hints": { + "index": 22295 + } + }, + { + "items": [ + 11678.5, + 2.8879001140594478 + ], + "hints": { + "index": 22296 + } + }, + { + "items": [ + 11679, + 2.7441000938415527 + ], + "hints": { + "index": 22297 + } + }, + { + "items": [ + 11679.5, + 2.8833999633789063 + ], + "hints": { + "index": 22298 + } + }, + { + "items": [ + 11680, + 2.9931 + ], + "hints": { + "index": 22299 + } + }, + { + "items": [ + 11680.5, + 3.0627000331878662 + ], + "hints": { + "index": 22300 + } + }, + { + "items": [ + 11681, + 2.9273 + ], + "hints": { + "index": 22301 + } + }, + { + "items": [ + 11681.5, + 2.9535000324249268 + ], + "hints": { + "index": 22302 + } + }, + { + "items": [ + 11682, + 2.968 + ], + "hints": { + "index": 22303 + } + }, + { + "items": [ + 11682.5, + 3.0680999755859375 + ], + "hints": { + "index": 22304 + } + }, + { + "items": [ + 11683, + 2.9902999401092529 + ], + "hints": { + "index": 22305 + } + }, + { + "items": [ + 11683.5, + 3.0436999797821045 + ], + "hints": { + "index": 22306 + } + }, + { + "items": [ + 11684, + 3.1458001136779785 + ], + "hints": { + "index": 22307 + } + }, + { + "items": [ + 11684.5, + 3.3220000267028809 + ], + "hints": { + "index": 22308 + } + }, + { + "items": [ + 11685, + 3.155 + ], + "hints": { + "index": 22309 + } + }, + { + "items": [ + 11685.5, + 2.888200044631958 + ], + "hints": { + "index": 22310 + } + }, + { + "items": [ + 11686, + 2.9242 + ], + "hints": { + "index": 22311 + } + }, + { + "items": [ + 11686.5, + 3.0579 + ], + "hints": { + "index": 22312 + } + }, + { + "items": [ + 11687, + 3.2754 + ], + "hints": { + "index": 22313 + } + }, + { + "items": [ + 11687.5, + 3.1761999130249023 + ], + "hints": { + "index": 22314 + } + }, + { + "items": [ + 11688, + 3.0136001110076904 + ], + "hints": { + "index": 22315 + } + }, + { + "items": [ + 11688.5, + 2.9184000492095947 + ], + "hints": { + "index": 22316 + } + }, + { + "items": [ + 11689, + 2.9061 + ], + "hints": { + "index": 22317 + } + }, + { + "items": [ + 11689.5, + 2.9451000690460205 + ], + "hints": { + "index": 22318 + } + }, + { + "items": [ + 11690, + 2.9447000026702881 + ], + "hints": { + "index": 22319 + } + }, + { + "items": [ + 11690.5, + 2.9088 + ], + "hints": { + "index": 22320 + } + }, + { + "items": [ + 11691, + 2.9056000709533691 + ], + "hints": { + "index": 22321 + } + }, + { + "items": [ + 11691.5, + 2.8757998943328857 + ], + "hints": { + "index": 22322 + } + }, + { + "items": [ + 11692, + 2.9028999805450439 + ], + "hints": { + "index": 22323 + } + }, + { + "items": [ + 11692.5, + 2.8914000988006592 + ], + "hints": { + "index": 22324 + } + }, + { + "items": [ + 11693, + 2.9164 + ], + "hints": { + "index": 22325 + } + }, + { + "items": [ + 11693.5, + 2.934 + ], + "hints": { + "index": 22326 + } + }, + { + "items": [ + 11694, + 2.9517 + ], + "hints": { + "index": 22327 + } + }, + { + "items": [ + 11694.5, + 3.06030011177063 + ], + "hints": { + "index": 22328 + } + }, + { + "items": [ + 11695, + 3.1140000820159912 + ], + "hints": { + "index": 22329 + } + }, + { + "items": [ + 11695.5, + 3.214900016784668 + ], + "hints": { + "index": 22330 + } + }, + { + "items": [ + 11696, + 3.1068000793457031 + ], + "hints": { + "index": 22331 + } + }, + { + "items": [ + 11696.5, + 3.0321 + ], + "hints": { + "index": 22332 + } + }, + { + "items": [ + 11697, + 2.9074 + ], + "hints": { + "index": 22333 + } + }, + { + "items": [ + 11697.5, + 2.9454 + ], + "hints": { + "index": 22334 + } + }, + { + "items": [ + 11698, + 2.9964001178741455 + ], + "hints": { + "index": 22335 + } + }, + { + "items": [ + 11698.5, + 3.1424999237060547 + ], + "hints": { + "index": 22336 + } + }, + { + "items": [ + 11699, + 3.1970999240875244 + ], + "hints": { + "index": 22337 + } + }, + { + "items": [ + 11699.5, + 3.0475 + ], + "hints": { + "index": 22338 + } + }, + { + "items": [ + 11700, + 2.814 + ], + "hints": { + "index": 22339 + } + }, + { + "items": [ + 11700.5, + 2.7571 + ], + "hints": { + "index": 22340 + } + }, + { + "items": [ + 11701, + 2.8763 + ], + "hints": { + "index": 22341 + } + }, + { + "items": [ + 11701.5, + 3.1653 + ], + "hints": { + "index": 22342 + } + }, + { + "items": [ + 11702, + 3.1363999843597412 + ], + "hints": { + "index": 22343 + } + }, + { + "items": [ + 11702.5, + 3.1737000942230225 + ], + "hints": { + "index": 22344 + } + }, + { + "items": [ + 11703, + 3.1786 + ], + "hints": { + "index": 22345 + } + }, + { + "items": [ + 11703.5, + 3.1294999122619629 + ], + "hints": { + "index": 22346 + } + }, + { + "items": [ + 11704, + 3.0224 + ], + "hints": { + "index": 22347 + } + }, + { + "items": [ + 11704.5, + 3.0501 + ], + "hints": { + "index": 22348 + } + }, + { + "items": [ + 11705, + 3.1372 + ], + "hints": { + "index": 22349 + } + }, + { + "items": [ + 11705.5, + 3.1447000503540039 + ], + "hints": { + "index": 22350 + } + }, + { + "items": [ + 11706, + 2.9441 + ], + "hints": { + "index": 22351 + } + }, + { + "items": [ + 11706.5, + 2.9377999305725098 + ], + "hints": { + "index": 22352 + } + }, + { + "items": [ + 11707, + 3.0093998908996582 + ], + "hints": { + "index": 22353 + } + }, + { + "items": [ + 11707.5, + 3.1239 + ], + "hints": { + "index": 22354 + } + }, + { + "items": [ + 11708, + 3.2022 + ], + "hints": { + "index": 22355 + } + }, + { + "items": [ + 11708.5, + 3.144399881362915 + ], + "hints": { + "index": 22356 + } + }, + { + "items": [ + 11709, + 3 + ], + "hints": { + "index": 22357 + } + }, + { + "items": [ + 11709.5, + 2.9899001121520996 + ], + "hints": { + "index": 22358 + } + }, + { + "items": [ + 11710, + 3.127000093460083 + ], + "hints": { + "index": 22359 + } + }, + { + "items": [ + 11710.5, + 3.3650999069213867 + ], + "hints": { + "index": 22360 + } + }, + { + "items": [ + 11711, + 3.4142000675201416 + ], + "hints": { + "index": 22361 + } + }, + { + "items": [ + 11711.5, + 3.3710000514984131 + ], + "hints": { + "index": 22362 + } + }, + { + "items": [ + 11712, + 3.2486000061035156 + ], + "hints": { + "index": 22363 + } + }, + { + "items": [ + 11712.5, + 3.145 + ], + "hints": { + "index": 22364 + } + }, + { + "items": [ + 11713, + 3.028 + ], + "hints": { + "index": 22365 + } + }, + { + "items": [ + 11713.5, + 3.0280001163482666 + ], + "hints": { + "index": 22366 + } + }, + { + "items": [ + 11714, + 3.028 + ], + "hints": { + "index": 22367 + } + }, + { + "items": [ + 11714.5, + 3.0280001163482666 + ], + "hints": { + "index": 22368 + } + }, + { + "items": [ + 11715, + 3.0280001163482666 + ], + "hints": { + "index": 22369 + } + }, + { + "items": [ + 11715.5, + 3.0280001163482666 + ], + "hints": { + "index": 22370 + } + }, + { + "items": [ + 11716, + 3.0280001163482666 + ], + "hints": { + "index": 22371 + } + }, + { + "items": [ + 11716.5, + 3.0280001163482666 + ], + "hints": { + "index": 22372 + } + }, + { + "items": [ + 11717, + 3.028 + ], + "hints": { + "index": 22373 + } + }, + { + "items": [ + 11717.5, + 3.0280001163482666 + ], + "hints": { + "index": 22374 + } + }, + { + "items": [ + 11718, + 3.028 + ], + "hints": { + "index": 22375 + } + }, + { + "items": [ + 11718.5, + 3.028 + ], + "hints": { + "index": 22376 + } + }, + { + "items": [ + 11719, + 3.028 + ], + "hints": { + "index": 22377 + } + }, + { + "items": [ + 11719.5, + 3.0280001163482666 + ], + "hints": { + "index": 22378 + } + }, + { + "items": [ + 11720, + 3.0280001163482666 + ], + "hints": { + "index": 22379 + } + }, + { + "items": [ + 11720.5, + 3.0280001163482666 + ], + "hints": { + "index": 22380 + } + }, + { + "items": [ + 11721, + 3.028 + ], + "hints": { + "index": 22381 + } + }, + { + "items": [ + 11721.5, + 3.028 + ], + "hints": { + "index": 22382 + } + }, + { + "items": [ + 11722, + 3.0280001163482666 + ], + "hints": { + "index": 22383 + } + }, + { + "items": [ + 11722.5, + 3.028 + ], + "hints": { + "index": 22384 + } + }, + { + "items": [ + 11723, + 3.0280001163482666 + ], + "hints": { + "index": 22385 + } + }, + { + "items": [ + 11723.5, + 3.0280001163482666 + ], + "hints": { + "index": 22386 + } + }, + { + "items": [ + 11724, + 3.0280001163482666 + ], + "hints": { + "index": 22387 + } + }, + { + "items": [ + 11724.5, + 3.0280001163482666 + ], + "hints": { + "index": 22388 + } + }, + { + "items": [ + 11725, + 3.028 + ], + "hints": { + "index": 22389 + } + }, + { + "items": [ + 11725.5, + 3.028 + ], + "hints": { + "index": 22390 + } + }, + { + "items": [ + 11726, + 3.0280001163482666 + ], + "hints": { + "index": 22391 + } + }, + { + "items": [ + 11726.5, + 3.028 + ], + "hints": { + "index": 22392 + } + }, + { + "items": [ + 11727, + 3.0280001163482666 + ], + "hints": { + "index": 22393 + } + }, + { + "items": [ + 11727.5, + 3.0280001163482666 + ], + "hints": { + "index": 22394 + } + }, + { + "items": [ + 11728, + 3.0280001163482666 + ], + "hints": { + "index": 22395 + } + }, + { + "items": [ + 11728.5, + 3.028 + ], + "hints": { + "index": 22396 + } + }, + { + "items": [ + 11729, + 3.028 + ], + "hints": { + "index": 22397 + } + }, + { + "items": [ + 11729.5, + 3.028 + ], + "hints": { + "index": 22398 + } + }, + { + "items": [ + 11730, + 3.0280001163482666 + ], + "hints": { + "index": 22399 + } + }, + { + "items": [ + 11730.5, + 3.0280001163482666 + ], + "hints": { + "index": 22400 + } + }, + { + "items": [ + 11731, + 3.028 + ], + "hints": { + "index": 22401 + } + }, + { + "items": [ + 11731.5, + 3.0280001163482666 + ], + "hints": { + "index": 22402 + } + }, + { + "items": [ + 11732, + 3.0280001163482666 + ], + "hints": { + "index": 22403 + } + }, + { + "items": [ + 11732.5, + 3.0280001163482666 + ], + "hints": { + "index": 22404 + } + }, + { + "items": [ + 11733, + 3.028 + ], + "hints": { + "index": 22405 + } + }, + { + "items": [ + 11733.5, + 3.0280001163482666 + ], + "hints": { + "index": 22406 + } + }, + { + "items": [ + 11734, + 3.028 + ], + "hints": { + "index": 22407 + } + }, + { + "items": [ + 11734.5, + 3.028 + ], + "hints": { + "index": 22408 + } + }, + { + "items": [ + 11735, + 3.028 + ], + "hints": { + "index": 22409 + } + }, + { + "items": [ + 11735.5, + 3.0280001163482666 + ], + "hints": { + "index": 22410 + } + }, + { + "items": [ + 11736, + 3.0280001163482666 + ], + "hints": { + "index": 22411 + } + }, + { + "items": [ + 11736.5, + 3.0280001163482666 + ], + "hints": { + "index": 22412 + } + }, + { + "items": [ + 11737, + 3.028 + ], + "hints": { + "index": 22413 + } + }, + { + "items": [ + 11737.5, + 3.0280001163482666 + ], + "hints": { + "index": 22414 + } + }, + { + "items": [ + 11738, + 3.028 + ], + "hints": { + "index": 22415 + } + }, + { + "items": [ + 11738.5, + 3.0280001163482666 + ], + "hints": { + "index": 22416 + } + }, + { + "items": [ + 11739, + 3.028 + ], + "hints": { + "index": 22417 + } + }, + { + "items": [ + 11739.5, + 3.0280001163482666 + ], + "hints": { + "index": 22418 + } + }, + { + "items": [ + 11740, + 3.028 + ], + "hints": { + "index": 22419 + } + }, + { + "items": [ + 11740.5, + 3.028 + ], + "hints": { + "index": 22420 + } + }, + { + "items": [ + 11741, + 3.028 + ], + "hints": { + "index": 22421 + } + }, + { + "items": [ + 11741.5, + 3.0280001163482666 + ], + "hints": { + "index": 22422 + } + }, + { + "items": [ + 11742, + 3.028 + ], + "hints": { + "index": 22423 + } + }, + { + "items": [ + 11742.5, + 3.028 + ], + "hints": { + "index": 22424 + } + }, + { + "items": [ + 11743, + 3.028 + ], + "hints": { + "index": 22425 + } + }, + { + "items": [ + 11743.5, + 3.0280001163482666 + ], + "hints": { + "index": 22426 + } + }, + { + "items": [ + 11744, + 3.028 + ], + "hints": { + "index": 22427 + } + }, + { + "items": [ + 11744.5, + 3.028 + ], + "hints": { + "index": 22428 + } + }, + { + "items": [ + 11745, + 3.028 + ], + "hints": { + "index": 22429 + } + }, + { + "items": [ + 11745.5, + 3.028 + ], + "hints": { + "index": 22430 + } + }, + { + "items": [ + 11746, + 3.028 + ], + "hints": { + "index": 22431 + } + }, + { + "items": [ + 11746.5, + 3.028 + ], + "hints": { + "index": 22432 + } + }, + { + "items": [ + 11747, + 3.028 + ], + "hints": { + "index": 22433 + } + }, + { + "items": [ + 11747.5, + 3.0280001163482666 + ], + "hints": { + "index": 22434 + } + }, + { + "items": [ + 11748, + 3.028 + ], + "hints": { + "index": 22435 + } + }, + { + "items": [ + 11748.5, + 3.028 + ], + "hints": { + "index": 22436 + } + }, + { + "items": [ + 11749, + 3.028 + ], + "hints": { + "index": 22437 + } + }, + { + "items": [ + 11749.5, + 3.028 + ], + "hints": { + "index": 22438 + } + }, + { + "items": [ + 11750, + 3.0975000858306885 + ], + "hints": { + "index": 22439 + } + } + ], + "additionalTables": [], + "user": "jonesn@calnet.ads", + "static": false, + "wait": 0, + "runtime": {}, + "legend": true, + "config": { + "logs": [ + "MD", + "XPEF" + ] + }, + "style": "font-family:\"Roboto\",sans-serif;font-size:12px;font-style:Normal;font-weight:Normal;color:#61646B;background-color:transparent;border-style:None;border-top-color:#FFFFFF;border-right-color:#FFFFFF;border-bottom-color:#FFFFFF;border-left-color:#FFFFFF;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;padding-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;margin-top:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;" +} \ No newline at end of file diff --git a/panel_test_app/well_viz_html.html b/panel_test_app/well_viz_html.html new file mode 100644 index 0000000..41ca5d0 --- /dev/null +++ b/panel_test_app/well_viz_html.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +

    "HELLO!"

    +

    Smaller Header

    +
    + + + + + + + + \ No newline at end of file From 3bcdc14be62b32eb42995570eda229b4dafc77f4 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sun, 7 Jun 2020 09:38:32 -0700 Subject: [PATCH 05/17] removed unnecessary dependancies --- panel_test_app/app.py | 2 +- panel_test_app/well_viz_html.html | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/panel_test_app/app.py b/panel_test_app/app.py index e78b305..e402d06 100644 --- a/panel_test_app/app.py +++ b/panel_test_app/app.py @@ -10,7 +10,7 @@ docs_files.append('docs') docs_path = '/'.join(docs_files) main_dir = '/'.join(main_dir) - with open(docs_path + '/index.html', 'r', encoding='utf-8') as html_file: + with open(docs_path + '/well_viz_html.html', 'r', encoding='utf-8') as html_file: index_html = html_file.read() pn.extension('d3', js_files={'wellio': main_dir + '/dist/index.js'}) main_column = pn.Column(width=900) diff --git a/panel_test_app/well_viz_html.html b/panel_test_app/well_viz_html.html index 41ca5d0..6ef055b 100644 --- a/panel_test_app/well_viz_html.html +++ b/panel_test_app/well_viz_html.html @@ -2,24 +2,10 @@ - - - - - - - - - - - - - - From f863b8ea2ae7bea41befc99debfc2ab292115d9e Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sun, 7 Jun 2020 09:39:10 -0700 Subject: [PATCH 06/17] trying things --- dist/index.js | 2939 +++++++++++++++++---------------- panel_test_app/app.py | 23 +- panel_test_app/panel_idx.html | 37 + 3 files changed, 1569 insertions(+), 1430 deletions(-) create mode 100644 panel_test_app/panel_idx.html diff --git a/dist/index.js b/dist/index.js index e2fee64..1e6d0a4 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,4 +1,8 @@ -!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.commonJsModule=e():"undefined"!=typeof global?global.commonJsModule=e():"undefined"!=typeof self&&(self.commonJsModule=e());}(function(){var define,module,exports;module={exports:(exports={})}; +!function (e) { + "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.commonJsModule = e() : "undefined" != typeof global ? global.commonJsModule = e() : "undefined" != typeof self && (self.commonJsModule = e()); +}(function () { + var define, module, exports; + module = {exports: (exports = {})}; // Copyright 2019 Justin Gosses @@ -13,1069 +17,1139 @@ // See the License for the specific language governing permissions and // limitations under the License. - // /////////////////////////////// - // /** - // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, - // * particularly those already converted to JSON, using the d3.js visualization library." - // * - // * It is designed with a single central function curveBox, that returns SVGs. - // * A variety of helper functions take in differently formatted JSONs of information about the well - // * log curves to plot and how to plot them. - // * - // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. - // * - // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a - // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. - // * - // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, - // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. - // */ - -module.exports = { -/** - * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" - * @returns {obj} It returns the wellio.js object and all its functions as a module. - */ -wellio:require("wellio"), - -/** - * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" - * @returns {obj} It returns the d3.js object and all its functions as a module. - */ - d3:require("d3"), - -/** - * A function that directs users to the docs if they need help. - * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. - */ -help:function(){ - return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; -}, - - - /** - * A function that returns a short description of what the wellioviz library is all about. - * @returns {string} Returns a string that defines wellioviz. - */ - define_wellioviz: function(){ - return "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library."; - }, - /////////////////////////////// - -/** - * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. - * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. - * This is used to help construct the JSON object that is given to the curveBox plotting function. - * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. - * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" - */ -curveBoxTemplateExamples: function (string_of_either__help_example_definitions_mandatories){ - let request_string = string_of_either__help_example_definitions_mandatories; - if(request_string=="help"){ - return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; - } - if(request_string=="example"){ - return [{ - "curve_box":{ - "show_well_name":"yes", /// not built yet - "show_depth_type":"no", /// not built yet - "show_curve_units":"yes", /// not built yet - "curve_box_depth_min":-999, /// not built yet - "curve_box_depth_max":-999, /// not built yet - "take_out_null_or_visualize":"no", /// not built yet - "show_title":"no", - "width": 260, - "height": 500, - "height_multiplier_components":2, - "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, - "title": {"text": "", "title_font_size": "10px"}, /// not built yet - "div_id": "well_holder_3", /// Should be skip-able // default=random str? What happens if div doesn't exist? - "order_of_component":["curves","rectanges","lines"], /// not built yet - "lines_connected_across_curveboxes":"no", /// not built yet - "header_sep_svg_or_not":"yes", - "svg_header_height":"4em", - "gridlines":"yes", - "gridlines_color":"#D3D3D3", - "gridlines_stroke_width":0.20, - "grouped_or_independent_x_scales":"independent", - //// variables for how to draw mouseover of hover box - "mouseover_yes_or_no":"yes", //// "yes" or "no" - "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" - "mouseover_curvename":"default", //// default is first curve - "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black -}, - "components":[{ - "curves":[ - { "data_type":"curve", - "curve_names":["RHOB"], - "curve_colors":["black"], - "curve_stroke_dasharray":["solid"], - "stroke_linecap":["butt"], - "stroke_width":[1], - "fill":[ - {"curve_name":"RHOB","fill":"yes","fill_direction":"left","cutoffs":[0.21,2.23,2.24],"fill_colors":["gray","beige","white"],"curve2":""} - ], - "curve_units":["g/cm3"], - "depth_limits":[{"min":"autocalculate","max":"autocalculate"}], - "curve_limits":[{"curve_name":"","min":-10000000,"max":3}], - "data":[{"depth":1598.3,"RHOB":2.2322},{"depth":1598.4,"RHOB":2.0513},{"depth":1598.5,"RHOB":2.2548},{"depth":1598.6,"RHOB":2.9445},{"depth":1598.7,"RHOB":2.2223},{"depth":1598.8,"RHOB":2.447},{"depth":1598.9,"RHOB":2.598},{"depth":1599,"RHOB":2.8088},{"depth":1599.1,"RHOB":2.2248},{"depth":1599.2,"RHOB":2.2399},{"depth":1599.3,"RHOB":2.251},{"depth":1599.4,"RHOB":2.255},{"depth":1599.5,"RHOB":2.2526},{"depth":1599.6,"RHOB":2.2322},{"depth":1599.7,"RHOB":2.2513},{"depth":1599.8,"RHOB":2.2548},{"depth":1599.9,"RHOB":2.2445},{"depth":1600,"RHOB":2.2223},{"depth":1600.1,"RHOB":2.2047},{"depth":1600.2,"RHOB":2.198}], /// not built yet - "depth_curve_name":"DEPT",/// not built yet - ////// - "data_id":["placeholder_data_id",], /// not built yet - "well_names":[""], /// not built yet - "scale_linear_log_or_yours":["linear"], - "line_color": ["red"], /// not built yet - "max_depth": "autocalculate", /// not built yet - "min_depth": "autocalculate", /// not built yet - "depth_type_string":[""], - "depth_units_string":[""], - "null_value": [""], /// not built yet - } - ], - "lines":[ - { - "data_type":"line", /// not built yet - "label":"example", /// not built yet - "depth":-999, /// not built yet - "color":"red", /// not built yet - "stroke_width":"3px", /// not built yet - "stroke_style":"solid", /// not built yet - "transparency":1.0, /// not built yet - "stroke_linecap":"butt" - } - ], - "rectangles":[ - { - "data_type":"rectangle", - "depth_top":0, - "x_starting_upper_left_corner":0, - "width":100, - "height":100, - "stroke_width":"2px", - "stroke_linecap":"butt", - "fill":"red", - "opacity":0.5, - "label":"Core Example", // not built into plotting template yet - "label_orientation":"horizontal", // not built into plotting template yet - "lable_position":"right" // not built into plotting template yet - } - ] - }] -}]; - } - else if(request_string=="defintions"){ - return [{ - "curve_box":{ - "show_well_name":"yes or no. If '' is no", // not built yet - "show_depth_type":"yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No - "show_curve_units":"yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No - "curve_box_depth_min":"Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet - "curve_box_depth_max":"Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet - "take_out_null_or_visualize":"yes or no. If '' is no", // not built yet - "show_title":"yes or no. If '' is no", // not built yet - "width": "number, if blank default is 250", - "height": "number, if blank default is 500", - "height_multiplier_components":"An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.", - "margin": " should be an object like {\"top\": 10, \"right\": 10, \"bottom\": 30, \"left\": 60} if missing will default to these values", - "title": "object like:{\"text\": \"\", \"title_font_size\": \"10px\"} if default, an empty string, \"\" will skill", - "div_id": "should be a string that equals a div id like: 'well_holder' Do not include the #", ///What happens if div doesn't exist? - "order_of_component":"Should be an array of strings that correlate to component types like:[\"curves\",\"rectangles\",\"lines\"]", // not built yet - "lines_connected_across_curveboxes":"yes or no. If '' is no", // not built yet - "header_sep_svg_or_not":"yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", - "svg_header_height":"Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.", - "gridlines":"yes or no as strings. Default is 'yes'", - "gridlines_color":"Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", - "gridlines_stroke_width":"thickness of the line. Default is 0.20", - "grouped_or_independent_x_scales":"independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", - //// variables for how to draw mouseover of hover box - "mouseover_yes_or_no":"yes", //// "yes" or "no" - "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" - "mouseover_curvename":"default", //// default is first curve - "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black -}, - "components":[{ - "curves":[ - { "data_type":"requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.", // not built yet - "curve_names":"array of strings representing curve_names like: ['GR','RESD']", - "curve_colors":"array of strings representing colors using common names or rgb style like:[\"black\",\"rgb(205,0,0,1)\"]", - "curve_stroke_dasharray":"A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", - "stroke_width":"The width of the curve line. Example is '2px'. ", - "stroke_linecap":"Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", - "fill": "an array of objects one for each curve like: [{\"curve_name\":\"RHOB\",\"fill\":\"yes\",\"fill_direction\":\"left\",\"cutoffs\":[0.21,2.23,2.24],\"fill_colors\":[\"gray\",\"beige\",\"white\"],\"curve2\":\"\"}]", - "curve_units":"an array of strings that are curve units like: [\"g/cm2\",\"API\",\"\"] must equal length other curve fields", - "depth_limits":"An array of objects that contains the min and max depth for each curve like: [{\"min\":\"autocalculate\",\"max\":\"autocalculate\"}]", - "curve_limits":"An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{\"curve_name\":\"GR\",\"min\":0,\"max\":100},{\"curve_name\":\"PDF\",\"min\":0,\"max\":100}]", - "data":"Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{\"UWI\":\"111aa\",\"DEPTH\":4140.5,\"GR\":0},{\"UWI\":\"111aa\",\"DEPTH\":4141,\"GR\":0}] for the entire depth of the well being showin the curve_box", - "depth_curve_name":"A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", - ////// - "data_id":["array of strings whose length must equal curve_units, curve_names, etc."], // not built yet - "well_names":"An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.", // not built yet /// - "scale_linear_log_or_yours": "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", - - ////// Plotting things but need to be next to curve data or will be too confusing. - "line_color": "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", - "max_depth": "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", - "min_depth": "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", - "depth_type_string":"All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", - "depth_units_string":"units of depth, examples are meters,m., cm., feet, etc.", - "null_value": "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']" - } - ], - "lines":[ - { - "data_type":"must be string, will be ignored if not \"line\", \"curve\", or \"rectangle\"", - "label":"The label for horiztonal line in string form", - "depth":"number for the depth at which the line is placed", - "color":"string for the color of the line in common color name or RGB format. If '' then black will be used.", - "stroke_width":"A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", - "stroke_style":"Should be string, if not or doesnt exist will be treated as \"solid\"", - "stroke_width":"The width of the line. Example is '2px'. ", - "stroke_linecap":"Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", - "transparency":"Should be float between 0.0 and 1.0. Otherwise default is 1.0." - } - ], - "rectangles":[ - { - "data_type":"rectangle", - "depth_top":"A number for the depth of the upper left corner of the rectangle", // - "x_starting_upper_left_corner":"A number for the x axis value of the upper left corner of the rectangle", - "width":"Width of rectangle as number", - "height":"Height of rectangle as number", - "stroke_width":"The width of the line. Example is '2px'. ", - "stroke_linecap":"Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", - "fill":"String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", - "opacity":"Float between 0 and 1 that represents the opacity of the fill, default is 0.5", - "label":"String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet - "label_orientation":"A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet - "lable_position":"Exceptable strings are top, center, right, left, bottom. Default right." // not built into plotting template yet - } - ] - }] -}]; - } - else if(request_string=="mandatories"){ - return [ - "This is not yet populated!!!!" - ]; - } -}, - - /** - * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. - * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. - * It is used next by funtion ____ and ___. - * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. - */ - getFakeIncomingSparseDataExample: function () { - input_sparse_style = [{ - "single_curve_box_or_cross_section":"single", - "cross_section_title":"", - "width": 1040, /// not skippable, check if number // default if blank or missing =250 or autocalculate? - "height": 500, /// not skippable, check if number // default if blank or missing=500 - //////////////////////////// - "curve_boxes":[{ - "curve_box":{ - "show_well_name":"yes", // not built yet /// Should be skip-able /// default=No - "show_depth_type":"no", // not built yet /// Should be skip-able /// default=No - "show_curve_units":"yes", // not built yet /// Should be skip-able /// default=No - "curve_box_depth_min":-999, // not built yet /// Should be skip-able /// default=skip func if string or -999 - "curve_box_depth_max":-999, // not built yet /// Should be skip-able /// default=skip func if string or -999 - "take_out_null_or_visualize":"no", // not built yet /// Should be skip-able /// default=No - "show_title":"no", // not built into plotting template yet /// Should be skip-able /// default=No - "width": 260, /// not skippable, check if number // default if blank or missing =250 - "height": 500, /// not skippable, check if number // default if blank or missing=500 - "height_multiplier_components":3, // default if missing is 0.95 - "margin": {"top": 50, "right": 10, "bottom": 30, "left": 60}, /// not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. - "title": {"text": "", "title_font_size": "10px"}, /// Should be skip-able // default=skip - "div_id": "well_holder4", /// Should be skip-able // default=random str? What happens if div doesn't exist? - "order_of_component":["curves","rectangles","lines"], // not built yet, default is curve, then line, then rectangle - "lines_connected_across_curve_boxes":"no", // not built yet, default is skip function - "header_sep_svg_or_not":"yes", - "svg_header_height":"4em", - "gridlines":"yes", - "gridlines_color":"#D3D3D3", - "gridlines_stroke_width":0.20, - "grouped_or_independent_x_scales":"independent", - //// variables for how to draw mouseover of hover box - "mouseover_yes_or_no":"yes", //// "yes" or "no" - "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" - "mouseover_curvename":"default", //// default is first curve - "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black - - }, - "components":[{ - "curves":[ - { - "data_type":"curve", // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. - "data_id":"placeholder_data_id", // not built yet /// can be anything, just used for tracking & is optional - "well_name": "", // not built yet /// Ideally string. Will skip function if "" - "curve_type": "RHOB", // should be string. name of curve - "curve_values": [ - 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], /// Should be array. If not array, return error message? - "step": 0.1, /// Should be number. If not array, return error message? - "units": "g/cc", /// should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. - "scale_linear_log_or_yours": "linear", - ////// Plotting things but need to be next to curve data or will be too confusing. - "line_color": "rgb(205,0,0,1)", /// Test for string, if string use. If not string "black" - "curve_stroke_dasharray":"5,5", - "stroke_linecap":"butt", - "stroke_width":0.5, - "fill":{"curve_name":"RHOB","fill":"yes","fill_direction":"left","cutoffs":[0.21,2.23,2.24],"fill_colors":["gray","beige","white"],"curve2":""}, - "data_ID":"", - "max_depth": "1607.3", /// should be number, if not number or doens't exit then "autocalculate" - "min_depth": "1598.3", /// should be number, if not number or doens't exit then "autocalculate" - "depth_type_string":"TVDSS", /// should be string, if not or doesn't exist, then skip func - "depth_units_string":"md", - "depth_curve_name":"DEPTH", /// should be string, ideally all depth curve names are the same - "null_value": "", // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. - "x_max": 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" - "x_min": 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" - } - ], - "lines":[ - { - "data_type":"line", /// must be string, will be ignored if not "line", "curve", or "rectangle". - "label":"top 1", /// Ideally a string. - "depth":1601.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! - "color":"blue", /// should be string, if not or doesn't exist use "black" - "stroke_width":"3px", /// should be string, if not or doesn't exist use "1px" - "stroke_linecap":"butt", - "stroke_style":"solid", /// should be string, if not or doesn't exist use "solid" - "transparency":1.0 /// should be number between 0 and 1, if not or doesn't exist use 1. - }, - { - "data_type":"line", /// must be string, will be ignored if not "line", "curve", or "rectangle". - "label":"top 2", /// Ideally a string. - "depth":1602.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! - "color":"orange", /// should be string, if not or doesn't exist use "black" - "stroke_width":"5px", /// should be string, if not or doesn't exist use "1px" - "stroke_linecap":"butt", - "stroke_style":"solid", /// should be string, if not or doesn't exist use "solid" - "transparency":0.5 /// should be number between 0 and 1, if not or doesn't exist use 1. - } - ], - "rectangles":[ - { - "data_type":"rectangle", - "depth_top":1601, - "x_starting_upper_left_corner":0, - "width":100, - "height":100, - "stroke_width":"2px", - "stroke_linecap":"butt", - "fill":"red", - "opacity":0.5, - "label":"Core Example", // not built into plotting template yet - "label_orientation":"horizontal", // not built into plotting template yet - "lable_position":"right" // not built into plotting template yet - } - ] - }] - }] - }]; - return input_sparse_style; -} - , - - /////////////////////////////// - //// Functions for getting data from LAS files and reformatting to a wellio.js style JSON. - /////////////////////////////// - - /** - * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, - * array of curves names, and a string for UWI - * and returns the data array of objects that D3.js likes for data used in plotting. - * @param {object} well_log_json a full wellio style JSON - * @param {array} CurveNames array of curve names as strings - * @param {string} UWI a string the represents the well name - * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. - */ - convertWellJSONToObj:function (well_log_json,CurveNames,UWI,depth_curve_name){ - let depth = well_log_json["CURVES"][depth_curve_name]; - let curve_data = []; - for(let eachCr in CurveNames){ - curve_data.push(well_log_json["CURVES"][CurveNames[eachCr]]); - } - let array_of_obj = []; - if (depth.length === well_log_json["CURVES"][CurveNames[0]].length){ - for (let eachPt = 0; eachPt < depth.length; eachPt++) { - let obj = {}; - obj["UWI"] = UWI; - for (let i = 0; i < CurveNames.length; i++){ - obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); - } - array_of_obj.push(obj); - } - } - else{ - console.log("depth didn't match curve length"); - array_of_obj.push("depth didn't match curve length"); - } - return array_of_obj; -}, - - - /////////////////////////////// - //// Functions for getting basic information out of wellio.js style JSON for plotting - /////////////////////////////// - - /////// this require wellio! - // fileToJSON:function (afile){ - // return module.exports.wellio.las2json(afile) - // }, - ///////// - // turnFilesIntoTextIntoWellioJSON:function (files_array){ - // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js - // let logs_in_json = [] - // for (let i = 0; i < files_array.length; i++) { - // logs_in_json.push(module.exports.fileToJSON(files_array[i])) - // } - // return logs_in_json - // }, - - - /** - * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, - * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. - * the data array of objects that D3.js likes for data used in plotting. - * @param {object} jsonWell a full wellio style JSON - * @param {string} depth_curve_name String for the depth curve name - * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} - */ - fromJSONofWEllGetThingsForPlotting: function(jsonWell,depth_curve_name){ - curve_names = Object.keys(jsonWell["CURVES"]); - uwi = jsonWell["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; - depth_curve_name = depth_curve_name; - well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell,curve_names,uwi,depth_curve_name); - return {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi}; - }, - - - - - - /////////////////////////////// - //// Functions for reformatting data other than wellio.js style JSON - /////////////////////////////// - - - /** - * createDepthArray is a function that takes in a min float, max float, and step float value. - * and returns an array or depth values from the min to the max value going by the step value each step. - * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. - * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. - * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. - * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. - * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] - */ - createDepthArray: function (min,max,step){ - //// Returns an array of depth values from min to max, including both, with each being different by step value - //// ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) - let depth = []; - min = parseFloat(min); - max = parseFloat(max); - step = parseFloat(step); - let number_of_points = ((max-min)/step) +1; - let temp_depth = min; - for (let i = 0; i < number_of_points; i++) { - temp_depth = (min+(i*step)).toFixed(7); - depth.push(parseFloat(temp_depth)); - } - return depth;}, - - -/** - * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. -* THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! -*/ -takeInArraysAndGetObjectOfCurveDataForPlotting: function (arraysOfCurvesAndNames,CurveName, DepthName){ - //// would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") - // [{"depth":[],"curveData":[]}] - // [{"depth":[],"curveData":[]}] - let curveObj = []; - // make sure the curve data arrays are the same lenght, if not add null values - - // put them into object - let lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; - for (let i = 0; i < lengthOfCurve0; i++) { - let newObj = {[DepthName]:0,"RHOB":0}; - newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; - newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; - curveObj.push(newObj); - } - return curveObj; -}, - - -/** - * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, - * array of curves names, and a string for UWI - * and returns the data array of objects that D3.js likes for data used in plotting. - * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. - * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. - * @param {string} UWI A string for the well log UWI ID - * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data - * @returns {array} An array of objects properly formatted for next step ___. - */ -convertWellJSONToObjV2: function (depth, curve_data, UWI, CurveNames) { - depth = depth[0]; - array_of_obj = []; - for (eachPt in depth) { - obj = {}; - obj["UWI"] = UWI; - for (i in CurveNames) { - obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); - obj["DEPTH"] = parseFloat(depth[eachPt]); - } - array_of_obj.push(obj); - } - return array_of_obj; -}, - - - /////////////////////////////// - //// Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. - /////////////////////////////// - -/** - * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. - * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. - * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. - */ -putIncomingSparseJsonIntoPlottingTemplate: function (incoming_sparse,template){ - if (incoming_sparse[0]["single_curve_box_or_cross_section"] == "multiple"){ - console.log("THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE "); - return "THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE"; - } - else{ - let curve_box_obj = incoming_sparse[0]["curve_boxes"][0]; - let curve_box_overall = incoming_sparse[0]["curve_boxes"][0]["curve_box"]; - let curve_box_components = incoming_sparse[0]["curve_boxes"][0]["components"]; - template[0]["curve_box"] = curve_box_overall; - template[0]["components"][0]["lines"] = curve_box_components[0]["lines"]; - template[0]["components"][0]["rectangles"] = curve_box_components[0]["rectangles"]; - - ///// Establish template with empty arrays except for value that are shared for all curves - ///// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX - template[0]["components"][0]["curves"][0]["data_type"] = "curve"; - template[0]["components"][0]["curves"][0]["depth_type_string"]= curve_box_components[0]["curves"][0]["depth_type_string"]; - template[0]["components"][0]["curves"][0]["depth_units_string"]= curve_box_components[0]["curves"][0]["depth_units_string"]; - template[0]["components"][0]["curves"][0]["depth_curve_name"] = curve_box_components[0]["curves"][0]["depth_curve_name"]; - ///// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. - template[0]["components"][0]["curves"][0]["curve_names"] = []; - template[0]["components"][0]["curves"][0]["curve_colors"] = []; - template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"] = []; - template[0]["components"][0]["curves"][0]["stroke_width"] = []; - template[0]["components"][0]["curves"][0]["stroke_linecap"] = []; - template[0]["components"][0]["curves"][0]["fill"] = []; - template[0]["components"][0]["curves"][0]["data_id"] = []; - template[0]["components"][0]["curves"][0]["well_names"] = []; - template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"] = []; - template[0]["components"][0]["curves"][0]["line_color"] = []; - template[0]["components"][0]["curves"][0]["max_depth"] = []; - template[0]["components"][0]["curves"][0]["min_depth"] = []; - template[0]["components"][0]["curves"][0]["null_value"] = []; - - template[0]["components"][0]["curves"][0]["data"] = []; - - ///// For each curve object in incoming data: - let array_individual_curves_and_depth_objects = []; - let all_depths_list = []; - let all_depths_set = []; - - for (let i = 0; i < curve_box_components[0]["curves"].length; i++) { - - let curve = curve_box_components[0]["curves"][i]; - template[0]["components"][0]["curves"][0]["curve_names"].push(curve["curve_type"]); - template[0]["components"][0]["curves"][0]["curve_colors"].push(curve["line_color"]); - template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"].push(curve["curve_stroke_dasharray"]); - template[0]["components"][0]["curves"][0]["stroke_width"].push(curve["stroke_width"]); - template[0]["components"][0]["curves"][0]["stroke_linecap"].push(curve["stroke_linecap"]); - template[0]["components"][0]["curves"][0]["fill"].push(curve["fill"]); - template[0]["components"][0]["curves"][0]["data_id"].push(curve["data_id"]); - template[0]["components"][0]["curves"][0]["well_names"].push(curve["well_name"]); - template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"].push(curve["scale_linear_log_or_yours"]); - template[0]["components"][0]["curves"][0]["line_color"].push(curve["line_color"]); - template[0]["components"][0]["curves"][0]["max_depth"].push(curve["max_depth"]); - template[0]["components"][0]["curves"][0]["min_depth"].push(curve["min_depth"]); - template[0]["components"][0]["curves"][0]["null_value"].push(curve["null_value"]); - //// - let depth_array = module.exports.createDepthArray(curve["min_depth"],curve["max_depth"],curve["step"]); - let curve_array = curve["curve_values"]; - let curve_name = curve["curve_type"]; - let depth_curve_name = curve["depth_curve_name"]; - //// the function below is off...someting undefined - let obj_starter = [{[depth_curve_name]:depth_array,[curve_name]:curve_array}]; - - let reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter,curve_name,depth_curve_name); - //// - array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); - //// - - all_depths_list = all_depths_list.concat(depth_array); - } - - /// Get array of unique depth values from all curves by calling set on an array of depth values - all_depths_set = [...new Set(all_depths_list)]; - - let objects_helper = {}; - - for (let j = 0; j < all_depths_set.length; j++) { - /// create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] - objects_helper[all_depths_set[j]] = {[template[0]["components"][0]["curves"][0]["depth_curve_name"]]:all_depths_set[j]}; - } - - //// now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} - //// for each curve {"depth":value,"curve_name":value} in each curve array of objects... - /////// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object - for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { - let this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; - for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { - let this_obj = this_depth_plus_curve_obj[l]; - - let curve_name = curve_box_components[0]["curves"][k]["curve_type"]; - let depth_name = curve_box_components[0]["curves"][k]["depth_curve_name"]; - - /// add curve value as key/value pair to right object based on depth key - - objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; - - } - } - - /// get rid of depth key and just have the objects..put in array if not returned as array - //// return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] - let data = Object.keys(objects_helper).map(function(key){return objects_helper[key];}); - - let depth_name = template[0]["components"][0]["curves"][0]["depth_curve_name"]; - data = data.sort(function(a, b) { - return parseFloat(a.depth_name) - parseFloat(b.depth_name); -}); - // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) - function sortFloat(a,b) { return a - b; } - function sortNumber(a, b) { - return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); -} - template[0]["components"][0]["curves"][0]["data"] = data.sort(sortNumber); - return template; - - } -}, - - - /////////////////////////////// - //// Functions that take Wellio.js style JSON and handle everything from transformation to plotting - /////////////////////////////// - -/** - * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! - * @param {*} logs_in_json - * @param {*} div_id - * @param {*} example_template - * @param {*} curve_name - * @param {*} curve_color - * @param {*} curve_unit - * @param {*} fill - * @param {*} depth_name - * @param {*} width - * @param {*} height - */ -putArrayOfLogsIntoSection: function (logs_in_json,div_id,example_template,curve_name,curve_color,curve_unit,fill,depth_name, width, height){ - const noSVG =module.exports.d3.select("#"+div_id).selectAll("svg").remove(); - // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) - let new_templates = []; - for (let i = 0; i < logs_in_json.length; i++) { - let three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i],depth_name); - let new_data =three_things2["well_log_curves_reformatted_for_d3"]; - let example_template_n = JSON.parse(JSON.stringify(example_template)); - example_template_n[0]["components"][0]["curves"][0]["data"] = new_data; - example_template_n[0]["components"][0]["curves"][0]["well_names"] = [three_things2["uwi"]]; - example_template_n[0]["components"][0]["curves"][0]["curve_names"] = [curve_name]; - example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = [curve_color]; - example_template_n[0]["components"][0]["curves"][0]["curve_units"] = [curve_unit]; - example_template_n[0]["components"][0]["curves"][0]["fill"] = [fill]; - example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_name; - let svg_holder =module.exports.d3.select("#"+div_id).append("div"); - svg_holder.style("vertical-align","middle") - .attr("id",div_id+"svg_holder"+i) - .style("display","inline-block"); - example_template_n[0]["curve_box"]["div_id"] = div_id+"svg_holder"+i; - example_template_n[0]["curve_box"]["width"] = width; - example_template_n[0]["curve_box"]["height"] = height; - new_templates.push(example_template_n); - module.exports.curveBox(example_template_n); - } - return new_templates; -}, - -/** - * minimumDataIntoTemplateFunc - * @param - */ -minimumDataIntoTemplateFunc: function (example_template,data,well_names,curve_names,curve_colors,curve_units,fill,div_id,width,height,depth_curve_name){ - //// remember that all curve components should be an array, even if one item! - let example_template_n = JSON.parse(JSON.stringify(example_template)); - example_template_n[0]["components"][0]["curves"][0]["data"] = data; - example_template_n[0]["components"][0]["curves"][0]["well_names"] = well_names; - example_template_n[0]["components"][0]["curves"][0]["curve_names"] = curve_names; - example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = curve_colors; - example_template_n[0]["components"][0]["curves"][0]["curve_units"] = curve_units; - example_template_n[0]["components"][0]["curves"][0]["fill"] = fill; - example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_curve_name; - example_template_n[0]["curve_box"]["div_id"] = div_id; - example_template_n[0]["curve_box"]["width"] = width; - example_template_n[0]["curve_box"]["height"] = height; - return example_template_n; -}, - - - - /////////////////////////////// - //// Actual plotting functions after all the necessary information is compiled in necessary format - /////////////////////////////// - - /** - * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. - * @param {object} well_curve_config_template - * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. - */ - curveBox:function (template_for_plotting){ - let d3 = module.exports.d3; - - ////////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// - //// These parts of the function establish variables from the config JSON in shorter variable names - //// If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined - // default values might be defined here for cases where they are accidentally not defined - - let template_overall = template_for_plotting[0]["curve_box"]; - let template_components = template_for_plotting[0]["components"]; - let template_curves = template_components[0]["curves"][0]; - let template_lines = template_components[0]["lines"]; - let template_rectangles = template_components[0]["rectangles"]; - let title = ""; - //// Determine if title exists for the curve_box. - if(template_overall["show_title"] != "yes"){let title = "";} - else{title=template_overall["title"]["text"];} - /// Parameters that define shape & size of overall curve box - let width = template_overall["width"]; - let height_multiplier_components = 0.95; - if (template_overall["height_multiplier_components"]){ - height_multiplier_components = template_overall["height_multiplier_components"]; - } - let height = template_overall["height"]*height_multiplier_components; - let height_components = template_overall["height"]; - let margin = template_overall["margin"]; - let header_sep_svg_or_not = template_overall["header_sep_svg_or_not"]; - let svg_header_height = template_overall["svg_header_height"]; - let gridlines = template_overall["gridlines"]; - let gridlines_color = template_overall["gridlines_color"]; - let gridlines_stroke_width = template_overall["gridlines_stroke_width"]; - //// variables for how to draw mouseover of hover box - let mouseover_yes_or_no = template_overall["mouseover_yes_or_no"]; - let mouseover_depth_or_depth_and_curve = template_overall["mouseover_depth_or_depth_and_curve"]; - let mouseover_curvename = template_overall["mouseover_curvename"]; //// default is first curve - let mouseover_color_or_default_which_is_curve_color = template_overall["mouseover_color_or_default_which_is_curve_color"]; - - let secondary_depth_exist = "no"; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW - - //// Data is in d3.js form. An array of objects consisting of single level key:value pairs - let data = template_curves["data"]; - //// Variables related to curves, these should all be arrays with one or more values! - let curve_names = template_curves["curve_names"]; - let curve_colors = template_curves["curve_colors"]; - let curve_stroke_dasharray = template_curves["curve_stroke_dasharray"]; - let curve_name = curve_names[0]; - let curve_color = curve_colors[0]; - let curve_units = template_curves["curve_units"]; - let scale_linear_log_or_yours = template_curves["scale_linear_log_or_yours"]; - if(template_curves["curve_units"]){curve_units = template_curves["curve_units"];} - else{curve_units = "";} - - //////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON - let flag_for_single_scale_or_independent_scales = template_overall["grouped_or_independent_x_scales"]; - let grouped_or_independent_x_scale = template_overall["grouped_or_independent_x_scales"]; - - - //// The depth_curve_name needs to be the same for all curves plotted! - let depth_curve_name = ""; - if (template_curves["depth_curve_name"].length > 1 && typeof(template_curves["depth_curve_name"]) == "object" && template_curves["depth_curve_name"][0] !== template_curves["depth_curve_name"][1] - ){ - depth_curve_name = "depth_curve_name is not the same in two or more curves"; - } - else{ - depth_curve_name = template_curves["depth_curve_name"]; - } - let depth_type_string = ""; - if( - template_curves["depth_type_string"].length > 1 && typeof(template_curves["depth_type_string"]) == "object" && template_curves["depth_type_string"][0] != template_curves["depth_type_string"][1] - ){ - depth_type_string = "depth type string is not the same in two or more curves"; - } - else if (template_curves["depth_type_string"][0] == ""){depth_type_string = "";} - else if (template_curves["depth_type_string"]){depth_type_string = "- "+template_curves["depth_type_string"];} - let depth_units_string = ""; - if(template_curves["depth_units_string"] && template_curves["depth_units_string"][0] !== ""){ - depth_units_string = "- " + template_curves["depth_units_string"]; - } - - ///// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// - let div_id = template_overall["div_id"]; - if(template_overall["div_id"]){div_id = template_overall["div_id"];} - else{return "there_was_no_div_id_in_the_template";} - - d3.select("#"+div_id).selectAll("*").remove(); - - ///////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// -// //// Calculate depth min and max if depth min and/or max is not given explicitly in the template - let depth_min; - let depth_max; - if(!template_curves["depth_limits"] || template_curves["depth_limits"][0]["min"] == "autocalculate") - {depth_min = d3.min(data, function(d) { return +d[depth_curve_name];});} - else - {depth_min = template_curves["depth_limits"][0]["min"];} - //// max depth - if(!template_curves["depth_limits"] || template_curves["depth_limits"][0]["max"] == "autocalculate") - {depth_max = d3.max(data, function(d) { return +d[depth_curve_name];});} - else - {depth_max = template_curves["depth_limits"][0]["max"];} - - - // [depth_max,depth_min] - //// Apply depth min and max to incoming well log data - //// To save time, we'll first check if the first object in the array had as depth that is smaller than min - //// and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. - - if(data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max){} - else{data = data.filter(function(objects){ - return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; -});} - - // let depth_min = -1000000 - // let depth_max = 1000000 - - if(template_curves["min_depth"][0] == "autocalculate" || template_curves["min_depth"] == "autocalculate"){ - depth_min = data[0][depth_curve_name]; - } - else{depth_min = template_curves["min_depth"];} - if(template_curves["max_depth"][0] == "autocalculate" || template_curves["max_depth"] == "autocalculate"){ - depth_max = data[data.length-1][depth_curve_name]; - } - else{depth_max = template_curves["max_depth"];} - - // let depth_min = template_curves["min_depth"][0] - // let depth_max = template_curves["max_depth"][0] - - ///////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// - - ////////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// - let svg = ""; - let svg_holder = ""; - let svg_header = ""; - if (header_sep_svg_or_not == "yes"){ - - svg_holder = d3.select("#"+div_id).append("div") - .attr("class","svg_holder") - .style("overflow-x","auto"); - - svg_header = d3.select("#"+div_id+" div.svg_holder").append("svg"); - svg_header.attr("class","header"); - svg_header.attr("width",width) - .attr("height",svg_header_height); ///// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! - svg_header.append("g"); - svg_header.style("display","block"); - - let depth_string_on_top = ""; - if(depth_type_string == ""){ - depth_string_on_top = depth_curve_name; - } - else{depth_string_on_top = depth_type_string.replace("- ","");} - - svg_header.append("text") - .attr("x", (margin.left)/2) - .attr("y", "1em") - .attr("text-anchor", "middle") - .style("font-size", "10px") - .style("text-decoration", "underline") - .text(depth_curve_name); - if(depth_type_string != ""){ - let depth_type_string_x_pos = 0; - let depth_type_string_x_pos_anch = "start"; - if(secondary_depth_exist == "no"){ - depth_type_string_x_pos = margin.left/2; - depth_type_string_x_pos_anch = "middle"; + // /////////////////////////////// + // /** + // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, + // * particularly those already converted to JSON, using the d3.js visualization library." + // * + // * It is designed with a single central function curveBox, that returns SVGs. + // * A variety of helper functions take in differently formatted JSONs of information about the well + // * log curves to plot and how to plot them. + // * + // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. + // * + // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a + // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. + // * + // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, + // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. + // */ + + module.exports = { + /** + * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" + * @returns {obj} It returns the wellio.js object and all its functions as a module. + */ + wellio: require("wellio"), + + /** + * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" + * @returns {obj} It returns the d3.js object and all its functions as a module. + */ + d3: require("d3"), + + /** + * A function that directs users to the docs if they need help. + * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. + */ + help: function () { + return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; + }, + + + /** + * A function that returns a short description of what the wellioviz library is all about. + * @returns {string} Returns a string that defines wellioviz. + */ + define_wellioviz: function () { + return "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library."; + }, + /////////////////////////////// + + /** + * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. + * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. + * This is used to help construct the JSON object that is given to the curveBox plotting function. + * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. + * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" + */ + curveBoxTemplateExamples: function (string_of_either__help_example_definitions_mandatories) { + let request_string = string_of_either__help_example_definitions_mandatories; + if (request_string == "help") { + return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; + } + if (request_string == "example") { + return [{ + "curve_box": { + "show_well_name": "yes", /// not built yet + "show_depth_type": "no", /// not built yet + "show_curve_units": "yes", /// not built yet + "curve_box_depth_min": -999, /// not built yet + "curve_box_depth_max": -999, /// not built yet + "take_out_null_or_visualize": "no", /// not built yet + "show_title": "no", + "width": 260, + "height": 500, + "height_multiplier_components": 2, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "well_holder_3", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectanges", "lines"], /// not built yet + "lines_connected_across_curveboxes": "no", /// not built yet + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "curve", + "curve_names": ["RHOB"], + "curve_colors": ["black"], + "curve_stroke_dasharray": ["solid"], + "stroke_linecap": ["butt"], + "stroke_width": [1], + "fill": [ + { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + } + ], + "curve_units": ["g/cm3"], + "depth_limits": [{"min": "autocalculate", "max": "autocalculate"}], + "curve_limits": [{"curve_name": "", "min": -10000000, "max": 3}], + "data": [{"depth": 1598.3, "RHOB": 2.2322}, { + "depth": 1598.4, + "RHOB": 2.0513 + }, {"depth": 1598.5, "RHOB": 2.2548}, { + "depth": 1598.6, + "RHOB": 2.9445 + }, {"depth": 1598.7, "RHOB": 2.2223}, { + "depth": 1598.8, + "RHOB": 2.447 + }, {"depth": 1598.9, "RHOB": 2.598}, {"depth": 1599, "RHOB": 2.8088}, { + "depth": 1599.1, + "RHOB": 2.2248 + }, {"depth": 1599.2, "RHOB": 2.2399}, { + "depth": 1599.3, + "RHOB": 2.251 + }, {"depth": 1599.4, "RHOB": 2.255}, { + "depth": 1599.5, + "RHOB": 2.2526 + }, {"depth": 1599.6, "RHOB": 2.2322}, { + "depth": 1599.7, + "RHOB": 2.2513 + }, {"depth": 1599.8, "RHOB": 2.2548}, {"depth": 1599.9, "RHOB": 2.2445}, { + "depth": 1600, + "RHOB": 2.2223 + }, {"depth": 1600.1, "RHOB": 2.2047}, {"depth": 1600.2, "RHOB": 2.198}], /// not built yet + "depth_curve_name": "DEPT",/// not built yet + ////// + "data_id": ["placeholder_data_id",], /// not built yet + "well_names": [""], /// not built yet + "scale_linear_log_or_yours": ["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string": [""], + "depth_units_string": [""], + "null_value": [""], /// not built yet + } + ], + "lines": [ + { + "data_type": "line", /// not built yet + "label": "example", /// not built yet + "depth": -999, /// not built yet + "color": "red", /// not built yet + "stroke_width": "3px", /// not built yet + "stroke_style": "solid", /// not built yet + "transparency": 1.0, /// not built yet + "stroke_linecap": "butt" + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 0, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "defintions") { + return [{ + "curve_box": { + "show_well_name": "yes or no. If '' is no", // not built yet + "show_depth_type": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "curve_box_depth_max": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "take_out_null_or_visualize": "yes or no. If '' is no", // not built yet + "show_title": "yes or no. If '' is no", // not built yet + "width": "number, if blank default is 250", + "height": "number, if blank default is 500", + "height_multiplier_components": "An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.", + "margin": " should be an object like {\"top\": 10, \"right\": 10, \"bottom\": 30, \"left\": 60} if missing will default to these values", + "title": "object like:{\"text\": \"\", \"title_font_size\": \"10px\"} if default, an empty string, \"\" will skill", + "div_id": "should be a string that equals a div id like: 'well_holder' Do not include the #", ///What happens if div doesn't exist? + "order_of_component": "Should be an array of strings that correlate to component types like:[\"curves\",\"rectangles\",\"lines\"]", // not built yet + "lines_connected_across_curveboxes": "yes or no. If '' is no", // not built yet + "header_sep_svg_or_not": "yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", + "svg_header_height": "Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.", + "gridlines": "yes or no as strings. Default is 'yes'", + "gridlines_color": "Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", + "gridlines_stroke_width": "thickness of the line. Default is 0.20", + "grouped_or_independent_x_scales": "independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.", // not built yet + "curve_names": "array of strings representing curve_names like: ['GR','RESD']", + "curve_colors": "array of strings representing colors using common names or rgb style like:[\"black\",\"rgb(205,0,0,1)\"]", + "curve_stroke_dasharray": "A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", + "stroke_width": "The width of the curve line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "an array of objects one for each curve like: [{\"curve_name\":\"RHOB\",\"fill\":\"yes\",\"fill_direction\":\"left\",\"cutoffs\":[0.21,2.23,2.24],\"fill_colors\":[\"gray\",\"beige\",\"white\"],\"curve2\":\"\"}]", + "curve_units": "an array of strings that are curve units like: [\"g/cm2\",\"API\",\"\"] must equal length other curve fields", + "depth_limits": "An array of objects that contains the min and max depth for each curve like: [{\"min\":\"autocalculate\",\"max\":\"autocalculate\"}]", + "curve_limits": "An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{\"curve_name\":\"GR\",\"min\":0,\"max\":100},{\"curve_name\":\"PDF\",\"min\":0,\"max\":100}]", + "data": "Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{\"UWI\":\"111aa\",\"DEPTH\":4140.5,\"GR\":0},{\"UWI\":\"111aa\",\"DEPTH\":4141,\"GR\":0}] for the entire depth of the well being showin the curve_box", + "depth_curve_name": "A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", + ////// + "data_id": ["array of strings whose length must equal curve_units, curve_names, etc."], // not built yet + "well_names": "An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.", // not built yet /// + "scale_linear_log_or_yours": "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", + + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", + "max_depth": "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", + "min_depth": "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", + "depth_type_string": "All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", + "depth_units_string": "units of depth, examples are meters,m., cm., feet, etc.", + "null_value": "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']" + } + ], + "lines": [ + { + "data_type": "must be string, will be ignored if not \"line\", \"curve\", or \"rectangle\"", + "label": "The label for horiztonal line in string form", + "depth": "number for the depth at which the line is placed", + "color": "string for the color of the line in common color name or RGB format. If '' then black will be used.", + "stroke_width": "A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", + "stroke_style": "Should be string, if not or doesnt exist will be treated as \"solid\"", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "transparency": "Should be float between 0.0 and 1.0. Otherwise default is 1.0." + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": "A number for the depth of the upper left corner of the rectangle", // + "x_starting_upper_left_corner": "A number for the x axis value of the upper left corner of the rectangle", + "width": "Width of rectangle as number", + "height": "Height of rectangle as number", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", + "opacity": "Float between 0 and 1 that represents the opacity of the fill, default is 0.5", + "label": "String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet + "label_orientation": "A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet + "lable_position": "Exceptable strings are top, center, right, left, bottom. Default right." // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "mandatories") { + return [ + "This is not yet populated!!!!" + ]; + } + }, + + /** + * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. + * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. + * It is used next by funtion ____ and ___. + * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. + */ + getFakeIncomingSparseDataExample: function () { + input_sparse_style = [{ + "single_curve_box_or_cross_section": "single", + "cross_section_title": "", + "width": 1040, /// not skippable, check if number // default if blank or missing =250 or autocalculate? + "height": 500, /// not skippable, check if number // default if blank or missing=500 + //////////////////////////// + "curve_boxes": [{ + "curve_box": { + "show_well_name": "yes", // not built yet /// Should be skip-able /// default=No + "show_depth_type": "no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "curve_box_depth_max": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "take_out_null_or_visualize": "no", // not built yet /// Should be skip-able /// default=No + "show_title": "no", // not built into plotting template yet /// Should be skip-able /// default=No + "width": 260, /// not skippable, check if number // default if blank or missing =250 + "height": 500, /// not skippable, check if number // default if blank or missing=500 + "height_multiplier_components": 3, // default if missing is 0.95 + "margin": {"top": 50, "right": 10, "bottom": 30, "left": 60}, /// not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. + "title": {"text": "", "title_font_size": "10px"}, /// Should be skip-able // default=skip + "div_id": "well_holder4", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectangles", "lines"], // not built yet, default is curve, then line, then rectangle + "lines_connected_across_curve_boxes": "no", // not built yet, default is skip function + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + + }, + "components": [{ + "curves": [ + { + "data_type": "curve", // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. + "data_id": "placeholder_data_id", // not built yet /// can be anything, just used for tracking & is optional + "well_name": "", // not built yet /// Ideally string. Will skip function if "" + "curve_type": "RHOB", // should be string. name of curve + "curve_values": [ + 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], /// Should be array. If not array, return error message? + "step": 0.1, /// Should be number. If not array, return error message? + "units": "g/cc", /// should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. + "scale_linear_log_or_yours": "linear", + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "rgb(205,0,0,1)", /// Test for string, if string use. If not string "black" + "curve_stroke_dasharray": "5,5", + "stroke_linecap": "butt", + "stroke_width": 0.5, + "fill": { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + }, + "data_ID": "", + "max_depth": "1607.3", /// should be number, if not number or doens't exit then "autocalculate" + "min_depth": "1598.3", /// should be number, if not number or doens't exit then "autocalculate" + "depth_type_string": "TVDSS", /// should be string, if not or doesn't exist, then skip func + "depth_units_string": "md", + "depth_curve_name": "DEPTH", /// should be string, ideally all depth curve names are the same + "null_value": "", // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. + "x_max": 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + "x_min": 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + } + ], + "lines": [ + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 1", /// Ideally a string. + "depth": 1601.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "blue", /// should be string, if not or doesn't exist use "black" + "stroke_width": "3px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 1.0 /// should be number between 0 and 1, if not or doesn't exist use 1. + }, + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 2", /// Ideally a string. + "depth": 1602.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "orange", /// should be string, if not or doesn't exist use "black" + "stroke_width": "5px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 0.5 /// should be number between 0 and 1, if not or doesn't exist use 1. + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 1601, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }] + }]; + return input_sparse_style; } - svg_header.append("text") - .attr("x", depth_type_string_x_pos) - .attr("y", "3em") - .attr("text-anchor", depth_type_string_x_pos_anch) - .style("font-size", "8px") - .style("text-decoration", "underline") - .text(depth_string_on_top); - } - - //svg_header.append("text") - // .attr("x", margin.left) - // .attr("y", "4em") - // .attr("text-anchor", "end") - // .style("font-size", "6px") - // .style("text-decoration", "underline") - // .text("2nd TVD"); - - ///////// change this!!!!! - if(title !== "Elephants"){ - let distance_from_top = -15; - svg_header.append("text") // - .attr("x", (margin.left/3+(width/2))) - .attr("y", 0 + (- distance_from_top)) - .attr("text-anchor", "middle") - .style("font-size", template_overall["title"]["title_font_size"]) - .text(title); - } - - const curveBox_main_div = d3.select("#"+div_id).append("div"); - curveBox_main_div - .attr("height",height_components+"px") - .attr("class","component_outter") - .style("display","flex") - .style("position","relative") - .style("box-sizing","border-box"); - - const curveBox_sub_div = d3.select("#"+div_id+" div.component_outter").append("div"); - curveBox_sub_div - .attr("class","component_inner") - .style("overflow-y","auto") - .style("position","absolute") - .style("max-height",height_components+"px"); - - svg = d3.select("#"+div_id+" div.component_outter div.component_inner").append("svg"); - } - - else{ - svg = d3.select("#"+div_id).append("svg"); - } - - ////////////// Calculate Axis & Scales =>////////////// - //// Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. - //// For zero curves, need to look into rectange and lines for x scales maybe? - //// Need to handle scales in linear, log, or arbitary user-provided scale. - //// Also, need x function for gridlines! so....? - - ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// - let mins = []; - let maxes = []; - for (let i = 0; i < curve_names.length; i++) { - let min_this = d3.min(data, function(d) { return +d[curve_names[i]];}); - let max_this = d3.max(data, function(d) { return +d[curve_names[i]];}); - mins.push(min_this); - maxes.push(max_this); - } - let min_all_curves = d3.min(mins); - let max_all_curves = d3.max(maxes); - - if (curve_names.length == 0){ - //// THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! - min_all_curves = 0; - max_all_curves = 100; - } - ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// - let x_func; - let x; - let xAxis_header; - let xAxis; - if (flag_for_single_scale_or_independent_scales = "single"){ - for (let i = 0; i < curve_names.length; i++) { - let min_this = d3.min(data, function(d) { return +d[curve_names[i]];}); - let max_this = d3.max(data, function(d) { return +d[curve_names[i]];}); - mins.push(min_this); - maxes.push(max_this); - } - min_all_curves = d3.min(mins); - max_all_curves = d3.max(maxes); - x = d3.scaleLinear().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]); - if(scale_linear_log_or_yours == "log"){ - x = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]); - } - else if(scale_linear_log_or_yours == "linear"){} - else if(typeof(scale_linear_log_or_yours) !== "string"){ - x = scale_linear_log_or_yours["yours"]; - } - xAxis_header = g => g.attr("transform", "translate(0,45)").call(d3.axisBottom(x).ticks((width-margin.left-margin.right)/25).tickSizeOuter(0)); - - - } - - //////////////////// define y scale, aka the one for the depth //////////////////// - let y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom,margin.top]); - //let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) - let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); - let yAxis2 = g => g.attr("transform", `translate(${margin.left-35},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); - - - ////////////// Building curvebox parts that aren't header. First define size & title =>////////////// - svg.attr("class","components"); - svg.attr("width",width) - .attr("height",height); - svg.style("margin","0 auto"); - svg.style("overflow","scroll"); - - if (header_sep_svg_or_not == "no"){ - let xAxis = xAxis_header; - svg.append("g") - .call(xAxis) - .append("text") - .text("test svg"); - } - - let y_axis_text = depth_curve_name+" "+depth_units_string+" "+depth_type_string; - svg.append("g") - .call(yAxis) - .append("text") - .attr("transform", "rotate(-90)") - .attr("dy", ".75em") - .attr("y", 0 - (margin.left*0.6)) - .attr("x",((height)/-2)+margin.top) - .style("text-anchor", "end") - .text(y_axis_text) - .style("fill","#2b2929"); - - //// - // svg.append("g") - // .call(yAxis2) - // .append("text") - // .attr("transform", "rotate(-90)") - // .attr("dy", ".75em") - // .attr("y", -35) - // .attr("x",((height)/-2)+margin.top) - // .style("text-anchor", "end") - // .text(y_axis_text+"THIS IS THE SECOND ONE") - // .style("fill","#2b2929") - //// - - //svg.append("g") - //// Code that assumes multiple curves are plotted in same curvebox - let distance_from_top = -15; - if(title !== ""){ - svg.append("text") // - .attr("x", (margin.left/3+(width/2))) - .attr("y", 0 + (- distance_from_top)) - .attr("text-anchor", "middle") - .style("font-size", template_overall["title"]["title_font_size"]) - .text(title); - } - - if(gridlines == "yes"){ - var gridlines_obj = d3.axisTop() - .ticks((width-margin.left-margin.right)/25) - .tickFormat("") - .tickSize(-height+margin.top+10) - .scale(x); - svg.append("g") - .attr("class", "grid") - .call(gridlines_obj) - .style("stroke",gridlines_color) - .style("stroke-width",gridlines_stroke_width); - } - + , + + /////////////////////////////// + //// Functions for getting data from LAS files and reformatting to a wellio.js style JSON. + /////////////////////////////// + + /** + * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {object} well_log_json a full wellio style JSON + * @param {array} CurveNames array of curve names as strings + * @param {string} UWI a string the represents the well name + * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. + */ + convertWellJSONToObj: function (well_log_json, CurveNames, UWI, depth_curve_name) { + let depth = well_log_json["CURVES"][depth_curve_name]; + let curve_data = []; + for (let eachCr in CurveNames) { + curve_data.push(well_log_json["CURVES"][CurveNames[eachCr]]); + } + let array_of_obj = []; + if (depth.length === well_log_json["CURVES"][CurveNames[0]].length) { + for (let eachPt = 0; eachPt < depth.length; eachPt++) { + let obj = {}; + obj["UWI"] = UWI; + for (let i = 0; i < CurveNames.length; i++) { + obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); + } + array_of_obj.push(obj); + } + } else { + console.log("depth didn't match curve length"); + array_of_obj.push("depth didn't match curve length"); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions for getting basic information out of wellio.js style JSON for plotting + /////////////////////////////// + + /////// this require wellio! + // fileToJSON:function (afile){ + // return module.exports.wellio.las2json(afile) + // }, + ///////// + // turnFilesIntoTextIntoWellioJSON:function (files_array){ + // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + // let logs_in_json = [] + // for (let i = 0; i < files_array.length; i++) { + // logs_in_json.push(module.exports.fileToJSON(files_array[i])) + // } + // return logs_in_json + // }, + + + /** + * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, + * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. + * the data array of objects that D3.js likes for data used in plotting. + * @param {object} jsonWell a full wellio style JSON + * @param {string} depth_curve_name String for the depth curve name + * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} + */ + fromJSONofWEllGetThingsForPlotting: function (jsonWell, depth_curve_name) { + curve_names = Object.keys(jsonWell["CURVES"]); + uwi = jsonWell["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + depth_curve_name = depth_curve_name; + well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell, curve_names, uwi, depth_curve_name); + return { + "well_log_curves_reformatted_for_d3": well_log_curves_reformatted_for_d3, + "curve_names": curve_names, + "uwi": uwi + }; + }, + + + /////////////////////////////// + //// Functions for reformatting data other than wellio.js style JSON + /////////////////////////////// + + + /** + * createDepthArray is a function that takes in a min float, max float, and step float value. + * and returns an array or depth values from the min to the max value going by the step value each step. + * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. + * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. + * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. + * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. + * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] + */ + createDepthArray: function (min, max, step) { + //// Returns an array of depth values from min to max, including both, with each being different by step value + //// ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) + let depth = []; + min = parseFloat(min); + max = parseFloat(max); + step = parseFloat(step); + let number_of_points = ((max - min) / step) + 1; + let temp_depth = min; + for (let i = 0; i < number_of_points; i++) { + temp_depth = (min + (i * step)).toFixed(7); + depth.push(parseFloat(temp_depth)); + } + return depth; + }, + + + /** + * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. + * THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! + */ + takeInArraysAndGetObjectOfCurveDataForPlotting: function (arraysOfCurvesAndNames, CurveName, DepthName) { + //// would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") + // [{"depth":[],"curveData":[]}] + // [{"depth":[],"curveData":[]}] + let curveObj = []; + // make sure the curve data arrays are the same lenght, if not add null values + + // put them into object + let lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; + for (let i = 0; i < lengthOfCurve0; i++) { + let newObj = {[DepthName]: 0, "RHOB": 0}; + newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; + newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; + curveObj.push(newObj); + } + return curveObj; + }, + + + /** + * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. + * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. + * @param {string} UWI A string for the well log UWI ID + * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data + * @returns {array} An array of objects properly formatted for next step ___. + */ + convertWellJSONToObjV2: function (depth, curve_data, UWI, CurveNames) { + depth = depth[0]; + array_of_obj = []; + for (eachPt in depth) { + obj = {}; + obj["UWI"] = UWI; + for (i in CurveNames) { + obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); + obj["DEPTH"] = parseFloat(depth[eachPt]); + } + array_of_obj.push(obj); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. + /////////////////////////////// + + /** + * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. + * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. + * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. + */ + putIncomingSparseJsonIntoPlottingTemplate: function (incoming_sparse, template) { + if (incoming_sparse[0]["single_curve_box_or_cross_section"] == "multiple") { + console.log("THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE "); + return "THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE"; + } else { + let curve_box_obj = incoming_sparse[0]["curve_boxes"][0]; + let curve_box_overall = incoming_sparse[0]["curve_boxes"][0]["curve_box"]; + let curve_box_components = incoming_sparse[0]["curve_boxes"][0]["components"]; + template[0]["curve_box"] = curve_box_overall; + template[0]["components"][0]["lines"] = curve_box_components[0]["lines"]; + template[0]["components"][0]["rectangles"] = curve_box_components[0]["rectangles"]; + + ///// Establish template with empty arrays except for value that are shared for all curves + ///// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX + template[0]["components"][0]["curves"][0]["data_type"] = "curve"; + template[0]["components"][0]["curves"][0]["depth_type_string"] = curve_box_components[0]["curves"][0]["depth_type_string"]; + template[0]["components"][0]["curves"][0]["depth_units_string"] = curve_box_components[0]["curves"][0]["depth_units_string"]; + template[0]["components"][0]["curves"][0]["depth_curve_name"] = curve_box_components[0]["curves"][0]["depth_curve_name"]; + ///// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. + template[0]["components"][0]["curves"][0]["curve_names"] = []; + template[0]["components"][0]["curves"][0]["curve_colors"] = []; + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"] = []; + template[0]["components"][0]["curves"][0]["stroke_width"] = []; + template[0]["components"][0]["curves"][0]["stroke_linecap"] = []; + template[0]["components"][0]["curves"][0]["fill"] = []; + template[0]["components"][0]["curves"][0]["data_id"] = []; + template[0]["components"][0]["curves"][0]["well_names"] = []; + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"] = []; + template[0]["components"][0]["curves"][0]["line_color"] = []; + template[0]["components"][0]["curves"][0]["max_depth"] = []; + template[0]["components"][0]["curves"][0]["min_depth"] = []; + template[0]["components"][0]["curves"][0]["null_value"] = []; + + template[0]["components"][0]["curves"][0]["data"] = []; + + ///// For each curve object in incoming data: + let array_individual_curves_and_depth_objects = []; + let all_depths_list = []; + let all_depths_set = []; + + for (let i = 0; i < curve_box_components[0]["curves"].length; i++) { + + let curve = curve_box_components[0]["curves"][i]; + template[0]["components"][0]["curves"][0]["curve_names"].push(curve["curve_type"]); + template[0]["components"][0]["curves"][0]["curve_colors"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"].push(curve["curve_stroke_dasharray"]); + template[0]["components"][0]["curves"][0]["stroke_width"].push(curve["stroke_width"]); + template[0]["components"][0]["curves"][0]["stroke_linecap"].push(curve["stroke_linecap"]); + template[0]["components"][0]["curves"][0]["fill"].push(curve["fill"]); + template[0]["components"][0]["curves"][0]["data_id"].push(curve["data_id"]); + template[0]["components"][0]["curves"][0]["well_names"].push(curve["well_name"]); + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"].push(curve["scale_linear_log_or_yours"]); + template[0]["components"][0]["curves"][0]["line_color"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["max_depth"].push(curve["max_depth"]); + template[0]["components"][0]["curves"][0]["min_depth"].push(curve["min_depth"]); + template[0]["components"][0]["curves"][0]["null_value"].push(curve["null_value"]); + //// + let depth_array = module.exports.createDepthArray(curve["min_depth"], curve["max_depth"], curve["step"]); + let curve_array = curve["curve_values"]; + let curve_name = curve["curve_type"]; + let depth_curve_name = curve["depth_curve_name"]; + //// the function below is off...someting undefined + let obj_starter = [{[depth_curve_name]: depth_array, [curve_name]: curve_array}]; + + let reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter, curve_name, depth_curve_name); + //// + array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); + //// + + all_depths_list = all_depths_list.concat(depth_array); + } + + /// Get array of unique depth values from all curves by calling set on an array of depth values + all_depths_set = [...new Set(all_depths_list)]; + + let objects_helper = {}; + + for (let j = 0; j < all_depths_set.length; j++) { + /// create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] + objects_helper[all_depths_set[j]] = {[template[0]["components"][0]["curves"][0]["depth_curve_name"]]: all_depths_set[j]}; + } + + //// now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} + //// for each curve {"depth":value,"curve_name":value} in each curve array of objects... + /////// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object + for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { + let this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; + for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { + let this_obj = this_depth_plus_curve_obj[l]; + + let curve_name = curve_box_components[0]["curves"][k]["curve_type"]; + let depth_name = curve_box_components[0]["curves"][k]["depth_curve_name"]; + + /// add curve value as key/value pair to right object based on depth key + + objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; + + } + } + + /// get rid of depth key and just have the objects..put in array if not returned as array + //// return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] + let data = Object.keys(objects_helper).map(function (key) { + return objects_helper[key]; + }); + + let depth_name = template[0]["components"][0]["curves"][0]["depth_curve_name"]; + data = data.sort(function (a, b) { + return parseFloat(a.depth_name) - parseFloat(b.depth_name); + }); + + // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) + function sortFloat(a, b) { + return a - b; + } + + function sortNumber(a, b) { + return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); + } + + template[0]["components"][0]["curves"][0]["data"] = data.sort(sortNumber); + return template; + + } + }, + + + /////////////////////////////// + //// Functions that take Wellio.js style JSON and handle everything from transformation to plotting + /////////////////////////////// + + /** + * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! + * @param {*} logs_in_json + * @param {*} div_id + * @param {*} example_template + * @param {*} curve_name + * @param {*} curve_color + * @param {*} curve_unit + * @param {*} fill + * @param {*} depth_name + * @param {*} width + * @param {*} height + */ + putArrayOfLogsIntoSection: function (logs_in_json, div_id, example_template, curve_name, curve_color, curve_unit, fill, depth_name, width, height) { + const noSVG = module.exports.d3.select("#" + div_id).selectAll("svg").remove(); + // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) + let new_templates = []; + for (let i = 0; i < logs_in_json.length; i++) { + let three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i], depth_name); + let new_data = three_things2["well_log_curves_reformatted_for_d3"]; + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = new_data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = [three_things2["uwi"]]; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = [curve_name]; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = [curve_color]; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = [curve_unit]; + example_template_n[0]["components"][0]["curves"][0]["fill"] = [fill]; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_name; + let svg_holder = module.exports.d3.select("#" + div_id).append("div"); + svg_holder.style("vertical-align", "middle") + .attr("id", div_id + "svg_holder" + i) + .style("display", "inline-block"); + example_template_n[0]["curve_box"]["div_id"] = div_id + "svg_holder" + i; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + new_templates.push(example_template_n); + module.exports.curveBox(example_template_n); + } + return new_templates; + }, + + /** + * minimumDataIntoTemplateFunc + * @param + */ + minimumDataIntoTemplateFunc: function (example_template, data, well_names, curve_names, curve_colors, curve_units, fill, div_id, width, height, depth_curve_name) { + //// remember that all curve components should be an array, even if one item! + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = well_names; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = curve_names; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = curve_colors; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = curve_units; + example_template_n[0]["components"][0]["curves"][0]["fill"] = fill; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_curve_name; + example_template_n[0]["curve_box"]["div_id"] = div_id; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + return example_template_n; + }, + + + /////////////////////////////// + //// Actual plotting functions after all the necessary information is compiled in necessary format + /////////////////////////////// + + /** + * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. + * @param {object} well_curve_config_template + * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. + */ + curveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + + ////////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// + //// These parts of the function establish variables from the config JSON in shorter variable names + //// If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined + // default values might be defined here for cases where they are accidentally not defined + + let template_overall = template_for_plotting[0]["curve_box"]; + let template_components = template_for_plotting[0]["components"]; + let template_curves = template_components[0]["curves"][0]; + let template_lines = template_components[0]["lines"]; + let template_rectangles = template_components[0]["rectangles"]; + let title = ""; + //// Determine if title exists for the curve_box. + if (template_overall["show_title"] != "yes") { + let title = ""; + } else { + title = template_overall["title"]["text"]; + } + /// Parameters that define shape & size of overall curve box + let width = template_overall["width"]; + let height_multiplier_components = 0.95; + if (template_overall["height_multiplier_components"]) { + height_multiplier_components = template_overall["height_multiplier_components"]; + } + let height = template_overall["height"] * height_multiplier_components; + let height_components = template_overall["height"]; + let margin = template_overall["margin"]; + let header_sep_svg_or_not = template_overall["header_sep_svg_or_not"]; + let svg_header_height = template_overall["svg_header_height"]; + let gridlines = template_overall["gridlines"]; + let gridlines_color = template_overall["gridlines_color"]; + let gridlines_stroke_width = template_overall["gridlines_stroke_width"]; + //// variables for how to draw mouseover of hover box + let mouseover_yes_or_no = template_overall["mouseover_yes_or_no"]; + let mouseover_depth_or_depth_and_curve = template_overall["mouseover_depth_or_depth_and_curve"]; + let mouseover_curvename = template_overall["mouseover_curvename"]; //// default is first curve + let mouseover_color_or_default_which_is_curve_color = template_overall["mouseover_color_or_default_which_is_curve_color"]; + + let secondary_depth_exist = "no"; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW + + //// Data is in d3.js form. An array of objects consisting of single level key:value pairs + let data = template_curves["data"]; + //// Variables related to curves, these should all be arrays with one or more values! + let curve_names = template_curves["curve_names"]; + let curve_colors = template_curves["curve_colors"]; + let curve_stroke_dasharray = template_curves["curve_stroke_dasharray"]; + let curve_name = curve_names[0]; + let curve_color = curve_colors[0]; + let curve_units = template_curves["curve_units"]; + let scale_linear_log_or_yours = template_curves["scale_linear_log_or_yours"]; + if (template_curves["curve_units"]) { + curve_units = template_curves["curve_units"]; + } else { + curve_units = ""; + } + + //////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON + let flag_for_single_scale_or_independent_scales = template_overall["grouped_or_independent_x_scales"]; + let grouped_or_independent_x_scale = template_overall["grouped_or_independent_x_scales"]; + + + //// The depth_curve_name needs to be the same for all curves plotted! + let depth_curve_name = ""; + if (template_curves["depth_curve_name"].length > 1 && typeof (template_curves["depth_curve_name"]) == "object" && template_curves["depth_curve_name"][0] !== template_curves["depth_curve_name"][1] + ) { + depth_curve_name = "depth_curve_name is not the same in two or more curves"; + } else { + depth_curve_name = template_curves["depth_curve_name"]; + } + let depth_type_string = ""; + if ( + template_curves["depth_type_string"].length > 1 && typeof (template_curves["depth_type_string"]) == "object" && template_curves["depth_type_string"][0] != template_curves["depth_type_string"][1] + ) { + depth_type_string = "depth type string is not the same in two or more curves"; + } else if (template_curves["depth_type_string"][0] == "") { + depth_type_string = ""; + } else if (template_curves["depth_type_string"]) { + depth_type_string = "- " + template_curves["depth_type_string"]; + } + let depth_units_string = ""; + if (template_curves["depth_units_string"] && template_curves["depth_units_string"][0] !== "") { + depth_units_string = "- " + template_curves["depth_units_string"]; + } + + ///// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// + let div_id = template_overall["div_id"]; + if (template_overall["div_id"]) { + div_id = template_overall["div_id"]; + } else { + return "there_was_no_div_id_in_the_template"; + } + + d3.select("#" + div_id).selectAll("*").remove(); + + ///////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// +// //// Calculate depth min and max if depth min and/or max is not given explicitly in the template + let depth_min; + let depth_max; + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["min"] == "autocalculate") { + depth_min = d3.min(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_min = template_curves["depth_limits"][0]["min"]; + } + //// max depth + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["max"] == "autocalculate") { + depth_max = d3.max(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_max = template_curves["depth_limits"][0]["max"]; + } + + + // [depth_max,depth_min] + //// Apply depth min and max to incoming well log data + //// To save time, we'll first check if the first object in the array had as depth that is smaller than min + //// and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. + + if (data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max) { + } else { + data = data.filter(function (objects) { + return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; + }); + } + + // let depth_min = -1000000 + // let depth_max = 1000000 + + if (template_curves["min_depth"][0] == "autocalculate" || template_curves["min_depth"] == "autocalculate") { + depth_min = data[0][depth_curve_name]; + } else { + depth_min = template_curves["min_depth"]; + } + if (template_curves["max_depth"][0] == "autocalculate" || template_curves["max_depth"] == "autocalculate") { + depth_max = data[data.length - 1][depth_curve_name]; + } else { + depth_max = template_curves["max_depth"]; + } + + // let depth_min = template_curves["min_depth"][0] + // let depth_max = template_curves["max_depth"][0] + + ///////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + + ////////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// + let svg = ""; + let svg_holder = ""; + let svg_header = ""; + if (header_sep_svg_or_not == "yes") { + + svg_holder = d3.select("#" + div_id).append("div") + .attr("class", "svg_holder") + .style("overflow-x", "auto"); + + svg_header = d3.select("#" + div_id + " div.svg_holder").append("svg"); + svg_header.attr("class", "header"); + svg_header.attr("width", width) + .attr("height", svg_header_height); ///// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! + svg_header.append("g"); + svg_header.style("display", "block"); + + let depth_string_on_top = ""; + if (depth_type_string == "") { + depth_string_on_top = depth_curve_name; + } else { + depth_string_on_top = depth_type_string.replace("- ", ""); + } + + svg_header.append("text") + .attr("x", (margin.left) / 2) + .attr("y", "1em") + .attr("text-anchor", "middle") + .style("font-size", "10px") + .style("text-decoration", "underline") + .text(depth_curve_name); + if (depth_type_string != "") { + let depth_type_string_x_pos = 0; + let depth_type_string_x_pos_anch = "start"; + if (secondary_depth_exist == "no") { + depth_type_string_x_pos = margin.left / 2; + depth_type_string_x_pos_anch = "middle"; + } + svg_header.append("text") + .attr("x", depth_type_string_x_pos) + .attr("y", "3em") + .attr("text-anchor", depth_type_string_x_pos_anch) + .style("font-size", "8px") + .style("text-decoration", "underline") + .text(depth_string_on_top); + } + + //svg_header.append("text") + // .attr("x", margin.left) + // .attr("y", "4em") + // .attr("text-anchor", "end") + // .style("font-size", "6px") + // .style("text-decoration", "underline") + // .text("2nd TVD"); + + ///////// change this!!!!! + if (title !== "Elephants") { + let distance_from_top = -15; + svg_header.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + const curveBox_main_div = d3.select("#" + div_id).append("div"); + curveBox_main_div + .attr("height", height_components + "px") + .attr("class", "component_outter") + .style("display", "flex") + .style("position", "relative") + .style("box-sizing", "border-box"); + + const curveBox_sub_div = d3.select("#" + div_id + " div.component_outter").append("div"); + curveBox_sub_div + .attr("class", "component_inner") + .style("overflow-y", "auto") + .style("position", "absolute") + .style("max-height", height_components + "px"); + + svg = d3.select("#" + div_id + " div.component_outter div.component_inner").append("svg"); + } else { + svg = d3.select("#" + div_id).append("svg"); + } + + ////////////// Calculate Axis & Scales =>////////////// + //// Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. + //// For zero curves, need to look into rectange and lines for x scales maybe? + //// Need to handle scales in linear, log, or arbitary user-provided scale. + //// Also, need x function for gridlines! so....? + + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let mins = []; + let maxes = []; + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + let min_all_curves = d3.min(mins); + let max_all_curves = d3.max(maxes); + + if (curve_names.length == 0) { + //// THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! + min_all_curves = 0; + max_all_curves = 100; + } + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let x_func; + let x; + let xAxis_header; + let xAxis; + if (flag_for_single_scale_or_independent_scales = "single") { + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + min_all_curves = d3.min(mins); + max_all_curves = d3.max(maxes); + x = d3.scaleLinear().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + xAxis_header = g => g.attr("transform", "translate(0,45)").call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + + + } + + //////////////////// define y scale, aka the one for the depth //////////////////// + let y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom, margin.top]); + //let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + let yAxis2 = g => g.attr("transform", `translate(${margin.left - 35},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + + + ////////////// Building curvebox parts that aren't header. First define size & title =>////////////// + svg.attr("class", "components"); + svg.attr("width", width) + .attr("height", height); + svg.style("margin", "0 auto"); + svg.style("overflow", "scroll"); + + if (header_sep_svg_or_not == "no") { + let xAxis = xAxis_header; + svg.append("g") + .call(xAxis) + .append("text") + .text("test svg"); + } + + let y_axis_text = depth_curve_name + " " + depth_units_string + " " + depth_type_string; + svg.append("g") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("dy", ".75em") + .attr("y", 0 - (margin.left * 0.6)) + .attr("x", ((height) / -2) + margin.top) + .style("text-anchor", "end") + .text(y_axis_text) + .style("fill", "#2b2929"); + + //// + // svg.append("g") + // .call(yAxis2) + // .append("text") + // .attr("transform", "rotate(-90)") + // .attr("dy", ".75em") + // .attr("y", -35) + // .attr("x",((height)/-2)+margin.top) + // .style("text-anchor", "end") + // .text(y_axis_text+"THIS IS THE SECOND ONE") + // .style("fill","#2b2929") + //// + + //svg.append("g") + //// Code that assumes multiple curves are plotted in same curvebox + let distance_from_top = -15; + if (title !== "") { + svg.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + if (gridlines == "yes") { + var gridlines_obj = d3.axisTop() + .ticks((width - margin.left - margin.right) / 25) + .tickFormat("") + .tickSize(-height + margin.top + 10) + .scale(x); + svg.append("g") + .attr("class", "grid") + .call(gridlines_obj) + .style("stroke", gridlines_color) + .style("stroke-width", gridlines_stroke_width); + } + // //// This will help save the x axis function for first curve if there are more than one curve // /// and they are at different scales. We need this in order to use the 'between' method of fill! @@ -1089,369 +1163,382 @@ minimumDataIntoTemplateFunc: function (example_template,data,well_names,curve_na // //// This will help save the x axis function for fourth curve if there are more than one curve // /// and they are at different scales. We need this in order to use the 'between' method of fill! // let x_for_k_is_3 - - let x_functions_for_each_curvename = {}; //// populate with {"curvename":curvename,"x_func":func} - - ////////////// Building curves within curvebox =>////////////// - for (let k = 0; k < curve_names.length; k++) { - //// code that creates a line for each Curve in order provided and applies - //// the color in the color array in order provided - - let curveUnit = ""; - if (curve_units[k]){curveUnit = curve_units[k];} - let min = mins[k]; - let max = maxes[k]; - - let header_text_line = min.toFixed(1)+" - "+curve_names[k]+" "+curveUnit+" - "+max.toFixed(1); - let min_this = d3.min(data, function(d) { return +d[curve_names[k]];}); - let max_this = d3.max(data, function(d) { return +d[curve_names[k]];}); - let x = d3.scaleLinear().domain([min_this,max_this]).nice().range([margin.left, width - margin.right]); - if(scale_linear_log_or_yours == "log"){ - x = d3.scaleLog().domain([min_this,max_this]).nice().range([margin.left, width - margin.right]); - } - else if(scale_linear_log_or_yours == "linear"){} - else if(typeof(scale_linear_log_or_yours) !== "string"){ - x = scale_linear_log_or_yours["yours"]; - } - if(k==0){ - x_func == x; - } - //// This creates an object to hold multiple x axis scale functions - //// that will be used if 'between' style fill is selected. - x_functions_for_each_curvename[curve_names[k]] = x; - - ////////////// Header text, two way depending on =>////////////// - if (header_sep_svg_or_not == "yes"){ - let distance_from_top = (1+(k*2.7)).toString()+"em"; - svg_header.append("text") - .attr("x", (margin.left+width)/2) - .attr("y", 0 + distance_from_top) - .attr("text-anchor", "middle") - .style("font-size", "11px") - .style("text-decoration", "underline") - .style("fill",curve_colors[k]) - .text(header_text_line); - let translate_string = "translate(0,"+(45-(30*k)).toString()+")"; - xAxis_header = g => g.attr("transform", translate_string).call(d3.axisBottom(x).ticks((width-margin.left-margin.right)/25).tickSizeOuter(0)); - svg_header.append("g") - .call(xAxis_header) - .append("text"); - - } - let another_line = d3.line().x(d => x(d[curve_names[k]])).y(d => y(d[depth_curve_name])); - ////////////// Appends a curve line but doesn't include fill yet =>////////////// - svg.append("path") - .datum(data) - .attr("fill", "none") - .attr("stroke", curve_colors[k]) - .attr("stroke-width", template_curves["stroke_width"][k]) - .attr("stroke-linecap", template_curves["stroke_linecap"][k]) - .attr("stroke-dasharray",curve_stroke_dasharray[k]) - .attr("d", another_line); - } - - - ////////////// define the area filled under the curve =>////////////// - - for (let i = 0; i < template_curves["fill"].length; i++) { - //let i = k - if (template_curves["fill"][i]["fill"] == "yes"){ - let number_colors = template_curves["fill"][i]["fill_colors"].length; - let curve_name1 = template_curves["fill"][i]["curve_name"]; - let threshold = -99999999; - let fill_color = "gray"; - for (let j = 0; j < number_colors; j++) { - let area1 = d3.area(); - if (number_colors != 0){ - threshold = template_curves["fill"][i]["cutoffs"][j]; - fill_color = template_curves["fill"][i]["fill_colors"][j]; + + let x_functions_for_each_curvename = {}; //// populate with {"curvename":curvename,"x_func":func} + + ////////////// Building curves within curvebox =>////////////// + for (let k = 0; k < curve_names.length; k++) { + //// code that creates a line for each Curve in order provided and applies + //// the color in the color array in order provided + + let curveUnit = ""; + if (curve_units[k]) { + curveUnit = curve_units[k]; + } + let min = mins[k]; + let max = maxes[k]; + + let header_text_line = min.toFixed(1) + " - " + curve_names[k] + " " + curveUnit + " - " + max.toFixed(1); + let min_this = d3.min(data, function (d) { + return +d[curve_names[k]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[k]]; + }); + let x = d3.scaleLinear().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + if (k == 0) { + x_func == x; } - if(template_curves["fill"][i]["fill_direction"] == "left"){ - let start_from_left = template_overall["margin"]["left"]; - area1 - .x1(d => x(d[curve_name1])) - .x0(d => start_from_left) - .defined(d => ((d[curve_name1])>threshold)) - .y(d => y(d[depth_curve_name])); - } - if(template_curves["fill"][i]["fill_direction"] == "right"){ - let start_from_right = template_overall["margin"]["right"]; - let start_from_left = template_overall["margin"]["left"]; - area1 - .x1(d => width-start_from_right) - .defined(d => ((d[curve_name1])>threshold)) - .x0(d => x(d[curve_name1])) - .y(d => y(d[depth_curve_name])); - } - if(template_curves["fill"][i]["fill_direction"] == "between"){ - let between_2_curve = template_curves["fill"][i]["curve2"]; - //// for through x_functions_for_each_curvename object and find the key that - //// matches between_2_curve which should be a curvename - //// get the x function for the second curve and the curve that is curvenames[k] - let second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; - let first_curve_x_func = x_functions_for_each_curvename[curve_name1]; - area1 - .x1(d => first_curve_x_func(d[curve_name1])) - .x0(d => second_curve_x_func(d[between_2_curve])) - // .defined(d => ((d[curve_name1])<=d[between_2_curve])) - .y(d => y(d[depth_curve_name])); - } - svg.append("path") + //// This creates an object to hold multiple x axis scale functions + //// that will be used if 'between' style fill is selected. + x_functions_for_each_curvename[curve_names[k]] = x; + + ////////////// Header text, two way depending on =>////////////// + if (header_sep_svg_or_not == "yes") { + let distance_from_top = (1 + (k * 2.7)).toString() + "em"; + svg_header.append("text") + .attr("x", (margin.left + width) / 2) + .attr("y", 0 + distance_from_top) + .attr("text-anchor", "middle") + .style("font-size", "11px") + .style("text-decoration", "underline") + .style("fill", curve_colors[k]) + .text(header_text_line); + let translate_string = "translate(0," + (45 - (30 * k)).toString() + ")"; + xAxis_header = g => g.attr("transform", translate_string).call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + svg_header.append("g") + .call(xAxis_header) + .append("text"); + + } + let another_line = d3.line().x(d => x(d[curve_names[k]])).y(d => y(d[depth_curve_name])); + ////////////// Appends a curve line but doesn't include fill yet =>////////////// + svg.append("path") .datum(data) - .attr("class", "area") - .attr("d", area1) - .attr("stroke", "none") - .attr("fill",fill_color) - .attr("fill-opacity",0.8); - } - } - } - - //////////////// TOOLTIP Part 1 /////////////////// - if(mouseover_yes_or_no == "no"){ - console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); - } - else{ - //// statements to make sure the mouseover_curvename is a present curve and if not use first curve - if(mouseover_curvename == "default"){mouseover_curvename = curve_names[0];} - else if (curve_names.includes(mouseover_curvename)){mouseover_curvename = mouseover_curvename;} - else{mouseover_curvename = curve_names[0];} - - //// statement to handle color of curve text and circle on hover - let curve_on_mouseover_color = curve_colors[0]; - if(mouseover_color_or_default_which_is_curve_color != "default"){ - curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; - } - - //// appends start of mouseover rectange used for showing hover content - var focus = svg.append("g") - .style("display", "none"); - - var bisectDate = d3.bisector(function(d) { return d[depth_curve_name]; }).left; // ** - - //// function called to change hover style & contents when mouseover rectangle appended to svg svg - function mousemove() { - var y0 = y.invert(d3.mouse(this)[1]), - i = bisectDate(data, y0, 1), - d0 = data[i - 1], - d1 = data[i], - d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; - - //// fixed value along y axis - let fixed_x_value = width*0.8; - - //// depth value - focus.select("text.y2") - .attr("transform", - // "translate(" + x(d[mouseover_curvename]) + "," + - "translate(" + fixed_x_value + "," + - y(d[depth_curve_name]) + ")") - .text(d[depth_curve_name]); - - //// curve value - focus.select("text.y4") - .attr("transform", - "translate(" + fixed_x_value + "," + - y(d[depth_curve_name]) + ")") - .text(d[curve_names[0]]); - - focus.select(".x") - .attr("transform", - "translate(" + x(d[mouseover_curvename]) + "," + 0+ - ")") - .attr("y2", height); - //// circle y class part 2 - focus.select(".y") - .attr("transform", - "translate(" + x(d[mouseover_curvename]) + "," + - y(d[depth_curve_name]) + ")") - .text(d[mouseover_curvename]); - focus.select(".yl") - .attr("transform", - "translate(" + 0 + "," + - y(d[depth_curve_name]) + ")") - .text(d[mouseover_curvename]); - } - // append the x line - focus.append("line") - .attr("class", "x") - .style("stroke", "blue") - .style("stroke-dasharray", "3,3") - .style("opacity", 0.5) - .attr("y1", 0) - .attr("y2", width); - - // append the y line - focus.append("line") - .attr("class", "yl") - .style("stroke", "blue") - .style("stroke-dasharray", "3,3") - .style("opacity", 0.5) - .attr("x1", 0) - .attr("x2", height); - - // append the circle at the intersection - focus.append("circle") - .attr("class", "y") - .style("fill", "none") - .style("stroke", curve_on_mouseover_color) - .attr("r", 3); - - //// depth value on hover - if(mouseover_depth_or_depth_and_curve == "depth" || mouseover_depth_or_depth_and_curve == "depth_and_curve"){ - focus.append("text") - .attr("class", "y2") - .attr("dx", 6) - .attr("dy", "-.3em") - .style("font-size","0.55em"); - } - - //// curve value on hover - if(mouseover_depth_or_depth_and_curve == "curve" || mouseover_depth_or_depth_and_curve == "depth_and_curve"){ - focus.append("text") - .attr("class", "y4") - .attr("dx", 1) - .attr("dy", "0.5em") - .style("font-size","0.55em") - .style("fill", "black") - .style("stroke", curve_on_mouseover_color) - .style("stroke-width", "0.5px"); - } - - // append the rectangle to capture mouse // ********** - svg.append("rect") // ********** - .attr("width", width) // ********** - .attr("height", height) // ********** - .style("fill", "none") // ********** - .style("pointer-events", "all") // ********** - .on("mouseover", function() { focus.style("display", null); }) - .on("mouseout", function() { focus.style("display", "none"); }) - .on("mousemove", mousemove); // ********** - } - - ////////////// Horizontal Lines AKA tops =>////////////// - try { - for (let i = 0; i < template_lines.length; i++) { - let this_line = template_lines[i]; - svg.append("line") - .attr("x1", 0+margin.left) - .attr("y1", y(this_line["depth"])) - .attr("x2", width*0.75) - .attr("y2", y(this_line["depth"])) - .style("stroke-width", this_line["stroke_width"]) - .style("stroke", this_line["color"]) - .style("stroke-dasharray", this_line["stroke-dasharray"]) - .style("stroke-linecap", this_line["stroke_linecap"]) - .style("fill", "none"); - - svg.append("text") - .attr("x", width*0.75) - .attr("y", y(this_line["depth"])) - .attr("text-anchor", "start") - .style("font-size", "12px") - .text(this_line["label"]); - } - } - catch (err){ - console.log("could not do lines for tops in curveBox function, error: ",err); - } - - ////////////// Rectangles for things like cores & sample locations =>////////////// - try { - for (let i = 0; i < template_rectangles.length; i++) { - let this_rectangle = template_rectangles[i]; - svg.append("rect") - .attr("x", 50+margin.left) - .attr("y", y(this_rectangle.depth_top)) - .attr("width", this_rectangle.width) - .attr("height",this_rectangle.height) - .style("stroke-width", this_rectangle.stroke_width) - .style("stroke-linecap", this_rectangle.stroke_linecap) - .style("stroke", "purple") - .style("fill", this_rectangle.fill) - .style("opacity", this_rectangle.opacity); - - svg.append("text") - .attr("x", width*0.75) - .attr("y", y(this_rectangle.depth_top)) - .attr("text-anchor", "start") - .style("font-size", "12px") - .text(this_rectangle.label); - } - } - catch (err){ - console.log("could not do rectangle in curveBox function for some reason. error= ",err); - } - - ////////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// - svg_holder.node(); - svg_header.node(); - return svg.node(); - }, - - - ////////// - /** - * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. - * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to - * @param {object} templates An array of CurveBox input templates - * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! - */ - multipleLogPlot:function(div_id,templates,show_all=true){ - let d3 = module.exports.d3; - let noDIV = d3.select("#"+div_id).selectAll("div").remove(); - let noSVG = d3.select("#"+div_id).selectAll("svg").remove(); - let new_templates = []; - for (let i = 0; i < templates.length; i++) { - let curvebox_holder = d3.select("#"+div_id).append("div"); - curvebox_holder.style("vertical-align","middle") - .attr("id",div_id+"curvebox_holder"+i); - //// to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! - if(show_all){ - curvebox_holder.style("display","inline-block"); - } - else{ - curvebox_holder.style("display","none"); + .attr("fill", "none") + .attr("stroke", curve_colors[k]) + .attr("stroke-width", template_curves["stroke_width"][k]) + .attr("stroke-linecap", template_curves["stroke_linecap"][k]) + .attr("stroke-dasharray", curve_stroke_dasharray[k]) + .attr("d", another_line); + } + + + ////////////// define the area filled under the curve =>////////////// + + for (let i = 0; i < template_curves["fill"].length; i++) { + //let i = k + if (template_curves["fill"][i]["fill"] == "yes") { + let number_colors = template_curves["fill"][i]["fill_colors"].length; + let curve_name1 = template_curves["fill"][i]["curve_name"]; + let threshold = -99999999; + let fill_color = "gray"; + for (let j = 0; j < number_colors; j++) { + let area1 = d3.area(); + if (number_colors != 0) { + threshold = template_curves["fill"][i]["cutoffs"][j]; + fill_color = template_curves["fill"][i]["fill_colors"][j]; + } + if (template_curves["fill"][i]["fill_direction"] == "left") { + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => x(d[curve_name1])) + .x0(d => start_from_left) + .defined(d => ((d[curve_name1]) > threshold)) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "right") { + let start_from_right = template_overall["margin"]["right"]; + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => width - start_from_right) + .defined(d => ((d[curve_name1]) > threshold)) + .x0(d => x(d[curve_name1])) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "between") { + let between_2_curve = template_curves["fill"][i]["curve2"]; + //// for through x_functions_for_each_curvename object and find the key that + //// matches between_2_curve which should be a curvename + //// get the x function for the second curve and the curve that is curvenames[k] + let second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; + let first_curve_x_func = x_functions_for_each_curvename[curve_name1]; + area1 + .x1(d => first_curve_x_func(d[curve_name1])) + .x0(d => second_curve_x_func(d[between_2_curve])) + // .defined(d => ((d[curve_name1])<=d[between_2_curve])) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill", fill_color) + .attr("fill-opacity", 0.8); + } + } + } + + //////////////// TOOLTIP Part 1 /////////////////// + if (mouseover_yes_or_no == "no") { + console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); + } else { + //// statements to make sure the mouseover_curvename is a present curve and if not use first curve + if (mouseover_curvename == "default") { + mouseover_curvename = curve_names[0]; + } else if (curve_names.includes(mouseover_curvename)) { + mouseover_curvename = mouseover_curvename; + } else { + mouseover_curvename = curve_names[0]; + } + + //// statement to handle color of curve text and circle on hover + let curve_on_mouseover_color = curve_colors[0]; + if (mouseover_color_or_default_which_is_curve_color != "default") { + curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; + } + + //// appends start of mouseover rectange used for showing hover content + var focus = svg.append("g") + .style("display", "none"); + + var bisectDate = d3.bisector(function (d) { + return d[depth_curve_name]; + }).left; // ** + + //// function called to change hover style & contents when mouseover rectangle appended to svg svg + function mousemove() { + var y0 = y.invert(d3.mouse(this)[1]), + i = bisectDate(data, y0, 1), + d0 = data[i - 1], + d1 = data[i], + d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; + + //// fixed value along y axis + let fixed_x_value = width * 0.8; + + //// depth value + focus.select("text.y2") + .attr("transform", + // "translate(" + x(d[mouseover_curvename]) + "," + + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[depth_curve_name]); + + //// curve value + focus.select("text.y4") + .attr("transform", + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[curve_names[0]]); + + focus.select(".x") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + 0 + + ")") + .attr("y2", height); + //// circle y class part 2 + focus.select(".y") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + focus.select(".yl") + .attr("transform", + "translate(" + 0 + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + } + + // append the x line + focus.append("line") + .attr("class", "x") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("y1", 0) + .attr("y2", width); + + // append the y line + focus.append("line") + .attr("class", "yl") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("x1", 0) + .attr("x2", height); + + // append the circle at the intersection + focus.append("circle") + .attr("class", "y") + .style("fill", "none") + .style("stroke", curve_on_mouseover_color) + .attr("r", 3); + + //// depth value on hover + if (mouseover_depth_or_depth_and_curve == "depth" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y2") + .attr("dx", 6) + .attr("dy", "-.3em") + .style("font-size", "0.55em"); + } + + //// curve value on hover + if (mouseover_depth_or_depth_and_curve == "curve" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y4") + .attr("dx", 1) + .attr("dy", "0.5em") + .style("font-size", "0.55em") + .style("fill", "black") + .style("stroke", curve_on_mouseover_color) + .style("stroke-width", "0.5px"); + } + + // append the rectangle to capture mouse // ********** + svg.append("rect") // ********** + .attr("width", width) // ********** + .attr("height", height) // ********** + .style("fill", "none") // ********** + .style("pointer-events", "all") // ********** + .on("mouseover", function () { + focus.style("display", null); + }) + .on("mouseout", function () { + focus.style("display", "none"); + }) + .on("mousemove", mousemove); // ********** + } + + ////////////// Horizontal Lines AKA tops =>////////////// + try { + for (let i = 0; i < template_lines.length; i++) { + let this_line = template_lines[i]; + svg.append("line") + .attr("x1", 0 + margin.left) + .attr("y1", y(this_line["depth"])) + .attr("x2", width * 0.75) + .attr("y2", y(this_line["depth"])) + .style("stroke-width", this_line["stroke_width"]) + .style("stroke", this_line["color"]) + .style("stroke-dasharray", this_line["stroke-dasharray"]) + .style("stroke-linecap", this_line["stroke_linecap"]) + .style("fill", "none"); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_line["depth"])) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_line["label"]); + } + } catch (err) { + console.log("could not do lines for tops in curveBox function, error: ", err); + } + + ////////////// Rectangles for things like cores & sample locations =>////////////// + try { + for (let i = 0; i < template_rectangles.length; i++) { + let this_rectangle = template_rectangles[i]; + svg.append("rect") + .attr("x", 50 + margin.left) + .attr("y", y(this_rectangle.depth_top)) + .attr("width", this_rectangle.width) + .attr("height", this_rectangle.height) + .style("stroke-width", this_rectangle.stroke_width) + .style("stroke-linecap", this_rectangle.stroke_linecap) + .style("stroke", "purple") + .style("fill", this_rectangle.fill) + .style("opacity", this_rectangle.opacity); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_rectangle.depth_top)) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_rectangle.label); + } + } catch (err) { + console.log("could not do rectangle in curveBox function for some reason. error= ", err); + } + + ////////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// + svg_holder.node(); + svg_header.node(); + return svg.node(); + }, + + + ////////// + /** + * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. + * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to + * @param {object} templates An array of CurveBox input templates + * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! + */ + multipleLogPlot: function (div_id, templates, show_all = true) { + let d3 = module.exports.d3; + let noDIV = d3.select("#" + div_id).selectAll("div").remove(); + let noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let new_templates = []; + for (let i = 0; i < templates.length; i++) { + let curvebox_holder = d3.select("#" + div_id).append("div"); + curvebox_holder.style("vertical-align", "middle") + .attr("id", div_id + "curvebox_holder" + i); + //// to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! + if (show_all) { + curvebox_holder.style("display", "inline-block"); + } else { + curvebox_holder.style("display", "none"); + } + templates[i][0]["curve_box"]["div_id"] = div_id + "curvebox_holder" + i; + new_templates.push(templates[i]); + let template = templates[i]; + let check = module.exports.curveBox(template); + } + return new_templates; + }, + /** + * This function is used to plot a single curveboxe in the div listed in the plotting templates div_id key. + * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. + * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. + * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. + */ + makeThisCurveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + let div_id = template_for_plotting[0]["curve_box"]["div_id"]; + const noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let curve_box_return = module.exports.curveBox(template_for_plotting); + return curve_box_return; + }, + /** + * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. + * In certain environments, this may not work for security reasons. + * @param {string} svgEl An SVG element returned from the curveBox function. + * @param {string} name The name of the file to be downloaded. + */ + saveSvg: function (svgEl, name) { + svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + var svgData = svgEl.outerHTML; + var preface = "\r\n"; + var svgBlob = new Blob([preface, svgData], {type: "image/svg+xml;charset=utf-8"}); + var svgUrl = URL.createObjectURL(svgBlob); + var downloadLink = document.createElement("a"); + downloadLink.href = svgUrl; + downloadLink.download = name; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); } - templates[i][0]["curve_box"]["div_id"] = div_id+"curvebox_holder"+i; - new_templates.push(templates[i]); - let template = templates[i]; - let check = module.exports.curveBox(template); - } - return new_templates; - }, - /** - * This function is used to plot a single curveboxe in the div listed in the plotting templates div_id key. - * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. - * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. - * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. - */ - makeThisCurveBox:function(template_for_plotting){ - let d3 = module.exports.d3; - let div_id = template_for_plotting[0]["curve_box"]["div_id"]; - const noSVG = d3.select("#"+div_id).selectAll("svg").remove(); - let curve_box_return = module.exports.curveBox(template_for_plotting); - return curve_box_return; - }, - /** - * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. - * In certain environments, this may not work for security reasons. - * @param {string} svgEl An SVG element returned from the curveBox function. - * @param {string} name The name of the file to be downloaded. - */ - saveSvg:function(svgEl, name) { - svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); - var svgData = svgEl.outerHTML; - var preface = "\r\n"; - var svgBlob = new Blob([preface, svgData], {type:"image/svg+xml;charset=utf-8"}); - var svgUrl = URL.createObjectURL(svgBlob); - var downloadLink = document.createElement("a"); - downloadLink.href = svgUrl; - downloadLink.download = name; - document.body.appendChild(downloadLink); - downloadLink.click(); - document.body.removeChild(downloadLink); - } -}; - -return module.exports;}); + }; + + return module.exports; +}); diff --git a/panel_test_app/app.py b/panel_test_app/app.py index e78b305..3b891af 100644 --- a/panel_test_app/app.py +++ b/panel_test_app/app.py @@ -3,16 +3,31 @@ if __name__ == "__main__": - # css_files=['https://api.tiles.mapbox.com/mapbox-gl-js/v0.44.1/mapbox-gl.css']) + current_file = __file__.split('/') docs_files = current_file[:-2] main_dir = current_file[:-2] + docs_files.append('docs') docs_path = '/'.join(docs_files) main_dir = '/'.join(main_dir) - with open(docs_path + '/index.html', 'r', encoding='utf-8') as html_file: + css_file = main_dir + '/docs/css/main.css' + with open('panel_idx.html', 'r', encoding='utf-8') as html_file: index_html = html_file.read() - pn.extension('d3', js_files={'wellio': main_dir + '/dist/index.js'}) + pn.extension(js_files={ + 'd3': "https://d3js.org/d3.v5.min.js", + 'wellio': main_dir + '/dist/index.js', + 'vkbeautify': main_dir + "/docs/js/vkbeautify.js", + 'wellioviz': main_dir + "/node_modules/wellioviz/dist/index.js", + 'make_a_plot': main_dir + '/panel_test_app/make_a_plot.js', + 'g3': main_dir + 'dist/index.js', + 'g3p2': main_dir + '/docs/js/call_plots.js', + 'main': main_dir + '/docs/js/main.js"', + 'las_to_json': main_dir + '/docs/js/bundle.js' + }, + + css_file=css_file + ) main_column = pn.Column(width=900) - main_column.append(pn.panel(index_html)) + main_column.append(pn.pane.HTML(index_html)) main_column.show() diff --git a/panel_test_app/panel_idx.html b/panel_test_app/panel_idx.html new file mode 100644 index 0000000..dfd8f6d --- /dev/null +++ b/panel_test_app/panel_idx.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    "HELLO!"

    +

    Smaller Header

    +
    + + + + + + + From a7e063f961b4479e9d1a42613f6f507330141391 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Mon, 8 Jun 2020 20:15:51 -0700 Subject: [PATCH 07/17] completed two test, non-notebook MVP deployments of wellioviz.js package. Going to work on features and refactoring next. --- example_deployments/example_panel_app/main.py | 26 + .../example_panel_app/static/css/main.css | 65 + .../static/js}/make_a_plot.js | 32 - .../example_panel_app/static/js/test_bokeh.js | 6 + .../static/js/wellio/bundle.js | 22873 ++++++++++++++++ .../static/js/wellioviz/dist/index.js | 1544 ++ .../js/wellioviz/dist/index_eslint_busted.js | 1435 + .../js/wellioviz/dist/index_eslint_busted2.js | 1435 + .../static/js/wellioviz/dist/test/test.js | 109 + .../static/js/wellioviz/dist/trial.js | 1 + .../example_panel_app/templates/index.html | 24 + .../example_panel_app/templates/js/bundle.js | 22873 ++++++++++++++++ .../templates/js/call_plots.js | 215 + .../templates/js/get_wellio.js | 5 + .../example_panel_app/templates/js/main.js | 235 + .../js/old_for_reference/bundle_old_1.js | 635 + .../js/old_for_reference/bundle_old_temp.js | 635 + .../js/old_for_reference/call_plots_old.js | 111 + .../templates/js/vkbeautify.js | 356 + .../example_panel_app/templates/main.js | 2 + .../example_panel_app/templates/styles.css | 1 + .../00-01-11-082-23W4-0.LAS | 0 .../00_01-01-073-05W5_0-1.json | 0 example_standalone_webpage/make_a_plot.js | 59 + .../static/test_bokeh.js | 4 + .../well_log_viz/curve_box.js | 0 .../well_log_viz/d3.js | 0 .../well_log_viz/format_template.js | 0 .../well_log_viz/single_well_log_display.js | 0 .../well_log_viz/test_log.html | 0 .../well_log_viz/test_log.json | 0 .../well_viz_html.html | 0 panel_test_app/app.py | 18 - panel_test_app/panel_idx.html | 37 - 34 files changed, 52649 insertions(+), 87 deletions(-) create mode 100644 example_deployments/example_panel_app/main.py create mode 100644 example_deployments/example_panel_app/static/css/main.css rename {panel_test_app => example_deployments/example_panel_app/static/js}/make_a_plot.js (63%) create mode 100644 example_deployments/example_panel_app/static/js/test_bokeh.js create mode 100644 example_deployments/example_panel_app/static/js/wellio/bundle.js create mode 100644 example_deployments/example_panel_app/static/js/wellioviz/dist/index.js create mode 100644 example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted.js create mode 100644 example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted2.js create mode 100644 example_deployments/example_panel_app/static/js/wellioviz/dist/test/test.js create mode 100644 example_deployments/example_panel_app/static/js/wellioviz/dist/trial.js create mode 100644 example_deployments/example_panel_app/templates/index.html create mode 100644 example_deployments/example_panel_app/templates/js/bundle.js create mode 100644 example_deployments/example_panel_app/templates/js/call_plots.js create mode 100644 example_deployments/example_panel_app/templates/js/get_wellio.js create mode 100644 example_deployments/example_panel_app/templates/js/main.js create mode 100644 example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_1.js create mode 100644 example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_temp.js create mode 100644 example_deployments/example_panel_app/templates/js/old_for_reference/call_plots_old.js create mode 100644 example_deployments/example_panel_app/templates/js/vkbeautify.js create mode 100644 example_deployments/example_panel_app/templates/main.js create mode 100644 example_deployments/example_panel_app/templates/styles.css rename {panel_test_app => example_standalone_webpage}/00-01-11-082-23W4-0.LAS (100%) rename {panel_test_app => example_standalone_webpage}/00_01-01-073-05W5_0-1.json (100%) create mode 100644 example_standalone_webpage/make_a_plot.js create mode 100644 example_standalone_webpage/static/test_bokeh.js rename {panel_test_app => example_standalone_webpage}/well_log_viz/curve_box.js (100%) rename {panel_test_app => example_standalone_webpage}/well_log_viz/d3.js (100%) rename {panel_test_app => example_standalone_webpage}/well_log_viz/format_template.js (100%) rename {panel_test_app => example_standalone_webpage}/well_log_viz/single_well_log_display.js (100%) rename {panel_test_app => example_standalone_webpage}/well_log_viz/test_log.html (100%) rename {panel_test_app => example_standalone_webpage}/well_log_viz/test_log.json (100%) rename {panel_test_app => example_standalone_webpage}/well_viz_html.html (100%) delete mode 100644 panel_test_app/app.py delete mode 100644 panel_test_app/panel_idx.html diff --git a/example_deployments/example_panel_app/main.py b/example_deployments/example_panel_app/main.py new file mode 100644 index 0000000..6d0d568 --- /dev/null +++ b/example_deployments/example_panel_app/main.py @@ -0,0 +1,26 @@ +from bokeh.plotting import curdoc +from bokeh.models import Button, CustomJS +from bokeh.application.handlers.directory import DirectoryHandler +import panel as pn + +pn.extension( + js_files={ + # 'wellio': main_dir + '/dist/index.js', + # 'd3': 'https://d3js.org/d3.v5.min.js', + # 'wellioviz': main_dir + "/node_modules/wellioviz/dist/index.js", + # 'wellio': main_dir + "/docs/js/bundle.js", + # 'my_gist': "make_a_plot.js", + # 'my_test2': "./static/js/test_bokeh.js" + }, + # css_file=main_dir + "../docs/css/main.css" + ) +with open('panel_idx.html', 'r', encoding='utf-8') as html_file: + index_html = html_file.read() +main_column = pn.Column(width=900) +main_column.append(pn.panel(index_html)) +curdoc().append(main_column) + +# button = Button(label='Click Me') +# button.callback = CustomJS(code=""" alert($) """) +# +# curdoc().add_root(button) diff --git a/example_deployments/example_panel_app/static/css/main.css b/example_deployments/example_panel_app/static/css/main.css new file mode 100644 index 0000000..701b544 --- /dev/null +++ b/example_deployments/example_panel_app/static/css/main.css @@ -0,0 +1,65 @@ + +.plot_holder{ + margin-top: 10px; + float:left; +} + +.log_plot{ + margin-top:10px; +} + +.thumb { + height: 75px; + border: 1px solid #000; + margin: 10px 5px 0 0; +} + + +[hidden] { + display: none !important; +} + +.well_file_upload { + position: absolute; + z-index: 2; + top: 0; + left: 0; + filter: opacity(0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + opacity: 0; + background-color: transparent; + color: transparent; +} + + +div.well_step { + margin-top: 1em; +} + +div.well_step_left { + margin-top: 1em; + margin-bottom: 1em; + float: left; + width: 100%; +} + +div.well_pos_relative { + position: relative; +} + +div.well_left_full_width { + float: left; + width: 100% +} + +div.well_left { + float: left; +} + +button.unavailable { + color:"white"; +} + +div.groupBorder{ + border-style: ridge; +} \ No newline at end of file diff --git a/panel_test_app/make_a_plot.js b/example_deployments/example_panel_app/static/js/make_a_plot.js similarity index 63% rename from panel_test_app/make_a_plot.js rename to example_deployments/example_panel_app/static/js/make_a_plot.js index 626c18d..a973cc5 100644 --- a/panel_test_app/make_a_plot.js +++ b/example_deployments/example_panel_app/static/js/make_a_plot.js @@ -56,36 +56,4 @@ async function plot_log(div_id) { "curve2": "" }], "well_holder_1D", 200, 700, "DEPT") wellioviz.multipleLogPlot(div_id, [gr_plot_template_noFill, gr_plot_template_1, resd_plot_template_1, poro_plot_template_1], true) - - // Get Template - // d3.json(json_file).then(function (data) { - // // Load json and plot it - // // let well_d3_obj = wellioviz.convertWellJSONToObj( - // // data, - // // Object.keys(data.CURVES), - // // data['WELL INFORMATION BLOCK']['UWI']['DATA'], - // // 'DEPTH') - // let ShaleSiltCutOff = 80 - // let SiltSandCutOff = 55 - // let three_things_2 = wellioviz.fromJSONofWEllGetThingsForPlotting(data, 'DEPTH') - // var example_template = wellioviz.curveBoxTemplateExamples("example") - // gr_plot_template_1 = wellioviz.minimumDataIntoTemplateFunc(example_template, three_things_2['well_log_curves_reformatted_for_d3'], three_things_2['uwi'], ["GR"], ["black"], ["API"], - // [{ - // "curve_name": "GR", - // "fill": "yes", - // "fill_direction": "right", - // "cutoffs": [0, ShaleSiltCutOff, SiltSandCutOff], - // "fill_colors": ["yellow", "orange", "gray"], - // "curve2": "" - // }], "well_holder_1A", 200, 800, "DEPTH") - // // cali_plot_template_noFill = wellioviz.minimumDataIntoTemplateFunc(example_template,three_things_2['well_log_curves_reformatted_for_d3'],three_things_2['uwi'],["CALI"],["black"],["IN"],[ - // // {"curve_name":"GR","fill":"no","fill_direction":"left","cutoffs":[0,ShaleSiltCutOff,SiltSandCutOff],"fill_colors":["gray","orange","yellow"],"curve2":""}],"well_holder_1A",200,800,"DEPTH") - // result_1 = wellioviz.multipleLogPlot(div_id, [gr_plot_template_1], true) - // - // - // // return visualization - // // return result_1 - // }) - // return result_1 - } \ No newline at end of file diff --git a/example_deployments/example_panel_app/static/js/test_bokeh.js b/example_deployments/example_panel_app/static/js/test_bokeh.js new file mode 100644 index 0000000..4e7e5d2 --- /dev/null +++ b/example_deployments/example_panel_app/static/js/test_bokeh.js @@ -0,0 +1,6 @@ +console.log('hi!') + +function say_hi() { + console.log('hi2') +} + diff --git a/example_deployments/example_panel_app/static/js/wellio/bundle.js b/example_deployments/example_panel_app/static/js/wellio/bundle.js new file mode 100644 index 0000000..b378032 --- /dev/null +++ b/example_deployments/example_panel_app/static/js/wellio/bundle.js @@ -0,0 +1,22873 @@ +(function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = "function" == typeof require && require; + if (!f && c) return c(i, !0); + if (u) return u(i, !0); + var a = new Error("Cannot find module '" + i + "'"); + throw a.code = "MODULE_NOT_FOUND", a + } + var p = n[i] = {exports: {}}; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r) + }, p, p.exports, r, e, n, t) + } + return n[i].exports + } + + for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) o(t[i]); + return o + } + + return r +})()({ + 1: [function (require, module, exports) { + + }, {}], + 2: [function (require, module, exports) { +// shim for using process in browser + var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + + var cachedSetTimeout; + var cachedClearTimeout; + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + + function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); + } + + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + }()) + + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + + } + + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + } + + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + +// v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() { + } + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + + process.listeners = function (name) { + return [] + } + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { + return '/' + }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function () { + return 0; + }; + + }, {}], + 3: [function (require, module, exports) { + (function (global) { + !function (e) { + "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.commonJsModule = e() : "undefined" != typeof global ? global.commonJsModule = e() : "undefined" != typeof self && (self.commonJsModule = e()); + }(function () { + var define, module, exports; + module = {exports: (exports = {})}; + +// Copyright 2019 Justin Gosses + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + // /////////////////////////////// + // /** + // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, + // * particularly those already converted to JSON, using the d3.js visualization library." + // * + // * It is designed with a single central function curveBox, that returns SVGs. + // * A variety of helper functions take in differently formatted JSONs of information about the well + // * log curves to plot and how to plot them. + // * + // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. + // * + // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a + // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. + // * + // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, + // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. + // */ + + module.exports = { + /** + * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" + * @returns {obj} It returns the wellio.js object and all its functions as a module. + */ + wellio: require("wellio"), + + /** + * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" + * @returns {obj} It returns the d3.js object and all its functions as a module. + */ + d3: require("d3"), + + /** + * A function that directs users to the docs if they need help. + * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. + */ + help: function () { + return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; + }, + + + /** + * A function that returns a short description of what the wellioviz library is all about. + * @returns {string} Returns a string that defines wellioviz. + */ + define_wellioviz: function () { + return "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library."; + }, + /////////////////////////////// + + /** + * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. + * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. + * This is used to help construct the JSON object that is given to the curveBox plotting function. + * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. + * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" + */ + curveBoxTemplateExamples: function (string_of_either__help_example_definitions_mandatories) { + let request_string = string_of_either__help_example_definitions_mandatories; + if (request_string == "help") { + return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; + } + if (request_string == "example") { + return [{ + "curve_box": { + "show_well_name": "yes", /// not built yet + "show_depth_type": "no", /// not built yet + "show_curve_units": "yes", /// not built yet + "curve_box_depth_min": -999, /// not built yet + "curve_box_depth_max": -999, /// not built yet + "take_out_null_or_visualize": "no", /// not built yet + "show_title": "no", + "width": 260, + "height": 500, + "height_multiplier_components": 2, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "well_holder_3", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectanges", "lines"], /// not built yet + "lines_connected_across_curveboxes": "no", /// not built yet + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "curve", + "curve_names": ["RHOB"], + "curve_colors": ["black"], + "curve_stroke_dasharray": ["solid"], + "stroke_linecap": ["butt"], + "stroke_width": [1], + "fill": [ + { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + } + ], + "curve_units": ["g/cm3"], + "depth_limits": [{"min": "autocalculate", "max": "autocalculate"}], + "curve_limits": [{"curve_name": "", "min": -10000000, "max": 3}], + "data": [{"depth": 1598.3, "RHOB": 2.2322}, { + "depth": 1598.4, + "RHOB": 2.0513 + }, {"depth": 1598.5, "RHOB": 2.2548}, { + "depth": 1598.6, + "RHOB": 2.9445 + }, {"depth": 1598.7, "RHOB": 2.2223}, { + "depth": 1598.8, + "RHOB": 2.447 + }, {"depth": 1598.9, "RHOB": 2.598}, { + "depth": 1599, + "RHOB": 2.8088 + }, {"depth": 1599.1, "RHOB": 2.2248}, { + "depth": 1599.2, + "RHOB": 2.2399 + }, {"depth": 1599.3, "RHOB": 2.251}, { + "depth": 1599.4, + "RHOB": 2.255 + }, {"depth": 1599.5, "RHOB": 2.2526}, { + "depth": 1599.6, + "RHOB": 2.2322 + }, {"depth": 1599.7, "RHOB": 2.2513}, { + "depth": 1599.8, + "RHOB": 2.2548 + }, {"depth": 1599.9, "RHOB": 2.2445}, { + "depth": 1600, + "RHOB": 2.2223 + }, {"depth": 1600.1, "RHOB": 2.2047}, {"depth": 1600.2, "RHOB": 2.198}], /// not built yet + "depth_curve_name": "DEPT",/// not built yet + ////// + "data_id": ["placeholder_data_id",], /// not built yet + "well_names": [""], /// not built yet + "scale_linear_log_or_yours": ["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string": [""], + "depth_units_string": [""], + "null_value": [""], /// not built yet + } + ], + "lines": [ + { + "data_type": "line", /// not built yet + "label": "example", /// not built yet + "depth": -999, /// not built yet + "color": "red", /// not built yet + "stroke_width": "3px", /// not built yet + "stroke_style": "solid", /// not built yet + "transparency": 1.0, /// not built yet + "stroke_linecap": "butt" + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 0, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "defintions") { + return [{ + "curve_box": { + "show_well_name": "yes or no. If '' is no", // not built yet + "show_depth_type": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "curve_box_depth_max": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "take_out_null_or_visualize": "yes or no. If '' is no", // not built yet + "show_title": "yes or no. If '' is no", // not built yet + "width": "number, if blank default is 250", + "height": "number, if blank default is 500", + "height_multiplier_components": "An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.", + "margin": " should be an object like {\"top\": 10, \"right\": 10, \"bottom\": 30, \"left\": 60} if missing will default to these values", + "title": "object like:{\"text\": \"\", \"title_font_size\": \"10px\"} if default, an empty string, \"\" will skill", + "div_id": "should be a string that equals a div id like: 'well_holder' Do not include the #", ///What happens if div doesn't exist? + "order_of_component": "Should be an array of strings that correlate to component types like:[\"curves\",\"rectangles\",\"lines\"]", // not built yet + "lines_connected_across_curveboxes": "yes or no. If '' is no", // not built yet + "header_sep_svg_or_not": "yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", + "svg_header_height": "Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.", + "gridlines": "yes or no as strings. Default is 'yes'", + "gridlines_color": "Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", + "gridlines_stroke_width": "thickness of the line. Default is 0.20", + "grouped_or_independent_x_scales": "independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.", // not built yet + "curve_names": "array of strings representing curve_names like: ['GR','RESD']", + "curve_colors": "array of strings representing colors using common names or rgb style like:[\"black\",\"rgb(205,0,0,1)\"]", + "curve_stroke_dasharray": "A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", + "stroke_width": "The width of the curve line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "an array of objects one for each curve like: [{\"curve_name\":\"RHOB\",\"fill\":\"yes\",\"fill_direction\":\"left\",\"cutoffs\":[0.21,2.23,2.24],\"fill_colors\":[\"gray\",\"beige\",\"white\"],\"curve2\":\"\"}]", + "curve_units": "an array of strings that are curve units like: [\"g/cm2\",\"API\",\"\"] must equal length other curve fields", + "depth_limits": "An array of objects that contains the min and max depth for each curve like: [{\"min\":\"autocalculate\",\"max\":\"autocalculate\"}]", + "curve_limits": "An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{\"curve_name\":\"GR\",\"min\":0,\"max\":100},{\"curve_name\":\"PDF\",\"min\":0,\"max\":100}]", + "data": "Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{\"UWI\":\"111aa\",\"DEPTH\":4140.5,\"GR\":0},{\"UWI\":\"111aa\",\"DEPTH\":4141,\"GR\":0}] for the entire depth of the well being showin the curve_box", + "depth_curve_name": "A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", + ////// + "data_id": ["array of strings whose length must equal curve_units, curve_names, etc."], // not built yet + "well_names": "An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.", // not built yet /// + "scale_linear_log_or_yours": "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", + + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", + "max_depth": "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", + "min_depth": "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", + "depth_type_string": "All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", + "depth_units_string": "units of depth, examples are meters,m., cm., feet, etc.", + "null_value": "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']" + } + ], + "lines": [ + { + "data_type": "must be string, will be ignored if not \"line\", \"curve\", or \"rectangle\"", + "label": "The label for horiztonal line in string form", + "depth": "number for the depth at which the line is placed", + "color": "string for the color of the line in common color name or RGB format. If '' then black will be used.", + "stroke_width": "A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", + "stroke_style": "Should be string, if not or doesnt exist will be treated as \"solid\"", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "transparency": "Should be float between 0.0 and 1.0. Otherwise default is 1.0." + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": "A number for the depth of the upper left corner of the rectangle", // + "x_starting_upper_left_corner": "A number for the x axis value of the upper left corner of the rectangle", + "width": "Width of rectangle as number", + "height": "Height of rectangle as number", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", + "opacity": "Float between 0 and 1 that represents the opacity of the fill, default is 0.5", + "label": "String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet + "label_orientation": "A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet + "lable_position": "Exceptable strings are top, center, right, left, bottom. Default right." // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "mandatories") { + return [ + "This is not yet populated!!!!" + ]; + } + }, + + /** + * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. + * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. + * It is used next by funtion ____ and ___. + * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. + */ + getFakeIncomingSparseDataExample: function () { + input_sparse_style = [{ + "single_curve_box_or_cross_section": "single", + "cross_section_title": "", + "width": 1040, /// not skippable, check if number // default if blank or missing =250 or autocalculate? + "height": 500, /// not skippable, check if number // default if blank or missing=500 + //////////////////////////// + "curve_boxes": [{ + "curve_box": { + "show_well_name": "yes", // not built yet /// Should be skip-able /// default=No + "show_depth_type": "no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "curve_box_depth_max": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "take_out_null_or_visualize": "no", // not built yet /// Should be skip-able /// default=No + "show_title": "no", // not built into plotting template yet /// Should be skip-able /// default=No + "width": 260, /// not skippable, check if number // default if blank or missing =250 + "height": 500, /// not skippable, check if number // default if blank or missing=500 + "height_multiplier_components": 3, // default if missing is 0.95 + "margin": {"top": 50, "right": 10, "bottom": 30, "left": 60}, /// not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. + "title": {"text": "", "title_font_size": "10px"}, /// Should be skip-able // default=skip + "div_id": "well_holder4", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectangles", "lines"], // not built yet, default is curve, then line, then rectangle + "lines_connected_across_curve_boxes": "no", // not built yet, default is skip function + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + + }, + "components": [{ + "curves": [ + { + "data_type": "curve", // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. + "data_id": "placeholder_data_id", // not built yet /// can be anything, just used for tracking & is optional + "well_name": "", // not built yet /// Ideally string. Will skip function if "" + "curve_type": "RHOB", // should be string. name of curve + "curve_values": [ + 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], /// Should be array. If not array, return error message? + "step": 0.1, /// Should be number. If not array, return error message? + "units": "g/cc", /// should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. + "scale_linear_log_or_yours": "linear", + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "rgb(205,0,0,1)", /// Test for string, if string use. If not string "black" + "curve_stroke_dasharray": "5,5", + "stroke_linecap": "butt", + "stroke_width": 0.5, + "fill": { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + }, + "data_ID": "", + "max_depth": "1607.3", /// should be number, if not number or doens't exit then "autocalculate" + "min_depth": "1598.3", /// should be number, if not number or doens't exit then "autocalculate" + "depth_type_string": "TVDSS", /// should be string, if not or doesn't exist, then skip func + "depth_units_string": "md", + "depth_curve_name": "DEPTH", /// should be string, ideally all depth curve names are the same + "null_value": "", // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. + "x_max": 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + "x_min": 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + } + ], + "lines": [ + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 1", /// Ideally a string. + "depth": 1601.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "blue", /// should be string, if not or doesn't exist use "black" + "stroke_width": "3px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 1.0 /// should be number between 0 and 1, if not or doesn't exist use 1. + }, + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 2", /// Ideally a string. + "depth": 1602.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "orange", /// should be string, if not or doesn't exist use "black" + "stroke_width": "5px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 0.5 /// should be number between 0 and 1, if not or doesn't exist use 1. + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 1601, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }] + }]; + return input_sparse_style; + } + , + + /////////////////////////////// + //// Functions for getting data from LAS files and reformatting to a wellio.js style JSON. + /////////////////////////////// + + /** + * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {object} well_log_json a full wellio style JSON + * @param {array} CurveNames array of curve names as strings + * @param {string} UWI a string the represents the well name + * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. + */ + convertWellJSONToObj: function (well_log_json, CurveNames, UWI, depth_curve_name) { + let depth = well_log_json["CURVES"][depth_curve_name]; + let curve_data = []; + for (let eachCr in CurveNames) { + curve_data.push(well_log_json["CURVES"][CurveNames[eachCr]]); + } + let array_of_obj = []; + if (depth.length === well_log_json["CURVES"][CurveNames[0]].length) { + for (let eachPt = 0; eachPt < depth.length; eachPt++) { + let obj = {}; + obj["UWI"] = UWI; + for (let i = 0; i < CurveNames.length; i++) { + obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); + } + array_of_obj.push(obj); + } + } else { + console.log("depth didn't match curve length"); + array_of_obj.push("depth didn't match curve length"); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions for getting basic information out of wellio.js style JSON for plotting + /////////////////////////////// + + /////// this require wellio! + // fileToJSON:function (afile){ + // return module.exports.wellio.las2json(afile) + // }, + ///////// + // turnFilesIntoTextIntoWellioJSON:function (files_array){ + // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + // let logs_in_json = [] + // for (let i = 0; i < files_array.length; i++) { + // logs_in_json.push(module.exports.fileToJSON(files_array[i])) + // } + // return logs_in_json + // }, + + + /** + * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, + * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. + * the data array of objects that D3.js likes for data used in plotting. + * @param {object} jsonWell a full wellio style JSON + * @param {string} depth_curve_name String for the depth curve name + * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} + */ + fromJSONofWEllGetThingsForPlotting: function (jsonWell, depth_curve_name) { + curve_names = Object.keys(jsonWell["CURVES"]); + uwi = jsonWell["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + depth_curve_name = depth_curve_name; + well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell, curve_names, uwi, depth_curve_name); + return { + "well_log_curves_reformatted_for_d3": well_log_curves_reformatted_for_d3, + "curve_names": curve_names, + "uwi": uwi + }; + }, + + + /////////////////////////////// + //// Functions for reformatting data other than wellio.js style JSON + /////////////////////////////// + + + /** + * createDepthArray is a function that takes in a min float, max float, and step float value. + * and returns an array or depth values from the min to the max value going by the step value each step. + * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. + * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. + * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. + * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. + * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] + */ + createDepthArray: function (min, max, step) { + //// Returns an array of depth values from min to max, including both, with each being different by step value + //// ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) + let depth = []; + min = parseFloat(min); + max = parseFloat(max); + step = parseFloat(step); + let number_of_points = ((max - min) / step) + 1; + let temp_depth = min; + for (let i = 0; i < number_of_points; i++) { + temp_depth = (min + (i * step)).toFixed(7); + depth.push(parseFloat(temp_depth)); + } + return depth; + }, + + + /** + * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. + * THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! + */ + takeInArraysAndGetObjectOfCurveDataForPlotting: function (arraysOfCurvesAndNames, CurveName, DepthName) { + //// would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") + // [{"depth":[],"curveData":[]}] + // [{"depth":[],"curveData":[]}] + let curveObj = []; + // make sure the curve data arrays are the same lenght, if not add null values + + // put them into object + let lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; + for (let i = 0; i < lengthOfCurve0; i++) { + let newObj = {[DepthName]: 0, "RHOB": 0}; + newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; + newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; + curveObj.push(newObj); + } + return curveObj; + }, + + + /** + * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. + * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. + * @param {string} UWI A string for the well log UWI ID + * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data + * @returns {array} An array of objects properly formatted for next step ___. + */ + convertWellJSONToObjV2: function (depth, curve_data, UWI, CurveNames) { + depth = depth[0]; + array_of_obj = []; + for (eachPt in depth) { + obj = {}; + obj["UWI"] = UWI; + for (i in CurveNames) { + obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); + obj["DEPTH"] = parseFloat(depth[eachPt]); + } + array_of_obj.push(obj); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. + /////////////////////////////// + + /** + * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. + * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. + * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. + */ + putIncomingSparseJsonIntoPlottingTemplate: function (incoming_sparse, template) { + if (incoming_sparse[0]["single_curve_box_or_cross_section"] == "multiple") { + console.log("THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE "); + return "THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE"; + } else { + let curve_box_obj = incoming_sparse[0]["curve_boxes"][0]; + let curve_box_overall = incoming_sparse[0]["curve_boxes"][0]["curve_box"]; + let curve_box_components = incoming_sparse[0]["curve_boxes"][0]["components"]; + template[0]["curve_box"] = curve_box_overall; + template[0]["components"][0]["lines"] = curve_box_components[0]["lines"]; + template[0]["components"][0]["rectangles"] = curve_box_components[0]["rectangles"]; + + ///// Establish template with empty arrays except for value that are shared for all curves + ///// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX + template[0]["components"][0]["curves"][0]["data_type"] = "curve"; + template[0]["components"][0]["curves"][0]["depth_type_string"] = curve_box_components[0]["curves"][0]["depth_type_string"]; + template[0]["components"][0]["curves"][0]["depth_units_string"] = curve_box_components[0]["curves"][0]["depth_units_string"]; + template[0]["components"][0]["curves"][0]["depth_curve_name"] = curve_box_components[0]["curves"][0]["depth_curve_name"]; + ///// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. + template[0]["components"][0]["curves"][0]["curve_names"] = []; + template[0]["components"][0]["curves"][0]["curve_colors"] = []; + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"] = []; + template[0]["components"][0]["curves"][0]["stroke_width"] = []; + template[0]["components"][0]["curves"][0]["stroke_linecap"] = []; + template[0]["components"][0]["curves"][0]["fill"] = []; + template[0]["components"][0]["curves"][0]["data_id"] = []; + template[0]["components"][0]["curves"][0]["well_names"] = []; + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"] = []; + template[0]["components"][0]["curves"][0]["line_color"] = []; + template[0]["components"][0]["curves"][0]["max_depth"] = []; + template[0]["components"][0]["curves"][0]["min_depth"] = []; + template[0]["components"][0]["curves"][0]["null_value"] = []; + + template[0]["components"][0]["curves"][0]["data"] = []; + + ///// For each curve object in incoming data: + let array_individual_curves_and_depth_objects = []; + let all_depths_list = []; + let all_depths_set = []; + + for (let i = 0; i < curve_box_components[0]["curves"].length; i++) { + + let curve = curve_box_components[0]["curves"][i]; + template[0]["components"][0]["curves"][0]["curve_names"].push(curve["curve_type"]); + template[0]["components"][0]["curves"][0]["curve_colors"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"].push(curve["curve_stroke_dasharray"]); + template[0]["components"][0]["curves"][0]["stroke_width"].push(curve["stroke_width"]); + template[0]["components"][0]["curves"][0]["stroke_linecap"].push(curve["stroke_linecap"]); + template[0]["components"][0]["curves"][0]["fill"].push(curve["fill"]); + template[0]["components"][0]["curves"][0]["data_id"].push(curve["data_id"]); + template[0]["components"][0]["curves"][0]["well_names"].push(curve["well_name"]); + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"].push(curve["scale_linear_log_or_yours"]); + template[0]["components"][0]["curves"][0]["line_color"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["max_depth"].push(curve["max_depth"]); + template[0]["components"][0]["curves"][0]["min_depth"].push(curve["min_depth"]); + template[0]["components"][0]["curves"][0]["null_value"].push(curve["null_value"]); + //// + let depth_array = module.exports.createDepthArray(curve["min_depth"], curve["max_depth"], curve["step"]); + let curve_array = curve["curve_values"]; + let curve_name = curve["curve_type"]; + let depth_curve_name = curve["depth_curve_name"]; + //// the function below is off...someting undefined + let obj_starter = [{[depth_curve_name]: depth_array, [curve_name]: curve_array}]; + + let reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter, curve_name, depth_curve_name); + //// + array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); + //// + + all_depths_list = all_depths_list.concat(depth_array); + } + + /// Get array of unique depth values from all curves by calling set on an array of depth values + all_depths_set = [...new Set(all_depths_list)]; + + let objects_helper = {}; + + for (let j = 0; j < all_depths_set.length; j++) { + /// create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] + objects_helper[all_depths_set[j]] = {[template[0]["components"][0]["curves"][0]["depth_curve_name"]]: all_depths_set[j]}; + } + + //// now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} + //// for each curve {"depth":value,"curve_name":value} in each curve array of objects... + /////// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object + for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { + let this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; + for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { + let this_obj = this_depth_plus_curve_obj[l]; + + let curve_name = curve_box_components[0]["curves"][k]["curve_type"]; + let depth_name = curve_box_components[0]["curves"][k]["depth_curve_name"]; + + /// add curve value as key/value pair to right object based on depth key + + objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; + + } + } + + /// get rid of depth key and just have the objects..put in array if not returned as array + //// return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] + let data = Object.keys(objects_helper).map(function (key) { + return objects_helper[key]; + }); + + let depth_name = template[0]["components"][0]["curves"][0]["depth_curve_name"]; + data = data.sort(function (a, b) { + return parseFloat(a.depth_name) - parseFloat(b.depth_name); + }); + + // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) + function sortFloat(a, b) { + return a - b; + } + + function sortNumber(a, b) { + return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); + } + + template[0]["components"][0]["curves"][0]["data"] = data.sort(sortNumber); + return template; + + } + }, + + + /////////////////////////////// + //// Functions that take Wellio.js style JSON and handle everything from transformation to plotting + /////////////////////////////// + + /** + * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! + * @param {*} logs_in_json + * @param {*} div_id + * @param {*} example_template + * @param {*} curve_name + * @param {*} curve_color + * @param {*} curve_unit + * @param {*} fill + * @param {*} depth_name + * @param {*} width + * @param {*} height + */ + putArrayOfLogsIntoSection: function (logs_in_json, div_id, example_template, curve_name, curve_color, curve_unit, fill, depth_name, width, height) { + const noSVG = module.exports.d3.select("#" + div_id).selectAll("svg").remove(); + // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) + let new_templates = []; + for (let i = 0; i < logs_in_json.length; i++) { + let three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i], depth_name); + let new_data = three_things2["well_log_curves_reformatted_for_d3"]; + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = new_data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = [three_things2["uwi"]]; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = [curve_name]; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = [curve_color]; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = [curve_unit]; + example_template_n[0]["components"][0]["curves"][0]["fill"] = [fill]; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_name; + let svg_holder = module.exports.d3.select("#" + div_id).append("div"); + svg_holder.style("vertical-align", "middle") + .attr("id", div_id + "svg_holder" + i) + .style("display", "inline-block"); + example_template_n[0]["curve_box"]["div_id"] = div_id + "svg_holder" + i; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + new_templates.push(example_template_n); + module.exports.curveBox(example_template_n); + } + return new_templates; + }, + + /** + * minimumDataIntoTemplateFunc + * @param + */ + minimumDataIntoTemplateFunc: function (example_template, data, well_names, curve_names, curve_colors, curve_units, fill, div_id, width, height, depth_curve_name) { + //// remember that all curve components should be an array, even if one item! + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = well_names; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = curve_names; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = curve_colors; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = curve_units; + example_template_n[0]["components"][0]["curves"][0]["fill"] = fill; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_curve_name; + example_template_n[0]["curve_box"]["div_id"] = div_id; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + return example_template_n; + }, + + + /////////////////////////////// + //// Actual plotting functions after all the necessary information is compiled in necessary format + /////////////////////////////// + + /** + * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. + * @param {object} well_curve_config_template + * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. + */ + curveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + + ////////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// + //// These parts of the function establish variables from the config JSON in shorter variable names + //// If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined + // default values might be defined here for cases where they are accidentally not defined + + let template_overall = template_for_plotting[0]["curve_box"]; + let template_components = template_for_plotting[0]["components"]; + let template_curves = template_components[0]["curves"][0]; + let template_lines = template_components[0]["lines"]; + let template_rectangles = template_components[0]["rectangles"]; + let title = ""; + //// Determine if title exists for the curve_box. + if (template_overall["show_title"] != "yes") { + let title = ""; + } else { + title = template_overall["title"]["text"]; + } + /// Parameters that define shape & size of overall curve box + let width = template_overall["width"]; + let height_multiplier_components = 0.95; + if (template_overall["height_multiplier_components"]) { + height_multiplier_components = template_overall["height_multiplier_components"]; + } + let height = template_overall["height"] * height_multiplier_components; + let height_components = template_overall["height"]; + let margin = template_overall["margin"]; + let header_sep_svg_or_not = template_overall["header_sep_svg_or_not"]; + let svg_header_height = template_overall["svg_header_height"]; + let gridlines = template_overall["gridlines"]; + let gridlines_color = template_overall["gridlines_color"]; + let gridlines_stroke_width = template_overall["gridlines_stroke_width"]; + //// variables for how to draw mouseover of hover box + let mouseover_yes_or_no = template_overall["mouseover_yes_or_no"]; + let mouseover_depth_or_depth_and_curve = template_overall["mouseover_depth_or_depth_and_curve"]; + let mouseover_curvename = template_overall["mouseover_curvename"]; //// default is first curve + let mouseover_color_or_default_which_is_curve_color = template_overall["mouseover_color_or_default_which_is_curve_color"]; + + let secondary_depth_exist = "no"; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW + + //// Data is in d3.js form. An array of objects consisting of single level key:value pairs + let data = template_curves["data"]; + //// Variables related to curves, these should all be arrays with one or more values! + let curve_names = template_curves["curve_names"]; + let curve_colors = template_curves["curve_colors"]; + let curve_stroke_dasharray = template_curves["curve_stroke_dasharray"]; + let curve_name = curve_names[0]; + let curve_color = curve_colors[0]; + let curve_units = template_curves["curve_units"]; + let scale_linear_log_or_yours = template_curves["scale_linear_log_or_yours"]; + if (template_curves["curve_units"]) { + curve_units = template_curves["curve_units"]; + } else { + curve_units = ""; + } + + //////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON + let flag_for_single_scale_or_independent_scales = template_overall["grouped_or_independent_x_scales"]; + let grouped_or_independent_x_scale = template_overall["grouped_or_independent_x_scales"]; + + + //// The depth_curve_name needs to be the same for all curves plotted! + let depth_curve_name = ""; + if (template_curves["depth_curve_name"].length > 1 && typeof (template_curves["depth_curve_name"]) == "object" && template_curves["depth_curve_name"][0] !== template_curves["depth_curve_name"][1] + ) { + depth_curve_name = "depth_curve_name is not the same in two or more curves"; + } else { + depth_curve_name = template_curves["depth_curve_name"]; + } + let depth_type_string = ""; + if ( + template_curves["depth_type_string"].length > 1 && typeof (template_curves["depth_type_string"]) == "object" && template_curves["depth_type_string"][0] != template_curves["depth_type_string"][1] + ) { + depth_type_string = "depth type string is not the same in two or more curves"; + } else if (template_curves["depth_type_string"][0] == "") { + depth_type_string = ""; + } else if (template_curves["depth_type_string"]) { + depth_type_string = "- " + template_curves["depth_type_string"]; + } + let depth_units_string = ""; + if (template_curves["depth_units_string"] && template_curves["depth_units_string"][0] !== "") { + depth_units_string = "- " + template_curves["depth_units_string"]; + } + + ///// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// + let div_id = template_overall["div_id"]; + if (template_overall["div_id"]) { + div_id = template_overall["div_id"]; + } else { + return "there_was_no_div_id_in_the_template"; + } + + d3.select("#" + div_id).selectAll("*").remove(); + + ///////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// +// //// Calculate depth min and max if depth min and/or max is not given explicitly in the template + let depth_min; + let depth_max; + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["min"] == "autocalculate") { + depth_min = d3.min(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_min = template_curves["depth_limits"][0]["min"]; + } + //// max depth + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["max"] == "autocalculate") { + depth_max = d3.max(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_max = template_curves["depth_limits"][0]["max"]; + } + + + // [depth_max,depth_min] + //// Apply depth min and max to incoming well log data + //// To save time, we'll first check if the first object in the array had as depth that is smaller than min + //// and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. + + if (data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max) { + } else { + data = data.filter(function (objects) { + return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; + }); + } + + // let depth_min = -1000000 + // let depth_max = 1000000 + + if (template_curves["min_depth"][0] == "autocalculate" || template_curves["min_depth"] == "autocalculate") { + depth_min = data[0][depth_curve_name]; + } else { + depth_min = template_curves["min_depth"]; + } + if (template_curves["max_depth"][0] == "autocalculate" || template_curves["max_depth"] == "autocalculate") { + depth_max = data[data.length - 1][depth_curve_name]; + } else { + depth_max = template_curves["max_depth"]; + } + + // let depth_min = template_curves["min_depth"][0] + // let depth_max = template_curves["max_depth"][0] + + ///////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + + ////////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// + let svg = ""; + let svg_holder = ""; + let svg_header = ""; + if (header_sep_svg_or_not == "yes") { + + svg_holder = d3.select("#" + div_id).append("div") + .attr("class", "svg_holder") + .style("overflow-x", "auto"); + + svg_header = d3.select("#" + div_id + " div.svg_holder").append("svg"); + svg_header.attr("class", "header"); + svg_header.attr("width", width) + .attr("height", svg_header_height); ///// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! + svg_header.append("g"); + svg_header.style("display", "block"); + + let depth_string_on_top = ""; + if (depth_type_string == "") { + depth_string_on_top = depth_curve_name; + } else { + depth_string_on_top = depth_type_string.replace("- ", ""); + } + + svg_header.append("text") + .attr("x", (margin.left) / 2) + .attr("y", "1em") + .attr("text-anchor", "middle") + .style("font-size", "10px") + .style("text-decoration", "underline") + .text(depth_curve_name); + if (depth_type_string != "") { + let depth_type_string_x_pos = 0; + let depth_type_string_x_pos_anch = "start"; + if (secondary_depth_exist == "no") { + depth_type_string_x_pos = margin.left / 2; + depth_type_string_x_pos_anch = "middle"; + } + svg_header.append("text") + .attr("x", depth_type_string_x_pos) + .attr("y", "3em") + .attr("text-anchor", depth_type_string_x_pos_anch) + .style("font-size", "8px") + .style("text-decoration", "underline") + .text(depth_string_on_top); + } + + //svg_header.append("text") + // .attr("x", margin.left) + // .attr("y", "4em") + // .attr("text-anchor", "end") + // .style("font-size", "6px") + // .style("text-decoration", "underline") + // .text("2nd TVD"); + + ///////// change this!!!!! + if (title !== "Elephants") { + let distance_from_top = -15; + svg_header.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + const curveBox_main_div = d3.select("#" + div_id).append("div"); + curveBox_main_div + .attr("height", height_components + "px") + .attr("class", "component_outter") + .style("display", "flex") + .style("position", "relative") + .style("box-sizing", "border-box"); + + const curveBox_sub_div = d3.select("#" + div_id + " div.component_outter").append("div"); + curveBox_sub_div + .attr("class", "component_inner") + .style("overflow-y", "auto") + .style("position", "absolute") + .style("max-height", height_components + "px"); + + svg = d3.select("#" + div_id + " div.component_outter div.component_inner").append("svg"); + } else { + svg = d3.select("#" + div_id).append("svg"); + } + + ////////////// Calculate Axis & Scales =>////////////// + //// Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. + //// For zero curves, need to look into rectange and lines for x scales maybe? + //// Need to handle scales in linear, log, or arbitary user-provided scale. + //// Also, need x function for gridlines! so....? + + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let mins = []; + let maxes = []; + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + let min_all_curves = d3.min(mins); + let max_all_curves = d3.max(maxes); + + if (curve_names.length == 0) { + //// THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! + min_all_curves = 0; + max_all_curves = 100; + } + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let x_func; + let x; + let xAxis_header; + let xAxis; + if (flag_for_single_scale_or_independent_scales = "single") { + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + min_all_curves = d3.min(mins); + max_all_curves = d3.max(maxes); + x = d3.scaleLinear().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + xAxis_header = g => g.attr("transform", "translate(0,45)").call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + + + } + + //////////////////// define y scale, aka the one for the depth //////////////////// + let y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom, margin.top]); + //let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + let yAxis2 = g => g.attr("transform", `translate(${margin.left - 35},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + + + ////////////// Building curvebox parts that aren't header. First define size & title =>////////////// + svg.attr("class", "components"); + svg.attr("width", width) + .attr("height", height); + svg.style("margin", "0 auto"); + svg.style("overflow", "scroll"); + + if (header_sep_svg_or_not == "no") { + let xAxis = xAxis_header; + svg.append("g") + .call(xAxis) + .append("text") + .text("test svg"); + } + + let y_axis_text = depth_curve_name + " " + depth_units_string + " " + depth_type_string; + svg.append("g") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("dy", ".75em") + .attr("y", 0 - (margin.left * 0.6)) + .attr("x", ((height) / -2) + margin.top) + .style("text-anchor", "end") + .text(y_axis_text) + .style("fill", "#2b2929"); + + //// + // svg.append("g") + // .call(yAxis2) + // .append("text") + // .attr("transform", "rotate(-90)") + // .attr("dy", ".75em") + // .attr("y", -35) + // .attr("x",((height)/-2)+margin.top) + // .style("text-anchor", "end") + // .text(y_axis_text+"THIS IS THE SECOND ONE") + // .style("fill","#2b2929") + //// + + //svg.append("g") + //// Code that assumes multiple curves are plotted in same curvebox + let distance_from_top = -15; + if (title !== "") { + svg.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + if (gridlines == "yes") { + var gridlines_obj = d3.axisTop() + .ticks((width - margin.left - margin.right) / 25) + .tickFormat("") + .tickSize(-height + margin.top + 10) + .scale(x); + svg.append("g") + .attr("class", "grid") + .call(gridlines_obj) + .style("stroke", gridlines_color) + .style("stroke-width", gridlines_stroke_width); + } + + +// //// This will help save the x axis function for first curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_0 +// //// This will help save the x axis function for second curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_1 +// //// This will help save the x axis function for third curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_2 +// //// This will help save the x axis function for fourth curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_3 + + let x_functions_for_each_curvename = {}; //// populate with {"curvename":curvename,"x_func":func} + + ////////////// Building curves within curvebox =>////////////// + for (let k = 0; k < curve_names.length; k++) { + //// code that creates a line for each Curve in order provided and applies + //// the color in the color array in order provided + + let curveUnit = ""; + if (curve_units[k]) { + curveUnit = curve_units[k]; + } + let min = mins[k]; + let max = maxes[k]; + + let header_text_line = min.toFixed(1) + " - " + curve_names[k] + " " + curveUnit + " - " + max.toFixed(1); + let min_this = d3.min(data, function (d) { + return +d[curve_names[k]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[k]]; + }); + let x = d3.scaleLinear().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + if (k == 0) { + x_func == x; + } + //// This creates an object to hold multiple x axis scale functions + //// that will be used if 'between' style fill is selected. + x_functions_for_each_curvename[curve_names[k]] = x; + + ////////////// Header text, two way depending on =>////////////// + if (header_sep_svg_or_not == "yes") { + let distance_from_top = (1 + (k * 2.7)).toString() + "em"; + svg_header.append("text") + .attr("x", (margin.left + width) / 2) + .attr("y", 0 + distance_from_top) + .attr("text-anchor", "middle") + .style("font-size", "11px") + .style("text-decoration", "underline") + .style("fill", curve_colors[k]) + .text(header_text_line); + let translate_string = "translate(0," + (45 - (30 * k)).toString() + ")"; + xAxis_header = g => g.attr("transform", translate_string).call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + svg_header.append("g") + .call(xAxis_header) + .append("text"); + + } + let another_line = d3.line().x(d => x(d[curve_names[k]])).y(d => y(d[depth_curve_name])); + ////////////// Appends a curve line but doesn't include fill yet =>////////////// + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curve_colors[k]) + .attr("stroke-width", template_curves["stroke_width"][k]) + .attr("stroke-linecap", template_curves["stroke_linecap"][k]) + .attr("stroke-dasharray", curve_stroke_dasharray[k]) + .attr("d", another_line); + } + + + ////////////// define the area filled under the curve =>////////////// + + for (let i = 0; i < template_curves["fill"].length; i++) { + //let i = k + if (template_curves["fill"][i]["fill"] == "yes") { + let number_colors = template_curves["fill"][i]["fill_colors"].length; + let curve_name1 = template_curves["fill"][i]["curve_name"]; + let threshold = -99999999; + let fill_color = "gray"; + for (let j = 0; j < number_colors; j++) { + let area1 = d3.area(); + if (number_colors != 0) { + threshold = template_curves["fill"][i]["cutoffs"][j]; + fill_color = template_curves["fill"][i]["fill_colors"][j]; + } + if (template_curves["fill"][i]["fill_direction"] == "left") { + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => x(d[curve_name1])) + .x0(d => start_from_left) + .defined(d => ((d[curve_name1]) > threshold)) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "right") { + let start_from_right = template_overall["margin"]["right"]; + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => width - start_from_right) + .defined(d => ((d[curve_name1]) > threshold)) + .x0(d => x(d[curve_name1])) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "between") { + let between_2_curve = template_curves["fill"][i]["curve2"]; + //// for through x_functions_for_each_curvename object and find the key that + //// matches between_2_curve which should be a curvename + //// get the x function for the second curve and the curve that is curvenames[k] + let second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; + let first_curve_x_func = x_functions_for_each_curvename[curve_name1]; + area1 + .x1(d => first_curve_x_func(d[curve_name1])) + .x0(d => second_curve_x_func(d[between_2_curve])) + // .defined(d => ((d[curve_name1])<=d[between_2_curve])) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill", fill_color) + .attr("fill-opacity", 0.8); + } + } + } + + //////////////// TOOLTIP Part 1 /////////////////// + if (mouseover_yes_or_no == "no") { + console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); + } else { + //// statements to make sure the mouseover_curvename is a present curve and if not use first curve + if (mouseover_curvename == "default") { + mouseover_curvename = curve_names[0]; + } else if (curve_names.includes(mouseover_curvename)) { + mouseover_curvename = mouseover_curvename; + } else { + mouseover_curvename = curve_names[0]; + } + + //// statement to handle color of curve text and circle on hover + let curve_on_mouseover_color = curve_colors[0]; + if (mouseover_color_or_default_which_is_curve_color != "default") { + curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; + } + + //// appends start of mouseover rectange used for showing hover content + var focus = svg.append("g") + .style("display", "none"); + + var bisectDate = d3.bisector(function (d) { + return d[depth_curve_name]; + }).left; // ** + + //// function called to change hover style & contents when mouseover rectangle appended to svg svg + function mousemove() { + var y0 = y.invert(d3.mouse(this)[1]), + i = bisectDate(data, y0, 1), + d0 = data[i - 1], + d1 = data[i], + d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; + + //// fixed value along y axis + let fixed_x_value = width * 0.8; + + //// depth value + focus.select("text.y2") + .attr("transform", + // "translate(" + x(d[mouseover_curvename]) + "," + + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[depth_curve_name]); + + //// curve value + focus.select("text.y4") + .attr("transform", + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[curve_names[0]]); + + focus.select(".x") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + 0 + + ")") + .attr("y2", height); + //// circle y class part 2 + focus.select(".y") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + focus.select(".yl") + .attr("transform", + "translate(" + 0 + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + } + + // append the x line + focus.append("line") + .attr("class", "x") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("y1", 0) + .attr("y2", width); + + // append the y line + focus.append("line") + .attr("class", "yl") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("x1", 0) + .attr("x2", height); + + // append the circle at the intersection + focus.append("circle") + .attr("class", "y") + .style("fill", "none") + .style("stroke", curve_on_mouseover_color) + .attr("r", 3); + + //// depth value on hover + if (mouseover_depth_or_depth_and_curve == "depth" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y2") + .attr("dx", 6) + .attr("dy", "-.3em") + .style("font-size", "0.55em"); + } + + //// curve value on hover + if (mouseover_depth_or_depth_and_curve == "curve" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y4") + .attr("dx", 1) + .attr("dy", "0.5em") + .style("font-size", "0.55em") + .style("fill", "black") + .style("stroke", curve_on_mouseover_color) + .style("stroke-width", "0.5px"); + } + + // append the rectangle to capture mouse // ********** + svg.append("rect") // ********** + .attr("width", width) // ********** + .attr("height", height) // ********** + .style("fill", "none") // ********** + .style("pointer-events", "all") // ********** + .on("mouseover", function () { + focus.style("display", null); + }) + .on("mouseout", function () { + focus.style("display", "none"); + }) + .on("mousemove", mousemove); // ********** + } + + ////////////// Horizontal Lines AKA tops =>////////////// + try { + for (let i = 0; i < template_lines.length; i++) { + let this_line = template_lines[i]; + svg.append("line") + .attr("x1", 0 + margin.left) + .attr("y1", y(this_line["depth"])) + .attr("x2", width * 0.75) + .attr("y2", y(this_line["depth"])) + .style("stroke-width", this_line["stroke_width"]) + .style("stroke", this_line["color"]) + .style("stroke-dasharray", this_line["stroke-dasharray"]) + .style("stroke-linecap", this_line["stroke_linecap"]) + .style("fill", "none"); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_line["depth"])) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_line["label"]); + } + } catch (err) { + console.log("could not do lines for tops in curveBox function, error: ", err); + } + + ////////////// Rectangles for things like cores & sample locations =>////////////// + try { + for (let i = 0; i < template_rectangles.length; i++) { + let this_rectangle = template_rectangles[i]; + svg.append("rect") + .attr("x", 50 + margin.left) + .attr("y", y(this_rectangle.depth_top)) + .attr("width", this_rectangle.width) + .attr("height", this_rectangle.height) + .style("stroke-width", this_rectangle.stroke_width) + .style("stroke-linecap", this_rectangle.stroke_linecap) + .style("stroke", "purple") + .style("fill", this_rectangle.fill) + .style("opacity", this_rectangle.opacity); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_rectangle.depth_top)) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_rectangle.label); + } + } catch (err) { + console.log("could not do rectangle in curveBox function for some reason. error= ", err); + } + + ////////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// + svg_holder.node(); + svg_header.node(); + return svg.node(); + }, + + + ////////// + /** + * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. + * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to + * @param {object} templates An array of CurveBox input templates + * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! + */ + multipleLogPlot: function (div_id, templates, show_all = true) { + let d3 = module.exports.d3; + let noDIV = d3.select("#" + div_id).selectAll("div").remove(); + let noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let new_templates = []; + for (let i = 0; i < templates.length; i++) { + let curvebox_holder = d3.select("#" + div_id).append("div"); + curvebox_holder.style("vertical-align", "middle") + .attr("id", div_id + "curvebox_holder" + i); + //// to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! + if (show_all) { + curvebox_holder.style("display", "inline-block"); + } else { + curvebox_holder.style("display", "none"); + } + templates[i][0]["curve_box"]["div_id"] = div_id + "curvebox_holder" + i; + new_templates.push(templates[i]); + let template = templates[i]; + let check = module.exports.curveBox(template); + } + return new_templates; + }, + /** + * This function is used to plot a single curvebox in the div listed in the plotting templates div_id key. + * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. + * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. + * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. + */ + makeThisCurveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + let div_id = template_for_plotting[0]["curve_box"]["div_id"]; + const noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let curve_box_return = module.exports.curveBox(template_for_plotting); + return curve_box_return; + }, + /** + * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. + * In certain environments, this may not work for security reasons. + * @param {string} svgEl An SVG element returned from the curveBox function. + * @param {string} name The name of the file to be downloaded. + */ + saveSvg: function (svgEl, name) { + svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + var svgData = svgEl.outerHTML; + var preface = "\r\n"; + var svgBlob = new Blob([preface, svgData], {type: "image/svg+xml;charset=utf-8"}); + var svgUrl = URL.createObjectURL(svgBlob); + var downloadLink = document.createElement("a"); + downloadLink.href = svgUrl; + downloadLink.download = name; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + }; + + return module.exports; + }); + + }).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + }, {"d3": 39, "wellio": 40}], + 4: [function (require, module, exports) { +// well_curve_config_template = [ +// {"multipleLines":"yes","curveNames":["GR"], +// "curveColors":["black","pink"], +// "fill":[ +// {"curveName":"GR","fill":"yes","fillDirection":"left","cutoffs":[0,ShaleSiltCutOff,SiltSandCutOff],"fillColors":["gray","orange","yellow"],"curve2":""}, +// {"curveName":"RESD","fill":"no","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} +// ], +// "data":well_log_converted_to_d3_friendly, +// "width":200, +// "height":400, +// "margin":({top: 20, right: 3, bottom: 30, left: 30}), +// "depth_curve_name":"DEPTH"}] + + +// function makePlot(single_curve,div,height,width,domain_x,domain_y,curve_name){ +// // "#log_plot_div" +// var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() +// console.log("got to second part of makePlot2 and b2 = ",b2) +// g3.log(b2,single_curve).draw() +// console.log("got to second part of makePlot2 and b2 = ",b2) + +// } + +// function makePlot2(single_curve,div,height,width,domain_x,domain_y,curve_name){ +// // "#log_plot_div" +// // var div = "dl_trial_a" +// var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() +// console.log("1 got to second part of makePlot2 and b2 = ",b2) +// g3.log(b2,single_curve).draw() +// console.log("2 got to second part of makePlot2 and b2 = ",b2) + +// } + +// function draw_curveG3(curve,div){ +// if(!div){div = "#log_plot_div"} +// if(!curve){ +// curve = "GR"; +// console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) +// } +// console.log("curve = ",curve) +// var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] +// makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) +// } + + +// function reformatJSONforPlotting(temp_json,curve,div){ +// wellioviz.fromJSONofWEllGetThingsForPlotting(well_log_json,"DEPTH") +// } + + function reformatJSONforPlotting(temp_json, curve, div) { + // generic_template = [ + // {"multipleLines":"yes", + // "curveNames":[curve], + // "curveColors":["black","pink"], + // "fill":[ + // {"curveName":curve,"fill":"yes","fillDirection":"left","cutoffs":[0,65,75,89],"fillColors":["lightgreen","green","red","pink"],"curve2":""}, + // {"curveName":"PHID","fill":"yes","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} + // ], + // "data":"data_goes_here_once_formatted", + // "width":250, + // "height":600, + // "margin":({top: 20, right: 3, bottom: 30, left: 30}), + // "depth_curve_name":"DEPT", + // "divID":div + // }] + + generic_template = [ + { + "curve_box": { + "show_well_name": "yes", /// not built yet + "show_depth_type": "yes", /// not built yet + "show_curve_units": "yes", /// not built yet + "curve_box_depth_min": -999, /// not built yet + "curve_box_depth_max": 9990000, /// not built yet + "take_out_null_or_visualize": "no", /// not built yet + "show_title": "yes", + "width": 260, + "height": 400, + "height_multiplier_components": 1, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "log_plot_div", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectanges", "lines"], /// not built yet + "lines_connected_across_curveboxes": "no", /// not built yet + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": '#D3D3D3', + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "curve", + "curve_names": [curve], + "curve_colors": ["#0375D8"], + "curve_stroke_dasharray": ["solid"], + "stroke_linecap": ["butt"], + "stroke_width": [1], + "fill": [ + { + "curve_name": curve, + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0, 5, 999], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + } + ], + "curve_units": [""], + "depth_limits": [{"min": "autocalculate", "max": "autocalculate"}], + "curve_limits": [{"curve_name": "", "min": -10000000, "max": 3}], + "data": "not here yet",/// not built yet + "depth_curve_name": "DEPT",/// not built yet + ////// + "data_id": ["placeholder_data_id",], /// not built yet + "well_names": [""], /// not built yet + "scale_linear_log_or_yours": ["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string": [""], + "depth_units_string": [""], + "null_value": [""], /// not built yet + } + ], + "lines": [ + { + "data_type": "line", /// not built yet + "label": "example", /// not built yet + "depth": -999, /// not built yet + "color": "red", /// not built yet + "stroke_width": "3px", /// not built yet + "stroke_style": "solid", /// not built yet + "transparency": 1.0, /// not built yet + "stroke_linecap": "butt" + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 0, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }] + /////////// + console.log("depth curve name used", generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) + wellDataForPlotting = wellioviz.fromJSONofWEllGetThingsForPlotting(temp_json, generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) + curveDataFormatted = wellDataForPlotting["well_log_curves_reformatted_for_d3"] + curve_names = wellDataForPlotting["curve_names"] + uwi = wellDataForPlotting["uwi"] + console.log("curveDataFormatted in function draw_curve() ", curveDataFormatted) + //console.log("curveName in template generic_template['curveNames']:",generic_template[0]["curveNames"]) + ////////// + console.log("generic_template", generic_template) + generic_template[0]["components"][0]["curves"][0]["data"] = curveDataFormatted + new_generic_template = generic_template + return new_generic_template + } + + function draw_curve(curve, div) { + if (!div) { + div = "log_plot_div" + } + if (!curve) { + curve = "GR"; + console.log("temp_json['CURVES'][curve] = ", temp_json["CURVES"]["GR"]) + } + console.log("curve = ", curve) + ///var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] + ///makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) + var newDiv = document.createElement("div"); + disposible_log_div = "log_plot_div_sub" + newDiv.id = disposible_log_div + var currentDiv = document.getElementById("log_plot_div"); + currentDiv.append(newDiv) + + ///////// + console.log("generic_template:", reformatJSONforPlotting(temp_json)) + new_generic_template = reformatJSONforPlotting(temp_json) + height = new_generic_template[0]["curve_box"]["height"] + currentDiv.style.height = height + 50 + "px"; + result = wellioviz.multipleLogPlot(disposible_log_div, [reformatJSONforPlotting(temp_json, curve, disposible_log_div)]) + console.log("curve plot should be present now... the template supplied is:", result) + } + +// function draw_curve_from_data(curve,div,curve_name){ +// // if(!div){div = "#log_plot_div"} +// // if(!curve){ +// // curve = "GR"; +// // console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) +// // } +// // if(!curve_name){curve_name = "unknown curve"} +// // var curve = temp_json["CURVES"]["GR"] +// var curve = Array.from(curve) +// //var curve = "GR" +// var div = "#dl_trial_a"; +// var curve_name = "GR"; +// console.log("curve = ",curve); +// console.log("div = ",div); +// console.log("curve_name = ",curve_name); + +// // var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] +// // makePlot2(curve,div,600,250,domain_x,[0,curve.length],curve_name) +// var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] +// makePlot(curve,div,600,250,domain_x,[0,curve.length],curve_name) +// } + }, {}], + 5: [function (require, module, exports) { + wellio = require('wellio'); + + las2json = wellio.las2json; + + wellioviz = require("../../dist/index.js") + }, {"../../dist/index.js": 3, "wellio": 40}], + 6: [function (require, module, exports) { +/////////////////////// global objects placeholders //////////////////////// +//// ... maybe not good programming practice but quick to do for simple demo. + +//// var all_files is a holder for the las files uploaded into the browser + var all_files = [""]; +//// var temp_json is the single well las file converted to json object format + var temp_json = {}; + +//////////////////////// HELPER FUNCTIONS //////////////////////// + + +// Check for the various File API support. + if (window.File && window.FileReader && window.FileList && window.Blob) { + // Great success! All the File APIs are supported. + } else { + alert('The File APIs are not fully supported in this browser.'); + } + +//// Function that checks if a temp_json exists. If it does, it allows divs that manipulate that JSON to show + function checkForJSONThenCollapse(divID) { + console.log("divID", divID) + console.log("check check") + console.log(temp_json) + if (!temp_json['WELL INFORMATION BLOCK']) { + "button did nothing because well JSON doesn't exist" + } else { + //// Check if loading part is shown, if so collapse it first. + if (document.getElementById("wellupload").classList.contains("show")) { + $("#wellupload").collapse("toggle") + } + $('.collapse').collapse("hide") + //// toggle only the one clicked! + $(divID).collapse("toggle") + } + } + + +//// helper function that removes the text depiction of the las file. + function removeTextLAS() { + fileContentsDiv = document.getElementById("fileContents"); + while (fileContentsDiv.hasChildNodes()) { + fileContentsDiv.removeChild(fileContentsDiv.lastChild); + } + } + +//// helper function that removes the children of the given DOM element. + function remove_DOM_children(div_name) { + if (!div_name) { + div_name = 'log_plot_div' + } + fileContentsDiv = document.getElementById(div_name); + while (fileContentsDiv.hasChildNodes()) { + fileContentsDiv.removeChild(fileContentsDiv.lastChild); + } + } + +//// helper function that removes the inner html of the given DOM element, like the "test" from

    test

    + function removeInnerHTML(div_id) { + document.getElementById(div_id).innerHTML = "" + } + +//// helper function that take a string and a substring of that string and replaces the substring with "" or nothing if it finds the substring. + function removeSubStr(string, substring) { + return string.replace(substring, "") + } + +//////////////////////// LOADING FUNCTIONS //////////////////////// + + +//// Reads in an example LAS files from webpage assets instead of local computer + function readInLASFromASSETS() { + //all_files = ["./assets/00-01-01-073-05W5-0.LAS"]; + //// removes all status spans for uploads + removeInnerHTML("upload-file-info"); + removeInnerHTML("upload-success"); + $.ajax({ + url: "./assets/00-01-01-073-05W5-0.LAS", + dataType: "text", + success: function (data) { + all_files = [data, ""] + document.getElementById("upload-success").innerHTML = "upload success"; + console.log("successfully loaded .draw_curve_from_data/assets/00-01-01-073-05W5-0.LAS") + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + document.getElementById("upload-success").innerHTML = "upload failure"; + console.log("error in function readInLASFromASSETS() : ", textStatus, errorThrown) + } + }); + } + +//// function for "Load into browser memeory" button + function readInFilesFunction() { + //// removes all status spans for uploads + removeInnerHTML("upload-file-info"); + removeInnerHTML("upload-success"); + var files = document.getElementById("files").files; + if (files && files.length !== 0) { + all_files = [] + for (var i = 0, file; file = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + all_files.push(evt.target.result); + } + reader.onerror = function (evt) { + document.getElementById("fileContents").innerHTML = "error reading file"; + } + } + uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = "upload success"; + } else { + uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = " " + "upload failure"; + } + //console.log("all_files = ",all_files) + } + + + function changeMenuBarButtonColorOnConvert() { + //// CHANGE buttons from gray to blue in top row + var listButtons = document.getElementsByClassName("afterconvert") + console.log("list", list) + var i; + for (i = 0; i < listButtons.length; i++) { + // button.style.backgroundColor = "blue"; + console.log("button", listButtons[i]) + listButtons[i].classList.add("btn-primary") + } + } + +//// Function that calls several other functions involved with converting a new well from las to json +//// updating the global variables as needed, and changing some new DOM elements to reflect the new well data. +//// It calls the las2json(onelas) function found in wellio.js JavaScript file. + function convert_and_startHelpers() { + //// removes the buttons for the well curves from the previous well if they exist + remove_DOM_children("curveButtons_holder") + //// calls the function that takes a single LAS text file representing a single well and returns an object variable in JSON format for that well. + var single_well_json = las2json(all_files[0]); + // console.log('single_well_json = ',single_well_json) + //// replaces the global variable temp_json with the new well json var single_well_json + temp_json = single_well_json + //// function that looks at temp_json object, finds what curves are present in that well, and makes buttons to draw them using g3.js + addCurveOptionButtons() + //// adds inner html to p for the UWI name of the well in questino that was just loaded and converted + console.log("temp_json['WELL INFORMATION BLOCK'] =", JSON.stringify(temp_json["WELL INFORMATION BLOCK"])) + document.getElementById("which_well").innerHTML = "UWI = " + temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + changeMenuBarButtonColorOnConvert() + } + + +//////////////////////// DISPLAY FUNCTIONS //////////////////////// + + +//// This takes the well files uploaded as las files, treats all of them as text files and prints ALL OF THEM to the DOM. +//// this is different than the json conversion, which at this points only converts and keeps the first well! + function displayFileFunction() { + var upload_success_span_txt = document.getElementById("upload-success").innerHTML + //// goes into this part of loop if wepbage las is used + if (upload_success_span_txt === "upload success") { + fileContentsDiv = document.getElementById("fileContents") + var para = document.createElement("P") + var t = document.createTextNode(all_files[0]); + para.appendChild(t); + fileContentsDiv.appendChild(para); + } + //// goes here if las from user's local computer is used + else { + var files = document.getElementById("files").files + if (files) { + for (var i = 0, file; file = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + fileContentsDiv = document.getElementById("fileContents") + var para = document.createElement("P") + var t = document.createTextNode(evt.target.result); // Create a text node + para.appendChild(t); + fileContentsDiv.appendChild(para); + } + reader.onerror = function (evt) { + document.getElementById("fileContents").innerHTML = "error reading file"; + } + } + } + } + } + + +//// function that leverages vkbeuatify library to pretty print the stringified wellio json then puts it into a DOM element so it can be seen by the user + function print_well() { + document.getElementById("well_json_prettyprint").innerHTML = vkbeautify.json(JSON.stringify(temp_json), 1); + console.log('JSON.stringify(temp_json) = ', vkbeautify.json(JSON.stringify(temp_json), 4)) + } + +//// function called by convert_and_startHelpers() that looks at the global temp_json object +//// and finds the curve names and adds them as buttons that when clicked draws those curves using g3.js. +//// It calls addSingleCurveButton(div_id,curve_name) for each curve. + function addCurveOptionButtons() { + /// curveButtons_holder + var div_id = "curveButtons_holder" + var curves_available = Object.keys(temp_json["CURVES"]) + console.log("curves_available = ", curves_available) + for (each_curve in curves_available) { + addSingleCurveButton(div_id, curves_available[each_curve]) + } + } + +//// function called by addCurveOptionButtons() adds Curves buttons that when clicked draws a curve plot using g3.js. + function addSingleCurveButton(div_id, curve_name) { + var node = document.createElement("button"); + node.setAttribute('onclick', 'draw_curve("' + String(curve_name) + '")') // Create a
  • node + var textnode = document.createTextNode(curve_name); // Create a text node + node.appendChild(textnode); // Append the text to
  • + document.getElementById(div_id).appendChild(node); + } + + +//// function that creates a hidden link that is clicked programatically that uses HTML5 to download the file at that link +//// the two arguments are the UWI string of the global temp_json object, and a stringified version of the entire wellio json object. +//// It calls the download() function found in wellio.js JavaScript file. + function download_test() { + //console.log("download_test() ","in") + download(temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + ".json", JSON.stringify(temp_json)); + } + +//// Function that takes a filename string and a string (you might have to stringify a json object) +//// and writes into an actual JSON file to be downloaded into your browsers specified download folder. + function download(filename, text) { + var element = document.createElement('a') + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)) + element.setAttribute('download', filename) + element.style.display = 'none' + document.body.appendChild(element) + element.click() + document.body.removeChild(element) + } + + }, {}], + 7: [function (require, module, exports) { + /** + * vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. + * + * Version - 0.99.00.beta + * Copyright (c) 2012 Vadim Kiryukhin + * vkiryukhin @ gmail.com + * http://www.eslinstructor.net/vkbeautify/ + * + * MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Pretty print + * + * vkbeautify.xml(text [,indent_pattern]); + * vkbeautify.json(text [,indent_pattern]); + * vkbeautify.css(text [,indent_pattern]); + * vkbeautify.sql(text [,indent_pattern]); + * + * @text - String; text to beatufy; + * @indent_pattern - Integer | String; + * Integer: number of white spaces; + * String: character string to visualize indentation ( can also be a set of white spaces ) + * Minify + * + * vkbeautify.xmlmin(text [,preserve_comments]); + * vkbeautify.jsonmin(text); + * vkbeautify.cssmin(text [,preserve_comments]); + * vkbeautify.sqlmin(text); + * + * @text - String; text to minify; + * @preserve_comments - Bool; [optional]; + * Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. ) + * + * Examples: + * vkbeautify.xml(text); // pretty print XML + * vkbeautify.json(text, 4 ); // pretty print JSON + * vkbeautify.css(text, '. . . .'); // pretty print CSS + * vkbeautify.sql(text, '----'); // pretty print SQL + * + * vkbeautify.xmlmin(text, true);// minify XML, preserve comments + * vkbeautify.jsonmin(text);// minify JSON + * vkbeautify.cssmin(text);// minify CSS, remove comments ( default ) + * vkbeautify.sqlmin(text);// minify SQL + * + */ + + (function () { + + function createShiftArr(step) { + + var space = ' '; + + if (isNaN(parseInt(step))) { // argument is string + space = step; + } else { // argument is integer + switch (step) { + case 1: + space = ' '; + break; + case 2: + space = ' '; + break; + case 3: + space = ' '; + break; + case 4: + space = ' '; + break; + case 5: + space = ' '; + break; + case 6: + space = ' '; + break; + case 7: + space = ' '; + break; + case 8: + space = ' '; + break; + case 9: + space = ' '; + break; + case 10: + space = ' '; + break; + case 11: + space = ' '; + break; + case 12: + space = ' '; + break; + } + } + + var shift = ['\n']; // array of shifts + for (ix = 0; ix < 100; ix++) { + shift.push(shift[ix] + space); + } + return shift; + } + + function vkbeautify() { + this.step = '\t'; // 4 spaces + this.shift = createShiftArr(this.step); + }; + + vkbeautify.prototype.xml = function (text, step) { + + var ar = text.replace(/>\s{0,}<") + .replace(//g, "") + .replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns'); + return str.replace(/>\s{0,}<"); + } + + vkbeautify.prototype.jsonmin = function (text) { + + if (typeof JSON === 'undefined') return text; + + return JSON.stringify(JSON.parse(text), null, 0); + + } + + vkbeautify.prototype.cssmin = function (text, preserveComments) { + + var str = preserveComments ? text + : text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g, ""); + + return str.replace(/\s{1,}/g, ' ') + .replace(/\{\s{1,}/g, "{") + .replace(/\}\s{1,}/g, "}") + .replace(/\;\s{1,}/g, ";") + .replace(/\/\*\s{1,}/g, "/*") + .replace(/\*\/\s{1,}/g, "*/"); + } + + vkbeautify.prototype.sqlmin = function (text) { + return text.replace(/\s{1,}/g, " ").replace(/\s{1,}\(/, "(").replace(/\s{1,}\)/, ")"); + } + + window.vkbeautify = new vkbeautify(); + + })(); + }, {}], + 8: [function (require, module, exports) { +// https://d3js.org/d3-array/ v1.2.4 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function bisector(compare) { + if (compare.length === 1) compare = ascendingComparator(compare); + return { + left: function (a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + }, + right: function (a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + }; + } + + function ascendingComparator(f) { + return function (d, x) { + return ascending(f(d), x); + }; + } + + var ascendingBisect = bisector(ascending); + var bisectRight = ascendingBisect.right; + var bisectLeft = ascendingBisect.left; + + function pairs(array, f) { + if (f == null) f = pair; + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = f(p, p = array[++i]); + return pairs; + } + + function pair(a, b) { + return [a, b]; + } + + function cross(values0, values1, reduce) { + var n0 = values0.length, + n1 = values1.length, + values = new Array(n0 * n1), + i0, + i1, + i, + value0; + + if (reduce == null) reduce = pair; + + for (i0 = i = 0; i0 < n0; ++i0) { + for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { + values[i] = reduce(value0, values1[i1]); + } + } + + return values; + } + + function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } + + function number(x) { + return x === null ? NaN : +x; + } + + function variance(values, valueof) { + var n = values.length, + m = 0, + i = -1, + mean = 0, + value, + delta, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + if (m > 1) return sum / (m - 1); + } + + function deviation(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; + } + + function extent(values, valueof) { + var n = values.length, + i = -1, + value, + min, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } + + return [min, max]; + } + + var array = Array.prototype; + + var slice = array.slice; + var map = array.map; + + function constant(x) { + return function () { + return x; + }; + } + + function identity(x) { + return x; + } + + function range(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; + } + + var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + + function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + start = Math.floor(start * step); + stop = Math.ceil(stop * step); + ticks = new Array(n = Math.ceil(start - stop + 1)); + while (++i < n) ticks[i] = (start - i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; + } + + function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); + } + + function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; + } + + function sturges(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; + } + + function histogram() { + var value = identity, + domain = extent, + threshold = sturges; + + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + tz = tickStep(x0, x1, tz); + tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function (_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; + } + + function quantile(values, p, valueof) { + if (valueof == null) valueof = number; + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); + } + + function freedmanDiaconis(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3))); + } + + function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); + } + + function max(values, valueof) { + var n = values.length, + i = -1, + value, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && value > max) { + max = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && value > max) { + max = value; + } + } + } + } + } + + return max; + } + + function mean(values, valueof) { + var n = values.length, + m = n, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) sum += value; + else --m; + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; + else --m; + } + } + + if (m) return sum / m; + } + + function median(values, valueof) { + var n = values.length, + i = -1, + value, + numbers = []; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + numbers.push(value); + } + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + numbers.push(value); + } + } + } + + return quantile(numbers.sort(ascending), 0.5); + } + + function merge(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + + return merged; + } + + function min(values, valueof) { + var n = values.length, + i = -1, + value, + min; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && min > value) { + min = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && min > value) { + min = value; + } + } + } + } + } + + return min; + } + + function permute(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + } + + function scan(values, compare) { + if (!(n = values.length)) return; + var n, + i = 0, + j = 0, + xi, + xj = values[j]; + + if (compare == null) compare = ascending; + + while (++i < n) { + if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { + xj = xi, j = i; + } + } + + if (compare(xj, xj) === 0) return j; + } + + function shuffle(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + + return array; + } + + function sum(values, valueof) { + var n = values.length, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (value = +values[i]) sum += value; // Note: zero and null are equivalent. + } + } else { + while (++i < n) { + if (value = +valueof(values[i], i, values)) sum += value; + } + } + + return sum; + } + + function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; + } + + function length(d) { + return d.length; + } + + function zip() { + return transpose(arguments); + } + + exports.bisect = bisectRight; + exports.bisectRight = bisectRight; + exports.bisectLeft = bisectLeft; + exports.ascending = ascending; + exports.bisector = bisector; + exports.cross = cross; + exports.descending = descending; + exports.deviation = deviation; + exports.extent = extent; + exports.histogram = histogram; + exports.thresholdFreedmanDiaconis = freedmanDiaconis; + exports.thresholdScott = scott; + exports.thresholdSturges = sturges; + exports.max = max; + exports.mean = mean; + exports.median = median; + exports.merge = merge; + exports.min = min; + exports.pairs = pairs; + exports.permute = permute; + exports.quantile = quantile; + exports.range = range; + exports.scan = scan; + exports.shuffle = shuffle; + exports.sum = sum; + exports.ticks = ticks; + exports.tickIncrement = tickIncrement; + exports.tickStep = tickStep; + exports.transpose = transpose; + exports.variance = variance; + exports.zip = zip; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 9: [function (require, module, exports) { +// https://d3js.org/d3-axis/ v1.0.12 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + var slice = Array.prototype.slice; + + function identity(x) { + return x; + } + + var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; + + function translateX(x) { + return "translate(" + (x + 0.5) + ",0)"; + } + + function translateY(y) { + return "translate(0," + (y + 0.5) + ")"; + } + + function number(scale) { + return function (d) { + return +scale(d); + }; + } + + function center(scale) { + var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. + if (scale.round()) offset = Math.round(offset); + return function (d) { + return +scale(d) + offset; + }; + } + + function entering() { + return !this.__axis; + } + + function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + 0.5, + range1 = +range[range.length - 1] + 0.5, + position = (scale.bandwidth ? center : number)(scale.copy()), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function (d) { + return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); + }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function (d) { + var p = this.parentNode.__axis; + return transform(p && isFinite(p = p(d)) ? p : position(d)); + }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient == right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function (d) { + return transform(position(d)); + }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function () { + this.__axis = position; + }); + } + + axis.scale = function (_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function () { + return tickArguments = slice.call(arguments), axis; + }; + + axis.tickArguments = function (_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function (_) { + return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function (_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function (_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function (_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function (_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function (_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + return axis; + } + + function axisTop(scale) { + return axis(top, scale); + } + + function axisRight(scale) { + return axis(right, scale); + } + + function axisBottom(scale) { + return axis(bottom, scale); + } + + function axisLeft(scale) { + return axis(left, scale); + } + + exports.axisTop = axisTop; + exports.axisRight = axisRight; + exports.axisBottom = axisBottom; + exports.axisLeft = axisLeft; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 10: [function (require, module, exports) { +// https://d3js.org/d3-brush/ v1.1.5 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } + + function BrushEvent(target, type, selection) { + this.target = target; + this.type = type; + this.selection = selection; + } + + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } + + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } + + var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + + function number1(e) { + return [+e[0], +e[1]]; + } + + function number2(e) { + return [number1(e[0]), number1(e[1])]; + } + + function toucher(identifier) { + return function (target) { + return d3Selection.touch(target, d3Selection.event.touches, identifier); + }; + } + + var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function (x, e) { + return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; + }, + output: function (xy) { + return xy && [xy[0][0], xy[1][0]]; + } + }; + + var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function (y, e) { + return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; + }, + output: function (xy) { + return xy && [xy[0][1], xy[1][1]]; + } + }; + + var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function (xy) { + return xy == null ? null : number2(xy); + }, + output: function (xy) { + return xy; + } + }; + + var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" + }; + + var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" + }; + + var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" + }; + + var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 + }; + + var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 + }; + + function type(t) { + return {type: t}; + } + +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } + + function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; + } + + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + +// Like d3.local, but with the name “__brush” rather than auto-generated. + function local(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; + } + + function empty(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; + } + + function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; + } + + function brushX() { + return brush$1(X); + } + + function brushY() { + return brush$1(Y); + } + + function brush() { + return brush$1(XY); + } + + function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter, + touchable = defaultTouchable, + keys = true, + listeners = d3Dispatch.dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function () { + var extent = local(this).extent; + d3Selection.select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function (d) { + return d.type; + }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function (d) { + return "handle handle--" + d.type; + }) + .attr("cursor", function (d) { + return cursors[d.type]; + }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function (group, selection) { + if (group.selection) { + group + .on("start.brush", function () { + emitter(this, arguments).beforestart().start(); + }) + .on("interrupt.brush end.brush", function () { + emitter(this, arguments).end(); + }) + .tween("brush", function () { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = d3Interpolate.interpolate(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function () { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + d3Transition.interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function (group) { + brush.move(group, null); + }; + + function redraw() { + var group = d3Selection.select(this), + selection = local(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function (d) { + return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; + }) + .attr("y", function (d) { + return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; + }) + .attr("width", function (d) { + return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; + }) + .attr("height", function (d) { + return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; + }); + } else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args, clean) { + return (!clean && that.__brush.emitter) || new Emitter(that, args); + } + + function Emitter(that, args) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + } + + Emitter.prototype = { + beforestart: function () { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function () { + if (this.starting) this.starting = false, this.emit("start"); + else this.emit("brush"); + return this; + }, + brush: function () { + this.emit("brush"); + return this; + }, + end: function () { + if (--this.active === 0) delete this.state.emitter, this.emit("end"); + return this; + }, + emit: function (type) { + d3Selection.customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function started() { + if (touchending && !d3Selection.event.touches) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = d3Selection.event.target.__data__.type, + mode = (keys && d3Selection.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && d3Selection.event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && d3Selection.event.shiftKey, + lockX, + lockY, + pointer = d3Selection.event.touches ? toucher(d3Selection.event.changedTouches[0].identifier) : d3Selection.mouse, + point0 = pointer(that), + point = point0, + emit = emitter(that, arguments, true).beforestart(); + + if (type === "overlay") { + if (selection) moving = true; + state.selection = selection = [ + [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], + [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] + ]; + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = d3Selection.select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + if (d3Selection.event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = d3Selection.select(d3Selection.event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + d3Drag.dragDisable(d3Selection.event.view); + } + + nopropagation(); + d3Transition.interrupt(that); + redraw.call(that); + emit.start(); + + function moved() { + var point1 = pointer(that); + if (shifting && !lockX && !lockY) { + if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; + else lockX = true; + } + point = point1; + moving = true; + noevent(); + move(); + } + + function move() { + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + break; + } + case MODE_CENTER: { + if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); + if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(); + } + } + + function ended() { + nopropagation(); + if (d3Selection.event.touches) { + if (d3Selection.event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! + } else { + d3Drag.dragEnable(d3Selection.event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(); + } + + function keydowned() { + switch (d3Selection.event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: + return; + } + noevent(); + } + + function keyupped() { + switch (d3Selection.event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (d3Selection.event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: + return; + } + noevent(); + } + } + + function touchmoved() { + emitter(this, arguments).moved(); + } + + function touchended() { + emitter(this, arguments).ended(); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent; + }; + + brush.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; + }; + + brush.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable; + }; + + brush.handleSize = function (_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function (_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; + } + + exports.brush = brush; + exports.brushSelection = brushSelection; + exports.brushX = brushX; + exports.brushY = brushY; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-dispatch": 15, "d3-drag": 16, "d3-interpolate": 24, "d3-selection": 31, "d3-transition": 36}], + 11: [function (require, module, exports) { +// https://d3js.org/d3-chord/ v1.0.6 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-path')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-path'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3)); + }(this, (function (exports, d3Array, d3Path) { + 'use strict'; + + var cos = Math.cos; + var sin = Math.sin; + var pi = Math.PI; + var halfPi = pi / 2; + var tau = pi * 2; + var max = Math.max; + + function compareValue(compare) { + return function (a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; + } + + function chord() { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = [], + groupIndex = d3Array.range(n), + subgroupIndex = [], + chords = [], + groups = chords.groups = new Array(n), + subgroups = new Array(n * n), + k, + x, + x0, + dx, + i, + j; + + // Compute the sum. + k = 0, i = -1; + while (++i < n) { + x = 0, j = -1; + while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(d3Array.range(n)); + k += x; + } + + // Sort groups… + if (sortGroups) groupIndex.sort(function (a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + + // Sort subgroups… + if (sortSubgroups) subgroupIndex.forEach(function (d, i) { + d.sort(function (a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + + // Convert the sum to scaling factor for [0, 2pi]. + // TODO Allow start and end angle to be specified? + // TODO Allow padding to be specified as percentage? + k = max(0, tau - padAngle * n) / k; + dx = k ? padAngle : tau / n; + + // Compute the start and end angle for each group and subgroup. + // Note: Opera has a bug reordering object literal properties! + x = 0, i = -1; + while (++i < n) { + x0 = x, j = -1; + while (++j < n) { + var di = groupIndex[i], + dj = subgroupIndex[di][j], + v = matrix[di][dj], + a0 = x, + a1 = x += v * k; + subgroups[dj * n + di] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += dx; + } + + // Generate chords for each (non-empty) subgroup-subgroup link. + i = -1; + while (++i < n) { + j = i - 1; + while (++j < n) { + var source = subgroups[j * n + i], + target = subgroups[i * n + j]; + if (source.value || target.value) { + chords.push(source.value < target.value + ? {source: target, target: source} + : {source: source, target: target}); + } + } + } + + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function (_) { + return arguments.length ? (padAngle = max(0, _), chord) : padAngle; + }; + + chord.sortGroups = function (_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function (_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function (_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; + } + + var slice = Array.prototype.slice; + + function constant(x) { + return function () { + return x; + }; + } + + function defaultSource(d) { + return d.source; + } + + function defaultTarget(d) { + return d.target; + } + + function defaultRadius(d) { + return d.radius; + } + + function defaultStartAngle(d) { + return d.startAngle; + } + + function defaultEndAngle(d) { + return d.endAngle; + } + + function ribbon() { + var source = defaultSource, + target = defaultTarget, + radius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + context = null; + + function ribbon() { + var buffer, + argv = slice.call(arguments), + s = source.apply(this, argv), + t = target.apply(this, argv), + sr = +radius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi, + sa1 = endAngle.apply(this, argv) - halfPi, + sx0 = sr * cos(sa0), + sy0 = sr * sin(sa0), + tr = +radius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi, + ta1 = endAngle.apply(this, argv) - halfPi; + + if (!context) context = buffer = d3Path.path(); + + context.moveTo(sx0, sy0); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + context.quadraticCurveTo(0, 0, sx0, sy0); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + ribbon.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), ribbon) : radius; + }; + + ribbon.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; + }; + + ribbon.source = function (_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function (_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; + } + + exports.chord = chord; + exports.ribbon = ribbon; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-array": 8, "d3-path": 25}], + 12: [function (require, module, exports) { +// https://d3js.org/d3-collection/ v1.0.7 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + var prefix = "$"; + + function Map() { + } + + Map.prototype = map.prototype = { + constructor: Map, + has: function (key) { + return (prefix + key) in this; + }, + get: function (key) { + return this[prefix + key]; + }, + set: function (key, value) { + this[prefix + key] = value; + return this; + }, + remove: function (key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function () { + for (var property in this) if (property[0] === prefix) delete this[property]; + }, + keys: function () { + var keys = []; + for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); + return keys; + }, + values: function () { + var values = []; + for (var property in this) if (property[0] === prefix) values.push(this[property]); + return values; + }, + entries: function () { + var entries = []; + for (var property in this) if (property[0] === prefix) entries.push({ + key: property.slice(1), + value: this[property] + }); + return entries; + }, + size: function () { + var size = 0; + for (var property in this) if (property[0] === prefix) ++size; + return size; + }, + empty: function () { + for (var property in this) if (property[0] === prefix) return false; + return true; + }, + each: function (f) { + for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); + } + }; + + function map(object, f) { + var map = new Map; + + // Copy constructor. + if (object instanceof Map) object.each(function (value, key) { + map.set(key, value); + }); + + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; + + if (f == null) while (++i < n) map.set(i, object[i]); + else while (++i < n) map.set(f(o = object[i], i, object), o); + } + + // Convert object to map. + else if (object) for (var key in object) map.set(key, object[key]); + + return map; + } + + function nest() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) { + if (sortValues != null) array.sort(sortValues); + return rollup != null ? rollup(array) : array; + } + + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } + + valuesByKey.each(function (values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); + + return result; + } + + function entries(map$$1, depth) { + if (++depth > keys.length) return map$$1; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) array = map$$1.entries(); + else array = [], map$$1.each(function (v, k) { + array.push({key: k, values: entries(v, depth)}); + }); + return sortKey != null ? array.sort(function (a, b) { + return sortKey(a.key, b.key); + }) : array; + } + + return nest = { + object: function (array) { + return apply(array, 0, createObject, setObject); + }, + map: function (array) { + return apply(array, 0, createMap, setMap); + }, + entries: function (array) { + return entries(apply(array, 0, createMap, setMap), 0); + }, + key: function (d) { + keys.push(d); + return nest; + }, + sortKeys: function (order) { + sortKeys[keys.length - 1] = order; + return nest; + }, + sortValues: function (order) { + sortValues = order; + return nest; + }, + rollup: function (f) { + rollup = f; + return nest; + } + }; + } + + function createObject() { + return {}; + } + + function setObject(object, key, value) { + object[key] = value; + } + + function createMap() { + return map(); + } + + function setMap(map$$1, key, value) { + map$$1.set(key, value); + } + + function Set() { + } + + var proto = map.prototype; + + Set.prototype = set.prototype = { + constructor: Set, + has: proto.has, + add: function (value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each + }; + + function set(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) object.each(function (value) { + set.add(value); + }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) while (++i < n) set.add(object[i]); + else while (++i < n) set.add(f(object[i], i, object)); + } + + return set; + } + + function keys(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; + } + + function values(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; + } + + function entries(map) { + var entries = []; + for (var key in map) entries.push({key: key, value: map[key]}); + return entries; + } + + exports.nest = nest; + exports.set = set; + exports.map = map; + exports.keys = keys; + exports.values = values; + exports.entries = entries; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 13: [function (require, module, exports) { +// https://d3js.org/d3-color/ v1.4.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; + } + + function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; + } + + function Color() { + } + + var darker = 0.7; + var brighter = 1 / darker; + + var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + + var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }; + + define(Color, color, { + copy: function (channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function () { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb + }); + + function color_formatHex() { + return this.rgb().formatHex(); + } + + function color_formatHsl() { + return hslConvert(this).formatHsl(); + } + + function color_formatRgb() { + return this.rgb().formatRgb(); + } + + function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; + } + + function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); + } + + function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); + } + + function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); + } + + function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + } + + function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; + } + + define(Rgb, rgb, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function () { + return this; + }, + displayable: function () { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb + })); + + function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); + } + + function rgb_formatRgb() { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); + } + + function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); + } + + function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); + } + + function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); + } + + function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); + } + + function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + define(Hsl, hsl, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function () { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function () { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function () { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } + })); + + /* From FvD 13.37, CSS Color Module Level 3 */ + function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; + } + + var deg2rad = Math.PI / 180; + var rad2deg = 180 / Math.PI; + +// https://observablehq.com/@mbostock/lab-and-rgb + var K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; + + function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); + } + + function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); + } + + function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); + } + + function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; + } + + define(Lab, lab, extend(Color, { + brighter: function (k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function (k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function () { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } + })); + + function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; + } + + function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); + } + + function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); + } + + function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); + } + + function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); + } + + function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } + + function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } + + function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; + } + + function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); + } + + define(Hcl, hcl, extend(Color, { + brighter: function (k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function (k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function () { + return hcl2lab(this).rgb(); + } + })); + + var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + + function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); + } + + function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); + } + + function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + define(Cubehelix, cubehelix, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function () { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } + })); + + exports.color = color; + exports.cubehelix = cubehelix; + exports.gray = gray; + exports.hcl = hcl; + exports.hsl = hsl; + exports.lab = lab; + exports.lch = lch; + exports.rgb = rgb; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 14: [function (require, module, exports) { +// https://d3js.org/d3-contour/ v1.3.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3)); + }(this, (function (exports, d3Array) { + 'use strict'; + + var array = Array.prototype; + + var slice = array.slice; + + function ascending(a, b) { + return a - b; + } + + function area(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; + } + + function constant(x) { + return function () { + return x; + }; + } + + function contains(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; + } + + function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; + } + + function segmentContains(a, b, c) { + var i; + return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); + } + + function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); + } + + function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; + } + + function noop() { + } + + var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] + ]; + + function contours() { + var dx = 1, + dy = 1, + threshold = d3Array.thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = d3Array.extent(values), start = domain[0], stop = domain[1]; + tz = d3Array.tickStep(start, stop, tz); + tz = d3Array.range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending); + } + + return tz.map(function (value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function (ring) { + smooth(ring, values, value); + if (area(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function (hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = { + start: f.start, + end: g.end, + ring: f.ring.concat(g.ring) + }; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = { + start: g.start, + end: f.end, + ring: g.ring.concat(f.ring) + }; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = { + start: startIndex, + end: endIndex, + ring: [start, end] + }; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function (point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function (_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold; + }; + + contours.smooth = function (_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear; + }; + + return contours; + } + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. + function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } + } + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. + function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } + } + + function defaultX(d) { + return d[0]; + } + + function defaultY(d) { + return d[1]; + } + + function defaultWeight() { + return 1; + } + + function density() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function (d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = d3Array.max(values0); + tz = d3Array.tickStep(0, stop, tz); + tz = d3Array.range(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), density) : x; + }; + + density.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), density) : y; + }; + + density.weight = function (_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant(+_), density) : weight; + }; + + density.size = function (_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function (_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold; + }; + + density.bandwidth = function (_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; + } + + exports.contours = contours; + exports.contourDensity = density; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-array": 8}], + 15: [function (require, module, exports) { +// https://d3js.org/d3-dispatch/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var noop = { + value: function () { + } + }; + + function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); + } + + function Dispatch(_) { + this._ = _; + } + + function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); + } + + Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function (typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function () { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function (type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function (type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } + }; + + function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } + } + + function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; + } + + exports.dispatch = dispatch; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 16: [function (require, module, exports) { +// https://d3js.org/d3-drag/ v1.2.5 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-selection')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-selection'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Selection) { + 'use strict'; + + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } + + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } + + function nodrag(view) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } + } + + function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function () { + selection.on("click.drag", null); + }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } + } + + function constant(x) { + return function () { + return x; + }; + } + + function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { + this.target = target; + this.type = type; + this.subject = subject; + this.identifier = id; + this.active = active; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + this._ = dispatch; + } + + DragEvent.prototype.on = function () { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; + }; + +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } + + function defaultContainer() { + return this.parentNode; + } + + function defaultSubject(d) { + return d == null ? {x: d3Selection.event.x, y: d3Selection.event.y} : d; + } + + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + + function drag() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = d3Dispatch.dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var gesture = beforestart("mouse", container.apply(this, arguments), d3Selection.mouse, this, arguments); + if (!gesture) return; + d3Selection.select(d3Selection.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + nodrag(d3Selection.event.view); + nopropagation(); + mousemoving = false; + mousedownx = d3Selection.event.clientX; + mousedowny = d3Selection.event.clientY; + gesture("start"); + } + + function mousemoved() { + noevent(); + if (!mousemoving) { + var dx = d3Selection.event.clientX - mousedownx, dy = d3Selection.event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag"); + } + + function mouseupped() { + d3Selection.select(d3Selection.event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(d3Selection.event.view, mousemoving); + noevent(); + gestures.mouse("end"); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = d3Selection.event.changedTouches, + c = container.apply(this, arguments), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(touches[i].identifier, c, d3Selection.touch, this, arguments)) { + nopropagation(); + gesture("start"); + } + } + } + + function touchmoved() { + var touches = d3Selection.event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(); + gesture("drag"); + } + } + } + + function touchended() { + var touches = d3Selection.event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(); + gesture("end"); + } + } + } + + function beforestart(id, container, point, that, args) { + var p = point(container, id), s, dx, dy, + sublisteners = listeners.copy(); + + if (!d3Selection.customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function () { + if ((d3Selection.event.subject = s = subject.apply(that, args)) == null) return false; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return true; + })) return; + + return function gesture(type) { + var p0 = p, n; + switch (type) { + case "start": + gestures[id] = gesture, n = active++; + break; + case "end": + delete gestures[id], --active; // nobreak + case "drag": + p = point(container, id), n = active; + break; + } + d3Selection.customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); + }; + } + + drag.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), drag) : filter; + }; + + drag.container = function (_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; + }; + + drag.subject = function (_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant(_), drag) : subject; + }; + + drag.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), drag) : touchable; + }; + + drag.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; + } + + exports.drag = drag; + exports.dragDisable = nodrag; + exports.dragEnable = yesdrag; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-dispatch": 15, "d3-selection": 31}], + 17: [function (require, module, exports) { +// https://d3js.org/d3-dsv/ v1.2.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + + function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function (name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); + } + + function customConverter(columns, f) { + var object = objectConverter(columns); + return function (row, i) { + return f(object(row), i, columns); + }; + } + +// Compute unique columns in order of discovery. + function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function (row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; + } + + function pad(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; + } + + function formatYear(year) { + return year < 0 ? "-" + pad(-year, 6) + : year > 9999 ? "+" + pad(year, 6) + : pad(year, 4); + } + + function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); + } + + function dsv(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function (row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE) ; + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { + eol = true; + if (text.charCodeAt(I) === NEWLINE) ++I; + } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { + eol = true; + if (text.charCodeAt(I) === NEWLINE) ++I; + } else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function (row) { + return columns.map(function (column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; + } + + var csv = dsv(","); + + var csvParse = csv.parse; + var csvParseRows = csv.parseRows; + var csvFormat = csv.format; + var csvFormatBody = csv.formatBody; + var csvFormatRows = csv.formatRows; + var csvFormatRow = csv.formatRow; + var csvFormatValue = csv.formatValue; + + var tsv = dsv("\t"); + + var tsvParse = tsv.parse; + var tsvParseRows = tsv.parseRows; + var tsvFormat = tsv.format; + var tsvFormatBody = tsv.formatBody; + var tsvFormatRows = tsv.formatRows; + var tsvFormatRow = tsv.formatRow; + var tsvFormatValue = tsv.formatValue; + + function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } else continue; + object[key] = value; + } + return object; + } + +// https://github.com/d3/d3-dsv/issues/45 + var fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + + exports.autoType = autoType; + exports.csvFormat = csvFormat; + exports.csvFormatBody = csvFormatBody; + exports.csvFormatRow = csvFormatRow; + exports.csvFormatRows = csvFormatRows; + exports.csvFormatValue = csvFormatValue; + exports.csvParse = csvParse; + exports.csvParseRows = csvParseRows; + exports.dsvFormat = dsv; + exports.tsvFormat = tsvFormat; + exports.tsvFormatBody = tsvFormatBody; + exports.tsvFormatRow = tsvFormatRow; + exports.tsvFormatRows = tsvFormatRows; + exports.tsvFormatValue = tsvFormatValue; + exports.tsvParse = tsvParse; + exports.tsvParseRows = tsvParseRows; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 18: [function (require, module, exports) { +// https://d3js.org/d3-ease/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function linear(t) { + return +t; + } + + function quadIn(t) { + return t * t; + } + + function quadOut(t) { + return t * (2 - t); + } + + function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; + } + + function cubicIn(t) { + return t * t * t; + } + + function cubicOut(t) { + return --t * t * t + 1; + } + + function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; + } + + var exponent = 3; + + var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; + })(exponent); + + var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; + })(exponent); + + var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; + })(exponent); + + var pi = Math.PI, + halfPi = pi / 2; + + function sinIn(t) { + return 1 - Math.cos(t * halfPi); + } + + function sinOut(t) { + return Math.sin(t * halfPi); + } + + function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; + } + + function expIn(t) { + return Math.pow(2, 10 * t - 10); + } + + function expOut(t) { + return 1 - Math.pow(2, -10 * t); + } + + function expInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; + } + + function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); + } + + function circleOut(t) { + return Math.sqrt(1 - --t * t); + } + + function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; + } + + var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + + function bounceIn(t) { + return 1 - bounceOut(1 - t); + } + + function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; + } + + function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; + } + + var overshoot = 1.70158; + + var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return t * t * ((s + 1) * t - s); + } + + backIn.overshoot = custom; + + return backIn; + })(overshoot); + + var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((s + 1) * t + s) + 1; + } + + backOut.overshoot = custom; + + return backOut; + })(overshoot); + + var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; + })(overshoot); + + var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; + + var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticIn.period = function (p) { + return custom(a, p); + }; + + return elasticIn; + })(amplitude, period); + + var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticOut.period = function (p) { + return custom(a, p); + }; + + return elasticOut; + })(amplitude, period); + + var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) + : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticInOut.period = function (p) { + return custom(a, p); + }; + + return elasticInOut; + })(amplitude, period); + + exports.easeBack = backInOut; + exports.easeBackIn = backIn; + exports.easeBackInOut = backInOut; + exports.easeBackOut = backOut; + exports.easeBounce = bounceOut; + exports.easeBounceIn = bounceIn; + exports.easeBounceInOut = bounceInOut; + exports.easeBounceOut = bounceOut; + exports.easeCircle = circleInOut; + exports.easeCircleIn = circleIn; + exports.easeCircleInOut = circleInOut; + exports.easeCircleOut = circleOut; + exports.easeCubic = cubicInOut; + exports.easeCubicIn = cubicIn; + exports.easeCubicInOut = cubicInOut; + exports.easeCubicOut = cubicOut; + exports.easeElastic = elasticOut; + exports.easeElasticIn = elasticIn; + exports.easeElasticInOut = elasticInOut; + exports.easeElasticOut = elasticOut; + exports.easeExp = expInOut; + exports.easeExpIn = expIn; + exports.easeExpInOut = expInOut; + exports.easeExpOut = expOut; + exports.easeLinear = linear; + exports.easePoly = polyInOut; + exports.easePolyIn = polyIn; + exports.easePolyInOut = polyInOut; + exports.easePolyOut = polyOut; + exports.easeQuad = quadInOut; + exports.easeQuadIn = quadIn; + exports.easeQuadInOut = quadInOut; + exports.easeQuadOut = quadOut; + exports.easeSin = sinInOut; + exports.easeSinIn = sinIn; + exports.easeSinInOut = sinInOut; + exports.easeSinOut = sinOut; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 19: [function (require, module, exports) { +// https://d3js.org/d3-fetch/ v1.1.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dsv')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dsv'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3)); + }(this, (function (exports, d3Dsv) { + 'use strict'; + + function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); + } + + function blob(input, init) { + return fetch(input, init).then(responseBlob); + } + + function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); + } + + function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); + } + + function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); + } + + function text(input, init) { + return fetch(input, init).then(responseText); + } + + function dsvParse(parse) { + return function (input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function (response) { + return parse(response, row); + }); + }; + } + + function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = d3Dsv.dsvFormat(delimiter); + return text(input, init).then(function (response) { + return format.parse(response, row); + }); + } + + var csv = dsvParse(d3Dsv.csvParse); + var tsv = dsvParse(d3Dsv.tsvParse); + + function image(input, init) { + return new Promise(function (resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function () { + resolve(image); + }; + image.src = input; + }); + } + + function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.json(); + } + + function json(input, init) { + return fetch(input, init).then(responseJson); + } + + function parser(type) { + return function (input, init) { + return text(input, init).then(function (text$$1) { + return (new DOMParser).parseFromString(text$$1, type); + }); + }; + } + + var xml = parser("application/xml"); + + var html = parser("text/html"); + + var svg = parser("image/svg+xml"); + + exports.blob = blob; + exports.buffer = buffer; + exports.dsv = dsv; + exports.csv = csv; + exports.tsv = tsv; + exports.image = image; + exports.json = json; + exports.text = text; + exports.xml = xml; + exports.html = html; + exports.svg = svg; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-dsv": 17}], + 20: [function (require, module, exports) { +// https://d3js.org/d3-force/ v1.2.1 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-quadtree'), require('d3-collection'), require('d3-dispatch'), require('d3-timer')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-quadtree', 'd3-collection', 'd3-dispatch', 'd3-timer'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3, global.d3, global.d3)); + }(this, (function (exports, d3Quadtree, d3Collection, d3Dispatch, d3Timer) { + 'use strict'; + + function center(x, y) { + var nodes; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function (_) { + nodes = _; + }; + + force.x = function (_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function (_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + } + + function constant(x) { + return function () { + return x; + }; + } + + function jiggle() { + return (Math.random() - 0.5) * 1e-6; + } + + function x(d) { + return d.x + d.vx; + } + + function y(d) { + return d.y + d.vy; + } + + function collide(radius) { + var nodes, + radii, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.iterations = function (_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function (_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + return force; + } + + function index(d) { + return d.index; + } + + function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("missing: " + nodeId); + return node; + } + + function link(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant(30), + distances, + nodes, + count, + bias, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(); + y = target.y + target.vy - source.y - source.vy || jiggle(); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = d3Collection.map(nodes, id), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.links = function (_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function (_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function (_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength; + }; + + force.distance = function (_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; + }; + + return force; + } + + function x$1(d) { + return d.x; + } + + function y$1(d) { + return d.y; + } + + var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + + function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = d3Collection.map(), + stepper = d3Timer.timer(step), + event = d3Dispatch.dispatch("tick", "end"); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.each(function (force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function () { + return stepper.restart(step), simulation; + }, + + stop: function () { + return stepper.stop(), simulation; + }, + + nodes: function (_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + }, + + alpha: function (_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function (_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function (_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function (_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function (_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + force: function (name, _) { + return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function (x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function (name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; + } + + function manyBody() { + var nodes, + node, + alpha, + strength = constant(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.distanceMin = function (_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function (_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function (_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; + } + + function radial(radius, x, y) { + var nodes, + strength = constant(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _, initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + force.x = function (_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function (_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + } + + function x$2(x) { + var strength = constant(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x; + }; + + return force; + } + + function y$2(y) { + var strength = constant(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; + }; + + return force; + } + + exports.forceCenter = center; + exports.forceCollide = collide; + exports.forceLink = link; + exports.forceManyBody = manyBody; + exports.forceRadial = radial; + exports.forceSimulation = simulation; + exports.forceX = x$2; + exports.forceY = y$2; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-collection": 12, "d3-dispatch": 15, "d3-quadtree": 27, "d3-timer": 35}], + 21: [function (require, module, exports) { +// https://d3js.org/d3-format/ v1.4.3 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimal(1.23) returns ["123", 0]. + function formatDecimal(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; + } + + function exponent(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; + } + + function formatGroup(grouping, thousands) { + return function (value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; + } + + function formatNumerals(numerals) { + return function (value) { + return value.replace(/[0-9]/g, function (i) { + return numerals[+i]; + }); + }; + } + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] + var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + + function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); + } + + formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + + function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; + } + + FormatSpecifier.prototype.toString = function () { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; + }; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. + function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": + i0 = i1 = i; + break; + case "0": + if (i0 === 0) i0 = i; + i1 = i; + break; + default: + if (!+s[i]) break out; + if (i0 > 0) i0 = 0; + break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; + } + + var prefixExponent; + + function formatPrefixAuto(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! + } + + function formatRounded(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); + } + + var formatTypes = { + "%": function (x, p) { + return (x * 100).toFixed(p); + }, + "b": function (x) { + return Math.round(x).toString(2); + }, + "c": function (x) { + return x + ""; + }, + "d": function (x) { + return Math.round(x).toString(10); + }, + "e": function (x, p) { + return x.toExponential(p); + }, + "f": function (x, p) { + return x.toFixed(p); + }, + "g": function (x, p) { + return x.toPrecision(p); + }, + "o": function (x) { + return Math.round(x).toString(8); + }, + "p": function (x, p) { + return formatRounded(x * 100, p); + }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function (x) { + return Math.round(x).toString(16).toUpperCase(); + }, + "x": function (x) { + return Math.round(x).toString(16); + } + }; + + function identity(x) { + return x; + } + + var map = Array.prototype.map, + prefixes = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; + + function formatLocale(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "-" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Perform the initial formatting. + var valueNegative = value < 0; + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero during formatting, treat as positive. + if (valueNegative && +value === 0) valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": + value = valuePrefix + value + valueSuffix + padding; + break; + case "=": + value = valuePrefix + padding + value + valueSuffix; + break; + case "^": + value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); + break; + default: + value = padding + valuePrefix + value + valueSuffix; + break; + } + + return numerals(value); + } + + format.toString = function () { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function (value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; + } + + var locale; + + defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""], + minus: "-" + }); + + function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; + } + + function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); + } + + function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); + } + + function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; + } + + exports.FormatSpecifier = FormatSpecifier; + exports.formatDefaultLocale = defaultLocale; + exports.formatLocale = formatLocale; + exports.formatSpecifier = formatSpecifier; + exports.precisionFixed = precisionFixed; + exports.precisionPrefix = precisionPrefix; + exports.precisionRound = precisionRound; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 22: [function (require, module, exports) { +// https://d3js.org/d3-geo/ v1.11.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Array) { + 'use strict'; + +// Adds floating point numbers with twice the normal precision. +// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and +// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) +// 305–363 (1997). +// Code adapted from GeographicLib by Charles F. F. Karney, +// http://geographiclib.sourceforge.net/ + + function adder() { + return new Adder; + } + + function Adder() { + this.reset(); + } + + Adder.prototype = { + constructor: Adder, + reset: function () { + this.s = // rounded value + this.t = 0; // exact error + }, + add: function (y) { + add(temp, y, this.t); + add(this, temp.s, this.s); + if (this.s) this.t += temp.t; + else this.s = temp.t; + }, + valueOf: function () { + return this.s; + } + }; + + var temp = new Adder; + + function add(adder, a, b) { + var x = adder.s = a + b, + bv = x - a, + av = x - bv; + adder.t = (a - av) + (b - bv); + } + + var epsilon = 1e-6; + var epsilon2 = 1e-12; + var pi = Math.PI; + var halfPi = pi / 2; + var quarterPi = pi / 4; + var tau = pi * 2; + + var degrees = 180 / pi; + var radians = pi / 180; + + var abs = Math.abs; + var atan = Math.atan; + var atan2 = Math.atan2; + var cos = Math.cos; + var ceil = Math.ceil; + var exp = Math.exp; + var log = Math.log; + var pow = Math.pow; + var sin = Math.sin; + var sign = Math.sign || function (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + }; + var sqrt = Math.sqrt; + var tan = Math.tan; + + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); + } + + function asin(x) { + return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); + } + + function haversin(x) { + return (x = sin(x / 2)) * x; + } + + function noop() { + } + + function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } + } + + var streamObjectType = { + Feature: function (object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function (object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } + }; + + var streamGeometryType = { + Sphere: function (object, stream) { + stream.sphere(); + }, + Point: function (object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function (object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function (object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function (object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } + }; + + function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); + } + + function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); + } + + function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } + } + + var areaRingSum = adder(); + + var areaSum = adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + + var areaStream = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function () { + areaRingSum.reset(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function () { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop; + }, + sphere: function () { + areaSum.add(tau); + } + }; + + function areaRingStart() { + areaStream.point = areaPointFirst; + } + + function areaRingEnd() { + areaPoint(lambda00, phi00); + } + + function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); + } + + function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos(phi), + sinPhi = sin(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos(adLambda), + v = k * sdLambda * sin(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; + } + + function area(object) { + areaSum.reset(); + geoStream(object, areaStream); + return areaSum * 2; + } + + function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; + } + + function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); + return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; + } + + function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + + function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; + } + +// TODO return a + function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; + } + + function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; + } + +// TODO return d + function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; + } + + var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum = adder(), + ranges, + range; + + var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function () { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum.reset(); + areaStream.polygonStart(); + }, + polygonEnd: function () { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon) phi1 = 90; + else if (deltaSum < -epsilon) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function () { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } + }; + + function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + + function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; + } + + function boundsLineStart() { + boundsStream.point = linePoint; + } + + function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; + } + + function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); + } + + function boundsRingStart() { + areaStream.lineStart(); + } + + function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; + } + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. + function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; + } + + function rangeCompare(a, b) { + return a[0] - b[0]; + } + + function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + + function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; + } + + var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00$2, phi00$2, // first point + x0, y0, z0; // previous point + + var centroidStream = { + sphere: noop, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function () { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function () { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } + }; + +// Arithmetic mean of Cartesian vectors. + function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); + } + + function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; + } + + function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; + } + + function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); + } + + function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroidLineEnd() { + centroidStream.point = centroidPoint; + } + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). + function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; + } + + function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; + } + + function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidPointCartesian(x0, y0, z0); + } + + function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = sqrt(cx * cx + cy * cy + cz * cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2 += v * cx; + Y2 += v * cy; + Z2 += v * cz; + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroid(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + geoStream(object, centroidStream); + + var x = X2, + y = Y2, + z = Z2, + m = x * x + y * y + z * z; + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon) x = X0, y = Y0, z = Z0; + m = x * x + y * y + z * z; + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees, asin(z / sqrt(m)) * degrees]; + } + + function constant(x) { + return function () { + return x; + }; + } + + function compose(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function (x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; + } + + function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; + } + + rotationIdentity.invert = rotationIdentity; + + function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); + } + + function forwardRotationLambda(deltaLambda) { + return function (lambda, phi) { + return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; + }; + } + + function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; + } + + function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos(deltaPhi), + sinDeltaPhi = sin(deltaPhi), + cosDeltaGamma = cos(deltaGamma), + sinDeltaGamma = sin(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function (lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; + } + + function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + } + + forward.invert = function (coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + }; + + return forward; + } + +// Generates a circle centered at [0°, 0°], with a given radius and precision. + function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos(radius), + sinRadius = sin(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); + stream.point(point[0], point[1]); + } + } + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. + function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; + } + + function circle() { + var center = constant([0, 0]), + radius = constant(90), + precision = constant(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees, x[1] *= degrees; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function (_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius; + }; + + circle.precision = function (_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision; + }; + + return circle; + } + + function clipBuffer() { + var lines = [], + line; + return { + point: function (x, y) { + line.push([x, y]); + }, + lineStart: function () { + lines.push(line = []); + }, + lineEnd: noop, + rejoin: function () { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function () { + var result = lines; + lines = []; + line = null; + return result; + } + }; + } + + function pointEqual(a, b) { + return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; + } + + function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous + } + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. + function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function (segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + // If the first and last points of a segment are coincident, then treat as a + // closed ring. TODO if all rings are closed, then the winding order of the + // exterior ring should be checked. + if (pointEqual(p0, p1)) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link(subject); + link(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } + } + + function link(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; + } + + var sum = adder(); + + function longitude(point) { + if (abs(point[0]) <= pi) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); + } + + function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin(phi), + normal = [sin(lambda), -cos(lambda), 0], + angle = 0, + winding = 0; + + sum.reset(); + + if (sinPhi === 1) phi = halfPi + epsilon; + else if (sinPhi === -1) phi = -halfPi - epsilon; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin(phi0), + cosPhi0 = cos(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin(phi1), + cosPhi1 = cos(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi, + k = sinPhi0 * sinPhi1; + + sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); + angle += antimeridian ? delta + sign * tau : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1); + } + + function clip(pointVisible, clipLine, interpolate, start) { + return function (sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function () { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function () { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3Array.merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function () { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; + } + + function validSegment(segment) { + return segment.length > 1; + } + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. + function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); + } + + var clipAntimeridian = clip( + function () { + return true; + }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi, -halfPi] + ); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. + function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function () { + stream.lineStart(); + clean = 1; + }, + point: function (lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi : -pi, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi) < epsilon) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function () { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function () { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; + } + + function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon + ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) + - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; + } + + function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi; + stream.point(-pi, phi); + stream.point(0, phi); + stream.point(pi, phi); + stream.point(pi, 0); + stream.point(pi, -phi); + stream.point(0, -phi); + stream.point(-pi, -phi); + stream.point(-pi, 0); + stream.point(-pi, phi); + } else if (abs(from[0] - to[0]) > epsilon) { + var lambda = from[0] < to[0] ? pi : -pi; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } + } + + function clipCircle(radius) { + var cr = cos(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos(lambda) * cos(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function () { + v00 = v0 = false; + clean = 1; + }, + point: function (lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + // Handle degeneracies. + // TODO ignore if not clipping polygons. + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { + point1[0] += epsilon; + point1[1] += epsilon; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1]); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function () { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function () { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi) < epsilon, + meridian = polar || delta < epsilon; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); + } + + function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; + } + + var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + + function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function (stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { + if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; + } else { + if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; + } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = d3Array.merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; + } + + function extent() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function (stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function (_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; + } + + var lengthSum = adder(), + lambda0$2, + sinPhi0$1, + cosPhi0$1; + + var lengthStream = { + sphere: noop, + point: noop, + lineStart: lengthLineStart, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop + }; + + function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; + } + + function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop; + } + + function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi); + lengthStream.point = lengthPoint; + } + + function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin(phi), + cosPhi = cos(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos(delta), + sinDelta = sin(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; + } + + function length(object) { + lengthSum.reset(); + geoStream(object, lengthStream); + return +lengthSum; + } + + var coordinates = [null, null], + object = {type: "LineString", coordinates: coordinates}; + + function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length(object); + } + + var containsObjectType = { + Feature: function (object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function (object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } + }; + + var containsGeometryType = { + Sphere: function () { + return true; + }, + Point: function (object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function (object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function (object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function (object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } + }; + + function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; + } + + function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; + } + + function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab + ) + return true; + } + ao = bo; + } + return false; + } + + function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); + } + + function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; + } + + function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; + } + + function contains(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); + } + + function graticuleX(y0, y1, dy) { + var y = d3Array.range(y0, y1 - epsilon, dy).concat(y1); + return function (x) { + return y.map(function (y) { + return [x, y]; + }); + }; + } + + function graticuleY(x0, x1, dx) { + var x = d3Array.range(x0, x1 - epsilon, dx).concat(x1); + return function (y) { + return x.map(function (x) { + return [x, y]; + }); + }; + } + + function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return d3Array.range(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(d3Array.range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(d3Array.range(ceil(x0 / dx) * dx, x1, dx).filter(function (x) { + return abs(x % DX) > epsilon; + }).map(x)) + .concat(d3Array.range(ceil(y0 / dy) * dy, y1, dy).filter(function (y) { + return abs(y % DY) > epsilon; + }).map(y)); + } + + graticule.lines = function () { + return lines().map(function (coordinates) { + return {type: "LineString", coordinates: coordinates}; + }); + }; + + graticule.outline = function () { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function (_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function (_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function (_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function (_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function (_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function (_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function (_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) + .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); + } + + function graticule10() { + return graticule()(); + } + + function interpolate(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos(y0), + sy0 = sin(y0), + cy1 = cos(y1), + sy1 = sin(y1), + kx0 = cy0 * cos(x0), + ky0 = cy0 * sin(x0), + kx1 = cy1 * cos(x1), + ky1 = cy1 * sin(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin(d); + + var interpolate = d ? function (t) { + var B = sin(t *= d) / k, + A = sin(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees, + atan2(z, sqrt(x * x + y * y)) * degrees + ]; + } : function () { + return [x0 * degrees, y0 * degrees]; + }; + + interpolate.distance = d; + + return interpolate; + } + + function identity(x) { + return x; + } + + var areaSum$1 = adder(), + areaRingSum$1 = adder(), + x00, + y00, + x0$1, + y0$1; + + var areaStream$1 = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function () { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function () { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1.reset(); + }, + result: function () { + var area = areaSum$1 / 2; + areaSum$1.reset(); + return area; + } + }; + + function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; + } + + function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; + } + + function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; + } + + function areaRingEnd$1() { + areaPoint$1(x00, y00); + } + + var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + + var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop, + result: function () { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } + }; + + function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; + } + +// TODO Enforce positive area for exterior, negative area for interior? + + var X0$1 = 0, + Y0$1 = 0, + Z0$1 = 0, + X1$1 = 0, + Y1$1 = 0, + Z1$1 = 0, + X2$1 = 0, + Y2$1 = 0, + Z2$1 = 0, + x00$1, + y00$1, + x0$3, + y0$3; + + var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function () { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function () { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function () { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } + }; + + function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; + } + + function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; + } + + function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; + } + + function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; + } + + function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); + } + + function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); + } + + function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function PathContext(context) { + this._context = context; + } + + PathContext.prototype = { + _radius: 4.5, + pointRadius: function (_) { + return this._radius = _, this; + }, + polygonStart: function () { + this._line = 0; + }, + polygonEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function (x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau); + break; + } + } + }, + result: noop + }; + + var lengthSum$1 = adder(), + lengthRing, + x00$2, + y00$2, + x0$4, + y0$4; + + var lengthStream$1 = { + point: noop, + lineStart: function () { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function () { + if (lengthRing) lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop; + }, + polygonStart: function () { + lengthRing = true; + }, + polygonEnd: function () { + lengthRing = null; + }, + result: function () { + var length = +lengthSum$1; + lengthSum$1.reset(); + return length; + } + }; + + function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; + } + + function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; + } + + function PathString() { + this._string = []; + } + + PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function (_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function () { + this._line = 0; + }, + polygonEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function (x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function () { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } + }; + + function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; + } + + function index(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function (object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.measure = function (object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); + }; + + path.bounds = function (object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function (object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function (_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; + }; + + path.context = function (_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function (_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); + } + + function transform(methods) { + return { + stream: transformer(methods) + }; + } + + function transformer(methods) { + return function (stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; + } + + function TransformStream() { + } + + TransformStream.prototype = { + constructor: TransformStream, + point: function (x, y) { + this.stream.point(x, y); + }, + sphere: function () { + this.stream.sphere(); + }, + lineStart: function () { + this.stream.lineStart(); + }, + lineEnd: function () { + this.stream.lineEnd(); + }, + polygonStart: function () { + this.stream.polygonStart(); + }, + polygonEnd: function () { + this.stream.polygonEnd(); + } + }; + + function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream$1)); + fitBounds(boundsStream$1.result()); + if (clip != null) projection.clipExtent(clip); + return projection; + } + + function fitExtent(projection, extent, object) { + return fit(projection, function (b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); + } + + function fitWidth(projection, width, object) { + return fit(projection, function (b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + function fitHeight(projection, height, object) { + return fit(projection, function (b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos(30 * radians); // cos(minimum angular distance) + + function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); + } + + function resampleNone(project) { + return transformer({ + point: function (x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); + } + + function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + + return function (stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function () { + stream.polygonStart(); + resampleStream.lineStart = ringStart; + }, + polygonEnd: function () { + stream.polygonEnd(); + resampleStream.lineStart = lineStart; + } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; + } + + var transformRadians = transformer({ + point: function (x, y) { + this.stream.point(x * radians, y * radians); + } + }); + + function transformRotate(rotate) { + return transformer({ + point: function (x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); + } + + function scaleTranslate(k, dx, dy) { + function transform(x, y) { + return [dx + k * x, dy - k * y]; + } + + transform.invert = function (x, y) { + return [(x - dx) / k, (dy - y) / k]; + }; + return transform; + } + + function scaleTranslateRotate(k, dx, dy, alpha) { + var cosAlpha = cos(alpha), + sinAlpha = sin(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + + function transform(x, y) { + return [a * x - b * y + dx, dy - b * x - a * y]; + } + + transform.invert = function (x, y) { + return [ai * x - bi * y + ci, fi - bi * x - ai * y]; + }; + return transform; + } + + function projection(project) { + return projectionMutator(function () { + return project; + })(); + } + + function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees, point[1] * degrees]; + } + + projection.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function (_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function (_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; + }; + + projection.clipExtent = function (_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function (_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function (_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function (_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; + }; + + projection.rotate = function (_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + }; + + projection.angle = function (_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.precision = function (_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function (extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function (size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function (width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function (height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)), + transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function () { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; + } + + function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function (_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; + }; + + return p; + } + + function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin(phi) / cosPhi0]; + } + + forward.invert = function (x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; + } + + function conicEqualAreaRaw(y0, y1) { + var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin(y)) / n; + return [r * sin(x *= n), r0 - r * cos(x)]; + } + + project.invert = function (x, y) { + var r0y = r0 - y; + return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; + } + + function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); + } + + function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); + } + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. + function multiplex(streams) { + var n = streams.length; + return { + point: function (x, y) { + var i = -1; + while (++i < n) streams[i].point(x, y); + }, + sphere: function () { + var i = -1; + while (++i < n) streams[i].sphere(); + }, + lineStart: function () { + var i = -1; + while (++i < n) streams[i].lineStart(); + }, + lineEnd: function () { + var i = -1; + while (++i < n) streams[i].lineEnd(); + }, + polygonStart: function () { + var i = -1; + while (++i < n) streams[i].polygonStart(); + }, + polygonEnd: function () { + var i = -1; + while (++i < n) streams[i].polygonEnd(); + } + }; + } + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers + function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = { + point: function (x, y) { + point = [x, y]; + } + }; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function (coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function (_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function (_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function (_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function (extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function (size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function (width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function (height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); + } + + function azimuthalRaw(scale) { + return function (x, y) { + var cx = cos(x), + cy = cos(y), + k = scale(cx * cy); + return [ + k * cy * sin(x), + k * sin(y) + ]; + } + } + + function azimuthalInvert(angle) { + return function (x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin(c), + cc = cos(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } + } + + var azimuthalEqualAreaRaw = azimuthalRaw(function (cxcy) { + return sqrt(2 / (1 + cxcy)); + }); + + azimuthalEqualAreaRaw.invert = azimuthalInvert(function (z) { + return 2 * asin(z / 2); + }); + + function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); + } + + var azimuthalEquidistantRaw = azimuthalRaw(function (c) { + return (c = acos(c)) && c / sin(c); + }); + + azimuthalEquidistantRaw.invert = azimuthalInvert(function (z) { + return z; + }); + + function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); + } + + function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi + phi) / 2))]; + } + + mercatorRaw.invert = function (x, y) { + return [x, 2 * atan(exp(y)) - halfPi]; + }; + + function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau); + } + + function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function (_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function (_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function (_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function (_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); + } + + function tany(y) { + return tan((halfPi + y) / 2); + } + + function conicConformalRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { + if (y < -halfPi + epsilon) y = -halfPi + epsilon; + } else { + if (y > halfPi - epsilon) y = halfPi - epsilon; + } + var r = f / pow(tany(y), n); + return [r * sin(n * x), f - r * cos(n * x)]; + } + + project.invert = function (x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy); + return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi]; + }; + + return project; + } + + function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); + } + + function equirectangularRaw(lambda, phi) { + return [lambda, phi]; + } + + equirectangularRaw.invert = equirectangularRaw; + + function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); + } + + function conicEquidistantRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin(nx), g - gy * cos(nx)]; + } + + project.invert = function (x, y) { + var gy = g - y; + return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; + } + + function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); + } + + var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + + function equalEarthRaw(lambda, phi) { + var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; + } + + equalEarthRaw.invert = function (x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l), + asin(sin(l) / M) + ]; + }; + + function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); + } + + function gnomonicRaw(x, y) { + var cy = cos(y), k = cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; + } + + gnomonicRaw.invert = azimuthalInvert(atan); + + function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); + } + + function scaleTranslate$1(kx, ky, tx, ty) { + return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity : transformer({ + point: function (x, y) { + this.stream.point(x * kx + tx, y * ky + ty); + } + }); + } + + function identity$1() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity, // scale, translate and reflect + x0 = null, y0, x1, y1, // clip extent + postclip = identity, + cache, + cacheStream, + projection; + + function reset() { + cache = cacheStream = null; + return projection; + } + + return projection = { + stream: function (stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }, + postclip: function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }, + clipExtent: function (_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }, + scale: function (_) { + return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k; + }, + translate: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty]; + }, + reflectX: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0; + }, + reflectY: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0; + }, + fitExtent: function (extent, object) { + return fitExtent(projection, extent, object); + }, + fitSize: function (size, object) { + return fitSize(projection, size, object); + }, + fitWidth: function (width, object) { + return fitWidth(projection, width, object); + }, + fitHeight: function (height, object) { + return fitHeight(projection, height, object); + } + }; + } + + function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; + } + + naturalEarth1Raw.invert = function (x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; + }; + + function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); + } + + function orthographicRaw(x, y) { + return [cos(y) * sin(x), sin(y)]; + } + + orthographicRaw.invert = azimuthalInvert(asin); + + function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon); + } + + function stereographicRaw(x, y) { + var cy = cos(y), k = 1 + cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; + } + + stereographicRaw.invert = azimuthalInvert(function (z) { + return 2 * atan(z); + }); + + function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); + } + + function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi + phi) / 2)), -lambda]; + } + + transverseMercatorRaw.invert = function (x, y) { + return [-y, 2 * atan(exp(x)) - halfPi]; + }; + + function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function (_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function (_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); + } + + exports.geoAlbers = albers; + exports.geoAlbersUsa = albersUsa; + exports.geoArea = area; + exports.geoAzimuthalEqualArea = azimuthalEqualArea; + exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; + exports.geoAzimuthalEquidistant = azimuthalEquidistant; + exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; + exports.geoBounds = bounds; + exports.geoCentroid = centroid; + exports.geoCircle = circle; + exports.geoClipAntimeridian = clipAntimeridian; + exports.geoClipCircle = clipCircle; + exports.geoClipExtent = extent; + exports.geoClipRectangle = clipRectangle; + exports.geoConicConformal = conicConformal; + exports.geoConicConformalRaw = conicConformalRaw; + exports.geoConicEqualArea = conicEqualArea; + exports.geoConicEqualAreaRaw = conicEqualAreaRaw; + exports.geoConicEquidistant = conicEquidistant; + exports.geoConicEquidistantRaw = conicEquidistantRaw; + exports.geoContains = contains; + exports.geoDistance = distance; + exports.geoEqualEarth = equalEarth; + exports.geoEqualEarthRaw = equalEarthRaw; + exports.geoEquirectangular = equirectangular; + exports.geoEquirectangularRaw = equirectangularRaw; + exports.geoGnomonic = gnomonic; + exports.geoGnomonicRaw = gnomonicRaw; + exports.geoGraticule = graticule; + exports.geoGraticule10 = graticule10; + exports.geoIdentity = identity$1; + exports.geoInterpolate = interpolate; + exports.geoLength = length; + exports.geoMercator = mercator; + exports.geoMercatorRaw = mercatorRaw; + exports.geoNaturalEarth1 = naturalEarth1; + exports.geoNaturalEarth1Raw = naturalEarth1Raw; + exports.geoOrthographic = orthographic; + exports.geoOrthographicRaw = orthographicRaw; + exports.geoPath = index; + exports.geoProjection = projection; + exports.geoProjectionMutator = projectionMutator; + exports.geoRotation = rotation; + exports.geoStereographic = stereographic; + exports.geoStereographicRaw = stereographicRaw; + exports.geoStream = geoStream; + exports.geoTransform = transform; + exports.geoTransverseMercator = transverseMercator; + exports.geoTransverseMercatorRaw = transverseMercatorRaw; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-array": 8}], + 23: [function (require, module, exports) { +// https://d3js.org/d3-hierarchy/ v1.1.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; + } + + function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; + } + + function meanXReduce(x, c) { + return x + c.x; + } + + function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); + } + + function maxYReduce(y, c) { + return Math.max(y, c.y); + } + + function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; + } + + function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; + } + + function cluster() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function (node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function (node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function (node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function (x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function (x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function (x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; + } + + function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; + } + + function node_count() { + return this.eachAfter(count); + } + + function node_each(callback) { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + callback(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } while (next.length); + return this; + } + + function node_eachBefore(callback) { + var node = this, nodes = [node], children, i; + while (node = nodes.pop()) { + callback(node), children = node.children; + if (children) for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + return this; + } + + function node_eachAfter(callback) { + var node = this, nodes = [node], next = [], children, i, n; + while (node = nodes.pop()) { + next.push(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + while (node = next.pop()) { + callback(node); + } + return this; + } + + function node_sum(value) { + return this.eachAfter(function (node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); + } + + function node_sort(compare) { + return this.eachBefore(function (node) { + if (node.children) { + node.children.sort(compare); + } + }); + } + + function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; + } + + function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; + } + + function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; + } + + function node_descendants() { + var nodes = []; + this.each(function (node) { + nodes.push(node); + }); + return nodes; + } + + function node_leaves() { + var leaves = []; + this.eachBefore(function (node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; + } + + function node_links() { + var root = this, links = []; + root.each(function (node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; + } + + function hierarchy(data, children) { + var root = new Node(data), + valued = +data.value && (root.value = data.value), + node, + nodes = [root], + child, + childs, + i, + n; + + if (children == null) children = defaultChildren; + + while (node = nodes.pop()) { + if (valued) node.value = +node.data.value; + if ((childs = children(node.data)) && (n = childs.length)) { + node.children = new Array(n); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); + } + + function node_copy() { + return hierarchy(this).eachBefore(copyData); + } + + function defaultChildren(d) { + return d.children; + } + + function copyData(node) { + node.data = node.data.data; + } + + function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); + } + + function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; + } + + Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy + }; + + var slice = Array.prototype.slice; + + function shuffle(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; + } + + function enclose(circles) { + var i = 0, n = (circles = shuffle(slice.call(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; + } + + function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; + } + + function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; + } + + function enclosesWeak(a, b) { + var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; + } + + function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; + } + + function encloseBasis(B) { + switch (B.length) { + case 1: + return encloseBasis1(B[0]); + case 2: + return encloseBasis2(B[0], B[1]); + case 3: + return encloseBasis3(B[0], B[1], B[2]); + } + } + + function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; + } + + function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; + } + + function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; + } + + function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } + } + + function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; + } + + function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; + } + + function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; + } + + function packEnclose(circles) { + if (!(n = circles.length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; + while ((c = c.next) !== b) a.push(c._); + c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; + } + + function siblings(circles) { + packEnclose(circles); + return circles; + } + + function optional(f) { + return f == null ? null : required(f); + } + + function required(f) { + if (typeof f !== "function") throw new Error; + return f; + } + + function constantZero() { + return 0; + } + + function constant(x) { + return function () { + return x; + }; + } + + function defaultRadius(d) { + return Math.sqrt(d.value); + } + + function index() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function (x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function (x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding; + }; + + return pack; + } + + function radiusLeaf(radius) { + return function (node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; + } + + function packChildren(padding, k) { + return function (node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; + } + + function translateChild(k) { + return function (node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; + } + + function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); + } + + function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } + } + + function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function (node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function (x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function (x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; + } + + var keyPrefix = "$", // Protect against keys like “__proto__”. + preroot = {depth: -1}, + ambiguous = {}; + + function defaultId(d) { + return d.id; + } + + function defaultParentId(d) { + return d.parentId; + } + + function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var d, + i, + n = data.length, + root, + parent, + node, + nodes = new Array(n), + nodeId, + nodeKey, + nodeByKey = {}; + + for (i = 0; i < n; ++i) { + d = data[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = keyPrefix + (node.id = nodeId); + nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i], nodeId = parentId(data[i], i, data); + if (nodeId == null || !(nodeId += "")) { + if (root) throw new Error("multiple roots"); + root = node; + } else { + parent = nodeByKey[keyPrefix + nodeId]; + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function (node) { + node.depth = node.parent.depth + 1; + --n; + }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function (x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function (x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; + } + + function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; + } + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. + function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; + } + +// This function works analogously to nextLeft. + function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; + } + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. + function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; + } + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). + function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } + } + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. + function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; + } + + function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number + } + + TreeNode.prototype = Object.create(Node.prototype); + + function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; + } + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm + function tree() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function (node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function (node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function (x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function (x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function (x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; + } + + function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } + } + + var phi = (1 + Math.sqrt(5)) / 2; + + function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { + sumValue -= nodeValue; + break; + } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; + } + + var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function (x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; + })(phi); + + function index$1() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function (x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function (x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function (x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function (x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function (x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function (x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function (x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function (x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function (x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft; + }; + + return treemap; + } + + function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = (x0 * valueRight + x1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = (y0 * valueRight + y1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } + } + + function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); + } + + var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); + else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function (x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; + })(phi); + + exports.cluster = cluster; + exports.hierarchy = hierarchy; + exports.pack = index; + exports.packEnclose = enclose; + exports.packSiblings = siblings; + exports.partition = partition; + exports.stratify = stratify; + exports.tree = tree; + exports.treemap = index$1; + exports.treemapBinary = binary; + exports.treemapDice = treemapDice; + exports.treemapResquarify = resquarify; + exports.treemapSlice = treemapSlice; + exports.treemapSliceDice = sliceDice; + exports.treemapSquarify = squarify; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 24: [function (require, module, exports) { +// https://d3js.org/d3-interpolate/ v1.4.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Color) { + 'use strict'; + + function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; + } + + function basis$1(values) { + var n = values.length - 1; + return function (t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; + } + + function basisClosed(values) { + var n = values.length; + return function (t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; + } + + function constant(x) { + return function () { + return x; + }; + } + + function linear(a, d) { + return function (t) { + return a + t * d; + }; + } + + function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) { + return Math.pow(a + t * b, y); + }; + } + + function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); + } + + function gamma(y) { + return (y = +y) === 1 ? nogamma : function (a, b) { + return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); + }; + } + + function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant(isNaN(a) ? b : a); + } + + var rgb = (function rgbGamma(y) { + var color = gamma(y); + + function rgb(start, end) { + var r = color((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb.gamma = rgbGamma; + + return rgb; + })(1); + + function rgbSpline(spline) { + return function (colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = d3Color.rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function (t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; + } + + var rgbBasis = rgbSpline(basis$1); + var rgbBasisClosed = rgbSpline(basisClosed); + + function numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function (t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; + } + + function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); + } + + function array(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); + } + + function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function (t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; + } + + function date(a, b) { + var d = new Date; + return a = +a, b = +b, function (t) { + return d.setTime(a * (1 - t) + b * t), d; + }; + } + + function number(a, b) { + return a = +a, b = +b, function (t) { + return a * (1 - t) + b * t; + }; + } + + function object(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = value(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function (t) { + for (k in i) c[k] = i[k](t); + return c; + }; + } + + var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + + function zero(b) { + return function () { + return b; + }; + } + + function one(b) { + return function (t) { + return b(t) + ""; + }; + } + + function string(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: number(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function (t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); + } + + function value(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant(b) + : (t === "number" ? number + : t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb) : string) + : b instanceof d3Color.color ? rgb + : b instanceof Date ? date + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : number)(a, b); + } + + function discrete(range) { + var n = range.length; + return function (t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + function hue$1(a, b) { + var i = hue(+a, +b); + return function (t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; + } + + function round(a, b) { + return a = +a, b = +b, function (t) { + return Math.round(a * (1 - t) + b * t); + }; + } + + var degrees = 180 / Math.PI; + + var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 + }; + + function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; + } + + var cssNode, + cssRoot, + cssView, + svgNode; + + function parseCss(value) { + if (value === "none") return identity; + if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); + } + + function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); + } + + function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function (a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function (t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; + } + + var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); + var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + + var rho = Math.SQRT2, + rho2 = 2, + rho4 = 4, + epsilon2 = 1e-12; + + function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; + } + + function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; + } + + function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); + } + +// p0 = [ux0, uy0, w0] +// p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function (t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function (t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; + } + + function hsl(hue) { + return function (start, end) { + var h = hue((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hsl$1 = hsl(hue); + var hslLong = hsl(nogamma); + + function lab(start, end) { + var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + function hcl(hue) { + return function (start, end) { + var h = hue((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hcl$1 = hcl(hue); + var hclLong = hcl(nogamma); + + function cubehelix(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix(start, end) { + var h = hue((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix.gamma = cubehelixGamma; + + return cubehelix; + })(1); + } + + var cubehelix$1 = cubehelix(hue); + var cubehelixLong = cubehelix(nogamma); + + function piecewise(interpolate, values) { + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function (t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; + } + + function quantize(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; + } + + exports.interpolate = value; + exports.interpolateArray = array; + exports.interpolateBasis = basis$1; + exports.interpolateBasisClosed = basisClosed; + exports.interpolateCubehelix = cubehelix$1; + exports.interpolateCubehelixLong = cubehelixLong; + exports.interpolateDate = date; + exports.interpolateDiscrete = discrete; + exports.interpolateHcl = hcl$1; + exports.interpolateHclLong = hclLong; + exports.interpolateHsl = hsl$1; + exports.interpolateHslLong = hslLong; + exports.interpolateHue = hue$1; + exports.interpolateLab = lab; + exports.interpolateNumber = number; + exports.interpolateNumberArray = numberArray; + exports.interpolateObject = object; + exports.interpolateRgb = rgb; + exports.interpolateRgbBasis = rgbBasis; + exports.interpolateRgbBasisClosed = rgbBasisClosed; + exports.interpolateRound = round; + exports.interpolateString = string; + exports.interpolateTransformCss = interpolateTransformCss; + exports.interpolateTransformSvg = interpolateTransformSvg; + exports.interpolateZoom = zoom; + exports.piecewise = piecewise; + exports.quantize = quantize; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13}], + 25: [function (require, module, exports) { +// https://d3js.org/d3-path/ v1.0.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var pi = Math.PI, + tau = 2 * pi, + epsilon = 1e-6, + tauEpsilon = tau - epsilon; + + function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + + function path() { + return new Path; + } + + Path.prototype = path.prototype = { + constructor: Path, + moveTo: function (x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function () { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function (x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function (x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function (x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function (x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon)) ; + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function (x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau + tau; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function (x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function () { + return this._; + } + }; + + exports.path = path; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 26: [function (require, module, exports) { +// https://d3js.org/d3-polygon/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function area(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; + } + + function centroid(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; + } + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. + function cross(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + } + + function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. + function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1], + size = 2; + + for (var i = 2; i < n; ++i) { + while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points + } + + function hull(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; + } + + function contains(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; + } + + function length(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.sqrt(xa * xa + ya * ya); + } + + return perimeter; + } + + exports.polygonArea = area; + exports.polygonCentroid = centroid; + exports.polygonContains = contains; + exports.polygonHull = hull; + exports.polygonLength = length; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 27: [function (require, module, exports) { +// https://d3js.org/d3-quadtree/ v1.0.7 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function tree_add(d) { + var x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); + } + + function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; + } + + function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; + } + + function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: + x1 = x0 + z, y1 = y0 + z; + break; + case 1: + x0 = x1 - z, y1 = y0 + z; + break; + case 2: + x1 = x0 + z, y0 = y1 - z; + break; + case 3: + x0 = x1 - z, y0 = y1 - z; + break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; + } + + function tree_data() { + var data = []; + this.visit(function (node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; + } + + function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; + } + + function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; + } + + function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; + } + + function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; + } + + function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; + } + + function tree_root() { + return this._root; + } + + function tree_size() { + var size = 0; + this.visit(function (node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; + } + + function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; + } + + function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; + } + + function defaultX(d) { + return d[0]; + } + + function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; + } + + function defaultY(d) { + return d[1]; + } + + function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; + } + + function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); + } + + function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; + } + + function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; + } + + var treeProto = quadtree.prototype = Quadtree.prototype; + + treeProto.copy = function () { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; + }; + + treeProto.add = tree_add; + treeProto.addAll = addAll; + treeProto.cover = tree_cover; + treeProto.data = tree_data; + treeProto.extent = tree_extent; + treeProto.find = tree_find; + treeProto.remove = tree_remove; + treeProto.removeAll = removeAll; + treeProto.root = tree_root; + treeProto.size = tree_size; + treeProto.visit = tree_visit; + treeProto.visitAfter = tree_visitAfter; + treeProto.x = tree_x; + treeProto.y = tree_y; + + exports.quadtree = quadtree; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 28: [function (require, module, exports) { +// https://d3js.org/d3-random/ v1.1.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function defaultSource() { + return Math.random(); + } + + var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function () { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; + })(defaultSource); + + var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function () { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; + })(defaultSource); + + var logNormal = (function sourceRandomLogNormal(source) { + function randomLogNormal() { + var randomNormal = normal.source(source).apply(this, arguments); + return function () { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; + })(defaultSource); + + var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + return function () { + for (var sum = 0, i = 0; i < n; ++i) sum += source(); + return sum; + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; + })(defaultSource); + + var bates = (function sourceRandomBates(source) { + function randomBates(n) { + var randomIrwinHall = irwinHall.source(source)(n); + return function () { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; + })(defaultSource); + + var exponential = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function () { + return -Math.log(1 - source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; + })(defaultSource); + + exports.randomUniform = uniform; + exports.randomNormal = normal; + exports.randomLogNormal = logNormal; + exports.randomBates = bates; + exports.randomIrwinHall = irwinHall; + exports.randomExponential = exponential; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 29: [function (require, module, exports) { +// https://d3js.org/d3-scale-chromatic/ v1.5.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-interpolate'), require('d3-color')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-interpolate', 'd3-color'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); + }(this, function (exports, d3Interpolate, d3Color) { + 'use strict'; + + function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; + } + + var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + + var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + + var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + + var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + + var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + + var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + + var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + + var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + + var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + + var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + + function ramp(scheme) { + return d3Interpolate.interpolateRgbBasis(scheme[scheme.length - 1]); + } + + var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" + ).map(colors); + + var BrBG = ramp(scheme); + + var scheme$1 = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" + ).map(colors); + + var PRGn = ramp(scheme$1); + + var scheme$2 = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" + ).map(colors); + + var PiYG = ramp(scheme$2); + + var scheme$3 = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" + ).map(colors); + + var PuOr = ramp(scheme$3); + + var scheme$4 = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" + ).map(colors); + + var RdBu = ramp(scheme$4); + + var scheme$5 = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" + ).map(colors); + + var RdGy = ramp(scheme$5); + + var scheme$6 = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" + ).map(colors); + + var RdYlBu = ramp(scheme$6); + + var scheme$7 = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" + ).map(colors); + + var RdYlGn = ramp(scheme$7); + + var scheme$8 = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" + ).map(colors); + + var Spectral = ramp(scheme$8); + + var scheme$9 = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" + ).map(colors); + + var BuGn = ramp(scheme$9); + + var scheme$a = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" + ).map(colors); + + var BuPu = ramp(scheme$a); + + var scheme$b = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" + ).map(colors); + + var GnBu = ramp(scheme$b); + + var scheme$c = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" + ).map(colors); + + var OrRd = ramp(scheme$c); + + var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" + ).map(colors); + + var PuBuGn = ramp(scheme$d); + + var scheme$e = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" + ).map(colors); + + var PuBu = ramp(scheme$e); + + var scheme$f = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" + ).map(colors); + + var PuRd = ramp(scheme$f); + + var scheme$g = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" + ).map(colors); + + var RdPu = ramp(scheme$g); + + var scheme$h = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" + ).map(colors); + + var YlGnBu = ramp(scheme$h); + + var scheme$i = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" + ).map(colors); + + var YlGn = ramp(scheme$i); + + var scheme$j = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" + ).map(colors); + + var YlOrBr = ramp(scheme$j); + + var scheme$k = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" + ).map(colors); + + var YlOrRd = ramp(scheme$k); + + var scheme$l = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" + ).map(colors); + + var Blues = ramp(scheme$l); + + var scheme$m = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" + ).map(colors); + + var Greens = ramp(scheme$m); + + var scheme$n = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" + ).map(colors); + + var Greys = ramp(scheme$n); + + var scheme$o = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" + ).map(colors); + + var Purples = ramp(scheme$o); + + var scheme$p = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" + ).map(colors); + + var Reds = ramp(scheme$p); + + var scheme$q = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" + ).map(colors); + + var Oranges = ramp(scheme$q); + + function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; + } + + var cubehelix = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); + + var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + + var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + + var c = d3Color.cubehelix(); + + function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; + } + + var c$1 = d3Color.rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + + function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; + } + + function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; + } + + function ramp$1(range) { + var n = range.length; + return function (t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + + var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + + var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + + var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + + exports.interpolateBlues = Blues; + exports.interpolateBrBG = BrBG; + exports.interpolateBuGn = BuGn; + exports.interpolateBuPu = BuPu; + exports.interpolateCividis = cividis; + exports.interpolateCool = cool; + exports.interpolateCubehelixDefault = cubehelix; + exports.interpolateGnBu = GnBu; + exports.interpolateGreens = Greens; + exports.interpolateGreys = Greys; + exports.interpolateInferno = inferno; + exports.interpolateMagma = magma; + exports.interpolateOrRd = OrRd; + exports.interpolateOranges = Oranges; + exports.interpolatePRGn = PRGn; + exports.interpolatePiYG = PiYG; + exports.interpolatePlasma = plasma; + exports.interpolatePuBu = PuBu; + exports.interpolatePuBuGn = PuBuGn; + exports.interpolatePuOr = PuOr; + exports.interpolatePuRd = PuRd; + exports.interpolatePurples = Purples; + exports.interpolateRainbow = rainbow; + exports.interpolateRdBu = RdBu; + exports.interpolateRdGy = RdGy; + exports.interpolateRdPu = RdPu; + exports.interpolateRdYlBu = RdYlBu; + exports.interpolateRdYlGn = RdYlGn; + exports.interpolateReds = Reds; + exports.interpolateSinebow = sinebow; + exports.interpolateSpectral = Spectral; + exports.interpolateTurbo = turbo; + exports.interpolateViridis = viridis; + exports.interpolateWarm = warm; + exports.interpolateYlGn = YlGn; + exports.interpolateYlGnBu = YlGnBu; + exports.interpolateYlOrBr = YlOrBr; + exports.interpolateYlOrRd = YlOrRd; + exports.schemeAccent = Accent; + exports.schemeBlues = scheme$l; + exports.schemeBrBG = scheme; + exports.schemeBuGn = scheme$9; + exports.schemeBuPu = scheme$a; + exports.schemeCategory10 = category10; + exports.schemeDark2 = Dark2; + exports.schemeGnBu = scheme$b; + exports.schemeGreens = scheme$m; + exports.schemeGreys = scheme$n; + exports.schemeOrRd = scheme$c; + exports.schemeOranges = scheme$q; + exports.schemePRGn = scheme$1; + exports.schemePaired = Paired; + exports.schemePastel1 = Pastel1; + exports.schemePastel2 = Pastel2; + exports.schemePiYG = scheme$2; + exports.schemePuBu = scheme$e; + exports.schemePuBuGn = scheme$d; + exports.schemePuOr = scheme$3; + exports.schemePuRd = scheme$f; + exports.schemePurples = scheme$o; + exports.schemeRdBu = scheme$4; + exports.schemeRdGy = scheme$5; + exports.schemeRdPu = scheme$g; + exports.schemeRdYlBu = scheme$6; + exports.schemeRdYlGn = scheme$7; + exports.schemeReds = scheme$p; + exports.schemeSet1 = Set1; + exports.schemeSet2 = Set2; + exports.schemeSet3 = Set3; + exports.schemeSpectral = scheme$8; + exports.schemeTableau10 = Tableau10; + exports.schemeYlGn = scheme$i; + exports.schemeYlGnBu = scheme$h; + exports.schemeYlOrBr = scheme$j; + exports.schemeYlOrRd = scheme$k; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13, "d3-interpolate": 24}], + 30: [function (require, module, exports) { +// https://d3js.org/d3-scale/ v2.2.2 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-collection'), require('d3-array'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-collection', 'd3-array', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, (function (exports, d3Collection, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) { + 'use strict'; + + function initRange(domain, range) { + switch (arguments.length) { + case 0: + break; + case 1: + this.range(domain); + break; + default: + this.range(range).domain(domain); + break; + } + return this; + } + + function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: + break; + case 1: + this.interpolator(domain); + break; + default: + this.interpolator(interpolator).domain(domain); + break; + } + return this; + } + + var array = Array.prototype; + + var map = array.map; + var slice = array.slice; + + var implicit = {name: "implicit"}; + + function ordinal() { + var index = d3Collection.map(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = [], index = d3Collection.map(); + var i = -1, n = _.length, d, key; + while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), scale) : range.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range[1] < range[0], + start = range[reverse - 0], + stop = range[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = d3Array.range(n).map(function (i) { + return start + step * i; + }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function (_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function (_) { + return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); + }; + + scale.rangeRound = function (_) { + return range = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function () { + return bandwidth; + }; + + scale.step = function () { + return step; + }; + + scale.round = function (_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function (_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function (_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function (_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function (_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function () { + return band(domain(), range) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); + } + + function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function () { + return pointish(copy()); + }; + + return scale; + } + + function point() { + return pointish(band.apply(null, arguments).paddingInner(1)); + } + + function constant(x) { + return function () { + return x; + }; + } + + function number(x) { + return +x; + } + + var unit = [0, 1]; + + function identity(x) { + return x; + } + + function normalize(a, b) { + return (b -= (a = +a)) + ? function (x) { + return (x - a) / b; + } + : constant(isNaN(b) ? NaN : 0.5); + } + + function clamper(domain) { + var a = domain[0], b = domain[domain.length - 1], t; + if (a > b) t = a, a = b, b = t; + return function (x) { + return Math.max(a, Math.min(b, x)); + }; + } + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. + function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function (x) { + return r0(d0(x)); + }; + } + + function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function (x) { + var i = d3Array.bisect(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; + } + + function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); + } + + function transformer() { + var domain = unit, + range = unit, + interpolate = d3Interpolate.interpolate, + transform, + untransform, + unknown, + clamp = identity, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function (y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y))); + }; + + scale.domain = function (_) { + return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function (_) { + return range = slice.call(_), interpolate = d3Interpolate.interpolateRound, rescale(); + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity; + }; + + scale.interpolate = function (_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t, u) { + transform = t, untransform = u; + return rescale(); + }; + } + + function continuous(transform, untransform) { + return transformer()(transform, untransform); + } + + function tickFormat(start, stop, count, specifier) { + var step = d3Array.tickStep(start, stop, count), + precision; + specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; + return d3Format.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return d3Format.format(specifier); + } + + function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function (count) { + var d = domain(); + return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function (count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function (count) { + if (count == null) count = 10; + + var d = domain(), + i0 = 0, + i1 = d.length - 1, + start = d[i0], + stop = d[i1], + step; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + step = d3Array.tickIncrement(start, stop, count); + + if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + step = d3Array.tickIncrement(start, stop, count); + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + step = d3Array.tickIncrement(start, stop, count); + } + + if (step > 0) { + d[i0] = Math.floor(start / step) * step; + d[i1] = Math.ceil(stop / step) * step; + domain(d); + } else if (step < 0) { + d[i0] = Math.ceil(start * step) / step; + d[i1] = Math.floor(stop * step) / step; + domain(d); + } + + return scale; + }; + + return scale; + } + + function linear() { + var scale = continuous(identity, identity); + + scale.copy = function () { + return copy(scale, linear()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); + } + + function identity$1(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function (_) { + return arguments.length ? (domain = map.call(_, number), scale) : domain.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return identity$1(domain).unknown(unknown); + }; + + domain = arguments.length ? map.call(domain, number) : [0, 1]; + + return linearish(scale); + } + + function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; + } + + function transformLog(x) { + return Math.log(x); + } + + function transformExp(x) { + return Math.exp(x); + } + + function transformLogn(x) { + return -Math.log(-x); + } + + function transformExpn(x) { + return -Math.exp(-x); + } + + function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; + } + + function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function (x) { + return Math.pow(base, x); + }; + } + + function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function (x) { + return Math.log(x) / base; + }); + } + + function reflect(f) { + return function (x) { + return -f(-x); + }; + } + + function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function (_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function (_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function (count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + } else { + z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function (count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = d3Format.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function (d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function () { + return domain(nice(domain(), { + floor: function (x) { + return pows(Math.floor(logs(x))); + }, + ceil: function (x) { + return pows(Math.ceil(logs(x))); + } + })); + }; + + return scale; + } + + function log() { + var scale = loggish(transformer()).domain([1, 10]); + + scale.copy = function () { + return copy(scale, log()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function transformSymlog(c) { + return function (x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; + } + + function transformSymexp(c) { + return function (x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; + } + + function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function (_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); + } + + function symlog() { + var scale = symlogish(transformer()); + + scale.copy = function () { + return copy(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); + } + + function transformPow(exponent) { + return function (x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; + } + + function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); + } + + function transformSquare(x) { + return x < 0 ? -x * x : x * x; + } + + function powish(transform) { + var scale = transform(identity, identity), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity, identity) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function (_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); + } + + function pow() { + var scale = powish(transformer()); + + scale.copy = function () { + return copy(scale, pow()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function sqrt() { + return pow.apply(null, arguments).exponent(0.5); + } + + function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)]; + } + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return rescale(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function () { + return thresholds.slice(); + }; + + scale.copy = function () { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); + } + + function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function (_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function (_) { + return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function () { + return domain.slice(); + }; + + scale.copy = function () { + return quantize() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); + } + + function threshold() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; + } + + scale.domain = function (_) { + return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return threshold() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); + } + + var durationSecond = 1000, + durationMinute = durationSecond * 60, + durationHour = durationMinute * 60, + durationDay = durationHour * 24, + durationWeek = durationDay * 7, + durationMonth = durationDay * 30, + durationYear = durationDay * 365; + + function date(t) { + return new Date(t); + } + + function number$1(t) { + return t instanceof Date ? +t : +new Date(+t); + } + + function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(identity, identity), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [hour, 1, durationHour], + [hour, 3, 3 * durationHour], + [hour, 6, 6 * durationHour], + [hour, 12, 12 * durationHour], + [day, 1, durationDay], + [day, 2, 2 * durationDay], + [week, 1, durationWeek], + [month, 1, durationMonth], + [month, 3, 3 * durationMonth], + [year, 1, durationYear] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = d3Array.bisector(function (i) { + return i[2]; + }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = d3Array.tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(d3Array.tickStep(start, stop, interval), 1); + interval = millisecond; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function (y) { + return new Date(invert(y)); + }; + + scale.domain = function (_) { + return arguments.length ? domain(map.call(_, number$1)) : domain().map(date); + }; + + scale.ticks = function (interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function (count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function (interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function () { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; + } + + function time() { + return initRange.apply(calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); + } + + function utcTime() { + return initRange.apply(calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); + } + + function transformer$1() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function (_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; + } + + function copy$1(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); + } + + function sequential() { + var scale = linearish(transformer$1()(identity)); + + scale.copy = function () { + return copy$1(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialLog() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function () { + return copy$1(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialSymlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function () { + return copy$1(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialPow() { + var scale = powish(transformer$1()); + + scale.copy = function () { + return copy$1(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); + } + + function sequentialQuantile() { + var domain = [], + interpolator = identity; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x) - 1) / (domain.length - 1)); + } + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return scale; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function () { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); + } + + function transformer$2() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function (_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2]; + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1); + return scale; + }; + } + + function diverging() { + var scale = linearish(transformer$2()(identity)); + + scale.copy = function () { + return copy$1(scale, diverging()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingLog() { + var scale = loggish(transformer$2()).domain([0.1, 1, 10]); + + scale.copy = function () { + return copy$1(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingSymlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function () { + return copy$1(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingPow() { + var scale = powish(transformer$2()); + + scale.copy = function () { + return copy$1(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); + } + + exports.scaleBand = band; + exports.scalePoint = point; + exports.scaleIdentity = identity$1; + exports.scaleLinear = linear; + exports.scaleLog = log; + exports.scaleSymlog = symlog; + exports.scaleOrdinal = ordinal; + exports.scaleImplicit = implicit; + exports.scalePow = pow; + exports.scaleSqrt = sqrt; + exports.scaleQuantile = quantile; + exports.scaleQuantize = quantize; + exports.scaleThreshold = threshold; + exports.scaleTime = time; + exports.scaleUtc = utcTime; + exports.scaleSequential = sequential; + exports.scaleSequentialLog = sequentialLog; + exports.scaleSequentialPow = sequentialPow; + exports.scaleSequentialSqrt = sequentialSqrt; + exports.scaleSequentialSymlog = sequentialSymlog; + exports.scaleSequentialQuantile = sequentialQuantile; + exports.scaleDiverging = diverging; + exports.scaleDivergingLog = divergingLog; + exports.scaleDivergingPow = divergingPow; + exports.scaleDivergingSqrt = divergingSqrt; + exports.scaleDivergingSymlog = divergingSymlog; + exports.tickFormat = tickFormat; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, { + "d3-array": 8, + "d3-collection": 12, + "d3-format": 21, + "d3-interpolate": 24, + "d3-time": 34, + "d3-time-format": 33 + }], + 31: [function (require, module, exports) { +// https://d3js.org/d3-selection/ v1.4.1 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var xhtml = "http://www.w3.org/1999/xhtml"; + + var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + + function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + } + + function creatorInherit(name) { + return function () { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function () { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; + } + + function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); + } + + function none() { + } + + function selector(selector) { + return selector == null ? none : function () { + return this.querySelector(selector); + }; + } + + function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); + } + + function empty() { + return []; + } + + function selectorAll(selector) { + return selector == null ? empty : function () { + return this.querySelectorAll(selector); + }; + } + + function selection_selectAll(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); + } + + function matcher(selector) { + return function () { + return this.matches(selector); + }; + } + + function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); + } + + function sparse(update) { + return new Array(update.length); + } + + function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); + } + + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; + } + + EnterNode.prototype = { + constructor: EnterNode, + appendChild: function (child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function (child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function (selector) { + return this._parent.querySelector(selector); + }, + querySelectorAll: function (selector) { + return this._parent.querySelectorAll(selector); + } + }; + + function constant(x) { + return function () { + return x; + }; + } + + var keyPrefix = "$"; // Protect against keys like “__proto__”. + + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } + } + + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } + } + + function selection_data(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function (d) { + data[++j] = d; + }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength) ; + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; + } + + function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); + } + + function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; + } + + function selection_merge(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); + } + + function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; + } + + function selection_sort(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); + } + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; + } + + function selection_nodes() { + var nodes = new Array(this.size()), i = -1; + this.each(function () { + nodes[++i] = this; + }); + return nodes; + } + + function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; + } + + function selection_size() { + var size = 0; + this.each(function () { + ++size; + }); + return size; + } + + function selection_empty() { + return !this.node(); + } + + function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; + } + + function attrRemove(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, value) { + return function () { + this.setAttribute(name, value); + }; + } + + function attrConstantNS(fullname, value) { + return function () { + this.setAttributeNS(fullname.space, fullname.local, value); + }; + } + + function attrFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; + } + + function attrFunctionNS(fullname, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; + } + + function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); + } + + function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document + } + + function styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, value, priority) { + return function () { + this.style.setProperty(name, value, priority); + }; + } + + function styleFunction(name, value, priority) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; + } + + function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); + } + + function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); + } + + function propertyRemove(name) { + return function () { + delete this[name]; + }; + } + + function propertyConstant(name, value) { + return function () { + this[name] = value; + }; + } + + function propertyFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; + } + + function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; + } + + function classArray(string) { + return string.trim().split(/^|\s+/); + } + + function classList(node) { + return node.classList || new ClassList(node); + } + + function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); + } + + ClassList.prototype = { + add: function (name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function (name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function (name) { + return this._names.indexOf(name) >= 0; + } + }; + + function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); + } + + function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); + } + + function classedTrue(names) { + return function () { + classedAdd(this, names); + }; + } + + function classedFalse(names) { + return function () { + classedRemove(this, names); + }; + } + + function classedFunction(names, value) { + return function () { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; + } + + function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); + } + + function textRemove() { + this.textContent = ""; + } + + function textConstant(value) { + return function () { + this.textContent = value; + }; + } + + function textFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; + } + + function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; + } + + function htmlRemove() { + this.innerHTML = ""; + } + + function htmlConstant(value) { + return function () { + this.innerHTML = value; + }; + } + + function htmlFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; + } + + function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; + } + + function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); + } + + function selection_raise() { + return this.each(raise); + } + + function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); + } + + function selection_lower() { + return this.each(lower); + } + + function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function () { + return this.appendChild(create.apply(this, arguments)); + }); + } + + function constantNull() { + return null; + } + + function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function () { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); + } + + function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + + function selection_remove() { + return this.each(remove); + } + + function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); + } + + function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; + } + + var filterEvents = {}; + + exports.event = null; + + if (typeof document !== "undefined") { + var element = document.documentElement; + if (!("onmouseenter" in element)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } + } + + function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function (event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; + } + + function contextListener(listener, index, group) { + return function (event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; + } + + function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); + } + + function onRemove(typename) { + return function () { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; + } + + function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function (d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; + } + + function selection_on(typename, value, capture) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; + } + + function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } + } + + function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); + } + + function dispatchConstant(type, params) { + return function () { + return dispatchEvent(this, type, params); + }; + } + + function dispatchFunction(type, params) { + return function () { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; + } + + function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); + } + + var root = [null]; + + function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; + } + + function selection() { + return new Selection([[document.documentElement]], root); + } + + Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch + }; + + function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); + } + + function create(name) { + return select(creator(name).call(document.documentElement)); + } + + var nextId = 0; + + function local() { + return new Local; + } + + function Local() { + this._ = "@" + (++nextId).toString(36); + } + + Local.prototype = local.prototype = { + constructor: Local, + get: function (node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function (node, value) { + return node[this._] = value; + }, + remove: function (node) { + return this._ in node && delete node[this._]; + }, + toString: function () { + return this._; + } + }; + + function sourceEvent() { + var current = exports.event, source; + while (source = current.sourceEvent) current = source; + return current; + } + + function point(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + + function mouse(node) { + var event = sourceEvent(); + if (event.changedTouches) event = event.changedTouches[0]; + return point(node, event); + } + + function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); + } + + function touch(node, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point(node, touch); + } + } + + return null; + } + + function touches(node, touches) { + if (touches == null) touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point(node, touches[i]); + } + + return points; + } + + exports.clientPoint = point; + exports.create = create; + exports.creator = creator; + exports.customEvent = customEvent; + exports.local = local; + exports.matcher = matcher; + exports.mouse = mouse; + exports.namespace = namespace; + exports.namespaces = namespaces; + exports.select = select; + exports.selectAll = selectAll; + exports.selection = selection; + exports.selector = selector; + exports.selectorAll = selectorAll; + exports.style = styleValue; + exports.touch = touch; + exports.touches = touches; + exports.window = defaultView; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 32: [function (require, module, exports) { +// https://d3js.org/d3-shape/ v1.3.7 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-path')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Path) { + 'use strict'; + + function constant(x) { + return function constant() { + return x; + }; + } + + var abs = Math.abs; + var atan2 = Math.atan2; + var cos = Math.cos; + var max = Math.max; + var min = Math.min; + var sin = Math.sin; + var sqrt = Math.sqrt; + + var epsilon = 1e-12; + var pi = Math.PI; + var halfPi = pi / 2; + var tau = 2 * pi; + + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); + } + + function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); + } + + function arcInnerRadius(d) { + return d.innerRadius; + } + + function arcOuterRadius(d) { + return d.outerRadius; + } + + function arcStartAngle(d) { + return d.startAngle; + } + + function arcEndAngle(d) { + return d.endAngle; + } + + function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! + } + + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; + } + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html + function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; + } + + function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi, + a1 = endAngle.apply(this, arguments) - halfPi, + da = abs(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = d3Path.path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); + + // Apply rounded corners? + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function () { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; + }; + + arc.innerRadius = function (_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; + }; + + arc.outerRadius = function (_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function (_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; + }; + + arc.padRadius = function (_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; + }; + + arc.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; + }; + + arc.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; + }; + + arc.padAngle = function (_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; + }; + + arc.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; + } + + function Linear(context) { + this._context = context; + } + + Linear.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; // proceed + default: + this._context.lineTo(x, y); + break; + } + } + }; + + function curveLinear(context) { + return new Linear(context); + } + + function x(p) { + return p[0]; + } + + function y(p) { + return p[1]; + } + + function line() { + var x$1 = x, + y$1 = y, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + function line(data) { + var i, + n = data.length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = d3Path.path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function (_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), line) : x$1; + }; + + line.y = function (_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), line) : y$1; + }; + + line.defined = function (_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), line) : defined; + }; + + line.curve = function (_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function (_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; + } + + function area() { + var x0 = x, + x1 = null, + y0 = constant(0), + y1 = y, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + function area(data) { + var i, + j, + k, + n = data.length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = d3Path.path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function (_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), x1 = null, area) : x0; + }; + + area.x0 = function (_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), area) : x0; + }; + + area.x1 = function (_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : x1; + }; + + area.y = function (_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), y1 = null, area) : y0; + }; + + area.y0 = function (_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), area) : y0; + }; + + area.y1 = function (_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function () { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function () { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function () { + return arealine().x(x1).y(y0); + }; + + area.defined = function (_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), area) : defined; + }; + + area.curve = function (_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function (_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; + } + + function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } + + function identity(d) { + return d; + } + + function pie() { + var value = identity, + sortValues = descending, + sort = null, + startAngle = constant(0), + endAngle = constant(tau), + padAngle = constant(0); + + function pie(data) { + var i, + n = data.length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function (i, j) { + return sortValues(arcs[i], arcs[j]); + }); + else if (sort != null) index.sort(function (i, j) { + return sort(data[i], data[j]); + }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), pie) : value; + }; + + pie.sortValues = function (_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function (_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), pie) : startAngle; + }; + + pie.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), pie) : endAngle; + }; + + pie.padAngle = function (_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), pie) : padAngle; + }; + + return pie; + } + + var curveRadialLinear = curveRadial(curveLinear); + + function Radial(curve) { + this._curve = curve; + } + + Radial.prototype = { + areaStart: function () { + this._curve.areaStart(); + }, + areaEnd: function () { + this._curve.areaEnd(); + }, + lineStart: function () { + this._curve.lineStart(); + }, + lineEnd: function () { + this._curve.lineEnd(); + }, + point: function (a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } + }; + + function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; + } + + function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function (_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; + } + + function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); + } + + function areaRadial() { + var a = area().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function () { + return lineRadial(x0()); + }, delete a.lineX0; + a.lineEndAngle = function () { + return lineRadial(x1()); + }, delete a.lineX1; + a.lineInnerRadius = function () { + return lineRadial(y0()); + }, delete a.lineY0; + a.lineOuterRadius = function () { + return lineRadial(y1()); + }, delete a.lineY1; + + a.curve = function (_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; + } + + function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; + } + + var slice = Array.prototype.slice; + + function linkSource(d) { + return d.source; + } + + function linkTarget(d) { + return d.target; + } + + function link(curve) { + var source = linkSource, + target = linkTarget, + x$1 = x, + y$1 = y, + context = null; + + function link() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), + t = target.apply(this, argv); + if (!context) context = buffer = d3Path.path(); + curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function (_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function (_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function (_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), link) : x$1; + }; + + link.y = function (_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), link) : y$1; + }; + + link.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; + } + + function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); + } + + function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); + } + + function curveRadial$1(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); + } + + function linkHorizontal() { + return link(curveHorizontal); + } + + function linkVertical() { + return link(curveVertical); + } + + function linkRadial() { + var l = link(curveRadial$1); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; + } + + var circle = { + draw: function (context, size) { + var r = Math.sqrt(size / pi); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau); + } + }; + + var cross = { + draw: function (context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } + }; + + var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + + var diamond = { + draw: function (context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } + }; + + var ka = 0.89081309152928522810, + kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), + kx = Math.sin(tau / 10) * kr, + ky = -Math.cos(tau / 10) * kr; + + var star = { + draw: function (context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } + }; + + var square = { + draw: function (context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } + }; + + var sqrt3 = Math.sqrt(3); + + var triangle = { + draw: function (context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } + }; + + var c = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + + var wye = { + draw: function (context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); + } + }; + + var symbols = [ + circle, + cross, + diamond, + square, + star, + triangle, + wye + ]; + + function symbol() { + var type = constant(circle), + size = constant(64), + context = null; + + function symbol() { + var buffer; + if (!context) context = buffer = d3Path.path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function (_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant(_), symbol) : type; + }; + + symbol.size = function (_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant(+_), symbol) : size; + }; + + symbol.context = function (_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; + } + + function noop() { + } + + function point(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); + } + + function Basis(context) { + this._context = context; + } + + Basis.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 3: + point(this, this._x1, this._y1); // proceed + case 2: + this._context.lineTo(this._x1, this._y1); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basis(context) { + return new Basis(context); + } + + function BasisClosed(context) { + this._context = context; + } + + BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._x2 = x, this._y2 = y; + break; + case 1: + this._point = 2; + this._x3 = x, this._y3 = y; + break; + case 2: + this._point = 3; + this._x4 = x, this._y4 = y; + this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); + break; + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basisClosed(context) { + return new BasisClosed(context); + } + + function BasisOpen(context) { + this._context = context; + } + + BasisOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; + this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); + break; + case 3: + this._point = 4; // proceed + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basisOpen(context) { + return new BasisOpen(context); + } + + function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; + } + + Bundle.prototype = { + lineStart: function () { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function () { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function (x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + + var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function (beta) { + return custom(+beta); + }; + + return bundle; + })(0.85); + + function point$1(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); + } + + function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + Cardinal.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x2, this._y2); + break; + case 3: + point$1(this, this._x1, this._y1); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + this._x1 = x, this._y1 = y; + break; + case 2: + this._point = 3; // proceed + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._x3 = x, this._y3 = y; + break; + case 1: + this._point = 2; + this._context.moveTo(this._x4 = x, this._y4 = y); + break; + case 2: + this._point = 3; + this._x5 = x, this._y5 = y; + break; + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); + break; + case 3: + this._point = 4; // proceed + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function point$2(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); + } + + function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRom.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x2, this._y2); + break; + case 3: + this.point(this._x2, this._y2); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; // proceed + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + this._x3 = x, this._y3 = y; + break; + case 1: + this._point = 2; + this._context.moveTo(this._x4 = x, this._y4 = y); + break; + case 2: + this._point = 3; + this._x5 = x, this._y5 = y; + break; + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); + break; + case 3: + this._point = 4; // proceed + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function LinearClosed(context) { + this._context = context; + } + + LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._point) this._context.closePath(); + }, + point: function (x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } + }; + + function linearClosed(context) { + return new LinearClosed(context); + } + + function sign(x) { + return x < 0 ? -1 : 1; + } + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. + function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; + } + +// Calculate a one-sided slope. + function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; + } + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". + function point$3(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); + } + + function MonotoneX(context) { + this._context = context; + } + + MonotoneX.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x1, this._y1); + break; + case 3: + point$3(this, this._t0, slope2(this, this._t0)); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); + break; + default: + point$3(this, this._t0, t1 = slope3(this, x, y)); + break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } + }; + + function MonotoneY(context) { + this._context = new ReflectContext(context); + } + + (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function (x, y) { + MonotoneX.prototype.point.call(this, y, x); + }; + + function ReflectContext(context) { + this._context = context; + } + + ReflectContext.prototype = { + moveTo: function (x, y) { + this._context.moveTo(y, x); + }, + closePath: function () { + this._context.closePath(); + }, + lineTo: function (x, y) { + this._context.lineTo(y, x); + }, + bezierCurveTo: function (x1, y1, x2, y2, x, y) { + this._context.bezierCurveTo(y1, x1, y2, x2, y, x); + } + }; + + function monotoneX(context) { + return new MonotoneX(context); + } + + function monotoneY(context) { + return new MonotoneY(context); + } + + function Natural(context) { + this._context = context; + } + + Natural.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x = []; + this._y = []; + }, + lineEnd: function () { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function (x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. + function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; + } + + function natural(context) { + return new Natural(context); + } + + function Step(context, t) { + this._context = context; + this._t = t; + } + + Step.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function () { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } + }; + + function step(context) { + return new Step(context, 0.5); + } + + function stepBefore(context) { + return new Step(context, 0); + } + + function stepAfter(context) { + return new Step(context, 1); + } + + function none(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } + } + + function none$1(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; + } + + function stackValue(d, key) { + return d[key]; + } + + function stack() { + var keys = constant([]), + order = none$1, + offset = none, + value = stackValue; + + function stack(data) { + var kz = keys.apply(this, arguments), + i, + m = data.length, + n = kz.length, + sz = new Array(n), + oz; + + for (i = 0; i < n; ++i) { + for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { + si[j] = sij = [0, +value(data[j], ki, j, data)]; + sij.data = data[j]; + } + si.key = ki; + } + + for (i = 0, oz = order(sz); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function (_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant(slice.call(_)), stack) : keys; + }; + + stack.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), stack) : value; + }; + + stack.order = function (_) { + return arguments.length ? (order = _ == null ? none$1 : typeof _ === "function" ? _ : constant(slice.call(_)), stack) : order; + }; + + stack.offset = function (_) { + return arguments.length ? (offset = _ == null ? none : _, stack) : offset; + }; + + return stack; + } + + function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none(series, order); + } + + function diverging(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } + } + + function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none(series, order); + } + + function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none(series, order); + } + + function appearance(series) { + var peaks = series.map(peak); + return none$1(series).sort(function (a, b) { + return peaks[a] - peaks[b]; + }); + } + + function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; + } + + function ascending(series) { + var sums = series.map(sum); + return none$1(series).sort(function (a, b) { + return sums[a] - sums[b]; + }); + } + + function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; + } + + function descending$1(series) { + return ascending(series).reverse(); + } + + function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); + } + + function reverse(series) { + return none$1(series).reverse(); + } + + exports.arc = arc; + exports.area = area; + exports.areaRadial = areaRadial; + exports.curveBasis = basis; + exports.curveBasisClosed = basisClosed; + exports.curveBasisOpen = basisOpen; + exports.curveBundle = bundle; + exports.curveCardinal = cardinal; + exports.curveCardinalClosed = cardinalClosed; + exports.curveCardinalOpen = cardinalOpen; + exports.curveCatmullRom = catmullRom; + exports.curveCatmullRomClosed = catmullRomClosed; + exports.curveCatmullRomOpen = catmullRomOpen; + exports.curveLinear = curveLinear; + exports.curveLinearClosed = linearClosed; + exports.curveMonotoneX = monotoneX; + exports.curveMonotoneY = monotoneY; + exports.curveNatural = natural; + exports.curveStep = step; + exports.curveStepAfter = stepAfter; + exports.curveStepBefore = stepBefore; + exports.line = line; + exports.lineRadial = lineRadial$1; + exports.linkHorizontal = linkHorizontal; + exports.linkRadial = linkRadial; + exports.linkVertical = linkVertical; + exports.pie = pie; + exports.pointRadial = pointRadial; + exports.radialArea = areaRadial; + exports.radialLine = lineRadial$1; + exports.stack = stack; + exports.stackOffsetDiverging = diverging; + exports.stackOffsetExpand = expand; + exports.stackOffsetNone = none; + exports.stackOffsetSilhouette = silhouette; + exports.stackOffsetWiggle = wiggle; + exports.stackOrderAppearance = appearance; + exports.stackOrderAscending = ascending; + exports.stackOrderDescending = descending$1; + exports.stackOrderInsideOut = insideOut; + exports.stackOrderNone = none$1; + exports.stackOrderReverse = reverse; + exports.symbol = symbol; + exports.symbolCircle = circle; + exports.symbolCross = cross; + exports.symbolDiamond = diamond; + exports.symbolSquare = square; + exports.symbolStar = star; + exports.symbolTriangle = triangle; + exports.symbolWye = wye; + exports.symbols = symbols; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-path": 25}], + 33: [function (require, module, exports) { +// https://d3js.org/d3-time-format/ v2.2.3 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Time) { + 'use strict'; + + function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); + } + + function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); + } + + function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; + } + + function formatLocale(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function (date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, Z) { + return function (string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); + week = day > 4 || day === 0 ? d3Time.utcMonday.ceil(week) : d3Time.utcMonday(week); + week = d3Time.utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); + week = day > 4 || day === 0 ? d3Time.timeMonday.ceil(week) : d3Time.timeMonday(week); + week = d3Time.timeDay.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return localDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function (specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function () { + return specifier; + }; + return f; + }, + parse: function (specifier) { + var p = newParse(specifier += "", false); + p.toString = function () { + return specifier; + }; + return p; + }, + utcFormat: function (specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function () { + return specifier; + }; + return f; + }, + utcParse: function (specifier) { + var p = newParse(specifier += "", true); + p.toString = function () { + return specifier; + }; + return p; + } + }; + } + + var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + + function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + + function requote(s) { + return s.replace(requoteRe, "\\$&"); + } + + function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); + } + + function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) map[names[i].toLowerCase()] = i; + return map; + } + + function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; + } + + function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; + } + + function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; + } + + function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; + } + + function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; + } + + function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; + } + + function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; + } + + function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; + } + + function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; + } + + function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; + } + + function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; + } + + function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; + } + + function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; + } + + function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; + } + + function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; + } + + function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; + } + + function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; + } + + function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); + } + + function formatHour24(d, p) { + return pad(d.getHours(), p, 2); + } + + function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); + } + + function formatDayOfYear(d, p) { + return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); + } + + function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); + } + + function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; + } + + function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); + } + + function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); + } + + function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); + } + + function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; + } + + function formatWeekNumberSunday(d, p) { + return pad(d3Time.timeSunday.count(d3Time.timeYear(d) - 1, d), p, 2); + } + + function formatWeekNumberISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); + return pad(d3Time.timeThursday.count(d3Time.timeYear(d), d) + (d3Time.timeYear(d).getDay() === 4), p, 2); + } + + function formatWeekdayNumberSunday(d) { + return d.getDay(); + } + + function formatWeekNumberMonday(d, p) { + return pad(d3Time.timeMonday.count(d3Time.timeYear(d) - 1, d), p, 2); + } + + function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); + } + + function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); + } + + function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); + } + + function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); + } + + function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); + } + + function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); + } + + function formatUTCDayOfYear(d, p) { + return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); + } + + function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); + } + + function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; + } + + function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); + } + + function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); + } + + function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); + } + + function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; + } + + function formatUTCWeekNumberSunday(d, p) { + return pad(d3Time.utcSunday.count(d3Time.utcYear(d) - 1, d), p, 2); + } + + function formatUTCWeekNumberISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); + return pad(d3Time.utcThursday.count(d3Time.utcYear(d), d) + (d3Time.utcYear(d).getUTCDay() === 4), p, 2); + } + + function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); + } + + function formatUTCWeekNumberMonday(d, p) { + return pad(d3Time.utcMonday.count(d3Time.utcYear(d) - 1, d), p, 2); + } + + function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); + } + + function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); + } + + function formatUTCZone() { + return "+0000"; + } + + function formatLiteralPercent() { + return "%"; + } + + function formatUnixTimestamp(d) { + return +d; + } + + function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); + } + + var locale; + + defaultLocale({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + }); + + function defaultLocale(definition) { + locale = formatLocale(definition); + exports.timeFormat = locale.format; + exports.timeParse = locale.parse; + exports.utcFormat = locale.utcFormat; + exports.utcParse = locale.utcParse; + return locale; + } + + var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + + function formatIsoNative(date) { + return date.toISOString(); + } + + var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + + function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + } + + var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + + exports.isoFormat = formatIso; + exports.isoParse = parseIso; + exports.timeFormatDefaultLocale = defaultLocale; + exports.timeFormatLocale = formatLocale; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-time": 34}], + 34: [function (require, module, exports) { +// https://d3js.org/d3-time/ v1.1.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var t0 = new Date, + t1 = new Date; + + function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function (date) { + return floori(date = new Date(+date)), date; + }; + + interval.ceil = function (date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function (date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function (date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function (start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function (test) { + return newInterval(function (date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function (date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) { + } // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) { + } // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function (start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + interval.every = function (step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function (d) { + return field(d) % step === 0; + } + : function (d) { + return interval.count(0, d) % step === 0; + }); + }; + } + + return interval; + } + + var millisecond = newInterval(function () { + // noop + }, function (date, step) { + date.setTime(+date + step); + }, function (start, end) { + return end - start; + }); + +// An optimized implementation for this simple case. + millisecond.every = function (k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function (date) { + date.setTime(Math.floor(date / k) * k); + }, function (date, step) { + date.setTime(+date + step * k); + }, function (start, end) { + return (end - start) / k; + }); + }; + var milliseconds = millisecond.range; + + var durationSecond = 1e3; + var durationMinute = 6e4; + var durationHour = 36e5; + var durationDay = 864e5; + var durationWeek = 6048e5; + + var second = newInterval(function (date) { + date.setTime(date - date.getMilliseconds()); + }, function (date, step) { + date.setTime(+date + step * durationSecond); + }, function (start, end) { + return (end - start) / durationSecond; + }, function (date) { + return date.getUTCSeconds(); + }); + var seconds = second.range; + + var minute = newInterval(function (date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); + }, function (date, step) { + date.setTime(+date + step * durationMinute); + }, function (start, end) { + return (end - start) / durationMinute; + }, function (date) { + return date.getMinutes(); + }); + var minutes = minute.range; + + var hour = newInterval(function (date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); + }, function (date, step) { + date.setTime(+date + step * durationHour); + }, function (start, end) { + return (end - start) / durationHour; + }, function (date) { + return date.getHours(); + }); + var hours = hour.range; + + var day = newInterval(function (date) { + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setDate(date.getDate() + step); + }, function (start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; + }, function (date) { + return date.getDate() - 1; + }); + var days = day.range; + + function weekday(i) { + return newInterval(function (date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setDate(date.getDate() + step * 7); + }, function (start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); + } + + var sunday = weekday(0); + var monday = weekday(1); + var tuesday = weekday(2); + var wednesday = weekday(3); + var thursday = weekday(4); + var friday = weekday(5); + var saturday = weekday(6); + + var sundays = sunday.range; + var mondays = monday.range; + var tuesdays = tuesday.range; + var wednesdays = wednesday.range; + var thursdays = thursday.range; + var fridays = friday.range; + var saturdays = saturday.range; + + var month = newInterval(function (date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setMonth(date.getMonth() + step); + }, function (start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; + }, function (date) { + return date.getMonth(); + }); + var months = month.range; + + var year = newInterval(function (date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setFullYear(date.getFullYear() + step); + }, function (start, end) { + return end.getFullYear() - start.getFullYear(); + }, function (date) { + return date.getFullYear(); + }); + +// An optimized implementation for this simple case. + year.every = function (k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function (date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); + }; + var years = year.range; + + var utcMinute = newInterval(function (date) { + date.setUTCSeconds(0, 0); + }, function (date, step) { + date.setTime(+date + step * durationMinute); + }, function (start, end) { + return (end - start) / durationMinute; + }, function (date) { + return date.getUTCMinutes(); + }); + var utcMinutes = utcMinute.range; + + var utcHour = newInterval(function (date) { + date.setUTCMinutes(0, 0, 0); + }, function (date, step) { + date.setTime(+date + step * durationHour); + }, function (start, end) { + return (end - start) / durationHour; + }, function (date) { + return date.getUTCHours(); + }); + var utcHours = utcHour.range; + + var utcDay = newInterval(function (date) { + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCDate(date.getUTCDate() + step); + }, function (start, end) { + return (end - start) / durationDay; + }, function (date) { + return date.getUTCDate() - 1; + }); + var utcDays = utcDay.range; + + function utcWeekday(i) { + return newInterval(function (date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function (start, end) { + return (end - start) / durationWeek; + }); + } + + var utcSunday = utcWeekday(0); + var utcMonday = utcWeekday(1); + var utcTuesday = utcWeekday(2); + var utcWednesday = utcWeekday(3); + var utcThursday = utcWeekday(4); + var utcFriday = utcWeekday(5); + var utcSaturday = utcWeekday(6); + + var utcSundays = utcSunday.range; + var utcMondays = utcMonday.range; + var utcTuesdays = utcTuesday.range; + var utcWednesdays = utcWednesday.range; + var utcThursdays = utcThursday.range; + var utcFridays = utcFriday.range; + var utcSaturdays = utcSaturday.range; + + var utcMonth = newInterval(function (date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCMonth(date.getUTCMonth() + step); + }, function (start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; + }, function (date) { + return date.getUTCMonth(); + }); + var utcMonths = utcMonth.range; + + var utcYear = newInterval(function (date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); + }, function (start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); + }, function (date) { + return date.getUTCFullYear(); + }); + +// An optimized implementation for this simple case. + utcYear.every = function (k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function (date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); + }; + var utcYears = utcYear.range; + + exports.timeDay = day; + exports.timeDays = days; + exports.timeFriday = friday; + exports.timeFridays = fridays; + exports.timeHour = hour; + exports.timeHours = hours; + exports.timeInterval = newInterval; + exports.timeMillisecond = millisecond; + exports.timeMilliseconds = milliseconds; + exports.timeMinute = minute; + exports.timeMinutes = minutes; + exports.timeMonday = monday; + exports.timeMondays = mondays; + exports.timeMonth = month; + exports.timeMonths = months; + exports.timeSaturday = saturday; + exports.timeSaturdays = saturdays; + exports.timeSecond = second; + exports.timeSeconds = seconds; + exports.timeSunday = sunday; + exports.timeSundays = sundays; + exports.timeThursday = thursday; + exports.timeThursdays = thursdays; + exports.timeTuesday = tuesday; + exports.timeTuesdays = tuesdays; + exports.timeWednesday = wednesday; + exports.timeWednesdays = wednesdays; + exports.timeWeek = sunday; + exports.timeWeeks = sundays; + exports.timeYear = year; + exports.timeYears = years; + exports.utcDay = utcDay; + exports.utcDays = utcDays; + exports.utcFriday = utcFriday; + exports.utcFridays = utcFridays; + exports.utcHour = utcHour; + exports.utcHours = utcHours; + exports.utcMillisecond = millisecond; + exports.utcMilliseconds = milliseconds; + exports.utcMinute = utcMinute; + exports.utcMinutes = utcMinutes; + exports.utcMonday = utcMonday; + exports.utcMondays = utcMondays; + exports.utcMonth = utcMonth; + exports.utcMonths = utcMonths; + exports.utcSaturday = utcSaturday; + exports.utcSaturdays = utcSaturdays; + exports.utcSecond = second; + exports.utcSeconds = seconds; + exports.utcSunday = utcSunday; + exports.utcSundays = utcSundays; + exports.utcThursday = utcThursday; + exports.utcThursdays = utcThursdays; + exports.utcTuesday = utcTuesday; + exports.utcTuesdays = utcTuesdays; + exports.utcWednesday = utcWednesday; + exports.utcWednesdays = utcWednesdays; + exports.utcWeek = utcSunday; + exports.utcWeeks = utcSundays; + exports.utcYear = utcYear; + exports.utcYears = utcYears; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 35: [function (require, module, exports) { +// https://d3js.org/d3-timer/ v1.0.10 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) { + setTimeout(f, 17); + }; + + function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); + } + + function clearNow() { + clockNow = 0; + } + + function Timer() { + this._call = + this._time = + this._next = null; + } + + Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function (callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function () { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } + }; + + function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; + } + + function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; + } + + function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } + } + + function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; + } + + function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); + } + + function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } + } + + function timeout$1(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(function (elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; + } + + function interval$1(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + delay = +delay, time = time == null ? now() : +time; + t.restart(function tick(elapsed) { + elapsed += total; + t.restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + return t; + } + + exports.interval = interval$1; + exports.now = now; + exports.timeout = timeout$1; + exports.timer = timer; + exports.timerFlush = timerFlush; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 36: [function (require, module, exports) { +// https://d3js.org/d3-transition/ v1.3.2 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-timer'), require('d3-interpolate'), require('d3-color'), require('d3-ease')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) { + 'use strict'; + + var emptyOn = d3Dispatch.dispatch("start", "end", "cancel", "interrupt"); + var emptyTween = []; + + var CREATED = 0; + var SCHEDULED = 1; + var STARTING = 2; + var STARTED = 3; + var RUNNING = 4; + var ENDING = 5; + var ENDED = 6; + + function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); + } + + function init(node, id) { + var schedule = get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; + } + + function set(node, id) { + var schedule = get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; + } + + function get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; + } + + function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = d3Timer.timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return d3Timer.timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + d3Timer.timeout(function () { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } + } + + function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; + } + + function selection_interrupt(name) { + return this.each(function () { + interrupt(this, name); + }); + } + + function tweenRemove(id, name) { + var tween0, tween1; + return function () { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; + } + + function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function () { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; + } + + function transition_tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); + } + + function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function () { + var schedule = set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function (node) { + return get(node, id).value[name]; + }; + } + + function interpolate(a, b) { + var c; + return (typeof b === "number" ? d3Interpolate.interpolateNumber + : b instanceof d3Color.color ? d3Interpolate.interpolateRgb + : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) + : d3Interpolate.interpolateString)(a, b); + } + + function attrRemove(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function transition_attr(name, value) { + var fullname = d3Selection.namespace(name), + i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); + } + + function attrInterpolate(name, i) { + return function (t) { + this.setAttribute(name, i.call(this, t)); + }; + } + + function attrInterpolateNS(fullname, i) { + return function (t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; + } + + function attrTweenNS(fullname, value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + + tween._value = value; + return tween; + } + + function attrTween(name, value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + + tween._value = value; + return tween; + } + + function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = d3Selection.namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); + } + + function delayFunction(id, value) { + return function () { + init(this, id).delay = +value.apply(this, arguments); + }; + } + + function delayConstant(id, value) { + return value = +value, function () { + init(this, id).delay = value; + }; + } + + function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get(this.node(), id).delay; + } + + function durationFunction(id, value) { + return function () { + set(this, id).duration = +value.apply(this, arguments); + }; + } + + function durationConstant(id, value) { + return value = +value, function () { + set(this, id).duration = value; + }; + } + + function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get(this.node(), id).duration; + } + + function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function () { + set(this, id).ease = value; + }; + } + + function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get(this.node(), id).ease; + } + + function transition_filter(match) { + if (typeof match !== "function") match = d3Selection.matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); + } + + function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); + } + + function start(name) { + return (name + "").trim().split(/^|\s+/).every(function (t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); + } + + function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set; + return function () { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; + } + + function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); + } + + function removeFunction(id) { + return function () { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; + } + + function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); + } + + function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); + } + + function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); + } + + var Selection = d3Selection.selection.prototype.constructor; + + function transition_selection() { + return new Selection(this._groups, this._parents); + } + + function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function () { + var string0 = d3Selection.style(this, name), + string1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; + } + + function styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = d3Selection.style(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0 = d3Selection.style(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function () { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; + } + + function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant(name, i, value), priority) + .on("end.style." + name, null); + } + + function styleInterpolate(name, i, priority) { + return function (t) { + this.style.setProperty(name, i.call(this, t), priority); + }; + } + + function styleTween(name, value, priority) { + var t, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + + tween._value = value; + return tween; + } + + function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); + } + + function textConstant(value) { + return function () { + this.textContent = value; + }; + } + + function textFunction(value) { + return function () { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; + } + + function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); + } + + function textInterpolate(i) { + return function (t) { + this.textContent = i.call(this, t); + }; + } + + function textTween(value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + + tween._value = value; + return tween; + } + + function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); + } + + function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); + } + + function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function (resolve, reject) { + var cancel = {value: reject}, + end = { + value: function () { + if (--size === 0) resolve(); + } + }; + + that.each(function () { + var schedule = set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + }); + } + + var id = 0; + + function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; + } + + function transition(name) { + return d3Selection.selection().transition(name); + } + + function newId() { + return ++id; + } + + var selection_prototype = d3Selection.selection.prototype; + + Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + end: transition_end + }; + + var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: d3Ease.easeCubicInOut + }; + + function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + return defaultTiming.time = d3Timer.now(), defaultTiming; + } + } + return timing; + } + + function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); + } + + d3Selection.selection.prototype.interrupt = selection_interrupt; + d3Selection.selection.prototype.transition = selection_transition; + + var root = [null]; + + function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root, name, +i); + } + } + } + + return null; + } + + exports.active = active; + exports.interrupt = interrupt; + exports.transition = transition; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13, "d3-dispatch": 15, "d3-ease": 18, "d3-interpolate": 24, "d3-selection": 31, "d3-timer": 35}], + 37: [function (require, module, exports) { +// https://d3js.org/d3-voronoi/ v1.1.4 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } + + function x(d) { + return d[0]; + } + + function y(d) { + return d[1]; + } + + function RedBlackTree() { + this._ = null; // root node + } + + function RedBlackNode(node) { + node.U = // parent node + node.C = // color - true for red, false for black + node.L = // left node + node.R = // right node + node.P = // previous node + node.N = null; // next node + } + + RedBlackTree.prototype = { + constructor: RedBlackTree, + + insert: function (after, node) { + var parent, grandpa, uncle; + + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = RedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + RedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + RedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + + remove: function (node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + + var parent = node.U, + sibling, + left = node.L, + right = node.R, + next, + red; + + if (!left) next = right; + else if (!right) next = left; + else next = RedBlackFirst(right); + + if (parent) { + if (parent.L === node) parent.L = next; + else parent.R = next; + } else { + this._ = next; + } + + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + + if (node) node.U = parent; + if (red) return; + if (node && node.C) { + node.C = false; + return; + } + + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + RedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + RedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateRight(this, parent); + sibling = parent.L; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + RedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + RedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + + if (node) node.C = false; + } + }; + + function RedBlackRotateLeft(tree, node) { + var p = node, + q = node.R, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; + } + + function RedBlackRotateRight(tree, node) { + var p = node, + q = node.L, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; + } + + function RedBlackFirst(node) { + while (node.L) node = node.L; + return node; + } + + function createEdge(left, right, v0, v1) { + var edge = [null, null], + index = edges.push(edge) - 1; + edge.left = left; + edge.right = right; + if (v0) setEdgeEnd(edge, left, right, v0); + if (v1) setEdgeEnd(edge, right, left, v1); + cells[left.index].halfedges.push(index); + cells[right.index].halfedges.push(index); + return edge; + } + + function createBorderEdge(left, v0, v1) { + var edge = [v0, v1]; + edge.left = left; + return edge; + } + + function setEdgeEnd(edge, left, right, vertex) { + if (!edge[0] && !edge[1]) { + edge[0] = vertex; + edge.left = left; + edge.right = right; + } else if (edge.left === right) { + edge[1] = vertex; + } else { + edge[0] = vertex; + } + } + +// Liang–Barsky line clipping. + function clipEdge(edge, x0, y0, x1, y1) { + var a = edge[0], + b = edge[1], + ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? + + if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; + if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; + return true; + } + + function connectEdge(edge, x0, y0, x1, y1) { + var v1 = edge[1]; + if (v1) return true; + + var v0 = edge[0], + left = edge.left, + right = edge.right, + lx = left[0], + ly = left[1], + rx = right[0], + ry = right[1], + fx = (lx + rx) / 2, + fy = (ly + ry) / 2, + fm, + fb; + + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!v0) v0 = [fx, y0]; + else if (v0[1] >= y1) return; + v1 = [fx, y1]; + } else { + if (!v0) v0 = [fx, y1]; + else if (v0[1] < y0) return; + v1 = [fx, y0]; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!v0) v0 = [(y0 - fb) / fm, y0]; + else if (v0[1] >= y1) return; + v1 = [(y1 - fb) / fm, y1]; + } else { + if (!v0) v0 = [(y1 - fb) / fm, y1]; + else if (v0[1] < y0) return; + v1 = [(y0 - fb) / fm, y0]; + } + } else { + if (ly < ry) { + if (!v0) v0 = [x0, fm * x0 + fb]; + else if (v0[0] >= x1) return; + v1 = [x1, fm * x1 + fb]; + } else { + if (!v0) v0 = [x1, fm * x1 + fb]; + else if (v0[0] < x0) return; + v1 = [x0, fm * x0 + fb]; + } + } + } + + edge[0] = v0; + edge[1] = v1; + return true; + } + + function clipEdges(x0, y0, x1, y1) { + var i = edges.length, + edge; + + while (i--) { + if (!connectEdge(edge = edges[i], x0, y0, x1, y1) + || !clipEdge(edge, x0, y0, x1, y1) + || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon + || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) { + delete edges[i]; + } + } + } + + function createCell(site) { + return cells[site.index] = { + site: site, + halfedges: [] + }; + } + + function cellHalfedgeAngle(cell, edge) { + var site = cell.site, + va = edge.left, + vb = edge.right; + if (site === vb) vb = va, va = site; + if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); + if (site === va) va = edge[1], vb = edge[0]; + else va = edge[0], vb = edge[1]; + return Math.atan2(va[0] - vb[0], vb[1] - va[1]); + } + + function cellHalfedgeStart(cell, edge) { + return edge[+(edge.left !== cell.site)]; + } + + function cellHalfedgeEnd(cell, edge) { + return edge[+(edge.left === cell.site)]; + } + + function sortCellHalfedges() { + for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { + if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { + var index = new Array(m), + array = new Array(m); + for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); + index.sort(function (i, j) { + return array[j] - array[i]; + }); + for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; + for (j = 0; j < m; ++j) halfedges[j] = array[j]; + } + } + } + + function clipCells(x0, y0, x1, y1) { + var nCells = cells.length, + iCell, + cell, + site, + iHalfedge, + halfedges, + nHalfedges, + start, + startX, + startY, + end, + endX, + endY, + cover = true; + + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + halfedges = cell.halfedges; + iHalfedge = halfedges.length; + + // Remove any dangling clipped edges. + while (iHalfedge--) { + if (!edges[halfedges[iHalfedge]]) { + halfedges.splice(iHalfedge, 1); + } + } + + // Insert any border edges as necessary. + iHalfedge = 0, nHalfedges = halfedges.length; + while (iHalfedge < nHalfedges) { + end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; + start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; + if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) { + halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, + Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1] + : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1] + : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0] + : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0] + : null)) - 1); + ++nHalfedges; + } + } + + if (nHalfedges) cover = false; + } + } + + // If there weren’t any edges, have the closest site cover the extent. + // It doesn’t matter which corner of the extent we measure! + if (cover) { + var dx, dy, d2, dc = Infinity; + + for (iCell = 0, cover = null; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + dx = site[0] - x0; + dy = site[1] - y0; + d2 = dx * dx + dy * dy; + if (d2 < dc) dc = d2, cover = cell; + } + } + + if (cover) { + var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; + cover.halfedges.push( + edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, + edges.push(createBorderEdge(site, v01, v11)) - 1, + edges.push(createBorderEdge(site, v11, v10)) - 1, + edges.push(createBorderEdge(site, v10, v00)) - 1 + ); + } + } + + // Lastly delete any cells with no edges; these were entirely clipped. + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + if (!cell.halfedges.length) { + delete cells[iCell]; + } + } + } + } + + var circlePool = []; + + var firstCircle; + + function Circle() { + RedBlackNode(this); + this.x = + this.y = + this.arc = + this.site = + this.cy = null; + } + + function attachCircle(arc) { + var lArc = arc.P, + rArc = arc.N; + + if (!lArc || !rArc) return; + + var lSite = lArc.site, + cSite = arc.site, + rSite = rArc.site; + + if (lSite === rSite) return; + + var bx = cSite[0], + by = cSite[1], + ax = lSite[0] - bx, + ay = lSite[1] - by, + cx = rSite[0] - bx, + cy = rSite[1] - by; + + var d = 2 * (ax * cy - ay * cx); + if (d >= -epsilon2) return; + + var ha = ax * ax + ay * ay, + hc = cx * cx + cy * cy, + x = (cy * ha - ay * hc) / d, + y = (ax * hc - cx * ha) / d; + + var circle = circlePool.pop() || new Circle; + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom + + arc.circle = circle; + + var before = null, + node = circles._; + + while (node) { + if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { + if (node.L) node = node.L; + else { + before = node.P; + break; + } + } else { + if (node.R) node = node.R; + else { + before = node; + break; + } + } + } + + circles.insert(before, circle); + if (!before) firstCircle = circle; + } + + function detachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) firstCircle = circle.N; + circles.remove(circle); + circlePool.push(circle); + RedBlackNode(circle); + arc.circle = null; + } + } + + var beachPool = []; + + function Beach() { + RedBlackNode(this); + this.edge = + this.site = + this.circle = null; + } + + function createBeach(site) { + var beach = beachPool.pop() || new Beach; + beach.site = site; + return beach; + } + + function detachBeach(beach) { + detachCircle(beach); + beaches.remove(beach); + beachPool.push(beach); + RedBlackNode(beach); + } + + function removeBeach(beach) { + var circle = beach.circle, + x = circle.x, + y = circle.cy, + vertex = [x, y], + previous = beach.P, + next = beach.N, + disappearing = [beach]; + + detachBeach(beach); + + var lArc = previous; + while (lArc.circle + && Math.abs(x - lArc.circle.x) < epsilon + && Math.abs(y - lArc.circle.cy) < epsilon) { + previous = lArc.P; + disappearing.unshift(lArc); + detachBeach(lArc); + lArc = previous; + } + + disappearing.unshift(lArc); + detachCircle(lArc); + + var rArc = next; + while (rArc.circle + && Math.abs(x - rArc.circle.x) < epsilon + && Math.abs(y - rArc.circle.cy) < epsilon) { + next = rArc.N; + disappearing.push(rArc); + detachBeach(rArc); + rArc = next; + } + + disappearing.push(rArc); + detachCircle(rArc); + + var nArcs = disappearing.length, + iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + + attachCircle(lArc); + attachCircle(rArc); + } + + function addBeach(site) { + var x = site[0], + directrix = site[1], + lArc, + rArc, + dxl, + dxr, + node = beaches._; + + while (node) { + dxl = leftBreakPoint(node, directrix) - x; + if (dxl > epsilon) node = node.L; else { + dxr = x - rightBreakPoint(node, directrix); + if (dxr > epsilon) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -epsilon) { + lArc = node.P; + rArc = node; + } else if (dxr > -epsilon) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + + createCell(site); + var newArc = createBeach(site); + beaches.insert(lArc, newArc); + + if (!lArc && !rArc) return; + + if (lArc === rArc) { + detachCircle(lArc); + rArc = createBeach(lArc.site); + beaches.insert(newArc, rArc); + newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); + attachCircle(lArc); + attachCircle(rArc); + return; + } + + if (!rArc) { // && lArc + newArc.edge = createEdge(lArc.site, newArc.site); + return; + } + + // else lArc !== rArc + detachCircle(lArc); + detachCircle(rArc); + + var lSite = lArc.site, + ax = lSite[0], + ay = lSite[1], + bx = site[0] - ax, + by = site[1] - ay, + rSite = rArc.site, + cx = rSite[0] - ax, + cy = rSite[1] - ay, + d = 2 * (bx * cy - by * cx), + hb = bx * bx + by * by, + hc = cx * cx + cy * cy, + vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; + + setEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = createEdge(lSite, site, null, vertex); + rArc.edge = createEdge(site, rSite, null, vertex); + attachCircle(lArc); + attachCircle(rArc); + } + + function leftBreakPoint(arc, directrix) { + var site = arc.site, + rfocx = site[0], + rfocy = site[1], + pby2 = rfocy - directrix; + + if (!pby2) return rfocx; + + var lArc = arc.P; + if (!lArc) return -Infinity; + + site = lArc.site; + var lfocx = site[0], + lfocy = site[1], + plby2 = lfocy - directrix; + + if (!plby2) return lfocx; + + var hl = lfocx - rfocx, + aby2 = 1 / pby2 - 1 / plby2, + b = hl / plby2; + + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + + return (rfocx + lfocx) / 2; + } + + function rightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return leftBreakPoint(rArc, directrix); + var site = arc.site; + return site[1] === directrix ? site[0] : Infinity; + } + + var epsilon = 1e-6; + var epsilon2 = 1e-12; + var beaches; + var cells; + var circles; + var edges; + + function triangleArea(a, b, c) { + return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); + } + + function lexicographic(a, b) { + return b[1] - a[1] + || b[0] - a[0]; + } + + function Diagram(sites, extent) { + var site = sites.sort(lexicographic).pop(), + x, + y, + circle; + + edges = []; + cells = new Array(sites.length); + beaches = new RedBlackTree; + circles = new RedBlackTree; + + while (true) { + circle = firstCircle; + if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { + if (site[0] !== x || site[1] !== y) { + addBeach(site); + x = site[0], y = site[1]; + } + site = sites.pop(); + } else if (circle) { + removeBeach(circle.arc); + } else { + break; + } + } + + sortCellHalfedges(); + + if (extent) { + var x0 = +extent[0][0], + y0 = +extent[0][1], + x1 = +extent[1][0], + y1 = +extent[1][1]; + clipEdges(x0, y0, x1, y1); + clipCells(x0, y0, x1, y1); + } + + this.edges = edges; + this.cells = cells; + + beaches = + circles = + edges = + cells = null; + } + + Diagram.prototype = { + constructor: Diagram, + + polygons: function () { + var edges = this.edges; + + return this.cells.map(function (cell) { + var polygon = cell.halfedges.map(function (i) { + return cellHalfedgeStart(cell, edges[i]); + }); + polygon.data = cell.site.data; + return polygon; + }); + }, + + triangles: function () { + var triangles = [], + edges = this.edges; + + this.cells.forEach(function (cell, i) { + if (!(m = (halfedges = cell.halfedges).length)) return; + var site = cell.site, + halfedges, + j = -1, + m, + s0, + e1 = edges[halfedges[m - 1]], + s1 = e1.left === site ? e1.right : e1.left; + + while (++j < m) { + s0 = s1; + e1 = edges[halfedges[j]]; + s1 = e1.left === site ? e1.right : e1.left; + if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { + triangles.push([site.data, s0.data, s1.data]); + } + } + }); + + return triangles; + }, + + links: function () { + return this.edges.filter(function (edge) { + return edge.right; + }).map(function (edge) { + return { + source: edge.left.data, + target: edge.right.data + }; + }); + }, + + find: function (x, y, radius) { + var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; + + // Use the previously-found cell, or start with an arbitrary one. + while (!(cell = that.cells[i1])) if (++i1 >= n) return null; + var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; + + // Traverse the half-edges to find a closer cell, if any. + do { + cell = that.cells[i0 = i1], i1 = null; + cell.halfedges.forEach(function (e) { + var edge = that.edges[e], v = edge.left; + if ((v === cell.site || !v) && !(v = edge.right)) return; + var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; + if (v2 < d2) d2 = v2, i1 = v.index; + }); + } while (i1 !== null); + + that._found = i0; + + return radius == null || d2 <= radius * radius ? cell.site : null; + } + }; + + function voronoi() { + var x$$1 = x, + y$$1 = y, + extent = null; + + function voronoi(data) { + return new Diagram(data.map(function (d, i) { + var s = [Math.round(x$$1(d, i, data) / epsilon) * epsilon, Math.round(y$$1(d, i, data) / epsilon) * epsilon]; + s.index = i; + s.data = d; + return s; + }), extent); + } + + voronoi.polygons = function (data) { + return voronoi(data).polygons(); + }; + + voronoi.links = function (data) { + return voronoi(data).links(); + }; + + voronoi.triangles = function (data) { + return voronoi(data).triangles(); + }; + + voronoi.x = function (_) { + return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : x$$1; + }; + + voronoi.y = function (_) { + return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : y$$1; + }; + + voronoi.extent = function (_) { + return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; + }; + + voronoi.size = function (_) { + return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; + }; + + return voronoi; + } + + exports.voronoi = voronoi; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 38: [function (require, module, exports) { +// https://d3js.org/d3-zoom/ v1.8.3 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } + + function ZoomEvent(target, type, transform) { + this.target = target; + this.type = type; + this.transform = transform; + } + + function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; + } + + Transform.prototype = { + constructor: Transform, + scale: function (k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function (x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function (point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function (x) { + return x * this.k + this.x; + }, + applyY: function (y) { + return y * this.k + this.y; + }, + invert: function (location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function (x) { + return (x - this.x) / this.k; + }, + invertY: function (y) { + return (y - this.y) / this.k; + }, + rescaleX: function (x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function (y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function () { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } + }; + + var identity = new Transform(1, 0, 0); + + transform.prototype = Transform.prototype; + + function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; + return node.__zoom; + } + + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } + + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } + +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } + + function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; + } + + function defaultTransform() { + return this.__zoom || identity; + } + + function defaultWheelDelta() { + return -d3Selection.event.deltaY * (d3Selection.event.deltaMode === 1 ? 0.05 : d3Selection.event.deltaMode ? 1 : 0.002); + } + + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + + function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); + } + + function zoom() { + var filter = defaultFilter, + extent = defaultExtent, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = d3Interpolate.interpolateZoom, + listeners = d3Dispatch.dispatch("start", "zoom", "end"), + touchstarting, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function (collection, transform, point) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point); + } else { + selection.interrupt().each(function () { + gesture(this, arguments) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function (selection, k, p) { + zoom.scaleTo(selection, function () { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p); + }; + + zoom.scaleTo = function (selection, k, p) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p); + }; + + zoom.translateBy = function (selection, x, y) { + zoom.transform(selection, function () { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }); + }; + + zoom.translateTo = function (selection, x, y, p) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point) { + transition + .on("start.zoom", function () { + gesture(this, arguments).start(); + }) + .on("interrupt.zoom end.zoom", function () { + gesture(this, arguments).end(); + }) + .tween("zoom", function () { + var that = this, + args = arguments, + g = gesture(that, args), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function (t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { + var l = i(t), k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + start: function () { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function (key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function () { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function (type) { + d3Selection.customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function wheeled() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = d3Selection.mouse(this); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + d3Transition.interrupt(this); + g.start(); + } + + noevent(); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, arguments, true), + v = d3Selection.select(d3Selection.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = d3Selection.mouse(this), + x0 = d3Selection.event.clientX, + y0 = d3Selection.event.clientY; + + d3Drag.dragDisable(d3Selection.event.view); + nopropagation(); + g.mouse = [p, this.__zoom.invert(p)]; + d3Transition.interrupt(this); + g.start(); + + function mousemoved() { + noevent(); + if (!g.moved) { + var dx = d3Selection.event.clientX - x0, dy = d3Selection.event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3Selection.mouse(g.that), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped() { + v.on("mousemove.zoom mouseup.zoom", null); + d3Drag.dragEnable(d3Selection.event.view, g.moved); + noevent(); + g.end(); + } + } + + function dblclicked() { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = d3Selection.mouse(this), + p1 = t0.invert(p0), + k1 = t0.k * (d3Selection.event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); + + noevent(); + if (duration > 0) d3Selection.select(this).transition().duration(duration).call(schedule, t1, p0); + else d3Selection.select(this).call(zoom.transform, t1); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = d3Selection.event.touches, + n = touches.length, + g = gesture(this, arguments, d3Selection.event.changedTouches.length === n), + started, i, t, p; + + nopropagation(); + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.touch(this, touches, t.identifier); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchstarting = setTimeout(function () { + touchstarting = null; + }, touchDelay); + d3Transition.interrupt(this); + g.start(); + } + } + + function touchmoved() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = d3Selection.event.changedTouches, + n = touches.length, i, t, p, l; + + noevent(); + if (touchstarting) touchstarting = clearTimeout(touchstarting); + g.taps = 0; + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.touch(this, touches, t.identifier); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = d3Selection.event.changedTouches, + n = touches.length, i, t; + + nopropagation(); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + var p = d3Selection.select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + + zoom.wheelDelta = function (_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; + + zoom.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; + + zoom.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; + + zoom.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function (_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function (_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function (_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function (_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function (_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + return zoom; + } + + exports.zoom = zoom; + exports.zoomIdentity = identity; + exports.zoomTransform = transform; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-dispatch": 15, "d3-drag": 16, "d3-interpolate": 24, "d3-selection": 31, "d3-transition": 36}], + 39: [function (require, module, exports) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', {value: true}); + + var d3Array = require('d3-array'); + var d3Axis = require('d3-axis'); + var d3Brush = require('d3-brush'); + var d3Chord = require('d3-chord'); + var d3Collection = require('d3-collection'); + var d3Color = require('d3-color'); + var d3Contour = require('d3-contour'); + var d3Dispatch = require('d3-dispatch'); + var d3Drag = require('d3-drag'); + var d3Dsv = require('d3-dsv'); + var d3Ease = require('d3-ease'); + var d3Fetch = require('d3-fetch'); + var d3Force = require('d3-force'); + var d3Format = require('d3-format'); + var d3Geo = require('d3-geo'); + var d3Hierarchy = require('d3-hierarchy'); + var d3Interpolate = require('d3-interpolate'); + var d3Path = require('d3-path'); + var d3Polygon = require('d3-polygon'); + var d3Quadtree = require('d3-quadtree'); + var d3Random = require('d3-random'); + var d3Scale = require('d3-scale'); + var d3ScaleChromatic = require('d3-scale-chromatic'); + var d3Selection = require('d3-selection'); + var d3Shape = require('d3-shape'); + var d3Time = require('d3-time'); + var d3TimeFormat = require('d3-time-format'); + var d3Timer = require('d3-timer'); + var d3Transition = require('d3-transition'); + var d3Voronoi = require('d3-voronoi'); + var d3Zoom = require('d3-zoom'); + + var version = "5.15.0"; + + Object.keys(d3Array).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Array[k]; + } + }); + }); + Object.keys(d3Axis).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Axis[k]; + } + }); + }); + Object.keys(d3Brush).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Brush[k]; + } + }); + }); + Object.keys(d3Chord).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Chord[k]; + } + }); + }); + Object.keys(d3Collection).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Collection[k]; + } + }); + }); + Object.keys(d3Color).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Color[k]; + } + }); + }); + Object.keys(d3Contour).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Contour[k]; + } + }); + }); + Object.keys(d3Dispatch).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Dispatch[k]; + } + }); + }); + Object.keys(d3Drag).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Drag[k]; + } + }); + }); + Object.keys(d3Dsv).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Dsv[k]; + } + }); + }); + Object.keys(d3Ease).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Ease[k]; + } + }); + }); + Object.keys(d3Fetch).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Fetch[k]; + } + }); + }); + Object.keys(d3Force).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Force[k]; + } + }); + }); + Object.keys(d3Format).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Format[k]; + } + }); + }); + Object.keys(d3Geo).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Geo[k]; + } + }); + }); + Object.keys(d3Hierarchy).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Hierarchy[k]; + } + }); + }); + Object.keys(d3Interpolate).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Interpolate[k]; + } + }); + }); + Object.keys(d3Path).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Path[k]; + } + }); + }); + Object.keys(d3Polygon).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Polygon[k]; + } + }); + }); + Object.keys(d3Quadtree).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Quadtree[k]; + } + }); + }); + Object.keys(d3Random).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Random[k]; + } + }); + }); + Object.keys(d3Scale).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Scale[k]; + } + }); + }); + Object.keys(d3ScaleChromatic).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3ScaleChromatic[k]; + } + }); + }); + Object.keys(d3Selection).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Selection[k]; + } + }); + }); + Object.keys(d3Shape).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Shape[k]; + } + }); + }); + Object.keys(d3Time).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Time[k]; + } + }); + }); + Object.keys(d3TimeFormat).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3TimeFormat[k]; + } + }); + }); + Object.keys(d3Timer).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Timer[k]; + } + }); + }); + Object.keys(d3Transition).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Transition[k]; + } + }); + }); + Object.keys(d3Voronoi).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Voronoi[k]; + } + }); + }); + Object.keys(d3Zoom).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Zoom[k]; + } + }); + }); + exports.version = version; + + }, { + "d3-array": 8, + "d3-axis": 9, + "d3-brush": 10, + "d3-chord": 11, + "d3-collection": 12, + "d3-color": 13, + "d3-contour": 14, + "d3-dispatch": 15, + "d3-drag": 16, + "d3-dsv": 17, + "d3-ease": 18, + "d3-fetch": 19, + "d3-force": 20, + "d3-format": 21, + "d3-geo": 22, + "d3-hierarchy": 23, + "d3-interpolate": 24, + "d3-path": 25, + "d3-polygon": 26, + "d3-quadtree": 27, + "d3-random": 28, + "d3-scale": 30, + "d3-scale-chromatic": 29, + "d3-selection": 31, + "d3-shape": 32, + "d3-time": 34, + "d3-time-format": 33, + "d3-timer": 35, + "d3-transition": 36, + "d3-voronoi": 37, + "d3-zoom": 38 + }], + 40: [function (require, module, exports) { + (function (process, global) { + !function (e) { + "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.commonJsModule = e() : "undefined" != typeof global ? global.commonJsModule = e() : "undefined" != typeof self && (self.commonJsModule = e()) + }(function () { + var define, module, exports; + module = {exports: (exports = {})}; + +// var fs = require('fs'); + + module.exports = { + + // Read and transform Lasio Json files to Wellio.js json data format + + /** + * File reading utility function. + * @param {string} : file_to_read - The file to open. + * + * @returns {string} : The file's contents as a string. + */ + read_lasio_json_file: function (file_to_read) { + // Configure fs if running from node + let fs = ''; + + if (process !== 'undefined' && process.versions != null && process.versions.node != null) { + fs = require('fs'); + } + + return fs.readFileSync(file_to_read, 'utf8'); + }, + + /** + * The lasio_obj_2_wellio_obj function transforms lasio JSON strings into wellio.js JSON data format in memory and returns it. + * @param {object} lasio_json - A JavaScript object representation of lasio well log format + * + * @example + * let wellio = require('wellio') + * let lasio_json_str = wellio.read_lasio_json_file('lasio.json'); + * let lasio_obj = JSON.parse(lasio_json_str); + * let wellio_obj = wellio.lasio_obj_2_wellio_obj(lasio_obj); + * + * @returns {object} A wellio style JSON object + */ + lasio_obj_2_wellio_obj: function (lasio_obj) { + + let std_headers = { + 'Version': 'VERSION INFORMATION', + 'Well': 'WELL INFORMATION BLOCK', + 'Curves': 'CURVE INFORMATION BLOCK', + 'Parameter': 'PARAMETER INFORMATION' + }; + + let lasjson = {}; + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = lasio_obj.data; + + // Example code for adding non-standard headers + for (let item in lasio_obj.metadata) { + if (!(item in std_headers)) { + lasjson[item.toUpperCase()] = lasio_obj.metadata[item]; + } else { + for (let mnemonic in lasio_obj.metadata[item]) { + section = std_headers[item]; + lasjson[section][mnemonic] = { + MNEM: mnemonic, + UNIT: '', + DATA: lasio_obj.metadata[item][mnemonic], + 'DESCRIPTION OF MNEMONIC 1': '', + 'DESCRIPTION OF MNEMONIC 2': '' + }; + } + } + } + + return lasjson; + }, + + + /** + * A helper function that proves wellio,js was installed correctly. It merely returns the argument provided to it. For example, "test" as input would return "test". + * @param {*} onelas anything + * @returns Returns the input that was givne as an argument. This is just for testing that wellio was installed correctly. + * @example wellio.returnThing("test") = "test" + */ + returnThing: function (onelas) { + return onelas + }, + + + /** + * Loads a LAS 2.0 file from local files + * @param {string} well_log A string reprepresentatiion of filename of well log to be loaded into memory + * @returns {string} A string representation of the contents of that well log file. It is a single string. + */ + loadLAS: function (well_log) { + var file = well_log + var fs = ''; + + if (process !== 'undefined' && process.versions != null && process.versions.node != null) { + fs = require('fs'); + } + var contents = fs.readFileSync(file).toString(); + // var contents = fs.readFileSync('test.LAS', 'utf8'); + return contents + }, + //// Converts a LAS 2.0 file already loaded into memory into a json format + /** + * las2jso function converts a LAS 2.0 file already loaded into memory as a string into a JSON object + * @param {string} onelas A string representation of a LAS 2.0 well log file. Typically from the result of the loadLAS function. + * @returns {Object} A JSON object that represents the information that was in the LAS 2.0 well log file but in JSON wellio style format. + */ + las2json: function (onelas) { + //// var lasjson establishes a blank json for holding las 2.0 data. It will look like the example below: + var lasjson = { + "VERSION INFORMATION": { + "VERS": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "WRAP": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "WELL INFORMATION BLOCK": { + "GENERATED": "", + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_1": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_2": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "CURVE INFORMATION BLOCK": { + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + }, + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + } + } + , + "PARAMETER INFORMATION": { + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_1": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "CURVES": { + "Curve_NAME_ONE": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + "Curve_NAME_ONE": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + } + } + //// Some objects in the json were partially populated in the example above to make understanding the format easier. + //// We'll empty them as a first step + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = {}; + //// Within the "blocks" ["CURVE INFORMATION BLOCK","PARAMETER INFORMATION", etc.] there are other objects with repeating keys. + //// The variables below will be the building blocks for each of those objects {}. They are initially populated with empty strings as the values. + var ver_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + var well_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + var curve_info_obj = { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + }; + var param_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + //// The las file is read as a txt file. It will first be split into seperate strings based on "~" character which occurs at the top of each "block" + console.log("onelas = ", onelas) + //// Split in to las sections that start with a tilde: ~. + var split1 = onelas.split(/(~[^~]+)/); + console.log("split1 = ", split1) + var vers_str = ""; + var well_info_str = ""; + var curve_info_str = ""; + var param_info_str = ""; + var other = ""; + var curve_str = ""; + + //// As the 'OTHER' block may or may not be present, we have to split by '~' and then look for a substring to make sure we have the right block before we put each into a variable. + for (i = 0; i < split1.length; i++) { + //// Skip blank entries in the split1 array. + if (split1[i].length === 0) { + continue; + } + if (split1[i].includes("~V")) { + var vers_str = split1[i] + } else if (split1[i].includes("~W")) { + well_info_str = split1[i] + } else if (split1[i].includes("~C")) { + curve_info_str = split1[i] + } else if (split1[i].includes("~P")) { + param_info_str = split1[i] + } else if (split1[i].includes("~O")) { + other = split1[i] + } else if (split1[i].includes("~A")) { + curve_str = split1[i] + } else { + console.log("WARNING: In wellio.js the las2json() function: split1[" + i + "] is not a recognized las section") + console.log("elem: [" + split1[i] + "]"); + } + } + + + //// Working with version block first by splitting it by newline and places each item into an array + //// and taking items of array 1 and 2 for vers and wrap + var vers_line = vers_str.split("\n")[1]; + var wrap_line = vers_str.split("\n")[2]; + //// As version information, well information, and parameter information blocks contain objects with the same keys, we can process them using a loop. + //// function to process objects for ver_info_obj, well_inf_obj, and param_info_obj + //// The splitLineofType1() function takes as argument the prototypical object building block and the array of strings for that block + function splitLineofType1(ver_info_obj, arrayString) { + //// splits string (should be a single line from the LAS text) by ":", takes the first item of the resulting array, and then replaces any " " with "". + var vers_line_1half = arrayString.split(":")[0].replace(" ", ""); + //// splits the previous string variable by "." into an array of strings. + var vers_line_1half_array = vers_line_1half.split(".") + //// trimming this so I get "UWI" instead of "UWI " + ver_info_obj["MNEM"] = vers_line_1half_array[0].trim() + var unit_and_data = vers_line_1half_array.slice(1, vers_line_1half_array.length); + var unit_and_data_str = " "; + if (unit_and_data.length > 1) { + unit_and_data_str = unit_and_data[0].toString() + "." + unit_and_data[1].toString(); + } else { + unit_and_data_str = unit_and_data.toString() + } + var unit = unit_and_data_str[0, 5].trim(); + var data = unit_and_data_str.substring(5, unit_and_data_str.length).trim(); + ver_info_obj["DATA"] = data + ver_info_obj["UNIT"] = unit + //// + if (arrayString.split(":")[1].indexOf("-") !== -1) { + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].split("-")[0].trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = arrayString.split(":")[1].split("-")[1].replace("\r", "").trim() + } else { + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].replace("\r", "").trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = "" + } + return ver_info_obj + }; + lasjson["VERSION INFORMATION"]["WRAP"] = splitLineofType1(Object.assign({}, ver_info_obj), wrap_line); + lasjson["VERSION INFORMATION"]["VERS"] = splitLineofType1(Object.assign({}, ver_info_obj), vers_line); + //// Working with PARAMETER INFORMATION block second by splitting it by newline into an array. + //// This skips the line with the section's title. + var param_line_array = param_info_str.split("\n").slice(1,); + for (i = 0; i < param_line_array.length; i++) { + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (param_line_array[i] != "" && param_line_array[i][0] !== '#') { + var param_obj_inst = splitLineofType1(Object.assign({}, param_info_obj), param_line_array[i]); + lasjson["PARAMETER INFORMATION"][param_obj_inst["MNEM"]] = param_obj_inst + } + } + //// Working with CURVE INFORMATION BLOCK second by splitting it by newline into an array. + //// This skips the line with the section's title. + var curve_line_array = curve_info_str.split("\n").slice(1,); + for (i = 0; i < curve_line_array.length; i++) { + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (curve_line_array[i] != "" && curve_line_array[i][0] !== '#') { + var curve_obj_inst = splitLineofType1(Object.assign({}, curve_info_obj), curve_line_array[i]); + lasjson["CURVE INFORMATION BLOCK"][curve_obj_inst["MNEM"]] = curve_obj_inst + } + } + //// Working with WELL INFORMATION BLOCK second by splitting it by newline into an array. + //// This skips the line with the section's title. + var well_line_array = well_info_str.split("\n").slice(1,); + for (i = 0; i < well_line_array.length; i++) { + if (well_line_array[i].includes("Generated")) { + lasjson["WELL INFORMATION BLOCK"]["GENERATED"] = well_line_array[i].replace("\r", "").replace("\t", " ").replace("#", "") + } + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (well_line_array[i] != "" && well_line_array[i][0] !== '#') { + var well_obj_inst = splitLineofType1(Object.assign({}, well_info_obj), well_line_array[i]); + lasjson["WELL INFORMATION BLOCK"][well_obj_inst["MNEM"]] = well_obj_inst + } else { + console.log("INFO: in else for well_line: " + i) + console.log("elem: [" + well_line_array[i] + "]"); + } + } + //// Work with CURVES section by splitting it by newline into an array, + //// Iterate through the array items populate arrays for each key + var curve_str_array = curve_str.split("\n"); + + //// Get the curve column names from the curve names in the curve information block + //// + //// Per LAS_20_Update_Jan2014.pdf section 5.5 specs for ~C(Curve Information) + //// - This section is manditory. + //// - It desribes the curves and its units in the order they appear in the ~ASCII + //// log data section of the file. + //// - The channels described in this section must be present in the data set. + var curve_names_array_holder = []; + var curve_info = Object.keys(lasjson['CURVE INFORMATION BLOCK']); + + if (curve_info.length > 0) { + for (k = 0; k < curve_info.length; k++) { + col_name = curve_info[k]; + curve_names_array_holder.push(col_name); + lasjson.CURVES[col_name] = []; + } + } + + var curve_data_line_array = []; + + //// start at position 1 instead of 0 is to avoid the curve names + for (j = 1; j < curve_str_array.length; j++) { + //// Skip empty rows. + if (curve_str_array[j].length === 0) { + continue; + } + + var temp_data_array = curve_str_array[j].split(/\s+/); + //// Split can leave an empty element at the beginning, remove it. + if (temp_data_array[0].length === 0) { + temp_data_array.shift(); + } + + //// If data is wrapped continue to accumulate data from rows till + //// we have a data element for each data column + var idx = curve_data_line_array.length; + curve_data_line_array.length = idx + temp_data_array.length; + for (var i = 0; i < temp_data_array.length; i++, idx++) { + curve_data_line_array[idx] = temp_data_array[i]; + } + + if ( + lasjson["VERSION INFORMATION"].WRAP.DATA == 'YES' + && curve_data_line_array.length < curve_names_array_holder.length) { + continue; + } + + var counter_of_curve_names = 0; + console.log("curve_data_line_array.length = ", curve_data_line_array.length) + console.log("curve_data_line_array = ", curve_data_line_array) + + + var last_curv_data_line_position = curve_data_line_array.length - 1; + console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) + curve_data_line_array[last_curv_data_line_position] = curve_data_line_array[last_curv_data_line_position].replace("\r", "") + console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) + for (k = 0; k < curve_data_line_array.length; k++) { + if (curve_data_line_array[k] !== "") { + lasjson["CURVES"][curve_names_array_holder[counter_of_curve_names]].push(curve_data_line_array[k]) + counter_of_curve_names += 1; + } + } + //// Zero out curve_data_line_array for next set of data + curve_data_line_array = []; + } + console.log(" test: lasjson", lasjson); + return (lasjson) + }, + + //// Given a well already converted into json, returns the available curves + CurveNames: function (well_json) { + var curveNames = Object.keys(well_json["CURVES"]); + return curveNames + }, + //// + VER_block: function (well_json) { + return well_json["VERSION INFORMATION"] + }, + //// Given a well already converted into json, returns the well UWI + UWI: function (well_json) { + return well_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + }, + //// Given a well already converted into json, returns a given curve name in string format + getCurve(well_json, curve) { + if (!well_json["CURVES"][curve]) { + console.log("in getCurve function, that curve does not exist! =", curve) + return "that curve does not exist! see console.log" + + } else { + return well_json["CURVES"][curve] + } + } + } + + + return module.exports; + }); + + }).call(this, require('_process'), typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + }, {"_process": 2, "fs": 1}] +}, {}, [4, 6, 5, 7]); diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/index.js b/example_deployments/example_panel_app/static/js/wellioviz/dist/index.js new file mode 100644 index 0000000..1e6d0a4 --- /dev/null +++ b/example_deployments/example_panel_app/static/js/wellioviz/dist/index.js @@ -0,0 +1,1544 @@ +!function (e) { + "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.commonJsModule = e() : "undefined" != typeof global ? global.commonJsModule = e() : "undefined" != typeof self && (self.commonJsModule = e()); +}(function () { + var define, module, exports; + module = {exports: (exports = {})}; + +// Copyright 2019 Justin Gosses + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + // /////////////////////////////// + // /** + // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, + // * particularly those already converted to JSON, using the d3.js visualization library." + // * + // * It is designed with a single central function curveBox, that returns SVGs. + // * A variety of helper functions take in differently formatted JSONs of information about the well + // * log curves to plot and how to plot them. + // * + // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. + // * + // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a + // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. + // * + // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, + // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. + // */ + + module.exports = { + /** + * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" + * @returns {obj} It returns the wellio.js object and all its functions as a module. + */ + wellio: require("wellio"), + + /** + * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" + * @returns {obj} It returns the d3.js object and all its functions as a module. + */ + d3: require("d3"), + + /** + * A function that directs users to the docs if they need help. + * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. + */ + help: function () { + return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; + }, + + + /** + * A function that returns a short description of what the wellioviz library is all about. + * @returns {string} Returns a string that defines wellioviz. + */ + define_wellioviz: function () { + return "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library."; + }, + /////////////////////////////// + + /** + * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. + * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. + * This is used to help construct the JSON object that is given to the curveBox plotting function. + * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. + * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" + */ + curveBoxTemplateExamples: function (string_of_either__help_example_definitions_mandatories) { + let request_string = string_of_either__help_example_definitions_mandatories; + if (request_string == "help") { + return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; + } + if (request_string == "example") { + return [{ + "curve_box": { + "show_well_name": "yes", /// not built yet + "show_depth_type": "no", /// not built yet + "show_curve_units": "yes", /// not built yet + "curve_box_depth_min": -999, /// not built yet + "curve_box_depth_max": -999, /// not built yet + "take_out_null_or_visualize": "no", /// not built yet + "show_title": "no", + "width": 260, + "height": 500, + "height_multiplier_components": 2, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "well_holder_3", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectanges", "lines"], /// not built yet + "lines_connected_across_curveboxes": "no", /// not built yet + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "curve", + "curve_names": ["RHOB"], + "curve_colors": ["black"], + "curve_stroke_dasharray": ["solid"], + "stroke_linecap": ["butt"], + "stroke_width": [1], + "fill": [ + { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + } + ], + "curve_units": ["g/cm3"], + "depth_limits": [{"min": "autocalculate", "max": "autocalculate"}], + "curve_limits": [{"curve_name": "", "min": -10000000, "max": 3}], + "data": [{"depth": 1598.3, "RHOB": 2.2322}, { + "depth": 1598.4, + "RHOB": 2.0513 + }, {"depth": 1598.5, "RHOB": 2.2548}, { + "depth": 1598.6, + "RHOB": 2.9445 + }, {"depth": 1598.7, "RHOB": 2.2223}, { + "depth": 1598.8, + "RHOB": 2.447 + }, {"depth": 1598.9, "RHOB": 2.598}, {"depth": 1599, "RHOB": 2.8088}, { + "depth": 1599.1, + "RHOB": 2.2248 + }, {"depth": 1599.2, "RHOB": 2.2399}, { + "depth": 1599.3, + "RHOB": 2.251 + }, {"depth": 1599.4, "RHOB": 2.255}, { + "depth": 1599.5, + "RHOB": 2.2526 + }, {"depth": 1599.6, "RHOB": 2.2322}, { + "depth": 1599.7, + "RHOB": 2.2513 + }, {"depth": 1599.8, "RHOB": 2.2548}, {"depth": 1599.9, "RHOB": 2.2445}, { + "depth": 1600, + "RHOB": 2.2223 + }, {"depth": 1600.1, "RHOB": 2.2047}, {"depth": 1600.2, "RHOB": 2.198}], /// not built yet + "depth_curve_name": "DEPT",/// not built yet + ////// + "data_id": ["placeholder_data_id",], /// not built yet + "well_names": [""], /// not built yet + "scale_linear_log_or_yours": ["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string": [""], + "depth_units_string": [""], + "null_value": [""], /// not built yet + } + ], + "lines": [ + { + "data_type": "line", /// not built yet + "label": "example", /// not built yet + "depth": -999, /// not built yet + "color": "red", /// not built yet + "stroke_width": "3px", /// not built yet + "stroke_style": "solid", /// not built yet + "transparency": 1.0, /// not built yet + "stroke_linecap": "butt" + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 0, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "defintions") { + return [{ + "curve_box": { + "show_well_name": "yes or no. If '' is no", // not built yet + "show_depth_type": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "curve_box_depth_max": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "take_out_null_or_visualize": "yes or no. If '' is no", // not built yet + "show_title": "yes or no. If '' is no", // not built yet + "width": "number, if blank default is 250", + "height": "number, if blank default is 500", + "height_multiplier_components": "An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.", + "margin": " should be an object like {\"top\": 10, \"right\": 10, \"bottom\": 30, \"left\": 60} if missing will default to these values", + "title": "object like:{\"text\": \"\", \"title_font_size\": \"10px\"} if default, an empty string, \"\" will skill", + "div_id": "should be a string that equals a div id like: 'well_holder' Do not include the #", ///What happens if div doesn't exist? + "order_of_component": "Should be an array of strings that correlate to component types like:[\"curves\",\"rectangles\",\"lines\"]", // not built yet + "lines_connected_across_curveboxes": "yes or no. If '' is no", // not built yet + "header_sep_svg_or_not": "yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", + "svg_header_height": "Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.", + "gridlines": "yes or no as strings. Default is 'yes'", + "gridlines_color": "Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", + "gridlines_stroke_width": "thickness of the line. Default is 0.20", + "grouped_or_independent_x_scales": "independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.", // not built yet + "curve_names": "array of strings representing curve_names like: ['GR','RESD']", + "curve_colors": "array of strings representing colors using common names or rgb style like:[\"black\",\"rgb(205,0,0,1)\"]", + "curve_stroke_dasharray": "A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", + "stroke_width": "The width of the curve line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "an array of objects one for each curve like: [{\"curve_name\":\"RHOB\",\"fill\":\"yes\",\"fill_direction\":\"left\",\"cutoffs\":[0.21,2.23,2.24],\"fill_colors\":[\"gray\",\"beige\",\"white\"],\"curve2\":\"\"}]", + "curve_units": "an array of strings that are curve units like: [\"g/cm2\",\"API\",\"\"] must equal length other curve fields", + "depth_limits": "An array of objects that contains the min and max depth for each curve like: [{\"min\":\"autocalculate\",\"max\":\"autocalculate\"}]", + "curve_limits": "An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{\"curve_name\":\"GR\",\"min\":0,\"max\":100},{\"curve_name\":\"PDF\",\"min\":0,\"max\":100}]", + "data": "Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{\"UWI\":\"111aa\",\"DEPTH\":4140.5,\"GR\":0},{\"UWI\":\"111aa\",\"DEPTH\":4141,\"GR\":0}] for the entire depth of the well being showin the curve_box", + "depth_curve_name": "A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", + ////// + "data_id": ["array of strings whose length must equal curve_units, curve_names, etc."], // not built yet + "well_names": "An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.", // not built yet /// + "scale_linear_log_or_yours": "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", + + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", + "max_depth": "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", + "min_depth": "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", + "depth_type_string": "All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", + "depth_units_string": "units of depth, examples are meters,m., cm., feet, etc.", + "null_value": "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']" + } + ], + "lines": [ + { + "data_type": "must be string, will be ignored if not \"line\", \"curve\", or \"rectangle\"", + "label": "The label for horiztonal line in string form", + "depth": "number for the depth at which the line is placed", + "color": "string for the color of the line in common color name or RGB format. If '' then black will be used.", + "stroke_width": "A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", + "stroke_style": "Should be string, if not or doesnt exist will be treated as \"solid\"", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "transparency": "Should be float between 0.0 and 1.0. Otherwise default is 1.0." + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": "A number for the depth of the upper left corner of the rectangle", // + "x_starting_upper_left_corner": "A number for the x axis value of the upper left corner of the rectangle", + "width": "Width of rectangle as number", + "height": "Height of rectangle as number", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", + "opacity": "Float between 0 and 1 that represents the opacity of the fill, default is 0.5", + "label": "String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet + "label_orientation": "A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet + "lable_position": "Exceptable strings are top, center, right, left, bottom. Default right." // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "mandatories") { + return [ + "This is not yet populated!!!!" + ]; + } + }, + + /** + * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. + * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. + * It is used next by funtion ____ and ___. + * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. + */ + getFakeIncomingSparseDataExample: function () { + input_sparse_style = [{ + "single_curve_box_or_cross_section": "single", + "cross_section_title": "", + "width": 1040, /// not skippable, check if number // default if blank or missing =250 or autocalculate? + "height": 500, /// not skippable, check if number // default if blank or missing=500 + //////////////////////////// + "curve_boxes": [{ + "curve_box": { + "show_well_name": "yes", // not built yet /// Should be skip-able /// default=No + "show_depth_type": "no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "curve_box_depth_max": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "take_out_null_or_visualize": "no", // not built yet /// Should be skip-able /// default=No + "show_title": "no", // not built into plotting template yet /// Should be skip-able /// default=No + "width": 260, /// not skippable, check if number // default if blank or missing =250 + "height": 500, /// not skippable, check if number // default if blank or missing=500 + "height_multiplier_components": 3, // default if missing is 0.95 + "margin": {"top": 50, "right": 10, "bottom": 30, "left": 60}, /// not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. + "title": {"text": "", "title_font_size": "10px"}, /// Should be skip-able // default=skip + "div_id": "well_holder4", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectangles", "lines"], // not built yet, default is curve, then line, then rectangle + "lines_connected_across_curve_boxes": "no", // not built yet, default is skip function + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + + }, + "components": [{ + "curves": [ + { + "data_type": "curve", // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. + "data_id": "placeholder_data_id", // not built yet /// can be anything, just used for tracking & is optional + "well_name": "", // not built yet /// Ideally string. Will skip function if "" + "curve_type": "RHOB", // should be string. name of curve + "curve_values": [ + 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], /// Should be array. If not array, return error message? + "step": 0.1, /// Should be number. If not array, return error message? + "units": "g/cc", /// should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. + "scale_linear_log_or_yours": "linear", + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "rgb(205,0,0,1)", /// Test for string, if string use. If not string "black" + "curve_stroke_dasharray": "5,5", + "stroke_linecap": "butt", + "stroke_width": 0.5, + "fill": { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + }, + "data_ID": "", + "max_depth": "1607.3", /// should be number, if not number or doens't exit then "autocalculate" + "min_depth": "1598.3", /// should be number, if not number or doens't exit then "autocalculate" + "depth_type_string": "TVDSS", /// should be string, if not or doesn't exist, then skip func + "depth_units_string": "md", + "depth_curve_name": "DEPTH", /// should be string, ideally all depth curve names are the same + "null_value": "", // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. + "x_max": 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + "x_min": 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + } + ], + "lines": [ + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 1", /// Ideally a string. + "depth": 1601.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "blue", /// should be string, if not or doesn't exist use "black" + "stroke_width": "3px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 1.0 /// should be number between 0 and 1, if not or doesn't exist use 1. + }, + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 2", /// Ideally a string. + "depth": 1602.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "orange", /// should be string, if not or doesn't exist use "black" + "stroke_width": "5px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 0.5 /// should be number between 0 and 1, if not or doesn't exist use 1. + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 1601, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }] + }]; + return input_sparse_style; + } + , + + /////////////////////////////// + //// Functions for getting data from LAS files and reformatting to a wellio.js style JSON. + /////////////////////////////// + + /** + * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {object} well_log_json a full wellio style JSON + * @param {array} CurveNames array of curve names as strings + * @param {string} UWI a string the represents the well name + * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. + */ + convertWellJSONToObj: function (well_log_json, CurveNames, UWI, depth_curve_name) { + let depth = well_log_json["CURVES"][depth_curve_name]; + let curve_data = []; + for (let eachCr in CurveNames) { + curve_data.push(well_log_json["CURVES"][CurveNames[eachCr]]); + } + let array_of_obj = []; + if (depth.length === well_log_json["CURVES"][CurveNames[0]].length) { + for (let eachPt = 0; eachPt < depth.length; eachPt++) { + let obj = {}; + obj["UWI"] = UWI; + for (let i = 0; i < CurveNames.length; i++) { + obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); + } + array_of_obj.push(obj); + } + } else { + console.log("depth didn't match curve length"); + array_of_obj.push("depth didn't match curve length"); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions for getting basic information out of wellio.js style JSON for plotting + /////////////////////////////// + + /////// this require wellio! + // fileToJSON:function (afile){ + // return module.exports.wellio.las2json(afile) + // }, + ///////// + // turnFilesIntoTextIntoWellioJSON:function (files_array){ + // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + // let logs_in_json = [] + // for (let i = 0; i < files_array.length; i++) { + // logs_in_json.push(module.exports.fileToJSON(files_array[i])) + // } + // return logs_in_json + // }, + + + /** + * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, + * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. + * the data array of objects that D3.js likes for data used in plotting. + * @param {object} jsonWell a full wellio style JSON + * @param {string} depth_curve_name String for the depth curve name + * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} + */ + fromJSONofWEllGetThingsForPlotting: function (jsonWell, depth_curve_name) { + curve_names = Object.keys(jsonWell["CURVES"]); + uwi = jsonWell["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + depth_curve_name = depth_curve_name; + well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell, curve_names, uwi, depth_curve_name); + return { + "well_log_curves_reformatted_for_d3": well_log_curves_reformatted_for_d3, + "curve_names": curve_names, + "uwi": uwi + }; + }, + + + /////////////////////////////// + //// Functions for reformatting data other than wellio.js style JSON + /////////////////////////////// + + + /** + * createDepthArray is a function that takes in a min float, max float, and step float value. + * and returns an array or depth values from the min to the max value going by the step value each step. + * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. + * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. + * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. + * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. + * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] + */ + createDepthArray: function (min, max, step) { + //// Returns an array of depth values from min to max, including both, with each being different by step value + //// ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) + let depth = []; + min = parseFloat(min); + max = parseFloat(max); + step = parseFloat(step); + let number_of_points = ((max - min) / step) + 1; + let temp_depth = min; + for (let i = 0; i < number_of_points; i++) { + temp_depth = (min + (i * step)).toFixed(7); + depth.push(parseFloat(temp_depth)); + } + return depth; + }, + + + /** + * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. + * THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! + */ + takeInArraysAndGetObjectOfCurveDataForPlotting: function (arraysOfCurvesAndNames, CurveName, DepthName) { + //// would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") + // [{"depth":[],"curveData":[]}] + // [{"depth":[],"curveData":[]}] + let curveObj = []; + // make sure the curve data arrays are the same lenght, if not add null values + + // put them into object + let lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; + for (let i = 0; i < lengthOfCurve0; i++) { + let newObj = {[DepthName]: 0, "RHOB": 0}; + newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; + newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; + curveObj.push(newObj); + } + return curveObj; + }, + + + /** + * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. + * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. + * @param {string} UWI A string for the well log UWI ID + * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data + * @returns {array} An array of objects properly formatted for next step ___. + */ + convertWellJSONToObjV2: function (depth, curve_data, UWI, CurveNames) { + depth = depth[0]; + array_of_obj = []; + for (eachPt in depth) { + obj = {}; + obj["UWI"] = UWI; + for (i in CurveNames) { + obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); + obj["DEPTH"] = parseFloat(depth[eachPt]); + } + array_of_obj.push(obj); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. + /////////////////////////////// + + /** + * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. + * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. + * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. + */ + putIncomingSparseJsonIntoPlottingTemplate: function (incoming_sparse, template) { + if (incoming_sparse[0]["single_curve_box_or_cross_section"] == "multiple") { + console.log("THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE "); + return "THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE"; + } else { + let curve_box_obj = incoming_sparse[0]["curve_boxes"][0]; + let curve_box_overall = incoming_sparse[0]["curve_boxes"][0]["curve_box"]; + let curve_box_components = incoming_sparse[0]["curve_boxes"][0]["components"]; + template[0]["curve_box"] = curve_box_overall; + template[0]["components"][0]["lines"] = curve_box_components[0]["lines"]; + template[0]["components"][0]["rectangles"] = curve_box_components[0]["rectangles"]; + + ///// Establish template with empty arrays except for value that are shared for all curves + ///// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX + template[0]["components"][0]["curves"][0]["data_type"] = "curve"; + template[0]["components"][0]["curves"][0]["depth_type_string"] = curve_box_components[0]["curves"][0]["depth_type_string"]; + template[0]["components"][0]["curves"][0]["depth_units_string"] = curve_box_components[0]["curves"][0]["depth_units_string"]; + template[0]["components"][0]["curves"][0]["depth_curve_name"] = curve_box_components[0]["curves"][0]["depth_curve_name"]; + ///// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. + template[0]["components"][0]["curves"][0]["curve_names"] = []; + template[0]["components"][0]["curves"][0]["curve_colors"] = []; + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"] = []; + template[0]["components"][0]["curves"][0]["stroke_width"] = []; + template[0]["components"][0]["curves"][0]["stroke_linecap"] = []; + template[0]["components"][0]["curves"][0]["fill"] = []; + template[0]["components"][0]["curves"][0]["data_id"] = []; + template[0]["components"][0]["curves"][0]["well_names"] = []; + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"] = []; + template[0]["components"][0]["curves"][0]["line_color"] = []; + template[0]["components"][0]["curves"][0]["max_depth"] = []; + template[0]["components"][0]["curves"][0]["min_depth"] = []; + template[0]["components"][0]["curves"][0]["null_value"] = []; + + template[0]["components"][0]["curves"][0]["data"] = []; + + ///// For each curve object in incoming data: + let array_individual_curves_and_depth_objects = []; + let all_depths_list = []; + let all_depths_set = []; + + for (let i = 0; i < curve_box_components[0]["curves"].length; i++) { + + let curve = curve_box_components[0]["curves"][i]; + template[0]["components"][0]["curves"][0]["curve_names"].push(curve["curve_type"]); + template[0]["components"][0]["curves"][0]["curve_colors"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"].push(curve["curve_stroke_dasharray"]); + template[0]["components"][0]["curves"][0]["stroke_width"].push(curve["stroke_width"]); + template[0]["components"][0]["curves"][0]["stroke_linecap"].push(curve["stroke_linecap"]); + template[0]["components"][0]["curves"][0]["fill"].push(curve["fill"]); + template[0]["components"][0]["curves"][0]["data_id"].push(curve["data_id"]); + template[0]["components"][0]["curves"][0]["well_names"].push(curve["well_name"]); + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"].push(curve["scale_linear_log_or_yours"]); + template[0]["components"][0]["curves"][0]["line_color"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["max_depth"].push(curve["max_depth"]); + template[0]["components"][0]["curves"][0]["min_depth"].push(curve["min_depth"]); + template[0]["components"][0]["curves"][0]["null_value"].push(curve["null_value"]); + //// + let depth_array = module.exports.createDepthArray(curve["min_depth"], curve["max_depth"], curve["step"]); + let curve_array = curve["curve_values"]; + let curve_name = curve["curve_type"]; + let depth_curve_name = curve["depth_curve_name"]; + //// the function below is off...someting undefined + let obj_starter = [{[depth_curve_name]: depth_array, [curve_name]: curve_array}]; + + let reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter, curve_name, depth_curve_name); + //// + array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); + //// + + all_depths_list = all_depths_list.concat(depth_array); + } + + /// Get array of unique depth values from all curves by calling set on an array of depth values + all_depths_set = [...new Set(all_depths_list)]; + + let objects_helper = {}; + + for (let j = 0; j < all_depths_set.length; j++) { + /// create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] + objects_helper[all_depths_set[j]] = {[template[0]["components"][0]["curves"][0]["depth_curve_name"]]: all_depths_set[j]}; + } + + //// now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} + //// for each curve {"depth":value,"curve_name":value} in each curve array of objects... + /////// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object + for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { + let this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; + for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { + let this_obj = this_depth_plus_curve_obj[l]; + + let curve_name = curve_box_components[0]["curves"][k]["curve_type"]; + let depth_name = curve_box_components[0]["curves"][k]["depth_curve_name"]; + + /// add curve value as key/value pair to right object based on depth key + + objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; + + } + } + + /// get rid of depth key and just have the objects..put in array if not returned as array + //// return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] + let data = Object.keys(objects_helper).map(function (key) { + return objects_helper[key]; + }); + + let depth_name = template[0]["components"][0]["curves"][0]["depth_curve_name"]; + data = data.sort(function (a, b) { + return parseFloat(a.depth_name) - parseFloat(b.depth_name); + }); + + // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) + function sortFloat(a, b) { + return a - b; + } + + function sortNumber(a, b) { + return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); + } + + template[0]["components"][0]["curves"][0]["data"] = data.sort(sortNumber); + return template; + + } + }, + + + /////////////////////////////// + //// Functions that take Wellio.js style JSON and handle everything from transformation to plotting + /////////////////////////////// + + /** + * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! + * @param {*} logs_in_json + * @param {*} div_id + * @param {*} example_template + * @param {*} curve_name + * @param {*} curve_color + * @param {*} curve_unit + * @param {*} fill + * @param {*} depth_name + * @param {*} width + * @param {*} height + */ + putArrayOfLogsIntoSection: function (logs_in_json, div_id, example_template, curve_name, curve_color, curve_unit, fill, depth_name, width, height) { + const noSVG = module.exports.d3.select("#" + div_id).selectAll("svg").remove(); + // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) + let new_templates = []; + for (let i = 0; i < logs_in_json.length; i++) { + let three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i], depth_name); + let new_data = three_things2["well_log_curves_reformatted_for_d3"]; + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = new_data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = [three_things2["uwi"]]; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = [curve_name]; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = [curve_color]; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = [curve_unit]; + example_template_n[0]["components"][0]["curves"][0]["fill"] = [fill]; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_name; + let svg_holder = module.exports.d3.select("#" + div_id).append("div"); + svg_holder.style("vertical-align", "middle") + .attr("id", div_id + "svg_holder" + i) + .style("display", "inline-block"); + example_template_n[0]["curve_box"]["div_id"] = div_id + "svg_holder" + i; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + new_templates.push(example_template_n); + module.exports.curveBox(example_template_n); + } + return new_templates; + }, + + /** + * minimumDataIntoTemplateFunc + * @param + */ + minimumDataIntoTemplateFunc: function (example_template, data, well_names, curve_names, curve_colors, curve_units, fill, div_id, width, height, depth_curve_name) { + //// remember that all curve components should be an array, even if one item! + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = well_names; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = curve_names; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = curve_colors; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = curve_units; + example_template_n[0]["components"][0]["curves"][0]["fill"] = fill; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_curve_name; + example_template_n[0]["curve_box"]["div_id"] = div_id; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + return example_template_n; + }, + + + /////////////////////////////// + //// Actual plotting functions after all the necessary information is compiled in necessary format + /////////////////////////////// + + /** + * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. + * @param {object} well_curve_config_template + * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. + */ + curveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + + ////////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// + //// These parts of the function establish variables from the config JSON in shorter variable names + //// If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined + // default values might be defined here for cases where they are accidentally not defined + + let template_overall = template_for_plotting[0]["curve_box"]; + let template_components = template_for_plotting[0]["components"]; + let template_curves = template_components[0]["curves"][0]; + let template_lines = template_components[0]["lines"]; + let template_rectangles = template_components[0]["rectangles"]; + let title = ""; + //// Determine if title exists for the curve_box. + if (template_overall["show_title"] != "yes") { + let title = ""; + } else { + title = template_overall["title"]["text"]; + } + /// Parameters that define shape & size of overall curve box + let width = template_overall["width"]; + let height_multiplier_components = 0.95; + if (template_overall["height_multiplier_components"]) { + height_multiplier_components = template_overall["height_multiplier_components"]; + } + let height = template_overall["height"] * height_multiplier_components; + let height_components = template_overall["height"]; + let margin = template_overall["margin"]; + let header_sep_svg_or_not = template_overall["header_sep_svg_or_not"]; + let svg_header_height = template_overall["svg_header_height"]; + let gridlines = template_overall["gridlines"]; + let gridlines_color = template_overall["gridlines_color"]; + let gridlines_stroke_width = template_overall["gridlines_stroke_width"]; + //// variables for how to draw mouseover of hover box + let mouseover_yes_or_no = template_overall["mouseover_yes_or_no"]; + let mouseover_depth_or_depth_and_curve = template_overall["mouseover_depth_or_depth_and_curve"]; + let mouseover_curvename = template_overall["mouseover_curvename"]; //// default is first curve + let mouseover_color_or_default_which_is_curve_color = template_overall["mouseover_color_or_default_which_is_curve_color"]; + + let secondary_depth_exist = "no"; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW + + //// Data is in d3.js form. An array of objects consisting of single level key:value pairs + let data = template_curves["data"]; + //// Variables related to curves, these should all be arrays with one or more values! + let curve_names = template_curves["curve_names"]; + let curve_colors = template_curves["curve_colors"]; + let curve_stroke_dasharray = template_curves["curve_stroke_dasharray"]; + let curve_name = curve_names[0]; + let curve_color = curve_colors[0]; + let curve_units = template_curves["curve_units"]; + let scale_linear_log_or_yours = template_curves["scale_linear_log_or_yours"]; + if (template_curves["curve_units"]) { + curve_units = template_curves["curve_units"]; + } else { + curve_units = ""; + } + + //////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON + let flag_for_single_scale_or_independent_scales = template_overall["grouped_or_independent_x_scales"]; + let grouped_or_independent_x_scale = template_overall["grouped_or_independent_x_scales"]; + + + //// The depth_curve_name needs to be the same for all curves plotted! + let depth_curve_name = ""; + if (template_curves["depth_curve_name"].length > 1 && typeof (template_curves["depth_curve_name"]) == "object" && template_curves["depth_curve_name"][0] !== template_curves["depth_curve_name"][1] + ) { + depth_curve_name = "depth_curve_name is not the same in two or more curves"; + } else { + depth_curve_name = template_curves["depth_curve_name"]; + } + let depth_type_string = ""; + if ( + template_curves["depth_type_string"].length > 1 && typeof (template_curves["depth_type_string"]) == "object" && template_curves["depth_type_string"][0] != template_curves["depth_type_string"][1] + ) { + depth_type_string = "depth type string is not the same in two or more curves"; + } else if (template_curves["depth_type_string"][0] == "") { + depth_type_string = ""; + } else if (template_curves["depth_type_string"]) { + depth_type_string = "- " + template_curves["depth_type_string"]; + } + let depth_units_string = ""; + if (template_curves["depth_units_string"] && template_curves["depth_units_string"][0] !== "") { + depth_units_string = "- " + template_curves["depth_units_string"]; + } + + ///// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// + let div_id = template_overall["div_id"]; + if (template_overall["div_id"]) { + div_id = template_overall["div_id"]; + } else { + return "there_was_no_div_id_in_the_template"; + } + + d3.select("#" + div_id).selectAll("*").remove(); + + ///////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// +// //// Calculate depth min and max if depth min and/or max is not given explicitly in the template + let depth_min; + let depth_max; + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["min"] == "autocalculate") { + depth_min = d3.min(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_min = template_curves["depth_limits"][0]["min"]; + } + //// max depth + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["max"] == "autocalculate") { + depth_max = d3.max(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_max = template_curves["depth_limits"][0]["max"]; + } + + + // [depth_max,depth_min] + //// Apply depth min and max to incoming well log data + //// To save time, we'll first check if the first object in the array had as depth that is smaller than min + //// and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. + + if (data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max) { + } else { + data = data.filter(function (objects) { + return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; + }); + } + + // let depth_min = -1000000 + // let depth_max = 1000000 + + if (template_curves["min_depth"][0] == "autocalculate" || template_curves["min_depth"] == "autocalculate") { + depth_min = data[0][depth_curve_name]; + } else { + depth_min = template_curves["min_depth"]; + } + if (template_curves["max_depth"][0] == "autocalculate" || template_curves["max_depth"] == "autocalculate") { + depth_max = data[data.length - 1][depth_curve_name]; + } else { + depth_max = template_curves["max_depth"]; + } + + // let depth_min = template_curves["min_depth"][0] + // let depth_max = template_curves["max_depth"][0] + + ///////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + + ////////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// + let svg = ""; + let svg_holder = ""; + let svg_header = ""; + if (header_sep_svg_or_not == "yes") { + + svg_holder = d3.select("#" + div_id).append("div") + .attr("class", "svg_holder") + .style("overflow-x", "auto"); + + svg_header = d3.select("#" + div_id + " div.svg_holder").append("svg"); + svg_header.attr("class", "header"); + svg_header.attr("width", width) + .attr("height", svg_header_height); ///// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! + svg_header.append("g"); + svg_header.style("display", "block"); + + let depth_string_on_top = ""; + if (depth_type_string == "") { + depth_string_on_top = depth_curve_name; + } else { + depth_string_on_top = depth_type_string.replace("- ", ""); + } + + svg_header.append("text") + .attr("x", (margin.left) / 2) + .attr("y", "1em") + .attr("text-anchor", "middle") + .style("font-size", "10px") + .style("text-decoration", "underline") + .text(depth_curve_name); + if (depth_type_string != "") { + let depth_type_string_x_pos = 0; + let depth_type_string_x_pos_anch = "start"; + if (secondary_depth_exist == "no") { + depth_type_string_x_pos = margin.left / 2; + depth_type_string_x_pos_anch = "middle"; + } + svg_header.append("text") + .attr("x", depth_type_string_x_pos) + .attr("y", "3em") + .attr("text-anchor", depth_type_string_x_pos_anch) + .style("font-size", "8px") + .style("text-decoration", "underline") + .text(depth_string_on_top); + } + + //svg_header.append("text") + // .attr("x", margin.left) + // .attr("y", "4em") + // .attr("text-anchor", "end") + // .style("font-size", "6px") + // .style("text-decoration", "underline") + // .text("2nd TVD"); + + ///////// change this!!!!! + if (title !== "Elephants") { + let distance_from_top = -15; + svg_header.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + const curveBox_main_div = d3.select("#" + div_id).append("div"); + curveBox_main_div + .attr("height", height_components + "px") + .attr("class", "component_outter") + .style("display", "flex") + .style("position", "relative") + .style("box-sizing", "border-box"); + + const curveBox_sub_div = d3.select("#" + div_id + " div.component_outter").append("div"); + curveBox_sub_div + .attr("class", "component_inner") + .style("overflow-y", "auto") + .style("position", "absolute") + .style("max-height", height_components + "px"); + + svg = d3.select("#" + div_id + " div.component_outter div.component_inner").append("svg"); + } else { + svg = d3.select("#" + div_id).append("svg"); + } + + ////////////// Calculate Axis & Scales =>////////////// + //// Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. + //// For zero curves, need to look into rectange and lines for x scales maybe? + //// Need to handle scales in linear, log, or arbitary user-provided scale. + //// Also, need x function for gridlines! so....? + + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let mins = []; + let maxes = []; + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + let min_all_curves = d3.min(mins); + let max_all_curves = d3.max(maxes); + + if (curve_names.length == 0) { + //// THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! + min_all_curves = 0; + max_all_curves = 100; + } + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let x_func; + let x; + let xAxis_header; + let xAxis; + if (flag_for_single_scale_or_independent_scales = "single") { + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + min_all_curves = d3.min(mins); + max_all_curves = d3.max(maxes); + x = d3.scaleLinear().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + xAxis_header = g => g.attr("transform", "translate(0,45)").call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + + + } + + //////////////////// define y scale, aka the one for the depth //////////////////// + let y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom, margin.top]); + //let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + let yAxis2 = g => g.attr("transform", `translate(${margin.left - 35},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + + + ////////////// Building curvebox parts that aren't header. First define size & title =>////////////// + svg.attr("class", "components"); + svg.attr("width", width) + .attr("height", height); + svg.style("margin", "0 auto"); + svg.style("overflow", "scroll"); + + if (header_sep_svg_or_not == "no") { + let xAxis = xAxis_header; + svg.append("g") + .call(xAxis) + .append("text") + .text("test svg"); + } + + let y_axis_text = depth_curve_name + " " + depth_units_string + " " + depth_type_string; + svg.append("g") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("dy", ".75em") + .attr("y", 0 - (margin.left * 0.6)) + .attr("x", ((height) / -2) + margin.top) + .style("text-anchor", "end") + .text(y_axis_text) + .style("fill", "#2b2929"); + + //// + // svg.append("g") + // .call(yAxis2) + // .append("text") + // .attr("transform", "rotate(-90)") + // .attr("dy", ".75em") + // .attr("y", -35) + // .attr("x",((height)/-2)+margin.top) + // .style("text-anchor", "end") + // .text(y_axis_text+"THIS IS THE SECOND ONE") + // .style("fill","#2b2929") + //// + + //svg.append("g") + //// Code that assumes multiple curves are plotted in same curvebox + let distance_from_top = -15; + if (title !== "") { + svg.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + if (gridlines == "yes") { + var gridlines_obj = d3.axisTop() + .ticks((width - margin.left - margin.right) / 25) + .tickFormat("") + .tickSize(-height + margin.top + 10) + .scale(x); + svg.append("g") + .attr("class", "grid") + .call(gridlines_obj) + .style("stroke", gridlines_color) + .style("stroke-width", gridlines_stroke_width); + } + + +// //// This will help save the x axis function for first curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_0 +// //// This will help save the x axis function for second curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_1 +// //// This will help save the x axis function for third curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_2 +// //// This will help save the x axis function for fourth curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_3 + + let x_functions_for_each_curvename = {}; //// populate with {"curvename":curvename,"x_func":func} + + ////////////// Building curves within curvebox =>////////////// + for (let k = 0; k < curve_names.length; k++) { + //// code that creates a line for each Curve in order provided and applies + //// the color in the color array in order provided + + let curveUnit = ""; + if (curve_units[k]) { + curveUnit = curve_units[k]; + } + let min = mins[k]; + let max = maxes[k]; + + let header_text_line = min.toFixed(1) + " - " + curve_names[k] + " " + curveUnit + " - " + max.toFixed(1); + let min_this = d3.min(data, function (d) { + return +d[curve_names[k]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[k]]; + }); + let x = d3.scaleLinear().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + if (k == 0) { + x_func == x; + } + //// This creates an object to hold multiple x axis scale functions + //// that will be used if 'between' style fill is selected. + x_functions_for_each_curvename[curve_names[k]] = x; + + ////////////// Header text, two way depending on =>////////////// + if (header_sep_svg_or_not == "yes") { + let distance_from_top = (1 + (k * 2.7)).toString() + "em"; + svg_header.append("text") + .attr("x", (margin.left + width) / 2) + .attr("y", 0 + distance_from_top) + .attr("text-anchor", "middle") + .style("font-size", "11px") + .style("text-decoration", "underline") + .style("fill", curve_colors[k]) + .text(header_text_line); + let translate_string = "translate(0," + (45 - (30 * k)).toString() + ")"; + xAxis_header = g => g.attr("transform", translate_string).call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + svg_header.append("g") + .call(xAxis_header) + .append("text"); + + } + let another_line = d3.line().x(d => x(d[curve_names[k]])).y(d => y(d[depth_curve_name])); + ////////////// Appends a curve line but doesn't include fill yet =>////////////// + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curve_colors[k]) + .attr("stroke-width", template_curves["stroke_width"][k]) + .attr("stroke-linecap", template_curves["stroke_linecap"][k]) + .attr("stroke-dasharray", curve_stroke_dasharray[k]) + .attr("d", another_line); + } + + + ////////////// define the area filled under the curve =>////////////// + + for (let i = 0; i < template_curves["fill"].length; i++) { + //let i = k + if (template_curves["fill"][i]["fill"] == "yes") { + let number_colors = template_curves["fill"][i]["fill_colors"].length; + let curve_name1 = template_curves["fill"][i]["curve_name"]; + let threshold = -99999999; + let fill_color = "gray"; + for (let j = 0; j < number_colors; j++) { + let area1 = d3.area(); + if (number_colors != 0) { + threshold = template_curves["fill"][i]["cutoffs"][j]; + fill_color = template_curves["fill"][i]["fill_colors"][j]; + } + if (template_curves["fill"][i]["fill_direction"] == "left") { + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => x(d[curve_name1])) + .x0(d => start_from_left) + .defined(d => ((d[curve_name1]) > threshold)) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "right") { + let start_from_right = template_overall["margin"]["right"]; + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => width - start_from_right) + .defined(d => ((d[curve_name1]) > threshold)) + .x0(d => x(d[curve_name1])) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "between") { + let between_2_curve = template_curves["fill"][i]["curve2"]; + //// for through x_functions_for_each_curvename object and find the key that + //// matches between_2_curve which should be a curvename + //// get the x function for the second curve and the curve that is curvenames[k] + let second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; + let first_curve_x_func = x_functions_for_each_curvename[curve_name1]; + area1 + .x1(d => first_curve_x_func(d[curve_name1])) + .x0(d => second_curve_x_func(d[between_2_curve])) + // .defined(d => ((d[curve_name1])<=d[between_2_curve])) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill", fill_color) + .attr("fill-opacity", 0.8); + } + } + } + + //////////////// TOOLTIP Part 1 /////////////////// + if (mouseover_yes_or_no == "no") { + console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); + } else { + //// statements to make sure the mouseover_curvename is a present curve and if not use first curve + if (mouseover_curvename == "default") { + mouseover_curvename = curve_names[0]; + } else if (curve_names.includes(mouseover_curvename)) { + mouseover_curvename = mouseover_curvename; + } else { + mouseover_curvename = curve_names[0]; + } + + //// statement to handle color of curve text and circle on hover + let curve_on_mouseover_color = curve_colors[0]; + if (mouseover_color_or_default_which_is_curve_color != "default") { + curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; + } + + //// appends start of mouseover rectange used for showing hover content + var focus = svg.append("g") + .style("display", "none"); + + var bisectDate = d3.bisector(function (d) { + return d[depth_curve_name]; + }).left; // ** + + //// function called to change hover style & contents when mouseover rectangle appended to svg svg + function mousemove() { + var y0 = y.invert(d3.mouse(this)[1]), + i = bisectDate(data, y0, 1), + d0 = data[i - 1], + d1 = data[i], + d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; + + //// fixed value along y axis + let fixed_x_value = width * 0.8; + + //// depth value + focus.select("text.y2") + .attr("transform", + // "translate(" + x(d[mouseover_curvename]) + "," + + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[depth_curve_name]); + + //// curve value + focus.select("text.y4") + .attr("transform", + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[curve_names[0]]); + + focus.select(".x") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + 0 + + ")") + .attr("y2", height); + //// circle y class part 2 + focus.select(".y") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + focus.select(".yl") + .attr("transform", + "translate(" + 0 + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + } + + // append the x line + focus.append("line") + .attr("class", "x") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("y1", 0) + .attr("y2", width); + + // append the y line + focus.append("line") + .attr("class", "yl") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("x1", 0) + .attr("x2", height); + + // append the circle at the intersection + focus.append("circle") + .attr("class", "y") + .style("fill", "none") + .style("stroke", curve_on_mouseover_color) + .attr("r", 3); + + //// depth value on hover + if (mouseover_depth_or_depth_and_curve == "depth" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y2") + .attr("dx", 6) + .attr("dy", "-.3em") + .style("font-size", "0.55em"); + } + + //// curve value on hover + if (mouseover_depth_or_depth_and_curve == "curve" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y4") + .attr("dx", 1) + .attr("dy", "0.5em") + .style("font-size", "0.55em") + .style("fill", "black") + .style("stroke", curve_on_mouseover_color) + .style("stroke-width", "0.5px"); + } + + // append the rectangle to capture mouse // ********** + svg.append("rect") // ********** + .attr("width", width) // ********** + .attr("height", height) // ********** + .style("fill", "none") // ********** + .style("pointer-events", "all") // ********** + .on("mouseover", function () { + focus.style("display", null); + }) + .on("mouseout", function () { + focus.style("display", "none"); + }) + .on("mousemove", mousemove); // ********** + } + + ////////////// Horizontal Lines AKA tops =>////////////// + try { + for (let i = 0; i < template_lines.length; i++) { + let this_line = template_lines[i]; + svg.append("line") + .attr("x1", 0 + margin.left) + .attr("y1", y(this_line["depth"])) + .attr("x2", width * 0.75) + .attr("y2", y(this_line["depth"])) + .style("stroke-width", this_line["stroke_width"]) + .style("stroke", this_line["color"]) + .style("stroke-dasharray", this_line["stroke-dasharray"]) + .style("stroke-linecap", this_line["stroke_linecap"]) + .style("fill", "none"); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_line["depth"])) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_line["label"]); + } + } catch (err) { + console.log("could not do lines for tops in curveBox function, error: ", err); + } + + ////////////// Rectangles for things like cores & sample locations =>////////////// + try { + for (let i = 0; i < template_rectangles.length; i++) { + let this_rectangle = template_rectangles[i]; + svg.append("rect") + .attr("x", 50 + margin.left) + .attr("y", y(this_rectangle.depth_top)) + .attr("width", this_rectangle.width) + .attr("height", this_rectangle.height) + .style("stroke-width", this_rectangle.stroke_width) + .style("stroke-linecap", this_rectangle.stroke_linecap) + .style("stroke", "purple") + .style("fill", this_rectangle.fill) + .style("opacity", this_rectangle.opacity); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_rectangle.depth_top)) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_rectangle.label); + } + } catch (err) { + console.log("could not do rectangle in curveBox function for some reason. error= ", err); + } + + ////////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// + svg_holder.node(); + svg_header.node(); + return svg.node(); + }, + + + ////////// + /** + * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. + * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to + * @param {object} templates An array of CurveBox input templates + * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! + */ + multipleLogPlot: function (div_id, templates, show_all = true) { + let d3 = module.exports.d3; + let noDIV = d3.select("#" + div_id).selectAll("div").remove(); + let noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let new_templates = []; + for (let i = 0; i < templates.length; i++) { + let curvebox_holder = d3.select("#" + div_id).append("div"); + curvebox_holder.style("vertical-align", "middle") + .attr("id", div_id + "curvebox_holder" + i); + //// to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! + if (show_all) { + curvebox_holder.style("display", "inline-block"); + } else { + curvebox_holder.style("display", "none"); + } + templates[i][0]["curve_box"]["div_id"] = div_id + "curvebox_holder" + i; + new_templates.push(templates[i]); + let template = templates[i]; + let check = module.exports.curveBox(template); + } + return new_templates; + }, + /** + * This function is used to plot a single curveboxe in the div listed in the plotting templates div_id key. + * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. + * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. + * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. + */ + makeThisCurveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + let div_id = template_for_plotting[0]["curve_box"]["div_id"]; + const noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let curve_box_return = module.exports.curveBox(template_for_plotting); + return curve_box_return; + }, + /** + * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. + * In certain environments, this may not work for security reasons. + * @param {string} svgEl An SVG element returned from the curveBox function. + * @param {string} name The name of the file to be downloaded. + */ + saveSvg: function (svgEl, name) { + svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + var svgData = svgEl.outerHTML; + var preface = "\r\n"; + var svgBlob = new Blob([preface, svgData], {type: "image/svg+xml;charset=utf-8"}); + var svgUrl = URL.createObjectURL(svgBlob); + var downloadLink = document.createElement("a"); + downloadLink.href = svgUrl; + downloadLink.download = name; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + }; + + return module.exports; +}); diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted.js b/example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted.js new file mode 100644 index 0000000..fb0d27a --- /dev/null +++ b/example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted.js @@ -0,0 +1,1435 @@ +/* eslint-disable no-else-return */ +/* eslint-disable camelcase */ +/* eslint-disable prefer-arrow-callback */ +/* eslint-disable wrap-iife */ +// eslint-disable-next-line no-unused-expressions +!function (e) { typeof exports === 'object' ? module.exports = e() : typeof define === 'function' && define.amd ? define(e) : typeof window !== 'undefined' ? window.commonJsModule = e() : typeof global !== 'undefined' ? global.commonJsModule = e() : typeof self !== 'undefined' && (self.commonJsModule = e()); }(function () { + let define; let module; let exports; module = { exports: (exports = {}) }; + + // Copyright 2019 Justin Gosses + + // Licensed under the Apache License, Version 2.0 (the "License"); + // you may not use this file except in compliance with the License. + // You may obtain a copy of the License at + // http://www.apache.org/licenses/LICENSE-2.0 + + // Unless required by applicable law or agreed to in writing, software + // distributed under the License is distributed on an "AS IS" BASIS, + // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + // See the License for the specific language governing permissions and + // limitations under the License. + + // /////////////////////////////// + // /** + // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, + // * particularly those already converted to JSON, using the d3.js visualization library." + // * + // * It is designed with a single central function curveBox, that returns SVGs. + // * A variety of helper functions take in differently formatted JSONs of information about the well + // * log curves to plot and how to plot them. + // * + // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. + // * + // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a + // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. + // * + // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, + // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. + // */ + + module.exports = { + /** + * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" + * @returns {obj} It returns the wellio.js object and all its functions as a module. + */ + wellio: require('wellio'), + + /** + * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" + * @returns {obj} It returns the d3.js object and all its functions as a module. + */ + d3: require('d3'), + + /** + * A function that directs users to the docs if they need help. + * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. + */ + help() { + return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; + }, + + + /** + * A function that returns a short description of what the wellioviz library is all about. + * @returns {string} Returns a string that defines wellioviz. + */ + define_wellioviz() { + return 'WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library.'; + }, + // ///////////////////////////// + + /** + * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. + * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. + * This is used to help construct the JSON object that is given to the curveBox plotting function. + * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. + * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" + */ + curveBoxTemplateExamples(string_of_either__help_example_definitions_mandatories) { + const request_string = string_of_either__help_example_definitions_mandatories; + if (request_string == 'help') { + return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; + } + if (request_string === 'example') { + return [{ + curve_box: { + show_well_name: 'yes', // / not built yet + show_depth_type: 'no', // / not built yet + show_curve_units: 'yes', // / not built yet + curve_box_depth_min: -999, // / not built yet + curve_box_depth_max: -999, // / not built yet + take_out_null_or_visualize: 'no', // / not built yet + show_title: 'no', + width: 260, + height: 500, + height_multiplier_components: 2, + margin: { + top: 10, right: 10, bottom: 30, left: 60, + }, + title: { text: '', title_font_size: '10px' }, // / not built yet + div_id: 'well_holder_3', // / Should be skip-able // default=random str? What happens if div doesn't exist? + order_of_component: ['curves', 'rectanges', 'lines'], // / not built yet + lines_connected_across_curveboxes: 'no', // / not built yet + header_sep_svg_or_not: 'yes', + svg_header_height: '4em', + gridlines: 'yes', + gridlines_color: '#D3D3D3', + gridlines_stroke_width: 0.20, + grouped_or_independent_x_scales: 'independent', + // // variables for how to draw mouseover of hover box + mouseover_yes_or_no: 'yes', // // "yes" or "no" + mouseover_depth_or_depth_and_curve: 'depth_and_curve', // / options= "depth_and_curve", "depth", or "curve" + mouseover_curvename: 'default', // // default is first curve + mouseover_color_or_default_which_is_curve_color: 'default', // / default is default, which then uses curve color or black + }, + components: [{ + curves: [ + { + data_type: 'curve', + curve_names: ['RHOB'], + curve_colors: ['black'], + curve_stroke_dasharray: ['solid'], + stroke_linecap: ['butt'], + stroke_width: [1], + fill: [ + { + curve_name: 'RHOB', fill: 'yes', fill_direction: 'left', cutoffs: [0.21, 2.23, 2.24], fill_colors: ['gray', 'beige', 'white'], curve2: '', + }, + ], + curve_units: ['g/cm3'], + depth_limits: [{ min: 'autocalculate', max: 'autocalculate' }], + curve_limits: [{ curve_name: '', min: -10000000, max: 3 }], + data: [{ depth: 1598.3, RHOB: 2.2322 }, { depth: 1598.4, RHOB: 2.0513 }, { depth: 1598.5, RHOB: 2.2548 }, { depth: 1598.6, RHOB: 2.9445 }, { depth: 1598.7, RHOB: 2.2223 }, { depth: 1598.8, RHOB: 2.447 }, { depth: 1598.9, RHOB: 2.598 }, { depth: 1599, RHOB: 2.8088 }, { depth: 1599.1, RHOB: 2.2248 }, { depth: 1599.2, RHOB: 2.2399 }, { depth: 1599.3, RHOB: 2.251 }, { depth: 1599.4, RHOB: 2.255 }, { depth: 1599.5, RHOB: 2.2526 }, { depth: 1599.6, RHOB: 2.2322 }, { depth: 1599.7, RHOB: 2.2513 }, { depth: 1599.8, RHOB: 2.2548 }, { depth: 1599.9, RHOB: 2.2445 }, { depth: 1600, RHOB: 2.2223 }, { depth: 1600.1, RHOB: 2.2047 }, { depth: 1600.2, RHOB: 2.198 }], // / not built yet + depth_curve_name: 'DEPT', // / not built yet + // //// + data_id: ['placeholder_data_id'], // / not built yet + well_names: [''], // / not built yet + scale_linear_log_or_yours: ['linear'], + line_color: ['red'], // / not built yet + max_depth: 'autocalculate', // / not built yet + min_depth: 'autocalculate', // / not built yet + depth_type_string: [''], + depth_units_string: [''], + null_value: [''], // / not built yet + }, + ], + lines: [ + { + data_type: 'line', // / not built yet + label: 'example', // / not built yet + depth: -999, // / not built yet + color: 'red', // / not built yet + stroke_width: '3px', // / not built yet + stroke_style: 'solid', // / not built yet + transparency: 1.0, // / not built yet + stroke_linecap: 'butt', + }, + ], + rectangles: [ + { + data_type: 'rectangle', + depth_top: 0, + x_starting_upper_left_corner: 0, + width: 100, + height: 100, + stroke_width: '2px', + stroke_linecap: 'butt', + fill: 'red', + opacity: 0.5, + label: 'Core Example', // not built into plotting template yet + label_orientation: 'horizontal', // not built into plotting template yet + lable_position: 'right', // not built into plotting template yet + }, + ], + }], + }]; + } + if (request_string === 'defintions') { + return [{ + curve_box: { + show_well_name: "yes or no. If '' is no", // not built yet + show_depth_type: "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + show_curve_units: "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + curve_box_depth_min: 'Should be a number. If string or -999, will be skipped and autocalculate used', // not built yet + curve_box_depth_max: 'Should be a number. If string or -999, will be skipped and autocalculate used', // not built yet + take_out_null_or_visualize: "yes or no. If '' is no", // not built yet + show_title: "yes or no. If '' is no", // not built yet + width: 'number, if blank default is 250', + height: 'number, if blank default is 500', + height_multiplier_components: 'An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.', + margin: ' should be an object like {"top": 10, "right": 10, "bottom": 30, "left": 60} if missing will default to these values', + title: 'object like:{"text": "", "title_font_size": "10px"} if default, an empty string, "" will skill', + div_id: "should be a string that equals a div id like: 'well_holder' Do not include the #", // /What happens if div doesn't exist? + order_of_component: 'Should be an array of strings that correlate to component types like:["curves","rectangles","lines"]', // not built yet + lines_connected_across_curveboxes: "yes or no. If '' is no", // not built yet + header_sep_svg_or_not: "yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", + svg_header_height: 'Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.', + gridlines: "yes or no as strings. Default is 'yes'", + gridlines_color: "Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", + gridlines_stroke_width: 'thickness of the line. Default is 0.20', + grouped_or_independent_x_scales: "independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", + // // variables for how to draw mouseover of hover box + mouseover_yes_or_no: 'yes', // // "yes" or "no" + mouseover_depth_or_depth_and_curve: 'depth_and_curve', // / options= "depth_and_curve", "depth", or "curve" + mouseover_curvename: 'default', // // default is first curve + mouseover_color_or_default_which_is_curve_color: 'default', // / default is default, which then uses curve color or black + }, + components: [{ + curves: [ + { + data_type: 'requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.', // not built yet + curve_names: "array of strings representing curve_names like: ['GR','RESD']", + curve_colors: 'array of strings representing colors using common names or rgb style like:["black","rgb(205,0,0,1)"]', + curve_stroke_dasharray: "A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", + stroke_width: "The width of the curve line. Example is '2px'. ", + stroke_linecap: "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + fill: 'an array of objects one for each curve like: [{"curve_name":"RHOB","fill":"yes","fill_direction":"left","cutoffs":[0.21,2.23,2.24],"fill_colors":["gray","beige","white"],"curve2":""}]', + curve_units: 'an array of strings that are curve units like: ["g/cm2","API",""] must equal length other curve fields', + depth_limits: 'An array of objects that contains the min and max depth for each curve like: [{"min":"autocalculate","max":"autocalculate"}]', + curve_limits: 'An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{"curve_name":"GR","min":0,"max":100},{"curve_name":"PDF","min":0,"max":100}]', + data: 'Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{"UWI":"111aa","DEPTH":4140.5,"GR":0},{"UWI":"111aa","DEPTH":4141,"GR":0}] for the entire depth of the well being showin the curve_box', + depth_curve_name: "A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", + // //// + data_id: ['array of strings whose length must equal curve_units, curve_names, etc.'], // not built yet + well_names: 'An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.', // not built yet /// + scale_linear_log_or_yours: "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", + + // //// Plotting things but need to be next to curve data or will be too confusing. + line_color: "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", + max_depth: "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", + min_depth: "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", + depth_type_string: "All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", + depth_units_string: 'units of depth, examples are meters,m., cm., feet, etc.', + null_value: "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']", + }, + ], + lines: [ + { + data_type: 'must be string, will be ignored if not "line", "curve", or "rectangle"', + label: 'The label for horiztonal line in string form', + depth: 'number for the depth at which the line is placed', + color: "string for the color of the line in common color name or RGB format. If '' then black will be used.", + stroke_width: "A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", + stroke_style: 'Should be string, if not or doesnt exist will be treated as "solid"', + stroke_width: "The width of the line. Example is '2px'. ", + stroke_linecap: "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + transparency: 'Should be float between 0.0 and 1.0. Otherwise default is 1.0.', + }, + ], + rectangles: [ + { + data_type: 'rectangle', + depth_top: 'A number for the depth of the upper left corner of the rectangle', // + x_starting_upper_left_corner: 'A number for the x axis value of the upper left corner of the rectangle', + width: 'Width of rectangle as number', + height: 'Height of rectangle as number', + stroke_width: "The width of the line. Example is '2px'. ", + stroke_linecap: "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + fill: "String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", + opacity: 'Float between 0 and 1 that represents the opacity of the fill, default is 0.5', + label: "String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet + label_orientation: "A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet + lable_position: 'Exceptable strings are top, center, right, left, bottom. Default right.', // not built into plotting template yet + }, + ], + }], + }]; + } else if (request_string === 'mandatories') { + return [ + 'This is not yet populated!!!!', + ]; + } + }, + + /** + * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. + * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. + * It is used next by funtion ____ and ___. + * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. + */ + getFakeIncomingSparseDataExample() { + input_sparse_style = [{ + single_curve_box_or_cross_section: 'single', + cross_section_title: '', + width: 1040, // / not skippable, check if number // default if blank or missing =250 or autocalculate? + height: 500, // / not skippable, check if number // default if blank or missing=500 + // ////////////////////////// + curve_boxes: [{ + curve_box: { + show_well_name: 'yes', // not built yet /// Should be skip-able /// default=No + show_depth_type: 'no', // not built yet /// Should be skip-able /// default=No + show_curve_units: 'yes', // not built yet /// Should be skip-able /// default=No + curve_box_depth_min: -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + curve_box_depth_max: -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + take_out_null_or_visualize: 'no', // not built yet /// Should be skip-able /// default=No + show_title: 'no', // not built into plotting template yet /// Should be skip-able /// default=No + width: 260, // / not skippable, check if number // default if blank or missing =250 + height: 500, // / not skippable, check if number // default if blank or missing=500 + height_multiplier_components: 3, // default if missing is 0.95 + margin: { + top: 50, right: 10, bottom: 30, left: 60, + }, // / not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. + title: { text: '', title_font_size: '10px' }, // / Should be skip-able // default=skip + div_id: 'well_holder4', // / Should be skip-able // default=random str? What happens if div doesn't exist? + order_of_component: ['curves', 'rectangles', 'lines'], // not built yet, default is curve, then line, then rectangle + lines_connected_across_curve_boxes: 'no', // not built yet, default is skip function + header_sep_svg_or_not: 'yes', + svg_header_height: '4em', + gridlines: 'yes', + gridlines_color: '#D3D3D3', + gridlines_stroke_width: 0.20, + grouped_or_independent_x_scales: 'independent', + // // variables for how to draw mouseover of hover box + mouseover_yes_or_no: 'yes', // // "yes" or "no" + mouseover_depth_or_depth_and_curve: 'depth_and_curve', // / options= "depth_and_curve", "depth", or "curve" + mouseover_curvename: 'default', // // default is first curve + mouseover_color_or_default_which_is_curve_color: 'default', // / default is default, which then uses curve color or black + + }, + components: [{ + curves: [ + { + data_type: 'curve', // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. + data_id: 'placeholder_data_id', // not built yet /// can be anything, just used for tracking & is optional + well_name: '', // not built yet /// Ideally string. Will skip function if "" + curve_type: 'RHOB', // should be string. name of curve + curve_values: [ + 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], // / Should be array. If not array, return error message? + step: 0.1, // / Should be number. If not array, return error message? + units: 'g/cc', // / should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. + scale_linear_log_or_yours: 'linear', + // //// Plotting things but need to be next to curve data or will be too confusing. + line_color: 'rgb(205,0,0,1)', // / Test for string, if string use. If not string "black" + curve_stroke_dasharray: '5,5', + stroke_linecap: 'butt', + stroke_width: 0.5, + fill: { + curve_name: 'RHOB', fill: 'yes', fill_direction: 'left', cutoffs: [0.21, 2.23, 2.24], fill_colors: ['gray', 'beige', 'white'], curve2: '', + }, + data_ID: '', + max_depth: '1607.3', // / should be number, if not number or doens't exit then "autocalculate" + min_depth: '1598.3', // / should be number, if not number or doens't exit then "autocalculate" + depth_type_string: 'TVDSS', // / should be string, if not or doesn't exist, then skip func + depth_units_string: 'md', + depth_curve_name: 'DEPTH', // / should be string, ideally all depth curve names are the same + null_value: '', // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. + x_max: 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + x_min: 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + }, + ], + lines: [ + { + data_type: 'line', // / must be string, will be ignored if not "line", "curve", or "rectangle". + label: 'top 1', // / Ideally a string. + depth: 1601.4, // / Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + color: 'blue', // / should be string, if not or doesn't exist use "black" + stroke_width: '3px', // / should be string, if not or doesn't exist use "1px" + stroke_linecap: 'butt', + stroke_style: 'solid', // / should be string, if not or doesn't exist use "solid" + transparency: 1.0, // / should be number between 0 and 1, if not or doesn't exist use 1. + }, + { + data_type: 'line', // / must be string, will be ignored if not "line", "curve", or "rectangle". + label: 'top 2', // / Ideally a string. + depth: 1602.4, // / Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + color: 'orange', // / should be string, if not or doesn't exist use "black" + stroke_width: '5px', // / should be string, if not or doesn't exist use "1px" + stroke_linecap: 'butt', + stroke_style: 'solid', // / should be string, if not or doesn't exist use "solid" + transparency: 0.5, // / should be number between 0 and 1, if not or doesn't exist use 1. + }, + ], + rectangles: [ + { + data_type: 'rectangle', + depth_top: 1601, + x_starting_upper_left_corner: 0, + width: 100, + height: 100, + stroke_width: '2px', + stroke_linecap: 'butt', + fill: 'red', + opacity: 0.5, + label: 'Core Example', // not built into plotting template yet + label_orientation: 'horizontal', // not built into plotting template yet + lable_position: 'right', // not built into plotting template yet + }, + ], + }], + }], + }]; + // eslint-disable-next-line camelcase + return input_sparse_style; + }, + + // ///////////////////////////// + // // Functions for getting data from LAS files and reformatting to a wellio.js style JSON. + // ///////////////////////////// + + /** + * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {object} well_log_json a full wellio style JSON + * @param {array} CurveNames array of curve names as strings + * @param {string} UWI a string the represents the well name + * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. + */ + convertWellJSONToObj(well_log_json, CurveNames, UWI, depth_curve_name) { + const depth = well_log_json.CURVES[depth_curve_name]; + const curve_data = []; + for (const eachCr in CurveNames) { + curve_data.push(well_log_json.CURVES[CurveNames[eachCr]]); + } + const array_of_obj = []; + if (depth.length === well_log_json.CURVES[CurveNames[0]].length) { + for (let eachPt = 0; eachPt < depth.length; eachPt++) { + const obj = {}; + obj.UWI = UWI; + for (let i = 0; i < CurveNames.length; i++) { + obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); + } + array_of_obj.push(obj); + } + } else { + console.log("depth didn't match curve length"); + array_of_obj.push("depth didn't match curve length"); + } + return array_of_obj; + }, + + + // ///////////////////////////// + // // Functions for getting basic information out of wellio.js style JSON for plotting + // ///////////////////////////// + + // ///// this require wellio! + // fileToJSON:function (afile){ + // return module.exports.wellio.las2json(afile) + // }, + // /////// + // turnFilesIntoTextIntoWellioJSON:function (files_array){ + // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + // let logs_in_json = [] + // for (let i = 0; i < files_array.length; i++) { + // logs_in_json.push(module.exports.fileToJSON(files_array[i])) + // } + // return logs_in_json + // }, + + + /** + * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, + * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. + * the data array of objects that D3.js likes for data used in plotting. + * @param {object} jsonWell a full wellio style JSON + * @param {string} depth_curve_name String for the depth curve name + * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} + */ + fromJSONofWEllGetThingsForPlotting(jsonWell, depth_curve_name) { + curve_names = Object.keys(jsonWell.CURVES); + uwi = jsonWell['WELL INFORMATION BLOCK'].UWI.DATA; + depth_curve_name = depth_curve_name; + well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell, curve_names, uwi, depth_curve_name); + return { well_log_curves_reformatted_for_d3, curve_names, uwi }; + }, + + + // ///////////////////////////// + // // Functions for reformatting data other than wellio.js style JSON + // ///////////////////////////// + + + /** + * createDepthArray is a function that takes in a min float, max float, and step float value. + * and returns an array or depth values from the min to the max value going by the step value each step. + * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. + * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. + * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. + * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. + * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] + */ + createDepthArray(min, max, step) { + // // Returns an array of depth values from min to max, including both, with each being different by step value + // // ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) + const depth = []; + min = parseFloat(min); + max = parseFloat(max); + step = parseFloat(step); + const number_of_points = ((max - min) / step) + 1; + let temp_depth = min; + for (let i = 0; i < number_of_points; i++) { + temp_depth = (min + (i * step)).toFixed(7); + depth.push(parseFloat(temp_depth)); + } + return depth; + }, + + + /** + * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. +* THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! +*/ + takeInArraysAndGetObjectOfCurveDataForPlotting(arraysOfCurvesAndNames, CurveName, DepthName) { + // // would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") + // [{"depth":[],"curveData":[]}] + // [{"depth":[],"curveData":[]}] + const curveObj = []; + // make sure the curve data arrays are the same lenght, if not add null values + + // put them into object + const lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; + for (let i = 0; i < lengthOfCurve0; i++) { + const newObj = { [DepthName]: 0, RHOB: 0 }; + newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; + newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; + curveObj.push(newObj); + } + return curveObj; + }, + + + /** + * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. + * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. + * @param {string} UWI A string for the well log UWI ID + * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data + * @returns {array} An array of objects properly formatted for next step ___. + */ + convertWellJSONToObjV2(depth, curve_data, UWI, CurveNames) { + depth = depth[0]; + array_of_obj = []; + for (eachPt in depth) { + obj = {}; + obj.UWI = UWI; + for (i in CurveNames) { + obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); + obj.DEPTH = parseFloat(depth[eachPt]); + } + array_of_obj.push(obj); + } + return array_of_obj; + }, + + + // ///////////////////////////// + // // Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. + // ///////////////////////////// + + /** + * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. + * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. + * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. + */ + putIncomingSparseJsonIntoPlottingTemplate(incoming_sparse, template) { + if (incoming_sparse[0].single_curve_box_or_cross_section === 'multiple') { + console.log('THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE '); + return 'THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE'; + } + + const curve_box_obj = incoming_sparse[0].curve_boxes[0]; + const curve_box_overall = incoming_sparse[0].curve_boxes[0].curve_box; + const curve_box_components = incoming_sparse[0].curve_boxes[0].components; + template[0].curve_box = curve_box_overall; + template[0].components[0].lines = curve_box_components[0].lines; + template[0].components[0].rectangles = curve_box_components[0].rectangles; + + // /// Establish template with empty arrays except for value that are shared for all curves + // /// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX + template[0].components[0].curves[0].data_type = 'curve'; + template[0].components[0].curves[0].depth_type_string = curve_box_components[0].curves[0].depth_type_string; + template[0].components[0].curves[0].depth_units_string = curve_box_components[0].curves[0].depth_units_string; + template[0].components[0].curves[0].depth_curve_name = curve_box_components[0].curves[0].depth_curve_name; + // /// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. + template[0].components[0].curves[0].curve_names = []; + template[0].components[0].curves[0].curve_colors = []; + template[0].components[0].curves[0].curve_stroke_dasharray = []; + template[0].components[0].curves[0].stroke_width = []; + template[0].components[0].curves[0].stroke_linecap = []; + template[0].components[0].curves[0].fill = []; + template[0].components[0].curves[0].data_id = []; + template[0].components[0].curves[0].well_names = []; + template[0].components[0].curves[0].scale_linear_log_or_yours = []; + template[0].components[0].curves[0].line_color = []; + template[0].components[0].curves[0].max_depth = []; + template[0].components[0].curves[0].min_depth = []; + template[0].components[0].curves[0].null_value = []; + + template[0].components[0].curves[0].data = []; + + // /// For each curve object in incoming data: + const array_individual_curves_and_depth_objects = []; + let all_depths_list = []; + let all_depths_set = []; + + for (let i = 0; i < curve_box_components[0].curves.length; i++) { + const curve = curve_box_components[0].curves[i]; + template[0].components[0].curves[0].curve_names.push(curve.curve_type); + template[0].components[0].curves[0].curve_colors.push(curve.line_color); + template[0].components[0].curves[0].curve_stroke_dasharray.push(curve.curve_stroke_dasharray); + template[0].components[0].curves[0].stroke_width.push(curve.stroke_width); + template[0].components[0].curves[0].stroke_linecap.push(curve.stroke_linecap); + template[0].components[0].curves[0].fill.push(curve.fill); + template[0].components[0].curves[0].data_id.push(curve.data_id); + template[0].components[0].curves[0].well_names.push(curve.well_name); + template[0].components[0].curves[0].scale_linear_log_or_yours.push(curve.scale_linear_log_or_yours); + template[0].components[0].curves[0].line_color.push(curve.line_color); + template[0].components[0].curves[0].max_depth.push(curve.max_depth); + template[0].components[0].curves[0].min_depth.push(curve.min_depth); + template[0].components[0].curves[0].null_value.push(curve.null_value); + // // + const depth_array = module.exports.createDepthArray(curve.min_depth, curve.max_depth, curve.step); + const curve_array = curve.curve_values; + const curve_name = curve.curve_type; + const { depth_curve_name } = curve; + // // the function below is off...someting undefined + const obj_starter = [{ [depth_curve_name]: depth_array, [curve_name]: curve_array }]; + + const reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter, curve_name, depth_curve_name); + // // + array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); + // // + + all_depths_list = all_depths_list.concat(depth_array); + } + + // / Get array of unique depth values from all curves by calling set on an array of depth values + all_depths_set = [...new Set(all_depths_list)]; + + const objects_helper = {}; + + for (let j = 0; j < all_depths_set.length; j++) { + // / create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] + objects_helper[all_depths_set[j]] = { [template[0].components[0].curves[0].depth_curve_name]: all_depths_set[j] }; + } + + // // now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} + // // for each curve {"depth":value,"curve_name":value} in each curve array of objects... + // ///// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object + for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { + const this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; + for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { + const this_obj = this_depth_plus_curve_obj[l]; + + const curve_name = curve_box_components[0].curves[k].curve_type; + const depth_name = curve_box_components[0].curves[k].depth_curve_name; + + // / add curve value as key/value pair to right object based on depth key + + objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; + } + } + + // / get rid of depth key and just have the objects..put in array if not returned as array + // // return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] + let data = Object.keys(objects_helper).map(function (key) { return objects_helper[key]; }); + + const depth_name = template[0].components[0].curves[0].depth_curve_name; + data = data.sort(function (a, b) { + return parseFloat(a.depth_name) - parseFloat(b.depth_name); + }); + // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) + function sortFloat(a, b) { return a - b; } + function sortNumber(a, b) { + return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); + } + template[0].components[0].curves[0].data = data.sort(sortNumber); + return template; + }, + + + // ///////////////////////////// + // // Functions that take Wellio.js style JSON and handle everything from transformation to plotting + // ///////////////////////////// + + /** + * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! + * @param {*} logs_in_json + * @param {*} div_id + * @param {*} example_template + * @param {*} curve_name + * @param {*} curve_color + * @param {*} curve_unit + * @param {*} fill + * @param {*} depth_name + * @param {*} width + * @param {*} height + */ + putArrayOfLogsIntoSection(logs_in_json, div_id, example_template, curve_name, curve_color, curve_unit, fill, depth_name, width, height) { + const noSVG = module.exports.d3.select(`#${div_id}`).selectAll('svg').remove(); + // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) + const new_templates = []; + for (let i = 0; i < logs_in_json.length; i++) { + const three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i], depth_name); + const new_data = three_things2.well_log_curves_reformatted_for_d3; + const example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0].components[0].curves[0].data = new_data; + example_template_n[0].components[0].curves[0].well_names = [three_things2.uwi]; + example_template_n[0].components[0].curves[0].curve_names = [curve_name]; + example_template_n[0].components[0].curves[0].curve_colors = [curve_color]; + example_template_n[0].components[0].curves[0].curve_units = [curve_unit]; + example_template_n[0].components[0].curves[0].fill = [fill]; + example_template_n[0].components[0].curves[0].depth_curve_name = depth_name; + const svg_holder = module.exports.d3.select(`#${div_id}`).append('div'); + svg_holder.style('vertical-align', 'middle') + .attr('id', `${div_id}svg_holder${i}`) + .style('display', 'inline-block'); + example_template_n[0].curve_box.div_id = `${div_id}svg_holder${i}`; + example_template_n[0].curve_box.width = width; + example_template_n[0].curve_box.height = height; + new_templates.push(example_template_n); + module.exports.curveBox(example_template_n); + } + return new_templates; + }, + + /** + * minimumDataIntoTemplateFunc + * @param + */ + minimumDataIntoTemplateFunc(example_template, data, well_names, curve_names, curve_colors, curve_units, fill, div_id, width, height, depth_curve_name) { + // // remember that all curve components should be an array, even if one item! + const example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0].components[0].curves[0].data = data; + example_template_n[0].components[0].curves[0].well_names = well_names; + example_template_n[0].components[0].curves[0].curve_names = curve_names; + example_template_n[0].components[0].curves[0].curve_colors = curve_colors; + example_template_n[0].components[0].curves[0].curve_units = curve_units; + example_template_n[0].components[0].curves[0].fill = fill; + example_template_n[0].components[0].curves[0].depth_curve_name = depth_curve_name; + example_template_n[0].curve_box.div_id = div_id; + example_template_n[0].curve_box.width = width; + example_template_n[0].curve_box.height = height; + return example_template_n; + }, + + + // ///////////////////////////// + // // Actual plotting functions after all the necessary information is compiled in necessary format + // ///////////////////////////// + + /** + * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. + * @param {object} well_curve_config_template + * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. + */ + curveBox(template_for_plotting) { + const { d3 } = module.exports; + + // //////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// + // // These parts of the function establish variables from the config JSON in shorter variable names + // // If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined + // default values might be defined here for cases where they are accidentally not defined + + const template_overall = template_for_plotting[0].curve_box; + const template_components = template_for_plotting[0].components; + const template_curves = template_components[0].curves[0]; + const template_lines = template_components[0].lines; + const template_rectangles = template_components[0].rectangles; + let title = ''; + // // Determine if title exists for the curve_box. + if (template_overall.show_title != 'yes') { const title = ''; } else { title = template_overall.title.text; } + // / Parameters that define shape & size of overall curve box + const { width } = template_overall; + let height_multiplier_components = 0.95; + if (template_overall.height_multiplier_components) { + height_multiplier_components = template_overall.height_multiplier_components; + } + const height = template_overall.height * height_multiplier_components; + const height_components = template_overall.height; + const { margin } = template_overall; + const { header_sep_svg_or_not } = template_overall; + const { svg_header_height } = template_overall; + const { gridlines } = template_overall; + const { gridlines_color } = template_overall; + const { gridlines_stroke_width } = template_overall; + // // variables for how to draw mouseover of hover box + const { mouseover_yes_or_no } = template_overall; + const { mouseover_depth_or_depth_and_curve } = template_overall; + let { mouseover_curvename } = template_overall; // // default is first curve + const { mouseover_color_or_default_which_is_curve_color } = template_overall; + + const secondary_depth_exist = 'no'; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW + + // // Data is in d3.js form. An array of objects consisting of single level key:value pairs + let { data } = template_curves; + // // Variables related to curves, these should all be arrays with one or more values! + const { curve_names } = template_curves; + const { curve_colors } = template_curves; + const { curve_stroke_dasharray } = template_curves; + const curve_name = curve_names[0]; + const curve_color = curve_colors[0]; + let { curve_units } = template_curves; + const { scale_linear_log_or_yours } = template_curves; + if (template_curves.curve_units) { curve_units = template_curves.curve_units; } else { curve_units = ''; } + + // ////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON + let flag_for_single_scale_or_independent_scales = template_overall.grouped_or_independent_x_scales; + const grouped_or_independent_x_scale = template_overall.grouped_or_independent_x_scales; + + + // // The depth_curve_name needs to be the same for all curves plotted! + let depth_curve_name = ''; + if (template_curves.depth_curve_name.length > 1 && typeof (template_curves.depth_curve_name) === 'object' && template_curves.depth_curve_name[0] !== template_curves.depth_curve_name[1] + ) { + depth_curve_name = 'depth_curve_name is not the same in two or more curves'; + } else { + depth_curve_name = template_curves.depth_curve_name; + } + let depth_type_string = ''; + if ( + template_curves.depth_type_string.length > 1 && typeof (template_curves.depth_type_string) === 'object' && template_curves.depth_type_string[0] != template_curves.depth_type_string[1] + ) { + depth_type_string = 'depth type string is not the same in two or more curves'; + } else if (template_curves.depth_type_string[0] === '') { depth_type_string = ''; } else if (template_curves.depth_type_string) { depth_type_string = `- ${template_curves.depth_type_string}`; } + let depth_units_string = ''; + if (template_curves.depth_units_string && template_curves.depth_units_string[0] !== '') { + depth_units_string = `- ${template_curves.depth_units_string}`; + } + + // /// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// + let { div_id } = template_overall; + if (template_overall.div_id) { div_id = template_overall.div_id; } else { return 'there_was_no_div_id_in_the_template'; } + + d3.select(`#${div_id}`).selectAll('*').remove(); + + // /////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + // //// Calculate depth min and max if depth min and/or max is not given explicitly in the template + let depth_min; + let depth_max; + if (!template_curves.depth_limits || template_curves.depth_limits[0].min === 'autocalculate') { depth_min = d3.min(data, function (d) { return +d[depth_curve_name]; }); } else { depth_min = template_curves.depth_limits[0].min; } + // // max depth + if (!template_curves.depth_limits || template_curves.depth_limits[0].max === 'autocalculate') { depth_max = d3.max(data, function (d) { return +d[depth_curve_name]; }); } else { depth_max = template_curves.depth_limits[0].max; } + + + // [depth_max,depth_min] + // // Apply depth min and max to incoming well log data + // // To save time, we'll first check if the first object in the array had as depth that is smaller than min + // // and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. + + if (data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max) {} else { + data = data.filter(function (objects) { + return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; + }); + } + + // let depth_min = -1000000 + // let depth_max = 1000000 + + if (template_curves.min_depth[0] == 'autocalculate' || template_curves.min_depth === 'autocalculate') { + depth_min = data[0][depth_curve_name]; + } else { depth_min = template_curves.min_depth; } + if (template_curves.max_depth[0] == 'autocalculate' || template_curves.max_depth === 'autocalculate') { + depth_max = data[data.length - 1][depth_curve_name]; + } else { depth_max = template_curves.max_depth; } + + // let depth_min = template_curves["min_depth"][0] + // let depth_max = template_curves["max_depth"][0] + + // /////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + + // //////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// + let svg = ''; + let svg_holder = ''; + let svg_header = ''; + if (header_sep_svg_or_not == 'yes') { + svg_holder = d3.select(`#${div_id}`).append('div') + .attr('class', 'svg_holder') + .style('overflow-x', 'auto'); + + svg_header = d3.select(`#${div_id} div.svg_holder`).append('svg'); + svg_header.attr('class', 'header'); + svg_header.attr('width', width) + .attr('height', svg_header_height); // /// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! + svg_header.append('g'); + svg_header.style('display', 'block'); + + let depth_string_on_top = ''; + if (depth_type_string === '') { + depth_string_on_top = depth_curve_name; + } else { depth_string_on_top = depth_type_string.replace('- ', ''); } + + svg_header.append('text') + .attr('x', (margin.left) / 2) + .attr('y', '1em') + .attr('text-anchor', 'middle') + .style('font-size', '10px') + .style('text-decoration', 'underline') + .text(depth_curve_name); + if (depth_type_string != '') { + let depth_type_string_x_pos = 0; + let depth_type_string_x_pos_anch = 'start'; + if (secondary_depth_exist === 'no') { + depth_type_string_x_pos = margin.left / 2; + depth_type_string_x_pos_anch = 'middle'; + } + svg_header.append('text') + .attr('x', depth_type_string_x_pos) + .attr('y', '3em') + .attr('text-anchor', depth_type_string_x_pos_anch) + .style('font-size', '8px') + .style('text-decoration', 'underline') + .text(depth_string_on_top); + } + + // svg_header.append("text") + // .attr("x", margin.left) + // .attr("y", "4em") + // .attr("text-anchor", "end") + // .style("font-size", "6px") + // .style("text-decoration", "underline") + // .text("2nd TVD"); + + // /////// change this!!!!! + if (title !== 'Elephants') { + const distance_from_top = -15; + svg_header.append('text') // + .attr('x', (margin.left / 3 + (width / 2))) + .attr('y', 0 + (-distance_from_top)) + .attr('text-anchor', 'middle') + .style('font-size', template_overall.title.title_font_size) + .text(title); + } + + const curveBox_main_div = d3.select(`#${div_id}`).append('div'); + curveBox_main_div + .attr('height', `${height_components}px`) + .attr('class', 'component_outter') + .style('display', 'flex') + .style('position', 'relative') + .style('box-sizing', 'border-box'); + + const curveBox_sub_div = d3.select(`#${div_id} div.component_outter`).append('div'); + curveBox_sub_div + .attr('class', 'component_inner') + .style('overflow-y', 'auto') + .style('position', 'absolute') + .style('max-height', `${height_components}px`); + + svg = d3.select(`#${div_id} div.component_outter div.component_inner`).append('svg'); + } else { + svg = d3.select(`#${div_id}`).append('svg'); + } + + // //////////// Calculate Axis & Scales =>////////////// + // // Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. + // // For zero curves, need to look into rectange and lines for x scales maybe? + // // Need to handle scales in linear, log, or arbitary user-provided scale. + // // Also, need x function for gridlines! so....? + + // //////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + const mins = []; + const maxes = []; + for (let i = 0; i < curve_names.length; i++) { + const min_this = d3.min(data, function (d) { return +d[curve_names[i]]; }); + const max_this = d3.max(data, function (d) { return +d[curve_names[i]]; }); + mins.push(min_this); + maxes.push(max_this); + } + let min_all_curves = d3.min(mins); + let max_all_curves = d3.max(maxes); + + if (curve_names.length === 0) { + // // THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! + min_all_curves = 0; + max_all_curves = 100; + } + // //////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let x_func; + let x; + let xAxis_header; + let xAxis; + if (flag_for_single_scale_or_independent_scales = 'single') { + for (let i = 0; i < curve_names.length; i++) { + const min_this = d3.min(data, function (d) { return +d[curve_names[i]]; }); + const max_this = d3.max(data, function (d) { return +d[curve_names[i]]; }); + mins.push(min_this); + maxes.push(max_this); + } + min_all_curves = d3.min(mins); + max_all_curves = d3.max(maxes); + x = d3.scaleLinear().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours === 'log') { + x = d3.scaleLog().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours === 'linear') {} else if (typeof (scale_linear_log_or_yours) !== 'string') { + x = scale_linear_log_or_yours.yours; + } + xAxis_header = (g) => g.attr('transform', 'translate(0,45)').call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + } + + // ////////////////// define y scale, aka the one for the depth //////////////////// + const y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom, margin.top]); + // let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + const yAxis = (g) => g.attr('transform', `translate(${margin.left},0)`).call(d3.axisLeft(y)).call((g) => g.select('.domain')); + const yAxis2 = (g) => g.attr('transform', `translate(${margin.left - 35},0)`).call(d3.axisLeft(y)).call((g) => g.select('.domain')); + + + // //////////// Building curvebox parts that aren't header. First define size & title =>////////////// + svg.attr('class', 'components'); + svg.attr('width', width) + .attr('height', height); + svg.style('margin', '0 auto'); + svg.style('overflow', 'scroll'); + + if (header_sep_svg_or_not === 'no') { + const xAxis = xAxis_header; + svg.append('g') + .call(xAxis) + .append('text') + .text('test svg'); + } + + const y_axis_text = `${depth_curve_name} ${depth_units_string} ${depth_type_string}`; + svg.append('g') + .call(yAxis) + .append('text') + .attr('transform', 'rotate(-90)') + .attr('dy', '.75em') + .attr('y', 0 - (margin.left * 0.6)) + .attr('x', ((height) / -2) + margin.top) + .style('text-anchor', 'end') + .text(y_axis_text) + .style('fill', '#2b2929'); + + // // + // svg.append("g") + // .call(yAxis2) + // .append("text") + // .attr("transform", "rotate(-90)") + // .attr("dy", ".75em") + // .attr("y", -35) + // .attr("x",((height)/-2)+margin.top) + // .style("text-anchor", "end") + // .text(y_axis_text+"THIS IS THE SECOND ONE") + // .style("fill","#2b2929") + // // + + // svg.append("g") + // // Code that assumes multiple curves are plotted in same curvebox + const distance_from_top = -15; + if (title !== '') { + svg.append('text') // + .attr('x', (margin.left / 3 + (width / 2))) + .attr('y', 0 + (-distance_from_top)) + .attr('text-anchor', 'middle') + .style('font-size', template_overall.title.title_font_size) + .text(title); + } + + if (gridlines === 'yes') { + const gridlines_obj = d3.axisTop() + .ticks((width - margin.left - margin.right) / 25) + .tickFormat('') + .tickSize(-height + margin.top + 10) + .scale(x); + svg.append('g') + .attr('class', 'grid') + .call(gridlines_obj) + .style('stroke', gridlines_color) + .style('stroke-width', gridlines_stroke_width); + } + + + // //// This will help save the x axis function for first curve if there are more than one curve + // /// and they are at different scales. We need this in order to use the 'between' method of fill! + // let x_for_k_is_0 + // //// This will help save the x axis function for second curve if there are more than one curve + // /// and they are at different scales. We need this in order to use the 'between' method of fill! + // let x_for_k_is_1 + // //// This will help save the x axis function for third curve if there are more than one curve + // /// and they are at different scales. We need this in order to use the 'between' method of fill! + // let x_for_k_is_2 + // //// This will help save the x axis function for fourth curve if there are more than one curve + // /// and they are at different scales. We need this in order to use the 'between' method of fill! + // let x_for_k_is_3 + + const x_functions_for_each_curvename = {}; // // populate with {"curvename":curvename,"x_func":func} + + // //////////// Building curves within curvebox =>////////////// + for (let k = 0; k < curve_names.length; k++) { + // // code that creates a line for each Curve in order provided and applies + // // the color in the color array in order provided + + let curveUnit = ''; + if (curve_units[k]) { curveUnit = curve_units[k]; } + const min = mins[k]; + const max = maxes[k]; + + const header_text_line = `${min.toFixed(1)} - ${curve_names[k]} ${curveUnit} - ${max.toFixed(1)}`; + const min_this = d3.min(data, function (d) { return +d[curve_names[k]]; }); + const max_this = d3.max(data, function (d) { return +d[curve_names[k]]; }); + let x = d3.scaleLinear().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours === 'log') { + x = d3.scaleLog().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours === 'linear') {} else if (typeof (scale_linear_log_or_yours) !== 'string') { + x = scale_linear_log_or_yours.yours; + } + if (k == 0) { + x_func === x; + } + // // This creates an object to hold multiple x axis scale functions + // // that will be used if 'between' style fill is selected. + x_functions_for_each_curvename[curve_names[k]] = x; + + // //////////// Header text, two way depending on =>////////////// + if (header_sep_svg_or_not === 'yes') { + const distance_from_top = `${(1 + (k * 2.7)).toString()}em`; + svg_header.append('text') + .attr('x', (margin.left + width) / 2) + .attr('y', 0 + distance_from_top) + .attr('text-anchor', 'middle') + .style('font-size', '11px') + .style('text-decoration', 'underline') + .style('fill', curve_colors[k]) + .text(header_text_line); + const translate_string = `translate(0,${(45 - (30 * k)).toString()})`; + xAxis_header = (g) => g.attr('transform', translate_string).call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + svg_header.append('g') + .call(xAxis_header) + .append('text'); + } + const another_line = d3.line().x((d) => x(d[curve_names[k]])).y((d) => y(d[depth_curve_name])); + // //////////// Appends a curve line but doesn't include fill yet =>////////////// + svg.append('path') + .datum(data) + .attr('fill', 'none') + .attr('stroke', curve_colors[k]) + .attr('stroke-width', template_curves.stroke_width[k]) + .attr('stroke-linecap', template_curves.stroke_linecap[k]) + .attr('stroke-dasharray', curve_stroke_dasharray[k]) + .attr('d', another_line); + } + + + // //////////// define the area filled under the curve =>////////////// + + for (let i = 0; i < template_curves.fill.length; i++) { + // let i = k + if (template_curves.fill[i].fill === 'yes') { + const number_colors = template_curves.fill[i].fill_colors.length; + const curve_name1 = template_curves.fill[i].curve_name; + let threshold = -99999999; + let fill_color = 'gray'; + for (let j = 0; j < number_colors; j++) { + const area1 = d3.area(); + if (number_colors != 0) { + threshold = template_curves.fill[i].cutoffs[j]; + fill_color = template_curves.fill[i].fill_colors[j]; + } + if (template_curves.fill[i].fill_direction === 'left') { + const start_from_left = template_overall.margin.left; + area1 + .x1((d) => x(d[curve_name1])) + .x0((d) => start_from_left) + .defined((d) => ((d[curve_name1]) > threshold)) + .y((d) => y(d[depth_curve_name])); + } + if (template_curves.fill[i].fill_direction === 'right') { + const start_from_right = template_overall.margin.right; + const start_from_left = template_overall.margin.left; + area1 + .x1((d) => width - start_from_right) + .defined((d) => ((d[curve_name1]) > threshold)) + .x0((d) => x(d[curve_name1])) + .y((d) => y(d[depth_curve_name])); + } + if (template_curves.fill[i].fill_direction === 'between') { + const between_2_curve = template_curves.fill[i].curve2; + // // for through x_functions_for_each_curvename object and find the key that + // // matches between_2_curve which should be a curvename + // // get the x function for the second curve and the curve that is curvenames[k] + const second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; + const first_curve_x_func = x_functions_for_each_curvename[curve_name1]; + area1 + .x1((d) => first_curve_x_func(d[curve_name1])) + .x0((d) => second_curve_x_func(d[between_2_curve])) + // .defined(d => ((d[curve_name1])<=d[between_2_curve])) + .y((d) => y(d[depth_curve_name])); + } + svg.append('path') + .datum(data) + .attr('class', 'area') + .attr('d', area1) + .attr('stroke', 'none') + .attr('fill', fill_color) + .attr('fill-opacity', 0.8); + } + } + } + + // ////////////// TOOLTIP Part 1 /////////////////// + if (mouseover_yes_or_no === 'no') { + console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); + } else { + // // statements to make sure the mouseover_curvename is a present curve and if not use first curve + if (mouseover_curvename === 'default') { mouseover_curvename = curve_names[0]; } else if (curve_names.includes(mouseover_curvename)) { mouseover_curvename = mouseover_curvename; } else { mouseover_curvename = curve_names[0]; } + + // // statement to handle color of curve text and circle on hover + let curve_on_mouseover_color = curve_colors[0]; + if (mouseover_color_or_default_which_is_curve_color != 'default') { + curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; + } + + // // appends start of mouseover rectange used for showing hover content + const focus = svg.append('g') + .style('display', 'none'); + + const bisectDate = d3.bisector(function (d) { return d[depth_curve_name]; }).left; // ** + + // // function called to change hover style & contents when mouseover rectangle appended to svg svg + function mousemove() { + const y0 = y.invert(d3.mouse(this)[1]); + const i = bisectDate(data, y0, 1); + const d0 = data[i - 1]; + const d1 = data[i]; + const d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; + + // // fixed value along y axis + const fixed_x_value = width * 0.8; + + // // depth value + focus.select('text.y2') + .attr('transform', + // "translate(" + x(d[mouseover_curvename]) + "," + + `translate(${fixed_x_value},${ + y(d[depth_curve_name])})`) + .text(d[depth_curve_name]); + + // // curve value + focus.select('text.y4') + .attr('transform', + `translate(${fixed_x_value},${ + y(d[depth_curve_name])})`) + .text(d[curve_names[0]]); + + focus.select('.x') + .attr('transform', + `translate(${x(d[mouseover_curvename])},${0 + })`) + .attr('y2', height); + // // circle y class part 2 + focus.select('.y') + .attr('transform', + `translate(${x(d[mouseover_curvename])},${ + y(d[depth_curve_name])})`) + .text(d[mouseover_curvename]); + focus.select('.yl') + .attr('transform', + `translate(${0},${ + y(d[depth_curve_name])})`) + .text(d[mouseover_curvename]); + } + // append the x line + focus.append('line') + .attr('class', 'x') + .style('stroke', 'blue') + .style('stroke-dasharray', '3,3') + .style('opacity', 0.5) + .attr('y1', 0) + .attr('y2', width); + + // append the y line + focus.append('line') + .attr('class', 'yl') + .style('stroke', 'blue') + .style('stroke-dasharray', '3,3') + .style('opacity', 0.5) + .attr('x1', 0) + .attr('x2', height); + + // append the circle at the intersection + focus.append('circle') + .attr('class', 'y') + .style('fill', 'none') + .style('stroke', curve_on_mouseover_color) + .attr('r', 3); + + // // depth value on hover + if (mouseover_depth_or_depth_and_curve === 'depth' || mouseover_depth_or_depth_and_curve === 'depth_and_curve') { + focus.append('text') + .attr('class', 'y2') + .attr('dx', 6) + .attr('dy', '-.3em') + .style('font-size', '0.55em'); + } + + // // curve value on hover + if (mouseover_depth_or_depth_and_curve === 'curve' || mouseover_depth_or_depth_and_curve === 'depth_and_curve') { + focus.append('text') + .attr('class', 'y4') + .attr('dx', 1) + .attr('dy', '0.5em') + .style('font-size', '0.55em') + .style('fill', 'black') + .style('stroke', curve_on_mouseover_color) + .style('stroke-width', '0.5px'); + } + + // append the rectangle to capture mouse // ********** + svg.append('rect') // ********** + .attr('width', width) // ********** + .attr('height', height) // ********** + .style('fill', 'none') // ********** + .style('pointer-events', 'all') // ********** + .on('mouseover', function () { focus.style('display', null); }) + .on('mouseout', function () { focus.style('display', 'none'); }) + .on('mousemove', mousemove); // ********** + } + + // //////////// Horizontal Lines AKA tops =>////////////// + try { + for (let i = 0; i < template_lines.length; i++) { + const this_line = template_lines[i]; + svg.append('line') + .attr('x1', 0 + margin.left) + .attr('y1', y(this_line.depth)) + .attr('x2', width * 0.75) + .attr('y2', y(this_line.depth)) + .style('stroke-width', this_line.stroke_width) + .style('stroke', this_line.color) + .style('stroke-dasharray', this_line['stroke-dasharray']) + .style('stroke-linecap', this_line.stroke_linecap) + .style('fill', 'none'); + + svg.append('text') + .attr('x', width * 0.75) + .attr('y', y(this_line.depth)) + .attr('text-anchor', 'start') + .style('font-size', '12px') + .text(this_line.label); + } + } catch (err) { + console.log('could not do lines for tops in curveBox function, error: ', err); + } + + // //////////// Rectangles for things like cores & sample locations =>////////////// + try { + for (let i = 0; i < template_rectangles.length; i++) { + const this_rectangle = template_rectangles[i]; + svg.append('rect') + .attr('x', 50 + margin.left) + .attr('y', y(this_rectangle.depth_top)) + .attr('width', this_rectangle.width) + .attr('height', this_rectangle.height) + .style('stroke-width', this_rectangle.stroke_width) + .style('stroke-linecap', this_rectangle.stroke_linecap) + .style('stroke', 'purple') + .style('fill', this_rectangle.fill) + .style('opacity', this_rectangle.opacity); + + svg.append('text') + .attr('x', width * 0.75) + .attr('y', y(this_rectangle.depth_top)) + .attr('text-anchor', 'start') + .style('font-size', '12px') + .text(this_rectangle.label); + } + } catch (err) { + console.log('could not do rectangle in curveBox function for some reason. error= ', err); + } + + // //////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// + svg_holder.node(); + svg_header.node(); + return svg.node(); + }, + + + // //////// + /** + * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. + * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to + * @param {object} templates An array of CurveBox input templates + * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! + */ + multipleLogPlot(div_id, templates, show_all = true) { + const { d3 } = module.exports; + const noDIV = d3.select(`#${div_id}`).selectAll('div').remove(); + const noSVG = d3.select(`#${div_id}`).selectAll('svg').remove(); + const new_templates = []; + for (let i = 0; i < templates.length; i++) { + const curvebox_holder = d3.select(`#${div_id}`).append('div'); + curvebox_holder.style('vertical-align', 'middle') + .attr('id', `${div_id}curvebox_holder${i}`); + // // to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! + if (show_all) { + curvebox_holder.style('display', 'inline-block'); + } else { + curvebox_holder.style('display', 'none'); + } + templates[i][0].curve_box.div_id = `${div_id}curvebox_holder${i}`; + new_templates.push(templates[i]); + const template = templates[i]; + const check = module.exports.curveBox(template); + } + return new_templates; + }, + /** + * This function is used to plot a single curveboxe in the div listed in the plotting templates div_id key. + * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. + * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. + * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. + */ + makeThisCurveBox(template_for_plotting) { + const { d3 } = module.exports; + const { div_id } = template_for_plotting[0].curve_box; + const noSVG = d3.select(`#${div_id}`).selectAll('svg').remove(); + const curve_box_return = module.exports.curveBox(template_for_plotting); + return curve_box_return; + }, + /** + * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. + * In certain environments, this may not work for security reasons. + * @param {string} svgEl An SVG element returned from the curveBox function. + * @param {string} name The name of the file to be downloaded. + */ + saveSvg(svgEl, name) { + svgEl.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); + const svgData = svgEl.outerHTML; + const preface = '\r\n'; + const svgBlob = new Blob([preface, svgData], { type: 'image/svg+xml;charset=utf-8' }); + const svgUrl = URL.createObjectURL(svgBlob); + const downloadLink = document.createElement('a'); + downloadLink.href = svgUrl; + downloadLink.download = name; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + }, + }; + + return module.exports; +}); diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted2.js b/example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted2.js new file mode 100644 index 0000000..fb0d27a --- /dev/null +++ b/example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted2.js @@ -0,0 +1,1435 @@ +/* eslint-disable no-else-return */ +/* eslint-disable camelcase */ +/* eslint-disable prefer-arrow-callback */ +/* eslint-disable wrap-iife */ +// eslint-disable-next-line no-unused-expressions +!function (e) { typeof exports === 'object' ? module.exports = e() : typeof define === 'function' && define.amd ? define(e) : typeof window !== 'undefined' ? window.commonJsModule = e() : typeof global !== 'undefined' ? global.commonJsModule = e() : typeof self !== 'undefined' && (self.commonJsModule = e()); }(function () { + let define; let module; let exports; module = { exports: (exports = {}) }; + + // Copyright 2019 Justin Gosses + + // Licensed under the Apache License, Version 2.0 (the "License"); + // you may not use this file except in compliance with the License. + // You may obtain a copy of the License at + // http://www.apache.org/licenses/LICENSE-2.0 + + // Unless required by applicable law or agreed to in writing, software + // distributed under the License is distributed on an "AS IS" BASIS, + // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + // See the License for the specific language governing permissions and + // limitations under the License. + + // /////////////////////////////// + // /** + // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, + // * particularly those already converted to JSON, using the d3.js visualization library." + // * + // * It is designed with a single central function curveBox, that returns SVGs. + // * A variety of helper functions take in differently formatted JSONs of information about the well + // * log curves to plot and how to plot them. + // * + // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. + // * + // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a + // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. + // * + // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, + // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. + // */ + + module.exports = { + /** + * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" + * @returns {obj} It returns the wellio.js object and all its functions as a module. + */ + wellio: require('wellio'), + + /** + * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" + * @returns {obj} It returns the d3.js object and all its functions as a module. + */ + d3: require('d3'), + + /** + * A function that directs users to the docs if they need help. + * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. + */ + help() { + return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; + }, + + + /** + * A function that returns a short description of what the wellioviz library is all about. + * @returns {string} Returns a string that defines wellioviz. + */ + define_wellioviz() { + return 'WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library.'; + }, + // ///////////////////////////// + + /** + * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. + * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. + * This is used to help construct the JSON object that is given to the curveBox plotting function. + * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. + * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" + */ + curveBoxTemplateExamples(string_of_either__help_example_definitions_mandatories) { + const request_string = string_of_either__help_example_definitions_mandatories; + if (request_string == 'help') { + return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; + } + if (request_string === 'example') { + return [{ + curve_box: { + show_well_name: 'yes', // / not built yet + show_depth_type: 'no', // / not built yet + show_curve_units: 'yes', // / not built yet + curve_box_depth_min: -999, // / not built yet + curve_box_depth_max: -999, // / not built yet + take_out_null_or_visualize: 'no', // / not built yet + show_title: 'no', + width: 260, + height: 500, + height_multiplier_components: 2, + margin: { + top: 10, right: 10, bottom: 30, left: 60, + }, + title: { text: '', title_font_size: '10px' }, // / not built yet + div_id: 'well_holder_3', // / Should be skip-able // default=random str? What happens if div doesn't exist? + order_of_component: ['curves', 'rectanges', 'lines'], // / not built yet + lines_connected_across_curveboxes: 'no', // / not built yet + header_sep_svg_or_not: 'yes', + svg_header_height: '4em', + gridlines: 'yes', + gridlines_color: '#D3D3D3', + gridlines_stroke_width: 0.20, + grouped_or_independent_x_scales: 'independent', + // // variables for how to draw mouseover of hover box + mouseover_yes_or_no: 'yes', // // "yes" or "no" + mouseover_depth_or_depth_and_curve: 'depth_and_curve', // / options= "depth_and_curve", "depth", or "curve" + mouseover_curvename: 'default', // // default is first curve + mouseover_color_or_default_which_is_curve_color: 'default', // / default is default, which then uses curve color or black + }, + components: [{ + curves: [ + { + data_type: 'curve', + curve_names: ['RHOB'], + curve_colors: ['black'], + curve_stroke_dasharray: ['solid'], + stroke_linecap: ['butt'], + stroke_width: [1], + fill: [ + { + curve_name: 'RHOB', fill: 'yes', fill_direction: 'left', cutoffs: [0.21, 2.23, 2.24], fill_colors: ['gray', 'beige', 'white'], curve2: '', + }, + ], + curve_units: ['g/cm3'], + depth_limits: [{ min: 'autocalculate', max: 'autocalculate' }], + curve_limits: [{ curve_name: '', min: -10000000, max: 3 }], + data: [{ depth: 1598.3, RHOB: 2.2322 }, { depth: 1598.4, RHOB: 2.0513 }, { depth: 1598.5, RHOB: 2.2548 }, { depth: 1598.6, RHOB: 2.9445 }, { depth: 1598.7, RHOB: 2.2223 }, { depth: 1598.8, RHOB: 2.447 }, { depth: 1598.9, RHOB: 2.598 }, { depth: 1599, RHOB: 2.8088 }, { depth: 1599.1, RHOB: 2.2248 }, { depth: 1599.2, RHOB: 2.2399 }, { depth: 1599.3, RHOB: 2.251 }, { depth: 1599.4, RHOB: 2.255 }, { depth: 1599.5, RHOB: 2.2526 }, { depth: 1599.6, RHOB: 2.2322 }, { depth: 1599.7, RHOB: 2.2513 }, { depth: 1599.8, RHOB: 2.2548 }, { depth: 1599.9, RHOB: 2.2445 }, { depth: 1600, RHOB: 2.2223 }, { depth: 1600.1, RHOB: 2.2047 }, { depth: 1600.2, RHOB: 2.198 }], // / not built yet + depth_curve_name: 'DEPT', // / not built yet + // //// + data_id: ['placeholder_data_id'], // / not built yet + well_names: [''], // / not built yet + scale_linear_log_or_yours: ['linear'], + line_color: ['red'], // / not built yet + max_depth: 'autocalculate', // / not built yet + min_depth: 'autocalculate', // / not built yet + depth_type_string: [''], + depth_units_string: [''], + null_value: [''], // / not built yet + }, + ], + lines: [ + { + data_type: 'line', // / not built yet + label: 'example', // / not built yet + depth: -999, // / not built yet + color: 'red', // / not built yet + stroke_width: '3px', // / not built yet + stroke_style: 'solid', // / not built yet + transparency: 1.0, // / not built yet + stroke_linecap: 'butt', + }, + ], + rectangles: [ + { + data_type: 'rectangle', + depth_top: 0, + x_starting_upper_left_corner: 0, + width: 100, + height: 100, + stroke_width: '2px', + stroke_linecap: 'butt', + fill: 'red', + opacity: 0.5, + label: 'Core Example', // not built into plotting template yet + label_orientation: 'horizontal', // not built into plotting template yet + lable_position: 'right', // not built into plotting template yet + }, + ], + }], + }]; + } + if (request_string === 'defintions') { + return [{ + curve_box: { + show_well_name: "yes or no. If '' is no", // not built yet + show_depth_type: "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + show_curve_units: "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + curve_box_depth_min: 'Should be a number. If string or -999, will be skipped and autocalculate used', // not built yet + curve_box_depth_max: 'Should be a number. If string or -999, will be skipped and autocalculate used', // not built yet + take_out_null_or_visualize: "yes or no. If '' is no", // not built yet + show_title: "yes or no. If '' is no", // not built yet + width: 'number, if blank default is 250', + height: 'number, if blank default is 500', + height_multiplier_components: 'An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.', + margin: ' should be an object like {"top": 10, "right": 10, "bottom": 30, "left": 60} if missing will default to these values', + title: 'object like:{"text": "", "title_font_size": "10px"} if default, an empty string, "" will skill', + div_id: "should be a string that equals a div id like: 'well_holder' Do not include the #", // /What happens if div doesn't exist? + order_of_component: 'Should be an array of strings that correlate to component types like:["curves","rectangles","lines"]', // not built yet + lines_connected_across_curveboxes: "yes or no. If '' is no", // not built yet + header_sep_svg_or_not: "yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", + svg_header_height: 'Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.', + gridlines: "yes or no as strings. Default is 'yes'", + gridlines_color: "Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", + gridlines_stroke_width: 'thickness of the line. Default is 0.20', + grouped_or_independent_x_scales: "independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", + // // variables for how to draw mouseover of hover box + mouseover_yes_or_no: 'yes', // // "yes" or "no" + mouseover_depth_or_depth_and_curve: 'depth_and_curve', // / options= "depth_and_curve", "depth", or "curve" + mouseover_curvename: 'default', // // default is first curve + mouseover_color_or_default_which_is_curve_color: 'default', // / default is default, which then uses curve color or black + }, + components: [{ + curves: [ + { + data_type: 'requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.', // not built yet + curve_names: "array of strings representing curve_names like: ['GR','RESD']", + curve_colors: 'array of strings representing colors using common names or rgb style like:["black","rgb(205,0,0,1)"]', + curve_stroke_dasharray: "A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", + stroke_width: "The width of the curve line. Example is '2px'. ", + stroke_linecap: "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + fill: 'an array of objects one for each curve like: [{"curve_name":"RHOB","fill":"yes","fill_direction":"left","cutoffs":[0.21,2.23,2.24],"fill_colors":["gray","beige","white"],"curve2":""}]', + curve_units: 'an array of strings that are curve units like: ["g/cm2","API",""] must equal length other curve fields', + depth_limits: 'An array of objects that contains the min and max depth for each curve like: [{"min":"autocalculate","max":"autocalculate"}]', + curve_limits: 'An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{"curve_name":"GR","min":0,"max":100},{"curve_name":"PDF","min":0,"max":100}]', + data: 'Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{"UWI":"111aa","DEPTH":4140.5,"GR":0},{"UWI":"111aa","DEPTH":4141,"GR":0}] for the entire depth of the well being showin the curve_box', + depth_curve_name: "A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", + // //// + data_id: ['array of strings whose length must equal curve_units, curve_names, etc.'], // not built yet + well_names: 'An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.', // not built yet /// + scale_linear_log_or_yours: "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", + + // //// Plotting things but need to be next to curve data or will be too confusing. + line_color: "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", + max_depth: "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", + min_depth: "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", + depth_type_string: "All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", + depth_units_string: 'units of depth, examples are meters,m., cm., feet, etc.', + null_value: "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']", + }, + ], + lines: [ + { + data_type: 'must be string, will be ignored if not "line", "curve", or "rectangle"', + label: 'The label for horiztonal line in string form', + depth: 'number for the depth at which the line is placed', + color: "string for the color of the line in common color name or RGB format. If '' then black will be used.", + stroke_width: "A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", + stroke_style: 'Should be string, if not or doesnt exist will be treated as "solid"', + stroke_width: "The width of the line. Example is '2px'. ", + stroke_linecap: "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + transparency: 'Should be float between 0.0 and 1.0. Otherwise default is 1.0.', + }, + ], + rectangles: [ + { + data_type: 'rectangle', + depth_top: 'A number for the depth of the upper left corner of the rectangle', // + x_starting_upper_left_corner: 'A number for the x axis value of the upper left corner of the rectangle', + width: 'Width of rectangle as number', + height: 'Height of rectangle as number', + stroke_width: "The width of the line. Example is '2px'. ", + stroke_linecap: "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + fill: "String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", + opacity: 'Float between 0 and 1 that represents the opacity of the fill, default is 0.5', + label: "String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet + label_orientation: "A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet + lable_position: 'Exceptable strings are top, center, right, left, bottom. Default right.', // not built into plotting template yet + }, + ], + }], + }]; + } else if (request_string === 'mandatories') { + return [ + 'This is not yet populated!!!!', + ]; + } + }, + + /** + * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. + * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. + * It is used next by funtion ____ and ___. + * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. + */ + getFakeIncomingSparseDataExample() { + input_sparse_style = [{ + single_curve_box_or_cross_section: 'single', + cross_section_title: '', + width: 1040, // / not skippable, check if number // default if blank or missing =250 or autocalculate? + height: 500, // / not skippable, check if number // default if blank or missing=500 + // ////////////////////////// + curve_boxes: [{ + curve_box: { + show_well_name: 'yes', // not built yet /// Should be skip-able /// default=No + show_depth_type: 'no', // not built yet /// Should be skip-able /// default=No + show_curve_units: 'yes', // not built yet /// Should be skip-able /// default=No + curve_box_depth_min: -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + curve_box_depth_max: -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + take_out_null_or_visualize: 'no', // not built yet /// Should be skip-able /// default=No + show_title: 'no', // not built into plotting template yet /// Should be skip-able /// default=No + width: 260, // / not skippable, check if number // default if blank or missing =250 + height: 500, // / not skippable, check if number // default if blank or missing=500 + height_multiplier_components: 3, // default if missing is 0.95 + margin: { + top: 50, right: 10, bottom: 30, left: 60, + }, // / not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. + title: { text: '', title_font_size: '10px' }, // / Should be skip-able // default=skip + div_id: 'well_holder4', // / Should be skip-able // default=random str? What happens if div doesn't exist? + order_of_component: ['curves', 'rectangles', 'lines'], // not built yet, default is curve, then line, then rectangle + lines_connected_across_curve_boxes: 'no', // not built yet, default is skip function + header_sep_svg_or_not: 'yes', + svg_header_height: '4em', + gridlines: 'yes', + gridlines_color: '#D3D3D3', + gridlines_stroke_width: 0.20, + grouped_or_independent_x_scales: 'independent', + // // variables for how to draw mouseover of hover box + mouseover_yes_or_no: 'yes', // // "yes" or "no" + mouseover_depth_or_depth_and_curve: 'depth_and_curve', // / options= "depth_and_curve", "depth", or "curve" + mouseover_curvename: 'default', // // default is first curve + mouseover_color_or_default_which_is_curve_color: 'default', // / default is default, which then uses curve color or black + + }, + components: [{ + curves: [ + { + data_type: 'curve', // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. + data_id: 'placeholder_data_id', // not built yet /// can be anything, just used for tracking & is optional + well_name: '', // not built yet /// Ideally string. Will skip function if "" + curve_type: 'RHOB', // should be string. name of curve + curve_values: [ + 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], // / Should be array. If not array, return error message? + step: 0.1, // / Should be number. If not array, return error message? + units: 'g/cc', // / should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. + scale_linear_log_or_yours: 'linear', + // //// Plotting things but need to be next to curve data or will be too confusing. + line_color: 'rgb(205,0,0,1)', // / Test for string, if string use. If not string "black" + curve_stroke_dasharray: '5,5', + stroke_linecap: 'butt', + stroke_width: 0.5, + fill: { + curve_name: 'RHOB', fill: 'yes', fill_direction: 'left', cutoffs: [0.21, 2.23, 2.24], fill_colors: ['gray', 'beige', 'white'], curve2: '', + }, + data_ID: '', + max_depth: '1607.3', // / should be number, if not number or doens't exit then "autocalculate" + min_depth: '1598.3', // / should be number, if not number or doens't exit then "autocalculate" + depth_type_string: 'TVDSS', // / should be string, if not or doesn't exist, then skip func + depth_units_string: 'md', + depth_curve_name: 'DEPTH', // / should be string, ideally all depth curve names are the same + null_value: '', // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. + x_max: 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + x_min: 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + }, + ], + lines: [ + { + data_type: 'line', // / must be string, will be ignored if not "line", "curve", or "rectangle". + label: 'top 1', // / Ideally a string. + depth: 1601.4, // / Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + color: 'blue', // / should be string, if not or doesn't exist use "black" + stroke_width: '3px', // / should be string, if not or doesn't exist use "1px" + stroke_linecap: 'butt', + stroke_style: 'solid', // / should be string, if not or doesn't exist use "solid" + transparency: 1.0, // / should be number between 0 and 1, if not or doesn't exist use 1. + }, + { + data_type: 'line', // / must be string, will be ignored if not "line", "curve", or "rectangle". + label: 'top 2', // / Ideally a string. + depth: 1602.4, // / Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + color: 'orange', // / should be string, if not or doesn't exist use "black" + stroke_width: '5px', // / should be string, if not or doesn't exist use "1px" + stroke_linecap: 'butt', + stroke_style: 'solid', // / should be string, if not or doesn't exist use "solid" + transparency: 0.5, // / should be number between 0 and 1, if not or doesn't exist use 1. + }, + ], + rectangles: [ + { + data_type: 'rectangle', + depth_top: 1601, + x_starting_upper_left_corner: 0, + width: 100, + height: 100, + stroke_width: '2px', + stroke_linecap: 'butt', + fill: 'red', + opacity: 0.5, + label: 'Core Example', // not built into plotting template yet + label_orientation: 'horizontal', // not built into plotting template yet + lable_position: 'right', // not built into plotting template yet + }, + ], + }], + }], + }]; + // eslint-disable-next-line camelcase + return input_sparse_style; + }, + + // ///////////////////////////// + // // Functions for getting data from LAS files and reformatting to a wellio.js style JSON. + // ///////////////////////////// + + /** + * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {object} well_log_json a full wellio style JSON + * @param {array} CurveNames array of curve names as strings + * @param {string} UWI a string the represents the well name + * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. + */ + convertWellJSONToObj(well_log_json, CurveNames, UWI, depth_curve_name) { + const depth = well_log_json.CURVES[depth_curve_name]; + const curve_data = []; + for (const eachCr in CurveNames) { + curve_data.push(well_log_json.CURVES[CurveNames[eachCr]]); + } + const array_of_obj = []; + if (depth.length === well_log_json.CURVES[CurveNames[0]].length) { + for (let eachPt = 0; eachPt < depth.length; eachPt++) { + const obj = {}; + obj.UWI = UWI; + for (let i = 0; i < CurveNames.length; i++) { + obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); + } + array_of_obj.push(obj); + } + } else { + console.log("depth didn't match curve length"); + array_of_obj.push("depth didn't match curve length"); + } + return array_of_obj; + }, + + + // ///////////////////////////// + // // Functions for getting basic information out of wellio.js style JSON for plotting + // ///////////////////////////// + + // ///// this require wellio! + // fileToJSON:function (afile){ + // return module.exports.wellio.las2json(afile) + // }, + // /////// + // turnFilesIntoTextIntoWellioJSON:function (files_array){ + // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + // let logs_in_json = [] + // for (let i = 0; i < files_array.length; i++) { + // logs_in_json.push(module.exports.fileToJSON(files_array[i])) + // } + // return logs_in_json + // }, + + + /** + * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, + * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. + * the data array of objects that D3.js likes for data used in plotting. + * @param {object} jsonWell a full wellio style JSON + * @param {string} depth_curve_name String for the depth curve name + * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} + */ + fromJSONofWEllGetThingsForPlotting(jsonWell, depth_curve_name) { + curve_names = Object.keys(jsonWell.CURVES); + uwi = jsonWell['WELL INFORMATION BLOCK'].UWI.DATA; + depth_curve_name = depth_curve_name; + well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell, curve_names, uwi, depth_curve_name); + return { well_log_curves_reformatted_for_d3, curve_names, uwi }; + }, + + + // ///////////////////////////// + // // Functions for reformatting data other than wellio.js style JSON + // ///////////////////////////// + + + /** + * createDepthArray is a function that takes in a min float, max float, and step float value. + * and returns an array or depth values from the min to the max value going by the step value each step. + * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. + * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. + * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. + * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. + * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] + */ + createDepthArray(min, max, step) { + // // Returns an array of depth values from min to max, including both, with each being different by step value + // // ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) + const depth = []; + min = parseFloat(min); + max = parseFloat(max); + step = parseFloat(step); + const number_of_points = ((max - min) / step) + 1; + let temp_depth = min; + for (let i = 0; i < number_of_points; i++) { + temp_depth = (min + (i * step)).toFixed(7); + depth.push(parseFloat(temp_depth)); + } + return depth; + }, + + + /** + * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. +* THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! +*/ + takeInArraysAndGetObjectOfCurveDataForPlotting(arraysOfCurvesAndNames, CurveName, DepthName) { + // // would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") + // [{"depth":[],"curveData":[]}] + // [{"depth":[],"curveData":[]}] + const curveObj = []; + // make sure the curve data arrays are the same lenght, if not add null values + + // put them into object + const lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; + for (let i = 0; i < lengthOfCurve0; i++) { + const newObj = { [DepthName]: 0, RHOB: 0 }; + newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; + newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; + curveObj.push(newObj); + } + return curveObj; + }, + + + /** + * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. + * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. + * @param {string} UWI A string for the well log UWI ID + * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data + * @returns {array} An array of objects properly formatted for next step ___. + */ + convertWellJSONToObjV2(depth, curve_data, UWI, CurveNames) { + depth = depth[0]; + array_of_obj = []; + for (eachPt in depth) { + obj = {}; + obj.UWI = UWI; + for (i in CurveNames) { + obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); + obj.DEPTH = parseFloat(depth[eachPt]); + } + array_of_obj.push(obj); + } + return array_of_obj; + }, + + + // ///////////////////////////// + // // Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. + // ///////////////////////////// + + /** + * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. + * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. + * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. + */ + putIncomingSparseJsonIntoPlottingTemplate(incoming_sparse, template) { + if (incoming_sparse[0].single_curve_box_or_cross_section === 'multiple') { + console.log('THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE '); + return 'THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE'; + } + + const curve_box_obj = incoming_sparse[0].curve_boxes[0]; + const curve_box_overall = incoming_sparse[0].curve_boxes[0].curve_box; + const curve_box_components = incoming_sparse[0].curve_boxes[0].components; + template[0].curve_box = curve_box_overall; + template[0].components[0].lines = curve_box_components[0].lines; + template[0].components[0].rectangles = curve_box_components[0].rectangles; + + // /// Establish template with empty arrays except for value that are shared for all curves + // /// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX + template[0].components[0].curves[0].data_type = 'curve'; + template[0].components[0].curves[0].depth_type_string = curve_box_components[0].curves[0].depth_type_string; + template[0].components[0].curves[0].depth_units_string = curve_box_components[0].curves[0].depth_units_string; + template[0].components[0].curves[0].depth_curve_name = curve_box_components[0].curves[0].depth_curve_name; + // /// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. + template[0].components[0].curves[0].curve_names = []; + template[0].components[0].curves[0].curve_colors = []; + template[0].components[0].curves[0].curve_stroke_dasharray = []; + template[0].components[0].curves[0].stroke_width = []; + template[0].components[0].curves[0].stroke_linecap = []; + template[0].components[0].curves[0].fill = []; + template[0].components[0].curves[0].data_id = []; + template[0].components[0].curves[0].well_names = []; + template[0].components[0].curves[0].scale_linear_log_or_yours = []; + template[0].components[0].curves[0].line_color = []; + template[0].components[0].curves[0].max_depth = []; + template[0].components[0].curves[0].min_depth = []; + template[0].components[0].curves[0].null_value = []; + + template[0].components[0].curves[0].data = []; + + // /// For each curve object in incoming data: + const array_individual_curves_and_depth_objects = []; + let all_depths_list = []; + let all_depths_set = []; + + for (let i = 0; i < curve_box_components[0].curves.length; i++) { + const curve = curve_box_components[0].curves[i]; + template[0].components[0].curves[0].curve_names.push(curve.curve_type); + template[0].components[0].curves[0].curve_colors.push(curve.line_color); + template[0].components[0].curves[0].curve_stroke_dasharray.push(curve.curve_stroke_dasharray); + template[0].components[0].curves[0].stroke_width.push(curve.stroke_width); + template[0].components[0].curves[0].stroke_linecap.push(curve.stroke_linecap); + template[0].components[0].curves[0].fill.push(curve.fill); + template[0].components[0].curves[0].data_id.push(curve.data_id); + template[0].components[0].curves[0].well_names.push(curve.well_name); + template[0].components[0].curves[0].scale_linear_log_or_yours.push(curve.scale_linear_log_or_yours); + template[0].components[0].curves[0].line_color.push(curve.line_color); + template[0].components[0].curves[0].max_depth.push(curve.max_depth); + template[0].components[0].curves[0].min_depth.push(curve.min_depth); + template[0].components[0].curves[0].null_value.push(curve.null_value); + // // + const depth_array = module.exports.createDepthArray(curve.min_depth, curve.max_depth, curve.step); + const curve_array = curve.curve_values; + const curve_name = curve.curve_type; + const { depth_curve_name } = curve; + // // the function below is off...someting undefined + const obj_starter = [{ [depth_curve_name]: depth_array, [curve_name]: curve_array }]; + + const reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter, curve_name, depth_curve_name); + // // + array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); + // // + + all_depths_list = all_depths_list.concat(depth_array); + } + + // / Get array of unique depth values from all curves by calling set on an array of depth values + all_depths_set = [...new Set(all_depths_list)]; + + const objects_helper = {}; + + for (let j = 0; j < all_depths_set.length; j++) { + // / create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] + objects_helper[all_depths_set[j]] = { [template[0].components[0].curves[0].depth_curve_name]: all_depths_set[j] }; + } + + // // now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} + // // for each curve {"depth":value,"curve_name":value} in each curve array of objects... + // ///// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object + for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { + const this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; + for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { + const this_obj = this_depth_plus_curve_obj[l]; + + const curve_name = curve_box_components[0].curves[k].curve_type; + const depth_name = curve_box_components[0].curves[k].depth_curve_name; + + // / add curve value as key/value pair to right object based on depth key + + objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; + } + } + + // / get rid of depth key and just have the objects..put in array if not returned as array + // // return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] + let data = Object.keys(objects_helper).map(function (key) { return objects_helper[key]; }); + + const depth_name = template[0].components[0].curves[0].depth_curve_name; + data = data.sort(function (a, b) { + return parseFloat(a.depth_name) - parseFloat(b.depth_name); + }); + // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) + function sortFloat(a, b) { return a - b; } + function sortNumber(a, b) { + return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); + } + template[0].components[0].curves[0].data = data.sort(sortNumber); + return template; + }, + + + // ///////////////////////////// + // // Functions that take Wellio.js style JSON and handle everything from transformation to plotting + // ///////////////////////////// + + /** + * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! + * @param {*} logs_in_json + * @param {*} div_id + * @param {*} example_template + * @param {*} curve_name + * @param {*} curve_color + * @param {*} curve_unit + * @param {*} fill + * @param {*} depth_name + * @param {*} width + * @param {*} height + */ + putArrayOfLogsIntoSection(logs_in_json, div_id, example_template, curve_name, curve_color, curve_unit, fill, depth_name, width, height) { + const noSVG = module.exports.d3.select(`#${div_id}`).selectAll('svg').remove(); + // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) + const new_templates = []; + for (let i = 0; i < logs_in_json.length; i++) { + const three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i], depth_name); + const new_data = three_things2.well_log_curves_reformatted_for_d3; + const example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0].components[0].curves[0].data = new_data; + example_template_n[0].components[0].curves[0].well_names = [three_things2.uwi]; + example_template_n[0].components[0].curves[0].curve_names = [curve_name]; + example_template_n[0].components[0].curves[0].curve_colors = [curve_color]; + example_template_n[0].components[0].curves[0].curve_units = [curve_unit]; + example_template_n[0].components[0].curves[0].fill = [fill]; + example_template_n[0].components[0].curves[0].depth_curve_name = depth_name; + const svg_holder = module.exports.d3.select(`#${div_id}`).append('div'); + svg_holder.style('vertical-align', 'middle') + .attr('id', `${div_id}svg_holder${i}`) + .style('display', 'inline-block'); + example_template_n[0].curve_box.div_id = `${div_id}svg_holder${i}`; + example_template_n[0].curve_box.width = width; + example_template_n[0].curve_box.height = height; + new_templates.push(example_template_n); + module.exports.curveBox(example_template_n); + } + return new_templates; + }, + + /** + * minimumDataIntoTemplateFunc + * @param + */ + minimumDataIntoTemplateFunc(example_template, data, well_names, curve_names, curve_colors, curve_units, fill, div_id, width, height, depth_curve_name) { + // // remember that all curve components should be an array, even if one item! + const example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0].components[0].curves[0].data = data; + example_template_n[0].components[0].curves[0].well_names = well_names; + example_template_n[0].components[0].curves[0].curve_names = curve_names; + example_template_n[0].components[0].curves[0].curve_colors = curve_colors; + example_template_n[0].components[0].curves[0].curve_units = curve_units; + example_template_n[0].components[0].curves[0].fill = fill; + example_template_n[0].components[0].curves[0].depth_curve_name = depth_curve_name; + example_template_n[0].curve_box.div_id = div_id; + example_template_n[0].curve_box.width = width; + example_template_n[0].curve_box.height = height; + return example_template_n; + }, + + + // ///////////////////////////// + // // Actual plotting functions after all the necessary information is compiled in necessary format + // ///////////////////////////// + + /** + * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. + * @param {object} well_curve_config_template + * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. + */ + curveBox(template_for_plotting) { + const { d3 } = module.exports; + + // //////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// + // // These parts of the function establish variables from the config JSON in shorter variable names + // // If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined + // default values might be defined here for cases where they are accidentally not defined + + const template_overall = template_for_plotting[0].curve_box; + const template_components = template_for_plotting[0].components; + const template_curves = template_components[0].curves[0]; + const template_lines = template_components[0].lines; + const template_rectangles = template_components[0].rectangles; + let title = ''; + // // Determine if title exists for the curve_box. + if (template_overall.show_title != 'yes') { const title = ''; } else { title = template_overall.title.text; } + // / Parameters that define shape & size of overall curve box + const { width } = template_overall; + let height_multiplier_components = 0.95; + if (template_overall.height_multiplier_components) { + height_multiplier_components = template_overall.height_multiplier_components; + } + const height = template_overall.height * height_multiplier_components; + const height_components = template_overall.height; + const { margin } = template_overall; + const { header_sep_svg_or_not } = template_overall; + const { svg_header_height } = template_overall; + const { gridlines } = template_overall; + const { gridlines_color } = template_overall; + const { gridlines_stroke_width } = template_overall; + // // variables for how to draw mouseover of hover box + const { mouseover_yes_or_no } = template_overall; + const { mouseover_depth_or_depth_and_curve } = template_overall; + let { mouseover_curvename } = template_overall; // // default is first curve + const { mouseover_color_or_default_which_is_curve_color } = template_overall; + + const secondary_depth_exist = 'no'; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW + + // // Data is in d3.js form. An array of objects consisting of single level key:value pairs + let { data } = template_curves; + // // Variables related to curves, these should all be arrays with one or more values! + const { curve_names } = template_curves; + const { curve_colors } = template_curves; + const { curve_stroke_dasharray } = template_curves; + const curve_name = curve_names[0]; + const curve_color = curve_colors[0]; + let { curve_units } = template_curves; + const { scale_linear_log_or_yours } = template_curves; + if (template_curves.curve_units) { curve_units = template_curves.curve_units; } else { curve_units = ''; } + + // ////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON + let flag_for_single_scale_or_independent_scales = template_overall.grouped_or_independent_x_scales; + const grouped_or_independent_x_scale = template_overall.grouped_or_independent_x_scales; + + + // // The depth_curve_name needs to be the same for all curves plotted! + let depth_curve_name = ''; + if (template_curves.depth_curve_name.length > 1 && typeof (template_curves.depth_curve_name) === 'object' && template_curves.depth_curve_name[0] !== template_curves.depth_curve_name[1] + ) { + depth_curve_name = 'depth_curve_name is not the same in two or more curves'; + } else { + depth_curve_name = template_curves.depth_curve_name; + } + let depth_type_string = ''; + if ( + template_curves.depth_type_string.length > 1 && typeof (template_curves.depth_type_string) === 'object' && template_curves.depth_type_string[0] != template_curves.depth_type_string[1] + ) { + depth_type_string = 'depth type string is not the same in two or more curves'; + } else if (template_curves.depth_type_string[0] === '') { depth_type_string = ''; } else if (template_curves.depth_type_string) { depth_type_string = `- ${template_curves.depth_type_string}`; } + let depth_units_string = ''; + if (template_curves.depth_units_string && template_curves.depth_units_string[0] !== '') { + depth_units_string = `- ${template_curves.depth_units_string}`; + } + + // /// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// + let { div_id } = template_overall; + if (template_overall.div_id) { div_id = template_overall.div_id; } else { return 'there_was_no_div_id_in_the_template'; } + + d3.select(`#${div_id}`).selectAll('*').remove(); + + // /////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + // //// Calculate depth min and max if depth min and/or max is not given explicitly in the template + let depth_min; + let depth_max; + if (!template_curves.depth_limits || template_curves.depth_limits[0].min === 'autocalculate') { depth_min = d3.min(data, function (d) { return +d[depth_curve_name]; }); } else { depth_min = template_curves.depth_limits[0].min; } + // // max depth + if (!template_curves.depth_limits || template_curves.depth_limits[0].max === 'autocalculate') { depth_max = d3.max(data, function (d) { return +d[depth_curve_name]; }); } else { depth_max = template_curves.depth_limits[0].max; } + + + // [depth_max,depth_min] + // // Apply depth min and max to incoming well log data + // // To save time, we'll first check if the first object in the array had as depth that is smaller than min + // // and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. + + if (data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max) {} else { + data = data.filter(function (objects) { + return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; + }); + } + + // let depth_min = -1000000 + // let depth_max = 1000000 + + if (template_curves.min_depth[0] == 'autocalculate' || template_curves.min_depth === 'autocalculate') { + depth_min = data[0][depth_curve_name]; + } else { depth_min = template_curves.min_depth; } + if (template_curves.max_depth[0] == 'autocalculate' || template_curves.max_depth === 'autocalculate') { + depth_max = data[data.length - 1][depth_curve_name]; + } else { depth_max = template_curves.max_depth; } + + // let depth_min = template_curves["min_depth"][0] + // let depth_max = template_curves["max_depth"][0] + + // /////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + + // //////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// + let svg = ''; + let svg_holder = ''; + let svg_header = ''; + if (header_sep_svg_or_not == 'yes') { + svg_holder = d3.select(`#${div_id}`).append('div') + .attr('class', 'svg_holder') + .style('overflow-x', 'auto'); + + svg_header = d3.select(`#${div_id} div.svg_holder`).append('svg'); + svg_header.attr('class', 'header'); + svg_header.attr('width', width) + .attr('height', svg_header_height); // /// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! + svg_header.append('g'); + svg_header.style('display', 'block'); + + let depth_string_on_top = ''; + if (depth_type_string === '') { + depth_string_on_top = depth_curve_name; + } else { depth_string_on_top = depth_type_string.replace('- ', ''); } + + svg_header.append('text') + .attr('x', (margin.left) / 2) + .attr('y', '1em') + .attr('text-anchor', 'middle') + .style('font-size', '10px') + .style('text-decoration', 'underline') + .text(depth_curve_name); + if (depth_type_string != '') { + let depth_type_string_x_pos = 0; + let depth_type_string_x_pos_anch = 'start'; + if (secondary_depth_exist === 'no') { + depth_type_string_x_pos = margin.left / 2; + depth_type_string_x_pos_anch = 'middle'; + } + svg_header.append('text') + .attr('x', depth_type_string_x_pos) + .attr('y', '3em') + .attr('text-anchor', depth_type_string_x_pos_anch) + .style('font-size', '8px') + .style('text-decoration', 'underline') + .text(depth_string_on_top); + } + + // svg_header.append("text") + // .attr("x", margin.left) + // .attr("y", "4em") + // .attr("text-anchor", "end") + // .style("font-size", "6px") + // .style("text-decoration", "underline") + // .text("2nd TVD"); + + // /////// change this!!!!! + if (title !== 'Elephants') { + const distance_from_top = -15; + svg_header.append('text') // + .attr('x', (margin.left / 3 + (width / 2))) + .attr('y', 0 + (-distance_from_top)) + .attr('text-anchor', 'middle') + .style('font-size', template_overall.title.title_font_size) + .text(title); + } + + const curveBox_main_div = d3.select(`#${div_id}`).append('div'); + curveBox_main_div + .attr('height', `${height_components}px`) + .attr('class', 'component_outter') + .style('display', 'flex') + .style('position', 'relative') + .style('box-sizing', 'border-box'); + + const curveBox_sub_div = d3.select(`#${div_id} div.component_outter`).append('div'); + curveBox_sub_div + .attr('class', 'component_inner') + .style('overflow-y', 'auto') + .style('position', 'absolute') + .style('max-height', `${height_components}px`); + + svg = d3.select(`#${div_id} div.component_outter div.component_inner`).append('svg'); + } else { + svg = d3.select(`#${div_id}`).append('svg'); + } + + // //////////// Calculate Axis & Scales =>////////////// + // // Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. + // // For zero curves, need to look into rectange and lines for x scales maybe? + // // Need to handle scales in linear, log, or arbitary user-provided scale. + // // Also, need x function for gridlines! so....? + + // //////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + const mins = []; + const maxes = []; + for (let i = 0; i < curve_names.length; i++) { + const min_this = d3.min(data, function (d) { return +d[curve_names[i]]; }); + const max_this = d3.max(data, function (d) { return +d[curve_names[i]]; }); + mins.push(min_this); + maxes.push(max_this); + } + let min_all_curves = d3.min(mins); + let max_all_curves = d3.max(maxes); + + if (curve_names.length === 0) { + // // THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! + min_all_curves = 0; + max_all_curves = 100; + } + // //////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let x_func; + let x; + let xAxis_header; + let xAxis; + if (flag_for_single_scale_or_independent_scales = 'single') { + for (let i = 0; i < curve_names.length; i++) { + const min_this = d3.min(data, function (d) { return +d[curve_names[i]]; }); + const max_this = d3.max(data, function (d) { return +d[curve_names[i]]; }); + mins.push(min_this); + maxes.push(max_this); + } + min_all_curves = d3.min(mins); + max_all_curves = d3.max(maxes); + x = d3.scaleLinear().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours === 'log') { + x = d3.scaleLog().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours === 'linear') {} else if (typeof (scale_linear_log_or_yours) !== 'string') { + x = scale_linear_log_or_yours.yours; + } + xAxis_header = (g) => g.attr('transform', 'translate(0,45)').call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + } + + // ////////////////// define y scale, aka the one for the depth //////////////////// + const y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom, margin.top]); + // let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + const yAxis = (g) => g.attr('transform', `translate(${margin.left},0)`).call(d3.axisLeft(y)).call((g) => g.select('.domain')); + const yAxis2 = (g) => g.attr('transform', `translate(${margin.left - 35},0)`).call(d3.axisLeft(y)).call((g) => g.select('.domain')); + + + // //////////// Building curvebox parts that aren't header. First define size & title =>////////////// + svg.attr('class', 'components'); + svg.attr('width', width) + .attr('height', height); + svg.style('margin', '0 auto'); + svg.style('overflow', 'scroll'); + + if (header_sep_svg_or_not === 'no') { + const xAxis = xAxis_header; + svg.append('g') + .call(xAxis) + .append('text') + .text('test svg'); + } + + const y_axis_text = `${depth_curve_name} ${depth_units_string} ${depth_type_string}`; + svg.append('g') + .call(yAxis) + .append('text') + .attr('transform', 'rotate(-90)') + .attr('dy', '.75em') + .attr('y', 0 - (margin.left * 0.6)) + .attr('x', ((height) / -2) + margin.top) + .style('text-anchor', 'end') + .text(y_axis_text) + .style('fill', '#2b2929'); + + // // + // svg.append("g") + // .call(yAxis2) + // .append("text") + // .attr("transform", "rotate(-90)") + // .attr("dy", ".75em") + // .attr("y", -35) + // .attr("x",((height)/-2)+margin.top) + // .style("text-anchor", "end") + // .text(y_axis_text+"THIS IS THE SECOND ONE") + // .style("fill","#2b2929") + // // + + // svg.append("g") + // // Code that assumes multiple curves are plotted in same curvebox + const distance_from_top = -15; + if (title !== '') { + svg.append('text') // + .attr('x', (margin.left / 3 + (width / 2))) + .attr('y', 0 + (-distance_from_top)) + .attr('text-anchor', 'middle') + .style('font-size', template_overall.title.title_font_size) + .text(title); + } + + if (gridlines === 'yes') { + const gridlines_obj = d3.axisTop() + .ticks((width - margin.left - margin.right) / 25) + .tickFormat('') + .tickSize(-height + margin.top + 10) + .scale(x); + svg.append('g') + .attr('class', 'grid') + .call(gridlines_obj) + .style('stroke', gridlines_color) + .style('stroke-width', gridlines_stroke_width); + } + + + // //// This will help save the x axis function for first curve if there are more than one curve + // /// and they are at different scales. We need this in order to use the 'between' method of fill! + // let x_for_k_is_0 + // //// This will help save the x axis function for second curve if there are more than one curve + // /// and they are at different scales. We need this in order to use the 'between' method of fill! + // let x_for_k_is_1 + // //// This will help save the x axis function for third curve if there are more than one curve + // /// and they are at different scales. We need this in order to use the 'between' method of fill! + // let x_for_k_is_2 + // //// This will help save the x axis function for fourth curve if there are more than one curve + // /// and they are at different scales. We need this in order to use the 'between' method of fill! + // let x_for_k_is_3 + + const x_functions_for_each_curvename = {}; // // populate with {"curvename":curvename,"x_func":func} + + // //////////// Building curves within curvebox =>////////////// + for (let k = 0; k < curve_names.length; k++) { + // // code that creates a line for each Curve in order provided and applies + // // the color in the color array in order provided + + let curveUnit = ''; + if (curve_units[k]) { curveUnit = curve_units[k]; } + const min = mins[k]; + const max = maxes[k]; + + const header_text_line = `${min.toFixed(1)} - ${curve_names[k]} ${curveUnit} - ${max.toFixed(1)}`; + const min_this = d3.min(data, function (d) { return +d[curve_names[k]]; }); + const max_this = d3.max(data, function (d) { return +d[curve_names[k]]; }); + let x = d3.scaleLinear().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours === 'log') { + x = d3.scaleLog().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours === 'linear') {} else if (typeof (scale_linear_log_or_yours) !== 'string') { + x = scale_linear_log_or_yours.yours; + } + if (k == 0) { + x_func === x; + } + // // This creates an object to hold multiple x axis scale functions + // // that will be used if 'between' style fill is selected. + x_functions_for_each_curvename[curve_names[k]] = x; + + // //////////// Header text, two way depending on =>////////////// + if (header_sep_svg_or_not === 'yes') { + const distance_from_top = `${(1 + (k * 2.7)).toString()}em`; + svg_header.append('text') + .attr('x', (margin.left + width) / 2) + .attr('y', 0 + distance_from_top) + .attr('text-anchor', 'middle') + .style('font-size', '11px') + .style('text-decoration', 'underline') + .style('fill', curve_colors[k]) + .text(header_text_line); + const translate_string = `translate(0,${(45 - (30 * k)).toString()})`; + xAxis_header = (g) => g.attr('transform', translate_string).call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + svg_header.append('g') + .call(xAxis_header) + .append('text'); + } + const another_line = d3.line().x((d) => x(d[curve_names[k]])).y((d) => y(d[depth_curve_name])); + // //////////// Appends a curve line but doesn't include fill yet =>////////////// + svg.append('path') + .datum(data) + .attr('fill', 'none') + .attr('stroke', curve_colors[k]) + .attr('stroke-width', template_curves.stroke_width[k]) + .attr('stroke-linecap', template_curves.stroke_linecap[k]) + .attr('stroke-dasharray', curve_stroke_dasharray[k]) + .attr('d', another_line); + } + + + // //////////// define the area filled under the curve =>////////////// + + for (let i = 0; i < template_curves.fill.length; i++) { + // let i = k + if (template_curves.fill[i].fill === 'yes') { + const number_colors = template_curves.fill[i].fill_colors.length; + const curve_name1 = template_curves.fill[i].curve_name; + let threshold = -99999999; + let fill_color = 'gray'; + for (let j = 0; j < number_colors; j++) { + const area1 = d3.area(); + if (number_colors != 0) { + threshold = template_curves.fill[i].cutoffs[j]; + fill_color = template_curves.fill[i].fill_colors[j]; + } + if (template_curves.fill[i].fill_direction === 'left') { + const start_from_left = template_overall.margin.left; + area1 + .x1((d) => x(d[curve_name1])) + .x0((d) => start_from_left) + .defined((d) => ((d[curve_name1]) > threshold)) + .y((d) => y(d[depth_curve_name])); + } + if (template_curves.fill[i].fill_direction === 'right') { + const start_from_right = template_overall.margin.right; + const start_from_left = template_overall.margin.left; + area1 + .x1((d) => width - start_from_right) + .defined((d) => ((d[curve_name1]) > threshold)) + .x0((d) => x(d[curve_name1])) + .y((d) => y(d[depth_curve_name])); + } + if (template_curves.fill[i].fill_direction === 'between') { + const between_2_curve = template_curves.fill[i].curve2; + // // for through x_functions_for_each_curvename object and find the key that + // // matches between_2_curve which should be a curvename + // // get the x function for the second curve and the curve that is curvenames[k] + const second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; + const first_curve_x_func = x_functions_for_each_curvename[curve_name1]; + area1 + .x1((d) => first_curve_x_func(d[curve_name1])) + .x0((d) => second_curve_x_func(d[between_2_curve])) + // .defined(d => ((d[curve_name1])<=d[between_2_curve])) + .y((d) => y(d[depth_curve_name])); + } + svg.append('path') + .datum(data) + .attr('class', 'area') + .attr('d', area1) + .attr('stroke', 'none') + .attr('fill', fill_color) + .attr('fill-opacity', 0.8); + } + } + } + + // ////////////// TOOLTIP Part 1 /////////////////// + if (mouseover_yes_or_no === 'no') { + console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); + } else { + // // statements to make sure the mouseover_curvename is a present curve and if not use first curve + if (mouseover_curvename === 'default') { mouseover_curvename = curve_names[0]; } else if (curve_names.includes(mouseover_curvename)) { mouseover_curvename = mouseover_curvename; } else { mouseover_curvename = curve_names[0]; } + + // // statement to handle color of curve text and circle on hover + let curve_on_mouseover_color = curve_colors[0]; + if (mouseover_color_or_default_which_is_curve_color != 'default') { + curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; + } + + // // appends start of mouseover rectange used for showing hover content + const focus = svg.append('g') + .style('display', 'none'); + + const bisectDate = d3.bisector(function (d) { return d[depth_curve_name]; }).left; // ** + + // // function called to change hover style & contents when mouseover rectangle appended to svg svg + function mousemove() { + const y0 = y.invert(d3.mouse(this)[1]); + const i = bisectDate(data, y0, 1); + const d0 = data[i - 1]; + const d1 = data[i]; + const d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; + + // // fixed value along y axis + const fixed_x_value = width * 0.8; + + // // depth value + focus.select('text.y2') + .attr('transform', + // "translate(" + x(d[mouseover_curvename]) + "," + + `translate(${fixed_x_value},${ + y(d[depth_curve_name])})`) + .text(d[depth_curve_name]); + + // // curve value + focus.select('text.y4') + .attr('transform', + `translate(${fixed_x_value},${ + y(d[depth_curve_name])})`) + .text(d[curve_names[0]]); + + focus.select('.x') + .attr('transform', + `translate(${x(d[mouseover_curvename])},${0 + })`) + .attr('y2', height); + // // circle y class part 2 + focus.select('.y') + .attr('transform', + `translate(${x(d[mouseover_curvename])},${ + y(d[depth_curve_name])})`) + .text(d[mouseover_curvename]); + focus.select('.yl') + .attr('transform', + `translate(${0},${ + y(d[depth_curve_name])})`) + .text(d[mouseover_curvename]); + } + // append the x line + focus.append('line') + .attr('class', 'x') + .style('stroke', 'blue') + .style('stroke-dasharray', '3,3') + .style('opacity', 0.5) + .attr('y1', 0) + .attr('y2', width); + + // append the y line + focus.append('line') + .attr('class', 'yl') + .style('stroke', 'blue') + .style('stroke-dasharray', '3,3') + .style('opacity', 0.5) + .attr('x1', 0) + .attr('x2', height); + + // append the circle at the intersection + focus.append('circle') + .attr('class', 'y') + .style('fill', 'none') + .style('stroke', curve_on_mouseover_color) + .attr('r', 3); + + // // depth value on hover + if (mouseover_depth_or_depth_and_curve === 'depth' || mouseover_depth_or_depth_and_curve === 'depth_and_curve') { + focus.append('text') + .attr('class', 'y2') + .attr('dx', 6) + .attr('dy', '-.3em') + .style('font-size', '0.55em'); + } + + // // curve value on hover + if (mouseover_depth_or_depth_and_curve === 'curve' || mouseover_depth_or_depth_and_curve === 'depth_and_curve') { + focus.append('text') + .attr('class', 'y4') + .attr('dx', 1) + .attr('dy', '0.5em') + .style('font-size', '0.55em') + .style('fill', 'black') + .style('stroke', curve_on_mouseover_color) + .style('stroke-width', '0.5px'); + } + + // append the rectangle to capture mouse // ********** + svg.append('rect') // ********** + .attr('width', width) // ********** + .attr('height', height) // ********** + .style('fill', 'none') // ********** + .style('pointer-events', 'all') // ********** + .on('mouseover', function () { focus.style('display', null); }) + .on('mouseout', function () { focus.style('display', 'none'); }) + .on('mousemove', mousemove); // ********** + } + + // //////////// Horizontal Lines AKA tops =>////////////// + try { + for (let i = 0; i < template_lines.length; i++) { + const this_line = template_lines[i]; + svg.append('line') + .attr('x1', 0 + margin.left) + .attr('y1', y(this_line.depth)) + .attr('x2', width * 0.75) + .attr('y2', y(this_line.depth)) + .style('stroke-width', this_line.stroke_width) + .style('stroke', this_line.color) + .style('stroke-dasharray', this_line['stroke-dasharray']) + .style('stroke-linecap', this_line.stroke_linecap) + .style('fill', 'none'); + + svg.append('text') + .attr('x', width * 0.75) + .attr('y', y(this_line.depth)) + .attr('text-anchor', 'start') + .style('font-size', '12px') + .text(this_line.label); + } + } catch (err) { + console.log('could not do lines for tops in curveBox function, error: ', err); + } + + // //////////// Rectangles for things like cores & sample locations =>////////////// + try { + for (let i = 0; i < template_rectangles.length; i++) { + const this_rectangle = template_rectangles[i]; + svg.append('rect') + .attr('x', 50 + margin.left) + .attr('y', y(this_rectangle.depth_top)) + .attr('width', this_rectangle.width) + .attr('height', this_rectangle.height) + .style('stroke-width', this_rectangle.stroke_width) + .style('stroke-linecap', this_rectangle.stroke_linecap) + .style('stroke', 'purple') + .style('fill', this_rectangle.fill) + .style('opacity', this_rectangle.opacity); + + svg.append('text') + .attr('x', width * 0.75) + .attr('y', y(this_rectangle.depth_top)) + .attr('text-anchor', 'start') + .style('font-size', '12px') + .text(this_rectangle.label); + } + } catch (err) { + console.log('could not do rectangle in curveBox function for some reason. error= ', err); + } + + // //////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// + svg_holder.node(); + svg_header.node(); + return svg.node(); + }, + + + // //////// + /** + * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. + * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to + * @param {object} templates An array of CurveBox input templates + * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! + */ + multipleLogPlot(div_id, templates, show_all = true) { + const { d3 } = module.exports; + const noDIV = d3.select(`#${div_id}`).selectAll('div').remove(); + const noSVG = d3.select(`#${div_id}`).selectAll('svg').remove(); + const new_templates = []; + for (let i = 0; i < templates.length; i++) { + const curvebox_holder = d3.select(`#${div_id}`).append('div'); + curvebox_holder.style('vertical-align', 'middle') + .attr('id', `${div_id}curvebox_holder${i}`); + // // to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! + if (show_all) { + curvebox_holder.style('display', 'inline-block'); + } else { + curvebox_holder.style('display', 'none'); + } + templates[i][0].curve_box.div_id = `${div_id}curvebox_holder${i}`; + new_templates.push(templates[i]); + const template = templates[i]; + const check = module.exports.curveBox(template); + } + return new_templates; + }, + /** + * This function is used to plot a single curveboxe in the div listed in the plotting templates div_id key. + * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. + * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. + * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. + */ + makeThisCurveBox(template_for_plotting) { + const { d3 } = module.exports; + const { div_id } = template_for_plotting[0].curve_box; + const noSVG = d3.select(`#${div_id}`).selectAll('svg').remove(); + const curve_box_return = module.exports.curveBox(template_for_plotting); + return curve_box_return; + }, + /** + * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. + * In certain environments, this may not work for security reasons. + * @param {string} svgEl An SVG element returned from the curveBox function. + * @param {string} name The name of the file to be downloaded. + */ + saveSvg(svgEl, name) { + svgEl.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); + const svgData = svgEl.outerHTML; + const preface = '\r\n'; + const svgBlob = new Blob([preface, svgData], { type: 'image/svg+xml;charset=utf-8' }); + const svgUrl = URL.createObjectURL(svgBlob); + const downloadLink = document.createElement('a'); + downloadLink.href = svgUrl; + downloadLink.download = name; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + }, + }; + + return module.exports; +}); diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/test/test.js b/example_deployments/example_panel_app/static/js/wellioviz/dist/test/test.js new file mode 100644 index 0000000..2232d4a --- /dev/null +++ b/example_deployments/example_panel_app/static/js/wellioviz/dist/test/test.js @@ -0,0 +1,109 @@ +// Tests go here + +//// GLOBAL JSON OBJECTS FOR TESTING +input_sparse_style = [{ + "single_curve_box_or_cross_section":"single", + "cross_section_title":"", + "width": 1040, /// not skippable, check if number // default if blank or missing =250 or autocalculate? + "height": 500, /// not skippable, check if number // default if blank or missing=500 + //////////////////////////// + "curve_boxes":[{ + "curve_box":{ + "show_well_name":"yes", // not built yet /// Should be skip-able /// default=No + "show_depth_type":"no", // not built yet /// Should be skip-able /// default=No + "show_curve_units":"yes", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min":-999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "curve_box_depth_max":-999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "take_out_null_or_visualize":"no", // not built yet /// Should be skip-able /// default=No + "show_title":"no", // not built into plotting template yet /// Should be skip-able /// default=No + "width": 260, /// not skippable, check if number // default if blank or missing =250 + "height": 500, /// not skippable, check if number // default if blank or missing=500 + "height_multiplier_components":3, // default if missing is 0.95 + "margin": {"top": 50, "right": 10, "bottom": 30, "left": 60}, /// not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. + "title": {"text": "", "title_font_size": "10px"}, /// Should be skip-able // default=skip + "div_id": "well_holder4", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component":["curves","rectangles","lines"], // not built yet, default is curve, then line, then rectangle + "lines_connected_across_curve_boxes":"no", // not built yet, default is skip function + "header_sep_svg_or_not":"yes", + "svg_header_height":"4em", + "gridlines":"yes", + "gridlines_color":'#D3D3D3', + "gridlines_stroke_width":0.20, + "grouped_or_independent_x_scales":"independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no":"yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename":"default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black + +}, + "components":[{ + "curves":[ + { + "data_type":"curve", // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. + "data_id":"placeholder_data_id", // not built yet /// can be anything, just used for tracking & is optional + "well_name": "", // not built yet /// Ideally string. Will skip function if "" + "curve_type": "RHOB", // should be string. name of curve + "curve_values": [ + 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526,2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], /// Should be array. If not array, return error message? + "step": 0.1, /// Should be number. If not array, return error message? + "units": "g/cc", /// should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. + "scale_linear_log_or_yours": "linear", + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "rgb(205,0,0,1)", /// Test for string, if string use. If not string "black" + "curve_stroke_dasharray":"5,5", + "stroke_linecap":"butt", + "stroke_width":0.5, + "fill":{"curve_name":"RHOB","fill":"yes","fill_direction":"left","cutoffs":[0.21,2.23,2.24],"fill_colors":["gray","beige","white"],"curve2":""}, + "data_ID":"", + "max_depth": "1607.3", /// should be number, if not number or doens't exit then "autocalculate" + "min_depth": "1598.3", /// should be number, if not number or doens't exit then "autocalculate" + "depth_type_string":"TVDSS", /// should be string, if not or doesn't exist, then skip func + "depth_units_string":"md", + "depth_curve_name":"DEPTH", /// should be string, ideally all depth curve names are the same + "null_value": "", // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. + "x_max": 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + "x_min": 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + } + ], + "lines":[ + { + "data_type":"line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label":"top 1", /// Ideally a string. + "depth":1601.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color":"blue", /// should be string, if not or doesn't exist use "black" + "stroke_width":"3px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap":"butt", + "stroke_style":"solid", /// should be string, if not or doesn't exist use "solid" + "transparency":1.0 /// should be number between 0 and 1, if not or doesn't exist use 1. + }, + { + "data_type":"line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label":"top 2", /// Ideally a string. + "depth":1602.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color":"orange", /// should be string, if not or doesn't exist use "black" + "stroke_width":"5px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap":"butt", + "stroke_style":"solid", /// should be string, if not or doesn't exist use "solid" + "transparency":0.5 /// should be number between 0 and 1, if not or doesn't exist use 1. + } + ], + "rectangles":[ + { + "data_type":"rectangle", + "depth_top":1601, + "x_starting_upper_left_corner":0, + "width":100, + "height":100, + "stroke_width":"2px", + "stroke_linecap":"butt", + "fill":"red", + "opacity":0.5, + "label":"Core Example", // not built into plotting template yet + "label_orientation":"horizontal", // not built into plotting template yet + "lable_position":"right" // not built into plotting template yet + } + ] + }] +}] +}] \ No newline at end of file diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/trial.js b/example_deployments/example_panel_app/static/js/wellioviz/dist/trial.js new file mode 100644 index 0000000..fb2dd92 --- /dev/null +++ b/example_deployments/example_panel_app/static/js/wellioviz/dist/trial.js @@ -0,0 +1 @@ +// IGNORE THIS FILE FOR NOW \ No newline at end of file diff --git a/example_deployments/example_panel_app/templates/index.html b/example_deployments/example_panel_app/templates/index.html new file mode 100644 index 0000000..5902ef0 --- /dev/null +++ b/example_deployments/example_panel_app/templates/index.html @@ -0,0 +1,24 @@ + + + + + Title + + + + + + {{ bokeh_css }} + {{ bokeh_js }} + + + + + + {{ plot_div|indent(8) }} + {{ plot_script|indent(8) }} +
    + + \ No newline at end of file diff --git a/example_deployments/example_panel_app/templates/js/bundle.js b/example_deployments/example_panel_app/templates/js/bundle.js new file mode 100644 index 0000000..b378032 --- /dev/null +++ b/example_deployments/example_panel_app/templates/js/bundle.js @@ -0,0 +1,22873 @@ +(function () { + function r(e, n, t) { + function o(i, f) { + if (!n[i]) { + if (!e[i]) { + var c = "function" == typeof require && require; + if (!f && c) return c(i, !0); + if (u) return u(i, !0); + var a = new Error("Cannot find module '" + i + "'"); + throw a.code = "MODULE_NOT_FOUND", a + } + var p = n[i] = {exports: {}}; + e[i][0].call(p.exports, function (r) { + var n = e[i][1][r]; + return o(n || r) + }, p, p.exports, r, e, n, t) + } + return n[i].exports + } + + for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) o(t[i]); + return o + } + + return r +})()({ + 1: [function (require, module, exports) { + + }, {}], + 2: [function (require, module, exports) { +// shim for using process in browser + var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + + var cachedSetTimeout; + var cachedClearTimeout; + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + + function defaultClearTimeout() { + throw new Error('clearTimeout has not been defined'); + } + + (function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } + }()) + + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + + } + + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e) { + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e) { + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + } + + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while (len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + }; + +// v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() { + } + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + process.prependListener = noop; + process.prependOnceListener = noop; + + process.listeners = function (name) { + return [] + } + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { + return '/' + }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function () { + return 0; + }; + + }, {}], + 3: [function (require, module, exports) { + (function (global) { + !function (e) { + "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.commonJsModule = e() : "undefined" != typeof global ? global.commonJsModule = e() : "undefined" != typeof self && (self.commonJsModule = e()); + }(function () { + var define, module, exports; + module = {exports: (exports = {})}; + +// Copyright 2019 Justin Gosses + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + // /////////////////////////////// + // /** + // * "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, + // * particularly those already converted to JSON, using the d3.js visualization library." + // * + // * It is designed with a single central function curveBox, that returns SVGs. + // * A variety of helper functions take in differently formatted JSONs of information about the well + // * log curves to plot and how to plot them. + // * + // * The idea is that end users can provide their own functions to reformat their data into the template that is fed into curveBox. + // * + // * Some users would wnat to only send to the JavaScript the data they want to plot. Others might use wellio.js to convert a + // * whole LAS 2.0 formatted well log file to JSON and send that whole JSON along with instructions with how to plot some portion of it. + // * + // * Central to this idea is that how to plot and what to plot be put into a JSON template that has sensible defaults, + // * such that the end-user only has to understand what they want to change about the plotting, not the whole d3.js code. + // */ + + module.exports = { + /** + * This brings in wellio.js as a dependency used by wellioviz. It returns the object that contains all its functions as a module that is called like "module.exports.wellio.[insert a wellio.js function here]" + * @returns {obj} It returns the wellio.js object and all its functions as a module. + */ + wellio: require("wellio"), + + /** + * This brings in d3.js as a dependency used by wellioviz. It returns the d3.js object and all its functions as a module that is called like "module.exports.d3.[insert a d3.js function here]" + * @returns {obj} It returns the d3.js object and all its functions as a module. + */ + d3: require("d3"), + + /** + * A function that directs users to the docs if they need help. + * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. + */ + help: function () { + return "I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') "; + }, + + + /** + * A function that returns a short description of what the wellioviz library is all about. + * @returns {string} Returns a string that defines wellioviz. + */ + define_wellioviz: function () { + return "WELLIOVIZ is a JavaScript library that provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library."; + }, + /////////////////////////////// + + /** + * curveBoxTemplateExamples gives an example of the template giving to the plotting functions and definitions of the fields. + * A string of either "help" "example" or "definitions" is given as function argument and either a string or Object is returned depending on string provided as input parameter. + * This is used to help construct the JSON object that is given to the curveBox plotting function. + * Someone might run this function with "example" as the parameter, give back the JSON template, replace a few pieces with their own data or format choices and then pass it as the argument into the curveBox function. + * @param {string} string_of_either__help_example_definitions_mandatories A string of either "help" "example" or "definitions" + */ + curveBoxTemplateExamples: function (string_of_either__help_example_definitions_mandatories) { + let request_string = string_of_either__help_example_definitions_mandatories; + if (request_string == "help") { + return "The curveBoxTemplateExamples function returns example templates based on an input argument. Possible argument values are 'example' 'defintions' or 'mandatories'"; + } + if (request_string == "example") { + return [{ + "curve_box": { + "show_well_name": "yes", /// not built yet + "show_depth_type": "no", /// not built yet + "show_curve_units": "yes", /// not built yet + "curve_box_depth_min": -999, /// not built yet + "curve_box_depth_max": -999, /// not built yet + "take_out_null_or_visualize": "no", /// not built yet + "show_title": "no", + "width": 260, + "height": 500, + "height_multiplier_components": 2, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "well_holder_3", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectanges", "lines"], /// not built yet + "lines_connected_across_curveboxes": "no", /// not built yet + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "curve", + "curve_names": ["RHOB"], + "curve_colors": ["black"], + "curve_stroke_dasharray": ["solid"], + "stroke_linecap": ["butt"], + "stroke_width": [1], + "fill": [ + { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + } + ], + "curve_units": ["g/cm3"], + "depth_limits": [{"min": "autocalculate", "max": "autocalculate"}], + "curve_limits": [{"curve_name": "", "min": -10000000, "max": 3}], + "data": [{"depth": 1598.3, "RHOB": 2.2322}, { + "depth": 1598.4, + "RHOB": 2.0513 + }, {"depth": 1598.5, "RHOB": 2.2548}, { + "depth": 1598.6, + "RHOB": 2.9445 + }, {"depth": 1598.7, "RHOB": 2.2223}, { + "depth": 1598.8, + "RHOB": 2.447 + }, {"depth": 1598.9, "RHOB": 2.598}, { + "depth": 1599, + "RHOB": 2.8088 + }, {"depth": 1599.1, "RHOB": 2.2248}, { + "depth": 1599.2, + "RHOB": 2.2399 + }, {"depth": 1599.3, "RHOB": 2.251}, { + "depth": 1599.4, + "RHOB": 2.255 + }, {"depth": 1599.5, "RHOB": 2.2526}, { + "depth": 1599.6, + "RHOB": 2.2322 + }, {"depth": 1599.7, "RHOB": 2.2513}, { + "depth": 1599.8, + "RHOB": 2.2548 + }, {"depth": 1599.9, "RHOB": 2.2445}, { + "depth": 1600, + "RHOB": 2.2223 + }, {"depth": 1600.1, "RHOB": 2.2047}, {"depth": 1600.2, "RHOB": 2.198}], /// not built yet + "depth_curve_name": "DEPT",/// not built yet + ////// + "data_id": ["placeholder_data_id",], /// not built yet + "well_names": [""], /// not built yet + "scale_linear_log_or_yours": ["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string": [""], + "depth_units_string": [""], + "null_value": [""], /// not built yet + } + ], + "lines": [ + { + "data_type": "line", /// not built yet + "label": "example", /// not built yet + "depth": -999, /// not built yet + "color": "red", /// not built yet + "stroke_width": "3px", /// not built yet + "stroke_style": "solid", /// not built yet + "transparency": 1.0, /// not built yet + "stroke_linecap": "butt" + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 0, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "defintions") { + return [{ + "curve_box": { + "show_well_name": "yes or no. If '' is no", // not built yet + "show_depth_type": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes or no. If '' is no", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "curve_box_depth_max": "Should be a number. If string or -999, will be skipped and autocalculate used", // not built yet + "take_out_null_or_visualize": "yes or no. If '' is no", // not built yet + "show_title": "yes or no. If '' is no", // not built yet + "width": "number, if blank default is 250", + "height": "number, if blank default is 500", + "height_multiplier_components": "An interger or float that multiplies the height to get the height of the curves inside the curvebox. If curves height is greater than height, then scroll behavior will result.", + "margin": " should be an object like {\"top\": 10, \"right\": 10, \"bottom\": 30, \"left\": 60} if missing will default to these values", + "title": "object like:{\"text\": \"\", \"title_font_size\": \"10px\"} if default, an empty string, \"\" will skill", + "div_id": "should be a string that equals a div id like: 'well_holder' Do not include the #", ///What happens if div doesn't exist? + "order_of_component": "Should be an array of strings that correlate to component types like:[\"curves\",\"rectangles\",\"lines\"]", // not built yet + "lines_connected_across_curveboxes": "yes or no. If '' is no", // not built yet + "header_sep_svg_or_not": "yes or no. 'no' will build the curvebox as a single SVG. 'yes' will build it as two SVGs within nested divs. The later better helps enable scrolling curves and stationary header", + "svg_header_height": "Example = 3em; A string representing the height of the header part of the curvebox when header & components part of curvebox are separate SVGs.", + "gridlines": "yes or no as strings. Default is 'yes'", + "gridlines_color": "Can be gray or any color in hex or rgb format. Default is ''#D3D3D3'", + "gridlines_stroke_width": "thickness of the line. Default is 0.20", + "grouped_or_independent_x_scales": "independent or grouped as exceptable answers as strings. When 'independent' the min and max value of each curve in a curvebox is used for x scale unless explicitly given for that curve. When 'grouped' is given, the max and min of all curves is calculated and used to create the x axis scale.", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it.", // not built yet + "curve_names": "array of strings representing curve_names like: ['GR','RESD']", + "curve_colors": "array of strings representing colors using common names or rgb style like:[\"black\",\"rgb(205,0,0,1)\"]", + "curve_stroke_dasharray": "A style for the curve line. Can be solid or a string of integers separated by commas like '5,5' or '20,10,10,5,10,10'", + "stroke_width": "The width of the curve line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "an array of objects one for each curve like: [{\"curve_name\":\"RHOB\",\"fill\":\"yes\",\"fill_direction\":\"left\",\"cutoffs\":[0.21,2.23,2.24],\"fill_colors\":[\"gray\",\"beige\",\"white\"],\"curve2\":\"\"}]", + "curve_units": "an array of strings that are curve units like: [\"g/cm2\",\"API\",\"\"] must equal length other curve fields", + "depth_limits": "An array of objects that contains the min and max depth for each curve like: [{\"min\":\"autocalculate\",\"max\":\"autocalculate\"}]", + "curve_limits": "An array of objects that hold the min and max curve values allow to cut off spurious value spikes, like: [{\"curve_name\":\"GR\",\"min\":0,\"max\":100},{\"curve_name\":\"PDF\",\"min\":0,\"max\":100}]", + "data": "Should be an array of objects where the keys in key:value pairs in each object are curve_names or UWI like: [{\"UWI\":\"111aa\",\"DEPTH\":4140.5,\"GR\":0},{\"UWI\":\"111aa\",\"DEPTH\":4141,\"GR\":0}] for the entire depth of the well being showin the curve_box", + "depth_curve_name": "A string of the curve that is the depth being plotted, like: 'DEPT'. Should be the same name as the depth curve in the array of objects in the data key above.", + ////// + "data_id": ["array of strings whose length must equal curve_units, curve_names, etc."], // not built yet + "well_names": "An array of strings that represent well names if multiple curves shown in same curve_box. If only one well name, only one is required.", // not built yet /// + "scale_linear_log_or_yours": "An array of either 'linear' or 'log' or {'yours':scale_obj} where scale_obj might be something like: scale_obj = d3.scaleLog().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) that uses any of the d3.js scales methods https://github.com/d3/d3/blob/master/API.md#scales-d3-scale", + + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "An array of strings that establish the color of the line of the curve. RGB or common color name, like 'red'. If absent, default is black", + "max_depth": "Any array of numbers where each represents the max depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the max depth is autocalculated from the max depth of the input data in the data field. This is default behavior.", + "min_depth": "Any array of numbers where each represents the min depth each curve is allowed to have. If a string of 'autocalculate' is used instead of a number then the min depth is autocalculated from the min depth of the input data in the data field. This is default behavior.", + "depth_type_string": "All the curves should be calculated and populated vs. this curve. Takes a string, like: 'DEPT'", + "depth_units_string": "units of depth, examples are meters,m., cm., feet, etc.", + "null_value": "An array of null values used for each curve. Default is no null values considered, but could be something like: ['-999.25','-999.25','-999.25','NA']" + } + ], + "lines": [ + { + "data_type": "must be string, will be ignored if not \"line\", \"curve\", or \"rectangle\"", + "label": "The label for horiztonal line in string form", + "depth": "number for the depth at which the line is placed", + "color": "string for the color of the line in common color name or RGB format. If '' then black will be used.", + "stroke_width": "A string with of px value for stroke width, like: '1px'. Default if absent is '1px'.", + "stroke_style": "Should be string, if not or doesnt exist will be treated as \"solid\"", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "transparency": "Should be float between 0.0 and 1.0. Otherwise default is 1.0." + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": "A number for the depth of the upper left corner of the rectangle", // + "x_starting_upper_left_corner": "A number for the x axis value of the upper left corner of the rectangle", + "width": "Width of rectangle as number", + "height": "Height of rectangle as number", + "stroke_width": "The width of the line. Example is '2px'. ", + "stroke_linecap": "Style of ending of line as a string. Options are 'butt' which is no ending, 'round', and 'square' as defined here: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-linecap Default is butt.", + "fill": "String that represents the color of the rectangle fill in either common color name or RGB like, 'red'", + "opacity": "Float between 0 and 1 that represents the opacity of the fill, default is 0.5", + "label": "String that appears on end of line and likely represents a top name, like: 'Top Jurassic Final Final Final'", // not built into plotting template yet + "label_orientation": "A string that is either 'horizontal' or 'vertical'. If other values, will treat as horizontal label orientation", // not built into plotting template yet + "lable_position": "Exceptable strings are top, center, right, left, bottom. Default right." // not built into plotting template yet + } + ] + }] + }]; + } else if (request_string == "mandatories") { + return [ + "This is not yet populated!!!!" + ]; + } + }, + + /** + * getFakeIncomingSparseDataExample is a function that takes nothing and returns a JSON of fake sparse incoming data. + * This is much less than the JSON wellio gives when it converts a LAS file into a JSON. This is one of the type examples of data input. It is an alternative to wellio.js style JSON. + * It is used next by funtion ____ and ___. + * @returns {array} returns an array that contains an object. probably just a single object? Many of the things like max and min depth that are auto-calculated when the input is a wellio JSON and instead explicitly defined here. This saves data transmission from a backend as well as front-end calculation time. + */ + getFakeIncomingSparseDataExample: function () { + input_sparse_style = [{ + "single_curve_box_or_cross_section": "single", + "cross_section_title": "", + "width": 1040, /// not skippable, check if number // default if blank or missing =250 or autocalculate? + "height": 500, /// not skippable, check if number // default if blank or missing=500 + //////////////////////////// + "curve_boxes": [{ + "curve_box": { + "show_well_name": "yes", // not built yet /// Should be skip-able /// default=No + "show_depth_type": "no", // not built yet /// Should be skip-able /// default=No + "show_curve_units": "yes", // not built yet /// Should be skip-able /// default=No + "curve_box_depth_min": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "curve_box_depth_max": -999, // not built yet /// Should be skip-able /// default=skip func if string or -999 + "take_out_null_or_visualize": "no", // not built yet /// Should be skip-able /// default=No + "show_title": "no", // not built into plotting template yet /// Should be skip-able /// default=No + "width": 260, /// not skippable, check if number // default if blank or missing =250 + "height": 500, /// not skippable, check if number // default if blank or missing=500 + "height_multiplier_components": 3, // default if missing is 0.95 + "margin": {"top": 50, "right": 10, "bottom": 30, "left": 60}, /// not skippable, check if number // defaults used if blank, string, or missing. If string or blank, add message to error message to console stating what default was used. + "title": {"text": "", "title_font_size": "10px"}, /// Should be skip-able // default=skip + "div_id": "well_holder4", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectangles", "lines"], // not built yet, default is curve, then line, then rectangle + "lines_connected_across_curve_boxes": "no", // not built yet, default is skip function + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": "#D3D3D3", + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + + }, + "components": [{ + "curves": [ + { + "data_type": "curve", // not built yet /// requires one of possible strings: curve, line, rectangle if not one of acceptable string it just skips it. + "data_id": "placeholder_data_id", // not built yet /// can be anything, just used for tracking & is optional + "well_name": "", // not built yet /// Ideally string. Will skip function if "" + "curve_type": "RHOB", // should be string. name of curve + "curve_values": [ + 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526, 2.2322, 2.2513, 2.2548, 2.2445, 2.2223, 2.2047, 2.198, 2.2088, 2.2248, 2.2399, 2.251, 2.255, 2.2526], /// Should be array. If not array, return error message? + "step": 0.1, /// Should be number. If not array, return error message? + "units": "g/cc", /// should be string but try to plot whatever as string. if greater than X length include error message in console about excessive length will look bad but still plot. + "scale_linear_log_or_yours": "linear", + ////// Plotting things but need to be next to curve data or will be too confusing. + "line_color": "rgb(205,0,0,1)", /// Test for string, if string use. If not string "black" + "curve_stroke_dasharray": "5,5", + "stroke_linecap": "butt", + "stroke_width": 0.5, + "fill": { + "curve_name": "RHOB", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0.21, 2.23, 2.24], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + }, + "data_ID": "", + "max_depth": "1607.3", /// should be number, if not number or doens't exit then "autocalculate" + "min_depth": "1598.3", /// should be number, if not number or doens't exit then "autocalculate" + "depth_type_string": "TVDSS", /// should be string, if not or doesn't exist, then skip func + "depth_units_string": "md", + "depth_curve_name": "DEPTH", /// should be string, ideally all depth curve names are the same + "null_value": "", // not built yet, can be anything. Skip if blank or "" or "unknown". If not skip, then look for any values that match after d3 style data object is generated and either take them out or give special value based on behavior defined for curvebox in key "take_out_null_or_visualize" above. + "x_max": 3, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + "x_min": 2, // not built yet /// should be number /// auto-calculate if not number or is "autocalculate" + } + ], + "lines": [ + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 1", /// Ideally a string. + "depth": 1601.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "blue", /// should be string, if not or doesn't exist use "black" + "stroke_width": "3px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 1.0 /// should be number between 0 and 1, if not or doesn't exist use 1. + }, + { + "data_type": "line", /// must be string, will be ignored if not "line", "curve", or "rectangle". + "label": "top 2", /// Ideally a string. + "depth": 1602.4, /// Should be Float or integer, attempt to convert to number if string. Otherwise skip this part entirely! + "color": "orange", /// should be string, if not or doesn't exist use "black" + "stroke_width": "5px", /// should be string, if not or doesn't exist use "1px" + "stroke_linecap": "butt", + "stroke_style": "solid", /// should be string, if not or doesn't exist use "solid" + "transparency": 0.5 /// should be number between 0 and 1, if not or doesn't exist use 1. + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 1601, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }] + }]; + return input_sparse_style; + } + , + + /////////////////////////////// + //// Functions for getting data from LAS files and reformatting to a wellio.js style JSON. + /////////////////////////////// + + /** + * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {object} well_log_json a full wellio style JSON + * @param {array} CurveNames array of curve names as strings + * @param {string} UWI a string the represents the well name + * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. + */ + convertWellJSONToObj: function (well_log_json, CurveNames, UWI, depth_curve_name) { + let depth = well_log_json["CURVES"][depth_curve_name]; + let curve_data = []; + for (let eachCr in CurveNames) { + curve_data.push(well_log_json["CURVES"][CurveNames[eachCr]]); + } + let array_of_obj = []; + if (depth.length === well_log_json["CURVES"][CurveNames[0]].length) { + for (let eachPt = 0; eachPt < depth.length; eachPt++) { + let obj = {}; + obj["UWI"] = UWI; + for (let i = 0; i < CurveNames.length; i++) { + obj[CurveNames[i]] = parseFloat(curve_data[i][eachPt]); + } + array_of_obj.push(obj); + } + } else { + console.log("depth didn't match curve length"); + array_of_obj.push("depth didn't match curve length"); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions for getting basic information out of wellio.js style JSON for plotting + /////////////////////////////// + + /////// this require wellio! + // fileToJSON:function (afile){ + // return module.exports.wellio.las2json(afile) + // }, + ///////// + // turnFilesIntoTextIntoWellioJSON:function (files_array){ + // //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + // let logs_in_json = [] + // for (let i = 0; i < files_array.length; i++) { + // logs_in_json.push(module.exports.fileToJSON(files_array[i])) + // } + // return logs_in_json + // }, + + + /** + * fromJSONofWEllGetThingsForPlotting is a function that takes in wellio style JSON of all LAS file well log information, + * and returns an object that contains 3 things in an object format that are used in function ___ for plotting. + * the data array of objects that D3.js likes for data used in plotting. + * @param {object} jsonWell a full wellio style JSON + * @param {string} depth_curve_name String for the depth curve name + * @returns {array} returns an object of 3 things that will eventually be used in plotting. {"well_log_curves_reformatted_for_d3":well_log_curves_reformatted_for_d3,"curve_names":curve_names,"uwi":uwi} + */ + fromJSONofWEllGetThingsForPlotting: function (jsonWell, depth_curve_name) { + curve_names = Object.keys(jsonWell["CURVES"]); + uwi = jsonWell["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + depth_curve_name = depth_curve_name; + well_log_curves_reformatted_for_d3 = module.exports.convertWellJSONToObj(jsonWell, curve_names, uwi, depth_curve_name); + return { + "well_log_curves_reformatted_for_d3": well_log_curves_reformatted_for_d3, + "curve_names": curve_names, + "uwi": uwi + }; + }, + + + /////////////////////////////// + //// Functions for reformatting data other than wellio.js style JSON + /////////////////////////////// + + + /** + * createDepthArray is a function that takes in a min float, max float, and step float value. + * and returns an array or depth values from the min to the max value going by the step value each step. + * This function is used to create a depth array for plotting when only the max, min, and depth is given explicitly in the input data. This might be done to avoid sending the depth curve from the backend to the front-end. + * @param {float} min a float or integer that represents the top depth of an eventual array of depth values that this function creates. + * @param {float} max a float or integer that represents the bottom depth of an array of depth values this function creates. + * @param {float} step a float or integer that represents the interval the depth curve increases as you go from the top to the bottom of the depth curve this function creates. + * @returns {array} returns an array of depth values from the min to the max by the step. AN EXAMPLE = [10,10.5,11,11.5,12] + */ + createDepthArray: function (min, max, step) { + //// Returns an array of depth values from min to max, including both, with each being different by step value + //// ran like: depthArray = createDepthArray(data2[0]["min_depth"],data2[0]["max_depth"],data2[0]["step"]) + let depth = []; + min = parseFloat(min); + max = parseFloat(max); + step = parseFloat(step); + let number_of_points = ((max - min) / step) + 1; + let temp_depth = min; + for (let i = 0; i < number_of_points; i++) { + temp_depth = (min + (i * step)).toFixed(7); + depth.push(parseFloat(temp_depth)); + } + return depth; + }, + + + /** + * takeInArraysAndGetObjectOfCurveDataForPlotting is a function used to reformt arrays of curve values into a form that d3.js likes better, an array of objects. + * THIS FUNCTION NEEDS CHANGED IT IS TOO EXPLICIT !!!!!!! + */ + takeInArraysAndGetObjectOfCurveDataForPlotting: function (arraysOfCurvesAndNames, CurveName, DepthName) { + //// would be run like: reformattedForWelliovizCurveData = takeInArraysAndGetObjectOfCurveDataForPlotting([{"depth":depthArray,"RHOB":data2[0].curve_values}],"RHOB") + // [{"depth":[],"curveData":[]}] + // [{"depth":[],"curveData":[]}] + let curveObj = []; + // make sure the curve data arrays are the same lenght, if not add null values + + // put them into object + let lengthOfCurve0 = arraysOfCurvesAndNames[0][DepthName].length; + for (let i = 0; i < lengthOfCurve0; i++) { + let newObj = {[DepthName]: 0, "RHOB": 0}; + newObj[DepthName] = arraysOfCurvesAndNames[0][DepthName][i]; + newObj[CurveName] = arraysOfCurvesAndNames[0][CurveName][i]; + curveObj.push(newObj); + } + return curveObj; + }, + + + /** + * convertWellJSONToObjV2 is a function that takes in sparse style JSON and other information and returns an array of that information properly packaged, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {array} depth An array of strings that can be parsed into floats that represents the depth along the well log curves in a curvebox. + * @param {array} curve_data An array of arrays of strings that can be parsed into floats that represents each of the well log curves in a curvebox. + * @param {string} UWI A string for the well log UWI ID + * @param {array} CurveNames An array of strings that represent curvenames, one for each well log curve in curve_data + * @returns {array} An array of objects properly formatted for next step ___. + */ + convertWellJSONToObjV2: function (depth, curve_data, UWI, CurveNames) { + depth = depth[0]; + array_of_obj = []; + for (eachPt in depth) { + obj = {}; + obj["UWI"] = UWI; + for (i in CurveNames) { + obj[CurveNames[i]] = parseFloat(curve_data[CurveNames[i]][eachPt]); + obj["DEPTH"] = parseFloat(depth[eachPt]); + } + array_of_obj.push(obj); + } + return array_of_obj; + }, + + + /////////////////////////////// + //// Functions that take in incoming sparse style JSON and a template and handle all the transformation into the JSON for plotting that is given to curveBox function. + /////////////////////////////// + + /** + * This function is used to put the incoming sparse style JSON information into the plotting tempalte JSON that is given to curveBox which then handles the plotting. + * @param {object} incoming_sparse This is a JSON object of incoming sparse style data & plotting instructions. + * @param {object} template This is a JSON example template of the type typically given to the curveBox function. The user will use if for defaults and replace the data and formatting options they want to change. + */ + putIncomingSparseJsonIntoPlottingTemplate: function (incoming_sparse, template) { + if (incoming_sparse[0]["single_curve_box_or_cross_section"] == "multiple") { + console.log("THERE WAS A PROBLEM IN THE FUNCTION putIncomingSparse_into_PlottingTemplate. THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE "); + return "THE CODE TO HANDLE CROSS SECTIONS HAS NOT BEEN WRITTEN YET!!!! BUT IT WOULD GO HERE"; + } else { + let curve_box_obj = incoming_sparse[0]["curve_boxes"][0]; + let curve_box_overall = incoming_sparse[0]["curve_boxes"][0]["curve_box"]; + let curve_box_components = incoming_sparse[0]["curve_boxes"][0]["components"]; + template[0]["curve_box"] = curve_box_overall; + template[0]["components"][0]["lines"] = curve_box_components[0]["lines"]; + template[0]["components"][0]["rectangles"] = curve_box_components[0]["rectangles"]; + + ///// Establish template with empty arrays except for value that are shared for all curves + ///// THESE HAVE A SINGLE VALUE ACROSS ALL CURVES IN A CURVEBOX + template[0]["components"][0]["curves"][0]["data_type"] = "curve"; + template[0]["components"][0]["curves"][0]["depth_type_string"] = curve_box_components[0]["curves"][0]["depth_type_string"]; + template[0]["components"][0]["curves"][0]["depth_units_string"] = curve_box_components[0]["curves"][0]["depth_units_string"]; + template[0]["components"][0]["curves"][0]["depth_curve_name"] = curve_box_components[0]["curves"][0]["depth_curve_name"]; + ///// THESE HAVE MULTIPLE VALUES IN A CURVEBOX ONE PER CURVE. + template[0]["components"][0]["curves"][0]["curve_names"] = []; + template[0]["components"][0]["curves"][0]["curve_colors"] = []; + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"] = []; + template[0]["components"][0]["curves"][0]["stroke_width"] = []; + template[0]["components"][0]["curves"][0]["stroke_linecap"] = []; + template[0]["components"][0]["curves"][0]["fill"] = []; + template[0]["components"][0]["curves"][0]["data_id"] = []; + template[0]["components"][0]["curves"][0]["well_names"] = []; + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"] = []; + template[0]["components"][0]["curves"][0]["line_color"] = []; + template[0]["components"][0]["curves"][0]["max_depth"] = []; + template[0]["components"][0]["curves"][0]["min_depth"] = []; + template[0]["components"][0]["curves"][0]["null_value"] = []; + + template[0]["components"][0]["curves"][0]["data"] = []; + + ///// For each curve object in incoming data: + let array_individual_curves_and_depth_objects = []; + let all_depths_list = []; + let all_depths_set = []; + + for (let i = 0; i < curve_box_components[0]["curves"].length; i++) { + + let curve = curve_box_components[0]["curves"][i]; + template[0]["components"][0]["curves"][0]["curve_names"].push(curve["curve_type"]); + template[0]["components"][0]["curves"][0]["curve_colors"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["curve_stroke_dasharray"].push(curve["curve_stroke_dasharray"]); + template[0]["components"][0]["curves"][0]["stroke_width"].push(curve["stroke_width"]); + template[0]["components"][0]["curves"][0]["stroke_linecap"].push(curve["stroke_linecap"]); + template[0]["components"][0]["curves"][0]["fill"].push(curve["fill"]); + template[0]["components"][0]["curves"][0]["data_id"].push(curve["data_id"]); + template[0]["components"][0]["curves"][0]["well_names"].push(curve["well_name"]); + template[0]["components"][0]["curves"][0]["scale_linear_log_or_yours"].push(curve["scale_linear_log_or_yours"]); + template[0]["components"][0]["curves"][0]["line_color"].push(curve["line_color"]); + template[0]["components"][0]["curves"][0]["max_depth"].push(curve["max_depth"]); + template[0]["components"][0]["curves"][0]["min_depth"].push(curve["min_depth"]); + template[0]["components"][0]["curves"][0]["null_value"].push(curve["null_value"]); + //// + let depth_array = module.exports.createDepthArray(curve["min_depth"], curve["max_depth"], curve["step"]); + let curve_array = curve["curve_values"]; + let curve_name = curve["curve_type"]; + let depth_curve_name = curve["depth_curve_name"]; + //// the function below is off...someting undefined + let obj_starter = [{[depth_curve_name]: depth_array, [curve_name]: curve_array}]; + + let reformatted_for_wellioviz_curve_data = module.exports.takeInArraysAndGetObjectOfCurveDataForPlotting(obj_starter, curve_name, depth_curve_name); + //// + array_individual_curves_and_depth_objects.push(reformatted_for_wellioviz_curve_data); + //// + + all_depths_list = all_depths_list.concat(depth_array); + } + + /// Get array of unique depth values from all curves by calling set on an array of depth values + all_depths_set = [...new Set(all_depths_list)]; + + let objects_helper = {}; + + for (let j = 0; j < all_depths_set.length; j++) { + /// create array of objects like [{"depthvalue":{"depth_curve_name":depthvalue},,,,}] + objects_helper[all_depths_set[j]] = {[template[0]["components"][0]["curves"][0]["depth_curve_name"]]: all_depths_set[j]}; + } + + //// now should have something like {0:{"DEPT":234},1:{"DEPT":234.5}.....} + //// for each curve {"depth":value,"curve_name":value} in each curve array of objects... + /////// for each object, check if "depth value exists in array of depth values", if it does, add {"curve_name":value} to the object + for (let k = 0; k < array_individual_curves_and_depth_objects.length; k++) { + let this_depth_plus_curve_obj = array_individual_curves_and_depth_objects[k]; + for (let l = 0; l < this_depth_plus_curve_obj.length; l++) { + let this_obj = this_depth_plus_curve_obj[l]; + + let curve_name = curve_box_components[0]["curves"][k]["curve_type"]; + let depth_name = curve_box_components[0]["curves"][k]["depth_curve_name"]; + + /// add curve value as key/value pair to right object based on depth key + + objects_helper[this_obj[depth_name]][curve_name] = this_depth_plus_curve_obj[l][curve_name]; + + } + } + + /// get rid of depth key and just have the objects..put in array if not returned as array + //// return only the keys...which should be [{},{"depth":23,"GR":40,"RESD":0}] + let data = Object.keys(objects_helper).map(function (key) { + return objects_helper[key]; + }); + + let depth_name = template[0]["components"][0]["curves"][0]["depth_curve_name"]; + data = data.sort(function (a, b) { + return parseFloat(a.depth_name) - parseFloat(b.depth_name); + }); + + // data = data.sort((a, b) => (a[depth_name] > b[depth_name]) ? 1 : -1) + function sortFloat(a, b) { + return a - b; + } + + function sortNumber(a, b) { + return parseFloat(a[depth_name]) - parseFloat(b[depth_name]); + } + + template[0]["components"][0]["curves"][0]["data"] = data.sort(sortNumber); + return template; + + } + }, + + + /////////////////////////////// + //// Functions that take Wellio.js style JSON and handle everything from transformation to plotting + /////////////////////////////// + + /** + * THE FUNCTION putArrayOfLogsIntoSection NEEDS DOCUMENTATION! + * @param {*} logs_in_json + * @param {*} div_id + * @param {*} example_template + * @param {*} curve_name + * @param {*} curve_color + * @param {*} curve_unit + * @param {*} fill + * @param {*} depth_name + * @param {*} width + * @param {*} height + */ + putArrayOfLogsIntoSection: function (logs_in_json, div_id, example_template, curve_name, curve_color, curve_unit, fill, depth_name, width, height) { + const noSVG = module.exports.d3.select("#" + div_id).selectAll("svg").remove(); + // let logs_in_json = module.exports.turnFilesIntoTextIntoWellioJSON(logs) + let new_templates = []; + for (let i = 0; i < logs_in_json.length; i++) { + let three_things2 = module.exports.fromJSONofWEllGetThingsForPlotting(logs_in_json[i], depth_name); + let new_data = three_things2["well_log_curves_reformatted_for_d3"]; + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = new_data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = [three_things2["uwi"]]; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = [curve_name]; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = [curve_color]; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = [curve_unit]; + example_template_n[0]["components"][0]["curves"][0]["fill"] = [fill]; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_name; + let svg_holder = module.exports.d3.select("#" + div_id).append("div"); + svg_holder.style("vertical-align", "middle") + .attr("id", div_id + "svg_holder" + i) + .style("display", "inline-block"); + example_template_n[0]["curve_box"]["div_id"] = div_id + "svg_holder" + i; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + new_templates.push(example_template_n); + module.exports.curveBox(example_template_n); + } + return new_templates; + }, + + /** + * minimumDataIntoTemplateFunc + * @param + */ + minimumDataIntoTemplateFunc: function (example_template, data, well_names, curve_names, curve_colors, curve_units, fill, div_id, width, height, depth_curve_name) { + //// remember that all curve components should be an array, even if one item! + let example_template_n = JSON.parse(JSON.stringify(example_template)); + example_template_n[0]["components"][0]["curves"][0]["data"] = data; + example_template_n[0]["components"][0]["curves"][0]["well_names"] = well_names; + example_template_n[0]["components"][0]["curves"][0]["curve_names"] = curve_names; + example_template_n[0]["components"][0]["curves"][0]["curve_colors"] = curve_colors; + example_template_n[0]["components"][0]["curves"][0]["curve_units"] = curve_units; + example_template_n[0]["components"][0]["curves"][0]["fill"] = fill; + example_template_n[0]["components"][0]["curves"][0]["depth_curve_name"] = depth_curve_name; + example_template_n[0]["curve_box"]["div_id"] = div_id; + example_template_n[0]["curve_box"]["width"] = width; + example_template_n[0]["curve_box"]["height"] = height; + return example_template_n; + }, + + + /////////////////////////////// + //// Actual plotting functions after all the necessary information is compiled in necessary format + /////////////////////////////// + + /** + * CurveBox is the central function to wellioviz in a lot of ways, not least as it holds the d3.js code. It takes a JSOn template, appends the resulting SVG to a defined DIV. + * @param {object} well_curve_config_template + * @returns {*} SVG.node() But its main function is to append this SVG to a DIV given in the template that is the single parameter. + */ + curveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + + ////////////// DEFINING VARIABLES so the longer name doesn't have to be used ////////////// + //// These parts of the function establish variables from the config JSON in shorter variable names + //// If they are necessary for plotting & there is a chance the template might not include them, then default values might be defined here for cases where they are accidentally not defined + // default values might be defined here for cases where they are accidentally not defined + + let template_overall = template_for_plotting[0]["curve_box"]; + let template_components = template_for_plotting[0]["components"]; + let template_curves = template_components[0]["curves"][0]; + let template_lines = template_components[0]["lines"]; + let template_rectangles = template_components[0]["rectangles"]; + let title = ""; + //// Determine if title exists for the curve_box. + if (template_overall["show_title"] != "yes") { + let title = ""; + } else { + title = template_overall["title"]["text"]; + } + /// Parameters that define shape & size of overall curve box + let width = template_overall["width"]; + let height_multiplier_components = 0.95; + if (template_overall["height_multiplier_components"]) { + height_multiplier_components = template_overall["height_multiplier_components"]; + } + let height = template_overall["height"] * height_multiplier_components; + let height_components = template_overall["height"]; + let margin = template_overall["margin"]; + let header_sep_svg_or_not = template_overall["header_sep_svg_or_not"]; + let svg_header_height = template_overall["svg_header_height"]; + let gridlines = template_overall["gridlines"]; + let gridlines_color = template_overall["gridlines_color"]; + let gridlines_stroke_width = template_overall["gridlines_stroke_width"]; + //// variables for how to draw mouseover of hover box + let mouseover_yes_or_no = template_overall["mouseover_yes_or_no"]; + let mouseover_depth_or_depth_and_curve = template_overall["mouseover_depth_or_depth_and_curve"]; + let mouseover_curvename = template_overall["mouseover_curvename"]; //// default is first curve + let mouseover_color_or_default_which_is_curve_color = template_overall["mouseover_color_or_default_which_is_curve_color"]; + + let secondary_depth_exist = "no"; // THIS IS NOT YET EXISTING IN PLOTTING INPUT JSON SO HARDCODING FOR NOW + + //// Data is in d3.js form. An array of objects consisting of single level key:value pairs + let data = template_curves["data"]; + //// Variables related to curves, these should all be arrays with one or more values! + let curve_names = template_curves["curve_names"]; + let curve_colors = template_curves["curve_colors"]; + let curve_stroke_dasharray = template_curves["curve_stroke_dasharray"]; + let curve_name = curve_names[0]; + let curve_color = curve_colors[0]; + let curve_units = template_curves["curve_units"]; + let scale_linear_log_or_yours = template_curves["scale_linear_log_or_yours"]; + if (template_curves["curve_units"]) { + curve_units = template_curves["curve_units"]; + } else { + curve_units = ""; + } + + //////// NEED TO MAKE THIS FLAG IN INPUT PLOTTING JSON + let flag_for_single_scale_or_independent_scales = template_overall["grouped_or_independent_x_scales"]; + let grouped_or_independent_x_scale = template_overall["grouped_or_independent_x_scales"]; + + + //// The depth_curve_name needs to be the same for all curves plotted! + let depth_curve_name = ""; + if (template_curves["depth_curve_name"].length > 1 && typeof (template_curves["depth_curve_name"]) == "object" && template_curves["depth_curve_name"][0] !== template_curves["depth_curve_name"][1] + ) { + depth_curve_name = "depth_curve_name is not the same in two or more curves"; + } else { + depth_curve_name = template_curves["depth_curve_name"]; + } + let depth_type_string = ""; + if ( + template_curves["depth_type_string"].length > 1 && typeof (template_curves["depth_type_string"]) == "object" && template_curves["depth_type_string"][0] != template_curves["depth_type_string"][1] + ) { + depth_type_string = "depth type string is not the same in two or more curves"; + } else if (template_curves["depth_type_string"][0] == "") { + depth_type_string = ""; + } else if (template_curves["depth_type_string"]) { + depth_type_string = "- " + template_curves["depth_type_string"]; + } + let depth_units_string = ""; + if (template_curves["depth_units_string"] && template_curves["depth_units_string"][0] !== "") { + depth_units_string = "- " + template_curves["depth_units_string"]; + } + + ///// THIS LINE BELOW DOESN"T MAKE ANY SENSE, CHANGE //// + let div_id = template_overall["div_id"]; + if (template_overall["div_id"]) { + div_id = template_overall["div_id"]; + } else { + return "there_was_no_div_id_in_the_template"; + } + + d3.select("#" + div_id).selectAll("*").remove(); + + ///////// NEED TO FIX DEPTHS AS THERE ARE MULTIPLE DEPTH LIMITS AND THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// +// //// Calculate depth min and max if depth min and/or max is not given explicitly in the template + let depth_min; + let depth_max; + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["min"] == "autocalculate") { + depth_min = d3.min(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_min = template_curves["depth_limits"][0]["min"]; + } + //// max depth + if (!template_curves["depth_limits"] || template_curves["depth_limits"][0]["max"] == "autocalculate") { + depth_max = d3.max(data, function (d) { + return +d[depth_curve_name]; + }); + } else { + depth_max = template_curves["depth_limits"][0]["max"]; + } + + + // [depth_max,depth_min] + //// Apply depth min and max to incoming well log data + //// To save time, we'll first check if the first object in the array had as depth that is smaller than min + //// and check if the last object in the array has a depth that is larger than the max, if not. we do nothing. + + if (data[0][depth_curve_name] > depth_min && data[-1][depth_curve_name] < depth_max) { + } else { + data = data.filter(function (objects) { + return objects[depth_curve_name] > depth_min && objects[depth_curve_name] < depth_max; + }); + } + + // let depth_min = -1000000 + // let depth_max = 1000000 + + if (template_curves["min_depth"][0] == "autocalculate" || template_curves["min_depth"] == "autocalculate") { + depth_min = data[0][depth_curve_name]; + } else { + depth_min = template_curves["min_depth"]; + } + if (template_curves["max_depth"][0] == "autocalculate" || template_curves["max_depth"] == "autocalculate") { + depth_max = data[data.length - 1][depth_curve_name]; + } else { + depth_max = template_curves["max_depth"]; + } + + // let depth_min = template_curves["min_depth"][0] + // let depth_max = template_curves["max_depth"][0] + + ///////// <=== NEED TO FIX DEPTHS. THEY NEED TO BE CALCULATED PROPERLY !!!!! ////////////////////////// + + ////////////// Initiate Divs + SVGs. Different depending single SVG or header separate =>////////////// + let svg = ""; + let svg_holder = ""; + let svg_header = ""; + if (header_sep_svg_or_not == "yes") { + + svg_holder = d3.select("#" + div_id).append("div") + .attr("class", "svg_holder") + .style("overflow-x", "auto"); + + svg_header = d3.select("#" + div_id + " div.svg_holder").append("svg"); + svg_header.attr("class", "header"); + svg_header.attr("width", width) + .attr("height", svg_header_height); ///// THIS SHOULD BE CHANGED TO A KEY:VALUE PAIR IN TEMPLATES!!! + svg_header.append("g"); + svg_header.style("display", "block"); + + let depth_string_on_top = ""; + if (depth_type_string == "") { + depth_string_on_top = depth_curve_name; + } else { + depth_string_on_top = depth_type_string.replace("- ", ""); + } + + svg_header.append("text") + .attr("x", (margin.left) / 2) + .attr("y", "1em") + .attr("text-anchor", "middle") + .style("font-size", "10px") + .style("text-decoration", "underline") + .text(depth_curve_name); + if (depth_type_string != "") { + let depth_type_string_x_pos = 0; + let depth_type_string_x_pos_anch = "start"; + if (secondary_depth_exist == "no") { + depth_type_string_x_pos = margin.left / 2; + depth_type_string_x_pos_anch = "middle"; + } + svg_header.append("text") + .attr("x", depth_type_string_x_pos) + .attr("y", "3em") + .attr("text-anchor", depth_type_string_x_pos_anch) + .style("font-size", "8px") + .style("text-decoration", "underline") + .text(depth_string_on_top); + } + + //svg_header.append("text") + // .attr("x", margin.left) + // .attr("y", "4em") + // .attr("text-anchor", "end") + // .style("font-size", "6px") + // .style("text-decoration", "underline") + // .text("2nd TVD"); + + ///////// change this!!!!! + if (title !== "Elephants") { + let distance_from_top = -15; + svg_header.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + const curveBox_main_div = d3.select("#" + div_id).append("div"); + curveBox_main_div + .attr("height", height_components + "px") + .attr("class", "component_outter") + .style("display", "flex") + .style("position", "relative") + .style("box-sizing", "border-box"); + + const curveBox_sub_div = d3.select("#" + div_id + " div.component_outter").append("div"); + curveBox_sub_div + .attr("class", "component_inner") + .style("overflow-y", "auto") + .style("position", "absolute") + .style("max-height", height_components + "px"); + + svg = d3.select("#" + div_id + " div.component_outter div.component_inner").append("svg"); + } else { + svg = d3.select("#" + div_id).append("svg"); + } + + ////////////// Calculate Axis & Scales =>////////////// + //// Need to handle: zero curves, arbitrary number of curves, and min/max of all curves in single axis. + //// For zero curves, need to look into rectange and lines for x scales maybe? + //// Need to handle scales in linear, log, or arbitary user-provided scale. + //// Also, need x function for gridlines! so....? + + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let mins = []; + let maxes = []; + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + let min_all_curves = d3.min(mins); + let max_all_curves = d3.max(maxes); + + if (curve_names.length == 0) { + //// THIS NEEDS TO CHANGE TO LOOK AT RECTANGLE AT SOME POINT!!!!!! + min_all_curves = 0; + max_all_curves = 100; + } + ////////////// Calculate x domain extent for one or more than one curve, used in scaling =>////////////// + let x_func; + let x; + let xAxis_header; + let xAxis; + if (flag_for_single_scale_or_independent_scales = "single") { + for (let i = 0; i < curve_names.length; i++) { + let min_this = d3.min(data, function (d) { + return +d[curve_names[i]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[i]]; + }); + mins.push(min_this); + maxes.push(max_this); + } + min_all_curves = d3.min(mins); + max_all_curves = d3.max(maxes); + x = d3.scaleLinear().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_all_curves, max_all_curves]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + xAxis_header = g => g.attr("transform", "translate(0,45)").call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + + + } + + //////////////////// define y scale, aka the one for the depth //////////////////// + let y = d3.scaleLinear().domain([depth_max, depth_min]).range([height - margin.bottom, margin.top]); + //let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + let yAxis2 = g => g.attr("transform", `translate(${margin.left - 35},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain")); + + + ////////////// Building curvebox parts that aren't header. First define size & title =>////////////// + svg.attr("class", "components"); + svg.attr("width", width) + .attr("height", height); + svg.style("margin", "0 auto"); + svg.style("overflow", "scroll"); + + if (header_sep_svg_or_not == "no") { + let xAxis = xAxis_header; + svg.append("g") + .call(xAxis) + .append("text") + .text("test svg"); + } + + let y_axis_text = depth_curve_name + " " + depth_units_string + " " + depth_type_string; + svg.append("g") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("dy", ".75em") + .attr("y", 0 - (margin.left * 0.6)) + .attr("x", ((height) / -2) + margin.top) + .style("text-anchor", "end") + .text(y_axis_text) + .style("fill", "#2b2929"); + + //// + // svg.append("g") + // .call(yAxis2) + // .append("text") + // .attr("transform", "rotate(-90)") + // .attr("dy", ".75em") + // .attr("y", -35) + // .attr("x",((height)/-2)+margin.top) + // .style("text-anchor", "end") + // .text(y_axis_text+"THIS IS THE SECOND ONE") + // .style("fill","#2b2929") + //// + + //svg.append("g") + //// Code that assumes multiple curves are plotted in same curvebox + let distance_from_top = -15; + if (title !== "") { + svg.append("text") // + .attr("x", (margin.left / 3 + (width / 2))) + .attr("y", 0 + (-distance_from_top)) + .attr("text-anchor", "middle") + .style("font-size", template_overall["title"]["title_font_size"]) + .text(title); + } + + if (gridlines == "yes") { + var gridlines_obj = d3.axisTop() + .ticks((width - margin.left - margin.right) / 25) + .tickFormat("") + .tickSize(-height + margin.top + 10) + .scale(x); + svg.append("g") + .attr("class", "grid") + .call(gridlines_obj) + .style("stroke", gridlines_color) + .style("stroke-width", gridlines_stroke_width); + } + + +// //// This will help save the x axis function for first curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_0 +// //// This will help save the x axis function for second curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_1 +// //// This will help save the x axis function for third curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_2 +// //// This will help save the x axis function for fourth curve if there are more than one curve +// /// and they are at different scales. We need this in order to use the 'between' method of fill! +// let x_for_k_is_3 + + let x_functions_for_each_curvename = {}; //// populate with {"curvename":curvename,"x_func":func} + + ////////////// Building curves within curvebox =>////////////// + for (let k = 0; k < curve_names.length; k++) { + //// code that creates a line for each Curve in order provided and applies + //// the color in the color array in order provided + + let curveUnit = ""; + if (curve_units[k]) { + curveUnit = curve_units[k]; + } + let min = mins[k]; + let max = maxes[k]; + + let header_text_line = min.toFixed(1) + " - " + curve_names[k] + " " + curveUnit + " - " + max.toFixed(1); + let min_this = d3.min(data, function (d) { + return +d[curve_names[k]]; + }); + let max_this = d3.max(data, function (d) { + return +d[curve_names[k]]; + }); + let x = d3.scaleLinear().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + if (scale_linear_log_or_yours == "log") { + x = d3.scaleLog().domain([min_this, max_this]).nice().range([margin.left, width - margin.right]); + } else if (scale_linear_log_or_yours == "linear") { + } else if (typeof (scale_linear_log_or_yours) !== "string") { + x = scale_linear_log_or_yours["yours"]; + } + if (k == 0) { + x_func == x; + } + //// This creates an object to hold multiple x axis scale functions + //// that will be used if 'between' style fill is selected. + x_functions_for_each_curvename[curve_names[k]] = x; + + ////////////// Header text, two way depending on =>////////////// + if (header_sep_svg_or_not == "yes") { + let distance_from_top = (1 + (k * 2.7)).toString() + "em"; + svg_header.append("text") + .attr("x", (margin.left + width) / 2) + .attr("y", 0 + distance_from_top) + .attr("text-anchor", "middle") + .style("font-size", "11px") + .style("text-decoration", "underline") + .style("fill", curve_colors[k]) + .text(header_text_line); + let translate_string = "translate(0," + (45 - (30 * k)).toString() + ")"; + xAxis_header = g => g.attr("transform", translate_string).call(d3.axisBottom(x).ticks((width - margin.left - margin.right) / 25).tickSizeOuter(0)); + svg_header.append("g") + .call(xAxis_header) + .append("text"); + + } + let another_line = d3.line().x(d => x(d[curve_names[k]])).y(d => y(d[depth_curve_name])); + ////////////// Appends a curve line but doesn't include fill yet =>////////////// + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curve_colors[k]) + .attr("stroke-width", template_curves["stroke_width"][k]) + .attr("stroke-linecap", template_curves["stroke_linecap"][k]) + .attr("stroke-dasharray", curve_stroke_dasharray[k]) + .attr("d", another_line); + } + + + ////////////// define the area filled under the curve =>////////////// + + for (let i = 0; i < template_curves["fill"].length; i++) { + //let i = k + if (template_curves["fill"][i]["fill"] == "yes") { + let number_colors = template_curves["fill"][i]["fill_colors"].length; + let curve_name1 = template_curves["fill"][i]["curve_name"]; + let threshold = -99999999; + let fill_color = "gray"; + for (let j = 0; j < number_colors; j++) { + let area1 = d3.area(); + if (number_colors != 0) { + threshold = template_curves["fill"][i]["cutoffs"][j]; + fill_color = template_curves["fill"][i]["fill_colors"][j]; + } + if (template_curves["fill"][i]["fill_direction"] == "left") { + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => x(d[curve_name1])) + .x0(d => start_from_left) + .defined(d => ((d[curve_name1]) > threshold)) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "right") { + let start_from_right = template_overall["margin"]["right"]; + let start_from_left = template_overall["margin"]["left"]; + area1 + .x1(d => width - start_from_right) + .defined(d => ((d[curve_name1]) > threshold)) + .x0(d => x(d[curve_name1])) + .y(d => y(d[depth_curve_name])); + } + if (template_curves["fill"][i]["fill_direction"] == "between") { + let between_2_curve = template_curves["fill"][i]["curve2"]; + //// for through x_functions_for_each_curvename object and find the key that + //// matches between_2_curve which should be a curvename + //// get the x function for the second curve and the curve that is curvenames[k] + let second_curve_x_func = x_functions_for_each_curvename[between_2_curve]; + let first_curve_x_func = x_functions_for_each_curvename[curve_name1]; + area1 + .x1(d => first_curve_x_func(d[curve_name1])) + .x0(d => second_curve_x_func(d[between_2_curve])) + // .defined(d => ((d[curve_name1])<=d[between_2_curve])) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill", fill_color) + .attr("fill-opacity", 0.8); + } + } + } + + //////////////// TOOLTIP Part 1 /////////////////// + if (mouseover_yes_or_no == "no") { + console.log("mouseover_yes_or_no = 'no' so no mouseover or hover of depth or curve value will be shown"); + } else { + //// statements to make sure the mouseover_curvename is a present curve and if not use first curve + if (mouseover_curvename == "default") { + mouseover_curvename = curve_names[0]; + } else if (curve_names.includes(mouseover_curvename)) { + mouseover_curvename = mouseover_curvename; + } else { + mouseover_curvename = curve_names[0]; + } + + //// statement to handle color of curve text and circle on hover + let curve_on_mouseover_color = curve_colors[0]; + if (mouseover_color_or_default_which_is_curve_color != "default") { + curve_on_mouseover_color = mouseover_color_or_default_which_is_curve_color; + } + + //// appends start of mouseover rectange used for showing hover content + var focus = svg.append("g") + .style("display", "none"); + + var bisectDate = d3.bisector(function (d) { + return d[depth_curve_name]; + }).left; // ** + + //// function called to change hover style & contents when mouseover rectangle appended to svg svg + function mousemove() { + var y0 = y.invert(d3.mouse(this)[1]), + i = bisectDate(data, y0, 1), + d0 = data[i - 1], + d1 = data[i], + d = y0 - d0[depth_curve_name] > d1[depth_curve_name] - y0 ? d1 : d0; + + //// fixed value along y axis + let fixed_x_value = width * 0.8; + + //// depth value + focus.select("text.y2") + .attr("transform", + // "translate(" + x(d[mouseover_curvename]) + "," + + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[depth_curve_name]); + + //// curve value + focus.select("text.y4") + .attr("transform", + "translate(" + fixed_x_value + "," + + y(d[depth_curve_name]) + ")") + .text(d[curve_names[0]]); + + focus.select(".x") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + 0 + + ")") + .attr("y2", height); + //// circle y class part 2 + focus.select(".y") + .attr("transform", + "translate(" + x(d[mouseover_curvename]) + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + focus.select(".yl") + .attr("transform", + "translate(" + 0 + "," + + y(d[depth_curve_name]) + ")") + .text(d[mouseover_curvename]); + } + + // append the x line + focus.append("line") + .attr("class", "x") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("y1", 0) + .attr("y2", width); + + // append the y line + focus.append("line") + .attr("class", "yl") + .style("stroke", "blue") + .style("stroke-dasharray", "3,3") + .style("opacity", 0.5) + .attr("x1", 0) + .attr("x2", height); + + // append the circle at the intersection + focus.append("circle") + .attr("class", "y") + .style("fill", "none") + .style("stroke", curve_on_mouseover_color) + .attr("r", 3); + + //// depth value on hover + if (mouseover_depth_or_depth_and_curve == "depth" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y2") + .attr("dx", 6) + .attr("dy", "-.3em") + .style("font-size", "0.55em"); + } + + //// curve value on hover + if (mouseover_depth_or_depth_and_curve == "curve" || mouseover_depth_or_depth_and_curve == "depth_and_curve") { + focus.append("text") + .attr("class", "y4") + .attr("dx", 1) + .attr("dy", "0.5em") + .style("font-size", "0.55em") + .style("fill", "black") + .style("stroke", curve_on_mouseover_color) + .style("stroke-width", "0.5px"); + } + + // append the rectangle to capture mouse // ********** + svg.append("rect") // ********** + .attr("width", width) // ********** + .attr("height", height) // ********** + .style("fill", "none") // ********** + .style("pointer-events", "all") // ********** + .on("mouseover", function () { + focus.style("display", null); + }) + .on("mouseout", function () { + focus.style("display", "none"); + }) + .on("mousemove", mousemove); // ********** + } + + ////////////// Horizontal Lines AKA tops =>////////////// + try { + for (let i = 0; i < template_lines.length; i++) { + let this_line = template_lines[i]; + svg.append("line") + .attr("x1", 0 + margin.left) + .attr("y1", y(this_line["depth"])) + .attr("x2", width * 0.75) + .attr("y2", y(this_line["depth"])) + .style("stroke-width", this_line["stroke_width"]) + .style("stroke", this_line["color"]) + .style("stroke-dasharray", this_line["stroke-dasharray"]) + .style("stroke-linecap", this_line["stroke_linecap"]) + .style("fill", "none"); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_line["depth"])) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_line["label"]); + } + } catch (err) { + console.log("could not do lines for tops in curveBox function, error: ", err); + } + + ////////////// Rectangles for things like cores & sample locations =>////////////// + try { + for (let i = 0; i < template_rectangles.length; i++) { + let this_rectangle = template_rectangles[i]; + svg.append("rect") + .attr("x", 50 + margin.left) + .attr("y", y(this_rectangle.depth_top)) + .attr("width", this_rectangle.width) + .attr("height", this_rectangle.height) + .style("stroke-width", this_rectangle.stroke_width) + .style("stroke-linecap", this_rectangle.stroke_linecap) + .style("stroke", "purple") + .style("fill", this_rectangle.fill) + .style("opacity", this_rectangle.opacity); + + svg.append("text") + .attr("x", width * 0.75) + .attr("y", y(this_rectangle.depth_top)) + .attr("text-anchor", "start") + .style("font-size", "12px") + .text(this_rectangle.label); + } + } catch (err) { + console.log("could not do rectangle in curveBox function for some reason. error= ", err); + } + + ////////////// Calling node. Only returning svg node for saving single SVG file purposes =>////////////// + svg_holder.node(); + svg_header.node(); + return svg.node(); + }, + + + ////////// + /** + * This function is used to plot multiple curveboxes in a row. AKA makes a cross-section. It calls curveBox multiple times. + * @param {string} div_id a string that represents the div ID that the multiple curveboxes will be appended to + * @param {object} templates An array of CurveBox input templates + * @param {boolean} show_all is a boolean value that decides whether or not multiple plots are shown in a multiple log plot div. If show_all is false however, the developer must switch their CSS to be "inline-block" one at a time via some other means. If they don't,none will appear! + */ + multipleLogPlot: function (div_id, templates, show_all = true) { + let d3 = module.exports.d3; + let noDIV = d3.select("#" + div_id).selectAll("div").remove(); + let noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let new_templates = []; + for (let i = 0; i < templates.length; i++) { + let curvebox_holder = d3.select("#" + div_id).append("div"); + curvebox_holder.style("vertical-align", "middle") + .attr("id", div_id + "curvebox_holder" + i); + //// to control view of plots on site, user can show-hide by triggering action here. However, if show_all = false then none will show, so developer will need to change CSS with another function one by one! + if (show_all) { + curvebox_holder.style("display", "inline-block"); + } else { + curvebox_holder.style("display", "none"); + } + templates[i][0]["curve_box"]["div_id"] = div_id + "curvebox_holder" + i; + new_templates.push(templates[i]); + let template = templates[i]; + let check = module.exports.curveBox(template); + } + return new_templates; + }, + /** + * This function is used to plot a single curvebox in the div listed in the plotting templates div_id key. + * When called it removes anything that is a child of the div listed in div_id before appending a new curveBox there. + * @param {string} template_for_plotting A JSON of all the information needed to be plotted using the format of wellioviz exactly. + * @returns {string} curve_box_return - A string representation of the SVG variable called SVG. This can be fiven to the saveSvg function to save the SVG as a file with .svg ending. + */ + makeThisCurveBox: function (template_for_plotting) { + let d3 = module.exports.d3; + let div_id = template_for_plotting[0]["curve_box"]["div_id"]; + const noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + let curve_box_return = module.exports.curveBox(template_for_plotting); + return curve_box_return; + }, + /** + * This function is used to save a given SVG element with a given name. It creates a download link div which is then used to download the SVG file. + * In certain environments, this may not work for security reasons. + * @param {string} svgEl An SVG element returned from the curveBox function. + * @param {string} name The name of the file to be downloaded. + */ + saveSvg: function (svgEl, name) { + svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg"); + var svgData = svgEl.outerHTML; + var preface = "\r\n"; + var svgBlob = new Blob([preface, svgData], {type: "image/svg+xml;charset=utf-8"}); + var svgUrl = URL.createObjectURL(svgBlob); + var downloadLink = document.createElement("a"); + downloadLink.href = svgUrl; + downloadLink.download = name; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + }; + + return module.exports; + }); + + }).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + }, {"d3": 39, "wellio": 40}], + 4: [function (require, module, exports) { +// well_curve_config_template = [ +// {"multipleLines":"yes","curveNames":["GR"], +// "curveColors":["black","pink"], +// "fill":[ +// {"curveName":"GR","fill":"yes","fillDirection":"left","cutoffs":[0,ShaleSiltCutOff,SiltSandCutOff],"fillColors":["gray","orange","yellow"],"curve2":""}, +// {"curveName":"RESD","fill":"no","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} +// ], +// "data":well_log_converted_to_d3_friendly, +// "width":200, +// "height":400, +// "margin":({top: 20, right: 3, bottom: 30, left: 30}), +// "depth_curve_name":"DEPTH"}] + + +// function makePlot(single_curve,div,height,width,domain_x,domain_y,curve_name){ +// // "#log_plot_div" +// var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() +// console.log("got to second part of makePlot2 and b2 = ",b2) +// g3.log(b2,single_curve).draw() +// console.log("got to second part of makePlot2 and b2 = ",b2) + +// } + +// function makePlot2(single_curve,div,height,width,domain_x,domain_y,curve_name){ +// // "#log_plot_div" +// // var div = "dl_trial_a" +// var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() +// console.log("1 got to second part of makePlot2 and b2 = ",b2) +// g3.log(b2,single_curve).draw() +// console.log("2 got to second part of makePlot2 and b2 = ",b2) + +// } + +// function draw_curveG3(curve,div){ +// if(!div){div = "#log_plot_div"} +// if(!curve){ +// curve = "GR"; +// console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) +// } +// console.log("curve = ",curve) +// var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] +// makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) +// } + + +// function reformatJSONforPlotting(temp_json,curve,div){ +// wellioviz.fromJSONofWEllGetThingsForPlotting(well_log_json,"DEPTH") +// } + + function reformatJSONforPlotting(temp_json, curve, div) { + // generic_template = [ + // {"multipleLines":"yes", + // "curveNames":[curve], + // "curveColors":["black","pink"], + // "fill":[ + // {"curveName":curve,"fill":"yes","fillDirection":"left","cutoffs":[0,65,75,89],"fillColors":["lightgreen","green","red","pink"],"curve2":""}, + // {"curveName":"PHID","fill":"yes","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} + // ], + // "data":"data_goes_here_once_formatted", + // "width":250, + // "height":600, + // "margin":({top: 20, right: 3, bottom: 30, left: 30}), + // "depth_curve_name":"DEPT", + // "divID":div + // }] + + generic_template = [ + { + "curve_box": { + "show_well_name": "yes", /// not built yet + "show_depth_type": "yes", /// not built yet + "show_curve_units": "yes", /// not built yet + "curve_box_depth_min": -999, /// not built yet + "curve_box_depth_max": 9990000, /// not built yet + "take_out_null_or_visualize": "no", /// not built yet + "show_title": "yes", + "width": 260, + "height": 400, + "height_multiplier_components": 1, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "log_plot_div", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component": ["curves", "rectanges", "lines"], /// not built yet + "lines_connected_across_curveboxes": "no", /// not built yet + "header_sep_svg_or_not": "yes", + "svg_header_height": "4em", + "gridlines": "yes", + "gridlines_color": '#D3D3D3', + "gridlines_stroke_width": 0.20, + "grouped_or_independent_x_scales": "independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no": "yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve": "depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename": "default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color": "default" /// default is default, which then uses curve color or black + }, + "components": [{ + "curves": [ + { + "data_type": "curve", + "curve_names": [curve], + "curve_colors": ["#0375D8"], + "curve_stroke_dasharray": ["solid"], + "stroke_linecap": ["butt"], + "stroke_width": [1], + "fill": [ + { + "curve_name": curve, + "fill": "yes", + "fill_direction": "left", + "cutoffs": [0, 5, 999], + "fill_colors": ["gray", "beige", "white"], + "curve2": "" + } + ], + "curve_units": [""], + "depth_limits": [{"min": "autocalculate", "max": "autocalculate"}], + "curve_limits": [{"curve_name": "", "min": -10000000, "max": 3}], + "data": "not here yet",/// not built yet + "depth_curve_name": "DEPT",/// not built yet + ////// + "data_id": ["placeholder_data_id",], /// not built yet + "well_names": [""], /// not built yet + "scale_linear_log_or_yours": ["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string": [""], + "depth_units_string": [""], + "null_value": [""], /// not built yet + } + ], + "lines": [ + { + "data_type": "line", /// not built yet + "label": "example", /// not built yet + "depth": -999, /// not built yet + "color": "red", /// not built yet + "stroke_width": "3px", /// not built yet + "stroke_style": "solid", /// not built yet + "transparency": 1.0, /// not built yet + "stroke_linecap": "butt" + } + ], + "rectangles": [ + { + "data_type": "rectangle", + "depth_top": 0, + "x_starting_upper_left_corner": 0, + "width": 100, + "height": 100, + "stroke_width": "2px", + "stroke_linecap": "butt", + "fill": "red", + "opacity": 0.5, + "label": "Core Example", // not built into plotting template yet + "label_orientation": "horizontal", // not built into plotting template yet + "lable_position": "right" // not built into plotting template yet + } + ] + }] + }] + /////////// + console.log("depth curve name used", generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) + wellDataForPlotting = wellioviz.fromJSONofWEllGetThingsForPlotting(temp_json, generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) + curveDataFormatted = wellDataForPlotting["well_log_curves_reformatted_for_d3"] + curve_names = wellDataForPlotting["curve_names"] + uwi = wellDataForPlotting["uwi"] + console.log("curveDataFormatted in function draw_curve() ", curveDataFormatted) + //console.log("curveName in template generic_template['curveNames']:",generic_template[0]["curveNames"]) + ////////// + console.log("generic_template", generic_template) + generic_template[0]["components"][0]["curves"][0]["data"] = curveDataFormatted + new_generic_template = generic_template + return new_generic_template + } + + function draw_curve(curve, div) { + if (!div) { + div = "log_plot_div" + } + if (!curve) { + curve = "GR"; + console.log("temp_json['CURVES'][curve] = ", temp_json["CURVES"]["GR"]) + } + console.log("curve = ", curve) + ///var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] + ///makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) + var newDiv = document.createElement("div"); + disposible_log_div = "log_plot_div_sub" + newDiv.id = disposible_log_div + var currentDiv = document.getElementById("log_plot_div"); + currentDiv.append(newDiv) + + ///////// + console.log("generic_template:", reformatJSONforPlotting(temp_json)) + new_generic_template = reformatJSONforPlotting(temp_json) + height = new_generic_template[0]["curve_box"]["height"] + currentDiv.style.height = height + 50 + "px"; + result = wellioviz.multipleLogPlot(disposible_log_div, [reformatJSONforPlotting(temp_json, curve, disposible_log_div)]) + console.log("curve plot should be present now... the template supplied is:", result) + } + +// function draw_curve_from_data(curve,div,curve_name){ +// // if(!div){div = "#log_plot_div"} +// // if(!curve){ +// // curve = "GR"; +// // console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) +// // } +// // if(!curve_name){curve_name = "unknown curve"} +// // var curve = temp_json["CURVES"]["GR"] +// var curve = Array.from(curve) +// //var curve = "GR" +// var div = "#dl_trial_a"; +// var curve_name = "GR"; +// console.log("curve = ",curve); +// console.log("div = ",div); +// console.log("curve_name = ",curve_name); + +// // var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] +// // makePlot2(curve,div,600,250,domain_x,[0,curve.length],curve_name) +// var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] +// makePlot(curve,div,600,250,domain_x,[0,curve.length],curve_name) +// } + }, {}], + 5: [function (require, module, exports) { + wellio = require('wellio'); + + las2json = wellio.las2json; + + wellioviz = require("../../dist/index.js") + }, {"../../dist/index.js": 3, "wellio": 40}], + 6: [function (require, module, exports) { +/////////////////////// global objects placeholders //////////////////////// +//// ... maybe not good programming practice but quick to do for simple demo. + +//// var all_files is a holder for the las files uploaded into the browser + var all_files = [""]; +//// var temp_json is the single well las file converted to json object format + var temp_json = {}; + +//////////////////////// HELPER FUNCTIONS //////////////////////// + + +// Check for the various File API support. + if (window.File && window.FileReader && window.FileList && window.Blob) { + // Great success! All the File APIs are supported. + } else { + alert('The File APIs are not fully supported in this browser.'); + } + +//// Function that checks if a temp_json exists. If it does, it allows divs that manipulate that JSON to show + function checkForJSONThenCollapse(divID) { + console.log("divID", divID) + console.log("check check") + console.log(temp_json) + if (!temp_json['WELL INFORMATION BLOCK']) { + "button did nothing because well JSON doesn't exist" + } else { + //// Check if loading part is shown, if so collapse it first. + if (document.getElementById("wellupload").classList.contains("show")) { + $("#wellupload").collapse("toggle") + } + $('.collapse').collapse("hide") + //// toggle only the one clicked! + $(divID).collapse("toggle") + } + } + + +//// helper function that removes the text depiction of the las file. + function removeTextLAS() { + fileContentsDiv = document.getElementById("fileContents"); + while (fileContentsDiv.hasChildNodes()) { + fileContentsDiv.removeChild(fileContentsDiv.lastChild); + } + } + +//// helper function that removes the children of the given DOM element. + function remove_DOM_children(div_name) { + if (!div_name) { + div_name = 'log_plot_div' + } + fileContentsDiv = document.getElementById(div_name); + while (fileContentsDiv.hasChildNodes()) { + fileContentsDiv.removeChild(fileContentsDiv.lastChild); + } + } + +//// helper function that removes the inner html of the given DOM element, like the "test" from

    test

    + function removeInnerHTML(div_id) { + document.getElementById(div_id).innerHTML = "" + } + +//// helper function that take a string and a substring of that string and replaces the substring with "" or nothing if it finds the substring. + function removeSubStr(string, substring) { + return string.replace(substring, "") + } + +//////////////////////// LOADING FUNCTIONS //////////////////////// + + +//// Reads in an example LAS files from webpage assets instead of local computer + function readInLASFromASSETS() { + //all_files = ["./assets/00-01-01-073-05W5-0.LAS"]; + //// removes all status spans for uploads + removeInnerHTML("upload-file-info"); + removeInnerHTML("upload-success"); + $.ajax({ + url: "./assets/00-01-01-073-05W5-0.LAS", + dataType: "text", + success: function (data) { + all_files = [data, ""] + document.getElementById("upload-success").innerHTML = "upload success"; + console.log("successfully loaded .draw_curve_from_data/assets/00-01-01-073-05W5-0.LAS") + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + document.getElementById("upload-success").innerHTML = "upload failure"; + console.log("error in function readInLASFromASSETS() : ", textStatus, errorThrown) + } + }); + } + +//// function for "Load into browser memeory" button + function readInFilesFunction() { + //// removes all status spans for uploads + removeInnerHTML("upload-file-info"); + removeInnerHTML("upload-success"); + var files = document.getElementById("files").files; + if (files && files.length !== 0) { + all_files = [] + for (var i = 0, file; file = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + all_files.push(evt.target.result); + } + reader.onerror = function (evt) { + document.getElementById("fileContents").innerHTML = "error reading file"; + } + } + uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = "upload success"; + } else { + uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = " " + "upload failure"; + } + //console.log("all_files = ",all_files) + } + + + function changeMenuBarButtonColorOnConvert() { + //// CHANGE buttons from gray to blue in top row + var listButtons = document.getElementsByClassName("afterconvert") + console.log("list", list) + var i; + for (i = 0; i < listButtons.length; i++) { + // button.style.backgroundColor = "blue"; + console.log("button", listButtons[i]) + listButtons[i].classList.add("btn-primary") + } + } + +//// Function that calls several other functions involved with converting a new well from las to json +//// updating the global variables as needed, and changing some new DOM elements to reflect the new well data. +//// It calls the las2json(onelas) function found in wellio.js JavaScript file. + function convert_and_startHelpers() { + //// removes the buttons for the well curves from the previous well if they exist + remove_DOM_children("curveButtons_holder") + //// calls the function that takes a single LAS text file representing a single well and returns an object variable in JSON format for that well. + var single_well_json = las2json(all_files[0]); + // console.log('single_well_json = ',single_well_json) + //// replaces the global variable temp_json with the new well json var single_well_json + temp_json = single_well_json + //// function that looks at temp_json object, finds what curves are present in that well, and makes buttons to draw them using g3.js + addCurveOptionButtons() + //// adds inner html to p for the UWI name of the well in questino that was just loaded and converted + console.log("temp_json['WELL INFORMATION BLOCK'] =", JSON.stringify(temp_json["WELL INFORMATION BLOCK"])) + document.getElementById("which_well").innerHTML = "UWI = " + temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + changeMenuBarButtonColorOnConvert() + } + + +//////////////////////// DISPLAY FUNCTIONS //////////////////////// + + +//// This takes the well files uploaded as las files, treats all of them as text files and prints ALL OF THEM to the DOM. +//// this is different than the json conversion, which at this points only converts and keeps the first well! + function displayFileFunction() { + var upload_success_span_txt = document.getElementById("upload-success").innerHTML + //// goes into this part of loop if wepbage las is used + if (upload_success_span_txt === "upload success") { + fileContentsDiv = document.getElementById("fileContents") + var para = document.createElement("P") + var t = document.createTextNode(all_files[0]); + para.appendChild(t); + fileContentsDiv.appendChild(para); + } + //// goes here if las from user's local computer is used + else { + var files = document.getElementById("files").files + if (files) { + for (var i = 0, file; file = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + fileContentsDiv = document.getElementById("fileContents") + var para = document.createElement("P") + var t = document.createTextNode(evt.target.result); // Create a text node + para.appendChild(t); + fileContentsDiv.appendChild(para); + } + reader.onerror = function (evt) { + document.getElementById("fileContents").innerHTML = "error reading file"; + } + } + } + } + } + + +//// function that leverages vkbeuatify library to pretty print the stringified wellio json then puts it into a DOM element so it can be seen by the user + function print_well() { + document.getElementById("well_json_prettyprint").innerHTML = vkbeautify.json(JSON.stringify(temp_json), 1); + console.log('JSON.stringify(temp_json) = ', vkbeautify.json(JSON.stringify(temp_json), 4)) + } + +//// function called by convert_and_startHelpers() that looks at the global temp_json object +//// and finds the curve names and adds them as buttons that when clicked draws those curves using g3.js. +//// It calls addSingleCurveButton(div_id,curve_name) for each curve. + function addCurveOptionButtons() { + /// curveButtons_holder + var div_id = "curveButtons_holder" + var curves_available = Object.keys(temp_json["CURVES"]) + console.log("curves_available = ", curves_available) + for (each_curve in curves_available) { + addSingleCurveButton(div_id, curves_available[each_curve]) + } + } + +//// function called by addCurveOptionButtons() adds Curves buttons that when clicked draws a curve plot using g3.js. + function addSingleCurveButton(div_id, curve_name) { + var node = document.createElement("button"); + node.setAttribute('onclick', 'draw_curve("' + String(curve_name) + '")') // Create a
  • node + var textnode = document.createTextNode(curve_name); // Create a text node + node.appendChild(textnode); // Append the text to
  • + document.getElementById(div_id).appendChild(node); + } + + +//// function that creates a hidden link that is clicked programatically that uses HTML5 to download the file at that link +//// the two arguments are the UWI string of the global temp_json object, and a stringified version of the entire wellio json object. +//// It calls the download() function found in wellio.js JavaScript file. + function download_test() { + //console.log("download_test() ","in") + download(temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + ".json", JSON.stringify(temp_json)); + } + +//// Function that takes a filename string and a string (you might have to stringify a json object) +//// and writes into an actual JSON file to be downloaded into your browsers specified download folder. + function download(filename, text) { + var element = document.createElement('a') + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)) + element.setAttribute('download', filename) + element.style.display = 'none' + document.body.appendChild(element) + element.click() + document.body.removeChild(element) + } + + }, {}], + 7: [function (require, module, exports) { + /** + * vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. + * + * Version - 0.99.00.beta + * Copyright (c) 2012 Vadim Kiryukhin + * vkiryukhin @ gmail.com + * http://www.eslinstructor.net/vkbeautify/ + * + * MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Pretty print + * + * vkbeautify.xml(text [,indent_pattern]); + * vkbeautify.json(text [,indent_pattern]); + * vkbeautify.css(text [,indent_pattern]); + * vkbeautify.sql(text [,indent_pattern]); + * + * @text - String; text to beatufy; + * @indent_pattern - Integer | String; + * Integer: number of white spaces; + * String: character string to visualize indentation ( can also be a set of white spaces ) + * Minify + * + * vkbeautify.xmlmin(text [,preserve_comments]); + * vkbeautify.jsonmin(text); + * vkbeautify.cssmin(text [,preserve_comments]); + * vkbeautify.sqlmin(text); + * + * @text - String; text to minify; + * @preserve_comments - Bool; [optional]; + * Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. ) + * + * Examples: + * vkbeautify.xml(text); // pretty print XML + * vkbeautify.json(text, 4 ); // pretty print JSON + * vkbeautify.css(text, '. . . .'); // pretty print CSS + * vkbeautify.sql(text, '----'); // pretty print SQL + * + * vkbeautify.xmlmin(text, true);// minify XML, preserve comments + * vkbeautify.jsonmin(text);// minify JSON + * vkbeautify.cssmin(text);// minify CSS, remove comments ( default ) + * vkbeautify.sqlmin(text);// minify SQL + * + */ + + (function () { + + function createShiftArr(step) { + + var space = ' '; + + if (isNaN(parseInt(step))) { // argument is string + space = step; + } else { // argument is integer + switch (step) { + case 1: + space = ' '; + break; + case 2: + space = ' '; + break; + case 3: + space = ' '; + break; + case 4: + space = ' '; + break; + case 5: + space = ' '; + break; + case 6: + space = ' '; + break; + case 7: + space = ' '; + break; + case 8: + space = ' '; + break; + case 9: + space = ' '; + break; + case 10: + space = ' '; + break; + case 11: + space = ' '; + break; + case 12: + space = ' '; + break; + } + } + + var shift = ['\n']; // array of shifts + for (ix = 0; ix < 100; ix++) { + shift.push(shift[ix] + space); + } + return shift; + } + + function vkbeautify() { + this.step = '\t'; // 4 spaces + this.shift = createShiftArr(this.step); + }; + + vkbeautify.prototype.xml = function (text, step) { + + var ar = text.replace(/>\s{0,}<") + .replace(//g, "") + .replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns'); + return str.replace(/>\s{0,}<"); + } + + vkbeautify.prototype.jsonmin = function (text) { + + if (typeof JSON === 'undefined') return text; + + return JSON.stringify(JSON.parse(text), null, 0); + + } + + vkbeautify.prototype.cssmin = function (text, preserveComments) { + + var str = preserveComments ? text + : text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g, ""); + + return str.replace(/\s{1,}/g, ' ') + .replace(/\{\s{1,}/g, "{") + .replace(/\}\s{1,}/g, "}") + .replace(/\;\s{1,}/g, ";") + .replace(/\/\*\s{1,}/g, "/*") + .replace(/\*\/\s{1,}/g, "*/"); + } + + vkbeautify.prototype.sqlmin = function (text) { + return text.replace(/\s{1,}/g, " ").replace(/\s{1,}\(/, "(").replace(/\s{1,}\)/, ")"); + } + + window.vkbeautify = new vkbeautify(); + + })(); + }, {}], + 8: [function (require, module, exports) { +// https://d3js.org/d3-array/ v1.2.4 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function bisector(compare) { + if (compare.length === 1) compare = ascendingComparator(compare); + return { + left: function (a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; + } + return lo; + }, + right: function (a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; + } + return lo; + } + }; + } + + function ascendingComparator(f) { + return function (d, x) { + return ascending(f(d), x); + }; + } + + var ascendingBisect = bisector(ascending); + var bisectRight = ascendingBisect.right; + var bisectLeft = ascendingBisect.left; + + function pairs(array, f) { + if (f == null) f = pair; + var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = f(p, p = array[++i]); + return pairs; + } + + function pair(a, b) { + return [a, b]; + } + + function cross(values0, values1, reduce) { + var n0 = values0.length, + n1 = values1.length, + values = new Array(n0 * n1), + i0, + i1, + i, + value0; + + if (reduce == null) reduce = pair; + + for (i0 = i = 0; i0 < n0; ++i0) { + for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) { + values[i] = reduce(value0, values1[i1]); + } + } + + return values; + } + + function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } + + function number(x) { + return x === null ? NaN : +x; + } + + function variance(values, valueof) { + var n = values.length, + m = 0, + i = -1, + mean = 0, + value, + delta, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + delta = value - mean; + mean += delta / ++m; + sum += delta * (value - mean); + } + } + } + + if (m > 1) return sum / (m - 1); + } + + function deviation(array, f) { + var v = variance(array, f); + return v ? Math.sqrt(v) : v; + } + + function extent(values, valueof) { + var n = values.length, + i = -1, + value, + min, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null) { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } + } + + return [min, max]; + } + + var array = Array.prototype; + + var slice = array.slice; + var map = array.map; + + function constant(x) { + return function () { + return x; + }; + } + + function identity(x) { + return x; + } + + function range(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; + + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); + + while (++i < n) { + range[i] = start + i * step; + } + + return range; + } + + var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); + + function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; + + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + + if (step > 0) { + start = Math.ceil(start / step); + stop = Math.floor(stop / step); + ticks = new Array(n = Math.ceil(stop - start + 1)); + while (++i < n) ticks[i] = (start + i) * step; + } else { + start = Math.floor(start * step); + stop = Math.ceil(stop * step); + ticks = new Array(n = Math.ceil(start - stop + 1)); + while (++i < n) ticks[i] = (start - i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; + } + + function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); + } + + function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; + } + + function sturges(values) { + return Math.ceil(Math.log(values.length) / Math.LN2) + 1; + } + + function histogram() { + var value = identity, + domain = extent, + threshold = sturges; + + function histogram(data) { + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + tz = tickStep(x0, x1, tz); + tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive + } + + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; + + var bins = new Array(m + 1), + bin; + + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } + + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; + } + + histogram.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; + + histogram.domain = function (_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; + + histogram.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; + } + + function quantile(values, p, valueof) { + if (valueof == null) valueof = number; + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); + } + + function freedmanDiaconis(values, min, max) { + values = map.call(values, number).sort(ascending); + return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3))); + } + + function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3))); + } + + function max(values, valueof) { + var n = values.length, + i = -1, + value, + max; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && value > max) { + max = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + max = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && value > max) { + max = value; + } + } + } + } + } + + return max; + } + + function mean(values, valueof) { + var n = values.length, + m = n, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) sum += value; + else --m; + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value; + else --m; + } + } + + if (m) return sum / m; + } + + function median(values, valueof) { + var n = values.length, + i = -1, + value, + numbers = []; + + if (valueof == null) { + while (++i < n) { + if (!isNaN(value = number(values[i]))) { + numbers.push(value); + } + } + } else { + while (++i < n) { + if (!isNaN(value = number(valueof(values[i], i, values)))) { + numbers.push(value); + } + } + } + + return quantile(numbers.sort(ascending), 0.5); + } + + function merge(arrays) { + var n = arrays.length, + m, + i = -1, + j = 0, + merged, + array; + + while (++i < n) j += arrays[i].length; + merged = new Array(j); + + while (--n >= 0) { + array = arrays[n]; + m = array.length; + while (--m >= 0) { + merged[--j] = array[m]; + } + } + + return merged; + } + + function min(values, valueof) { + var n = values.length, + i = -1, + value, + min; + + if (valueof == null) { + while (++i < n) { // Find the first comparable value. + if ((value = values[i]) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = values[i]) != null && min > value) { + min = value; + } + } + } + } + } else { + while (++i < n) { // Find the first comparable value. + if ((value = valueof(values[i], i, values)) != null && value >= value) { + min = value; + while (++i < n) { // Compare the remaining values. + if ((value = valueof(values[i], i, values)) != null && min > value) { + min = value; + } + } + } + } + } + + return min; + } + + function permute(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + } + + function scan(values, compare) { + if (!(n = values.length)) return; + var n, + i = 0, + j = 0, + xi, + xj = values[j]; + + if (compare == null) compare = ascending; + + while (++i < n) { + if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) { + xj = xi, j = i; + } + } + + if (compare(xj, xj) === 0) return j; + } + + function shuffle(array, i0, i1) { + var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0), + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; + } + + return array; + } + + function sum(values, valueof) { + var n = values.length, + i = -1, + value, + sum = 0; + + if (valueof == null) { + while (++i < n) { + if (value = +values[i]) sum += value; // Note: zero and null are equivalent. + } + } else { + while (++i < n) { + if (value = +valueof(values[i], i, values)) sum += value; + } + } + + return sum; + } + + function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; + } + + function length(d) { + return d.length; + } + + function zip() { + return transpose(arguments); + } + + exports.bisect = bisectRight; + exports.bisectRight = bisectRight; + exports.bisectLeft = bisectLeft; + exports.ascending = ascending; + exports.bisector = bisector; + exports.cross = cross; + exports.descending = descending; + exports.deviation = deviation; + exports.extent = extent; + exports.histogram = histogram; + exports.thresholdFreedmanDiaconis = freedmanDiaconis; + exports.thresholdScott = scott; + exports.thresholdSturges = sturges; + exports.max = max; + exports.mean = mean; + exports.median = median; + exports.merge = merge; + exports.min = min; + exports.pairs = pairs; + exports.permute = permute; + exports.quantile = quantile; + exports.range = range; + exports.scan = scan; + exports.shuffle = shuffle; + exports.sum = sum; + exports.ticks = ticks; + exports.tickIncrement = tickIncrement; + exports.tickStep = tickStep; + exports.transpose = transpose; + exports.variance = variance; + exports.zip = zip; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 9: [function (require, module, exports) { +// https://d3js.org/d3-axis/ v1.0.12 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + var slice = Array.prototype.slice; + + function identity(x) { + return x; + } + + var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; + + function translateX(x) { + return "translate(" + (x + 0.5) + ",0)"; + } + + function translateY(y) { + return "translate(0," + (y + 0.5) + ")"; + } + + function number(scale) { + return function (d) { + return +scale(d); + }; + } + + function center(scale) { + var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset. + if (scale.round()) offset = Math.round(offset); + return function (d) { + return +scale(d) + offset; + }; + } + + function entering() { + return !this.__axis; + } + + function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + 0.5, + range1 = +range[range.length - 1] + 0.5, + position = (scale.bandwidth ? center : number)(scale.copy()), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); + + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); + + tick = tick.merge(tickEnter); + + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); + + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); + + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function (d) { + return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); + }); + + tickEnter + .attr("opacity", epsilon) + .attr("transform", function (d) { + var p = this.parentNode.__axis; + return transform(p && isFinite(p = p(d)) ? p : position(d)); + }); + } + + tickExit.remove(); + + path + .attr("d", orient === left || orient == right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1)); + + tick + .attr("opacity", 1) + .attr("transform", function (d) { + return transform(position(d)); + }); + + line + .attr(x + "2", k * tickSizeInner); + + text + .attr(x, k * spacing) + .text(format); + + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + + selection + .each(function () { + this.__axis = position; + }); + } + + axis.scale = function (_) { + return arguments.length ? (scale = _, axis) : scale; + }; + + axis.ticks = function () { + return tickArguments = slice.call(arguments), axis; + }; + + axis.tickArguments = function (_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice(); + }; + + axis.tickValues = function (_) { + return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice(); + }; + + axis.tickFormat = function (_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; + }; + + axis.tickSize = function (_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; + + axis.tickSizeInner = function (_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; + + axis.tickSizeOuter = function (_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; + + axis.tickPadding = function (_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; + + return axis; + } + + function axisTop(scale) { + return axis(top, scale); + } + + function axisRight(scale) { + return axis(right, scale); + } + + function axisBottom(scale) { + return axis(bottom, scale); + } + + function axisLeft(scale) { + return axis(left, scale); + } + + exports.axisTop = axisTop; + exports.axisRight = axisRight; + exports.axisBottom = axisBottom; + exports.axisLeft = axisLeft; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 10: [function (require, module, exports) { +// https://d3js.org/d3-brush/ v1.1.5 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } + + function BrushEvent(target, type, selection) { + this.target = target; + this.type = type; + this.selection = selection; + } + + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } + + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } + + var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + + function number1(e) { + return [+e[0], +e[1]]; + } + + function number2(e) { + return [number1(e[0]), number1(e[1])]; + } + + function toucher(identifier) { + return function (target) { + return d3Selection.touch(target, d3Selection.event.touches, identifier); + }; + } + + var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function (x, e) { + return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; + }, + output: function (xy) { + return xy && [xy[0][0], xy[1][0]]; + } + }; + + var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function (y, e) { + return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; + }, + output: function (xy) { + return xy && [xy[0][1], xy[1][1]]; + } + }; + + var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function (xy) { + return xy == null ? null : number2(xy); + }, + output: function (xy) { + return xy; + } + }; + + var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" + }; + + var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" + }; + + var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" + }; + + var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 + }; + + var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 + }; + + function type(t) { + return {type: t}; + } + +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } + + function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; + } + + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + +// Like d3.local, but with the name “__brush” rather than auto-generated. + function local(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; + } + + function empty(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; + } + + function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; + } + + function brushX() { + return brush$1(X); + } + + function brushY() { + return brush$1(Y); + } + + function brush() { + return brush$1(XY); + } + + function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter, + touchable = defaultTouchable, + keys = true, + listeners = d3Dispatch.dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function () { + var extent = local(this).extent; + d3Selection.select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function (d) { + return d.type; + }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function (d) { + return "handle handle--" + d.type; + }) + .attr("cursor", function (d) { + return cursors[d.type]; + }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function (group, selection) { + if (group.selection) { + group + .on("start.brush", function () { + emitter(this, arguments).beforestart().start(); + }) + .on("interrupt.brush end.brush", function () { + emitter(this, arguments).end(); + }) + .tween("brush", function () { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = d3Interpolate.interpolate(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function () { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + d3Transition.interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); + } + }; + + brush.clear = function (group) { + brush.move(group, null); + }; + + function redraw() { + var group = d3Selection.select(this), + selection = local(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function (d) { + return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; + }) + .attr("y", function (d) { + return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; + }) + .attr("width", function (d) { + return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; + }) + .attr("height", function (d) { + return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; + }); + } else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); + } + } + + function emitter(that, args, clean) { + return (!clean && that.__brush.emitter) || new Emitter(that, args); + } + + function Emitter(that, args) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + } + + Emitter.prototype = { + beforestart: function () { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function () { + if (this.starting) this.starting = false, this.emit("start"); + else this.emit("brush"); + return this; + }, + brush: function () { + this.emit("brush"); + return this; + }, + end: function () { + if (--this.active === 0) delete this.state.emitter, this.emit("end"); + return this; + }, + emit: function (type) { + d3Selection.customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function started() { + if (touchending && !d3Selection.event.touches) return; + if (!filter.apply(this, arguments)) return; + + var that = this, + type = d3Selection.event.target.__data__.type, + mode = (keys && d3Selection.event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && d3Selection.event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && d3Selection.event.shiftKey, + lockX, + lockY, + pointer = d3Selection.event.touches ? toucher(d3Selection.event.changedTouches[0].identifier) : d3Selection.mouse, + point0 = pointer(that), + point = point0, + emit = emitter(that, arguments, true).beforestart(); + + if (type === "overlay") { + if (selection) moving = true; + state.selection = selection = [ + [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]], + [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0] + ]; + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } + + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; + + var group = d3Selection.select(that) + .attr("pointer-events", "none"); + + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + if (d3Selection.event.touches) { + emit.moved = moved; + emit.ended = ended; + } else { + var view = d3Selection.select(d3Selection.event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + d3Drag.dragDisable(d3Selection.event.view); + } + + nopropagation(); + d3Transition.interrupt(that); + redraw.call(that); + emit.start(); + + function moved() { + var point1 = pointer(that); + if (shifting && !lockX && !lockY) { + if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true; + else lockX = true; + } + point = point1; + moving = true; + noevent(); + move(); + } + + function move() { + var t; + + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; + + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + break; + } + case MODE_CENTER: { + if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX)); + if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY)); + break; + } + } + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(); + } + } + + function ended() { + nopropagation(); + if (d3Selection.event.touches) { + if (d3Selection.event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! + } else { + d3Drag.dragEnable(d3Selection.event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(); + } + + function keydowned() { + switch (d3Selection.event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: + return; + } + noevent(); + } + + function keyupped() { + switch (d3Selection.event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (d3Selection.event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: + return; + } + noevent(); + } + } + + function touchmoved() { + emitter(this, arguments).moved(); + } + + function touchended() { + emitter(this, arguments).ended(); + } + + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; + } + + brush.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent; + }; + + brush.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; + }; + + brush.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable; + }; + + brush.handleSize = function (_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function (_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; + } + + exports.brush = brush; + exports.brushSelection = brushSelection; + exports.brushX = brushX; + exports.brushY = brushY; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-dispatch": 15, "d3-drag": 16, "d3-interpolate": 24, "d3-selection": 31, "d3-transition": 36}], + 11: [function (require, module, exports) { +// https://d3js.org/d3-chord/ v1.0.6 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-path')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-path'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3)); + }(this, (function (exports, d3Array, d3Path) { + 'use strict'; + + var cos = Math.cos; + var sin = Math.sin; + var pi = Math.PI; + var halfPi = pi / 2; + var tau = pi * 2; + var max = Math.max; + + function compareValue(compare) { + return function (a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); + }; + } + + function chord() { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; + + function chord(matrix) { + var n = matrix.length, + groupSums = [], + groupIndex = d3Array.range(n), + subgroupIndex = [], + chords = [], + groups = chords.groups = new Array(n), + subgroups = new Array(n * n), + k, + x, + x0, + dx, + i, + j; + + // Compute the sum. + k = 0, i = -1; + while (++i < n) { + x = 0, j = -1; + while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(d3Array.range(n)); + k += x; + } + + // Sort groups… + if (sortGroups) groupIndex.sort(function (a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + + // Sort subgroups… + if (sortSubgroups) subgroupIndex.forEach(function (d, i) { + d.sort(function (a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + + // Convert the sum to scaling factor for [0, 2pi]. + // TODO Allow start and end angle to be specified? + // TODO Allow padding to be specified as percentage? + k = max(0, tau - padAngle * n) / k; + dx = k ? padAngle : tau / n; + + // Compute the start and end angle for each group and subgroup. + // Note: Opera has a bug reordering object literal properties! + x = 0, i = -1; + while (++i < n) { + x0 = x, j = -1; + while (++j < n) { + var di = groupIndex[i], + dj = subgroupIndex[di][j], + v = matrix[di][dj], + a0 = x, + a1 = x += v * k; + subgroups[dj * n + di] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: groupSums[di] + }; + x += dx; + } + + // Generate chords for each (non-empty) subgroup-subgroup link. + i = -1; + while (++i < n) { + j = i - 1; + while (++j < n) { + var source = subgroups[j * n + i], + target = subgroups[i * n + j]; + if (source.value || target.value) { + chords.push(source.value < target.value + ? {source: target, target: source} + : {source: source, target: target}); + } + } + } + + return sortChords ? chords.sort(sortChords) : chords; + } + + chord.padAngle = function (_) { + return arguments.length ? (padAngle = max(0, _), chord) : padAngle; + }; + + chord.sortGroups = function (_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; + + chord.sortSubgroups = function (_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; + + chord.sortChords = function (_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; + + return chord; + } + + var slice = Array.prototype.slice; + + function constant(x) { + return function () { + return x; + }; + } + + function defaultSource(d) { + return d.source; + } + + function defaultTarget(d) { + return d.target; + } + + function defaultRadius(d) { + return d.radius; + } + + function defaultStartAngle(d) { + return d.startAngle; + } + + function defaultEndAngle(d) { + return d.endAngle; + } + + function ribbon() { + var source = defaultSource, + target = defaultTarget, + radius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + context = null; + + function ribbon() { + var buffer, + argv = slice.call(arguments), + s = source.apply(this, argv), + t = target.apply(this, argv), + sr = +radius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi, + sa1 = endAngle.apply(this, argv) - halfPi, + sx0 = sr * cos(sa0), + sy0 = sr * sin(sa0), + tr = +radius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi, + ta1 = endAngle.apply(this, argv) - halfPi; + + if (!context) context = buffer = d3Path.path(); + + context.moveTo(sx0, sy0); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr? + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + context.quadraticCurveTo(0, 0, sx0, sy0); + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + ribbon.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), ribbon) : radius; + }; + + ribbon.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; + }; + + ribbon.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; + }; + + ribbon.source = function (_) { + return arguments.length ? (source = _, ribbon) : source; + }; + + ribbon.target = function (_) { + return arguments.length ? (target = _, ribbon) : target; + }; + + ribbon.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; + + return ribbon; + } + + exports.chord = chord; + exports.ribbon = ribbon; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-array": 8, "d3-path": 25}], + 12: [function (require, module, exports) { +// https://d3js.org/d3-collection/ v1.0.7 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + var prefix = "$"; + + function Map() { + } + + Map.prototype = map.prototype = { + constructor: Map, + has: function (key) { + return (prefix + key) in this; + }, + get: function (key) { + return this[prefix + key]; + }, + set: function (key, value) { + this[prefix + key] = value; + return this; + }, + remove: function (key) { + var property = prefix + key; + return property in this && delete this[property]; + }, + clear: function () { + for (var property in this) if (property[0] === prefix) delete this[property]; + }, + keys: function () { + var keys = []; + for (var property in this) if (property[0] === prefix) keys.push(property.slice(1)); + return keys; + }, + values: function () { + var values = []; + for (var property in this) if (property[0] === prefix) values.push(this[property]); + return values; + }, + entries: function () { + var entries = []; + for (var property in this) if (property[0] === prefix) entries.push({ + key: property.slice(1), + value: this[property] + }); + return entries; + }, + size: function () { + var size = 0; + for (var property in this) if (property[0] === prefix) ++size; + return size; + }, + empty: function () { + for (var property in this) if (property[0] === prefix) return false; + return true; + }, + each: function (f) { + for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this); + } + }; + + function map(object, f) { + var map = new Map; + + // Copy constructor. + if (object instanceof Map) object.each(function (value, key) { + map.set(key, value); + }); + + // Index array by numeric index or specified key function. + else if (Array.isArray(object)) { + var i = -1, + n = object.length, + o; + + if (f == null) while (++i < n) map.set(i, object[i]); + else while (++i < n) map.set(f(o = object[i], i, object), o); + } + + // Convert object to map. + else if (object) for (var key in object) map.set(key, object[key]); + + return map; + } + + function nest() { + var keys = [], + sortKeys = [], + sortValues, + rollup, + nest; + + function apply(array, depth, createResult, setResult) { + if (depth >= keys.length) { + if (sortValues != null) array.sort(sortValues); + return rollup != null ? rollup(array) : array; + } + + var i = -1, + n = array.length, + key = keys[depth++], + keyValue, + value, + valuesByKey = map(), + values, + result = createResult(); + + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) { + values.push(value); + } else { + valuesByKey.set(keyValue, [value]); + } + } + + valuesByKey.each(function (values, key) { + setResult(result, key, apply(values, depth, createResult, setResult)); + }); + + return result; + } + + function entries(map$$1, depth) { + if (++depth > keys.length) return map$$1; + var array, sortKey = sortKeys[depth - 1]; + if (rollup != null && depth >= keys.length) array = map$$1.entries(); + else array = [], map$$1.each(function (v, k) { + array.push({key: k, values: entries(v, depth)}); + }); + return sortKey != null ? array.sort(function (a, b) { + return sortKey(a.key, b.key); + }) : array; + } + + return nest = { + object: function (array) { + return apply(array, 0, createObject, setObject); + }, + map: function (array) { + return apply(array, 0, createMap, setMap); + }, + entries: function (array) { + return entries(apply(array, 0, createMap, setMap), 0); + }, + key: function (d) { + keys.push(d); + return nest; + }, + sortKeys: function (order) { + sortKeys[keys.length - 1] = order; + return nest; + }, + sortValues: function (order) { + sortValues = order; + return nest; + }, + rollup: function (f) { + rollup = f; + return nest; + } + }; + } + + function createObject() { + return {}; + } + + function setObject(object, key, value) { + object[key] = value; + } + + function createMap() { + return map(); + } + + function setMap(map$$1, key, value) { + map$$1.set(key, value); + } + + function Set() { + } + + var proto = map.prototype; + + Set.prototype = set.prototype = { + constructor: Set, + has: proto.has, + add: function (value) { + value += ""; + this[prefix + value] = value; + return this; + }, + remove: proto.remove, + clear: proto.clear, + values: proto.keys, + size: proto.size, + empty: proto.empty, + each: proto.each + }; + + function set(object, f) { + var set = new Set; + + // Copy constructor. + if (object instanceof Set) object.each(function (value) { + set.add(value); + }); + + // Otherwise, assume it’s an array. + else if (object) { + var i = -1, n = object.length; + if (f == null) while (++i < n) set.add(object[i]); + else while (++i < n) set.add(f(object[i], i, object)); + } + + return set; + } + + function keys(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; + } + + function values(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; + } + + function entries(map) { + var entries = []; + for (var key in map) entries.push({key: key, value: map[key]}); + return entries; + } + + exports.nest = nest; + exports.set = set; + exports.map = map; + exports.keys = keys; + exports.values = values; + exports.entries = entries; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 13: [function (require, module, exports) { +// https://d3js.org/d3-color/ v1.4.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; + } + + function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; + } + + function Color() { + } + + var darker = 0.7; + var brighter = 1 / darker; + + var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); + + var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 + }; + + define(Color, color, { + copy: function (channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function () { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb + }); + + function color_formatHex() { + return this.rgb().formatHex(); + } + + function color_formatHsl() { + return hslConvert(this).formatHsl(); + } + + function color_formatRgb() { + return this.rgb().formatRgb(); + } + + function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; + } + + function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); + } + + function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); + } + + function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); + } + + function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + } + + function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; + } + + define(Rgb, rgb, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function () { + return this; + }, + displayable: function () { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb + })); + + function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); + } + + function rgb_formatRgb() { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); + } + + function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); + } + + function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); + } + + function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); + } + + function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); + } + + function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + define(Hsl, hsl, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function () { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function () { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function () { + var a = this.opacity; + a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } + })); + + /* From FvD 13.37, CSS Color Module Level 3 */ + function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; + } + + var deg2rad = Math.PI / 180; + var rad2deg = 180 / Math.PI; + +// https://observablehq.com/@mbostock/lab-and-rgb + var K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; + + function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); + } + + function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); + } + + function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); + } + + function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; + } + + define(Lab, lab, extend(Color, { + brighter: function (k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function (k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function () { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } + })); + + function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; + } + + function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); + } + + function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); + } + + function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); + } + + function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * rad2deg; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); + } + + function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } + + function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); + } + + function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; + } + + function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * deg2rad; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); + } + + define(Hcl, hcl, extend(Color, { + brighter: function (k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function (k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function () { + return hcl2lab(this).rgb(); + } + })); + + var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + + function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); + } + + function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); + } + + function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + + define(Cubehelix, cubehelix, extend(Color, { + brighter: function (k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function (k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function () { + var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); + } + })); + + exports.color = color; + exports.cubehelix = cubehelix; + exports.gray = gray; + exports.hcl = hcl; + exports.hsl = hsl; + exports.lab = lab; + exports.lch = lch; + exports.rgb = rgb; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 14: [function (require, module, exports) { +// https://d3js.org/d3-contour/ v1.3.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3)); + }(this, (function (exports, d3Array) { + 'use strict'; + + var array = Array.prototype; + + var slice = array.slice; + + function ascending(a, b) { + return a - b; + } + + function area(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; + } + + function constant(x) { + return function () { + return x; + }; + } + + function contains(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; + } + + function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; + } + + function segmentContains(a, b, c) { + var i; + return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); + } + + function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); + } + + function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; + } + + function noop() { + } + + var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] + ]; + + function contours() { + var dx = 1, + dy = 1, + threshold = d3Array.thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = d3Array.extent(values), start = domain[0], stop = domain[1]; + tz = d3Array.tickStep(start, stop, tz); + tz = d3Array.range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending); + } + + return tz.map(function (value) { + return contour(values, value); + }); + } + + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; + + isorings(values, value, function (ring) { + smooth(ring, values, value); + if (area(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); + + holes.forEach(function (hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); + + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } + + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); + } + cases[t2 << 3].forEach(stitch); + + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = { + start: f.start, + end: g.end, + ring: f.ring.concat(g.ring) + }; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = { + start: g.start, + end: f.end, + ring: g.ring.concat(f.ring) + }; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = { + start: startIndex, + end: endIndex, + ring: [start, end] + }; + } + } + } + + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } + + function smoothLinear(ring, values, value) { + ring.forEach(function (point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); + } + + contours.contour = contour; + + contours.size = function (_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; + + contours.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold; + }; + + contours.smooth = function (_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear; + }; + + return contours; + } + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. + function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } + } + +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. + function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } + } + + function defaultX(d) { + return d[0]; + } + + function defaultY(d) { + return d[1]; + } + + function defaultWeight() { + return 1; + } + + function density() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function (d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = d3Array.max(values0); + tz = d3Array.tickStep(0, stop, tz); + tz = d3Array.range(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); + } + + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } + + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } + + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } + + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } + + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } + + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } + + density.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), density) : x; + }; + + density.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), density) : y; + }; + + density.weight = function (_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant(+_), density) : weight; + }; + + density.size = function (_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]); + if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; + + density.cellSize = function (_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; + + density.thresholds = function (_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold; + }; + + density.bandwidth = function (_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; + + return density; + } + + exports.contours = contours; + exports.contourDensity = density; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-array": 8}], + 15: [function (require, module, exports) { +// https://d3js.org/d3-dispatch/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var noop = { + value: function () { + } + }; + + function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); + } + + function Dispatch(_) { + this._ = _; + } + + function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); + } + + Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function (typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; + + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + + return this; + }, + copy: function () { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function (type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function (type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } + }; + + function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; + } + } + } + + function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } + } + if (callback != null) type.push({name: name, value: callback}); + return type; + } + + exports.dispatch = dispatch; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 16: [function (require, module, exports) { +// https://d3js.org/d3-drag/ v1.2.5 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-selection')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-selection'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Selection) { + 'use strict'; + + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } + + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } + + function nodrag(view) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; + } + } + + function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function () { + selection.on("click.drag", null); + }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } + } + + function constant(x) { + return function () { + return x; + }; + } + + function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) { + this.target = target; + this.type = type; + this.subject = subject; + this.identifier = id; + this.active = active; + this.x = x; + this.y = y; + this.dx = dx; + this.dy = dy; + this._ = dispatch; + } + + DragEvent.prototype.on = function () { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; + }; + +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } + + function defaultContainer() { + return this.parentNode; + } + + function defaultSubject(d) { + return d == null ? {x: d3Selection.event.x, y: d3Selection.event.y} : d; + } + + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + + function drag() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = d3Dispatch.dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; + + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var gesture = beforestart("mouse", container.apply(this, arguments), d3Selection.mouse, this, arguments); + if (!gesture) return; + d3Selection.select(d3Selection.event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + nodrag(d3Selection.event.view); + nopropagation(); + mousemoving = false; + mousedownx = d3Selection.event.clientX; + mousedowny = d3Selection.event.clientY; + gesture("start"); + } + + function mousemoved() { + noevent(); + if (!mousemoving) { + var dx = d3Selection.event.clientX - mousedownx, dy = d3Selection.event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag"); + } + + function mouseupped() { + d3Selection.select(d3Selection.event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(d3Selection.event.view, mousemoving); + noevent(); + gestures.mouse("end"); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = d3Selection.event.changedTouches, + c = container.apply(this, arguments), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(touches[i].identifier, c, d3Selection.touch, this, arguments)) { + nopropagation(); + gesture("start"); + } + } + } + + function touchmoved() { + var touches = d3Selection.event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(); + gesture("drag"); + } + } + } + + function touchended() { + var touches = d3Selection.event.changedTouches, + n = touches.length, i, gesture; + + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(); + gesture("end"); + } + } + } + + function beforestart(id, container, point, that, args) { + var p = point(container, id), s, dx, dy, + sublisteners = listeners.copy(); + + if (!d3Selection.customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function () { + if ((d3Selection.event.subject = s = subject.apply(that, args)) == null) return false; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return true; + })) return; + + return function gesture(type) { + var p0 = p, n; + switch (type) { + case "start": + gestures[id] = gesture, n = active++; + break; + case "end": + delete gestures[id], --active; // nobreak + case "drag": + p = point(container, id), n = active; + break; + } + d3Selection.customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]); + }; + } + + drag.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), drag) : filter; + }; + + drag.container = function (_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; + }; + + drag.subject = function (_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant(_), drag) : subject; + }; + + drag.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), drag) : touchable; + }; + + drag.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; + } + + exports.drag = drag; + exports.dragDisable = nodrag; + exports.dragEnable = yesdrag; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-dispatch": 15, "d3-selection": 31}], + 17: [function (require, module, exports) { +// https://d3js.org/d3-dsv/ v1.2.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; + + function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function (name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); + } + + function customConverter(columns, f) { + var object = objectConverter(columns); + return function (row, i) { + return f(object(row), i, columns); + }; + } + +// Compute unique columns in order of discovery. + function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; + + rows.forEach(function (row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); + + return columns; + } + + function pad(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; + } + + function formatYear(year) { + return year < 0 ? "-" + pad(-year, 6) + : year > 9999 ? "+" + pad(year, 6) + : pad(year, 4); + } + + function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); + } + + function dsv(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); + + function parse(text, f) { + var convert, columns, rows = parseRows(text, function (row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } + + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? + + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; + + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; + + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE) ; + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { + eol = true; + if (text.charCodeAt(I) === NEWLINE) ++I; + } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } + + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { + eol = true; + if (text.charCodeAt(I) === NEWLINE) ++I; + } else if (c !== DELIMITER) continue; + return text.slice(j, i); + } + + // Return last token before EOF. + return eof = true, text.slice(j, N); + } + + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } + + return rows; + } + + function preformatBody(rows, columns) { + return rows.map(function (row) { + return columns.map(function (column) { + return formatValue(row[column]); + }).join(delimiter); + }); + } + + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); + } + + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); + } + + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } + + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; + } + + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; + } + + var csv = dsv(","); + + var csvParse = csv.parse; + var csvParseRows = csv.parseRows; + var csvFormat = csv.format; + var csvFormatBody = csv.formatBody; + var csvFormatRows = csv.formatRows; + var csvFormatRow = csv.formatRow; + var csvFormatValue = csv.formatValue; + + var tsv = dsv("\t"); + + var tsvParse = tsv.parse; + var tsvParseRows = tsv.parseRows; + var tsvFormat = tsv.format; + var tsvFormatBody = tsv.formatBody; + var tsvFormatRows = tsv.formatRows; + var tsvFormatRow = tsv.formatRow; + var tsvFormatValue = tsv.formatValue; + + function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } else continue; + object[key] = value; + } + return object; + } + +// https://github.com/d3/d3-dsv/issues/45 + var fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + + exports.autoType = autoType; + exports.csvFormat = csvFormat; + exports.csvFormatBody = csvFormatBody; + exports.csvFormatRow = csvFormatRow; + exports.csvFormatRows = csvFormatRows; + exports.csvFormatValue = csvFormatValue; + exports.csvParse = csvParse; + exports.csvParseRows = csvParseRows; + exports.dsvFormat = dsv; + exports.tsvFormat = tsvFormat; + exports.tsvFormatBody = tsvFormatBody; + exports.tsvFormatRow = tsvFormatRow; + exports.tsvFormatRows = tsvFormatRows; + exports.tsvFormatValue = tsvFormatValue; + exports.tsvParse = tsvParse; + exports.tsvParseRows = tsvParseRows; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 18: [function (require, module, exports) { +// https://d3js.org/d3-ease/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function linear(t) { + return +t; + } + + function quadIn(t) { + return t * t; + } + + function quadOut(t) { + return t * (2 - t); + } + + function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; + } + + function cubicIn(t) { + return t * t * t; + } + + function cubicOut(t) { + return --t * t * t + 1; + } + + function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; + } + + var exponent = 3; + + var polyIn = (function custom(e) { + e = +e; + + function polyIn(t) { + return Math.pow(t, e); + } + + polyIn.exponent = custom; + + return polyIn; + })(exponent); + + var polyOut = (function custom(e) { + e = +e; + + function polyOut(t) { + return 1 - Math.pow(1 - t, e); + } + + polyOut.exponent = custom; + + return polyOut; + })(exponent); + + var polyInOut = (function custom(e) { + e = +e; + + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + } + + polyInOut.exponent = custom; + + return polyInOut; + })(exponent); + + var pi = Math.PI, + halfPi = pi / 2; + + function sinIn(t) { + return 1 - Math.cos(t * halfPi); + } + + function sinOut(t) { + return Math.sin(t * halfPi); + } + + function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; + } + + function expIn(t) { + return Math.pow(2, 10 * t - 10); + } + + function expOut(t) { + return 1 - Math.pow(2, -10 * t); + } + + function expInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2; + } + + function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); + } + + function circleOut(t) { + return Math.sqrt(1 - --t * t); + } + + function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; + } + + var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; + + function bounceIn(t) { + return 1 - bounceOut(1 - t); + } + + function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; + } + + function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; + } + + var overshoot = 1.70158; + + var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return t * t * ((s + 1) * t - s); + } + + backIn.overshoot = custom; + + return backIn; + })(overshoot); + + var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((s + 1) * t + s) + 1; + } + + backOut.overshoot = custom; + + return backOut; + })(overshoot); + + var backInOut = (function custom(s) { + s = +s; + + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } + + backInOut.overshoot = custom; + + return backInOut; + })(overshoot); + + var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; + + var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticIn(t) { + return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); + } + + elasticIn.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticIn.period = function (p) { + return custom(a, p); + }; + + return elasticIn; + })(amplitude, period); + + var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticOut(t) { + return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p); + } + + elasticOut.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticOut.period = function (p) { + return custom(a, p); + }; + + return elasticOut; + })(amplitude, period); + + var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); + + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) + : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; + } + + elasticInOut.amplitude = function (a) { + return custom(a, p * tau); + }; + elasticInOut.period = function (p) { + return custom(a, p); + }; + + return elasticInOut; + })(amplitude, period); + + exports.easeBack = backInOut; + exports.easeBackIn = backIn; + exports.easeBackInOut = backInOut; + exports.easeBackOut = backOut; + exports.easeBounce = bounceOut; + exports.easeBounceIn = bounceIn; + exports.easeBounceInOut = bounceInOut; + exports.easeBounceOut = bounceOut; + exports.easeCircle = circleInOut; + exports.easeCircleIn = circleIn; + exports.easeCircleInOut = circleInOut; + exports.easeCircleOut = circleOut; + exports.easeCubic = cubicInOut; + exports.easeCubicIn = cubicIn; + exports.easeCubicInOut = cubicInOut; + exports.easeCubicOut = cubicOut; + exports.easeElastic = elasticOut; + exports.easeElasticIn = elasticIn; + exports.easeElasticInOut = elasticInOut; + exports.easeElasticOut = elasticOut; + exports.easeExp = expInOut; + exports.easeExpIn = expIn; + exports.easeExpInOut = expInOut; + exports.easeExpOut = expOut; + exports.easeLinear = linear; + exports.easePoly = polyInOut; + exports.easePolyIn = polyIn; + exports.easePolyInOut = polyInOut; + exports.easePolyOut = polyOut; + exports.easeQuad = quadInOut; + exports.easeQuadIn = quadIn; + exports.easeQuadInOut = quadInOut; + exports.easeQuadOut = quadOut; + exports.easeSin = sinInOut; + exports.easeSinIn = sinIn; + exports.easeSinInOut = sinInOut; + exports.easeSinOut = sinOut; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 19: [function (require, module, exports) { +// https://d3js.org/d3-fetch/ v1.1.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dsv')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dsv'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3)); + }(this, (function (exports, d3Dsv) { + 'use strict'; + + function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); + } + + function blob(input, init) { + return fetch(input, init).then(responseBlob); + } + + function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); + } + + function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); + } + + function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); + } + + function text(input, init) { + return fetch(input, init).then(responseText); + } + + function dsvParse(parse) { + return function (input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function (response) { + return parse(response, row); + }); + }; + } + + function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = d3Dsv.dsvFormat(delimiter); + return text(input, init).then(function (response) { + return format.parse(response, row); + }); + } + + var csv = dsvParse(d3Dsv.csvParse); + var tsv = dsvParse(d3Dsv.tsvParse); + + function image(input, init) { + return new Promise(function (resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function () { + resolve(image); + }; + image.src = input; + }); + } + + function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.json(); + } + + function json(input, init) { + return fetch(input, init).then(responseJson); + } + + function parser(type) { + return function (input, init) { + return text(input, init).then(function (text$$1) { + return (new DOMParser).parseFromString(text$$1, type); + }); + }; + } + + var xml = parser("application/xml"); + + var html = parser("text/html"); + + var svg = parser("image/svg+xml"); + + exports.blob = blob; + exports.buffer = buffer; + exports.dsv = dsv; + exports.csv = csv; + exports.tsv = tsv; + exports.image = image; + exports.json = json; + exports.text = text; + exports.xml = xml; + exports.html = html; + exports.svg = svg; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-dsv": 17}], + 20: [function (require, module, exports) { +// https://d3js.org/d3-force/ v1.2.1 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-quadtree'), require('d3-collection'), require('d3-dispatch'), require('d3-timer')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-quadtree', 'd3-collection', 'd3-dispatch', 'd3-timer'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3, global.d3, global.d3)); + }(this, (function (exports, d3Quadtree, d3Collection, d3Dispatch, d3Timer) { + 'use strict'; + + function center(x, y) { + var nodes; + + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + + force.initialize = function (_) { + nodes = _; + }; + + force.x = function (_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function (_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + } + + function constant(x) { + return function () { + return x; + }; + } + + function jiggle() { + return (Math.random() - 0.5) * 1e-6; + } + + function x(d) { + return d.x + d.vx; + } + + function y(d) { + return d.y + d.vy; + } + + function collide(radius) { + var nodes, + radii, + strength = 1, + iterations = 1; + + if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius); + + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; + + for (var k = 0; k < iterations; ++k) { + tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); + } + } + + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } + } + return; + } + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; + } + } + + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.iterations = function (_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function (_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + force.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + return force; + } + + function index(d) { + return d.index; + } + + function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("missing: " + nodeId); + return node; + } + + function link(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant(30), + distances, + nodes, + count, + bias, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(); + y = target.y + target.vy - source.y - source.vy || jiggle(); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; + } + } + } + + function initialize() { + if (!nodes) return; + + var i, + n = nodes.length, + m = links.length, + nodeById = d3Collection.map(nodes, id), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } + + function initializeStrength() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + + function initializeDistance() { + if (!nodes) return; + + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.links = function (_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + + force.id = function (_) { + return arguments.length ? (id = _, force) : id; + }; + + force.iterations = function (_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength; + }; + + force.distance = function (_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; + }; + + return force; + } + + function x$1(d) { + return d.x; + } + + function y$1(d) { + return d.y; + } + + var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); + + function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = d3Collection.map(), + stepper = d3Timer.timer(step), + event = d3Dispatch.dispatch("tick", "end"); + + if (nodes == null) nodes = []; + + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + + function tick(iterations) { + var i, n = nodes.length, node; + + if (iterations === undefined) iterations = 1; + + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + + forces.each(function (force) { + force(alpha); + }); + + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + + function initializeForce(force) { + if (force.initialize) force.initialize(nodes); + return force; + } + + initializeNodes(); + + return simulation = { + tick: tick, + + restart: function () { + return stepper.restart(step), simulation; + }, + + stop: function () { + return stepper.stop(), simulation; + }, + + nodes: function (_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes; + }, + + alpha: function (_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function (_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function (_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function (_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function (_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + force: function (name, _) { + return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function (x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function (name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; + } + + function manyBody() { + var nodes, + node, + alpha, + strength = constant(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); + } + + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; + + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } + + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } + + quad.value = strength; + } + + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; + } + + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; + + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(), l += x * x; + if (y === 0) y = jiggle(), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.distanceMin = function (_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + + force.distanceMax = function (_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + + force.theta = function (_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + + return force; + } + + function radial(radius, x, y) { + var nodes, + strength = constant(0.1), + strengths, + radiuses; + + if (typeof radius !== "function") radius = constant(+radius); + if (x == null) x = 0; + if (y == null) y = 0; + + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _, initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + force.x = function (_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function (_) { + return arguments.length ? (y = +_, force) : y; + }; + + return force; + } + + function x$2(x) { + var strength = constant(0.1), + nodes, + strengths, + xz; + + if (typeof x !== "function") x = constant(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.x = function (_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x; + }; + + return force; + } + + function y$2(y) { + var strength = constant(0.1), + nodes, + strengths, + yz; + + if (typeof y !== "function") y = constant(y == null ? 0 : +y); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } + + force.initialize = function (_) { + nodes = _; + initialize(); + }; + + force.strength = function (_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.y = function (_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; + }; + + return force; + } + + exports.forceCenter = center; + exports.forceCollide = collide; + exports.forceLink = link; + exports.forceManyBody = manyBody; + exports.forceRadial = radial; + exports.forceSimulation = simulation; + exports.forceX = x$2; + exports.forceY = y$2; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {"d3-collection": 12, "d3-dispatch": 15, "d3-quadtree": 27, "d3-timer": 35}], + 21: [function (require, module, exports) { +// https://d3js.org/d3-format/ v1.4.3 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimal(1.23) returns ["123", 0]. + function formatDecimal(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; + } + + function exponent(x) { + return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN; + } + + function formatGroup(grouping, thousands) { + return function (value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; + } + + function formatNumerals(numerals) { + return function (value) { + return value.replace(/[0-9]/g, function (i) { + return numerals[+i]; + }); + }; + } + +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] + var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; + + function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); + } + + formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof + + function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; + } + + FormatSpecifier.prototype.toString = function () { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; + }; + +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. + function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": + i0 = i1 = i; + break; + case "0": + if (i0 === 0) i0 = i; + i1 = i; + break; + default: + if (!+s[i]) break out; + if (i0 > 0) i0 = 0; + break; + } + } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; + } + + var prefixExponent; + + function formatPrefixAuto(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y! + } + + function formatRounded(x, p) { + var d = formatDecimal(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); + } + + var formatTypes = { + "%": function (x, p) { + return (x * 100).toFixed(p); + }, + "b": function (x) { + return Math.round(x).toString(2); + }, + "c": function (x) { + return x + ""; + }, + "d": function (x) { + return Math.round(x).toString(10); + }, + "e": function (x, p) { + return x.toExponential(p); + }, + "f": function (x, p) { + return x.toFixed(p); + }, + "g": function (x, p) { + return x.toPrecision(p); + }, + "o": function (x) { + return Math.round(x).toString(8); + }, + "p": function (x, p) { + return formatRounded(x * 100, p); + }, + "r": formatRounded, + "s": formatPrefixAuto, + "X": function (x) { + return Math.round(x).toString(16).toUpperCase(); + }, + "x": function (x) { + return Math.round(x).toString(16); + } + }; + + function identity(x) { + return x; + } + + var map = Array.prototype.map, + prefixes = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"]; + + function formatLocale(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "-" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; + + function newFormat(specifier) { + specifier = formatSpecifier(specifier); + + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; + + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; + + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; + + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; + + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; + + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); + + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); + + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; + + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; + + // Perform the initial formatting. + var valueNegative = value < 0; + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + + // Trim insignificant zeros. + if (trim) value = formatTrim(value); + + // If a negative value rounds to zero during formatting, treat as positive. + if (valueNegative && +value === 0) valueNegative = false; + + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } + + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); + + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; + + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; + + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": + value = valuePrefix + value + valueSuffix + padding; + break; + case "=": + value = valuePrefix + padding + value + valueSuffix; + break; + case "^": + value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); + break; + default: + value = padding + valuePrefix + value + valueSuffix; + break; + } + + return numerals(value); + } + + format.toString = function () { + return specifier + ""; + }; + + return format; + } + + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function (value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; + } + + var locale; + + defaultLocale({ + decimal: ".", + thousands: ",", + grouping: [3], + currency: ["$", ""], + minus: "-" + }); + + function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; + } + + function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); + } + + function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); + } + + function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; + } + + exports.FormatSpecifier = FormatSpecifier; + exports.formatDefaultLocale = defaultLocale; + exports.formatLocale = formatLocale; + exports.formatSpecifier = formatSpecifier; + exports.precisionFixed = precisionFixed; + exports.precisionPrefix = precisionPrefix; + exports.precisionRound = precisionRound; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 22: [function (require, module, exports) { +// https://d3js.org/d3-geo/ v1.11.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-array'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Array) { + 'use strict'; + +// Adds floating point numbers with twice the normal precision. +// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and +// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) +// 305–363 (1997). +// Code adapted from GeographicLib by Charles F. F. Karney, +// http://geographiclib.sourceforge.net/ + + function adder() { + return new Adder; + } + + function Adder() { + this.reset(); + } + + Adder.prototype = { + constructor: Adder, + reset: function () { + this.s = // rounded value + this.t = 0; // exact error + }, + add: function (y) { + add(temp, y, this.t); + add(this, temp.s, this.s); + if (this.s) this.t += temp.t; + else this.s = temp.t; + }, + valueOf: function () { + return this.s; + } + }; + + var temp = new Adder; + + function add(adder, a, b) { + var x = adder.s = a + b, + bv = x - a, + av = x - bv; + adder.t = (a - av) + (b - bv); + } + + var epsilon = 1e-6; + var epsilon2 = 1e-12; + var pi = Math.PI; + var halfPi = pi / 2; + var quarterPi = pi / 4; + var tau = pi * 2; + + var degrees = 180 / pi; + var radians = pi / 180; + + var abs = Math.abs; + var atan = Math.atan; + var atan2 = Math.atan2; + var cos = Math.cos; + var ceil = Math.ceil; + var exp = Math.exp; + var log = Math.log; + var pow = Math.pow; + var sin = Math.sin; + var sign = Math.sign || function (x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + }; + var sqrt = Math.sqrt; + var tan = Math.tan; + + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); + } + + function asin(x) { + return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); + } + + function haversin(x) { + return (x = sin(x / 2)) * x; + } + + function noop() { + } + + function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } + } + + var streamObjectType = { + Feature: function (object, stream) { + streamGeometry(object.geometry, stream); + }, + FeatureCollection: function (object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } + }; + + var streamGeometryType = { + Sphere: function (object, stream) { + stream.sphere(); + }, + Point: function (object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); + }, + MultiPoint: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); + }, + LineString: function (object, stream) { + streamLine(object.coordinates, stream, 0); + }, + MultiLineString: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); + }, + Polygon: function (object, stream) { + streamPolygon(object.coordinates, stream); + }, + MultiPolygon: function (object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); + }, + GeometryCollection: function (object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); + } + }; + + function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); + } + + function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); + } + + function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } + } + + var areaRingSum = adder(); + + var areaSum = adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + + var areaStream = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function () { + areaRingSum.reset(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; + }, + polygonEnd: function () { + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop; + }, + sphere: function () { + areaSum.add(tau); + } + }; + + function areaRingStart() { + areaStream.point = areaPointFirst; + } + + function areaRingEnd() { + areaPoint(lambda00, phi00); + } + + function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); + } + + function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole + + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos(phi), + sinPhi = sin(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos(adLambda), + v = k * sdLambda * sin(adLambda); + areaRingSum.add(atan2(v, u)); + + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; + } + + function area(object) { + areaSum.reset(); + geoStream(object, areaStream); + return areaSum * 2; + } + + function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; + } + + function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); + return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; + } + + function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + + function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; + } + +// TODO return a + function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; + } + + function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; + } + +// TODO return d + function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; + } + + var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum = adder(), + ranges, + range; + + var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function () { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum.reset(); + areaStream.polygonStart(); + }, + polygonEnd: function () { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon) phi1 = 90; + else if (deltaSum < -epsilon) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function () { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } + }; + + function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + + function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + } + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; + } + + function boundsLineStart() { + boundsStream.point = linePoint; + } + + function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; + } + + function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; + } + areaStream.point(lambda, phi); + linePoint(lambda, phi); + } + + function boundsRingStart() { + areaStream.lineStart(); + } + + function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; + } + +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. + function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; + } + + function rangeCompare(a, b) { + return a[0] - b[0]; + } + + function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + + function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; + + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; + } + } + + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; + } + + var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00$2, phi00$2, // first point + x0, y0, z0; // previous point + + var centroidStream = { + sphere: noop, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function () { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function () { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; + } + }; + +// Arithmetic mean of Cartesian vectors. + function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); + } + + function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; + } + + function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; + } + + function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); + } + + function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroidLineEnd() { + centroidStream.point = centroidPoint; + } + +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). + function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; + } + + function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; + } + + function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidPointCartesian(x0, y0, z0); + } + + function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = sqrt(cx * cx + cy * cy + cz * cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2 += v * cx; + Y2 += v * cy; + Z2 += v * cz; + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); + } + + function centroid(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = + X2 = Y2 = Z2 = 0; + geoStream(object, centroidStream); + + var x = X2, + y = Y2, + z = Z2, + m = x * x + y * y + z * z; + + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon) x = X0, y = Y0, z = Z0; + m = x * x + y * y + z * z; + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2) return [NaN, NaN]; + } + + return [atan2(y, x) * degrees, asin(z / sqrt(m)) * degrees]; + } + + function constant(x) { + return function () { + return x; + }; + } + + function compose(a, b) { + + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + + if (a.invert && b.invert) compose.invert = function (x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + + return compose; + } + + function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; + } + + rotationIdentity.invert = rotationIdentity; + + function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); + } + + function forwardRotationLambda(deltaLambda) { + return function (lambda, phi) { + return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; + }; + } + + function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; + } + + function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos(deltaPhi), + sinDeltaPhi = sin(deltaPhi), + cosDeltaGamma = cos(deltaGamma), + sinDeltaGamma = sin(deltaGamma); + + function rotation(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; + } + + rotation.invert = function (lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; + }; + + return rotation; + } + + function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + } + + forward.invert = function (coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + }; + + return forward; + } + +// Generates a circle centered at [0°, 0°], with a given radius and precision. + function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos(radius), + sinRadius = sin(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); + stream.point(point[0], point[1]); + } + } + +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. + function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; + } + + function circle() { + var center = constant([0, 0]), + radius = constant(90), + precision = constant(6), + ring, + rotate, + stream = {point: point}; + + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees, x[1] *= degrees; + } + + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } + + circle.center = function (_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center; + }; + + circle.radius = function (_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius; + }; + + circle.precision = function (_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision; + }; + + return circle; + } + + function clipBuffer() { + var lines = [], + line; + return { + point: function (x, y) { + line.push([x, y]); + }, + lineStart: function () { + lines.push(line = []); + }, + lineEnd: noop, + rejoin: function () { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function () { + var result = lines; + lines = []; + line = null; + return result; + } + }; + } + + function pointEqual(a, b) { + return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; + } + + function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous + } + +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. + function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; + + segments.forEach(function (segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; + + // If the first and last points of a segment are coincident, then treat as a + // closed ring. TODO if all rings are closed, then the winding order of the + // exterior ring should be checked. + if (pointEqual(p0, p1)) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); + + if (!subject.length) return; + + clip.sort(compareIntersection); + link(subject); + link(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; + } + + var start = subject[0], + points, + point; + + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); + } + } + + function link(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; + } + a.n = b = array[0]; + b.p = a; + } + + var sum = adder(); + + function longitude(point) { + if (abs(point[0]) <= pi) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); + } + + function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin(phi), + normal = [sin(lambda), -cos(lambda), 0], + angle = 0, + winding = 0; + + sum.reset(); + + if (sinPhi === 1) phi = halfPi + epsilon; + else if (sinPhi === -1) phi = -halfPi - epsilon; + + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin(phi0), + cosPhi0 = cos(phi0); + + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin(phi1), + cosPhi1 = cos(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi, + k = sinPhi0 * sinPhi1; + + sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); + angle += antimeridian ? delta + sign * tau : delta; + + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } + } + + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. + + return (angle < -epsilon || angle < epsilon && sum < -epsilon) ^ (winding & 1); + } + + function clip(pointVisible, clipLine, interpolate, start) { + return function (sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; + + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function () { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function () { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3Array.merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function () { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; + + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } + + function pointLine(lambda, phi) { + line.point(lambda, phi); + } + + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } + + function ringStart() { + ringSink.lineStart(); + ring = []; + } + + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); + + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; + + ring.pop(); + polygon.push(ring); + ring = null; + + if (!n) return; + + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } + + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; + } + + function validSegment(segment) { + return segment.length > 1; + } + +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. + function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); + } + + var clipAntimeridian = clip( + function () { + return true; + }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi, -halfPi] + ); + +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. + function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections + + return { + lineStart: function () { + stream.lineStart(); + clean = 1; + }, + point: function (lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi : -pi, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi) < epsilon) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function () { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function () { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; + } + + function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon + ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) + - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; + } + + function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi; + stream.point(-pi, phi); + stream.point(0, phi); + stream.point(pi, phi); + stream.point(pi, 0); + stream.point(pi, -phi); + stream.point(0, -phi); + stream.point(-pi, -phi); + stream.point(-pi, 0); + stream.point(-pi, phi); + } else if (abs(from[0] - to[0]) > epsilon) { + var lambda = from[0] < to[0] ? pi : -pi; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } + } + + function clipCircle(radius) { + var cr = cos(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case + + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); + } + + function visible(lambda, phi) { + return cos(lambda) * cos(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function () { + v00 = v0 = false; + clean = 1; + }, + point: function (lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + // Handle degeneracies. + // TODO ignore if not clipping polygons. + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) { + point1[0] += epsilon; + point1[1] += epsilon; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1]); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function () { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function () { + return clean | ((v00 && v0) << 1); + } + }; + } + + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); + + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; + + // Two polar points. + if (!determinant) return !two && a; + + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); + + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); + + if (t2 < 0) return; + + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); + + if (!two) return q; + + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; + + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + + var delta = lambda1 - lambda0, + polar = abs(delta - pi) < epsilon, + meridian = polar || delta < epsilon; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); + } + + function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; + } + + var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + + function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } + + function corner(p, direction) { + return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } + + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } + + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } + + return function (stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; + + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; + + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } + + function polygonInside() { + var winding = 0; + + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { + if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; + } else { + if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; + } + } + } + + return winding; + } + + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } + + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = d3Array.merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); + } + activeStream = stream, segments = polygon = ring = null; + } + + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } + + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } + + return clipStream; + }; + } + + function extent() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function (stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function (_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } + }; + } + + var lengthSum = adder(), + lambda0$2, + sinPhi0$1, + cosPhi0$1; + + var lengthStream = { + sphere: noop, + point: noop, + lineStart: lengthLineStart, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop + }; + + function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; + } + + function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop; + } + + function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi); + lengthStream.point = lengthPoint; + } + + function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin(phi), + cosPhi = cos(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos(delta), + sinDelta = sin(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; + } + + function length(object) { + lengthSum.reset(); + geoStream(object, lengthStream); + return +lengthSum; + } + + var coordinates = [null, null], + object = {type: "LineString", coordinates: coordinates}; + + function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length(object); + } + + var containsObjectType = { + Feature: function (object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function (object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; + } + }; + + var containsGeometryType = { + Sphere: function () { + return true; + }, + Point: function (object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function (object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function (object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function (object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function (object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; + } + }; + + function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; + } + + function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; + } + + function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab + ) + return true; + } + ao = bo; + } + return false; + } + + function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); + } + + function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; + } + + function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; + } + + function contains(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); + } + + function graticuleX(y0, y1, dy) { + var y = d3Array.range(y0, y1 - epsilon, dy).concat(y1); + return function (x) { + return y.map(function (y) { + return [x, y]; + }); + }; + } + + function graticuleY(x0, x1, dx) { + var x = d3Array.range(x0, x1 - epsilon, dx).concat(x1); + return function (y) { + return x.map(function (x) { + return [x, y]; + }); + }; + } + + function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; + + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; + } + + function lines() { + return d3Array.range(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(d3Array.range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(d3Array.range(ceil(x0 / dx) * dx, x1, dx).filter(function (x) { + return abs(x % DX) > epsilon; + }).map(x)) + .concat(d3Array.range(ceil(y0 / dy) * dy, y1, dy).filter(function (y) { + return abs(y % DY) > epsilon; + }).map(y)); + } + + graticule.lines = function () { + return lines().map(function (coordinates) { + return {type: "LineString", coordinates: coordinates}; + }); + }; + + graticule.outline = function () { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; + + graticule.extent = function (_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; + + graticule.extentMajor = function (_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + + graticule.extentMinor = function (_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + + graticule.step = function (_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; + + graticule.stepMajor = function (_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + + graticule.stepMinor = function (_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + + graticule.precision = function (_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; + + return graticule + .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) + .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); + } + + function graticule10() { + return graticule()(); + } + + function interpolate(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos(y0), + sy0 = sin(y0), + cy1 = cos(y1), + sy1 = sin(y1), + kx0 = cy0 * cos(x0), + ky0 = cy0 * sin(x0), + kx1 = cy1 * cos(x1), + ky1 = cy1 * sin(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin(d); + + var interpolate = d ? function (t) { + var B = sin(t *= d) / k, + A = sin(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees, + atan2(z, sqrt(x * x + y * y)) * degrees + ]; + } : function () { + return [x0 * degrees, y0 * degrees]; + }; + + interpolate.distance = d; + + return interpolate; + } + + function identity(x) { + return x; + } + + var areaSum$1 = adder(), + areaRingSum$1 = adder(), + x00, + y00, + x0$1, + y0$1; + + var areaStream$1 = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function () { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function () { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1.reset(); + }, + result: function () { + var area = areaSum$1 / 2; + areaSum$1.reset(); + return area; + } + }; + + function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; + } + + function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; + } + + function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; + } + + function areaRingEnd$1() { + areaPoint$1(x00, y00); + } + + var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + + var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop, + result: function () { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } + }; + + function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; + } + +// TODO Enforce positive area for exterior, negative area for interior? + + var X0$1 = 0, + Y0$1 = 0, + Z0$1 = 0, + X1$1 = 0, + Y1$1 = 0, + Z1$1 = 0, + X2$1 = 0, + Y2$1 = 0, + Z2$1 = 0, + x00$1, + y00$1, + x0$3, + y0$3; + + var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function () { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function () { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function () { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; + } + }; + + function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; + } + + function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; + } + + function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; + } + + function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; + } + + function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); + } + + function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); + } + + function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); + + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); + } + + function PathContext(context) { + this._context = context; + } + + PathContext.prototype = { + _radius: 4.5, + pointRadius: function (_) { + return this._radius = _, this; + }, + polygonStart: function () { + this._line = 0; + }, + polygonEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function (x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; + } + case 1: { + this._context.lineTo(x, y); + break; + } + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau); + break; + } + } + }, + result: noop + }; + + var lengthSum$1 = adder(), + lengthRing, + x00$2, + y00$2, + x0$4, + y0$4; + + var lengthStream$1 = { + point: noop, + lineStart: function () { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function () { + if (lengthRing) lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop; + }, + polygonStart: function () { + lengthRing = true; + }, + polygonEnd: function () { + lengthRing = null; + }, + result: function () { + var length = +lengthSum$1; + lengthSum$1.reset(); + return length; + } + }; + + function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; + } + + function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; + } + + function PathString() { + this._string = []; + } + + PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function (_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function () { + this._line = 0; + }, + polygonEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function (x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function () { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } + }; + + function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; + } + + function index(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; + + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); + } + return contextStream.result(); + } + + path.area = function (object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); + }; + + path.measure = function (object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); + }; + + path.bounds = function (object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); + }; + + path.centroid = function (object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); + }; + + path.projection = function (_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; + }; + + path.context = function (_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; + + path.pointRadius = function (_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + + return path.projection(projection).context(context); + } + + function transform(methods) { + return { + stream: transformer(methods) + }; + } + + function transformer(methods) { + return function (stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; + }; + } + + function TransformStream() { + } + + TransformStream.prototype = { + constructor: TransformStream, + point: function (x, y) { + this.stream.point(x, y); + }, + sphere: function () { + this.stream.sphere(); + }, + lineStart: function () { + this.stream.lineStart(); + }, + lineEnd: function () { + this.stream.lineEnd(); + }, + polygonStart: function () { + this.stream.polygonStart(); + }, + polygonEnd: function () { + this.stream.polygonEnd(); + } + }; + + function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream$1)); + fitBounds(boundsStream$1.result()); + if (clip != null) projection.clipExtent(clip); + return projection; + } + + function fitExtent(projection, extent, object) { + return fit(projection, function (b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); + } + + function fitWidth(projection, width, object) { + return fit(projection, function (b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + function fitHeight(projection, height, object) { + return fit(projection, function (b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); + } + + var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos(30 * radians); // cos(minimum angular distance) + + function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); + } + + function resampleNone(project) { + return transformer({ + point: function (x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); + } + }); + } + + function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); + } + } + } + + return function (stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point + + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function () { + stream.polygonStart(); + resampleStream.lineStart = ringStart; + }, + polygonEnd: function () { + stream.polygonEnd(); + resampleStream.lineStart = lineStart; + } + }; + + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } + + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } + + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } + + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } + + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } + + return resampleStream; + }; + } + + var transformRadians = transformer({ + point: function (x, y) { + this.stream.point(x * radians, y * radians); + } + }); + + function transformRotate(rotate) { + return transformer({ + point: function (x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); + } + + function scaleTranslate(k, dx, dy) { + function transform(x, y) { + return [dx + k * x, dy - k * y]; + } + + transform.invert = function (x, y) { + return [(x - dx) / k, (dy - y) / k]; + }; + return transform; + } + + function scaleTranslateRotate(k, dx, dy, alpha) { + var cosAlpha = cos(alpha), + sinAlpha = sin(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + + function transform(x, y) { + return [a * x - b * y + dx, dy - b * x - a * y]; + } + + transform.invert = function (x, y) { + return [ai * x - bi * y + ci, fi - bi * x - ai * y]; + }; + return transform; + } + + function projection(project) { + return projectionMutator(function () { + return project; + })(); + } + + function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; + + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } + + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees, point[1] * degrees]; + } + + projection.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; + + projection.preclip = function (_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; + + projection.postclip = function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + + projection.clipAngle = function (_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; + }; + + projection.clipExtent = function (_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + projection.scale = function (_) { + return arguments.length ? (k = +_, recenter()) : k; + }; + + projection.translate = function (_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; + + projection.center = function (_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; + }; + + projection.rotate = function (_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + }; + + projection.angle = function (_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.precision = function (_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function (extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function (size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function (width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function (height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)), + transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); + } + + function reset() { + cache = cacheStream = null; + return projection; + } + + return function () { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); + }; + } + + function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); + + p.parallels = function (_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; + }; + + return p; + } + + function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos(phi0); + + function forward(lambda, phi) { + return [lambda * cosPhi0, sin(phi) / cosPhi0]; + } + + forward.invert = function (x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; + + return forward; + } + + function conicEqualAreaRaw(y0, y1) { + var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; + + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); + + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; + + function project(x, y) { + var r = sqrt(c - 2 * n * sin(y)) / n; + return [r * sin(x *= n), r0 - r * cos(x)]; + } + + project.invert = function (x, y) { + var r0y = r0 - y; + return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; + } + + function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); + } + + function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); + } + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. + function multiplex(streams) { + var n = streams.length; + return { + point: function (x, y) { + var i = -1; + while (++i < n) streams[i].point(x, y); + }, + sphere: function () { + var i = -1; + while (++i < n) streams[i].sphere(); + }, + lineStart: function () { + var i = -1; + while (++i < n) streams[i].lineStart(); + }, + lineEnd: function () { + var i = -1; + while (++i < n) streams[i].lineEnd(); + }, + polygonStart: function () { + var i = -1; + while (++i < n) streams[i].polygonStart(); + }, + polygonEnd: function () { + var i = -1; + while (++i < n) streams[i].polygonEnd(); + } + }; + } + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers + function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = { + point: function (x, y) { + point = [x, y]; + } + }; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); + } + + albersUsa.invert = function (coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); + }; + + albersUsa.stream = function (stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; + + albersUsa.precision = function (_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; + + albersUsa.scale = function (_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + + albersUsa.translate = function (_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); + + return reset(); + }; + + albersUsa.fitExtent = function (extent, object) { + return fitExtent(albersUsa, extent, object); + }; + + albersUsa.fitSize = function (size, object) { + return fitSize(albersUsa, size, object); + }; + + albersUsa.fitWidth = function (width, object) { + return fitWidth(albersUsa, width, object); + }; + + albersUsa.fitHeight = function (height, object) { + return fitHeight(albersUsa, height, object); + }; + + function reset() { + cache = cacheStream = null; + return albersUsa; + } + + return albersUsa.scale(1070); + } + + function azimuthalRaw(scale) { + return function (x, y) { + var cx = cos(x), + cy = cos(y), + k = scale(cx * cy); + return [ + k * cy * sin(x), + k * sin(y) + ]; + } + } + + function azimuthalInvert(angle) { + return function (x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin(c), + cc = cos(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } + } + + var azimuthalEqualAreaRaw = azimuthalRaw(function (cxcy) { + return sqrt(2 / (1 + cxcy)); + }); + + azimuthalEqualAreaRaw.invert = azimuthalInvert(function (z) { + return 2 * asin(z / 2); + }); + + function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); + } + + var azimuthalEquidistantRaw = azimuthalRaw(function (c) { + return (c = acos(c)) && c / sin(c); + }); + + azimuthalEquidistantRaw.invert = azimuthalInvert(function (z) { + return z; + }); + + function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); + } + + function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi + phi) / 2))]; + } + + mercatorRaw.invert = function (x, y) { + return [x, 2 * atan(exp(y)) - halfPi]; + }; + + function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau); + } + + function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent + + m.scale = function (_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; + + m.translate = function (_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function (_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function (_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + } + + return reclip(); + } + + function tany(y) { + return tan((halfPi + y) / 2); + } + + function conicConformalRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; + + if (!n) return mercatorRaw; + + function project(x, y) { + if (f > 0) { + if (y < -halfPi + epsilon) y = -halfPi + epsilon; + } else { + if (y > halfPi - epsilon) y = halfPi - epsilon; + } + var r = f / pow(tany(y), n); + return [r * sin(n * x), f - r * cos(n * x)]; + } + + project.invert = function (x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy); + return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi]; + }; + + return project; + } + + function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); + } + + function equirectangularRaw(lambda, phi) { + return [lambda, phi]; + } + + equirectangularRaw.invert = equirectangularRaw; + + function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); + } + + function conicEquidistantRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0), + g = cy0 / n + y0; + + if (abs(n) < epsilon) return equirectangularRaw; + + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin(nx), g - gy * cos(nx)]; + } + + project.invert = function (x, y) { + var gy = g - y; + return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; + } + + function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); + } + + var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + + function equalEarthRaw(lambda, phi) { + var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; + } + + equalEarthRaw.invert = function (x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2) break; + } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l), + asin(sin(l) / M) + ]; + }; + + function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); + } + + function gnomonicRaw(x, y) { + var cy = cos(y), k = cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; + } + + gnomonicRaw.invert = azimuthalInvert(atan); + + function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); + } + + function scaleTranslate$1(kx, ky, tx, ty) { + return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity : transformer({ + point: function (x, y) { + this.stream.point(x * kx + tx, y * ky + ty); + } + }); + } + + function identity$1() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity, // scale, translate and reflect + x0 = null, y0, x1, y1, // clip extent + postclip = identity, + cache, + cacheStream, + projection; + + function reset() { + cache = cacheStream = null; + return projection; + } + + return projection = { + stream: function (stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }, + postclip: function (_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }, + clipExtent: function (_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }, + scale: function (_) { + return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k; + }, + translate: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty]; + }, + reflectX: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0; + }, + reflectY: function (_) { + return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0; + }, + fitExtent: function (extent, object) { + return fitExtent(projection, extent, object); + }, + fitSize: function (size, object) { + return fitSize(projection, size, object); + }, + fitWidth: function (width, object) { + return fitWidth(projection, width, object); + }, + fitHeight: function (height, object) { + return fitHeight(projection, height, object); + } + }; + } + + function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; + } + + naturalEarth1Raw.invert = function (x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; + }; + + function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); + } + + function orthographicRaw(x, y) { + return [cos(y) * sin(x), sin(y)]; + } + + orthographicRaw.invert = azimuthalInvert(asin); + + function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon); + } + + function stereographicRaw(x, y) { + var cy = cos(y), k = 1 + cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; + } + + stereographicRaw.invert = azimuthalInvert(function (z) { + return 2 * atan(z); + }); + + function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); + } + + function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi + phi) / 2)), -lambda]; + } + + transverseMercatorRaw.invert = function (x, y) { + return [-y, 2 * atan(exp(x)) - halfPi]; + }; + + function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; + + m.center = function (_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function (_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); + } + + exports.geoAlbers = albers; + exports.geoAlbersUsa = albersUsa; + exports.geoArea = area; + exports.geoAzimuthalEqualArea = azimuthalEqualArea; + exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; + exports.geoAzimuthalEquidistant = azimuthalEquidistant; + exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; + exports.geoBounds = bounds; + exports.geoCentroid = centroid; + exports.geoCircle = circle; + exports.geoClipAntimeridian = clipAntimeridian; + exports.geoClipCircle = clipCircle; + exports.geoClipExtent = extent; + exports.geoClipRectangle = clipRectangle; + exports.geoConicConformal = conicConformal; + exports.geoConicConformalRaw = conicConformalRaw; + exports.geoConicEqualArea = conicEqualArea; + exports.geoConicEqualAreaRaw = conicEqualAreaRaw; + exports.geoConicEquidistant = conicEquidistant; + exports.geoConicEquidistantRaw = conicEquidistantRaw; + exports.geoContains = contains; + exports.geoDistance = distance; + exports.geoEqualEarth = equalEarth; + exports.geoEqualEarthRaw = equalEarthRaw; + exports.geoEquirectangular = equirectangular; + exports.geoEquirectangularRaw = equirectangularRaw; + exports.geoGnomonic = gnomonic; + exports.geoGnomonicRaw = gnomonicRaw; + exports.geoGraticule = graticule; + exports.geoGraticule10 = graticule10; + exports.geoIdentity = identity$1; + exports.geoInterpolate = interpolate; + exports.geoLength = length; + exports.geoMercator = mercator; + exports.geoMercatorRaw = mercatorRaw; + exports.geoNaturalEarth1 = naturalEarth1; + exports.geoNaturalEarth1Raw = naturalEarth1Raw; + exports.geoOrthographic = orthographic; + exports.geoOrthographicRaw = orthographicRaw; + exports.geoPath = index; + exports.geoProjection = projection; + exports.geoProjectionMutator = projectionMutator; + exports.geoRotation = rotation; + exports.geoStereographic = stereographic; + exports.geoStereographicRaw = stereographicRaw; + exports.geoStream = geoStream; + exports.geoTransform = transform; + exports.geoTransverseMercator = transverseMercator; + exports.geoTransverseMercatorRaw = transverseMercatorRaw; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-array": 8}], + 23: [function (require, module, exports) { +// https://d3js.org/d3-hierarchy/ v1.1.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; + } + + function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; + } + + function meanXReduce(x, c) { + return x + c.x; + } + + function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); + } + + function maxYReduce(y, c) { + return Math.max(y, c.y); + } + + function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; + } + + function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; + } + + function cluster() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; + + function cluster(root) { + var previousNode, + x = 0; + + // First walk, computing the initial x & y values. + root.eachAfter(function (node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function (node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function (node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); + } + + cluster.separation = function (x) { + return arguments.length ? (separation = x, cluster) : separation; + }; + + cluster.size = function (x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; + + cluster.nodeSize = function (x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; + + return cluster; + } + + function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; + } + + function node_count() { + return this.eachAfter(count); + } + + function node_each(callback) { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + callback(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } while (next.length); + return this; + } + + function node_eachBefore(callback) { + var node = this, nodes = [node], children, i; + while (node = nodes.pop()) { + callback(node), children = node.children; + if (children) for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + return this; + } + + function node_eachAfter(callback) { + var node = this, nodes = [node], next = [], children, i, n; + while (node = nodes.pop()) { + next.push(node), children = node.children; + if (children) for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + while (node = next.pop()) { + callback(node); + } + return this; + } + + function node_sum(value) { + return this.eachAfter(function (node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); + } + + function node_sort(compare) { + return this.eachBefore(function (node) { + if (node.children) { + node.children.sort(compare); + } + }); + } + + function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; + } + + function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); + } + return c; + } + + function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; + } + + function node_descendants() { + var nodes = []; + this.each(function (node) { + nodes.push(node); + }); + return nodes; + } + + function node_leaves() { + var leaves = []; + this.eachBefore(function (node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; + } + + function node_links() { + var root = this, links = []; + root.each(function (node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; + } + + function hierarchy(data, children) { + var root = new Node(data), + valued = +data.value && (root.value = data.value), + node, + nodes = [root], + child, + childs, + i, + n; + + if (children == null) children = defaultChildren; + + while (node = nodes.pop()) { + if (valued) node.value = +node.data.value; + if ((childs = children(node.data)) && (n = childs.length)) { + node.children = new Array(n); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } + } + + return root.eachBefore(computeHeight); + } + + function node_copy() { + return hierarchy(this).eachBefore(copyData); + } + + function defaultChildren(d) { + return d.children; + } + + function copyData(node) { + node.data = node.data.data; + } + + function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); + } + + function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; + } + + Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy + }; + + var slice = Array.prototype.slice; + + function shuffle(array) { + var m = array.length, + t, + i; + + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; + } + + return array; + } + + function enclose(circles) { + var i = 0, n = (circles = shuffle(slice.call(circles))).length, B = [], p, e; + + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; + } + + return e; + } + + function extendBasis(B, p) { + var i, j; + + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; + } + } + + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } + } + + // If we get here then something is very wrong. + throw new Error; + } + + function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; + } + + function enclosesWeak(a, b) { + var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; + } + + function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; + } + + function encloseBasis(B) { + switch (B.length) { + case 1: + return encloseBasis1(B[0]); + case 2: + return encloseBasis2(B[0], B[1]); + case 3: + return encloseBasis3(B[0], B[1], B[2]); + } + } + + function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; + } + + function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; + } + + function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; + } + + function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } + } + + function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; + } + + function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; + } + + function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; + } + + function packEnclose(circles) { + if (!(n = circles.length)) return 0; + + var a, b, c, n, aa, ca, i, j, k, sj, sk; + + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; + + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; + + // Place the third circle. + place(b, a, c = circles[2]); + + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; + + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); + + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; + } + sk += k._.r, k = k.previous; + } + } while (j !== k.next); + + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; + + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; + } + + // Compute the enclosing circle of the front chain. + a = [b._], c = b; + while ((c = c.next) !== b) a.push(c._); + c = enclose(a); + + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + + return c.r; + } + + function siblings(circles) { + packEnclose(circles); + return circles; + } + + function optional(f) { + return f == null ? null : required(f); + } + + function required(f) { + if (typeof f !== "function") throw new Error; + return f; + } + + function constantZero() { + return 0; + } + + function constant(x) { + return function () { + return x; + }; + } + + function defaultRadius(d) { + return Math.sqrt(d.value); + } + + function index() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; + + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } + + pack.radius = function (x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; + + pack.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; + + pack.padding = function (x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding; + }; + + return pack; + } + + function radiusLeaf(radius) { + return function (node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; + } + + function packChildren(padding, k) { + return function (node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; + + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; + } + + function translateChild(k) { + return function (node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; + } + + function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); + } + + function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; + + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } + } + + function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; + + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(dy, n) { + return function (node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; + } + + partition.round = function (x) { + return arguments.length ? (round = !!x, partition) : round; + }; + + partition.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; + + partition.padding = function (x) { + return arguments.length ? (padding = +x, partition) : padding; + }; + + return partition; + } + + var keyPrefix = "$", // Protect against keys like “__proto__”. + preroot = {depth: -1}, + ambiguous = {}; + + function defaultId(d) { + return d.id; + } + + function defaultParentId(d) { + return d.parentId; + } + + function stratify() { + var id = defaultId, + parentId = defaultParentId; + + function stratify(data) { + var d, + i, + n = data.length, + root, + parent, + node, + nodes = new Array(n), + nodeId, + nodeKey, + nodeByKey = {}; + + for (i = 0; i < n; ++i) { + d = data[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = keyPrefix + (node.id = nodeId); + nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node; + } + } + + for (i = 0; i < n; ++i) { + node = nodes[i], nodeId = parentId(data[i], i, data); + if (nodeId == null || !(nodeId += "")) { + if (root) throw new Error("multiple roots"); + root = node; + } else { + parent = nodeByKey[keyPrefix + nodeId]; + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } + } + + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function (node) { + node.depth = node.parent.depth + 1; + --n; + }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function (x) { + return arguments.length ? (id = required(x), stratify) : id; + }; + + stratify.parentId = function (x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; + }; + + return stratify; + } + + function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; + } + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. + function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; + } + +// This function works analogously to nextLeft. + function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; + } + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. + function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; + } + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). + function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } + } + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. + function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; + } + + function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number + } + + TreeNode.prototype = Object.create(Node.prototype); + + function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; + + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; + } + } + } + + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; + } + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm + function tree() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function (node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function (node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); + } + + return root; + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; + } + + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; + } + + tree.separation = function (x) { + return arguments.length ? (separation = x, tree) : separation; + }; + + tree.size = function (x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; + + tree.nodeSize = function (x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; + + return tree; + } + + function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; + + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; + } + } + + var phi = (1 + Math.sqrt(5)) / 2; + + function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; + + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; + + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); + + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { + sumValue -= nodeValue; + break; + } + minRatio = newRatio; + } + + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; + } + + return rows; + } + + var squarify = (function custom(ratio) { + + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); + } + + squarify.ratio = function (x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return squarify; + })(phi); + + function index$1() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } + + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } + + treemap.round = function (x) { + return arguments.length ? (round = !!x, treemap) : round; + }; + + treemap.size = function (x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; + + treemap.tile = function (x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; + + treemap.padding = function (x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; + + treemap.paddingInner = function (x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner; + }; + + treemap.paddingOuter = function (x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; + + treemap.paddingTop = function (x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop; + }; + + treemap.paddingRight = function (x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight; + }; + + treemap.paddingBottom = function (x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom; + }; + + treemap.paddingLeft = function (x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft; + }; + + return treemap; + } + + function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); + + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } + + partition(0, n, parent.value, x0, y0, x1, y1); + + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } + + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; + + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } + + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; + + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; + + if ((x1 - x0) > (y1 - y0)) { + var xk = (x0 * valueRight + x1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = (y0 * valueRight + y1 * valueLeft) / value; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } + } + + function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); + } + + var resquarify = (function custom(ratio) { + + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; + + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value); + else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } + + resquarify.ratio = function (x) { + return custom((x = +x) > 1 ? x : 1); + }; + + return resquarify; + })(phi); + + exports.cluster = cluster; + exports.hierarchy = hierarchy; + exports.pack = index; + exports.packEnclose = enclose; + exports.packSiblings = siblings; + exports.partition = partition; + exports.stratify = stratify; + exports.tree = tree; + exports.treemap = index$1; + exports.treemapBinary = binary; + exports.treemapDice = treemapDice; + exports.treemapResquarify = resquarify; + exports.treemapSlice = treemapSlice; + exports.treemapSliceDice = sliceDice; + exports.treemapSquarify = squarify; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 24: [function (require, module, exports) { +// https://d3js.org/d3-interpolate/ v1.4.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-color')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-color'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Color) { + 'use strict'; + + function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; + } + + function basis$1(values) { + var n = values.length - 1; + return function (t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; + } + + function basisClosed(values) { + var n = values.length; + return function (t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; + } + + function constant(x) { + return function () { + return x; + }; + } + + function linear(a, d) { + return function (t) { + return a + t * d; + }; + } + + function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) { + return Math.pow(a + t * b, y); + }; + } + + function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); + } + + function gamma(y) { + return (y = +y) === 1 ? nogamma : function (a, b) { + return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); + }; + } + + function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant(isNaN(a) ? b : a); + } + + var rgb = (function rgbGamma(y) { + var color = gamma(y); + + function rgb(start, end) { + var r = color((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + rgb.gamma = rgbGamma; + + return rgb; + })(1); + + function rgbSpline(spline) { + return function (colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = d3Color.rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function (t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; + } + + var rgbBasis = rgbSpline(basis$1); + var rgbBasisClosed = rgbSpline(basisClosed); + + function numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function (t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; + } + + function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); + } + + function array(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); + } + + function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; + + for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; + + return function (t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; + } + + function date(a, b) { + var d = new Date; + return a = +a, b = +b, function (t) { + return d.setTime(a * (1 - t) + b * t), d; + }; + } + + function number(a, b) { + return a = +a, b = +b, function (t) { + return a * (1 - t) + b * t; + }; + } + + function object(a, b) { + var i = {}, + c = {}, + k; + + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; + + for (k in b) { + if (k in a) { + i[k] = value(a[k], b[k]); + } else { + c[k] = b[k]; + } + } + + return function (t) { + for (k in i) c[k] = i[k](t); + return c; + }; + } + + var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); + + function zero(b) { + return function () { + return b; + }; + } + + function one(b) { + return function (t) { + return b(t) + ""; + }; + } + + function string(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators + + // Coerce inputs to strings. + a = a + "", b = b + ""; + + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: number(am, bm)}); + } + bi = reB.lastIndex; + } + + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function (t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); + } + + function value(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant(b) + : (t === "number" ? number + : t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb) : string) + : b instanceof d3Color.color ? rgb + : b instanceof Date ? date + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : number)(a, b); + } + + function discrete(range) { + var n = range.length; + return function (t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + function hue$1(a, b) { + var i = hue(+a, +b); + return function (t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); + }; + } + + function round(a, b) { + return a = +a, b = +b, function (t) { + return Math.round(a * (1 - t) + b * t); + }; + } + + var degrees = 180 / Math.PI; + + var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 + }; + + function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; + } + + var cssNode, + cssRoot, + cssView, + svgNode; + + function parseCss(value) { + if (value === "none") return identity; + if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView; + cssNode.style.transform = value; + value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform"); + cssRoot.removeChild(cssNode); + value = value.slice(7, -1).split(","); + return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]); + } + + function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); + } + + function interpolateTransform(parse, pxComma, pxParen, degParen) { + + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + + return function (a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function (t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; + } + + var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); + var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + + var rho = Math.SQRT2, + rho2 = 2, + rho4 = 4, + epsilon2 = 1e-12; + + function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; + } + + function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; + } + + function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); + } + +// p0 = [ux0, uy0, w0] +// p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function (t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } + + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function (t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + + i.duration = S * 1000; + + return i; + } + + function hsl(hue) { + return function (start, end) { + var h = hue((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hsl$1 = hsl(hue); + var hslLong = hsl(nogamma); + + function lab(start, end) { + var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } + + function hcl(hue) { + return function (start, end) { + var h = hue((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } + } + + var hcl$1 = hcl(hue); + var hclLong = hcl(nogamma); + + function cubehelix(hue) { + return (function cubehelixGamma(y) { + y = +y; + + function cubehelix(start, end) { + var h = hue((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function (t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } + + cubehelix.gamma = cubehelixGamma; + + return cubehelix; + })(1); + } + + var cubehelix$1 = cubehelix(hue); + var cubehelixLong = cubehelix(nogamma); + + function piecewise(interpolate, values) { + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function (t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; + } + + function quantize(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; + } + + exports.interpolate = value; + exports.interpolateArray = array; + exports.interpolateBasis = basis$1; + exports.interpolateBasisClosed = basisClosed; + exports.interpolateCubehelix = cubehelix$1; + exports.interpolateCubehelixLong = cubehelixLong; + exports.interpolateDate = date; + exports.interpolateDiscrete = discrete; + exports.interpolateHcl = hcl$1; + exports.interpolateHclLong = hclLong; + exports.interpolateHsl = hsl$1; + exports.interpolateHslLong = hslLong; + exports.interpolateHue = hue$1; + exports.interpolateLab = lab; + exports.interpolateNumber = number; + exports.interpolateNumberArray = numberArray; + exports.interpolateObject = object; + exports.interpolateRgb = rgb; + exports.interpolateRgbBasis = rgbBasis; + exports.interpolateRgbBasisClosed = rgbBasisClosed; + exports.interpolateRound = round; + exports.interpolateString = string; + exports.interpolateTransformCss = interpolateTransformCss; + exports.interpolateTransformSvg = interpolateTransformSvg; + exports.interpolateZoom = zoom; + exports.piecewise = piecewise; + exports.quantize = quantize; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13}], + 25: [function (require, module, exports) { +// https://d3js.org/d3-path/ v1.0.9 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var pi = Math.PI, + tau = 2 * pi, + epsilon = 1e-6, + tauEpsilon = tau - epsilon; + + function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + + function path() { + return new Path; + } + + Path.prototype = path.prototype = { + constructor: Path, + moveTo: function (x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function () { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; + } + }, + lineTo: function (x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function (x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function (x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function (x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon)) ; + + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } + + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; + + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); + } + + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function (x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; + + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; + } + + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { + this._ += "L" + x0 + "," + y0; + } + + // Is this arc empty? We’re done. + if (!r) return; + + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau + tau; + + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } + + // Is this arc non-empty? Draw an arc! + else if (da > epsilon) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function (x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function () { + return this._; + } + }; + + exports.path = path; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 26: [function (require, module, exports) { +// https://d3js.org/d3-polygon/ v1.0.6 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function area(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + + return area / 2; + } + + function centroid(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; + + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + + return k *= 3, [x / k, y / k]; + } + +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. + function cross(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); + } + + function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; + } + +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. + function computeUpperHullIndexes(points) { + var n = points.length, + indexes = [0, 1], + size = 2; + + for (var i = 2; i < n; ++i) { + while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } + + return indexes.slice(0, size); // remove popped points + } + + function hull(points) { + if ((n = points.length) < 3) return null; + + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); + + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; + + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); + + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; + + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); + + return hull; + } + + function contains(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; + + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } + + return inside; + } + + function length(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; + + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.sqrt(xa * xa + ya * ya); + } + + return perimeter; + } + + exports.polygonArea = area; + exports.polygonCentroid = centroid; + exports.polygonContains = contains; + exports.polygonHull = hull; + exports.polygonLength = length; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 27: [function (require, module, exports) { +// https://d3js.org/d3-quadtree/ v1.0.7 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + function tree_add(d) { + var x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); + } + + function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; + + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; + } + + function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; + + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; + } + + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; + + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); + + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + + return this; + } + + function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points + + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; + + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } + + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0, + node = this._root, + parent, + i; + + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: + x1 = x0 + z, y1 = y0 + z; + break; + case 1: + x0 = x1 - z, y1 = y0 + z; + break; + case 2: + x1 = x0 + z, y0 = y1 - z; + break; + case 3: + x0 = x1 - z, y0 = y1 - z; + break; + } + } + + if (this._root && this._root.length) this._root = node; + } + + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; + } + + function tree_data() { + var data = []; + this.visit(function (node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; + } + + function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; + } + + function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; + } + + function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; + + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; + } + + while (q = quads.pop()) { + + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; + + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; + + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); + + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } + + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } + + return data; + } + + function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points + + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + } + + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; + + // If this is the root point, remove it. + if (!parent) return this._root = next, this; + + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + + return this; + } + + function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; + } + + function tree_root() { + return this._root; + } + + function tree_size() { + var size = 0; + this.visit(function (node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; + } + + function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; + } + + function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; + } + + function defaultX(d) { + return d[0]; + } + + function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; + } + + function defaultY(d) { + return d[1]; + } + + function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; + } + + function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); + } + + function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; + } + + function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; + } + + var treeProto = quadtree.prototype = Quadtree.prototype; + + treeProto.copy = function () { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; + + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); + } + } + } + + return copy; + }; + + treeProto.add = tree_add; + treeProto.addAll = addAll; + treeProto.cover = tree_cover; + treeProto.data = tree_data; + treeProto.extent = tree_extent; + treeProto.find = tree_find; + treeProto.remove = tree_remove; + treeProto.removeAll = removeAll; + treeProto.root = tree_root; + treeProto.size = tree_size; + treeProto.visit = tree_visit; + treeProto.visitAfter = tree_visitAfter; + treeProto.x = tree_x; + treeProto.y = tree_y; + + exports.quadtree = quadtree; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 28: [function (require, module, exports) { +// https://d3js.org/d3-random/ v1.1.2 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function defaultSource() { + return Math.random(); + } + + var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function () { + return source() * max + min; + }; + } + + randomUniform.source = sourceRandomUniform; + + return randomUniform; + })(defaultSource); + + var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function () { + var y; + + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; + + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } + + randomNormal.source = sourceRandomNormal; + + return randomNormal; + })(defaultSource); + + var logNormal = (function sourceRandomLogNormal(source) { + function randomLogNormal() { + var randomNormal = normal.source(source).apply(this, arguments); + return function () { + return Math.exp(randomNormal()); + }; + } + + randomLogNormal.source = sourceRandomLogNormal; + + return randomLogNormal; + })(defaultSource); + + var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + return function () { + for (var sum = 0, i = 0; i < n; ++i) sum += source(); + return sum; + }; + } + + randomIrwinHall.source = sourceRandomIrwinHall; + + return randomIrwinHall; + })(defaultSource); + + var bates = (function sourceRandomBates(source) { + function randomBates(n) { + var randomIrwinHall = irwinHall.source(source)(n); + return function () { + return randomIrwinHall() / n; + }; + } + + randomBates.source = sourceRandomBates; + + return randomBates; + })(defaultSource); + + var exponential = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function () { + return -Math.log(1 - source()) / lambda; + }; + } + + randomExponential.source = sourceRandomExponential; + + return randomExponential; + })(defaultSource); + + exports.randomUniform = uniform; + exports.randomNormal = normal; + exports.randomLogNormal = logNormal; + exports.randomBates = bates; + exports.randomIrwinHall = irwinHall; + exports.randomExponential = exponential; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 29: [function (require, module, exports) { +// https://d3js.org/d3-scale-chromatic/ v1.5.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-interpolate'), require('d3-color')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-interpolate', 'd3-color'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3)); + }(this, function (exports, d3Interpolate, d3Color) { + 'use strict'; + + function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; + } + + var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + + var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + + var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + + var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + + var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + + var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + + var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + + var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + + var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + + var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + + function ramp(scheme) { + return d3Interpolate.interpolateRgbBasis(scheme[scheme.length - 1]); + } + + var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" + ).map(colors); + + var BrBG = ramp(scheme); + + var scheme$1 = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" + ).map(colors); + + var PRGn = ramp(scheme$1); + + var scheme$2 = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" + ).map(colors); + + var PiYG = ramp(scheme$2); + + var scheme$3 = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" + ).map(colors); + + var PuOr = ramp(scheme$3); + + var scheme$4 = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" + ).map(colors); + + var RdBu = ramp(scheme$4); + + var scheme$5 = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" + ).map(colors); + + var RdGy = ramp(scheme$5); + + var scheme$6 = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" + ).map(colors); + + var RdYlBu = ramp(scheme$6); + + var scheme$7 = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" + ).map(colors); + + var RdYlGn = ramp(scheme$7); + + var scheme$8 = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" + ).map(colors); + + var Spectral = ramp(scheme$8); + + var scheme$9 = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" + ).map(colors); + + var BuGn = ramp(scheme$9); + + var scheme$a = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" + ).map(colors); + + var BuPu = ramp(scheme$a); + + var scheme$b = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" + ).map(colors); + + var GnBu = ramp(scheme$b); + + var scheme$c = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" + ).map(colors); + + var OrRd = ramp(scheme$c); + + var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" + ).map(colors); + + var PuBuGn = ramp(scheme$d); + + var scheme$e = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" + ).map(colors); + + var PuBu = ramp(scheme$e); + + var scheme$f = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" + ).map(colors); + + var PuRd = ramp(scheme$f); + + var scheme$g = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" + ).map(colors); + + var RdPu = ramp(scheme$g); + + var scheme$h = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" + ).map(colors); + + var YlGnBu = ramp(scheme$h); + + var scheme$i = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" + ).map(colors); + + var YlGn = ramp(scheme$i); + + var scheme$j = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" + ).map(colors); + + var YlOrBr = ramp(scheme$j); + + var scheme$k = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" + ).map(colors); + + var YlOrRd = ramp(scheme$k); + + var scheme$l = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" + ).map(colors); + + var Blues = ramp(scheme$l); + + var scheme$m = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" + ).map(colors); + + var Greens = ramp(scheme$m); + + var scheme$n = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" + ).map(colors); + + var Greys = ramp(scheme$n); + + var scheme$o = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" + ).map(colors); + + var Purples = ramp(scheme$o); + + var scheme$p = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" + ).map(colors); + + var Reds = ramp(scheme$p); + + var scheme$q = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" + ).map(colors); + + var Oranges = ramp(scheme$q); + + function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; + } + + var cubehelix = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); + + var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + + var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); + + var c = d3Color.cubehelix(); + + function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; + } + + var c$1 = d3Color.rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; + + function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; + } + + function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; + } + + function ramp$1(range) { + var n = range.length; + return function (t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; + } + + var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + + var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + + var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + + var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + + exports.interpolateBlues = Blues; + exports.interpolateBrBG = BrBG; + exports.interpolateBuGn = BuGn; + exports.interpolateBuPu = BuPu; + exports.interpolateCividis = cividis; + exports.interpolateCool = cool; + exports.interpolateCubehelixDefault = cubehelix; + exports.interpolateGnBu = GnBu; + exports.interpolateGreens = Greens; + exports.interpolateGreys = Greys; + exports.interpolateInferno = inferno; + exports.interpolateMagma = magma; + exports.interpolateOrRd = OrRd; + exports.interpolateOranges = Oranges; + exports.interpolatePRGn = PRGn; + exports.interpolatePiYG = PiYG; + exports.interpolatePlasma = plasma; + exports.interpolatePuBu = PuBu; + exports.interpolatePuBuGn = PuBuGn; + exports.interpolatePuOr = PuOr; + exports.interpolatePuRd = PuRd; + exports.interpolatePurples = Purples; + exports.interpolateRainbow = rainbow; + exports.interpolateRdBu = RdBu; + exports.interpolateRdGy = RdGy; + exports.interpolateRdPu = RdPu; + exports.interpolateRdYlBu = RdYlBu; + exports.interpolateRdYlGn = RdYlGn; + exports.interpolateReds = Reds; + exports.interpolateSinebow = sinebow; + exports.interpolateSpectral = Spectral; + exports.interpolateTurbo = turbo; + exports.interpolateViridis = viridis; + exports.interpolateWarm = warm; + exports.interpolateYlGn = YlGn; + exports.interpolateYlGnBu = YlGnBu; + exports.interpolateYlOrBr = YlOrBr; + exports.interpolateYlOrRd = YlOrRd; + exports.schemeAccent = Accent; + exports.schemeBlues = scheme$l; + exports.schemeBrBG = scheme; + exports.schemeBuGn = scheme$9; + exports.schemeBuPu = scheme$a; + exports.schemeCategory10 = category10; + exports.schemeDark2 = Dark2; + exports.schemeGnBu = scheme$b; + exports.schemeGreens = scheme$m; + exports.schemeGreys = scheme$n; + exports.schemeOrRd = scheme$c; + exports.schemeOranges = scheme$q; + exports.schemePRGn = scheme$1; + exports.schemePaired = Paired; + exports.schemePastel1 = Pastel1; + exports.schemePastel2 = Pastel2; + exports.schemePiYG = scheme$2; + exports.schemePuBu = scheme$e; + exports.schemePuBuGn = scheme$d; + exports.schemePuOr = scheme$3; + exports.schemePuRd = scheme$f; + exports.schemePurples = scheme$o; + exports.schemeRdBu = scheme$4; + exports.schemeRdGy = scheme$5; + exports.schemeRdPu = scheme$g; + exports.schemeRdYlBu = scheme$6; + exports.schemeRdYlGn = scheme$7; + exports.schemeReds = scheme$p; + exports.schemeSet1 = Set1; + exports.schemeSet2 = Set2; + exports.schemeSet3 = Set3; + exports.schemeSpectral = scheme$8; + exports.schemeTableau10 = Tableau10; + exports.schemeYlGn = scheme$i; + exports.schemeYlGnBu = scheme$h; + exports.schemeYlOrBr = scheme$j; + exports.schemeYlOrRd = scheme$k; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13, "d3-interpolate": 24}], + 30: [function (require, module, exports) { +// https://d3js.org/d3-scale/ v2.2.2 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-collection'), require('d3-array'), require('d3-interpolate'), require('d3-format'), require('d3-time'), require('d3-time-format')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-collection', 'd3-array', 'd3-interpolate', 'd3-format', 'd3-time', 'd3-time-format'], factory) : + (factory((global.d3 = global.d3 || {}), global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, (function (exports, d3Collection, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) { + 'use strict'; + + function initRange(domain, range) { + switch (arguments.length) { + case 0: + break; + case 1: + this.range(domain); + break; + default: + this.range(range).domain(domain); + break; + } + return this; + } + + function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: + break; + case 1: + this.interpolator(domain); + break; + default: + this.interpolator(interpolator).domain(domain); + break; + } + return this; + } + + var array = Array.prototype; + + var map = array.map; + var slice = array.slice; + + var implicit = {name: "implicit"}; + + function ordinal() { + var index = d3Collection.map(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = [], index = d3Collection.map(); + var i = -1, n = _.length, d, key; + while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d)); + return scale; + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), scale) : range.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return ordinal(domain, range).unknown(unknown); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + range = [0, 1], + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; + + delete scale.unknown; + + function rescale() { + var n = domain().length, + reverse = range[1] < range[0], + start = range[reverse - 0], + stop = range[1 - reverse]; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = d3Array.range(n).map(function (i) { + return start + step * i; + }); + return ordinalRange(reverse ? values.reverse() : values); + } + + scale.domain = function (_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.range = function (_) { + return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice(); + }; + + scale.rangeRound = function (_) { + return range = [+_[0], +_[1]], round = true, rescale(); + }; + + scale.bandwidth = function () { + return bandwidth; + }; + + scale.step = function () { + return step; + }; + + scale.round = function (_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; + + scale.padding = function (_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; + + scale.paddingInner = function (_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; + + scale.paddingOuter = function (_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; + + scale.align = function (_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; + + scale.copy = function () { + return band(domain(), range) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; + + return initRange.apply(rescale(), arguments); + } + + function pointish(scale) { + var copy = scale.copy; + + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; + + scale.copy = function () { + return pointish(copy()); + }; + + return scale; + } + + function point() { + return pointish(band.apply(null, arguments).paddingInner(1)); + } + + function constant(x) { + return function () { + return x; + }; + } + + function number(x) { + return +x; + } + + var unit = [0, 1]; + + function identity(x) { + return x; + } + + function normalize(a, b) { + return (b -= (a = +a)) + ? function (x) { + return (x - a) / b; + } + : constant(isNaN(b) ? NaN : 0.5); + } + + function clamper(domain) { + var a = domain[0], b = domain[domain.length - 1], t; + if (a > b) t = a, a = b, b = t; + return function (x) { + return Math.max(a, Math.min(b, x)); + }; + } + +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. + function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function (x) { + return r0(d0(x)); + }; + } + + function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; + + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } + + return function (x) { + var i = d3Array.bisect(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; + } + + function copy(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); + } + + function transformer() { + var domain = unit, + range = unit, + interpolate = d3Interpolate.interpolate, + transform, + untransform, + unknown, + clamp = identity, + piecewise, + output, + input; + + function rescale() { + piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap; + output = input = null; + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } + + scale.invert = function (y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y))); + }; + + scale.domain = function (_) { + return arguments.length ? (domain = map.call(_, number), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); + }; + + scale.rangeRound = function (_) { + return range = slice.call(_), interpolate = d3Interpolate.interpolateRound, rescale(); + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity; + }; + + scale.interpolate = function (_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t, u) { + transform = t, untransform = u; + return rescale(); + }; + } + + function continuous(transform, untransform) { + return transformer()(transform, untransform); + } + + function tickFormat(start, stop, count, specifier) { + var step = d3Array.tickStep(start, stop, count), + precision; + specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; + return d3Format.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return d3Format.format(specifier); + } + + function linearish(scale) { + var domain = scale.domain; + + scale.ticks = function (count) { + var d = domain(); + return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; + + scale.tickFormat = function (count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; + + scale.nice = function (count) { + if (count == null) count = 10; + + var d = domain(), + i0 = 0, + i1 = d.length - 1, + start = d[i0], + stop = d[i1], + step; + + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + step = d3Array.tickIncrement(start, stop, count); + + if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + step = d3Array.tickIncrement(start, stop, count); + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + step = d3Array.tickIncrement(start, stop, count); + } + + if (step > 0) { + d[i0] = Math.floor(start / step) * step; + d[i1] = Math.ceil(stop / step) * step; + domain(d); + } else if (step < 0) { + d[i0] = Math.ceil(start * step) / step; + d[i1] = Math.floor(stop * step) / step; + domain(d); + } + + return scale; + }; + + return scale; + } + + function linear() { + var scale = continuous(identity, identity); + + scale.copy = function () { + return copy(scale, linear()); + }; + + initRange.apply(scale, arguments); + + return linearish(scale); + } + + function identity$1(domain) { + var unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; + + scale.domain = scale.range = function (_) { + return arguments.length ? (domain = map.call(_, number), scale) : domain.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return identity$1(domain).unknown(unknown); + }; + + domain = arguments.length ? map.call(domain, number) : [0, 1]; + + return linearish(scale); + } + + function nice(domain, interval) { + domain = domain.slice(); + + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; + + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } + + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; + } + + function transformLog(x) { + return Math.log(x); + } + + function transformExp(x) { + return Math.exp(x); + } + + function transformLogn(x) { + return -Math.log(-x); + } + + function transformExpn(x) { + return -Math.exp(-x); + } + + function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; + } + + function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function (x) { + return Math.pow(base, x); + }; + } + + function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function (x) { + return Math.log(x) / base; + }); + } + + function reflect(f) { + return function (x) { + return -f(-x); + }; + } + + function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; + + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } + + scale.base = function (_) { + return arguments.length ? (base = +_, rescale()) : base; + }; + + scale.domain = function (_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; + + scale.ticks = function (count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.round(i) - 1, j = Math.round(j) + 1; + if (u > 0) for (; i < j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i < j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + } else { + z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); + } + + return r ? z.reverse() : z; + }; + + scale.tickFormat = function (count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = d3Format.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function (d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; + + scale.nice = function () { + return domain(nice(domain(), { + floor: function (x) { + return pows(Math.floor(logs(x))); + }, + ceil: function (x) { + return pows(Math.ceil(logs(x))); + } + })); + }; + + return scale; + } + + function log() { + var scale = loggish(transformer()).domain([1, 10]); + + scale.copy = function () { + return copy(scale, log()).base(scale.base()); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function transformSymlog(c) { + return function (x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; + } + + function transformSymexp(c) { + return function (x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; + } + + function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + + scale.constant = function (_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; + + return linearish(scale); + } + + function symlog() { + var scale = symlogish(transformer()); + + scale.copy = function () { + return copy(scale, symlog()).constant(scale.constant()); + }; + + return initRange.apply(scale, arguments); + } + + function transformPow(exponent) { + return function (x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); + }; + } + + function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); + } + + function transformSquare(x) { + return x < 0 ? -x * x : x * x; + } + + function powish(transform) { + var scale = transform(identity, identity), + exponent = 1; + + function rescale() { + return exponent === 1 ? transform(identity, identity) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } + + scale.exponent = function (_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; + + return linearish(scale); + } + + function pow() { + var scale = powish(transformer()); + + scale.copy = function () { + return copy(scale, pow()).exponent(scale.exponent()); + }; + + initRange.apply(scale, arguments); + + return scale; + } + + function sqrt() { + return pow.apply(null, arguments).exponent(0.5); + } + + function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = d3Array.quantile(domain, i / n); + return scale; + } + + function scale(x) { + return isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)]; + } + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; + }; + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return rescale(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), rescale()) : range.slice(); + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.quantiles = function () { + return thresholds.slice(); + }; + + scale.copy = function () { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); + } + + function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; + + function scale(x) { + return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; + } + + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } + + scale.domain = function (_) { + return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1]; + }; + + scale.range = function (_) { + return arguments.length ? (n = (range = slice.call(_)).length - 1, rescale()) : range.slice(); + }; + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : scale; + }; + + scale.thresholds = function () { + return domain.slice(); + }; + + scale.copy = function () { + return quantize() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(linearish(scale), arguments); + } + + function threshold() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; + + function scale(x) { + return x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; + } + + scale.domain = function (_) { + return arguments.length ? (domain = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); + }; + + scale.range = function (_) { + return arguments.length ? (range = slice.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); + }; + + scale.invertExtent = function (y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + scale.copy = function () { + return threshold() + .domain(domain) + .range(range) + .unknown(unknown); + }; + + return initRange.apply(scale, arguments); + } + + var durationSecond = 1000, + durationMinute = durationSecond * 60, + durationHour = durationMinute * 60, + durationDay = durationHour * 24, + durationWeek = durationDay * 7, + durationMonth = durationDay * 30, + durationYear = durationDay * 365; + + function date(t) { + return new Date(t); + } + + function number$1(t) { + return t instanceof Date ? +t : +new Date(+t); + } + + function calendar(year, month, week, day, hour, minute, second, millisecond, format) { + var scale = continuous(identity, identity), + invert = scale.invert, + domain = scale.domain; + + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); + + var tickIntervals = [ + [second, 1, durationSecond], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [hour, 1, durationHour], + [hour, 3, 3 * durationHour], + [hour, 6, 6 * durationHour], + [hour, 12, 12 * durationHour], + [day, 1, durationDay], + [day, 2, 2 * durationDay], + [week, 1, durationWeek], + [month, 1, durationMonth], + [month, 3, 3 * durationMonth], + [year, 1, durationYear] + ]; + + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); + } + + function tickInterval(interval, start, stop, step) { + if (interval == null) interval = 10; + + // If a desired tick count is specified, pick a reasonable tick interval + // based on the extent of the domain and a rough estimate of tick size. + // Otherwise, assume interval is already a time interval and use it. + if (typeof interval === "number") { + var target = Math.abs(stop - start) / interval, + i = d3Array.bisector(function (i) { + return i[2]; + }).right(tickIntervals, target); + if (i === tickIntervals.length) { + step = d3Array.tickStep(start / durationYear, stop / durationYear, interval); + interval = year; + } else if (i) { + i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + step = i[1]; + interval = i[0]; + } else { + step = Math.max(d3Array.tickStep(start, stop, interval), 1); + interval = millisecond; + } + } + + return step == null ? interval : interval.every(step); + } + + scale.invert = function (y) { + return new Date(invert(y)); + }; + + scale.domain = function (_) { + return arguments.length ? domain(map.call(_, number$1)) : domain().map(date); + }; + + scale.ticks = function (interval, step) { + var d = domain(), + t0 = d[0], + t1 = d[d.length - 1], + r = t1 < t0, + t; + if (r) t = t0, t0 = t1, t1 = t; + t = tickInterval(interval, t0, t1, step); + t = t ? t.range(t0, t1 + 1) : []; // inclusive stop + return r ? t.reverse() : t; + }; + + scale.tickFormat = function (count, specifier) { + return specifier == null ? tickFormat : format(specifier); + }; + + scale.nice = function (interval, step) { + var d = domain(); + return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) + ? domain(nice(d, interval)) + : scale; + }; + + scale.copy = function () { + return copy(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format)); + }; + + return scale; + } + + function time() { + return initRange.apply(calendar(d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3Time.timeMillisecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); + } + + function utcTime() { + return initRange.apply(calendar(d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3Time.utcMillisecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); + } + + function transformer$1() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function (_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; + }; + } + + function copy$1(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); + } + + function sequential() { + var scale = linearish(transformer$1()(identity)); + + scale.copy = function () { + return copy$1(scale, sequential()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialLog() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function () { + return copy$1(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialSymlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function () { + return copy$1(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialPow() { + var scale = powish(transformer$1()); + + scale.copy = function () { + return copy$1(scale, sequentialPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); + } + + function sequentialQuantile() { + var domain = [], + interpolator = identity; + + function scale(x) { + if (!isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x) - 1) / (domain.length - 1)); + } + + scale.domain = function (_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return scale; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.copy = function () { + return sequentialQuantile(interpolator).domain(domain); + }; + + return initInterpolator.apply(scale, arguments); + } + + function transformer$2() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity, + transform, + clamp = false, + unknown; + + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function (_) { + return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2]; + }; + + scale.clamp = function (_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; + + scale.interpolator = function (_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; + + scale.unknown = function (_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; + + return function (t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1); + return scale; + }; + } + + function diverging() { + var scale = linearish(transformer$2()(identity)); + + scale.copy = function () { + return copy$1(scale, diverging()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingLog() { + var scale = loggish(transformer$2()).domain([0.1, 1, 10]); + + scale.copy = function () { + return copy$1(scale, divergingLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingSymlog() { + var scale = symlogish(transformer$2()); + + scale.copy = function () { + return copy$1(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingPow() { + var scale = powish(transformer$2()); + + scale.copy = function () { + return copy$1(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); + } + + function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); + } + + exports.scaleBand = band; + exports.scalePoint = point; + exports.scaleIdentity = identity$1; + exports.scaleLinear = linear; + exports.scaleLog = log; + exports.scaleSymlog = symlog; + exports.scaleOrdinal = ordinal; + exports.scaleImplicit = implicit; + exports.scalePow = pow; + exports.scaleSqrt = sqrt; + exports.scaleQuantile = quantile; + exports.scaleQuantize = quantize; + exports.scaleThreshold = threshold; + exports.scaleTime = time; + exports.scaleUtc = utcTime; + exports.scaleSequential = sequential; + exports.scaleSequentialLog = sequentialLog; + exports.scaleSequentialPow = sequentialPow; + exports.scaleSequentialSqrt = sequentialSqrt; + exports.scaleSequentialSymlog = sequentialSymlog; + exports.scaleSequentialQuantile = sequentialQuantile; + exports.scaleDiverging = diverging; + exports.scaleDivergingLog = divergingLog; + exports.scaleDivergingPow = divergingPow; + exports.scaleDivergingSqrt = divergingSqrt; + exports.scaleDivergingSymlog = divergingSymlog; + exports.tickFormat = tickFormat; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, { + "d3-array": 8, + "d3-collection": 12, + "d3-format": 21, + "d3-interpolate": 24, + "d3-time": 34, + "d3-time-format": 33 + }], + 31: [function (require, module, exports) { +// https://d3js.org/d3-selection/ v1.4.1 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var xhtml = "http://www.w3.org/1999/xhtml"; + + var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + + function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; + } + + function creatorInherit(name) { + return function () { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; + } + + function creatorFixed(fullname) { + return function () { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; + } + + function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); + } + + function none() { + } + + function selector(selector) { + return selector == null ? none : function () { + return this.querySelector(selector); + }; + } + + function selection_select(select) { + if (typeof select !== "function") select = selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + + return new Selection(subgroups, this._parents); + } + + function empty() { + return []; + } + + function selectorAll(selector) { + return selector == null ? empty : function () { + return this.querySelectorAll(selector); + }; + } + + function selection_selectAll(select) { + if (typeof select !== "function") select = selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + + return new Selection(subgroups, parents); + } + + function matcher(selector) { + return function () { + return this.matches(selector); + }; + } + + function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); + } + + function sparse(update) { + return new Array(update.length); + } + + function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); + } + + function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; + } + + EnterNode.prototype = { + constructor: EnterNode, + appendChild: function (child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function (child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function (selector) { + return this._parent.querySelector(selector); + }, + querySelectorAll: function (selector) { + return this._parent.querySelectorAll(selector); + } + }; + + function constant(x) { + return function () { + return x; + }; + } + + var keyPrefix = "$"; // Protect against keys like “__proto__”. + + function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; + + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } + } + + function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = {}, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; + + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group); + if (keyValue in nodeByKeyValue) { + exit[i] = node; + } else { + nodeByKeyValue[keyValue] = node; + } + } + } + + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = keyPrefix + key.call(parent, data[i], i, data); + if (node = nodeByKeyValue[keyValue]) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue[keyValue] = null; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) { + exit[i] = node; + } + } + } + + function selection_data(value, key) { + if (!value) { + data = new Array(this.size()), j = -1; + this.each(function (d) { + data[++j] = d; + }); + return data; + } + + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; + + if (typeof value !== "function") value = constant(value); + + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = value.call(parent, parent && parent.__data__, j, parents), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); + + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength) ; + previous._next = next || null; + } + } + } + + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; + } + + function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); + } + + function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; + } + + function selection_merge(selection) { + + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Selection(merges, this._parents); + } + + function selection_order() { + + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + + return this; + } + + function selection_sort(compare) { + if (!compare) compare = ascending; + + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } + + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + + return new Selection(sortgroups, this._parents).order(); + } + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + } + + function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; + } + + function selection_nodes() { + var nodes = new Array(this.size()), i = -1; + this.each(function () { + nodes[++i] = this; + }); + return nodes; + } + + function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; + } + + function selection_size() { + var size = 0; + this.each(function () { + ++size; + }); + return size; + } + + function selection_empty() { + return !this.node(); + } + + function selection_each(callback) { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + + return this; + } + + function attrRemove(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, value) { + return function () { + this.setAttribute(name, value); + }; + } + + function attrConstantNS(fullname, value) { + return function () { + this.setAttributeNS(fullname.space, fullname.local, value); + }; + } + + function attrFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; + } + + function attrFunctionNS(fullname, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; + } + + function selection_attr(name, value) { + var fullname = namespace(name); + + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); + } + + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); + } + + function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document + } + + function styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, value, priority) { + return function () { + this.style.setProperty(name, value, priority); + }; + } + + function styleFunction(name, value, priority) { + return function () { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; + } + + function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); + } + + function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); + } + + function propertyRemove(name) { + return function () { + delete this[name]; + }; + } + + function propertyConstant(name, value) { + return function () { + this[name] = value; + }; + } + + function propertyFunction(name, value) { + return function () { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; + } + + function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; + } + + function classArray(string) { + return string.trim().split(/^|\s+/); + } + + function classList(node) { + return node.classList || new ClassList(node); + } + + function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); + } + + ClassList.prototype = { + add: function (name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function (name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function (name) { + return this._names.indexOf(name) >= 0; + } + }; + + function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); + } + + function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); + } + + function classedTrue(names) { + return function () { + classedAdd(this, names); + }; + } + + function classedFalse(names) { + return function () { + classedRemove(this, names); + }; + } + + function classedFunction(names, value) { + return function () { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; + } + + function selection_classed(name, value) { + var names = classArray(name + ""); + + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); + } + + function textRemove() { + this.textContent = ""; + } + + function textConstant(value) { + return function () { + this.textContent = value; + }; + } + + function textFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; + } + + function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; + } + + function htmlRemove() { + this.innerHTML = ""; + } + + function htmlConstant(value) { + return function () { + this.innerHTML = value; + }; + } + + function htmlFunction(value) { + return function () { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; + } + + function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; + } + + function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); + } + + function selection_raise() { + return this.each(raise); + } + + function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); + } + + function selection_lower() { + return this.each(lower); + } + + function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function () { + return this.appendChild(create.apply(this, arguments)); + }); + } + + function constantNull() { + return null; + } + + function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function () { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); + } + + function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + } + + function selection_remove() { + return this.each(remove); + } + + function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; + } + + function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); + } + + function selection_datum(value) { + return arguments.length + ? this.property("__data__", value) + : this.node().__data__; + } + + var filterEvents = {}; + + exports.event = null; + + if (typeof document !== "undefined") { + var element = document.documentElement; + if (!("onmouseenter" in element)) { + filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"}; + } + } + + function filterContextListener(listener, index, group) { + listener = contextListener(listener, index, group); + return function (event) { + var related = event.relatedTarget; + if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) { + listener.call(this, event); + } + }; + } + + function contextListener(listener, index, group) { + return function (event1) { + var event0 = exports.event; // Events can be reentrant (e.g., focus). + exports.event = event1; + try { + listener.call(this, this.__data__, index, group); + } finally { + exports.event = event0; + } + }; + } + + function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function (t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); + } + + function onRemove(typename) { + return function () { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; + } + + function onAdd(typename, value, capture) { + var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener; + return function (d, i, group) { + var on = this.__on, o, listener = wrap(value, i, group); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.capture); + this.addEventListener(o.type, o.listener = listener, o.capture = capture); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, capture); + o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture}; + if (!on) this.__on = [o]; + else on.push(o); + }; + } + + function selection_on(typename, value, capture) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; + + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + + on = value ? onAdd : onRemove; + if (capture == null) capture = false; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture)); + return this; + } + + function customEvent(event1, listener, that, args) { + var event0 = exports.event; + event1.sourceEvent = exports.event; + exports.event = event1; + try { + return listener.apply(that, args); + } finally { + exports.event = event0; + } + } + + function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; + + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); + } + + node.dispatchEvent(event); + } + + function dispatchConstant(type, params) { + return function () { + return dispatchEvent(this, type, params); + }; + } + + function dispatchFunction(type, params) { + return function () { + return dispatchEvent(this, type, params.apply(this, arguments)); + }; + } + + function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); + } + + var root = [null]; + + function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; + } + + function selection() { + return new Selection([[document.documentElement]], root); + } + + Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch + }; + + function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); + } + + function create(name) { + return select(creator(name).call(document.documentElement)); + } + + var nextId = 0; + + function local() { + return new Local; + } + + function Local() { + this._ = "@" + (++nextId).toString(36); + } + + Local.prototype = local.prototype = { + constructor: Local, + get: function (node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function (node, value) { + return node[this._] = value; + }, + remove: function (node) { + return this._ in node && delete node[this._]; + }, + toString: function () { + return this._; + } + }; + + function sourceEvent() { + var current = exports.event, source; + while (source = current.sourceEvent) current = source; + return current; + } + + function point(node, event) { + var svg = node.ownerSVGElement || node; + + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + + function mouse(node) { + var event = sourceEvent(); + if (event.changedTouches) event = event.changedTouches[0]; + return point(node, event); + } + + function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : selector], root); + } + + function touch(node, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches; + + for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return point(node, touch); + } + } + + return null; + } + + function touches(node, touches) { + if (touches == null) touches = sourceEvent().touches; + + for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) { + points[i] = point(node, touches[i]); + } + + return points; + } + + exports.clientPoint = point; + exports.create = create; + exports.creator = creator; + exports.customEvent = customEvent; + exports.local = local; + exports.matcher = matcher; + exports.mouse = mouse; + exports.namespace = namespace; + exports.namespaces = namespaces; + exports.select = select; + exports.selectAll = selectAll; + exports.selection = selection; + exports.selector = selector; + exports.selectorAll = selectorAll; + exports.style = styleValue; + exports.touch = touch; + exports.touches = touches; + exports.window = defaultView; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 32: [function (require, module, exports) { +// https://d3js.org/d3-shape/ v1.3.7 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-path')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-path'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Path) { + 'use strict'; + + function constant(x) { + return function constant() { + return x; + }; + } + + var abs = Math.abs; + var atan2 = Math.atan2; + var cos = Math.cos; + var max = Math.max; + var min = Math.min; + var sin = Math.sin; + var sqrt = Math.sqrt; + + var epsilon = 1e-12; + var pi = Math.PI; + var halfPi = pi / 2; + var tau = 2 * pi; + + function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); + } + + function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); + } + + function arcInnerRadius(d) { + return d.innerRadius; + } + + function arcOuterRadius(d) { + return d.outerRadius; + } + + function arcStartAngle(d) { + return d.startAngle; + } + + function arcEndAngle(d) { + return d.endAngle; + } + + function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! + } + + function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; + } + +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html + function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; + + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; + } + + function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; + + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi, + a1 = endAngle.apply(this, arguments) - halfPi, + da = abs(a1 - a0), + cw = a1 > a0; + + if (!context) context = buffer = d3Path.path(); + + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; + + // Is it a point? + if (!(r1 > epsilon)) context.moveTo(0, 0); + + // Or is it a circle or annulus? + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } + } + + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } + + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); + + // Apply rounded corners? + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), + oc; + + // Restrict the corner radius according to the sector angle. + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } + } + + // Is the sector collapsed to a line? + if (!(da1 > epsilon)) context.moveTo(x01, y01); + + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); + + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); + + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); + + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } + + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); + } + + context.closePath(); + + if (buffer) return context = null, buffer + "" || null; + } + + arc.centroid = function () { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; + }; + + arc.innerRadius = function (_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; + }; + + arc.outerRadius = function (_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; + }; + + arc.cornerRadius = function (_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; + }; + + arc.padRadius = function (_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; + }; + + arc.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; + }; + + arc.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; + }; + + arc.padAngle = function (_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; + }; + + arc.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; + } + + function Linear(context) { + this._context = context; + } + + Linear.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; // proceed + default: + this._context.lineTo(x, y); + break; + } + } + }; + + function curveLinear(context) { + return new Linear(context); + } + + function x(p) { + return p[0]; + } + + function y(p) { + return p[1]; + } + + function line() { + var x$1 = x, + y$1 = y, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + function line(data) { + var i, + n = data.length, + d, + defined0 = false, + buffer; + + if (context == null) output = curve(buffer = d3Path.path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); + } + if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data)); + } + + if (buffer) return output = null, buffer + "" || null; + } + + line.x = function (_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), line) : x$1; + }; + + line.y = function (_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), line) : y$1; + }; + + line.defined = function (_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), line) : defined; + }; + + line.curve = function (_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + }; + + line.context = function (_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; + + return line; + } + + function area() { + var x0 = x, + x1 = null, + y0 = constant(0), + y1 = y, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; + + function area(data) { + var i, + j, + k, + n = data.length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); + + if (context == null) output = curve(buffer = d3Path.path()); + + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } + } + + if (buffer) return output = null, buffer + "" || null; + } + + function arealine() { + return line().defined(defined).curve(curve).context(context); + } + + area.x = function (_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), x1 = null, area) : x0; + }; + + area.x0 = function (_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), area) : x0; + }; + + area.x1 = function (_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : x1; + }; + + area.y = function (_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), y1 = null, area) : y0; + }; + + area.y0 = function (_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), area) : y0; + }; + + area.y1 = function (_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : y1; + }; + + area.lineX0 = + area.lineY0 = function () { + return arealine().x(x0).y(y0); + }; + + area.lineY1 = function () { + return arealine().x(x0).y(y1); + }; + + area.lineX1 = function () { + return arealine().x(x1).y(y0); + }; + + area.defined = function (_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), area) : defined; + }; + + area.curve = function (_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; + + area.context = function (_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; + + return area; + } + + function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + } + + function identity(d) { + return d; + } + + function pie() { + var value = identity, + sortValues = descending, + sort = null, + startAngle = constant(0), + endAngle = constant(tau), + padAngle = constant(0); + + function pie(data) { + var i, + n = data.length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; + + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } + + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function (i, j) { + return sortValues(arcs[i], arcs[j]); + }); + else if (sort != null) index.sort(function (i, j) { + return sort(data[i], data[j]); + }); + + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } + + return arcs; + } + + pie.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), pie) : value; + }; + + pie.sortValues = function (_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + }; + + pie.sort = function (_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; + }; + + pie.startAngle = function (_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), pie) : startAngle; + }; + + pie.endAngle = function (_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), pie) : endAngle; + }; + + pie.padAngle = function (_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), pie) : padAngle; + }; + + return pie; + } + + var curveRadialLinear = curveRadial(curveLinear); + + function Radial(curve) { + this._curve = curve; + } + + Radial.prototype = { + areaStart: function () { + this._curve.areaStart(); + }, + areaEnd: function () { + this._curve.areaEnd(); + }, + lineStart: function () { + this._curve.lineStart(); + }, + lineEnd: function () { + this._curve.lineEnd(); + }, + point: function (a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + } + }; + + function curveRadial(curve) { + + function radial(context) { + return new Radial(curve(context)); + } + + radial._curve = curve; + + return radial; + } + + function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function (_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return l; + } + + function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); + } + + function areaRadial() { + var a = area().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function () { + return lineRadial(x0()); + }, delete a.lineX0; + a.lineEndAngle = function () { + return lineRadial(x1()); + }, delete a.lineX1; + a.lineInnerRadius = function () { + return lineRadial(y0()); + }, delete a.lineY0; + a.lineOuterRadius = function () { + return lineRadial(y1()); + }, delete a.lineY1; + + a.curve = function (_) { + return arguments.length ? c(curveRadial(_)) : c()._curve; + }; + + return a; + } + + function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; + } + + var slice = Array.prototype.slice; + + function linkSource(d) { + return d.source; + } + + function linkTarget(d) { + return d.target; + } + + function link(curve) { + var source = linkSource, + target = linkTarget, + x$1 = x, + y$1 = y, + context = null; + + function link() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), + t = target.apply(this, argv); + if (!context) context = buffer = d3Path.path(); + curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; + } + + link.source = function (_) { + return arguments.length ? (source = _, link) : source; + }; + + link.target = function (_) { + return arguments.length ? (target = _, link) : target; + }; + + link.x = function (_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), link) : x$1; + }; + + link.y = function (_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), link) : y$1; + }; + + link.context = function (_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; + + return link; + } + + function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); + } + + function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); + } + + function curveRadial$1(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); + } + + function linkHorizontal() { + return link(curveHorizontal); + } + + function linkVertical() { + return link(curveVertical); + } + + function linkRadial() { + var l = link(curveRadial$1); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; + } + + var circle = { + draw: function (context, size) { + var r = Math.sqrt(size / pi); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau); + } + }; + + var cross = { + draw: function (context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } + }; + + var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + + var diamond = { + draw: function (context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } + }; + + var ka = 0.89081309152928522810, + kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), + kx = Math.sin(tau / 10) * kr, + ky = -Math.cos(tau / 10) * kr; + + var star = { + draw: function (context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); + } + context.closePath(); + } + }; + + var square = { + draw: function (context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } + }; + + var sqrt3 = Math.sqrt(3); + + var triangle = { + draw: function (context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); + } + }; + + var c = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; + + var wye = { + draw: function (context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); + } + }; + + var symbols = [ + circle, + cross, + diamond, + square, + star, + triangle, + wye + ]; + + function symbol() { + var type = constant(circle), + size = constant(64), + context = null; + + function symbol() { + var buffer; + if (!context) context = buffer = d3Path.path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } + + symbol.type = function (_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant(_), symbol) : type; + }; + + symbol.size = function (_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant(+_), symbol) : size; + }; + + symbol.context = function (_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; + }; + + return symbol; + } + + function noop() { + } + + function point(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); + } + + function Basis(context) { + this._context = context; + } + + Basis.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 3: + point(this, this._x1, this._y1); // proceed + case 2: + this._context.lineTo(this._x1, this._y1); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basis(context) { + return new Basis(context); + } + + function BasisClosed(context) { + this._context = context; + } + + BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._x2 = x, this._y2 = y; + break; + case 1: + this._point = 2; + this._x3 = x, this._y3 = y; + break; + case 2: + this._point = 3; + this._x4 = x, this._y4 = y; + this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); + break; + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basisClosed(context) { + return new BasisClosed(context); + } + + function BasisOpen(context) { + this._context = context; + } + + BasisOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; + this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); + break; + case 3: + this._point = 4; // proceed + default: + point(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } + }; + + function basisOpen(context) { + return new BasisOpen(context); + } + + function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; + } + + Bundle.prototype = { + lineStart: function () { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function () { + var x = this._x, + y = this._y, + j = x.length - 1; + + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function (x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + + var bundle = (function custom(beta) { + + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + + bundle.beta = function (beta) { + return custom(+beta); + }; + + return bundle; + })(0.85); + + function point$1(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); + } + + function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + Cardinal.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x2, this._y2); + break; + case 3: + point$1(this, this._x1, this._y1); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + this._x1 = x, this._y1 = y; + break; + case 2: + this._point = 3; // proceed + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinal = (function custom(tension) { + + function cardinal(context) { + return new Cardinal(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._x3 = x, this._y3 = y; + break; + case 1: + this._point = 2; + this._context.moveTo(this._x4 = x, this._y4 = y); + break; + case 2: + this._point = 3; + this._x5 = x, this._y5 = y; + break; + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalClosed = (function custom(tension) { + + function cardinal(context) { + return new CardinalClosed(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; + } + + CardinalOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); + break; + case 3: + this._point = 4; // proceed + default: + point$1(this, x, y); + break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var cardinalOpen = (function custom(tension) { + + function cardinal(context) { + return new CardinalOpen(context, tension); + } + + cardinal.tension = function (tension) { + return custom(+tension); + }; + + return cardinal; + })(0); + + function point$2(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; + + if (that._l01_a > epsilon) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } + + if (that._l23_a > epsilon) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); + } + + function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRom.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x2, this._y2); + break; + case 3: + this.point(this._x2, this._y2); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; // proceed + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + this._x3 = x, this._y3 = y; + break; + case 1: + this._point = 2; + this._context.moveTo(this._x4 = x, this._y4 = y); + break; + case 2: + this._point = 3; + this._x5 = x, this._y5 = y; + break; + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; + } + + CatmullRomOpen.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function () { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: + this._point = 1; + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); + break; + case 3: + this._point = 4; // proceed + default: + point$2(this, x, y); + break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } + }; + + var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function (alpha) { + return custom(+alpha); + }; + + return catmullRom; + })(0.5); + + function LinearClosed(context) { + this._context = context; + } + + LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function () { + this._point = 0; + }, + lineEnd: function () { + if (this._point) this._context.closePath(); + }, + point: function (x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } + }; + + function linearClosed(context) { + return new LinearClosed(context); + } + + function sign(x) { + return x < 0 ? -1 : 1; + } + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. + function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; + } + +// Calculate a one-sided slope. + function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; + } + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". + function point$3(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); + } + + function MonotoneX(context) { + this._context = context; + } + + MonotoneX.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function () { + switch (this._point) { + case 2: + this._context.lineTo(this._x1, this._y1); + break; + case 3: + point$3(this, this._t0, slope2(this, this._t0)); + break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function (x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; + break; + case 2: + this._point = 3; + point$3(this, slope2(this, t1 = slope3(this, x, y)), t1); + break; + default: + point$3(this, this._t0, t1 = slope3(this, x, y)); + break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } + }; + + function MonotoneY(context) { + this._context = new ReflectContext(context); + } + + (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function (x, y) { + MonotoneX.prototype.point.call(this, y, x); + }; + + function ReflectContext(context) { + this._context = context; + } + + ReflectContext.prototype = { + moveTo: function (x, y) { + this._context.moveTo(y, x); + }, + closePath: function () { + this._context.closePath(); + }, + lineTo: function (x, y) { + this._context.lineTo(y, x); + }, + bezierCurveTo: function (x1, y1, x2, y2, x, y) { + this._context.bezierCurveTo(y1, x1, y2, x2, y, x); + } + }; + + function monotoneX(context) { + return new MonotoneX(context); + } + + function monotoneY(context) { + return new MonotoneY(context); + } + + function Natural(context) { + this._context = context; + } + + Natural.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x = []; + this._y = []; + }, + lineEnd: function () { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function (x, y) { + this._x.push(+x); + this._y.push(+y); + } + }; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. + function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; + } + + function natural(context) { + return new Natural(context); + } + + function Step(context, t) { + this._context = context; + this._t = t; + } + + Step.prototype = { + areaStart: function () { + this._line = 0; + }, + areaEnd: function () { + this._line = NaN; + }, + lineStart: function () { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function () { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function (x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: + this._point = 1; + this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); + break; + case 1: + this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } + }; + + function step(context) { + return new Step(context, 0.5); + } + + function stepBefore(context) { + return new Step(context, 0); + } + + function stepAfter(context) { + return new Step(context, 1); + } + + function none(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } + } + + function none$1(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; + } + + function stackValue(d, key) { + return d[key]; + } + + function stack() { + var keys = constant([]), + order = none$1, + offset = none, + value = stackValue; + + function stack(data) { + var kz = keys.apply(this, arguments), + i, + m = data.length, + n = kz.length, + sz = new Array(n), + oz; + + for (i = 0; i < n; ++i) { + for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) { + si[j] = sij = [0, +value(data[j], ki, j, data)]; + sij.data = data[j]; + } + si.key = ki; + } + + for (i = 0, oz = order(sz); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function (_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant(slice.call(_)), stack) : keys; + }; + + stack.value = function (_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), stack) : value; + }; + + stack.order = function (_) { + return arguments.length ? (order = _ == null ? none$1 : typeof _ === "function" ? _ : constant(slice.call(_)), stack) : order; + }; + + stack.offset = function (_) { + return arguments.length ? (offset = _ == null ? none : _, stack) : offset; + }; + + return stack; + } + + function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none(series, order); + } + + function diverging(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } + } + + function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none(series, order); + } + + function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none(series, order); + } + + function appearance(series) { + var peaks = series.map(peak); + return none$1(series).sort(function (a, b) { + return peaks[a] - peaks[b]; + }); + } + + function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; + } + + function ascending(series) { + var sums = series.map(sum); + return none$1(series).sort(function (a, b) { + return sums[a] - sums[b]; + }); + } + + function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; + } + + function descending$1(series) { + return ascending(series).reverse(); + } + + function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); + } + + function reverse(series) { + return none$1(series).reverse(); + } + + exports.arc = arc; + exports.area = area; + exports.areaRadial = areaRadial; + exports.curveBasis = basis; + exports.curveBasisClosed = basisClosed; + exports.curveBasisOpen = basisOpen; + exports.curveBundle = bundle; + exports.curveCardinal = cardinal; + exports.curveCardinalClosed = cardinalClosed; + exports.curveCardinalOpen = cardinalOpen; + exports.curveCatmullRom = catmullRom; + exports.curveCatmullRomClosed = catmullRomClosed; + exports.curveCatmullRomOpen = catmullRomOpen; + exports.curveLinear = curveLinear; + exports.curveLinearClosed = linearClosed; + exports.curveMonotoneX = monotoneX; + exports.curveMonotoneY = monotoneY; + exports.curveNatural = natural; + exports.curveStep = step; + exports.curveStepAfter = stepAfter; + exports.curveStepBefore = stepBefore; + exports.line = line; + exports.lineRadial = lineRadial$1; + exports.linkHorizontal = linkHorizontal; + exports.linkRadial = linkRadial; + exports.linkVertical = linkVertical; + exports.pie = pie; + exports.pointRadial = pointRadial; + exports.radialArea = areaRadial; + exports.radialLine = lineRadial$1; + exports.stack = stack; + exports.stackOffsetDiverging = diverging; + exports.stackOffsetExpand = expand; + exports.stackOffsetNone = none; + exports.stackOffsetSilhouette = silhouette; + exports.stackOffsetWiggle = wiggle; + exports.stackOrderAppearance = appearance; + exports.stackOrderAscending = ascending; + exports.stackOrderDescending = descending$1; + exports.stackOrderInsideOut = insideOut; + exports.stackOrderNone = none$1; + exports.stackOrderReverse = reverse; + exports.symbol = symbol; + exports.symbolCircle = circle; + exports.symbolCross = cross; + exports.symbolDiamond = diamond; + exports.symbolSquare = square; + exports.symbolStar = star; + exports.symbolTriangle = triangle; + exports.symbolWye = wye; + exports.symbols = symbols; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-path": 25}], + 33: [function (require, module, exports) { +// https://d3js.org/d3-time-format/ v2.2.3 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-time')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-time'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3)); + }(this, function (exports, d3Time) { + 'use strict'; + + function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); + } + + function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); + } + + function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; + } + + function formatLocale(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; + + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); + + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent + }; + + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent + }; + + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent + }; + + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); + + function newFormat(specifier, formats) { + return function (date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; + + if (!(date instanceof Date)) date = new Date(+date); + + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } + + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } + + function newParse(specifier, Z) { + return function (string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day; + if (i != string.length) return null; + + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); + + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; + + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; + + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; + + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); + week = day > 4 || day === 0 ? d3Time.utcMonday.ceil(week) : d3Time.utcMonday(week); + week = d3Time.utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); + week = day > 4 || day === 0 ? d3Time.timeMonday.ceil(week) : d3Time.timeMonday(week); + week = d3Time.timeDay.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; + } + + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } + + // Otherwise, all fields are in local time. + return localDate(d); + }; + } + + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; + + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + + return j; + } + + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1; + } + + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } + + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } + + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } + + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } + + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } + + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } + + function formatMonth(d) { + return locale_months[d.getMonth()]; + } + + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } + + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } + + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; + } + + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; + } + + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } + + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } + + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } + + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } + + return { + format: function (specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function () { + return specifier; + }; + return f; + }, + parse: function (specifier) { + var p = newParse(specifier += "", false); + p.toString = function () { + return specifier; + }; + return p; + }, + utcFormat: function (specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function () { + return specifier; + }; + return f; + }, + utcParse: function (specifier) { + var p = newParse(specifier += "", true); + p.toString = function () { + return specifier; + }; + return p; + } + }; + } + + var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; + + function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + + function requote(s) { + return s.replace(requoteRe, "\\$&"); + } + + function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); + } + + function formatLookup(names) { + var map = {}, i = -1, n = names.length; + while (++i < n) map[names[i].toLowerCase()] = i; + return map; + } + + function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; + } + + function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; + } + + function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; + } + + function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; + } + + function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; + } + + function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; + } + + function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; + } + + function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; + } + + function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; + } + + function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; + } + + function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; + } + + function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; + } + + function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; + } + + function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; + } + + function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; + } + + function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; + } + + function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; + } + + function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; + } + + function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); + } + + function formatHour24(d, p) { + return pad(d.getHours(), p, 2); + } + + function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); + } + + function formatDayOfYear(d, p) { + return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); + } + + function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); + } + + function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; + } + + function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); + } + + function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); + } + + function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); + } + + function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; + } + + function formatWeekNumberSunday(d, p) { + return pad(d3Time.timeSunday.count(d3Time.timeYear(d) - 1, d), p, 2); + } + + function formatWeekNumberISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); + return pad(d3Time.timeThursday.count(d3Time.timeYear(d), d) + (d3Time.timeYear(d).getDay() === 4), p, 2); + } + + function formatWeekdayNumberSunday(d) { + return d.getDay(); + } + + function formatWeekNumberMonday(d, p) { + return pad(d3Time.timeMonday.count(d3Time.timeYear(d) - 1, d), p, 2); + } + + function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); + } + + function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); + } + + function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); + } + + function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); + } + + function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); + } + + function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); + } + + function formatUTCDayOfYear(d, p) { + return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); + } + + function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); + } + + function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; + } + + function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); + } + + function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); + } + + function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); + } + + function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; + } + + function formatUTCWeekNumberSunday(d, p) { + return pad(d3Time.utcSunday.count(d3Time.utcYear(d) - 1, d), p, 2); + } + + function formatUTCWeekNumberISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); + return pad(d3Time.utcThursday.count(d3Time.utcYear(d), d) + (d3Time.utcYear(d).getUTCDay() === 4), p, 2); + } + + function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); + } + + function formatUTCWeekNumberMonday(d, p) { + return pad(d3Time.utcMonday.count(d3Time.utcYear(d) - 1, d), p, 2); + } + + function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); + } + + function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); + } + + function formatUTCZone() { + return "+0000"; + } + + function formatLiteralPercent() { + return "%"; + } + + function formatUnixTimestamp(d) { + return +d; + } + + function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); + } + + var locale; + + defaultLocale({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + }); + + function defaultLocale(definition) { + locale = formatLocale(definition); + exports.timeFormat = locale.format; + exports.timeParse = locale.parse; + exports.utcFormat = locale.utcFormat; + exports.utcParse = locale.utcParse; + return locale; + } + + var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; + + function formatIsoNative(date) { + return date.toISOString(); + } + + var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); + + function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + } + + var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); + + exports.isoFormat = formatIso; + exports.isoParse = parseIso; + exports.timeFormatDefaultLocale = defaultLocale; + exports.timeFormatLocale = formatLocale; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-time": 34}], + 34: [function (require, module, exports) { +// https://d3js.org/d3-time/ v1.1.0 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var t0 = new Date, + t1 = new Date; + + function newInterval(floori, offseti, count, field) { + + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; + } + + interval.floor = function (date) { + return floori(date = new Date(+date)), date; + }; + + interval.ceil = function (date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; + }; + + interval.round = function (date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; + }; + + interval.offset = function (date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; + }; + + interval.range = function (start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; + }; + + interval.filter = function (test) { + return newInterval(function (date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function (date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) { + } // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) { + } // eslint-disable-line no-empty + } + } + }); + }; + + if (count) { + interval.count = function (start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; + + interval.every = function (step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function (d) { + return field(d) % step === 0; + } + : function (d) { + return interval.count(0, d) % step === 0; + }); + }; + } + + return interval; + } + + var millisecond = newInterval(function () { + // noop + }, function (date, step) { + date.setTime(+date + step); + }, function (start, end) { + return end - start; + }); + +// An optimized implementation for this simple case. + millisecond.every = function (k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function (date) { + date.setTime(Math.floor(date / k) * k); + }, function (date, step) { + date.setTime(+date + step * k); + }, function (start, end) { + return (end - start) / k; + }); + }; + var milliseconds = millisecond.range; + + var durationSecond = 1e3; + var durationMinute = 6e4; + var durationHour = 36e5; + var durationDay = 864e5; + var durationWeek = 6048e5; + + var second = newInterval(function (date) { + date.setTime(date - date.getMilliseconds()); + }, function (date, step) { + date.setTime(+date + step * durationSecond); + }, function (start, end) { + return (end - start) / durationSecond; + }, function (date) { + return date.getUTCSeconds(); + }); + var seconds = second.range; + + var minute = newInterval(function (date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); + }, function (date, step) { + date.setTime(+date + step * durationMinute); + }, function (start, end) { + return (end - start) / durationMinute; + }, function (date) { + return date.getMinutes(); + }); + var minutes = minute.range; + + var hour = newInterval(function (date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); + }, function (date, step) { + date.setTime(+date + step * durationHour); + }, function (start, end) { + return (end - start) / durationHour; + }, function (date) { + return date.getHours(); + }); + var hours = hour.range; + + var day = newInterval(function (date) { + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setDate(date.getDate() + step); + }, function (start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay; + }, function (date) { + return date.getDate() - 1; + }); + var days = day.range; + + function weekday(i) { + return newInterval(function (date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setDate(date.getDate() + step * 7); + }, function (start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); + } + + var sunday = weekday(0); + var monday = weekday(1); + var tuesday = weekday(2); + var wednesday = weekday(3); + var thursday = weekday(4); + var friday = weekday(5); + var saturday = weekday(6); + + var sundays = sunday.range; + var mondays = monday.range; + var tuesdays = tuesday.range; + var wednesdays = wednesday.range; + var thursdays = thursday.range; + var fridays = friday.range; + var saturdays = saturday.range; + + var month = newInterval(function (date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setMonth(date.getMonth() + step); + }, function (start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; + }, function (date) { + return date.getMonth(); + }); + var months = month.range; + + var year = newInterval(function (date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setFullYear(date.getFullYear() + step); + }, function (start, end) { + return end.getFullYear() - start.getFullYear(); + }, function (date) { + return date.getFullYear(); + }); + +// An optimized implementation for this simple case. + year.every = function (k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function (date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function (date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); + }; + var years = year.range; + + var utcMinute = newInterval(function (date) { + date.setUTCSeconds(0, 0); + }, function (date, step) { + date.setTime(+date + step * durationMinute); + }, function (start, end) { + return (end - start) / durationMinute; + }, function (date) { + return date.getUTCMinutes(); + }); + var utcMinutes = utcMinute.range; + + var utcHour = newInterval(function (date) { + date.setUTCMinutes(0, 0, 0); + }, function (date, step) { + date.setTime(+date + step * durationHour); + }, function (start, end) { + return (end - start) / durationHour; + }, function (date) { + return date.getUTCHours(); + }); + var utcHours = utcHour.range; + + var utcDay = newInterval(function (date) { + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCDate(date.getUTCDate() + step); + }, function (start, end) { + return (end - start) / durationDay; + }, function (date) { + return date.getUTCDate() - 1; + }); + var utcDays = utcDay.range; + + function utcWeekday(i) { + return newInterval(function (date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function (start, end) { + return (end - start) / durationWeek; + }); + } + + var utcSunday = utcWeekday(0); + var utcMonday = utcWeekday(1); + var utcTuesday = utcWeekday(2); + var utcWednesday = utcWeekday(3); + var utcThursday = utcWeekday(4); + var utcFriday = utcWeekday(5); + var utcSaturday = utcWeekday(6); + + var utcSundays = utcSunday.range; + var utcMondays = utcMonday.range; + var utcTuesdays = utcTuesday.range; + var utcWednesdays = utcWednesday.range; + var utcThursdays = utcThursday.range; + var utcFridays = utcFriday.range; + var utcSaturdays = utcSaturday.range; + + var utcMonth = newInterval(function (date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCMonth(date.getUTCMonth() + step); + }, function (start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; + }, function (date) { + return date.getUTCMonth(); + }); + var utcMonths = utcMonth.range; + + var utcYear = newInterval(function (date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); + }, function (start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); + }, function (date) { + return date.getUTCFullYear(); + }); + +// An optimized implementation for this simple case. + utcYear.every = function (k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function (date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function (date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); + }; + var utcYears = utcYear.range; + + exports.timeDay = day; + exports.timeDays = days; + exports.timeFriday = friday; + exports.timeFridays = fridays; + exports.timeHour = hour; + exports.timeHours = hours; + exports.timeInterval = newInterval; + exports.timeMillisecond = millisecond; + exports.timeMilliseconds = milliseconds; + exports.timeMinute = minute; + exports.timeMinutes = minutes; + exports.timeMonday = monday; + exports.timeMondays = mondays; + exports.timeMonth = month; + exports.timeMonths = months; + exports.timeSaturday = saturday; + exports.timeSaturdays = saturdays; + exports.timeSecond = second; + exports.timeSeconds = seconds; + exports.timeSunday = sunday; + exports.timeSundays = sundays; + exports.timeThursday = thursday; + exports.timeThursdays = thursdays; + exports.timeTuesday = tuesday; + exports.timeTuesdays = tuesdays; + exports.timeWednesday = wednesday; + exports.timeWednesdays = wednesdays; + exports.timeWeek = sunday; + exports.timeWeeks = sundays; + exports.timeYear = year; + exports.timeYears = years; + exports.utcDay = utcDay; + exports.utcDays = utcDays; + exports.utcFriday = utcFriday; + exports.utcFridays = utcFridays; + exports.utcHour = utcHour; + exports.utcHours = utcHours; + exports.utcMillisecond = millisecond; + exports.utcMilliseconds = milliseconds; + exports.utcMinute = utcMinute; + exports.utcMinutes = utcMinutes; + exports.utcMonday = utcMonday; + exports.utcMondays = utcMondays; + exports.utcMonth = utcMonth; + exports.utcMonths = utcMonths; + exports.utcSaturday = utcSaturday; + exports.utcSaturdays = utcSaturdays; + exports.utcSecond = second; + exports.utcSeconds = seconds; + exports.utcSunday = utcSunday; + exports.utcSundays = utcSundays; + exports.utcThursday = utcThursday; + exports.utcThursdays = utcThursdays; + exports.utcTuesday = utcTuesday; + exports.utcTuesdays = utcTuesdays; + exports.utcWednesday = utcWednesday; + exports.utcWednesdays = utcWednesdays; + exports.utcWeek = utcSunday; + exports.utcWeeks = utcSundays; + exports.utcYear = utcYear; + exports.utcYears = utcYears; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 35: [function (require, module, exports) { +// https://d3js.org/d3-timer/ v1.0.10 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {})); + }(this, function (exports) { + 'use strict'; + + var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) { + setTimeout(f, 17); + }; + + function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); + } + + function clearNow() { + clockNow = 0; + } + + function Timer() { + this._call = + this._time = + this._next = null; + } + + Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function (callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function () { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } + }; + + function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; + } + + function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; + } + --frame; + } + + function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } + } + + function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; + } + + function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); + } + + function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } + } + + function timeout$1(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(function (elapsed) { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; + } + + function interval$1(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + delay = +delay, time = time == null ? now() : +time; + t.restart(function tick(elapsed) { + elapsed += total; + t.restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); + return t; + } + + exports.interval = interval$1; + exports.now = now; + exports.timeout = timeout$1; + exports.timer = timer; + exports.timerFlush = timerFlush; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {}], + 36: [function (require, module, exports) { +// https://d3js.org/d3-transition/ v1.3.2 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-selection'), require('d3-dispatch'), require('d3-timer'), require('d3-interpolate'), require('d3-color'), require('d3-ease')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-selection', 'd3-dispatch', 'd3-timer', 'd3-interpolate', 'd3-color', 'd3-ease'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) { + 'use strict'; + + var emptyOn = d3Dispatch.dispatch("start", "end", "cancel", "interrupt"); + var emptyTween = []; + + var CREATED = 0; + var SCHEDULED = 1; + var STARTING = 2; + var STARTED = 3; + var RUNNING = 4; + var ENDING = 5; + var ENDED = 6; + + function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); + } + + function init(node, id) { + var schedule = get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; + } + + function set(node, id) { + var schedule = get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; + } + + function get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; + } + + function create(node, id, self) { + var schedules = node.__transition, + tween; + + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = d3Timer.timer(schedule, 0, self.time); + + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); + + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } + + function start(elapsed) { + var i, j, n, o; + + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); + + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return d3Timer.timeout(start); + + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + d3Timer.timeout(function () { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; + + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; + + while (++i < n) { + tween[i].call(node, t); + } + + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } + } + + function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; + + if (!schedules) return; + + name = name == null ? null : name + ""; + + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + + if (empty) delete node.__transition; + } + + function selection_interrupt(name) { + return this.each(function () { + interrupt(this, name); + }); + } + + function tweenRemove(id, name) { + var tween0, tween1; + return function () { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + + schedule.tween = tween1; + }; + } + + function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function () { + var schedule = set(this, id), + tween = schedule.tween; + + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + + schedule.tween = tween1; + }; + } + + function transition_tween(name, value) { + var id = this._id; + + name += ""; + + if (arguments.length < 2) { + var tween = get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); + } + + function tweenValue(transition, name, value) { + var id = transition._id; + + transition.each(function () { + var schedule = set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + + return function (node) { + return get(node, id).value[name]; + }; + } + + function interpolate(a, b) { + var c; + return (typeof b === "number" ? d3Interpolate.interpolateNumber + : b instanceof d3Color.color ? d3Interpolate.interpolateRgb + : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) + : d3Interpolate.interpolateString)(a, b); + } + + function attrRemove(name) { + return function () { + this.removeAttribute(name); + }; + } + + function attrRemoveNS(fullname) { + return function () { + this.removeAttributeNS(fullname.space, fullname.local); + }; + } + + function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function transition_attr(name, value) { + var fullname = d3Selection.namespace(name), + i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); + } + + function attrInterpolate(name, i) { + return function (t) { + this.setAttribute(name, i.call(this, t)); + }; + } + + function attrInterpolateNS(fullname, i) { + return function (t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; + } + + function attrTweenNS(fullname, value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + + tween._value = value; + return tween; + } + + function attrTween(name, value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + + tween._value = value; + return tween; + } + + function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = d3Selection.namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); + } + + function delayFunction(id, value) { + return function () { + init(this, id).delay = +value.apply(this, arguments); + }; + } + + function delayConstant(id, value) { + return value = +value, function () { + init(this, id).delay = value; + }; + } + + function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get(this.node(), id).delay; + } + + function durationFunction(id, value) { + return function () { + set(this, id).duration = +value.apply(this, arguments); + }; + } + + function durationConstant(id, value) { + return value = +value, function () { + set(this, id).duration = value; + }; + } + + function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get(this.node(), id).duration; + } + + function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function () { + set(this, id).ease = value; + }; + } + + function transition_ease(value) { + var id = this._id; + + return arguments.length + ? this.each(easeConstant(id, value)) + : get(this.node(), id).ease; + } + + function transition_filter(match) { + if (typeof match !== "function") match = d3Selection.matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Transition(subgroups, this._parents, this._name, this._id); + } + + function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + + return new Transition(merges, this._parents, this._name, this._id); + } + + function start(name) { + return (name + "").trim().split(/^|\s+/).every(function (t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); + } + + function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set; + return function () { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; + } + + function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); + } + + function removeFunction(id) { + return function () { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; + } + + function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); + } + + function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get(node, id)); + } + } + } + + return new Transition(subgroups, this._parents, name, id); + } + + function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); + } + } + subgroups.push(children); + parents.push(node); + } + } + } + + return new Transition(subgroups, parents, name, id); + } + + var Selection = d3Selection.selection.prototype.constructor; + + function transition_selection() { + return new Selection(this._groups, this._parents); + } + + function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function () { + var string0 = d3Selection.style(this, name), + string1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; + } + + function styleRemove(name) { + return function () { + this.style.removeProperty(name); + }; + } + + function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function () { + var string0 = d3Selection.style(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; + } + + function styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function () { + var string0 = d3Selection.style(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; + } + + function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function () { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; + } + + function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant(name, i, value), priority) + .on("end.style." + name, null); + } + + function styleInterpolate(name, i, priority) { + return function (t) { + this.style.setProperty(name, i.call(this, t), priority); + }; + } + + function styleTween(name, value, priority) { + var t, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + + tween._value = value; + return tween; + } + + function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); + } + + function textConstant(value) { + return function () { + this.textContent = value; + }; + } + + function textFunction(value) { + return function () { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; + } + + function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); + } + + function textInterpolate(i) { + return function (t) { + this.textContent = i.call(this, t); + }; + } + + function textTween(value) { + var t0, i0; + + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + + tween._value = value; + return tween; + } + + function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); + } + + function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } + } + } + + return new Transition(groups, this._parents, name, id1); + } + + function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function (resolve, reject) { + var cancel = {value: reject}, + end = { + value: function () { + if (--size === 0) resolve(); + } + }; + + that.each(function () { + var schedule = set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + + schedule.on = on1; + }); + }); + } + + var id = 0; + + function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; + } + + function transition(name) { + return d3Selection.selection().transition(name); + } + + function newId() { + return ++id; + } + + var selection_prototype = d3Selection.selection.prototype; + + Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + end: transition_end + }; + + var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: d3Ease.easeCubicInOut + }; + + function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + return defaultTiming.time = d3Timer.now(), defaultTiming; + } + } + return timing; + } + + function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; + } + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); + } + } + } + + return new Transition(groups, this._parents, name, id); + } + + d3Selection.selection.prototype.interrupt = selection_interrupt; + d3Selection.selection.prototype.transition = selection_transition; + + var root = [null]; + + function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root, name, +i); + } + } + } + + return null; + } + + exports.active = active; + exports.interrupt = interrupt; + exports.transition = transition; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-color": 13, "d3-dispatch": 15, "d3-ease": 18, "d3-interpolate": 24, "d3-selection": 31, "d3-timer": 35}], + 37: [function (require, module, exports) { +// https://d3js.org/d3-voronoi/ v1.1.4 Copyright 2018 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.d3 = global.d3 || {}))); + }(this, (function (exports) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } + + function x(d) { + return d[0]; + } + + function y(d) { + return d[1]; + } + + function RedBlackTree() { + this._ = null; // root node + } + + function RedBlackNode(node) { + node.U = // parent node + node.C = // color - true for red, false for black + node.L = // left node + node.R = // right node + node.P = // previous node + node.N = null; // next node + } + + RedBlackTree.prototype = { + constructor: RedBlackTree, + + insert: function (after, node) { + var parent, grandpa, uncle; + + if (after) { + node.P = after; + node.N = after.N; + if (after.N) after.N.P = node; + after.N = node; + if (after.R) { + after = after.R; + while (after.L) after = after.L; + after.L = node; + } else { + after.R = node; + } + parent = after; + } else if (this._) { + after = RedBlackFirst(this._); + node.P = null; + node.N = after; + after.P = after.L = node; + parent = after; + } else { + node.P = node.N = null; + this._ = node; + parent = null; + } + node.L = node.R = null; + node.U = parent; + node.C = true; + + after = node; + while (parent && parent.C) { + grandpa = parent.U; + if (parent === grandpa.L) { + uncle = grandpa.R; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.R) { + RedBlackRotateLeft(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateRight(this, grandpa); + } + } else { + uncle = grandpa.L; + if (uncle && uncle.C) { + parent.C = uncle.C = false; + grandpa.C = true; + after = grandpa; + } else { + if (after === parent.L) { + RedBlackRotateRight(this, parent); + after = parent; + parent = after.U; + } + parent.C = false; + grandpa.C = true; + RedBlackRotateLeft(this, grandpa); + } + } + parent = after.U; + } + this._.C = false; + }, + + remove: function (node) { + if (node.N) node.N.P = node.P; + if (node.P) node.P.N = node.N; + node.N = node.P = null; + + var parent = node.U, + sibling, + left = node.L, + right = node.R, + next, + red; + + if (!left) next = right; + else if (!right) next = left; + else next = RedBlackFirst(right); + + if (parent) { + if (parent.L === node) parent.L = next; + else parent.R = next; + } else { + this._ = next; + } + + if (left && right) { + red = next.C; + next.C = node.C; + next.L = left; + left.U = next; + if (next !== right) { + parent = next.U; + next.U = node.U; + node = next.R; + parent.L = node; + next.R = right; + right.U = next; + } else { + next.U = parent; + parent = next; + node = next.R; + } + } else { + red = node.C; + node = next; + } + + if (node) node.U = parent; + if (red) return; + if (node && node.C) { + node.C = false; + return; + } + + do { + if (node === this._) break; + if (node === parent.L) { + sibling = parent.R; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateLeft(this, parent); + sibling = parent.R; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.R || !sibling.R.C) { + sibling.L.C = false; + sibling.C = true; + RedBlackRotateRight(this, sibling); + sibling = parent.R; + } + sibling.C = parent.C; + parent.C = sibling.R.C = false; + RedBlackRotateLeft(this, parent); + node = this._; + break; + } + } else { + sibling = parent.L; + if (sibling.C) { + sibling.C = false; + parent.C = true; + RedBlackRotateRight(this, parent); + sibling = parent.L; + } + if ((sibling.L && sibling.L.C) + || (sibling.R && sibling.R.C)) { + if (!sibling.L || !sibling.L.C) { + sibling.R.C = false; + sibling.C = true; + RedBlackRotateLeft(this, sibling); + sibling = parent.L; + } + sibling.C = parent.C; + parent.C = sibling.L.C = false; + RedBlackRotateRight(this, parent); + node = this._; + break; + } + } + sibling.C = true; + node = parent; + parent = parent.U; + } while (!node.C); + + if (node) node.C = false; + } + }; + + function RedBlackRotateLeft(tree, node) { + var p = node, + q = node.R, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.R = q.L; + if (p.R) p.R.U = p; + q.L = p; + } + + function RedBlackRotateRight(tree, node) { + var p = node, + q = node.L, + parent = p.U; + + if (parent) { + if (parent.L === p) parent.L = q; + else parent.R = q; + } else { + tree._ = q; + } + + q.U = parent; + p.U = q; + p.L = q.R; + if (p.L) p.L.U = p; + q.R = p; + } + + function RedBlackFirst(node) { + while (node.L) node = node.L; + return node; + } + + function createEdge(left, right, v0, v1) { + var edge = [null, null], + index = edges.push(edge) - 1; + edge.left = left; + edge.right = right; + if (v0) setEdgeEnd(edge, left, right, v0); + if (v1) setEdgeEnd(edge, right, left, v1); + cells[left.index].halfedges.push(index); + cells[right.index].halfedges.push(index); + return edge; + } + + function createBorderEdge(left, v0, v1) { + var edge = [v0, v1]; + edge.left = left; + return edge; + } + + function setEdgeEnd(edge, left, right, vertex) { + if (!edge[0] && !edge[1]) { + edge[0] = vertex; + edge.left = left; + edge.right = right; + } else if (edge.left === right) { + edge[1] = vertex; + } else { + edge[0] = vertex; + } + } + +// Liang–Barsky line clipping. + function clipEdge(edge, x0, y0, x1, y1) { + var a = edge[0], + b = edge[1], + ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; + + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } + + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? + + if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy]; + if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy]; + return true; + } + + function connectEdge(edge, x0, y0, x1, y1) { + var v1 = edge[1]; + if (v1) return true; + + var v0 = edge[0], + left = edge.left, + right = edge.right, + lx = left[0], + ly = left[1], + rx = right[0], + ry = right[1], + fx = (lx + rx) / 2, + fy = (ly + ry) / 2, + fm, + fb; + + if (ry === ly) { + if (fx < x0 || fx >= x1) return; + if (lx > rx) { + if (!v0) v0 = [fx, y0]; + else if (v0[1] >= y1) return; + v1 = [fx, y1]; + } else { + if (!v0) v0 = [fx, y1]; + else if (v0[1] < y0) return; + v1 = [fx, y0]; + } + } else { + fm = (lx - rx) / (ry - ly); + fb = fy - fm * fx; + if (fm < -1 || fm > 1) { + if (lx > rx) { + if (!v0) v0 = [(y0 - fb) / fm, y0]; + else if (v0[1] >= y1) return; + v1 = [(y1 - fb) / fm, y1]; + } else { + if (!v0) v0 = [(y1 - fb) / fm, y1]; + else if (v0[1] < y0) return; + v1 = [(y0 - fb) / fm, y0]; + } + } else { + if (ly < ry) { + if (!v0) v0 = [x0, fm * x0 + fb]; + else if (v0[0] >= x1) return; + v1 = [x1, fm * x1 + fb]; + } else { + if (!v0) v0 = [x1, fm * x1 + fb]; + else if (v0[0] < x0) return; + v1 = [x0, fm * x0 + fb]; + } + } + } + + edge[0] = v0; + edge[1] = v1; + return true; + } + + function clipEdges(x0, y0, x1, y1) { + var i = edges.length, + edge; + + while (i--) { + if (!connectEdge(edge = edges[i], x0, y0, x1, y1) + || !clipEdge(edge, x0, y0, x1, y1) + || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon + || Math.abs(edge[0][1] - edge[1][1]) > epsilon)) { + delete edges[i]; + } + } + } + + function createCell(site) { + return cells[site.index] = { + site: site, + halfedges: [] + }; + } + + function cellHalfedgeAngle(cell, edge) { + var site = cell.site, + va = edge.left, + vb = edge.right; + if (site === vb) vb = va, va = site; + if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); + if (site === va) va = edge[1], vb = edge[0]; + else va = edge[0], vb = edge[1]; + return Math.atan2(va[0] - vb[0], vb[1] - va[1]); + } + + function cellHalfedgeStart(cell, edge) { + return edge[+(edge.left !== cell.site)]; + } + + function cellHalfedgeEnd(cell, edge) { + return edge[+(edge.left === cell.site)]; + } + + function sortCellHalfedges() { + for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) { + if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) { + var index = new Array(m), + array = new Array(m); + for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]); + index.sort(function (i, j) { + return array[j] - array[i]; + }); + for (j = 0; j < m; ++j) array[j] = halfedges[index[j]]; + for (j = 0; j < m; ++j) halfedges[j] = array[j]; + } + } + } + + function clipCells(x0, y0, x1, y1) { + var nCells = cells.length, + iCell, + cell, + site, + iHalfedge, + halfedges, + nHalfedges, + start, + startX, + startY, + end, + endX, + endY, + cover = true; + + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + halfedges = cell.halfedges; + iHalfedge = halfedges.length; + + // Remove any dangling clipped edges. + while (iHalfedge--) { + if (!edges[halfedges[iHalfedge]]) { + halfedges.splice(iHalfedge, 1); + } + } + + // Insert any border edges as necessary. + iHalfedge = 0, nHalfedges = halfedges.length; + while (iHalfedge < nHalfedges) { + end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1]; + start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1]; + if (Math.abs(endX - startX) > epsilon || Math.abs(endY - startY) > epsilon) { + halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end, + Math.abs(endX - x0) < epsilon && y1 - endY > epsilon ? [x0, Math.abs(startX - x0) < epsilon ? startY : y1] + : Math.abs(endY - y1) < epsilon && x1 - endX > epsilon ? [Math.abs(startY - y1) < epsilon ? startX : x1, y1] + : Math.abs(endX - x1) < epsilon && endY - y0 > epsilon ? [x1, Math.abs(startX - x1) < epsilon ? startY : y0] + : Math.abs(endY - y0) < epsilon && endX - x0 > epsilon ? [Math.abs(startY - y0) < epsilon ? startX : x0, y0] + : null)) - 1); + ++nHalfedges; + } + } + + if (nHalfedges) cover = false; + } + } + + // If there weren’t any edges, have the closest site cover the extent. + // It doesn’t matter which corner of the extent we measure! + if (cover) { + var dx, dy, d2, dc = Infinity; + + for (iCell = 0, cover = null; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + site = cell.site; + dx = site[0] - x0; + dy = site[1] - y0; + d2 = dx * dx + dy * dy; + if (d2 < dc) dc = d2, cover = cell; + } + } + + if (cover) { + var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0]; + cover.halfedges.push( + edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1, + edges.push(createBorderEdge(site, v01, v11)) - 1, + edges.push(createBorderEdge(site, v11, v10)) - 1, + edges.push(createBorderEdge(site, v10, v00)) - 1 + ); + } + } + + // Lastly delete any cells with no edges; these were entirely clipped. + for (iCell = 0; iCell < nCells; ++iCell) { + if (cell = cells[iCell]) { + if (!cell.halfedges.length) { + delete cells[iCell]; + } + } + } + } + + var circlePool = []; + + var firstCircle; + + function Circle() { + RedBlackNode(this); + this.x = + this.y = + this.arc = + this.site = + this.cy = null; + } + + function attachCircle(arc) { + var lArc = arc.P, + rArc = arc.N; + + if (!lArc || !rArc) return; + + var lSite = lArc.site, + cSite = arc.site, + rSite = rArc.site; + + if (lSite === rSite) return; + + var bx = cSite[0], + by = cSite[1], + ax = lSite[0] - bx, + ay = lSite[1] - by, + cx = rSite[0] - bx, + cy = rSite[1] - by; + + var d = 2 * (ax * cy - ay * cx); + if (d >= -epsilon2) return; + + var ha = ax * ax + ay * ay, + hc = cx * cx + cy * cy, + x = (cy * ha - ay * hc) / d, + y = (ax * hc - cx * ha) / d; + + var circle = circlePool.pop() || new Circle; + circle.arc = arc; + circle.site = cSite; + circle.x = x + bx; + circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom + + arc.circle = circle; + + var before = null, + node = circles._; + + while (node) { + if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) { + if (node.L) node = node.L; + else { + before = node.P; + break; + } + } else { + if (node.R) node = node.R; + else { + before = node; + break; + } + } + } + + circles.insert(before, circle); + if (!before) firstCircle = circle; + } + + function detachCircle(arc) { + var circle = arc.circle; + if (circle) { + if (!circle.P) firstCircle = circle.N; + circles.remove(circle); + circlePool.push(circle); + RedBlackNode(circle); + arc.circle = null; + } + } + + var beachPool = []; + + function Beach() { + RedBlackNode(this); + this.edge = + this.site = + this.circle = null; + } + + function createBeach(site) { + var beach = beachPool.pop() || new Beach; + beach.site = site; + return beach; + } + + function detachBeach(beach) { + detachCircle(beach); + beaches.remove(beach); + beachPool.push(beach); + RedBlackNode(beach); + } + + function removeBeach(beach) { + var circle = beach.circle, + x = circle.x, + y = circle.cy, + vertex = [x, y], + previous = beach.P, + next = beach.N, + disappearing = [beach]; + + detachBeach(beach); + + var lArc = previous; + while (lArc.circle + && Math.abs(x - lArc.circle.x) < epsilon + && Math.abs(y - lArc.circle.cy) < epsilon) { + previous = lArc.P; + disappearing.unshift(lArc); + detachBeach(lArc); + lArc = previous; + } + + disappearing.unshift(lArc); + detachCircle(lArc); + + var rArc = next; + while (rArc.circle + && Math.abs(x - rArc.circle.x) < epsilon + && Math.abs(y - rArc.circle.cy) < epsilon) { + next = rArc.N; + disappearing.push(rArc); + detachBeach(rArc); + rArc = next; + } + + disappearing.push(rArc); + detachCircle(rArc); + + var nArcs = disappearing.length, + iArc; + for (iArc = 1; iArc < nArcs; ++iArc) { + rArc = disappearing[iArc]; + lArc = disappearing[iArc - 1]; + setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); + } + + lArc = disappearing[0]; + rArc = disappearing[nArcs - 1]; + rArc.edge = createEdge(lArc.site, rArc.site, null, vertex); + + attachCircle(lArc); + attachCircle(rArc); + } + + function addBeach(site) { + var x = site[0], + directrix = site[1], + lArc, + rArc, + dxl, + dxr, + node = beaches._; + + while (node) { + dxl = leftBreakPoint(node, directrix) - x; + if (dxl > epsilon) node = node.L; else { + dxr = x - rightBreakPoint(node, directrix); + if (dxr > epsilon) { + if (!node.R) { + lArc = node; + break; + } + node = node.R; + } else { + if (dxl > -epsilon) { + lArc = node.P; + rArc = node; + } else if (dxr > -epsilon) { + lArc = node; + rArc = node.N; + } else { + lArc = rArc = node; + } + break; + } + } + } + + createCell(site); + var newArc = createBeach(site); + beaches.insert(lArc, newArc); + + if (!lArc && !rArc) return; + + if (lArc === rArc) { + detachCircle(lArc); + rArc = createBeach(lArc.site); + beaches.insert(newArc, rArc); + newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site); + attachCircle(lArc); + attachCircle(rArc); + return; + } + + if (!rArc) { // && lArc + newArc.edge = createEdge(lArc.site, newArc.site); + return; + } + + // else lArc !== rArc + detachCircle(lArc); + detachCircle(rArc); + + var lSite = lArc.site, + ax = lSite[0], + ay = lSite[1], + bx = site[0] - ax, + by = site[1] - ay, + rSite = rArc.site, + cx = rSite[0] - ax, + cy = rSite[1] - ay, + d = 2 * (bx * cy - by * cx), + hb = bx * bx + by * by, + hc = cx * cx + cy * cy, + vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay]; + + setEdgeEnd(rArc.edge, lSite, rSite, vertex); + newArc.edge = createEdge(lSite, site, null, vertex); + rArc.edge = createEdge(site, rSite, null, vertex); + attachCircle(lArc); + attachCircle(rArc); + } + + function leftBreakPoint(arc, directrix) { + var site = arc.site, + rfocx = site[0], + rfocy = site[1], + pby2 = rfocy - directrix; + + if (!pby2) return rfocx; + + var lArc = arc.P; + if (!lArc) return -Infinity; + + site = lArc.site; + var lfocx = site[0], + lfocy = site[1], + plby2 = lfocy - directrix; + + if (!plby2) return lfocx; + + var hl = lfocx - rfocx, + aby2 = 1 / pby2 - 1 / plby2, + b = hl / plby2; + + if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; + + return (rfocx + lfocx) / 2; + } + + function rightBreakPoint(arc, directrix) { + var rArc = arc.N; + if (rArc) return leftBreakPoint(rArc, directrix); + var site = arc.site; + return site[1] === directrix ? site[0] : Infinity; + } + + var epsilon = 1e-6; + var epsilon2 = 1e-12; + var beaches; + var cells; + var circles; + var edges; + + function triangleArea(a, b, c) { + return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); + } + + function lexicographic(a, b) { + return b[1] - a[1] + || b[0] - a[0]; + } + + function Diagram(sites, extent) { + var site = sites.sort(lexicographic).pop(), + x, + y, + circle; + + edges = []; + cells = new Array(sites.length); + beaches = new RedBlackTree; + circles = new RedBlackTree; + + while (true) { + circle = firstCircle; + if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) { + if (site[0] !== x || site[1] !== y) { + addBeach(site); + x = site[0], y = site[1]; + } + site = sites.pop(); + } else if (circle) { + removeBeach(circle.arc); + } else { + break; + } + } + + sortCellHalfedges(); + + if (extent) { + var x0 = +extent[0][0], + y0 = +extent[0][1], + x1 = +extent[1][0], + y1 = +extent[1][1]; + clipEdges(x0, y0, x1, y1); + clipCells(x0, y0, x1, y1); + } + + this.edges = edges; + this.cells = cells; + + beaches = + circles = + edges = + cells = null; + } + + Diagram.prototype = { + constructor: Diagram, + + polygons: function () { + var edges = this.edges; + + return this.cells.map(function (cell) { + var polygon = cell.halfedges.map(function (i) { + return cellHalfedgeStart(cell, edges[i]); + }); + polygon.data = cell.site.data; + return polygon; + }); + }, + + triangles: function () { + var triangles = [], + edges = this.edges; + + this.cells.forEach(function (cell, i) { + if (!(m = (halfedges = cell.halfedges).length)) return; + var site = cell.site, + halfedges, + j = -1, + m, + s0, + e1 = edges[halfedges[m - 1]], + s1 = e1.left === site ? e1.right : e1.left; + + while (++j < m) { + s0 = s1; + e1 = edges[halfedges[j]]; + s1 = e1.left === site ? e1.right : e1.left; + if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) { + triangles.push([site.data, s0.data, s1.data]); + } + } + }); + + return triangles; + }, + + links: function () { + return this.edges.filter(function (edge) { + return edge.right; + }).map(function (edge) { + return { + source: edge.left.data, + target: edge.right.data + }; + }); + }, + + find: function (x, y, radius) { + var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell; + + // Use the previously-found cell, or start with an arbitrary one. + while (!(cell = that.cells[i1])) if (++i1 >= n) return null; + var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy; + + // Traverse the half-edges to find a closer cell, if any. + do { + cell = that.cells[i0 = i1], i1 = null; + cell.halfedges.forEach(function (e) { + var edge = that.edges[e], v = edge.left; + if ((v === cell.site || !v) && !(v = edge.right)) return; + var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy; + if (v2 < d2) d2 = v2, i1 = v.index; + }); + } while (i1 !== null); + + that._found = i0; + + return radius == null || d2 <= radius * radius ? cell.site : null; + } + }; + + function voronoi() { + var x$$1 = x, + y$$1 = y, + extent = null; + + function voronoi(data) { + return new Diagram(data.map(function (d, i) { + var s = [Math.round(x$$1(d, i, data) / epsilon) * epsilon, Math.round(y$$1(d, i, data) / epsilon) * epsilon]; + s.index = i; + s.data = d; + return s; + }), extent); + } + + voronoi.polygons = function (data) { + return voronoi(data).polygons(); + }; + + voronoi.links = function (data) { + return voronoi(data).links(); + }; + + voronoi.triangles = function (data) { + return voronoi(data).triangles(); + }; + + voronoi.x = function (_) { + return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : x$$1; + }; + + voronoi.y = function (_) { + return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant(+_), voronoi) : y$$1; + }; + + voronoi.extent = function (_) { + return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]]; + }; + + voronoi.size = function (_) { + return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]; + }; + + return voronoi; + } + + exports.voronoi = voronoi; + + Object.defineProperty(exports, '__esModule', {value: true}); + + }))); + + }, {}], + 38: [function (require, module, exports) { +// https://d3js.org/d3-zoom/ v1.8.3 Copyright 2019 Mike Bostock + (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-drag'), require('d3-interpolate'), require('d3-selection'), require('d3-transition')) : + typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-drag', 'd3-interpolate', 'd3-selection', 'd3-transition'], factory) : + (global = global || self, factory(global.d3 = global.d3 || {}, global.d3, global.d3, global.d3, global.d3, global.d3)); + }(this, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { + 'use strict'; + + function constant(x) { + return function () { + return x; + }; + } + + function ZoomEvent(target, type, transform) { + this.target = target; + this.type = type; + this.transform = transform; + } + + function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; + } + + Transform.prototype = { + constructor: Transform, + scale: function (k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function (x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function (point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function (x) { + return x * this.k + this.x; + }, + applyY: function (y) { + return y * this.k + this.y; + }, + invert: function (location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function (x) { + return (x - this.x) / this.k; + }, + invertY: function (y) { + return (y - this.y) / this.k; + }, + rescaleX: function (x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function (y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function () { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } + }; + + var identity = new Transform(1, 0, 0); + + transform.prototype = Transform.prototype; + + function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; + return node.__zoom; + } + + function nopropagation() { + d3Selection.event.stopImmediatePropagation(); + } + + function noevent() { + d3Selection.event.preventDefault(); + d3Selection.event.stopImmediatePropagation(); + } + +// Ignore right-click, since that should open the context menu. + function defaultFilter() { + return !d3Selection.event.ctrlKey && !d3Selection.event.button; + } + + function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; + } + + function defaultTransform() { + return this.__zoom || identity; + } + + function defaultWheelDelta() { + return -d3Selection.event.deltaY * (d3Selection.event.deltaMode === 1 ? 0.05 : d3Selection.event.deltaMode ? 1 : 0.002); + } + + function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); + } + + function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); + } + + function zoom() { + var filter = defaultFilter, + extent = defaultExtent, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = d3Interpolate.interpolateZoom, + listeners = d3Dispatch.dispatch("start", "zoom", "end"), + touchstarting, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function (collection, transform, point) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point); + } else { + selection.interrupt().each(function () { + gesture(this, arguments) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function (selection, k, p) { + zoom.scaleTo(selection, function () { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p); + }; + + zoom.scaleTo = function (selection, k, p) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p); + }; + + zoom.translateBy = function (selection, x, y) { + zoom.transform(selection, function () { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }); + }; + + zoom.translateTo = function (selection, x, y, p) { + zoom.transform(selection, function () { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point) { + transition + .on("start.zoom", function () { + gesture(this, arguments).start(); + }) + .on("interrupt.zoom end.zoom", function () { + gesture(this, arguments).end(); + }) + .tween("zoom", function () { + var that = this, + args = arguments, + g = gesture(that, args), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function (t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { + var l = i(t), k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + start: function () { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function (key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function () { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function (type) { + d3Selection.customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]); + } + }; + + function wheeled() { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, arguments), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = d3Selection.mouse(this); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + d3Transition.interrupt(this); + g.start(); + } + + noevent(); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } + + function mousedowned() { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, arguments, true), + v = d3Selection.select(d3Selection.event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = d3Selection.mouse(this), + x0 = d3Selection.event.clientX, + y0 = d3Selection.event.clientY; + + d3Drag.dragDisable(d3Selection.event.view); + nopropagation(); + g.mouse = [p, this.__zoom.invert(p)]; + d3Transition.interrupt(this); + g.start(); + + function mousemoved() { + noevent(); + if (!g.moved) { + var dx = d3Selection.event.clientX - x0, dy = d3Selection.event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3Selection.mouse(g.that), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped() { + v.on("mousemove.zoom mouseup.zoom", null); + d3Drag.dragEnable(d3Selection.event.view, g.moved); + noevent(); + g.end(); + } + } + + function dblclicked() { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = d3Selection.mouse(this), + p1 = t0.invert(p0), + k1 = t0.k * (d3Selection.event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent); + + noevent(); + if (duration > 0) d3Selection.select(this).transition().duration(duration).call(schedule, t1, p0); + else d3Selection.select(this).call(zoom.transform, t1); + } + + function touchstarted() { + if (!filter.apply(this, arguments)) return; + var touches = d3Selection.event.touches, + n = touches.length, + g = gesture(this, arguments, d3Selection.event.changedTouches.length === n), + started, i, t, p; + + nopropagation(); + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.touch(this, touches, t.identifier); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchstarting = setTimeout(function () { + touchstarting = null; + }, touchDelay); + d3Transition.interrupt(this); + g.start(); + } + } + + function touchmoved() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = d3Selection.event.changedTouches, + n = touches.length, i, t, p, l; + + noevent(); + if (touchstarting) touchstarting = clearTimeout(touchstarting); + g.taps = 0; + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.touch(this, touches, t.identifier); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + + function touchended() { + if (!this.__zooming) return; + var g = gesture(this, arguments), + touches = d3Selection.event.changedTouches, + n = touches.length, i, t; + + nopropagation(); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function () { + touchending = null; + }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + var p = d3Selection.select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + + zoom.wheelDelta = function (_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; + + zoom.filter = function (_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; + + zoom.touchable = function (_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; + + zoom.extent = function (_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + + zoom.scaleExtent = function (_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + + zoom.translateExtent = function (_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function (_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function (_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function (_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function () { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function (_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + return zoom; + } + + exports.zoom = zoom; + exports.zoomIdentity = identity; + exports.zoomTransform = transform; + + Object.defineProperty(exports, '__esModule', {value: true}); + + })); + + }, {"d3-dispatch": 15, "d3-drag": 16, "d3-interpolate": 24, "d3-selection": 31, "d3-transition": 36}], + 39: [function (require, module, exports) { + 'use strict'; + + Object.defineProperty(exports, '__esModule', {value: true}); + + var d3Array = require('d3-array'); + var d3Axis = require('d3-axis'); + var d3Brush = require('d3-brush'); + var d3Chord = require('d3-chord'); + var d3Collection = require('d3-collection'); + var d3Color = require('d3-color'); + var d3Contour = require('d3-contour'); + var d3Dispatch = require('d3-dispatch'); + var d3Drag = require('d3-drag'); + var d3Dsv = require('d3-dsv'); + var d3Ease = require('d3-ease'); + var d3Fetch = require('d3-fetch'); + var d3Force = require('d3-force'); + var d3Format = require('d3-format'); + var d3Geo = require('d3-geo'); + var d3Hierarchy = require('d3-hierarchy'); + var d3Interpolate = require('d3-interpolate'); + var d3Path = require('d3-path'); + var d3Polygon = require('d3-polygon'); + var d3Quadtree = require('d3-quadtree'); + var d3Random = require('d3-random'); + var d3Scale = require('d3-scale'); + var d3ScaleChromatic = require('d3-scale-chromatic'); + var d3Selection = require('d3-selection'); + var d3Shape = require('d3-shape'); + var d3Time = require('d3-time'); + var d3TimeFormat = require('d3-time-format'); + var d3Timer = require('d3-timer'); + var d3Transition = require('d3-transition'); + var d3Voronoi = require('d3-voronoi'); + var d3Zoom = require('d3-zoom'); + + var version = "5.15.0"; + + Object.keys(d3Array).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Array[k]; + } + }); + }); + Object.keys(d3Axis).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Axis[k]; + } + }); + }); + Object.keys(d3Brush).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Brush[k]; + } + }); + }); + Object.keys(d3Chord).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Chord[k]; + } + }); + }); + Object.keys(d3Collection).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Collection[k]; + } + }); + }); + Object.keys(d3Color).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Color[k]; + } + }); + }); + Object.keys(d3Contour).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Contour[k]; + } + }); + }); + Object.keys(d3Dispatch).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Dispatch[k]; + } + }); + }); + Object.keys(d3Drag).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Drag[k]; + } + }); + }); + Object.keys(d3Dsv).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Dsv[k]; + } + }); + }); + Object.keys(d3Ease).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Ease[k]; + } + }); + }); + Object.keys(d3Fetch).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Fetch[k]; + } + }); + }); + Object.keys(d3Force).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Force[k]; + } + }); + }); + Object.keys(d3Format).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Format[k]; + } + }); + }); + Object.keys(d3Geo).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Geo[k]; + } + }); + }); + Object.keys(d3Hierarchy).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Hierarchy[k]; + } + }); + }); + Object.keys(d3Interpolate).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Interpolate[k]; + } + }); + }); + Object.keys(d3Path).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Path[k]; + } + }); + }); + Object.keys(d3Polygon).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Polygon[k]; + } + }); + }); + Object.keys(d3Quadtree).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Quadtree[k]; + } + }); + }); + Object.keys(d3Random).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Random[k]; + } + }); + }); + Object.keys(d3Scale).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Scale[k]; + } + }); + }); + Object.keys(d3ScaleChromatic).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3ScaleChromatic[k]; + } + }); + }); + Object.keys(d3Selection).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Selection[k]; + } + }); + }); + Object.keys(d3Shape).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Shape[k]; + } + }); + }); + Object.keys(d3Time).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Time[k]; + } + }); + }); + Object.keys(d3TimeFormat).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3TimeFormat[k]; + } + }); + }); + Object.keys(d3Timer).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Timer[k]; + } + }); + }); + Object.keys(d3Transition).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Transition[k]; + } + }); + }); + Object.keys(d3Voronoi).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Voronoi[k]; + } + }); + }); + Object.keys(d3Zoom).forEach(function (k) { + if (k !== 'default') Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Zoom[k]; + } + }); + }); + exports.version = version; + + }, { + "d3-array": 8, + "d3-axis": 9, + "d3-brush": 10, + "d3-chord": 11, + "d3-collection": 12, + "d3-color": 13, + "d3-contour": 14, + "d3-dispatch": 15, + "d3-drag": 16, + "d3-dsv": 17, + "d3-ease": 18, + "d3-fetch": 19, + "d3-force": 20, + "d3-format": 21, + "d3-geo": 22, + "d3-hierarchy": 23, + "d3-interpolate": 24, + "d3-path": 25, + "d3-polygon": 26, + "d3-quadtree": 27, + "d3-random": 28, + "d3-scale": 30, + "d3-scale-chromatic": 29, + "d3-selection": 31, + "d3-shape": 32, + "d3-time": 34, + "d3-time-format": 33, + "d3-timer": 35, + "d3-transition": 36, + "d3-voronoi": 37, + "d3-zoom": 38 + }], + 40: [function (require, module, exports) { + (function (process, global) { + !function (e) { + "object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : "undefined" != typeof window ? window.commonJsModule = e() : "undefined" != typeof global ? global.commonJsModule = e() : "undefined" != typeof self && (self.commonJsModule = e()) + }(function () { + var define, module, exports; + module = {exports: (exports = {})}; + +// var fs = require('fs'); + + module.exports = { + + // Read and transform Lasio Json files to Wellio.js json data format + + /** + * File reading utility function. + * @param {string} : file_to_read - The file to open. + * + * @returns {string} : The file's contents as a string. + */ + read_lasio_json_file: function (file_to_read) { + // Configure fs if running from node + let fs = ''; + + if (process !== 'undefined' && process.versions != null && process.versions.node != null) { + fs = require('fs'); + } + + return fs.readFileSync(file_to_read, 'utf8'); + }, + + /** + * The lasio_obj_2_wellio_obj function transforms lasio JSON strings into wellio.js JSON data format in memory and returns it. + * @param {object} lasio_json - A JavaScript object representation of lasio well log format + * + * @example + * let wellio = require('wellio') + * let lasio_json_str = wellio.read_lasio_json_file('lasio.json'); + * let lasio_obj = JSON.parse(lasio_json_str); + * let wellio_obj = wellio.lasio_obj_2_wellio_obj(lasio_obj); + * + * @returns {object} A wellio style JSON object + */ + lasio_obj_2_wellio_obj: function (lasio_obj) { + + let std_headers = { + 'Version': 'VERSION INFORMATION', + 'Well': 'WELL INFORMATION BLOCK', + 'Curves': 'CURVE INFORMATION BLOCK', + 'Parameter': 'PARAMETER INFORMATION' + }; + + let lasjson = {}; + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = lasio_obj.data; + + // Example code for adding non-standard headers + for (let item in lasio_obj.metadata) { + if (!(item in std_headers)) { + lasjson[item.toUpperCase()] = lasio_obj.metadata[item]; + } else { + for (let mnemonic in lasio_obj.metadata[item]) { + section = std_headers[item]; + lasjson[section][mnemonic] = { + MNEM: mnemonic, + UNIT: '', + DATA: lasio_obj.metadata[item][mnemonic], + 'DESCRIPTION OF MNEMONIC 1': '', + 'DESCRIPTION OF MNEMONIC 2': '' + }; + } + } + } + + return lasjson; + }, + + + /** + * A helper function that proves wellio,js was installed correctly. It merely returns the argument provided to it. For example, "test" as input would return "test". + * @param {*} onelas anything + * @returns Returns the input that was givne as an argument. This is just for testing that wellio was installed correctly. + * @example wellio.returnThing("test") = "test" + */ + returnThing: function (onelas) { + return onelas + }, + + + /** + * Loads a LAS 2.0 file from local files + * @param {string} well_log A string reprepresentatiion of filename of well log to be loaded into memory + * @returns {string} A string representation of the contents of that well log file. It is a single string. + */ + loadLAS: function (well_log) { + var file = well_log + var fs = ''; + + if (process !== 'undefined' && process.versions != null && process.versions.node != null) { + fs = require('fs'); + } + var contents = fs.readFileSync(file).toString(); + // var contents = fs.readFileSync('test.LAS', 'utf8'); + return contents + }, + //// Converts a LAS 2.0 file already loaded into memory into a json format + /** + * las2jso function converts a LAS 2.0 file already loaded into memory as a string into a JSON object + * @param {string} onelas A string representation of a LAS 2.0 well log file. Typically from the result of the loadLAS function. + * @returns {Object} A JSON object that represents the information that was in the LAS 2.0 well log file but in JSON wellio style format. + */ + las2json: function (onelas) { + //// var lasjson establishes a blank json for holding las 2.0 data. It will look like the example below: + var lasjson = { + "VERSION INFORMATION": { + "VERS": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "WRAP": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "WELL INFORMATION BLOCK": { + "GENERATED": "", + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_1": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_2": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "CURVE INFORMATION BLOCK": { + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + }, + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + } + } + , + "PARAMETER INFORMATION": { + "MNEM_0": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }, + "MNEM_1": { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + } + } + , + "CURVES": { + "Curve_NAME_ONE": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + "Curve_NAME_ONE": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + } + } + //// Some objects in the json were partially populated in the example above to make understanding the format easier. + //// We'll empty them as a first step + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = {}; + //// Within the "blocks" ["CURVE INFORMATION BLOCK","PARAMETER INFORMATION", etc.] there are other objects with repeating keys. + //// The variables below will be the building blocks for each of those objects {}. They are initially populated with empty strings as the values. + var ver_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + var well_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + var curve_info_obj = { + "MNEM": "", + "UNIT": "", + "ERCB CURVE CODE": "", + "CURVE DESCRIPTION 1": "", + "CURVE DESCRIPTION 2": "" + }; + var param_info_obj = { + "MNEM": "", + "UNIT": "", + "DATA": "", + "DESCRIPTION OF MNEMONIC 1": "", + "DESCRIPTION OF MNEMONIC 2": "" + }; + //// The las file is read as a txt file. It will first be split into seperate strings based on "~" character which occurs at the top of each "block" + console.log("onelas = ", onelas) + //// Split in to las sections that start with a tilde: ~. + var split1 = onelas.split(/(~[^~]+)/); + console.log("split1 = ", split1) + var vers_str = ""; + var well_info_str = ""; + var curve_info_str = ""; + var param_info_str = ""; + var other = ""; + var curve_str = ""; + + //// As the 'OTHER' block may or may not be present, we have to split by '~' and then look for a substring to make sure we have the right block before we put each into a variable. + for (i = 0; i < split1.length; i++) { + //// Skip blank entries in the split1 array. + if (split1[i].length === 0) { + continue; + } + if (split1[i].includes("~V")) { + var vers_str = split1[i] + } else if (split1[i].includes("~W")) { + well_info_str = split1[i] + } else if (split1[i].includes("~C")) { + curve_info_str = split1[i] + } else if (split1[i].includes("~P")) { + param_info_str = split1[i] + } else if (split1[i].includes("~O")) { + other = split1[i] + } else if (split1[i].includes("~A")) { + curve_str = split1[i] + } else { + console.log("WARNING: In wellio.js the las2json() function: split1[" + i + "] is not a recognized las section") + console.log("elem: [" + split1[i] + "]"); + } + } + + + //// Working with version block first by splitting it by newline and places each item into an array + //// and taking items of array 1 and 2 for vers and wrap + var vers_line = vers_str.split("\n")[1]; + var wrap_line = vers_str.split("\n")[2]; + //// As version information, well information, and parameter information blocks contain objects with the same keys, we can process them using a loop. + //// function to process objects for ver_info_obj, well_inf_obj, and param_info_obj + //// The splitLineofType1() function takes as argument the prototypical object building block and the array of strings for that block + function splitLineofType1(ver_info_obj, arrayString) { + //// splits string (should be a single line from the LAS text) by ":", takes the first item of the resulting array, and then replaces any " " with "". + var vers_line_1half = arrayString.split(":")[0].replace(" ", ""); + //// splits the previous string variable by "." into an array of strings. + var vers_line_1half_array = vers_line_1half.split(".") + //// trimming this so I get "UWI" instead of "UWI " + ver_info_obj["MNEM"] = vers_line_1half_array[0].trim() + var unit_and_data = vers_line_1half_array.slice(1, vers_line_1half_array.length); + var unit_and_data_str = " "; + if (unit_and_data.length > 1) { + unit_and_data_str = unit_and_data[0].toString() + "." + unit_and_data[1].toString(); + } else { + unit_and_data_str = unit_and_data.toString() + } + var unit = unit_and_data_str[0, 5].trim(); + var data = unit_and_data_str.substring(5, unit_and_data_str.length).trim(); + ver_info_obj["DATA"] = data + ver_info_obj["UNIT"] = unit + //// + if (arrayString.split(":")[1].indexOf("-") !== -1) { + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].split("-")[0].trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = arrayString.split(":")[1].split("-")[1].replace("\r", "").trim() + } else { + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].replace("\r", "").trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = "" + } + return ver_info_obj + }; + lasjson["VERSION INFORMATION"]["WRAP"] = splitLineofType1(Object.assign({}, ver_info_obj), wrap_line); + lasjson["VERSION INFORMATION"]["VERS"] = splitLineofType1(Object.assign({}, ver_info_obj), vers_line); + //// Working with PARAMETER INFORMATION block second by splitting it by newline into an array. + //// This skips the line with the section's title. + var param_line_array = param_info_str.split("\n").slice(1,); + for (i = 0; i < param_line_array.length; i++) { + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (param_line_array[i] != "" && param_line_array[i][0] !== '#') { + var param_obj_inst = splitLineofType1(Object.assign({}, param_info_obj), param_line_array[i]); + lasjson["PARAMETER INFORMATION"][param_obj_inst["MNEM"]] = param_obj_inst + } + } + //// Working with CURVE INFORMATION BLOCK second by splitting it by newline into an array. + //// This skips the line with the section's title. + var curve_line_array = curve_info_str.split("\n").slice(1,); + for (i = 0; i < curve_line_array.length; i++) { + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (curve_line_array[i] != "" && curve_line_array[i][0] !== '#') { + var curve_obj_inst = splitLineofType1(Object.assign({}, curve_info_obj), curve_line_array[i]); + lasjson["CURVE INFORMATION BLOCK"][curve_obj_inst["MNEM"]] = curve_obj_inst + } + } + //// Working with WELL INFORMATION BLOCK second by splitting it by newline into an array. + //// This skips the line with the section's title. + var well_line_array = well_info_str.split("\n").slice(1,); + for (i = 0; i < well_line_array.length; i++) { + if (well_line_array[i].includes("Generated")) { + lasjson["WELL INFORMATION BLOCK"]["GENERATED"] = well_line_array[i].replace("\r", "").replace("\t", " ").replace("#", "") + } + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if (well_line_array[i] != "" && well_line_array[i][0] !== '#') { + var well_obj_inst = splitLineofType1(Object.assign({}, well_info_obj), well_line_array[i]); + lasjson["WELL INFORMATION BLOCK"][well_obj_inst["MNEM"]] = well_obj_inst + } else { + console.log("INFO: in else for well_line: " + i) + console.log("elem: [" + well_line_array[i] + "]"); + } + } + //// Work with CURVES section by splitting it by newline into an array, + //// Iterate through the array items populate arrays for each key + var curve_str_array = curve_str.split("\n"); + + //// Get the curve column names from the curve names in the curve information block + //// + //// Per LAS_20_Update_Jan2014.pdf section 5.5 specs for ~C(Curve Information) + //// - This section is manditory. + //// - It desribes the curves and its units in the order they appear in the ~ASCII + //// log data section of the file. + //// - The channels described in this section must be present in the data set. + var curve_names_array_holder = []; + var curve_info = Object.keys(lasjson['CURVE INFORMATION BLOCK']); + + if (curve_info.length > 0) { + for (k = 0; k < curve_info.length; k++) { + col_name = curve_info[k]; + curve_names_array_holder.push(col_name); + lasjson.CURVES[col_name] = []; + } + } + + var curve_data_line_array = []; + + //// start at position 1 instead of 0 is to avoid the curve names + for (j = 1; j < curve_str_array.length; j++) { + //// Skip empty rows. + if (curve_str_array[j].length === 0) { + continue; + } + + var temp_data_array = curve_str_array[j].split(/\s+/); + //// Split can leave an empty element at the beginning, remove it. + if (temp_data_array[0].length === 0) { + temp_data_array.shift(); + } + + //// If data is wrapped continue to accumulate data from rows till + //// we have a data element for each data column + var idx = curve_data_line_array.length; + curve_data_line_array.length = idx + temp_data_array.length; + for (var i = 0; i < temp_data_array.length; i++, idx++) { + curve_data_line_array[idx] = temp_data_array[i]; + } + + if ( + lasjson["VERSION INFORMATION"].WRAP.DATA == 'YES' + && curve_data_line_array.length < curve_names_array_holder.length) { + continue; + } + + var counter_of_curve_names = 0; + console.log("curve_data_line_array.length = ", curve_data_line_array.length) + console.log("curve_data_line_array = ", curve_data_line_array) + + + var last_curv_data_line_position = curve_data_line_array.length - 1; + console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) + curve_data_line_array[last_curv_data_line_position] = curve_data_line_array[last_curv_data_line_position].replace("\r", "") + console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) + for (k = 0; k < curve_data_line_array.length; k++) { + if (curve_data_line_array[k] !== "") { + lasjson["CURVES"][curve_names_array_holder[counter_of_curve_names]].push(curve_data_line_array[k]) + counter_of_curve_names += 1; + } + } + //// Zero out curve_data_line_array for next set of data + curve_data_line_array = []; + } + console.log(" test: lasjson", lasjson); + return (lasjson) + }, + + //// Given a well already converted into json, returns the available curves + CurveNames: function (well_json) { + var curveNames = Object.keys(well_json["CURVES"]); + return curveNames + }, + //// + VER_block: function (well_json) { + return well_json["VERSION INFORMATION"] + }, + //// Given a well already converted into json, returns the well UWI + UWI: function (well_json) { + return well_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + }, + //// Given a well already converted into json, returns a given curve name in string format + getCurve(well_json, curve) { + if (!well_json["CURVES"][curve]) { + console.log("in getCurve function, that curve does not exist! =", curve) + return "that curve does not exist! see console.log" + + } else { + return well_json["CURVES"][curve] + } + } + } + + + return module.exports; + }); + + }).call(this, require('_process'), typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + }, {"_process": 2, "fs": 1}] +}, {}, [4, 6, 5, 7]); diff --git a/example_deployments/example_panel_app/templates/js/call_plots.js b/example_deployments/example_panel_app/templates/js/call_plots.js new file mode 100644 index 0000000..aabe234 --- /dev/null +++ b/example_deployments/example_panel_app/templates/js/call_plots.js @@ -0,0 +1,215 @@ +// well_curve_config_template = [ +// {"multipleLines":"yes","curveNames":["GR"], +// "curveColors":["black","pink"], +// "fill":[ +// {"curveName":"GR","fill":"yes","fillDirection":"left","cutoffs":[0,ShaleSiltCutOff,SiltSandCutOff],"fillColors":["gray","orange","yellow"],"curve2":""}, +// {"curveName":"RESD","fill":"no","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} +// ], +// "data":well_log_converted_to_d3_friendly, +// "width":200, +// "height":400, +// "margin":({top: 20, right: 3, bottom: 30, left: 30}), +// "depth_curve_name":"DEPTH"}] + + + +// function makePlot(single_curve,div,height,width,domain_x,domain_y,curve_name){ +// // "#log_plot_div" +// var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() +// console.log("got to second part of makePlot2 and b2 = ",b2) +// g3.log(b2,single_curve).draw() +// console.log("got to second part of makePlot2 and b2 = ",b2) + +// } + +// function makePlot2(single_curve,div,height,width,domain_x,domain_y,curve_name){ +// // "#log_plot_div" +// // var div = "dl_trial_a" +// var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() +// console.log("1 got to second part of makePlot2 and b2 = ",b2) +// g3.log(b2,single_curve).draw() +// console.log("2 got to second part of makePlot2 and b2 = ",b2) + +// } + +// function draw_curveG3(curve,div){ +// if(!div){div = "#log_plot_div"} +// if(!curve){ +// curve = "GR"; +// console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) +// } +// console.log("curve = ",curve) +// var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] +// makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) +// } + + +// function reformatJSONforPlotting(temp_json,curve,div){ +// wellioviz.fromJSONofWEllGetThingsForPlotting(well_log_json,"DEPTH") +// } + +function reformatJSONforPlotting(temp_json,curve,div){ + // generic_template = [ + // {"multipleLines":"yes", + // "curveNames":[curve], + // "curveColors":["black","pink"], + // "fill":[ + // {"curveName":curve,"fill":"yes","fillDirection":"left","cutoffs":[0,65,75,89],"fillColors":["lightgreen","green","red","pink"],"curve2":""}, + // {"curveName":"PHID","fill":"yes","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} + // ], + // "data":"data_goes_here_once_formatted", + // "width":250, + // "height":600, + // "margin":({top: 20, right: 3, bottom: 30, left: 30}), + // "depth_curve_name":"DEPT", + // "divID":div + // }] + + generic_template = [ + { + "curve_box":{ + "show_well_name":"yes", /// not built yet + "show_depth_type":"yes", /// not built yet + "show_curve_units":"yes", /// not built yet + "curve_box_depth_min":-999, /// not built yet + "curve_box_depth_max":9990000, /// not built yet + "take_out_null_or_visualize":"no", /// not built yet + "show_title":"yes", + "width": 260, + "height": 400, + "height_multiplier_components":1, + "margin": {"top": 10, "right": 10, "bottom": 30, "left": 60}, + "title": {"text": "", "title_font_size": "10px"}, /// not built yet + "div_id": "log_plot_div", /// Should be skip-able // default=random str? What happens if div doesn't exist? + "order_of_component":["curves","rectanges","lines"], /// not built yet + "lines_connected_across_curveboxes":"no", /// not built yet + "header_sep_svg_or_not":"yes", + "svg_header_height":"4em", + "gridlines":"yes", + "gridlines_color":'#D3D3D3', + "gridlines_stroke_width":0.20, + "grouped_or_independent_x_scales":"independent", + //// variables for how to draw mouseover of hover box + "mouseover_yes_or_no":"yes", //// "yes" or "no" + "mouseover_depth_or_depth_and_curve":"depth_and_curve", /// options= "depth_and_curve", "depth", or "curve" + "mouseover_curvename":"default", //// default is first curve + "mouseover_color_or_default_which_is_curve_color":"default" /// default is default, which then uses curve color or black + }, + "components":[{ + "curves":[ + { "data_type":"curve", + "curve_names":[curve], + "curve_colors":["#0375D8"], + "curve_stroke_dasharray":["solid"], + "stroke_linecap":["butt"], + "stroke_width":[1], + "fill":[ + {"curve_name":curve,"fill":"yes","fill_direction":"left","cutoffs":[0,5,999],"fill_colors":["gray","beige","white"],"curve2":""} + ], + "curve_units":[""], + "depth_limits":[{"min":"autocalculate","max":"autocalculate"}], + "curve_limits":[{"curve_name":"","min":-10000000,"max":3}], + "data":"not here yet",/// not built yet + "depth_curve_name":"DEPT",/// not built yet + ////// + "data_id":["placeholder_data_id",], /// not built yet + "well_names":[""], /// not built yet + "scale_linear_log_or_yours":["linear"], + "line_color": ["red"], /// not built yet + "max_depth": "autocalculate", /// not built yet + "min_depth": "autocalculate", /// not built yet + "depth_type_string":[""], + "depth_units_string":[""], + "null_value": [""], /// not built yet + } + ], + "lines":[ + { + "data_type":"line", /// not built yet + "label":"example", /// not built yet + "depth":-999, /// not built yet + "color":"red", /// not built yet + "stroke_width":"3px", /// not built yet + "stroke_style":"solid", /// not built yet + "transparency":1.0, /// not built yet + "stroke_linecap":"butt" + } + ], + "rectangles":[ + { + "data_type":"rectangle", + "depth_top":0, + "x_starting_upper_left_corner":0, + "width":100, + "height":100, + "stroke_width":"2px", + "stroke_linecap":"butt", + "fill":"red", + "opacity":0.5, + "label":"Core Example", // not built into plotting template yet + "label_orientation":"horizontal", // not built into plotting template yet + "lable_position":"right" // not built into plotting template yet + } + ] + }] + }] + /////////// + console.log("depth curve name used", generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) + wellDataForPlotting = wellioviz.fromJSONofWEllGetThingsForPlotting(temp_json,generic_template[0]["components"][0]["curves"][0]["depth_curve_name"]) + curveDataFormatted = wellDataForPlotting["well_log_curves_reformatted_for_d3"] + curve_names = wellDataForPlotting["curve_names"] + uwi = wellDataForPlotting["uwi"] + console.log("curveDataFormatted in function draw_curve() ",curveDataFormatted) + //console.log("curveName in template generic_template['curveNames']:",generic_template[0]["curveNames"]) + ////////// + console.log("generic_template",generic_template) + generic_template[0]["components"][0]["curves"][0]["data"] = curveDataFormatted + new_generic_template = generic_template + return new_generic_template +} + +function draw_curve(curve,div){ + if(!div){div = "log_plot_div"} + if(!curve){ + curve = "GR"; + console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) + } + console.log("curve = ",curve) + ///var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] + ///makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) + var newDiv = document.createElement("div"); + disposible_log_div = "log_plot_div_sub" + newDiv.id = disposible_log_div + var currentDiv = document.getElementById("log_plot_div"); + currentDiv.append(newDiv) + + ///////// + console.log("generic_template:",reformatJSONforPlotting(temp_json)) + new_generic_template = reformatJSONforPlotting(temp_json) + height = new_generic_template[0]["curve_box"]["height"] + currentDiv.style.height = height+50+"px"; + result = wellioviz.multipleLogPlot(disposible_log_div,[reformatJSONforPlotting(temp_json,curve,disposible_log_div)]) + console.log("curve plot should be present now... the template supplied is:",result) +} + +// function draw_curve_from_data(curve,div,curve_name){ +// // if(!div){div = "#log_plot_div"} +// // if(!curve){ +// // curve = "GR"; +// // console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) +// // } +// // if(!curve_name){curve_name = "unknown curve"} +// // var curve = temp_json["CURVES"]["GR"] +// var curve = Array.from(curve) +// //var curve = "GR" +// var div = "#dl_trial_a"; +// var curve_name = "GR"; +// console.log("curve = ",curve); +// console.log("div = ",div); +// console.log("curve_name = ",curve_name); + +// // var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] +// // makePlot2(curve,div,600,250,domain_x,[0,curve.length],curve_name) +// var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] +// makePlot(curve,div,600,250,domain_x,[0,curve.length],curve_name) +// } \ No newline at end of file diff --git a/example_deployments/example_panel_app/templates/js/get_wellio.js b/example_deployments/example_panel_app/templates/js/get_wellio.js new file mode 100644 index 0000000..bcea17b --- /dev/null +++ b/example_deployments/example_panel_app/templates/js/get_wellio.js @@ -0,0 +1,5 @@ +wellio = require('wellio'); + +las2json = wellio.las2json; + +wellioviz = require("../../dist/index.js") \ No newline at end of file diff --git a/example_deployments/example_panel_app/templates/js/main.js b/example_deployments/example_panel_app/templates/js/main.js new file mode 100644 index 0000000..92ac507 --- /dev/null +++ b/example_deployments/example_panel_app/templates/js/main.js @@ -0,0 +1,235 @@ +/////////////////////// global objects placeholders //////////////////////// +//// ... maybe not good programming practice but quick to do for simple demo. + +//// var all_files is a holder for the las files uploaded into the browser +var all_files = [""]; +//// var temp_json is the single well las file converted to json object format +var temp_json = {}; + +//////////////////////// HELPER FUNCTIONS //////////////////////// + + +// Check for the various File API support. +if (window.File && window.FileReader && window.FileList && window.Blob) { + // Great success! All the File APIs are supported. +} else { + alert('The File APIs are not fully supported in this browser.'); +} + +//// Function that checks if a temp_json exists. If it does, it allows divs that manipulate that JSON to show +function checkForJSONThenCollapse(divID){ + console.log("divID",divID) + console.log("check check") + console.log(temp_json) + if (!temp_json['WELL INFORMATION BLOCK']){"button did nothing because well JSON doesn't exist"} + else{ + $('.collapse').collapse("hide") + //// toggle only the one clicked! + $(divID).collapse("toggle") + } +} + + + +//// helper function that removes the text depiction of the las file. +function removeTextLAS(){ + fileContentsDiv = document.getElementById("fileContents"); + while (fileContentsDiv.hasChildNodes()) { + fileContentsDiv.removeChild(fileContentsDiv.lastChild); + } +} + +//// helper function that removes the children of the given DOM element. +function remove_DOM_children(div_name){ + if(!div_name){ + div_name = 'log_plot_div' + } + fileContentsDiv = document.getElementById(div_name); + while (fileContentsDiv.hasChildNodes()) { + fileContentsDiv.removeChild(fileContentsDiv.lastChild); + } +} + +//// helper function that removes the inner html of the given DOM element, like the "test" from

    test

    +function removeInnerHTML(div_id){ + document.getElementById(div_id).innerHTML = "" +} + +//// helper function that take a string and a substring of that string and replaces the substring with "" or nothing if it finds the substring. +function removeSubStr(string,substring){ + return string.replace(substring,"") +} + +//////////////////////// LOADING FUNCTIONS //////////////////////// + + + +//// Reads in an example LAS files from webpage assets instead of local computer +function readInLASFromASSETS(){ + //all_files = ["./assets/00-01-01-073-05W5-0.LAS"]; + //// removes all status spans for uploads + removeInnerHTML("upload-file-info"); + removeInnerHTML("upload-success"); + $.ajax({ + url : "./assets/00-01-01-073-05W5-0.LAS", + dataType: "text", + success : function (data) { + all_files = [data,""] + document.getElementById("upload-success").innerHTML = "upload success"; + console.log("successfully loaded .draw_curve_from_data/assets/00-01-01-073-05W5-0.LAS") + }, + error : function (XMLHttpRequest, textStatus, errorThrown) { + document.getElementById("upload-success").innerHTML = "upload failure"; + console.log("error in function readInLASFromASSETS() : ",textStatus, errorThrown) + } + }); +} + +//// function for "Load into browser memory" button +function readInFilesFunction(){ + //// removes all status spans for uploads + removeInnerHTML("upload-file-info"); + removeInnerHTML("upload-success"); + var files = document.getElementById("files").files; + if (files && files.length !== 0) { + all_files = [] + for (var i = 0, file; file = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + all_files.push(evt.target.result); + } + reader.onerror = function (evt) { + document.getElementById("fileContents").innerHTML = "error reading file"; + } + } + uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = "upload success"; + } + else{ + uploadStatusSpan = document.getElementById("upload-file-info").innerHTML = " "+"upload failure"; + } + //console.log("all_files = ",all_files) +} + + + +function changeMenuBarButtonColorOnConvert(){ + //// CHANGE buttons from gray to blue in top row + var listButtons = document.getElementsByClassName("afterconvert") + console.log("list",list) + var i; + for (i = 0; i < listButtons.length; i++) { + // button.style.backgroundColor = "blue"; + console.log("button",listButtons[i]) + listButtons[i].classList.add("btn-primary") + } +} + +//// Function that calls several other functions involved with converting a new well from las to json +//// updating the global variables as needed, and changing some new DOM elements to reflect the new well data. +//// It calls the las2json(onelas) function found in wellio.js JavaScript file. +function convert_and_startHelpers(){ + //// removes the buttons for the well curves from the previous well if they exist + remove_DOM_children("curveButtons_holder") + //// calls the function that takes a single LAS text file representing a single well and returns an object variable in JSON format for that well. + var single_well_json = las2json(all_files[0]); + // console.log('single_well_json = ',single_well_json) + //// replaces the global variable temp_json with the new well json var single_well_json + temp_json = single_well_json + //// function that looks at temp_json object, finds what curves are present in that well, and makes buttons to draw them using g3.js + addCurveOptionButtons() + //// adds inner html to p for the UWI name of the well in questino that was just loaded and converted + console.log("temp_json['WELL INFORMATION BLOCK'] =", JSON.stringify(temp_json["WELL INFORMATION BLOCK"])) + document.getElementById("which_well").innerHTML = "UWI = "+temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"]; + changeMenuBarButtonColorOnConvert() +} + + +//////////////////////// DISPLAY FUNCTIONS //////////////////////// + + +//// This takes the well files uploaded as las files, treats all of them as text files and prints ALL OF THEM to the DOM. +//// this is different than the json conversion, which at this points only converts and keeps the first well! +function displayFileFunction(){ + var upload_success_span_txt = document.getElementById("upload-success").innerHTML + //// goes into this part of loop if wepbage las is used + if(upload_success_span_txt === "upload success"){ + fileContentsDiv = document.getElementById("fileContents") + var para = document.createElement("P") + var t = document.createTextNode(all_files[0]); + para.appendChild(t); + fileContentsDiv.appendChild(para); + } + //// goes here if las from user's local computer is used + else{ + var files = document.getElementById("files").files + if (files) { + for (var i = 0, file; file = files[i]; i++) { + var reader = new FileReader(); + reader.readAsText(file, "UTF-8"); + reader.onload = function (evt) { + fileContentsDiv = document.getElementById("fileContents") + var para = document.createElement("P") + var t = document.createTextNode(evt.target.result); // Create a text node + para.appendChild(t); + fileContentsDiv.appendChild(para); + } + reader.onerror = function (evt) { + document.getElementById("fileContents").innerHTML = "error reading file"; + } + } + } + } +} + + + +//// function that leverages vkbeuatify library to pretty print the stringified wellio json then puts it into a DOM element so it can be seen by the user +function print_well(){ + document.getElementById("well_json_prettyprint").innerHTML = vkbeautify.json(JSON.stringify(temp_json),1); + console.log('JSON.stringify(temp_json) = ',vkbeautify.json(JSON.stringify(temp_json),4)) +} + +//// function called by convert_and_startHelpers() that looks at the global temp_json object +//// and finds the curve names and adds them as buttons that when clicked draws those curves using g3.js. +//// It calls addSingleCurveButton(div_id,curve_name) for each curve. +function addCurveOptionButtons(){ + /// curveButtons_holder + var div_id = "curveButtons_holder" + var curves_available = Object.keys(temp_json["CURVES"]) + console.log("curves_available = ",curves_available) + for(each_curve in curves_available){ + addSingleCurveButton(div_id,curves_available[each_curve]) + } +} + +//// function called by addCurveOptionButtons() adds Curves buttons that when clicked draws a curve plot using g3.js. +function addSingleCurveButton(div_id,curve_name){ + var node = document.createElement("button"); + node.setAttribute('onclick','draw_curve("'+String(curve_name)+'")') // Create a
  • node + var textnode = document.createTextNode(curve_name); // Create a text node + node.appendChild(textnode); // Append the text to
  • + document.getElementById(div_id).appendChild(node); +} + + +//// function that creates a hidden link that is clicked programatically that uses HTML5 to download the file at that link +//// the two arguments are the UWI string of the global temp_json object, and a stringified version of the entire wellio json object. +//// It calls the download() function found in wellio.js JavaScript file. +function download_test(){ + //console.log("download_test() ","in") + download(temp_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"]+".json", JSON.stringify(temp_json)); +} + +//// Function that takes a filename string and a string (you might have to stringify a json object) +//// and writes into an actual JSON file to be downloaded into your browsers specified download folder. +function download (filename, text) { + var element = document.createElement('a') + element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)) + element.setAttribute('download', filename) + element.style.display = 'none' + document.body.appendChild(element) + element.click() + document.body.removeChild(element) + } + \ No newline at end of file diff --git a/example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_1.js b/example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_1.js new file mode 100644 index 0000000..1f28e14 --- /dev/null +++ b/example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_1.js @@ -0,0 +1,635 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i g.attr("transform", `translate(0,${height - margin.bottom})`).call(d3.axisBottom(x).ticks(width / 80).tickSizeOuter(0)); + yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()); + /////// All variables created above now they are applied below + /////// , some in for loops for multiple curves and areas + + /////// attempt at function for color used in ..... + function colors(data_array){ + color_array = [] + for (let i =0;i 0){ + color_array.push =("blue") + } + else { + color_array.push("green") + } + } + return color_array + } + + //// START to make the firt SVG + const svg = d3.create("svg") + svg.attr("class","first") + svg.attr("width",width) + .attr("height",height); + svg.append("g") + .call(xAxis); + svg.append("g") + .call(yAxis); + /////// throw away code for single curve to plot that will be deleted soon + ///// was here: + //// Code that assumes multiple curves are plotted in same curvebox + if(multipleLines == "yes"){ + for (let k = 0; k < curveNames.length; k++) { + ///// code that creates a line for each Curve in order provided and applies + ///// the color in the color array in order provided + another_line = d3.line().x(d => x(d[curveNames[k]])).y(d => y(d[depth_curve_name])); + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curveColors[k]) + .attr("stroke-width", 1.5) + .attr("stroke-linejoin", "round") + .attr("stroke-linecap", "round") + .attr("d", another_line); + + //// This appends the units on top the curve box. Multiple units are possible. + svg.append("text") + .attr("x", (width / 2)) + .attr("y", 0 + (margin.top -10 )) + .attr("text-anchor", "middle") + .style("font-size", "16px") + .style("text-decoration", "underline") + .text(curveUnit); + } + // define the area filled under the curve + two_curve_fill_flag = "no" + for (let i = 0; i < well_curve_config_template["fill"].length; i++) { + //// + if (well_curve_config_template["fill"][i]["fill"] == "yes"){ + + number_colors = well_curve_config_template["fill"][i]["fillColors"].length + curveName1 = well_curve_config_template["fill"][i]["curveName"] + threshold = -99999999 + fillColor = "gray" + console.log("got inside fill,",curveName1,'number_colors',number_colors) + ////// + + for (let j = 0; j < number_colors; j++) { + console.log("got to start of J loop",j) + area1 = d3.area() + if (number_colors != 0){ + threshold = well_curve_config_template["fill"][i]["cutoffs"][j] + fillColor = well_curve_config_template["fill"][i]["fillColors"][j] + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "left"){ + startFromLeft = well_curve_config_template["margin"]["left"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => startFromLeft) + .defined(d => ((d[curveName1])>threshold)) + .y(d => y(d[depth_curve_name])); + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "right"){ + startFromRight = well_curve_config_template["margin"]["right"] + area1 + .x0(d => x(d[curveName1])) + .x1(d => startFromRight) + .defined(d => ((d[curveName1]) y(d[depth_curve_name])); + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "between"){ + between2Curve = well_curve_config_template["fill"][i]["curve2"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => x(d[between2Curve])) + .defined(d => ((d[curveName1])>threshold)) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill",fillColor) + .attr("fill-opacity",0.8); + ///// + console.log("got to end of J loop",j) + } + } + } + } + return svg.node(); + }, + ///////////////////////////// + CurveBox2:function (well_curve_config_template){ + // function CurveBox2(well_curve_config_template){ + well_curve_config_template = well_curve_config_template[0] + //let div_id = "well_holder" + if(well_curve_config_template["divID"]){div_id = well_curve_config_template["divID"]} + console.log("well_curve_config_template['divID']",well_curve_config_template["divID"]) + let multipleLines = well_curve_config_template["multipleLines"] + let curveNames = well_curve_config_template["curveNames"] + let curveColors = well_curve_config_template["curveColors"] + let curveName = curveNames[0] + let curveColor = curveColors[0] + //// + let curveUnits = ""; + if(well_curve_config_template["curveUnits"]){curveUnits = well_curve_config_template["curveUnits"]} + let data = well_curve_config_template["data"] + let width = well_curve_config_template["width"] + let height = well_curve_config_template["height"] + let margin = well_curve_config_template["margin"] + let depth_curve_name = well_curve_config_template["depth_curve_name"] + //// Calculate depth min and max + let depth_min + if(!depth_min){depth_min = d3.min(data, function(d) { return +d[depth_curve_name];});} + let depth_max + if(!depth_max){depth_max = d3.max(data, function(d) { return +d[depth_curve_name];});} + // Calculate x domain extent for one or more than one curve + let mins = [] + let maxes = [] + for (let i = 0; i < curveNames.length; i++) { + let min_this = d3.min(data, function(d) { return +d[curveNames[i]]}) + let max_this = d3.max(data, function(d) { return +d[curveNames[i]]}) + mins.push(min_this) + maxes.push(max_this) + } + let min_all_curves = d3.min(mins) + let max_all_curves = d3.max(maxes) + //// Calculate Axis & Scales + let x = d3.scaleLinear().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) + let y = d3.scaleLinear().domain([depth_max, depth_min]).nice().range([height - margin.bottom, margin.top]) + let xAxis = g => g.attr("transform", `translate(0,${height - margin.bottom})`).call(d3.axisBottom(x).ticks(width / 80).tickSizeOuter(0)) + let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + /////// All variables created above now they are applied below + /////// , some in for loops for multiple curves and areas + /////// attempt at function for color used in ..... + function colors(data_array){ + let color_array = [] + for (let i =0;i 0){ + color_array.push =("blue") + } + else { + color_array.push("green") + } + } + return color_array + } + const svg = d3.select("#"+div_id).append("svg") + svg.attr("class","first") + svg.attr("width",width) + .attr("height",height); + svg.append("g") + .call(xAxis); + svg.append("g") + .call(yAxis); + /////// throw away code for single curve to plot that will be deleted soon + ///// was here: + //// Code that assumes multiple curves are plotted in same curvebox + if(multipleLines == "yes"){ + for (let k = 0; k < curveNames.length; k++) { + ///// code that creates a line for each Curve in order provided and applies + ///// the color in the color array in order provided + console.log("curveBox2 curveNames[k]",curveNames[k]) + let another_line = d3.line().x(d => x(d[curveNames[k]])).y(d => y(d[depth_curve_name])); + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curveColors[k]) + .attr("stroke-width", 1.5) + .attr("stroke-linejoin", "round") + .attr("stroke-linecap", "round") + .attr("d", another_line); + + //// This appends the units on top the curve box. Multiple units are possible. + svg.append("text") + .attr("x", (width / 2)) + .attr("y", 0 + (margin.top -10 )) + .attr("text-anchor", "middle") + .style("font-size", "16px") + .style("text-decoration", "underline") + .text(curveUnit); + } + // define the area filled under the curve + let two_curve_fill_flag = "no" + for (let i = 0; i < well_curve_config_template["fill"].length; i++) { + //// + if (well_curve_config_template["fill"][i]["fill"] == "yes"){ + let number_colors = well_curve_config_template["fill"][i]["fillColors"].length + let curveName1 = well_curve_config_template["fill"][i]["curveName"] + let threshold = -99999999 + let fillColor = "gray" + ////// + for (let j = 0; j < number_colors; j++) { + console.log("got to start of J loop",j) + let area1 = d3.area() + if (number_colors != 0){ + threshold = well_curve_config_template["fill"][i]["cutoffs"][j] + fillColor = well_curve_config_template["fill"][i]["fillColors"][j] + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "left"){ + let startFromLeft = well_curve_config_template["margin"]["left"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => startFromLeft) + .defined(d => ((d[curveName1])>threshold)) + .y(d => y(d[depth_curve_name])); + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "right"){ + let startFromRight = well_curve_config_template["margin"]["right"] + area1 + .x0(d => x(d[curveName1])) + .x1(d => startFromRight) + .defined(d => ((d[curveName1]) y(d[depth_curve_name])); + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "between"){ + let between2Curve = well_curve_config_template["fill"][i]["curve2"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => x(d[between2Curve])) + .defined(d => ((d[curveName1])>threshold)) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill",fillColor) + .attr("fill-opacity",0.8); + console.log("got to end of J loop",j) + } + } + } + } + // d3.select("#"+div_id).append(svg) + // d3.select("#"+div_id).append('div').html(svg) + console.log("got to bottom of curvebox2 function") + + return svg.node(); + }, + /////// this require wellio! + fileToJSON:function (afile){ + return wellio.las2json(afile) + }, + ///////// + turnFilesIntoTextIntoWellioJSON:function (files_array){ + //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + let logs_in_json = [] + for (let i = 0; i < files_array.length; i++) { + logs_in_json.push(fileToJSON(files_array[i])) + } + return logs_in_json + }, + ////////// + multipleLogPlot:function(divIDstring,templates){ + // function multipleLogPlot(divIDstring,templates){ + //const noSVG = d3.select("#"+divIDstring).selectAll("svg").remove() + //let logs_in_json = turnFilesIntoTextIntoWellioJSON([log]) + let new_templates = [] + for (let i = 0; i < templates.length; i++) { + //let three_things2 = fromJSONofWEllGetThingsForPlotting(logs_in_json[i]) + // let new_data =three_things2["well_log_curves_reformatted_for_d3"] + // template[0]["data"] = new_data + templates[i]["divID"] = divIDstring + new_templates.push(templates[i]) + result = wellioviz.CurveBox2(new_templates[i]) + } + return result + } + + + + +} + +return module.exports}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],2:[function(require,module,exports){ +wellio = require('wellio'); + +las2json = wellio.las2json; + +wellioviz = require("../../dist/index.js") +},{"../../dist/index.js":1,"wellio":3}],3:[function(require,module,exports){ +(function (global){ +!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.commonJsModule=e():"undefined"!=typeof global?global.commonJsModule=e():"undefined"!=typeof self&&(self.commonJsModule=e())}(function(){var define,module,exports;module={exports:(exports={})}; + +// var fs = require('fs'); + +module.exports = { + //// For quick testing when a LAS file isn't handy, use returnThing function + //// It just returns the argument given to it + returnThing: function(onelas){ + return onelas + }, + //// Loads a LAS 2.0 file from local files + loadLAS:function(well_log){ + var file = well_log + var contents = fs.readFileSync(file).toString(); + // var contents = fs.readFileSync('test.LAS', 'utf8'); + return contents + }, + //// Converts a LAS 2.0 file already loaded into memory into a json format + las2json: function(onelas){ + //// var lasjson establishes a blank json for holding las 2.0 data. It will look like the example below: + var lasjson = { + "VERSION INFORMATION":{ + "VERS":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "WRAP":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "WELL INFORMATION BLOCK":{ + "GENERATED":"", + "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_2":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "CURVE INFORMATION BLOCK":{ + "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}, + "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""} + } + , + "PARAMETER INFORMATION":{ + "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "CURVES":{ + "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], + "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], + } + } + //// Some objects in the json were partially populated in the example above to make understanding the format easier. + //// We'll empty them as a first step + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = {}; + //// Within the "blocks" ["CURVE INFORMATION BLOCK","PARAMETER INFORMATION", etc.] there are other objects with repeating keys. + //// The variables below will be the building blocks for each of those objects {}. They are initially populated with empty strings as the values. + var ver_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + var well_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + var curve_info_obj = {"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}; + var param_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + //// The las file is read as a txt file. It will first be split into seperate strings based on "~" character which occurs at the top of each "block" + console.log("onelas = ",onelas) + var split1 = onelas.split("~"); + console.log("split1 = ",split1) + var vers_str = ""; + var well_info_str = ""; + var curve_info_str = ""; + var param_info_str = ""; + var other = ""; + var curve_str = ""; + + //// As the 'OTHER' block may or may not be present, we have to split by '~' and then look for a substring to make sure we have the right block before we put each into a variable. + for(i = 0; i < split1.length; i++){ + if(split1[i].includes("VERSION")){var vers_str = split1[i]} + else if (split1[i].includes("WELL INFORMATION")){well_info_str = split1[i]} + else if (split1[i].includes("CURVE INFORMATION")){curve_info_str = split1[i]} + else if (split1[i].includes("PARAMETER")){param_info_str = split1[i]} + else if (split1[i].includes("OTHER")){other = split1[i]} + else if (split1[i].includes("A DEPTH")){curve_str = split1[i]} + else{console.log("there is a problem, in wellio.js the las2json() function has to many item in the string array created by splitting on '~'. ")} + } + + + //// Working with version block first by splitting it by newline and places each item into an array + //// and taking items of array 1 and 2 for vers and wrap + var vers_line = vers_str.split("\n")[1]; + var wrap_line = vers_str.split("\n")[2]; + //// As version information, well information, and parameter information blocks contain objects with the same keys, we can process them using a loop. + //// function to process objects for ver_info_obj, well_inf_obj, and param_info_obj + //// The splitLineofType1() function takes as argument the prototypical object building block and the array of strings for that block + function splitLineofType1(ver_info_obj,arrayString){ + //// splits string (should be a single line from the LAS text) by ":", takes the first item of the resulting array, and then replaces any " " with "". + var vers_line_1half = arrayString.split(":")[0].replace(" ",""); + //// splits the previous string variable by "." into an array of strings. + var vers_line_1half_array = vers_line_1half.split(".") + //// trimming this so I get "UWI" instead of "UWI " + ver_info_obj["MNEM"] = vers_line_1half_array[0].trim() + var unit_and_data = vers_line_1half_array.slice(1,vers_line_1half_array.length); + var unit_and_data_str = " "; + if (unit_and_data.length > 1){ + unit_and_data_str = unit_and_data[0].toString()+"."+unit_and_data[1].toString(); + } + else{ + unit_and_data_str = unit_and_data.toString() + } + var unit = unit_and_data_str[0,5].trim(); + var data = unit_and_data_str.substring(5,unit_and_data_str.length).trim(); + ver_info_obj["DATA"] = data + ver_info_obj["UNIT"] = unit + //// + if(arrayString.split(":")[1].indexOf("-") !== -1){ + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].split("-")[0].trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = arrayString.split(":")[1].split("-")[1].replace("\r","").trim() + } + else{ + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].replace("\r","").trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = "" + } + return ver_info_obj + }; + lasjson["VERSION INFORMATION"]["WRAP"] = splitLineofType1(Object.assign({}, ver_info_obj),wrap_line); + lasjson["VERSION INFORMATION"]["VERS"] = splitLineofType1(Object.assign({}, ver_info_obj),vers_line); + //// Working with PARAMETER INFORMATION block second by splitting it by newline into an array and taking items after 0,1,2 or [3:] + //// This basically just skips some lines with titles and such + var param_line_array = param_info_str.split("\n").slice(3,); + for(i = 0; i < param_line_array.length; i++){ + //// create one object for parameter line + if(param_line_array[i] != ""){ + var param_obj_inst = splitLineofType1(Object.assign({}, param_info_obj),param_line_array[i]); + lasjson["PARAMETER INFORMATION"][param_obj_inst["MNEM"]] = param_obj_inst + } + } + //// Working with CURVE INFORMATION BLOCK second by splitting it by newline into an array and taking items after 0,1,2 or [3:] + var curve_line_array = curve_info_str.split("\n").slice(3,); + for(i = 0; i < curve_line_array.length; i++){ + //// create one object for parameter line + if(curve_line_array[i] != ""){ + var curve_obj_inst = splitLineofType1(Object.assign({}, curve_info_obj),curve_line_array[i]); + lasjson["CURVE INFORMATION BLOCK"][curve_obj_inst["MNEM"]] = curve_obj_inst + } + } + //// Working with WELL INFORMATION BLOCK second by splitting it by newline into an array and taking items after 0,1,2 or [3:] + var well_line_array = well_info_str.split("\n").slice(3,); + for(i = 0; i < well_line_array.length; i++){ + if(well_line_array[i].includes("Generated")){ + lasjson["WELL INFORMATION BLOCK"]["GENERATED"] = well_line_array[i].replace("\r","").replace("\t"," ").replace("#","") + } + //// create one object for parameter line + else if(well_line_array[i] != ""){ + var well_obj_inst = splitLineofType1(Object.assign({}, well_info_obj),well_line_array[i]); + lasjson["WELL INFORMATION BLOCK"][well_obj_inst["MNEM"]] = well_obj_inst + } + else{ + console.log(" got else ") + } + } + //// Working with CURVES second by splitting it by newline into an array, + //// then using the first line item of that array to find the curve names + //// using those curves names to establish object keys and then interating through the other array items + //// and populating arrays for each key + var curve_str_array = curve_str.split("\n"); + var curve_names_array = []; + var curve_names_array_holder = []; + if(curve_str_array[0][0] === "A"){ + curve_names_array = curve_str_array[0].split(" ") + var last_curv_name_position = curve_names_array.length - 1; + curve_names_array[last_curv_name_position] = curve_names_array[last_curv_name_position].replace("\r","") + console.log("0 curve_names_array = ",curve_names_array) + curve_names_array = curve_names_array.slice(1,curve_names_array.length); + for(i = 0; i < curve_names_array.length; i++){ + if(curve_names_array[i] !== ""){ + console.log("0.5 curve_names_array[i] = ",curve_names_array[i]) + curve_names_array_holder.push(curve_names_array[i]); + lasjson["CURVES"][curve_names_array[i]] = [] + } + } + } + else{console.log("Couldn't find curve names above curves in LAS, check formatting!")} + //// start at position 1 instead of 0 is to avoid the curve names + for(j = 1; j < curve_str_array.length; j++){ + var curve_data_line_array = curve_str_array[j].split(" "); + var counter_of_curve_names = 0; + console.log("curve_data_line_array.length = ",curve_data_line_array.length) + console.log("curve_data_line_array = ",curve_data_line_array) + var last_curv_data_line_position = curve_data_line_array.length - 1; + console.log("curve_data_line_array[last_curv_data_line_position] = ",curve_data_line_array[last_curv_data_line_position]) + curve_data_line_array[last_curv_data_line_position] = curve_data_line_array[last_curv_data_line_position].replace("\r","") + console.log("curve_data_line_array[last_curv_data_line_position] = ",curve_data_line_array[last_curv_data_line_position]) + for(k = 0; k < curve_data_line_array.length; k++){ + if(curve_data_line_array[k] !== ""){ + lasjson["CURVES"][curve_names_array_holder[counter_of_curve_names]].push(curve_data_line_array[k]) + counter_of_curve_names += 1; + } + } + } + console.log(" test: lasjson",lasjson); + return(lasjson) + }, + + //// Given a well already converted into json, returns the available curves + CurveNames: function(well_json){ + var curveNames = Object.keys(well_json["CURVES"]); + return curveNames + }, + //// + VER_block: function(well_json){ + return well_json["VERSION INFORMATION"] + }, + //// Given a well already converted into json, returns the well UWI + UWI: function(well_json){ + return well_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + }, + //// Given a well already converted into json, returns a given curve name in string format + getCurve(well_json,curve){ + if (!well_json["CURVES"][curve]){ + console.log("in getCurve function, that curve does not exist! =",curve) + return "that curve does not exist! see console.log" + + } else { + return well_json["CURVES"][curve] + } + } +} + + + +return module.exports;}); +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[2]); diff --git a/example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_temp.js b/example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_temp.js new file mode 100644 index 0000000..1f28e14 --- /dev/null +++ b/example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_temp.js @@ -0,0 +1,635 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i g.attr("transform", `translate(0,${height - margin.bottom})`).call(d3.axisBottom(x).ticks(width / 80).tickSizeOuter(0)); + yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()); + /////// All variables created above now they are applied below + /////// , some in for loops for multiple curves and areas + + /////// attempt at function for color used in ..... + function colors(data_array){ + color_array = [] + for (let i =0;i 0){ + color_array.push =("blue") + } + else { + color_array.push("green") + } + } + return color_array + } + + //// START to make the firt SVG + const svg = d3.create("svg") + svg.attr("class","first") + svg.attr("width",width) + .attr("height",height); + svg.append("g") + .call(xAxis); + svg.append("g") + .call(yAxis); + /////// throw away code for single curve to plot that will be deleted soon + ///// was here: + //// Code that assumes multiple curves are plotted in same curvebox + if(multipleLines == "yes"){ + for (let k = 0; k < curveNames.length; k++) { + ///// code that creates a line for each Curve in order provided and applies + ///// the color in the color array in order provided + another_line = d3.line().x(d => x(d[curveNames[k]])).y(d => y(d[depth_curve_name])); + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curveColors[k]) + .attr("stroke-width", 1.5) + .attr("stroke-linejoin", "round") + .attr("stroke-linecap", "round") + .attr("d", another_line); + + //// This appends the units on top the curve box. Multiple units are possible. + svg.append("text") + .attr("x", (width / 2)) + .attr("y", 0 + (margin.top -10 )) + .attr("text-anchor", "middle") + .style("font-size", "16px") + .style("text-decoration", "underline") + .text(curveUnit); + } + // define the area filled under the curve + two_curve_fill_flag = "no" + for (let i = 0; i < well_curve_config_template["fill"].length; i++) { + //// + if (well_curve_config_template["fill"][i]["fill"] == "yes"){ + + number_colors = well_curve_config_template["fill"][i]["fillColors"].length + curveName1 = well_curve_config_template["fill"][i]["curveName"] + threshold = -99999999 + fillColor = "gray" + console.log("got inside fill,",curveName1,'number_colors',number_colors) + ////// + + for (let j = 0; j < number_colors; j++) { + console.log("got to start of J loop",j) + area1 = d3.area() + if (number_colors != 0){ + threshold = well_curve_config_template["fill"][i]["cutoffs"][j] + fillColor = well_curve_config_template["fill"][i]["fillColors"][j] + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "left"){ + startFromLeft = well_curve_config_template["margin"]["left"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => startFromLeft) + .defined(d => ((d[curveName1])>threshold)) + .y(d => y(d[depth_curve_name])); + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "right"){ + startFromRight = well_curve_config_template["margin"]["right"] + area1 + .x0(d => x(d[curveName1])) + .x1(d => startFromRight) + .defined(d => ((d[curveName1]) y(d[depth_curve_name])); + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "between"){ + between2Curve = well_curve_config_template["fill"][i]["curve2"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => x(d[between2Curve])) + .defined(d => ((d[curveName1])>threshold)) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill",fillColor) + .attr("fill-opacity",0.8); + ///// + console.log("got to end of J loop",j) + } + } + } + } + return svg.node(); + }, + ///////////////////////////// + CurveBox2:function (well_curve_config_template){ + // function CurveBox2(well_curve_config_template){ + well_curve_config_template = well_curve_config_template[0] + //let div_id = "well_holder" + if(well_curve_config_template["divID"]){div_id = well_curve_config_template["divID"]} + console.log("well_curve_config_template['divID']",well_curve_config_template["divID"]) + let multipleLines = well_curve_config_template["multipleLines"] + let curveNames = well_curve_config_template["curveNames"] + let curveColors = well_curve_config_template["curveColors"] + let curveName = curveNames[0] + let curveColor = curveColors[0] + //// + let curveUnits = ""; + if(well_curve_config_template["curveUnits"]){curveUnits = well_curve_config_template["curveUnits"]} + let data = well_curve_config_template["data"] + let width = well_curve_config_template["width"] + let height = well_curve_config_template["height"] + let margin = well_curve_config_template["margin"] + let depth_curve_name = well_curve_config_template["depth_curve_name"] + //// Calculate depth min and max + let depth_min + if(!depth_min){depth_min = d3.min(data, function(d) { return +d[depth_curve_name];});} + let depth_max + if(!depth_max){depth_max = d3.max(data, function(d) { return +d[depth_curve_name];});} + // Calculate x domain extent for one or more than one curve + let mins = [] + let maxes = [] + for (let i = 0; i < curveNames.length; i++) { + let min_this = d3.min(data, function(d) { return +d[curveNames[i]]}) + let max_this = d3.max(data, function(d) { return +d[curveNames[i]]}) + mins.push(min_this) + maxes.push(max_this) + } + let min_all_curves = d3.min(mins) + let max_all_curves = d3.max(maxes) + //// Calculate Axis & Scales + let x = d3.scaleLinear().domain([min_all_curves,max_all_curves]).nice().range([margin.left, width - margin.right]) + let y = d3.scaleLinear().domain([depth_max, depth_min]).nice().range([height - margin.bottom, margin.top]) + let xAxis = g => g.attr("transform", `translate(0,${height - margin.bottom})`).call(d3.axisBottom(x).ticks(width / 80).tickSizeOuter(0)) + let yAxis = g => g.attr("transform", `translate(${margin.left},0)`).call(d3.axisLeft(y)).call(g => g.select(".domain").remove()) + /////// All variables created above now they are applied below + /////// , some in for loops for multiple curves and areas + /////// attempt at function for color used in ..... + function colors(data_array){ + let color_array = [] + for (let i =0;i 0){ + color_array.push =("blue") + } + else { + color_array.push("green") + } + } + return color_array + } + const svg = d3.select("#"+div_id).append("svg") + svg.attr("class","first") + svg.attr("width",width) + .attr("height",height); + svg.append("g") + .call(xAxis); + svg.append("g") + .call(yAxis); + /////// throw away code for single curve to plot that will be deleted soon + ///// was here: + //// Code that assumes multiple curves are plotted in same curvebox + if(multipleLines == "yes"){ + for (let k = 0; k < curveNames.length; k++) { + ///// code that creates a line for each Curve in order provided and applies + ///// the color in the color array in order provided + console.log("curveBox2 curveNames[k]",curveNames[k]) + let another_line = d3.line().x(d => x(d[curveNames[k]])).y(d => y(d[depth_curve_name])); + svg.append("path") + .datum(data) + .attr("fill", "none") + .attr("stroke", curveColors[k]) + .attr("stroke-width", 1.5) + .attr("stroke-linejoin", "round") + .attr("stroke-linecap", "round") + .attr("d", another_line); + + //// This appends the units on top the curve box. Multiple units are possible. + svg.append("text") + .attr("x", (width / 2)) + .attr("y", 0 + (margin.top -10 )) + .attr("text-anchor", "middle") + .style("font-size", "16px") + .style("text-decoration", "underline") + .text(curveUnit); + } + // define the area filled under the curve + let two_curve_fill_flag = "no" + for (let i = 0; i < well_curve_config_template["fill"].length; i++) { + //// + if (well_curve_config_template["fill"][i]["fill"] == "yes"){ + let number_colors = well_curve_config_template["fill"][i]["fillColors"].length + let curveName1 = well_curve_config_template["fill"][i]["curveName"] + let threshold = -99999999 + let fillColor = "gray" + ////// + for (let j = 0; j < number_colors; j++) { + console.log("got to start of J loop",j) + let area1 = d3.area() + if (number_colors != 0){ + threshold = well_curve_config_template["fill"][i]["cutoffs"][j] + fillColor = well_curve_config_template["fill"][i]["fillColors"][j] + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "left"){ + let startFromLeft = well_curve_config_template["margin"]["left"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => startFromLeft) + .defined(d => ((d[curveName1])>threshold)) + .y(d => y(d[depth_curve_name])); + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "right"){ + let startFromRight = well_curve_config_template["margin"]["right"] + area1 + .x0(d => x(d[curveName1])) + .x1(d => startFromRight) + .defined(d => ((d[curveName1]) y(d[depth_curve_name])); + } + if(well_curve_config_template["fill"][i]["fillDirection"] == "between"){ + let between2Curve = well_curve_config_template["fill"][i]["curve2"] + area1 + .x1(d => x(d[curveName1])) + .x0(d => x(d[between2Curve])) + .defined(d => ((d[curveName1])>threshold)) + .y(d => y(d[depth_curve_name])); + } + svg.append("path") + .datum(data) + .attr("class", "area") + .attr("d", area1) + .attr("stroke", "none") + .attr("fill",fillColor) + .attr("fill-opacity",0.8); + console.log("got to end of J loop",j) + } + } + } + } + // d3.select("#"+div_id).append(svg) + // d3.select("#"+div_id).append('div').html(svg) + console.log("got to bottom of curvebox2 function") + + return svg.node(); + }, + /////// this require wellio! + fileToJSON:function (afile){ + return wellio.las2json(afile) + }, + ///////// + turnFilesIntoTextIntoWellioJSON:function (files_array){ + //// For each well log file, turn into text, then convert text into wellio style JSON using wellio.js + let logs_in_json = [] + for (let i = 0; i < files_array.length; i++) { + logs_in_json.push(fileToJSON(files_array[i])) + } + return logs_in_json + }, + ////////// + multipleLogPlot:function(divIDstring,templates){ + // function multipleLogPlot(divIDstring,templates){ + //const noSVG = d3.select("#"+divIDstring).selectAll("svg").remove() + //let logs_in_json = turnFilesIntoTextIntoWellioJSON([log]) + let new_templates = [] + for (let i = 0; i < templates.length; i++) { + //let three_things2 = fromJSONofWEllGetThingsForPlotting(logs_in_json[i]) + // let new_data =three_things2["well_log_curves_reformatted_for_d3"] + // template[0]["data"] = new_data + templates[i]["divID"] = divIDstring + new_templates.push(templates[i]) + result = wellioviz.CurveBox2(new_templates[i]) + } + return result + } + + + + +} + +return module.exports}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],2:[function(require,module,exports){ +wellio = require('wellio'); + +las2json = wellio.las2json; + +wellioviz = require("../../dist/index.js") +},{"../../dist/index.js":1,"wellio":3}],3:[function(require,module,exports){ +(function (global){ +!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.commonJsModule=e():"undefined"!=typeof global?global.commonJsModule=e():"undefined"!=typeof self&&(self.commonJsModule=e())}(function(){var define,module,exports;module={exports:(exports={})}; + +// var fs = require('fs'); + +module.exports = { + //// For quick testing when a LAS file isn't handy, use returnThing function + //// It just returns the argument given to it + returnThing: function(onelas){ + return onelas + }, + //// Loads a LAS 2.0 file from local files + loadLAS:function(well_log){ + var file = well_log + var contents = fs.readFileSync(file).toString(); + // var contents = fs.readFileSync('test.LAS', 'utf8'); + return contents + }, + //// Converts a LAS 2.0 file already loaded into memory into a json format + las2json: function(onelas){ + //// var lasjson establishes a blank json for holding las 2.0 data. It will look like the example below: + var lasjson = { + "VERSION INFORMATION":{ + "VERS":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "WRAP":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "WELL INFORMATION BLOCK":{ + "GENERATED":"", + "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_2":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "CURVE INFORMATION BLOCK":{ + "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}, + "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""} + } + , + "PARAMETER INFORMATION":{ + "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "CURVES":{ + "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], + "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], + } + } + //// Some objects in the json were partially populated in the example above to make understanding the format easier. + //// We'll empty them as a first step + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = {}; + //// Within the "blocks" ["CURVE INFORMATION BLOCK","PARAMETER INFORMATION", etc.] there are other objects with repeating keys. + //// The variables below will be the building blocks for each of those objects {}. They are initially populated with empty strings as the values. + var ver_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + var well_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + var curve_info_obj = {"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}; + var param_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + //// The las file is read as a txt file. It will first be split into seperate strings based on "~" character which occurs at the top of each "block" + console.log("onelas = ",onelas) + var split1 = onelas.split("~"); + console.log("split1 = ",split1) + var vers_str = ""; + var well_info_str = ""; + var curve_info_str = ""; + var param_info_str = ""; + var other = ""; + var curve_str = ""; + + //// As the 'OTHER' block may or may not be present, we have to split by '~' and then look for a substring to make sure we have the right block before we put each into a variable. + for(i = 0; i < split1.length; i++){ + if(split1[i].includes("VERSION")){var vers_str = split1[i]} + else if (split1[i].includes("WELL INFORMATION")){well_info_str = split1[i]} + else if (split1[i].includes("CURVE INFORMATION")){curve_info_str = split1[i]} + else if (split1[i].includes("PARAMETER")){param_info_str = split1[i]} + else if (split1[i].includes("OTHER")){other = split1[i]} + else if (split1[i].includes("A DEPTH")){curve_str = split1[i]} + else{console.log("there is a problem, in wellio.js the las2json() function has to many item in the string array created by splitting on '~'. ")} + } + + + //// Working with version block first by splitting it by newline and places each item into an array + //// and taking items of array 1 and 2 for vers and wrap + var vers_line = vers_str.split("\n")[1]; + var wrap_line = vers_str.split("\n")[2]; + //// As version information, well information, and parameter information blocks contain objects with the same keys, we can process them using a loop. + //// function to process objects for ver_info_obj, well_inf_obj, and param_info_obj + //// The splitLineofType1() function takes as argument the prototypical object building block and the array of strings for that block + function splitLineofType1(ver_info_obj,arrayString){ + //// splits string (should be a single line from the LAS text) by ":", takes the first item of the resulting array, and then replaces any " " with "". + var vers_line_1half = arrayString.split(":")[0].replace(" ",""); + //// splits the previous string variable by "." into an array of strings. + var vers_line_1half_array = vers_line_1half.split(".") + //// trimming this so I get "UWI" instead of "UWI " + ver_info_obj["MNEM"] = vers_line_1half_array[0].trim() + var unit_and_data = vers_line_1half_array.slice(1,vers_line_1half_array.length); + var unit_and_data_str = " "; + if (unit_and_data.length > 1){ + unit_and_data_str = unit_and_data[0].toString()+"."+unit_and_data[1].toString(); + } + else{ + unit_and_data_str = unit_and_data.toString() + } + var unit = unit_and_data_str[0,5].trim(); + var data = unit_and_data_str.substring(5,unit_and_data_str.length).trim(); + ver_info_obj["DATA"] = data + ver_info_obj["UNIT"] = unit + //// + if(arrayString.split(":")[1].indexOf("-") !== -1){ + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].split("-")[0].trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = arrayString.split(":")[1].split("-")[1].replace("\r","").trim() + } + else{ + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].replace("\r","").trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = "" + } + return ver_info_obj + }; + lasjson["VERSION INFORMATION"]["WRAP"] = splitLineofType1(Object.assign({}, ver_info_obj),wrap_line); + lasjson["VERSION INFORMATION"]["VERS"] = splitLineofType1(Object.assign({}, ver_info_obj),vers_line); + //// Working with PARAMETER INFORMATION block second by splitting it by newline into an array and taking items after 0,1,2 or [3:] + //// This basically just skips some lines with titles and such + var param_line_array = param_info_str.split("\n").slice(3,); + for(i = 0; i < param_line_array.length; i++){ + //// create one object for parameter line + if(param_line_array[i] != ""){ + var param_obj_inst = splitLineofType1(Object.assign({}, param_info_obj),param_line_array[i]); + lasjson["PARAMETER INFORMATION"][param_obj_inst["MNEM"]] = param_obj_inst + } + } + //// Working with CURVE INFORMATION BLOCK second by splitting it by newline into an array and taking items after 0,1,2 or [3:] + var curve_line_array = curve_info_str.split("\n").slice(3,); + for(i = 0; i < curve_line_array.length; i++){ + //// create one object for parameter line + if(curve_line_array[i] != ""){ + var curve_obj_inst = splitLineofType1(Object.assign({}, curve_info_obj),curve_line_array[i]); + lasjson["CURVE INFORMATION BLOCK"][curve_obj_inst["MNEM"]] = curve_obj_inst + } + } + //// Working with WELL INFORMATION BLOCK second by splitting it by newline into an array and taking items after 0,1,2 or [3:] + var well_line_array = well_info_str.split("\n").slice(3,); + for(i = 0; i < well_line_array.length; i++){ + if(well_line_array[i].includes("Generated")){ + lasjson["WELL INFORMATION BLOCK"]["GENERATED"] = well_line_array[i].replace("\r","").replace("\t"," ").replace("#","") + } + //// create one object for parameter line + else if(well_line_array[i] != ""){ + var well_obj_inst = splitLineofType1(Object.assign({}, well_info_obj),well_line_array[i]); + lasjson["WELL INFORMATION BLOCK"][well_obj_inst["MNEM"]] = well_obj_inst + } + else{ + console.log(" got else ") + } + } + //// Working with CURVES second by splitting it by newline into an array, + //// then using the first line item of that array to find the curve names + //// using those curves names to establish object keys and then interating through the other array items + //// and populating arrays for each key + var curve_str_array = curve_str.split("\n"); + var curve_names_array = []; + var curve_names_array_holder = []; + if(curve_str_array[0][0] === "A"){ + curve_names_array = curve_str_array[0].split(" ") + var last_curv_name_position = curve_names_array.length - 1; + curve_names_array[last_curv_name_position] = curve_names_array[last_curv_name_position].replace("\r","") + console.log("0 curve_names_array = ",curve_names_array) + curve_names_array = curve_names_array.slice(1,curve_names_array.length); + for(i = 0; i < curve_names_array.length; i++){ + if(curve_names_array[i] !== ""){ + console.log("0.5 curve_names_array[i] = ",curve_names_array[i]) + curve_names_array_holder.push(curve_names_array[i]); + lasjson["CURVES"][curve_names_array[i]] = [] + } + } + } + else{console.log("Couldn't find curve names above curves in LAS, check formatting!")} + //// start at position 1 instead of 0 is to avoid the curve names + for(j = 1; j < curve_str_array.length; j++){ + var curve_data_line_array = curve_str_array[j].split(" "); + var counter_of_curve_names = 0; + console.log("curve_data_line_array.length = ",curve_data_line_array.length) + console.log("curve_data_line_array = ",curve_data_line_array) + var last_curv_data_line_position = curve_data_line_array.length - 1; + console.log("curve_data_line_array[last_curv_data_line_position] = ",curve_data_line_array[last_curv_data_line_position]) + curve_data_line_array[last_curv_data_line_position] = curve_data_line_array[last_curv_data_line_position].replace("\r","") + console.log("curve_data_line_array[last_curv_data_line_position] = ",curve_data_line_array[last_curv_data_line_position]) + for(k = 0; k < curve_data_line_array.length; k++){ + if(curve_data_line_array[k] !== ""){ + lasjson["CURVES"][curve_names_array_holder[counter_of_curve_names]].push(curve_data_line_array[k]) + counter_of_curve_names += 1; + } + } + } + console.log(" test: lasjson",lasjson); + return(lasjson) + }, + + //// Given a well already converted into json, returns the available curves + CurveNames: function(well_json){ + var curveNames = Object.keys(well_json["CURVES"]); + return curveNames + }, + //// + VER_block: function(well_json){ + return well_json["VERSION INFORMATION"] + }, + //// Given a well already converted into json, returns the well UWI + UWI: function(well_json){ + return well_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + }, + //// Given a well already converted into json, returns a given curve name in string format + getCurve(well_json,curve){ + if (!well_json["CURVES"][curve]){ + console.log("in getCurve function, that curve does not exist! =",curve) + return "that curve does not exist! see console.log" + + } else { + return well_json["CURVES"][curve] + } + } +} + + + +return module.exports;}); +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[2]); diff --git a/example_deployments/example_panel_app/templates/js/old_for_reference/call_plots_old.js b/example_deployments/example_panel_app/templates/js/old_for_reference/call_plots_old.js new file mode 100644 index 0000000..f11d586 --- /dev/null +++ b/example_deployments/example_panel_app/templates/js/old_for_reference/call_plots_old.js @@ -0,0 +1,111 @@ +// well_curve_config_template = [ +// {"multipleLines":"yes","curveNames":["GR"], +// "curveColors":["black","pink"], +// "fill":[ +// {"curveName":"GR","fill":"yes","fillDirection":"left","cutoffs":[0,ShaleSiltCutOff,SiltSandCutOff],"fillColors":["gray","orange","yellow"],"curve2":""}, +// {"curveName":"RESD","fill":"no","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} +// ], +// "data":well_log_converted_to_d3_friendly, +// "width":200, +// "height":400, +// "margin":({top: 20, right: 3, bottom: 30, left: 30}), +// "depth_curve_name":"DEPTH"}] + + + +function makePlot(single_curve,div,height,width,domain_x,domain_y,curve_name){ + // "#log_plot_div" + var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() + console.log("got to second part of makePlot2 and b2 = ",b2) + g3.log(b2,single_curve).draw() + console.log("got to second part of makePlot2 and b2 = ",b2) + +} + +function makePlot2(single_curve,div,height,width,domain_x,domain_y,curve_name){ + // "#log_plot_div" + // var div = "dl_trial_a" + var b2=g3.plot(div).height(height).width(width).xDomain(domain_x).yDomain([0,single_curve.length]).xTitle(curve_name).draw() + console.log("1 got to second part of makePlot2 and b2 = ",b2) + g3.log(b2,single_curve).draw() + console.log("2 got to second part of makePlot2 and b2 = ",b2) + +} + +function draw_curveG3(curve,div){ + if(!div){div = "#log_plot_div"} + if(!curve){ + curve = "GR"; + console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) + } + console.log("curve = ",curve) + var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] + makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) +} + +function reformatJSONforPlotting(temp_json,curve,div){ + generic_template = [ + {"multipleLines":"yes", + "curveNames":[curve], + "curveColors":["black","pink"], + "fill":[ + {"curveName":curve,"fill":"yes","fillDirection":"left","cutoffs":[0,65,75,89],"fillColors":["lightgreen","green","red","pink"],"curve2":""}, + {"curveName":"PHID","fill":"yes","fillDirection":"left","cutoffs":[],"fillColors":[],"curve2":""} + ], + "data":"data_goes_here_once_formatted", + "width":250, + "height":600, + "margin":({top: 20, right: 3, bottom: 30, left: 30}), + "depth_curve_name":"DEPTH", + "divID":div + }] + /////////// + wellDataForPlotting = wellioviz.fromJSONofWEllGetThingsForPlotting(temp_json) + curveDataFormatted = wellDataForPlotting["well_log_curves_reformatted_for_d3"] + curve_names = wellDataForPlotting["curve_names"] + uwi = wellDataForPlotting["uwi"] + console.log("curveDataFormatted in function draw_curve() ",curveDataFormatted) + console.log("curveName in template generic_template['curveNames']:",generic_template[0]["curveNames"]) + ////////// + generic_template[0]["data"] = curveDataFormatted + new_generic_template = generic_template + return new_generic_template +} + +function draw_curve(curve,div){ + if(!div){div = "log_plot_div"} + if(!curve){ + curve = "GR"; + console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) + } + console.log("curve = ",curve) + ///var domain_x = [Math.min.apply(null, temp_json["CURVES"][curve]),Math.max.apply(null, temp_json["CURVES"][curve])] + ///makePlot(temp_json["CURVES"][curve],div,600,250,domain_x,[0,temp_json["CURVES"][curve].length],curve) + + ///////// + console.log("generic_template:",reformatJSONforPlotting(temp_json)) + result = wellioviz.multipleLogPlot(div,[reformatJSONforPlotting(temp_json,curve,div)]) + console.log("curve plot should be present now... the template supplied is:",result) +} + +function draw_curve_from_data(curve,div,curve_name){ + // if(!div){div = "#log_plot_div"} + // if(!curve){ + // curve = "GR"; + // console.log("temp_json['CURVES'][curve] = ",temp_json["CURVES"]["GR"]) + // } + // if(!curve_name){curve_name = "unknown curve"} + // var curve = temp_json["CURVES"]["GR"] + var curve = Array.from(curve) + //var curve = "GR" + var div = "#dl_trial_a"; + var curve_name = "GR"; + console.log("curve = ",curve); + console.log("div = ",div); + console.log("curve_name = ",curve_name); + + // var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] + // makePlot2(curve,div,600,250,domain_x,[0,curve.length],curve_name) + var domain_x = [Math.min.apply(null, curve),Math.max.apply(null, curve)] + makePlot(curve,div,600,250,domain_x,[0,curve.length],curve_name) +} \ No newline at end of file diff --git a/example_deployments/example_panel_app/templates/js/vkbeautify.js b/example_deployments/example_panel_app/templates/js/vkbeautify.js new file mode 100644 index 0000000..7af7581 --- /dev/null +++ b/example_deployments/example_panel_app/templates/js/vkbeautify.js @@ -0,0 +1,356 @@ +/** +* vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. +* +* Version - 0.99.00.beta +* Copyright (c) 2012 Vadim Kiryukhin +* vkiryukhin @ gmail.com +* http://www.eslinstructor.net/vkbeautify/ +* +* MIT license: +* http://www.opensource.org/licenses/mit-license.php +* +* Pretty print +* +* vkbeautify.xml(text [,indent_pattern]); +* vkbeautify.json(text [,indent_pattern]); +* vkbeautify.css(text [,indent_pattern]); +* vkbeautify.sql(text [,indent_pattern]); +* +* @text - String; text to beatufy; +* @indent_pattern - Integer | String; +* Integer: number of white spaces; +* String: character string to visualize indentation ( can also be a set of white spaces ) +* Minify +* +* vkbeautify.xmlmin(text [,preserve_comments]); +* vkbeautify.jsonmin(text); +* vkbeautify.cssmin(text [,preserve_comments]); +* vkbeautify.sqlmin(text); +* +* @text - String; text to minify; +* @preserve_comments - Bool; [optional]; +* Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. ) +* +* Examples: +* vkbeautify.xml(text); // pretty print XML +* vkbeautify.json(text, 4 ); // pretty print JSON +* vkbeautify.css(text, '. . . .'); // pretty print CSS +* vkbeautify.sql(text, '----'); // pretty print SQL +* +* vkbeautify.xmlmin(text, true);// minify XML, preserve comments +* vkbeautify.jsonmin(text);// minify JSON +* vkbeautify.cssmin(text);// minify CSS, remove comments ( default ) +* vkbeautify.sqlmin(text);// minify SQL +* +*/ + +(function() { + + function createShiftArr(step) { + + var space = ' '; + + if ( isNaN(parseInt(step)) ) { // argument is string + space = step; + } else { // argument is integer + switch(step) { + case 1: space = ' '; break; + case 2: space = ' '; break; + case 3: space = ' '; break; + case 4: space = ' '; break; + case 5: space = ' '; break; + case 6: space = ' '; break; + case 7: space = ' '; break; + case 8: space = ' '; break; + case 9: space = ' '; break; + case 10: space = ' '; break; + case 11: space = ' '; break; + case 12: space = ' '; break; + } + } + + var shift = ['\n']; // array of shifts + for(ix=0;ix<100;ix++){ + shift.push(shift[ix]+space); + } + return shift; + } + + function vkbeautify(){ + this.step = '\t'; // 4 spaces + this.shift = createShiftArr(this.step); + }; + + vkbeautify.prototype.xml = function(text,step) { + + var ar = text.replace(/>\s{0,}<") + .replace(/ or -1) { + str += shift[deep]+ar[ix]; + inComment = true; + // end comment or // + if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1 || ar[ix].search(/!DOCTYPE/) > -1 ) { + inComment = false; + } + } else + // end comment or // + if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1) { + str += ar[ix]; + inComment = false; + } else + // // + if( /^<\w/.exec(ar[ix-1]) && /^<\/\w/.exec(ar[ix]) && + /^<[\w:\-\.\,]+/.exec(ar[ix-1]) == /^<\/[\w:\-\.\,]+/.exec(ar[ix])[0].replace('/','')) { + str += ar[ix]; + if(!inComment) deep--; + } else + // // + if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) == -1 && ar[ix].search(/\/>/) == -1 ) { + str = !inComment ? str += shift[deep++]+ar[ix] : str += ar[ix]; + } else + // ... // + if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) > -1) { + str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; + } else + // // + if(ar[ix].search(/<\//) > -1) { + str = !inComment ? str += shift[--deep]+ar[ix] : str += ar[ix]; + } else + // // + if(ar[ix].search(/\/>/) > -1 ) { + str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; + } else + // // + if(ar[ix].search(/<\?/) > -1) { + str += shift[deep]+ar[ix]; + } else + // xmlns // + if( ar[ix].search(/xmlns\:/) > -1 || ar[ix].search(/xmlns\=/) > -1) { + str += shift[deep]+ar[ix]; + } + + else { + str += ar[ix]; + } + } + + return (str[0] == '\n') ? str.slice(1) : str; + } + + vkbeautify.prototype.json = function(text,step) { + + var step = step ? step : this.step; + + if (typeof JSON === 'undefined' ) return text; + + if ( typeof text === "string" ) return JSON.stringify(JSON.parse(text), null, step); + if ( typeof text === "object" ) return JSON.stringify(text, null, step); + + return text; // text is not string nor object + } + + vkbeautify.prototype.css = function(text, step) { + + var ar = text.replace(/\s{1,}/g,' ') + .replace(/\{/g,"{~::~") + .replace(/\}/g,"~::~}~::~") + .replace(/\;/g,";~::~") + .replace(/\/\*/g,"~::~/*") + .replace(/\*\//g,"*/~::~") + .replace(/~::~\s{0,}~::~/g,"~::~") + .split('~::~'), + len = ar.length, + deep = 0, + str = '', + ix = 0, + shift = step ? createShiftArr(step) : this.shift; + + for(ix=0;ix/g,"") + .replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns'); + return str.replace(/>\s{0,}<"); + } + + vkbeautify.prototype.jsonmin = function(text) { + + if (typeof JSON === 'undefined' ) return text; + + return JSON.stringify(JSON.parse(text), null, 0); + + } + + vkbeautify.prototype.cssmin = function(text, preserveComments) { + + var str = preserveComments ? text + : text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"") ; + + return str.replace(/\s{1,}/g,' ') + .replace(/\{\s{1,}/g,"{") + .replace(/\}\s{1,}/g,"}") + .replace(/\;\s{1,}/g,";") + .replace(/\/\*\s{1,}/g,"/*") + .replace(/\*\/\s{1,}/g,"*/"); + } + + vkbeautify.prototype.sqlmin = function(text) { + return text.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")"); + } + + window.vkbeautify = new vkbeautify(); + + })(); \ No newline at end of file diff --git a/example_deployments/example_panel_app/templates/main.js b/example_deployments/example_panel_app/templates/main.js new file mode 100644 index 0000000..a173e98 --- /dev/null +++ b/example_deployments/example_panel_app/templates/main.js @@ -0,0 +1,2 @@ +say_hi() +plot_log("current_log") diff --git a/example_deployments/example_panel_app/templates/styles.css b/example_deployments/example_panel_app/templates/styles.css new file mode 100644 index 0000000..345850e --- /dev/null +++ b/example_deployments/example_panel_app/templates/styles.css @@ -0,0 +1 @@ +body { background: #111122; } \ No newline at end of file diff --git a/panel_test_app/00-01-11-082-23W4-0.LAS b/example_standalone_webpage/00-01-11-082-23W4-0.LAS similarity index 100% rename from panel_test_app/00-01-11-082-23W4-0.LAS rename to example_standalone_webpage/00-01-11-082-23W4-0.LAS diff --git a/panel_test_app/00_01-01-073-05W5_0-1.json b/example_standalone_webpage/00_01-01-073-05W5_0-1.json similarity index 100% rename from panel_test_app/00_01-01-073-05W5_0-1.json rename to example_standalone_webpage/00_01-01-073-05W5_0-1.json diff --git a/example_standalone_webpage/make_a_plot.js b/example_standalone_webpage/make_a_plot.js new file mode 100644 index 0000000..a973cc5 --- /dev/null +++ b/example_standalone_webpage/make_a_plot.js @@ -0,0 +1,59 @@ +async function plot_log(div_id) { + let ShaleSiltCutOff = 80 + let SiltSandCutOff = 55 + var fileUrltoWellLog = "https://gist.githubusercontent.com/JustinGOSSES/2685e588d5c2f2a0ba1591ec7b9c9421/raw/415fe8a2f27dc7621f06f60ffd40a62c0d55a0f0/00-01-01-095-19W4-0.las" + var fetched = await fetch(fileUrltoWellLog) + var well_as_string = await fetched.text() + var well_json_01_01_095_19W4 = wellio.las2json(well_as_string) + let depth_curve_name = "DEPT" + let three_things_2 = wellioviz.fromJSONofWEllGetThingsForPlotting(well_json_01_01_095_19W4, depth_curve_name) + let curve_names2 = Array(6) ["DEPT", "GR", "CALI", "NPHI", "DPHI", "ILD"] + let uwi2 = "00/01-01-095-19W4/0" + let well_log_curves_reformatted_for_d3_2 = three_things_2["well_log_curves_reformatted_for_d3"] + var example_template = wellioviz.curveBoxTemplateExamples("example") + var gr_plot_template_noFill = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ["CALI"], ["black"], [""], [ + { + "curve_name": "GR", + "fill": "no", + "fill_direction": "left", + "cutoffs": [0, ShaleSiltCutOff, SiltSandCutOff], + "fill_colors": ["gray", "orange", "yellow"], + "curve2": "" + }], "well_holder_1A", 200, 700, "DEPT") + var resd_plot_template_1 = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ['ILD'], ["RED"], [""], [ + { + "curve_name": "ILD", + "fill": "yes", + "fill_direction": "left", + "cutoffs": [5, 10, 25], + "fill_colors": ["#ffe6e6", "#ffb3b3", "red"], + "curve2": "ILD" + }], "well_holder_1B", 200, 700, "DEPT") + var poro_plot_template_1 = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ["NPHI", "DPHI"], ["purple", "pink"], [""], [{ + "curve_name": "NPHI", + "fill": "yes", + "fill_direction": "between", + "cutoffs": [0], + "fill_colors": ["lightblue"], + "curve2": "DPHI" + }, + { + "curve_name": "DPHI", + "fill": "no", + "fill_direction": "left", + "cutoffs": [], + "fill_colors": [], + "curve2": "" + } + ], "well_holder_1C", 200, 700, "DEPT") + var gr_plot_template_1 = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ["GR"], ["black"], [""], + [{ + "curve_name": "GR", + "fill": "yes", + "fill_direction": "right", + "cutoffs": [0, ShaleSiltCutOff, SiltSandCutOff], + "fill_colors": ["yellow", "orange", "gray"], + "curve2": "" + }], "well_holder_1D", 200, 700, "DEPT") + wellioviz.multipleLogPlot(div_id, [gr_plot_template_noFill, gr_plot_template_1, resd_plot_template_1, poro_plot_template_1], true) +} \ No newline at end of file diff --git a/example_standalone_webpage/static/test_bokeh.js b/example_standalone_webpage/static/test_bokeh.js new file mode 100644 index 0000000..bfd9df9 --- /dev/null +++ b/example_standalone_webpage/static/test_bokeh.js @@ -0,0 +1,4 @@ +function print_hi() { + console.log('Hi!') + +} \ No newline at end of file diff --git a/panel_test_app/well_log_viz/curve_box.js b/example_standalone_webpage/well_log_viz/curve_box.js similarity index 100% rename from panel_test_app/well_log_viz/curve_box.js rename to example_standalone_webpage/well_log_viz/curve_box.js diff --git a/panel_test_app/well_log_viz/d3.js b/example_standalone_webpage/well_log_viz/d3.js similarity index 100% rename from panel_test_app/well_log_viz/d3.js rename to example_standalone_webpage/well_log_viz/d3.js diff --git a/panel_test_app/well_log_viz/format_template.js b/example_standalone_webpage/well_log_viz/format_template.js similarity index 100% rename from panel_test_app/well_log_viz/format_template.js rename to example_standalone_webpage/well_log_viz/format_template.js diff --git a/panel_test_app/well_log_viz/single_well_log_display.js b/example_standalone_webpage/well_log_viz/single_well_log_display.js similarity index 100% rename from panel_test_app/well_log_viz/single_well_log_display.js rename to example_standalone_webpage/well_log_viz/single_well_log_display.js diff --git a/panel_test_app/well_log_viz/test_log.html b/example_standalone_webpage/well_log_viz/test_log.html similarity index 100% rename from panel_test_app/well_log_viz/test_log.html rename to example_standalone_webpage/well_log_viz/test_log.html diff --git a/panel_test_app/well_log_viz/test_log.json b/example_standalone_webpage/well_log_viz/test_log.json similarity index 100% rename from panel_test_app/well_log_viz/test_log.json rename to example_standalone_webpage/well_log_viz/test_log.json diff --git a/panel_test_app/well_viz_html.html b/example_standalone_webpage/well_viz_html.html similarity index 100% rename from panel_test_app/well_viz_html.html rename to example_standalone_webpage/well_viz_html.html diff --git a/panel_test_app/app.py b/panel_test_app/app.py deleted file mode 100644 index e402d06..0000000 --- a/panel_test_app/app.py +++ /dev/null @@ -1,18 +0,0 @@ -import panel as pn - - -if __name__ == "__main__": - - # css_files=['https://api.tiles.mapbox.com/mapbox-gl-js/v0.44.1/mapbox-gl.css']) - current_file = __file__.split('/') - docs_files = current_file[:-2] - main_dir = current_file[:-2] - docs_files.append('docs') - docs_path = '/'.join(docs_files) - main_dir = '/'.join(main_dir) - with open(docs_path + '/well_viz_html.html', 'r', encoding='utf-8') as html_file: - index_html = html_file.read() - pn.extension('d3', js_files={'wellio': main_dir + '/dist/index.js'}) - main_column = pn.Column(width=900) - main_column.append(pn.panel(index_html)) - main_column.show() diff --git a/panel_test_app/panel_idx.html b/panel_test_app/panel_idx.html deleted file mode 100644 index dfd8f6d..0000000 --- a/panel_test_app/panel_idx.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    "HELLO!"

    -

    Smaller Header

    -
    - - - - - - - From c4080c3752e6675b1cc70899c8040a7d681b3c55 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Tue, 9 Jun 2020 06:02:43 -0700 Subject: [PATCH 08/17] updated the index.html for the example panel app --- .../example_panel_app/templates/index.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/example_deployments/example_panel_app/templates/index.html b/example_deployments/example_panel_app/templates/index.html index 5902ef0..3d1764f 100644 --- a/example_deployments/example_panel_app/templates/index.html +++ b/example_deployments/example_panel_app/templates/index.html @@ -3,15 +3,15 @@ Title - - - - - + + + + + {{ bokeh_css }} {{ bokeh_js }} - + ")) +print('trying to add to doc') +main_column.servable() +doc = curdoc() diff --git a/example_deployments/example_panel_app/static/css/main.css b/examples/deployments/example_panel_app/static/css/main.css similarity index 100% rename from example_deployments/example_panel_app/static/css/main.css rename to examples/deployments/example_panel_app/static/css/main.css diff --git a/example_deployments/example_panel_app/static/js/make_a_plot.js b/examples/deployments/example_panel_app/static/js/make_a_plot.js similarity index 100% rename from example_deployments/example_panel_app/static/js/make_a_plot.js rename to examples/deployments/example_panel_app/static/js/make_a_plot.js diff --git a/example_deployments/example_panel_app/static/js/test_bokeh.js b/examples/deployments/example_panel_app/static/js/test_bokeh.js similarity index 100% rename from example_deployments/example_panel_app/static/js/test_bokeh.js rename to examples/deployments/example_panel_app/static/js/test_bokeh.js diff --git a/examples/deployments/example_panel_app/static/js/wellio/LICENSE b/examples/deployments/example_panel_app/static/js/wellio/LICENSE new file mode 100644 index 0000000..92e3d7d --- /dev/null +++ b/examples/deployments/example_panel_app/static/js/wellio/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Justin Gosses + +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. diff --git a/examples/deployments/example_panel_app/static/js/wellio/README.md b/examples/deployments/example_panel_app/static/js/wellio/README.md new file mode 100644 index 0000000..757faf8 --- /dev/null +++ b/examples/deployments/example_panel_app/static/js/wellio/README.md @@ -0,0 +1,221 @@ +# wellio.js +#### JavaScript for converting well-log standard .las file format to json format and then back again. + +[![DOI](https://zenodo.org/badge/116549236.svg)](https://zenodo.org/badge/latestdoi/116549236) + +[![NPM](https://nodei.co/npm/wellio.png?compact=true)](https://npmjs.org/package/wellio) + +## Purpose + There currently isn't any .las -> JSON parser that I was able to find. There is lasio and welly for python, but nothing to ingest las files in JavaScript. Wellio.js is an attempt to fill that gap, so I can build other stuff. Once you have well data as JSON, many other JavaScript-based things as possible. I'll try to keep those other things separate, except as demos for Wellio. + +## Contributors: +- https://github.com/JustinGOSSES +- https://github.com/dcslagel + +## Does this upload my well logs to your server? +Nope, it only loads to your browser's memory and then your browser forgets it when you close the tab. + +## Can I see the demo right now? +Yes, there are several options. +#### 1. Github pages demo page: +Open the demo page running on github pages. Click one of the big blue buttons up top to open a file loader. You can either use a LAS files already part of the webpage or you can load a local LAS file from your computer. + +If you want to test the 'load local file' feature and don't have any local LAS files, you can quickly get one by going to this link and saving the results to a ".las" file using your browser. That is a raw las file for well UWI 00-01-01-073-05W5-0. + +#### 2. ObservableHQ demo page: +ObservableHQ is new way to explore and play with JavaScript code. Think Jupyter notebook but in a more reactive and interactive form. It runs JavaScript code instead of Python/Julia/R. I've created a notebook on there with the same functionality as the demo but with visualizations using Vega instead of g3.js & d3.js. This demo uses syntax of +`wellio = require(wellio)` +to call the sever-side wellio npm module functions in the browser. There is also this demo on OBservable that loads a LAS file directly. + +#### 3. Jupyter Notebook Node.js demo +Wellio can also be worked with in a jupyter notebook running a node.js kernal. + +#### 4. Jupyter Notebook running Python that uses node.js for a couple cells via Pixiedust library +[This is coming. Currently an issue that needs help]. This will demonstrate a use-case where you want to manipulate LAS data in python but find it easier to visualize the data from a JSON format, likely using JavaScript data visaulization tooling. + +## Code Organization Summary + +There are currently separate front-end and back-end javascript versions of wellio. Eventually, they will merge. + +#### Server-side +The server-side wellio can be found in the dist folder. You can install it locally via `npm install wellio` as described on the npm homepage here. You can also call this via require(wellio) in ObservableHQ as described in the ObservableHQ demo above. + +##### Wellio functions currently working include: +- returnThing: A testing function that returns anything provided to it. + `wellio.returnThing("test")` = "test" +- loadLAS: A function that takes an argument of the well log name as a string, finds that file in the local file system and returns it as a string of text. + `var well_string = wellio.loadLAS("00/01-01-073-05W5/0.LAS")` +- las2json: Takes the result of loadLAS or another text string, or another LAS file already loaded into memory, and converts it into the wellio json format and returns that json string. + `var well_json = wellio.las2json(well_string)` +- CurveNames: Given a well already converted into json, returns the available curve names as an array. + `var curvesNames = wellio.CurveNames(well_json) ; where curvesNames = ['GR','ILD','PHID']` +- VER_block: Given a well already converted into json, returns verision information block data as a string. + `var VER_block = wellio.VER_block(well_json)` +- UWI: Given a well already converted into json, returns the well UWI as a string. + `var UWI_well_json = wellio.UWI(well_json) ; where UWI_well_json is '00/01-01-073-05W5/0` +- getCurve: Given a well already converted into json and the name of a curve as a string, returns an array of the data values for that curve. + `var GR_well_json = wellio.getCurve(well_json,"GR") ; where GR_well_json is an array of the GR data, for example [99,93,76,55,67,66,67,78]` + +##### Non-wellio fuctions you'll want to know about when using wellio to convert las -> json on command line using node.js +- To start with node.js after installing it type into a command line `node` . +- Once in command line node environment, to start with wellio, you'll have to do `wellio = require('wellio')` After this point, you'll be able to use the commands above. +- After converting a las file to json format with the command `well_json = wellio.las2json(well_string)` as described above you'll have to stringify it first via `well_json_string = JSON.stringify(well_json)` and then write it to a file via `fs.writeFile("UWI_of_Well.json", well_json_string, 'utf8', function (err) {console.log("error")})` + + +#### Front-end side +This repo contains various pieces of code for the github pages demo page. In addition to the the wellio.js JavaScript file in the js folder, there is the index.html, which is the main html page for the github pages demo. + +CSS files are in the CSS folder. + +Several example well logs are in the ASSETS folder. + +G3.js is used to draw a plot of the well log curves. It leverages d3.js. +VKbeautify.js is a script for adding spaces and such to JSON to make them prettier when printed. +run_prettify.js does something similar but is focused on making it print nicely into HTML DOM elements. + + +#### Wellio.js script will have a few basics functions (not all are written yet) +1. las2json(onelas) : Function that takes a single LAS text file representing a single well and returns an object variable in JSON format for that well. +2. download(filename, text): Function that takes a filename and text string and writes a file (either json or las) to your designated downloads folder. + + + +## Road Map +Right now, wellio.js just does LAS -> Wellio JSON. There are variety of features that could be added to increase the functionality of wellio and in particular enable cross-communication with other LAS-focused projects. + +Potential cross-communication conversions include: +1. wellio <-> las files (have the las to wellio direction but need the back again conversion) +2. wellio <-> welly objects (python) +2. wellio <-> lasio (python) +3. wellio json objects -> wellio_plus json objects with wellio_plus being defined as having data and functions that go behind the data in a LAS file. + +Examples of wellio_plus data & functions that could be part of the prototype would be: +- common function calls like max, min, average of each curve, etc. +- pick depths +- geographic location +- age of data acquisition +- non-original curves that are created and used as engineered features for machine-learning. +- other well-centric data points or datasets that might be useful for machine-learning. + +#### Can you help? Of course you can! +There are a variety of issues that need worked. Several of which are suitable for those who are new to JavaScript. Please add any suggestions you'd like or bugs you find to the issues. + +## Where To Get Open-Source Well Logs in .LAS format? +You can use the file upload button to load into your browsers memory any LAS files from your local computer. I've also included a few well logs in the /assets/ folder of this repo from the electronic data file below. + +Electronic data (including well logs, tops, etc.) for Athabasca Oil Sands Data McMurray/Wabiskaw Oil Sands Deposit http://ags.aer.ca/publications/SPE_006.html Data is also in the repo folder: SPE_006_originalData + +Report for Athabasca Oil Sands Data McMurray/Wabiskaw Oil Sands Deposit http://ags.aer.ca/document/OFR/OFR_1994_14.PDF + +### Why Bother? Geologists Use Python... +EDIT: *Long story short, I needed a way to load las files and work with them as json in JavaScript in order to work with them on the web or using web tools* + +### Examples of where it can be used +It can convert LAS files into JSON and then curves can be visualized in three dimensions using three.js as this brief demo on ObservableHQ shows. Once your can make well logs in three.js, it is only a short jump to put them in augmented reality or virtual reality. For example, this repo is a helper library for putting three.js objects into Augmented reality scenes. + +There is also a few Observable notebooks (javascript, online, editable, and forkable by anyone) here and here I've toyed around with that use wellio.js to import well logs and parse the string of the las file into JSON for visualization. + +## Example of LAS format and JSON formated well log data + +### Original las file example +or go here for live example. +``` +~VERSION INFORMATION + VERS. 2.0: CWLS LOG ASCII STANDARD -VERSION 2.0 + WRAP. NO: ONE LINE PER DEPTH STEP +~WELL INFORMATION BLOCK +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ------------------- ------------------------------- +# Generated from Intellog Unique Number CW_73_75/WELL/2722 +WELL. CHEVRON MGSU 1 MITSUE 01-01 : Well_name - WELL +LOC . 00/01-01-073-05W5/0 : Location - LOCATION +UWI . 00/01-01-073-05W5/0 : Uwi - UNIQUE WELL ID +ENTR. JAYE : Entered - ENTERED BY +SRVC. SCHLUMBERGER : Scn - SERVICE COMPANY +DATE. 23 DEC 86 : Date - LOG DATE +STRT.M 390 : top_depth - START DEPTH +STOP.M 650 : bot_depth - STOP DEPTH +STEP.M 0.25 : increment - STEP LENGTH + NULL. -999.2500:NULL Value +~CURVE INFORMATION BLOCK +#MNEM UNIT ERCB CURVE CODE CURVE DESCRIPTION +#----------- ------------------ ---------------------------------- +DEPT.M 00 001 00 00 : DEPTH - DEPTH +DPHI.V/V 00 890 00 00 : PHID - DENSITY POROSITY (SANDSTONE) +NPHI.V/V 00 330 00 00 : PHIN - NEUTRON POROSITY (SANDSTONE) +GR .API 00 310 00 00 : GR - GAMMA RAY +CALI.MM 00 280 01 00 : CAL - CALIPER +ILD .OHMM 00 120 00 00 : RESD - DEEP RESISTIVITY (DIL) +~PARAMETER INFORMATION +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ----------- ------------------------------ +GL .M 583.3 : gl - GROUND LEVEL ELEVATION +EREF.M 589 : kb - ELEVATION OF DEPTH REFERENCE +DATM.M 583.3 : datum - DATUM ELEVATION +TDD .M 733.4 : tdd - TOTAL DEPTH DRILLER +RUN . ONE : Run - RUN NUMBER +ENG . SIMMONS : Engineer - RECORDING ENGINEER +WIT . SANK : Witness - WITNESSED BY +BASE. S.L. : Branch - HOME BASE OF LOGGING UNIT +MUD . GEL CHEM : Mud_type - MUD TYPE +MATR. SANDSTONE : Logunit - NEUTRON MATRIX +TMAX.C 41 : BHT - MAXIMUM RECORDED TEMPERATURE +BHTD.M 733.8 : BHTDEP - MAXIMUM RECORDED TEMPERATURE +RMT .C 17 : MDTP - TEMPERATURE OF MUD +MUDD.KG/M 1100 : MWT - MUD DENSITY +NEUT. 1 : NEUTRON - NEUTRON TYPE +RESI. 0 : RESIST - RESISTIVITY TYPE +RM .OHMM 2.62 : RM - RESISTIVITY OF MUD +RMC .OHMM 0 : RMC - RESISTIVITY OF MUD CAKE +RMF .OHMM 1.02 : RMF - RESISTIVITY OF MUD FILTRATE +SUFT.C 0 : SUFT - SURFACE TEMPERATURE +~A DEPTH PHID PHIN GR CAL RESD + 390.000 0.199 0.457 82.478 238.379 2.923 + 390.250 0.208 0.456 86.413 238.331 2.925 + 390.500 0.246 0.452 90.229 238.069 2.917 + 390.750 0.266 0.475 90.944 238.752 2.898 + 391.000 0.287 0.484 88.866 239.724 2.890 + 391.250 0.288 0.474 82.638 241.951 2.844 + 391.500 0.241 0.461 83.345 244.478 2.748 + 391.750 0.215 0.471 88.403 247.116 2.725 + 392.000 0.190 0.448 91.038 250.475 2.748 + 392.250 0.219 0.478 89.579 254.764 2.845 + 392.500 0.269 0.552 84.092 258.019 2.939 + 392.750 0.316 0.458 78.479 260.143 3.088 + 393.000 0.299 0.429 72.249 256.370 3.338 +``` + +#### LAS -> JSON +```var lasjson = function las2json(onelas)``` +will give you something like this: +``` +var lasjson = { + "VERSION INFORMATION":{ + "VERS":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "WRAP":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "WELL INFORMATION BLOCK":{ + "GENERATED":"", + "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_2":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "CURVE INFORMATION BLOCK":{ + "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}, + "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}, + } + , + "PARAMETER INFORMATION":{ + "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + } + , + "CURVES":{ + "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], + "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], + } + } +``` + diff --git a/example_deployments/example_panel_app/static/js/wellio/bundle.js b/examples/deployments/example_panel_app/static/js/wellio/bundle.js similarity index 100% rename from example_deployments/example_panel_app/static/js/wellio/bundle.js rename to examples/deployments/example_panel_app/static/js/wellio/bundle.js diff --git a/examples/deployments/example_panel_app/static/js/wellio/dist/index.js b/examples/deployments/example_panel_app/static/js/wellio/dist/index.js new file mode 100644 index 0000000..3cb27a7 --- /dev/null +++ b/examples/deployments/example_panel_app/static/js/wellio/dist/index.js @@ -0,0 +1,364 @@ +!function(e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):"undefined"!=typeof window?window.commonJsModule=e():"undefined"!=typeof global?global.commonJsModule=e():"undefined"!=typeof self&&(self.commonJsModule=e())}(function(){var define,module,exports;module={exports:(exports={})}; + +// var fs = require('fs'); + +module.exports = { + + // Read and transform Lasio Json files to Wellio.js json data format + +/** + * File reading utility function. + * @param {string} : file_to_read - The file to open. + * + * @returns {string} : The file's contents as a string. + */ + read_lasio_json_file: function(file_to_read) { + // Configure fs if running from node + let fs = ''; + + if (process !== 'undefined' && process.versions != null && process.versions.node != null) { + fs = require('fs'); + } + + return fs.readFileSync(file_to_read, 'utf8'); + }, + +/** +* The lasio_obj_2_wellio_obj function transforms lasio JSON strings into wellio.js JSON data format in memory and returns it. +* @param {object} lasio_json - A JavaScript object representation of lasio well log format +* +* @example +* let wellio = require('wellio') +* let lasio_json_str = wellio.read_lasio_json_file('lasio.json'); +* let lasio_obj = JSON.parse(lasio_json_str); +* let wellio_obj = wellio.lasio_obj_2_wellio_obj(lasio_obj); +* +* @returns {object} A wellio style JSON object +*/ + lasio_obj_2_wellio_obj: function(lasio_obj) { + + let std_headers = { + 'Version': 'VERSION INFORMATION', + 'Well': 'WELL INFORMATION BLOCK', + 'Curves': 'CURVE INFORMATION BLOCK', + 'Parameter': 'PARAMETER INFORMATION' + }; + + let lasjson = {}; + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = lasio_obj.data; + + // Example code for adding non-standard headers + for (let item in lasio_obj.metadata) { + if ( !(item in std_headers) ) { + lasjson[item.toUpperCase()] = lasio_obj.metadata[item]; + } + else { + for (let mnemonic in lasio_obj.metadata[item]) { + section = std_headers[item]; + lasjson[section][mnemonic] = { + MNEM: mnemonic, + UNIT: '', + DATA: lasio_obj.metadata[item][mnemonic], + 'DESCRIPTION OF MNEMONIC 1': '', + 'DESCRIPTION OF MNEMONIC 2': '' + }; + } + } + } + + return lasjson; + }, + + +/** + * A helper function that proves wellio,js was installed correctly. It merely returns the argument provided to it. For example, "test" as input would return "test". + * @param {*} onelas anything + * @returns Returns the input that was givne as an argument. This is just for testing that wellio was installed correctly. + * @example wellio.returnThing("test") = "test" + */ + returnThing: function(onelas){ + return onelas + }, + + +/** +* Loads a LAS 2.0 file from local files +* @param {string} well_log A string reprepresentatiion of filename of well log to be loaded into memory +* @returns {string} A string representation of the contents of that well log file. It is a single string. +*/ + loadLAS:function(well_log){ + var file = well_log + var fs = ''; + + if (process !== 'undefined' && process.versions != null && process.versions.node != null) { + fs = require('fs'); + } + var contents = fs.readFileSync(file).toString(); + // var contents = fs.readFileSync('test.LAS', 'utf8'); + return contents + }, + //// Converts a LAS 2.0 file already loaded into memory into a json format + /** + * las2jso function converts a LAS 2.0 file already loaded into memory as a string into a JSON object + * @param {string} onelas A string representation of a LAS 2.0 well log file. Typically from the result of the loadLAS function. + * @returns {Object} A JSON object that represents the information that was in the LAS 2.0 well log file but in JSON wellio style format. + */ + las2json: function(onelas){ + //// var lasjson establishes a blank json for holding las 2.0 data. It will look like the example below: + var lasjson = { + "VERSION INFORMATION":{ + "VERS":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "WRAP":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "WELL INFORMATION BLOCK":{ + "GENERATED":"", + "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_2":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "CURVE INFORMATION BLOCK":{ + "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}, + "MNEM_0":{"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""} + } + , + "PARAMETER INFORMATION":{ + "MNEM_0":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}, + "MNEM_1":{"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""} + } + , + "CURVES":{ + "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], + "Curve_NAME_ONE" :[1,2,3,4,5,6,7,8,9,10,11], + } + } + //// Some objects in the json were partially populated in the example above to make understanding the format easier. + //// We'll empty them as a first step + lasjson["VERSION INFORMATION"] = {}; + lasjson["WELL INFORMATION BLOCK"] = {}; + lasjson["CURVE INFORMATION BLOCK"] = {}; + lasjson["PARAMETER INFORMATION"] = {}; + lasjson["CURVES"] = {}; + //// Within the "blocks" ["CURVE INFORMATION BLOCK","PARAMETER INFORMATION", etc.] there are other objects with repeating keys. + //// The variables below will be the building blocks for each of those objects {}. They are initially populated with empty strings as the values. + var ver_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + var well_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + var curve_info_obj = {"MNEM":"","UNIT":"","ERCB CURVE CODE":"","CURVE DESCRIPTION 1":"","CURVE DESCRIPTION 2":""}; + var param_info_obj = {"MNEM":"","UNIT":"","DATA":"","DESCRIPTION OF MNEMONIC 1":"","DESCRIPTION OF MNEMONIC 2":""}; + //// The las file is read as a txt file. It will first be split into seperate strings based on "~" character which occurs at the top of each "block" + console.log("onelas = ",onelas) + //// Split in to las sections that start with a tilde: ~. + var split1 = onelas.split(/(~[^~]+)/); + console.log("split1 = ",split1) + var vers_str = ""; + var well_info_str = ""; + var curve_info_str = ""; + var param_info_str = ""; + var other = ""; + var curve_str = ""; + + //// As the 'OTHER' block may or may not be present, we have to split by '~' and then look for a substring to make sure we have the right block before we put each into a variable. + for(i = 0; i < split1.length; i++){ + //// Skip blank entries in the split1 array. + if (split1[i].length === 0) { + continue; + } + if(split1[i].includes("~V")){var vers_str = split1[i]} + else if (split1[i].includes("~W")){well_info_str = split1[i]} + else if (split1[i].includes("~C")){curve_info_str = split1[i]} + else if (split1[i].includes("~P")){param_info_str = split1[i]} + else if (split1[i].includes("~O")){other = split1[i]} + else if (split1[i].includes("~A")){curve_str = split1[i]} + else{ + console.log("WARNING: In wellio.js the las2json() function: split1[" + i + "] is not a recognized las section" ) + console.log("elem: [" + split1[i] + "]"); + } + } + + + //// Working with version block first by splitting it by newline and places each item into an array + //// and taking items of array 1 and 2 for vers and wrap + var vers_line = vers_str.split("\n")[1]; + var wrap_line = vers_str.split("\n")[2]; + //// As version information, well information, and parameter information blocks contain objects with the same keys, we can process them using a loop. + //// function to process objects for ver_info_obj, well_inf_obj, and param_info_obj + //// The splitLineofType1() function takes as argument the prototypical object building block and the array of strings for that block + function splitLineofType1(ver_info_obj,arrayString){ + //// splits string (should be a single line from the LAS text) by ":", takes the first item of the resulting array, and then replaces any " " with "". + var vers_line_1half = arrayString.split(":")[0].replace(" ",""); + //// splits the previous string variable by "." into an array of strings. + var vers_line_1half_array = vers_line_1half.split(".") + //// trimming this so I get "UWI" instead of "UWI " + ver_info_obj["MNEM"] = vers_line_1half_array[0].trim() + var unit_and_data = vers_line_1half_array.slice(1,vers_line_1half_array.length); + var unit_and_data_str = " "; + if (unit_and_data.length > 1){ + unit_and_data_str = unit_and_data[0].toString()+"."+unit_and_data[1].toString(); + } + else{ + unit_and_data_str = unit_and_data.toString() + } + var unit = unit_and_data_str[0,5].trim(); + var data = unit_and_data_str.substring(5,unit_and_data_str.length).trim(); + ver_info_obj["DATA"] = data + ver_info_obj["UNIT"] = unit + //// + if(arrayString.split(":")[1].indexOf("-") !== -1){ + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].split("-")[0].trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = arrayString.split(":")[1].split("-")[1].replace("\r","").trim() + } + else{ + ver_info_obj["DESCRIPTION OF MNEMONIC 1"] = arrayString.split(":")[1].replace("\r","").trim() + ver_info_obj["DESCRIPTION OF MNEMONIC 2"] = "" + } + return ver_info_obj + }; + lasjson["VERSION INFORMATION"]["WRAP"] = splitLineofType1(Object.assign({}, ver_info_obj),wrap_line); + lasjson["VERSION INFORMATION"]["VERS"] = splitLineofType1(Object.assign({}, ver_info_obj),vers_line); + //// Working with PARAMETER INFORMATION block second by splitting it by newline into an array. + //// This skips the line with the section's title. + var param_line_array = param_info_str.split("\n").slice(1,); + for(i = 0; i < param_line_array.length; i++){ + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if(param_line_array[i] != "" && param_line_array[i][0] !== '#'){ + var param_obj_inst = splitLineofType1(Object.assign({}, param_info_obj),param_line_array[i]); + lasjson["PARAMETER INFORMATION"][param_obj_inst["MNEM"]] = param_obj_inst + } + } + //// Working with CURVE INFORMATION BLOCK second by splitting it by newline into an array. + //// This skips the line with the section's title. + var curve_line_array = curve_info_str.split("\n").slice(1,); + for(i = 0; i < curve_line_array.length; i++){ + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if(curve_line_array[i] != "" && curve_line_array[i][0] !== '#'){ + var curve_obj_inst = splitLineofType1(Object.assign({}, curve_info_obj),curve_line_array[i]); + lasjson["CURVE INFORMATION BLOCK"][curve_obj_inst["MNEM"]] = curve_obj_inst + } + } + //// Working with WELL INFORMATION BLOCK second by splitting it by newline into an array. + //// This skips the line with the section's title. + var well_line_array = well_info_str.split("\n").slice(1,); + for(i = 0; i < well_line_array.length; i++){ + if(well_line_array[i].includes("Generated")){ + lasjson["WELL INFORMATION BLOCK"]["GENERATED"] = well_line_array[i].replace("\r","").replace("\t"," ").replace("#","") + } + //// create one object for parameter line + //// Skip empty elements and comment elements that start with '#'. + if(well_line_array[i] != "" && well_line_array[i][0] !== '#'){ + var well_obj_inst = splitLineofType1(Object.assign({}, well_info_obj),well_line_array[i]); + lasjson["WELL INFORMATION BLOCK"][well_obj_inst["MNEM"]] = well_obj_inst + } + else{ + console.log("INFO: in else for well_line: " + i) + console.log("elem: [" + well_line_array[i] + "]"); + } + } + //// Work with CURVES section by splitting it by newline into an array, + //// Iterate through the array items populate arrays for each key + var curve_str_array = curve_str.split("\n"); + + //// Get the curve column names from the curve names in the curve information block + //// + //// Per LAS_20_Update_Jan2014.pdf section 5.5 specs for ~C(Curve Information) + //// - This section is manditory. + //// - It desribes the curves and its units in the order they appear in the ~ASCII + //// log data section of the file. + //// - The channels described in this section must be present in the data set. + var curve_names_array_holder = []; + var curve_info = Object.keys(lasjson['CURVE INFORMATION BLOCK']); + + if (curve_info.length > 0){ + for(k = 0; k < curve_info.length; k++){ + col_name = curve_info[k]; + curve_names_array_holder.push(col_name); + lasjson.CURVES[col_name] = []; + } + } + + var curve_data_line_array = []; + + //// start at position 1 instead of 0 is to avoid the curve names + for(j = 1; j < curve_str_array.length; j++){ + //// Skip empty rows. + if (curve_str_array[j].length === 0) { + continue; + } + + var temp_data_array = curve_str_array[j].split(/\s+/); + //// Split can leave an empty element at the beginning, remove it. + if (temp_data_array[0].length === 0){ + temp_data_array.shift(); + } + + //// If data is wrapped continue to accumulate data from rows till + //// we have a data element for each data column + var idx = curve_data_line_array.length; + curve_data_line_array.length = idx + temp_data_array.length; + for (var i = 0; i < temp_data_array.length; i++, idx++) { + curve_data_line_array[idx] = temp_data_array[i]; + } + + if ( + lasjson["VERSION INFORMATION"].WRAP.DATA == 'YES' + && curve_data_line_array.length < curve_names_array_holder.length) + { + continue; + } + + var counter_of_curve_names = 0; + console.log("curve_data_line_array.length = ",curve_data_line_array.length) + console.log("curve_data_line_array = ",curve_data_line_array) + + + var last_curv_data_line_position = curve_data_line_array.length - 1; + console.log("curve_data_line_array[last_curv_data_line_position] = ",curve_data_line_array[last_curv_data_line_position]) + curve_data_line_array[last_curv_data_line_position] = curve_data_line_array[last_curv_data_line_position].replace("\r","") + console.log("curve_data_line_array[last_curv_data_line_position] = ",curve_data_line_array[last_curv_data_line_position]) + for(k = 0; k < curve_data_line_array.length; k++){ + if(curve_data_line_array[k] !== ""){ + lasjson["CURVES"][curve_names_array_holder[counter_of_curve_names]].push(curve_data_line_array[k]) + counter_of_curve_names += 1; + } + } + //// Zero out curve_data_line_array for next set of data + curve_data_line_array = []; + } + console.log(" test: lasjson",lasjson); + return(lasjson) + }, + + //// Given a well already converted into json, returns the available curves + CurveNames: function(well_json){ + var curveNames = Object.keys(well_json["CURVES"]); + return curveNames + }, + //// + VER_block: function(well_json){ + return well_json["VERSION INFORMATION"] + }, + //// Given a well already converted into json, returns the well UWI + UWI: function(well_json){ + return well_json["WELL INFORMATION BLOCK"]["UWI"]["DATA"] + }, + //// Given a well already converted into json, returns a given curve name in string format + getCurve(well_json,curve){ + if (!well_json["CURVES"][curve]){ + console.log("in getCurve function, that curve does not exist! =",curve) + return "that curve does not exist! see console.log" + + } else { + return well_json["CURVES"][curve] + } + } +} + + + +return module.exports;}); diff --git a/examples/deployments/example_panel_app/static/js/wellio/dist/test/test.LAS b/examples/deployments/example_panel_app/static/js/wellio/dist/test/test.LAS new file mode 100644 index 0000000..6acf043 --- /dev/null +++ b/examples/deployments/example_panel_app/static/js/wellio/dist/test/test.LAS @@ -0,0 +1,767 @@ +~VERSION INFORMATION + VERS. 2.0: CWLS LOG ASCII STANDARD -VERSION 2.0 + WRAP. NO: ONE LINE PER DEPTH STEP +~WELL INFORMATION BLOCK +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ------------------- ------------------------------- +# Generated from Intellog Unique Number CX_WELLS/WELL/3716 +WELL. PETROREP HOUSE : Well_name - WELL +LOC . 00/01-05-085-15W4/0 : Location - LOCATION +UWI . 00/01-05-085-15W400 : Uwi - UNIQUE WELL ID +ENTR. T : Entered - ENTERED BY +SRVC. SCHLUMBERGER : Scn - SERVICE COMPANY +STRT.M 100 : top_depth - START DEPTH +STOP.M 280 : bot_depth - STOP DEPTH +STEP.M 0.25 : increment - STEP LENGTH + NULL. -999.2500:NULL Value +~CURVE INFORMATION BLOCK +#MNEM UNIT ERCB CURVE CODE CURVE DESCRIPTION +#----------- ------------------ ---------------------------------- +DEPT.M 00 001 00 00 : DEPTH - DEPTH +GR .API 00 310 00 00 : GR - GAMMA RAY +NPHI.V/V 00 330 00 00 : PHIN - NEUTRON POROSITY (SANDSTONE) +DPHI.V/V 00 890 00 00 : PHID - DENSITY POROSITY (SANDSTONE) +ILD .OHMM 00 120 00 00 : RESD - DEEP RESISTIVITY (DIL) +~PARAMETER INFORMATION +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ----------- ------------------------------ +GL .M 531.9 : gl - GROUND LEVEL ELEVATION +EREF.M 535.5 : kb - ELEVATION OF DEPTH REFERENCE +DATM.M 535.5 : datum - DATUM ELEVATION +TDD .M 285 : tdd - TOTAL DEPTH DRILLER +RUN . ONE : Run - RUN NUMBER +ENG . BILL : Engineer - RECORDING ENGINEER +WIT . JIM : Witness - WITNESSED BY +MUD . GEL : Mud_type - MUD TYPE +MATR. SANDSTONE : Logunit - NEUTRON MATRIX +TMAX.C 18 : BHT - MAXIMUM RECORDED TEMPERATURE +BHTD.M 285 : BHTDEP - MAXIMUM RECORDED TEMPERATURE +MATR. 1 : LOGUNIT - NEUTRON MATRIX +RMT .C 20 : MDTP - TEMPERATURE OF MUD +NEUT. 1 : NEUTRON - NEUTRON TYPE +RESI. 2.4 : RESIST - RESISTIVITY TYPE +RMC .OHMM 1.8 : RMC - RESISTIVITY OF MUD CAKE +RMF .OHMM 2.4 : RMF - RESISTIVITY OF MUD FILTRATE +SUFT.C 4 : SUFT - SURFACE TEMPERATURE +~A DEPTH GR PHIN PHID RESD + 100.000 89.628 0.396 0.332 14.499 + 100.250 90.322 0.392 0.338 13.976 + 100.500 89.781 0.389 0.333 13.729 + 100.750 91.101 0.389 0.326 13.502 + 101.000 92.404 0.396 0.314 13.269 + 101.250 95.603 0.403 0.292 13.290 + 101.500 100.680 0.413 0.272 13.310 + 101.750 95.112 0.409 0.278 13.325 + 102.000 82.030 0.393 0.288 12.859 + 102.250 73.941 0.380 0.287 12.632 + 102.500 73.382 0.363 0.275 12.176 + 102.750 91.000 0.354 0.259 11.309 + 103.000 95.485 0.352 0.254 10.499 + 103.250 98.040 0.354 0.250 9.934 + 103.500 102.491 0.356 0.230 9.220 + 103.750 109.447 0.374 0.217 8.563 + 104.000 119.567 0.406 0.213 8.257 + 104.250 123.375 0.447 0.209 7.522 + 104.500 122.817 0.451 0.203 7.115 + 104.750 121.649 0.451 0.197 6.360 + 105.000 120.448 0.451 0.190 5.798 + 105.250 121.768 0.451 0.186 5.484 + 105.500 126.253 0.456 0.191 5.286 + 105.750 125.711 0.462 0.197 5.002 + 106.000 125.119 0.474 0.205 4.643 + 106.250 124.560 0.487 0.213 4.394 + 106.500 127.150 0.497 0.216 4.157 + 106.750 129.096 0.511 0.209 4.085 + 107.000 131.042 0.514 0.211 4.763 + 107.250 129.841 0.510 0.220 6.103 + 107.500 124.273 0.500 0.260 7.249 + 107.750 116.200 0.482 0.267 8.291 + 108.000 105.606 0.429 0.276 9.666 + 108.250 93.167 0.425 0.288 10.643 + 108.500 90.713 0.418 0.294 11.288 + 108.750 94.538 0.405 0.294 11.521 + 109.000 98.989 0.395 0.262 11.539 + 109.250 107.214 0.426 0.256 11.556 + 109.500 113.544 0.434 0.251 10.935 + 109.750 111.733 0.433 0.248 10.742 + 110.000 106.791 0.432 0.267 10.556 + 110.250 101.849 0.433 0.298 10.576 + 110.500 95.029 0.438 0.408 10.791 + 110.750 89.461 0.444 0.388 11.014 + 111.000 83.894 0.458 0.314 11.686 + 111.250 78.309 0.448 0.289 11.927 + 111.500 72.741 0.426 0.287 12.402 + 111.750 66.547 0.380 0.286 12.901 + 112.000 62.874 0.386 0.284 13.420 + 112.250 61.673 0.395 0.287 14.233 + 112.500 62.384 0.395 0.298 14.805 + 112.750 64.330 0.381 0.313 15.106 + 113.000 67.529 0.370 0.317 15.719 + 113.250 70.101 0.372 0.314 16.352 + 113.500 70.812 0.374 0.315 16.696 + 113.750 69.627 0.375 0.319 16.722 + 114.000 71.591 0.379 0.322 17.068 + 114.250 72.877 0.380 0.326 17.088 + 114.500 76.076 0.386 0.328 17.441 + 114.750 73.655 0.391 0.331 17.816 + 115.000 70.575 0.396 0.336 17.836 + 115.250 66.886 0.401 0.342 17.857 + 115.500 66.328 0.408 0.345 17.898 + 115.750 62.655 0.419 0.344 17.918 + 116.000 63.349 0.428 0.343 17.946 + 116.250 63.417 0.428 0.343 17.980 + 116.500 64.094 0.423 0.342 18.001 + 116.750 63.535 0.417 0.342 18.042 + 117.000 61.099 0.415 0.342 18.063 + 117.250 58.661 0.413 0.344 17.744 + 117.500 58.746 0.410 0.351 17.778 + 117.750 59.440 0.406 0.350 17.799 + 118.000 60.134 0.416 0.347 17.505 + 118.250 58.949 0.424 0.347 17.532 + 118.500 59.017 0.432 0.349 17.222 + 118.750 59.085 0.435 0.350 17.249 + 119.000 60.405 0.425 0.350 17.275 + 119.250 62.368 0.415 0.346 16.983 + 119.500 63.688 0.405 0.342 17.016 + 119.750 64.382 0.395 0.339 16.709 + 120.000 65.702 0.392 0.339 16.741 + 120.250 66.379 0.392 0.339 16.452 + 120.500 67.733 0.393 0.340 16.477 + 120.750 66.549 0.399 0.340 16.193 + 121.000 64.738 0.407 0.340 16.218 + 121.250 64.197 0.418 0.345 15.932 + 121.500 64.856 0.423 0.346 15.662 + 121.750 66.803 0.414 0.340 15.681 + 122.000 68.123 0.412 0.328 15.416 + 122.250 73.200 0.410 0.309 14.865 + 122.500 91.444 0.420 0.254 13.542 + 122.750 100.921 0.428 0.241 11.431 + 123.000 101.615 0.438 0.249 8.949 + 123.250 95.421 0.448 0.261 6.750 + 123.500 96.758 0.460 0.270 6.628 + 123.750 98.705 0.448 0.269 6.514 + 124.000 100.634 0.428 0.270 6.524 + 124.250 101.954 0.426 0.277 7.054 + 124.500 103.274 0.425 0.284 7.332 + 124.750 103.985 0.420 0.292 9.052 + 125.000 102.174 0.410 0.303 10.752 + 125.250 97.216 0.402 0.319 11.394 + 125.500 86.012 0.390 0.329 12.551 + 125.750 72.304 0.389 0.323 13.300 + 126.000 72.372 0.395 0.319 14.111 + 126.250 75.570 0.403 0.321 14.397 + 126.500 80.647 0.408 0.332 14.977 + 126.750 86.977 0.411 0.343 14.999 + 127.000 83.914 0.419 0.346 15.023 + 127.250 73.963 0.422 0.343 15.046 + 127.500 69.038 0.428 0.337 14.791 + 127.750 69.106 0.418 0.328 15.103 + 128.000 71.661 0.397 0.318 15.121 + 128.250 74.251 0.369 0.308 15.428 + 128.500 76.197 0.374 0.298 15.463 + 128.750 76.248 0.388 0.290 15.475 + 129.000 70.680 0.385 0.299 15.214 + 129.250 61.355 0.381 0.318 15.237 + 129.500 58.309 0.387 0.318 15.558 + 129.750 55.229 0.385 0.318 16.184 + 130.000 50.321 0.377 0.319 16.835 + 130.250 50.389 0.374 0.320 17.183 + 130.500 51.675 0.377 0.322 17.210 + 130.750 52.403 0.372 0.323 17.573 + 131.000 53.063 0.369 0.324 17.593 + 131.250 53.757 0.369 0.324 18.658 + 131.500 53.841 0.371 0.329 19.037 + 131.750 55.144 0.379 0.331 19.438 + 132.000 57.108 0.386 0.335 19.468 + 132.250 57.802 0.392 0.332 19.505 + 132.500 55.365 0.387 0.327 19.893 + 132.750 52.928 0.377 0.328 19.947 + 133.000 54.891 0.373 0.329 19.962 + 133.250 58.106 0.372 0.330 20.367 + 133.500 58.767 0.374 0.329 20.414 + 133.750 58.225 0.378 0.331 20.829 + 134.000 57.667 0.379 0.337 20.869 + 134.250 57.751 0.374 0.344 20.893 + 134.500 57.159 0.372 0.343 20.548 + 134.750 54.722 0.385 0.340 20.571 + 135.000 54.164 0.397 0.338 20.595 + 135.250 55.535 0.406 0.342 20.642 + 135.500 54.316 0.393 0.343 20.666 + 135.750 52.505 0.390 0.340 21.102 + 136.000 53.199 0.395 0.338 21.118 + 136.250 56.415 0.398 0.336 21.150 + 136.500 56.465 0.391 0.336 21.191 + 136.750 54.045 0.380 0.336 21.215 + 137.000 54.096 0.380 0.335 21.264 + 137.250 54.164 0.383 0.334 21.280 + 137.500 55.484 0.387 0.333 21.321 + 137.750 57.430 0.391 0.333 21.354 + 138.000 57.498 0.394 0.334 21.387 + 138.250 53.809 0.390 0.336 21.033 + 138.500 52.015 0.384 0.338 21.049 + 138.750 53.335 0.383 0.339 21.090 + 139.000 54.029 0.382 0.339 21.122 + 139.250 52.218 0.382 0.338 21.146 + 139.500 49.781 0.381 0.338 21.179 + 139.750 49.223 0.378 0.341 21.228 + 140.000 51.795 0.377 0.347 21.252 + 140.250 55.620 0.379 0.354 21.285 + 140.500 57.566 0.389 0.358 21.325 + 140.750 53.268 0.387 0.365 21.350 + 141.000 50.814 0.388 0.375 21.391 + 141.250 48.377 0.395 0.383 21.415 + 141.500 46.566 0.404 0.386 21.448 + 141.750 46.634 0.412 0.390 21.086 + 142.000 47.328 0.415 0.380 21.110 + 142.250 48.648 0.418 0.371 21.142 + 142.500 49.393 0.417 0.371 22.422 + 142.750 48.800 0.407 0.351 24.679 + 143.000 47.616 0.389 0.229 28.785 + 143.250 45.805 0.375 0.196 32.314 + 143.500 45.873 0.360 0.176 32.957 + 143.750 49.715 0.340 0.176 34.283 + 144.000 52.270 0.317 0.181 34.349 + 144.250 56.738 0.315 0.189 31.890 + 144.500 58.092 0.330 0.201 28.506 + 144.750 57.500 0.348 0.319 25.969 + 145.000 55.723 0.374 0.341 23.213 + 145.250 55.773 0.379 0.342 21.543 + 145.500 57.077 0.383 0.342 19.633 + 145.750 60.292 0.388 0.344 19.287 + 146.000 62.865 0.395 0.304 18.605 + 146.250 63.559 0.398 0.312 17.947 + 146.500 61.748 0.396 0.344 17.968 + 146.750 60.563 0.402 0.370 17.326 + 147.000 61.240 0.421 0.389 16.707 + 147.250 61.308 0.440 0.397 16.104 + 147.500 57.636 0.437 0.372 15.529 + 147.750 57.077 0.427 0.359 15.851 + 148.000 58.397 0.418 0.337 16.816 + 148.250 62.865 0.426 0.330 17.164 + 148.500 66.064 0.438 0.324 16.861 + 148.750 64.879 0.450 0.327 15.954 + 149.000 61.799 0.446 0.334 14.534 + 149.250 56.858 0.436 0.336 13.240 + 149.500 53.811 0.427 0.337 13.261 + 149.750 56.993 0.415 0.335 13.281 + 150.000 62.070 0.411 0.322 13.301 + 150.250 75.305 0.418 0.298 12.354 + 150.500 88.539 0.426 0.286 11.465 + 150.750 98.626 0.434 0.265 10.056 + 151.000 111.860 0.442 0.237 8.333 + 151.250 112.554 0.448 0.225 7.040 + 151.500 112.639 0.453 0.216 6.533 + 151.750 113.959 0.455 0.216 6.300 + 152.000 113.417 0.464 0.213 6.193 + 152.250 112.825 0.491 0.210 5.972 + 152.500 111.657 0.490 0.210 5.869 + 152.750 111.082 0.477 0.210 5.765 + 153.000 110.541 0.471 0.208 5.666 + 153.250 112.470 0.467 0.205 5.464 + 153.500 115.076 0.467 0.205 5.371 + 153.750 114.518 0.472 0.202 5.281 + 154.000 115.212 0.503 0.197 5.287 + 154.250 115.906 0.504 0.194 5.293 + 154.500 116.583 0.503 0.192 5.205 + 154.750 116.650 0.497 0.195 5.113 + 155.000 115.466 0.494 0.204 5.025 + 155.250 114.907 0.486 0.210 4.940 + 155.500 116.854 0.474 0.219 4.855 + 155.750 118.817 0.469 0.219 4.769 + 156.000 120.154 0.473 0.210 4.689 + 156.250 121.457 0.479 0.202 4.696 + 156.500 122.151 0.494 0.195 4.617 + 156.750 123.471 0.493 0.188 4.624 + 157.000 124.791 0.485 0.187 4.542 + 157.250 126.737 0.472 0.187 4.549 + 157.500 126.805 0.473 0.190 4.469 + 157.750 125.621 0.478 0.193 4.476 + 158.000 124.453 0.487 0.193 4.398 + 158.250 124.521 0.499 0.194 4.405 + 158.500 125.841 0.512 0.194 4.329 + 158.750 125.909 0.513 0.195 4.258 + 159.000 124.724 0.507 0.202 4.184 + 159.250 122.287 0.501 0.207 4.112 + 159.500 122.355 0.499 0.209 4.118 + 159.750 119.918 0.501 0.212 4.048 + 160.000 116.228 0.502 0.223 4.053 + 160.250 110.661 0.503 0.237 4.059 + 160.500 108.207 0.496 0.250 4.066 + 160.750 105.770 0.481 0.253 4.072 + 161.000 103.333 0.462 0.262 4.080 + 161.250 100.896 0.444 0.270 4.161 + 161.500 96.597 0.433 0.285 4.330 + 161.750 92.908 0.422 0.290 4.678 + 162.000 88.592 0.416 0.283 5.350 + 162.250 84.903 0.412 0.277 6.118 + 162.500 83.701 0.413 0.283 6.997 + 162.750 78.777 0.414 0.293 8.002 + 163.000 76.323 0.417 0.308 8.814 + 163.250 75.138 0.419 0.315 9.894 + 163.500 73.954 0.420 0.325 10.694 + 163.750 74.021 0.420 0.327 10.907 + 164.000 77.220 0.420 0.319 11.350 + 164.250 77.288 0.420 0.307 11.585 + 164.500 77.999 0.420 0.301 11.598 + 164.750 83.076 0.420 0.294 11.842 + 165.000 85.665 0.422 0.286 11.861 + 165.250 86.359 0.424 0.275 11.879 + 165.500 87.679 0.424 0.266 11.459 + 165.750 90.252 0.422 0.260 11.261 + 166.000 94.720 0.415 0.254 10.859 + 166.250 97.292 0.420 0.254 10.274 + 166.500 99.865 0.425 0.256 10.093 + 166.750 100.558 0.430 0.258 9.740 + 167.000 99.983 0.440 0.257 9.751 + 167.250 100.068 0.447 0.252 9.766 + 167.500 100.135 0.451 0.252 9.777 + 167.750 99.577 0.451 0.252 9.258 + 168.000 98.392 0.446 0.253 9.265 + 168.250 97.851 0.439 0.253 8.938 + 168.500 97.885 0.437 0.251 8.787 + 168.750 98.596 0.434 0.250 8.794 + 169.000 98.037 0.430 0.247 8.489 + 169.250 96.227 0.427 0.245 8.336 + 169.500 95.668 0.426 0.243 7.894 + 169.750 98.884 0.426 0.244 7.609 + 170.000 98.951 0.432 0.250 7.334 + 170.250 97.750 0.442 0.255 7.208 + 170.500 95.313 0.444 0.208 7.360 + 170.750 85.988 0.436 0.177 7.659 + 171.000 87.934 0.440 0.206 7.964 + 171.250 89.897 0.448 0.237 8.284 + 171.500 89.948 0.440 0.262 8.617 + 171.750 88.764 0.433 0.272 8.627 + 172.000 86.327 0.429 0.252 8.806 + 172.250 84.533 0.427 0.233 8.657 + 172.500 87.715 0.427 0.252 8.511 + 172.750 92.809 0.431 0.262 8.207 + 173.000 96.024 0.433 0.277 7.768 + 173.250 93.587 0.443 0.293 7.344 + 173.500 91.167 0.457 0.298 6.567 + 173.750 89.949 0.465 0.285 5.983 + 174.000 90.033 0.458 0.272 5.771 + 174.250 90.101 0.449 0.257 5.776 + 174.500 90.169 0.434 0.248 6.123 + 174.750 87.089 0.422 0.253 6.491 + 175.000 82.147 0.423 0.278 6.881 + 175.250 80.336 0.425 0.282 7.295 + 175.500 82.299 0.422 0.293 7.737 + 175.750 84.872 0.421 0.303 8.051 + 176.000 85.566 0.425 0.301 8.218 + 176.250 85.007 0.434 0.299 8.230 + 176.500 85.075 0.445 0.290 8.397 + 176.750 86.395 0.444 0.277 8.410 + 177.000 87.732 0.440 0.275 8.268 + 177.250 88.409 0.440 0.273 8.278 + 177.500 89.120 0.442 0.272 8.135 + 177.750 89.188 0.446 0.272 7.844 + 178.000 87.377 0.452 0.268 7.709 + 178.250 88.054 0.454 0.261 7.436 + 178.500 90.017 0.454 0.255 7.445 + 178.750 92.607 0.455 0.260 7.319 + 179.000 93.893 0.459 0.265 7.190 + 179.250 95.873 0.456 0.271 7.071 + 179.500 97.193 0.452 0.269 6.946 + 179.750 98.513 0.439 0.272 6.829 + 180.000 98.581 0.436 0.276 6.708 + 180.250 96.770 0.443 0.282 6.593 + 180.500 96.195 0.453 0.287 6.481 + 180.750 95.044 0.461 0.286 6.494 + 181.000 95.078 0.467 0.284 6.504 + 181.250 95.163 0.467 0.281 6.633 + 181.500 95.857 0.466 0.280 6.770 + 181.750 95.924 0.466 0.290 7.043 + 182.000 95.366 0.468 0.291 7.326 + 182.250 94.181 0.467 0.284 7.921 + 182.500 95.502 0.469 0.268 7.933 + 182.750 96.195 0.472 0.260 7.793 + 183.000 92.523 0.475 0.263 7.521 + 183.250 87.564 0.481 0.264 7.249 + 183.500 83.858 0.477 0.266 6.988 + 183.750 76.429 0.449 0.296 6.614 + 184.000 74.601 0.448 0.310 6.378 + 184.250 74.059 0.443 0.317 7.023 + 184.500 73.501 0.437 0.312 7.729 + 184.750 71.690 0.427 0.301 8.674 + 185.000 70.506 0.401 0.263 11.118 + 185.250 70.573 0.388 0.235 12.715 + 185.500 70.624 0.393 0.288 14.268 + 185.750 72.621 0.407 0.335 15.710 + 186.000 73.924 0.413 0.336 16.980 + 186.250 74.602 0.414 0.329 18.014 + 186.500 76.582 0.414 0.322 18.380 + 186.750 77.885 0.412 0.317 18.415 + 187.000 79.848 0.411 0.310 18.429 + 187.250 79.882 0.408 0.302 17.771 + 187.500 79.967 0.408 0.294 17.136 + 187.750 77.513 0.407 0.288 16.531 + 188.000 75.076 0.408 0.280 15.641 + 188.250 76.430 0.412 0.283 15.365 + 188.500 78.376 0.415 0.294 14.822 + 188.750 79.696 0.418 0.304 14.850 + 189.000 80.390 0.419 0.305 15.152 + 189.250 78.579 0.401 0.296 15.459 + 189.500 72.368 0.377 0.272 15.495 + 189.750 71.810 0.367 0.247 15.233 + 190.000 73.756 0.378 0.276 14.678 + 190.250 75.076 0.379 0.274 13.893 + 190.500 70.135 0.366 0.173 13.915 + 190.750 63.314 0.338 0.117 14.208 + 191.000 72.775 0.333 0.111 14.224 + 191.250 82.878 0.360 0.165 14.246 + 191.500 84.825 0.381 0.218 14.000 + 191.750 86.145 0.389 0.255 13.758 + 192.000 84.977 0.402 0.282 13.521 + 192.250 83.183 0.410 0.287 13.536 + 192.500 81.965 0.418 0.288 13.557 + 192.750 80.154 0.422 0.292 13.073 + 193.000 80.222 0.426 0.288 12.616 + 193.250 80.289 0.428 0.285 12.630 + 193.500 82.236 0.420 0.280 12.896 + 193.750 85.485 0.415 0.279 13.163 + 194.000 86.771 0.414 0.277 12.931 + 194.250 88.718 0.418 0.273 12.469 + 194.500 90.681 0.425 0.268 11.803 + 194.750 92.627 0.449 0.263 11.381 + 195.000 95.200 0.455 0.258 10.975 + 195.250 97.146 0.452 0.254 10.380 + 195.500 97.840 0.437 0.254 9.821 + 195.750 98.534 0.427 0.253 8.782 + 196.000 98.618 0.437 0.253 8.307 + 196.250 98.060 0.442 0.251 7.286 + 196.500 98.128 0.441 0.250 6.894 + 196.750 100.700 0.443 0.247 6.647 + 197.000 101.377 0.446 0.247 6.533 + 197.250 103.323 0.450 0.247 6.673 + 197.500 102.799 0.452 0.247 6.673 + 197.750 101.614 0.456 0.247 7.223 + 198.000 99.770 0.458 0.248 7.229 + 198.250 96.080 0.457 0.248 7.104 + 198.500 96.791 0.454 0.250 7.118 + 198.750 98.771 0.450 0.252 7.129 + 199.000 100.075 0.446 0.257 7.139 + 199.250 99.499 0.445 0.262 7.287 + 199.500 95.827 0.444 0.265 7.441 + 199.750 92.764 0.441 0.267 7.592 + 200.000 89.074 0.431 0.271 7.746 + 200.250 86.011 0.430 0.277 8.375 + 200.500 86.062 0.429 0.282 8.712 + 200.750 86.130 0.429 0.279 9.232 + 201.000 86.824 0.428 0.274 10.166 + 201.250 88.161 0.424 0.271 10.777 + 201.500 88.228 0.424 0.270 11.210 + 201.750 87.027 0.426 0.270 11.447 + 202.000 84.590 0.430 0.266 11.464 + 202.250 80.901 0.407 0.251 11.477 + 202.500 77.854 0.376 0.179 11.715 + 202.750 82.288 0.362 0.207 11.957 + 203.000 89.278 0.373 0.233 13.685 + 203.250 92.460 0.388 0.253 13.968 + 203.500 94.440 0.402 0.269 13.732 + 203.750 96.369 0.410 0.275 13.485 + 204.000 97.689 0.423 0.238 12.520 + 204.250 94.609 0.420 0.208 11.628 + 204.500 90.920 0.412 0.199 11.208 + 204.750 96.014 0.412 0.224 10.605 + 205.000 98.587 0.413 0.248 10.226 + 205.250 98.654 0.413 0.252 9.865 + 205.500 94.982 0.419 0.260 9.876 + 205.750 92.528 0.426 0.268 9.895 + 206.000 90.734 0.422 0.269 9.906 + 206.250 90.802 0.410 0.266 10.115 + 206.500 90.243 0.410 0.265 10.329 + 206.750 89.668 0.411 0.268 10.542 + 207.000 87.857 0.416 0.277 10.756 + 207.250 86.673 0.415 0.271 11.198 + 207.500 87.367 0.416 0.262 11.210 + 207.750 91.191 0.418 0.250 11.228 + 208.000 95.016 0.424 0.246 11.034 + 208.250 99.484 0.427 0.245 10.644 + 208.500 103.326 0.430 0.242 10.452 + 208.750 105.255 0.438 0.240 9.893 + 209.000 106.575 0.441 0.233 9.536 + 209.250 106.017 0.439 0.232 8.854 + 209.500 103.580 0.435 0.232 7.914 + 209.750 99.908 0.431 0.228 7.074 + 210.000 96.201 0.430 0.224 6.326 + 210.250 99.400 0.432 0.219 6.333 + 210.500 102.616 0.434 0.215 7.110 + 210.750 103.936 0.436 0.215 8.286 + 211.000 105.290 0.439 0.215 8.952 + 211.250 105.323 0.445 0.215 8.966 + 211.500 105.408 0.453 0.213 8.487 + 211.750 105.459 0.464 0.211 7.731 + 212.000 106.170 0.478 0.209 7.452 + 212.250 106.881 0.472 0.207 6.922 + 212.500 107.558 0.469 0.205 6.672 + 212.750 108.252 0.462 0.205 6.438 + 213.000 108.946 0.456 0.201 6.446 + 213.250 109.013 0.443 0.200 6.335 + 213.500 109.081 0.435 0.205 6.344 + 213.750 108.523 0.447 0.224 6.354 + 214.000 108.590 0.459 0.218 6.361 + 214.250 108.675 0.450 0.198 6.371 + 214.500 108.743 0.432 0.197 6.505 + 214.750 108.811 0.410 0.193 6.518 + 215.000 108.861 0.403 0.197 6.653 + 215.250 107.051 0.403 0.203 6.660 + 215.500 107.135 0.403 0.209 6.928 + 215.750 107.829 0.401 0.209 7.632 + 216.000 107.880 0.399 0.209 8.564 + 216.250 108.608 0.402 0.211 9.426 + 216.500 108.642 0.408 0.215 10.004 + 216.750 108.743 0.413 0.216 10.015 + 217.000 108.202 0.417 0.217 10.027 + 217.250 108.253 0.417 0.217 9.676 + 217.500 108.963 0.418 0.218 9.505 + 217.750 110.267 0.410 0.223 9.338 + 218.000 109.099 0.403 0.229 9.183 + 218.250 107.254 0.400 0.235 9.191 + 218.500 104.834 0.400 0.242 9.208 + 218.750 101.771 0.402 0.246 9.222 + 219.000 99.960 0.404 0.245 9.236 + 219.250 98.150 0.408 0.247 9.247 + 219.500 96.965 0.411 0.255 9.265 + 219.750 97.016 0.415 0.263 9.279 + 220.000 97.100 0.415 0.256 9.656 + 220.250 97.811 0.410 0.248 10.044 + 220.500 97.845 0.401 0.253 10.248 + 220.750 97.930 0.401 0.256 10.665 + 221.000 96.728 0.405 0.259 10.677 + 221.250 94.934 0.410 0.261 10.701 + 221.500 93.124 0.410 0.266 10.710 + 221.750 90.687 0.409 0.265 10.525 + 222.000 87.607 0.404 0.243 10.541 + 222.250 83.917 0.394 0.201 10.363 + 222.500 78.976 0.367 0.149 10.383 + 222.750 70.903 0.342 0.141 10.593 + 223.000 72.223 0.352 0.210 11.235 + 223.250 80.431 0.367 0.241 12.370 + 223.500 85.542 0.378 0.265 12.868 + 223.750 86.845 0.392 0.277 12.646 + 224.000 87.556 0.399 0.277 11.524 + 224.250 88.267 0.405 0.275 11.104 + 224.500 88.301 0.406 0.268 10.707 + 224.750 88.403 0.402 0.264 10.329 + 225.000 89.080 0.400 0.259 10.147 + 225.250 90.400 0.397 0.253 10.147 + 225.500 92.363 0.393 0.249 10.579 + 225.750 93.683 0.395 0.235 10.393 + 226.000 94.360 0.398 0.235 10.029 + 226.250 95.071 0.400 0.234 9.852 + 226.500 95.122 0.404 0.232 9.500 + 226.750 95.189 0.413 0.232 9.515 + 227.000 95.883 0.420 0.233 9.526 + 227.250 96.577 0.411 0.234 9.723 + 227.500 97.271 0.397 0.234 10.118 + 227.750 97.356 0.395 0.234 10.323 + 228.000 97.424 0.402 0.235 10.537 + 228.250 96.865 0.411 0.235 10.355 + 228.500 96.324 0.415 0.235 10.180 + 228.750 95.765 0.417 0.235 9.816 + 229.000 95.833 0.420 0.232 9.647 + 229.250 95.901 0.429 0.225 9.131 + 229.500 97.847 0.440 0.221 8.481 + 229.750 100.420 0.442 0.224 8.178 + 230.000 104.227 0.448 0.232 7.735 + 230.250 108.712 0.452 0.242 7.316 + 230.500 110.659 0.453 0.244 6.667 + 230.750 110.726 0.454 0.246 6.074 + 231.000 110.777 0.454 0.245 5.531 + 231.250 110.845 0.454 0.241 4.851 + 231.500 112.182 0.453 0.236 4.419 + 231.750 114.754 0.451 0.232 4.181 + 232.000 117.327 0.441 0.223 4.188 + 232.250 116.785 0.431 0.216 4.196 + 232.500 114.348 0.422 0.204 4.283 + 232.750 111.911 0.416 0.194 4.453 + 233.000 108.848 0.407 0.194 4.813 + 233.250 107.054 0.399 0.190 5.399 + 233.500 107.088 0.389 0.192 6.921 + 233.750 106.547 0.385 0.201 9.037 + 234.000 106.615 0.380 0.196 13.739 + 234.250 105.430 0.374 0.183 16.012 + 234.500 102.367 0.382 0.213 16.656 + 234.750 97.425 0.385 0.227 16.061 + 235.000 93.719 0.386 0.241 14.917 + 235.250 87.508 0.386 0.255 13.590 + 235.500 78.809 0.384 0.262 12.858 + 235.750 71.989 0.383 0.270 14.434 + 236.000 64.559 0.383 0.275 16.191 + 236.250 61.462 0.383 0.281 18.169 + 236.500 57.147 0.381 0.286 21.589 + 236.750 55.353 0.379 0.288 24.226 + 237.000 54.778 0.375 0.291 26.675 + 237.250 54.236 0.372 0.292 27.737 + 237.500 53.695 0.372 0.294 30.541 + 237.750 53.745 0.373 0.294 32.389 + 238.000 53.813 0.374 0.295 33.072 + 238.250 55.133 0.375 0.294 33.743 + 238.500 57.080 0.377 0.294 33.161 + 238.750 59.652 0.380 0.291 33.212 + 239.000 62.224 0.384 0.284 32.038 + 239.250 64.797 0.389 0.278 30.302 + 239.500 70.534 0.392 0.273 27.605 + 239.750 73.090 0.397 0.273 24.212 + 240.000 75.053 0.407 0.276 20.447 + 240.250 74.495 0.418 0.277 17.267 + 240.500 73.293 0.418 0.277 14.308 + 240.750 75.239 0.412 0.273 12.794 + 241.000 83.464 0.410 0.258 11.879 + 241.250 92.299 0.414 0.246 11.450 + 241.500 100.524 0.421 0.227 10.431 + 241.750 101.861 0.424 0.232 9.499 + 242.000 101.928 0.426 0.240 8.175 + 242.250 105.110 0.427 0.247 7.170 + 242.500 110.830 0.431 0.252 6.289 + 242.750 110.289 0.443 0.253 5.729 + 243.000 109.104 0.452 0.247 4.658 + 243.250 107.920 0.452 0.241 4.087 + 243.500 107.378 0.442 0.234 3.944 + 243.750 106.786 0.439 0.230 3.873 + 244.000 106.854 0.445 0.233 3.879 + 244.250 108.800 0.455 0.240 3.811 + 244.500 110.120 0.461 0.241 3.746 + 244.750 107.683 0.466 0.232 3.752 + 245.000 104.637 0.467 0.219 3.758 + 245.250 107.192 0.467 0.229 3.765 + 245.500 112.896 0.468 0.237 3.769 + 245.750 119.868 0.472 0.238 3.777 + 246.000 120.562 0.476 0.233 3.783 + 246.250 119.378 0.474 0.224 3.788 + 246.500 117.584 0.469 0.211 3.868 + 246.750 115.756 0.435 0.200 3.871 + 247.000 108.310 0.424 0.223 4.107 + 247.250 100.220 0.409 0.252 4.351 + 247.500 94.043 0.405 0.261 5.792 + 247.750 91.589 0.406 0.273 7.012 + 248.000 79.760 0.406 0.290 8.488 + 248.250 69.199 0.402 0.293 11.088 + 248.500 71.772 0.399 0.286 13.170 + 248.750 74.987 0.397 0.269 13.443 + 249.000 77.543 0.398 0.262 11.569 + 249.250 84.481 0.400 0.258 9.957 + 249.500 83.940 0.405 0.256 7.505 + 249.750 77.103 0.399 0.252 6.711 + 250.000 70.926 0.390 0.248 6.474 + 250.250 69.115 0.387 0.260 6.481 + 250.500 68.556 0.393 0.274 6.742 + 250.750 67.998 0.401 0.290 7.144 + 251.000 68.692 0.405 0.305 8.486 + 251.250 69.995 0.414 0.304 9.708 + 251.500 77.594 0.418 0.292 9.189 + 251.750 90.185 0.428 0.275 8.211 + 252.000 105.941 0.433 0.258 7.337 + 252.250 107.262 0.422 0.243 6.942 + 252.500 109.208 0.408 0.231 7.091 + 252.750 111.780 0.396 0.229 7.374 + 253.000 114.996 0.392 0.228 8.274 + 253.250 113.794 0.392 0.233 9.285 + 253.500 107.600 0.392 0.238 10.618 + 253.750 101.389 0.389 0.242 11.696 + 254.000 93.943 0.383 0.244 17.119 + 254.250 95.263 0.375 0.236 17.801 + 254.500 99.105 0.369 0.229 19.233 + 254.750 94.163 0.367 0.241 21.994 + 255.000 83.586 0.366 0.253 25.172 + 255.250 79.270 0.364 0.264 25.221 + 255.500 78.069 0.362 0.275 24.776 + 255.750 95.060 0.359 0.268 23.891 + 256.000 98.885 0.359 0.254 23.038 + 256.250 102.710 0.361 0.230 22.640 + 256.500 99.647 0.364 0.211 24.010 + 256.750 87.817 0.364 0.221 24.488 + 257.000 82.875 0.360 0.238 26.467 + 257.250 77.917 0.352 0.257 28.606 + 257.500 73.601 0.347 0.263 30.895 + 257.750 79.948 0.344 0.254 30.373 + 258.000 80.659 0.344 0.242 28.727 + 258.250 82.605 0.344 0.231 27.192 + 258.500 87.665 0.345 0.211 26.210 + 258.750 100.900 0.350 0.204 24.343 + 259.000 101.627 0.351 0.208 23.465 + 259.250 99.800 0.354 0.212 21.785 + 259.500 98.615 0.357 0.214 20.621 + 259.750 98.683 0.361 0.219 20.644 + 260.000 100.629 0.368 0.223 21.072 + 260.250 101.932 0.377 0.223 21.104 + 260.500 106.417 0.384 0.221 19.976 + 260.750 109.599 0.397 0.219 18.205 + 261.000 112.797 0.414 0.220 16.889 + 261.250 110.987 0.430 0.235 14.535 + 261.500 94.148 0.437 0.254 12.754 + 261.750 86.684 0.425 0.281 11.614 + 262.000 79.255 0.416 0.303 11.418 + 262.250 78.696 0.405 0.328 12.104 + 262.500 78.764 0.387 0.323 18.753 + 262.750 78.832 0.383 0.318 21.035 + 263.000 78.900 0.384 0.321 25.474 + 263.250 79.577 0.387 0.324 29.678 + 263.500 82.166 0.390 0.324 37.342 + 263.750 89.765 0.393 0.321 42.688 + 264.000 86.702 0.399 0.315 43.572 + 264.250 84.265 0.408 0.311 43.639 + 264.500 78.054 0.412 0.307 42.080 + 264.750 82.505 0.400 0.298 39.815 + 265.000 99.496 0.368 0.273 36.271 + 265.250 108.957 0.328 0.239 30.055 + 265.500 117.808 0.353 0.210 25.381 + 265.750 123.511 0.382 0.198 19.496 + 266.000 128.588 0.392 0.147 14.148 + 266.250 134.326 0.405 0.116 11.499 + 266.500 136.881 0.432 0.130 9.896 + 266.750 140.080 0.438 0.142 9.188 + 267.000 140.165 0.425 0.143 8.530 + 267.250 139.589 0.419 0.144 8.226 + 267.500 137.829 0.420 0.145 7.792 + 267.750 137.237 0.422 0.145 7.654 + 268.000 136.069 0.423 0.145 7.375 + 268.250 136.103 0.422 0.144 7.251 + 268.500 136.171 0.422 0.141 7.126 + 268.750 135.003 0.423 0.138 7.273 + 269.000 134.445 0.424 0.122 7.571 + 269.250 133.886 0.426 0.108 7.722 + 269.500 131.449 0.426 0.102 8.033 + 269.750 128.386 0.422 0.100 8.356 + 270.000 127.202 0.419 0.103 8.529 + 270.250 127.895 0.415 0.105 8.705 + 270.500 131.720 0.416 0.106 8.722 + 270.750 135.562 0.416 0.106 8.571 + 271.000 136.256 0.414 0.105 8.423 + 271.250 135.071 0.402 0.102 8.281 + 271.500 121.989 0.385 0.101 8.291 + 271.750 120.788 0.339 0.098 8.462 + 272.000 120.856 0.296 0.093 8.971 + 272.250 120.297 0.265 0.073 10.259 + 272.500 121.634 0.252 0.049 12.186 + 272.750 114.797 0.237 0.030 15.919 + 273.000 91.679 0.227 0.025 19.270 + 273.250 77.954 0.219 0.022 22.898 + 273.500 71.760 0.215 0.022 25.704 + 273.750 69.323 0.217 0.023 26.236 + 274.000 67.512 0.225 0.024 26.287 + 274.250 68.206 0.230 0.032 25.813 + 274.500 72.657 0.241 0.044 23.515 + 274.750 82.135 0.253 0.074 19.858 + 275.000 98.500 0.271 0.078 16.146 + 275.250 104.829 0.292 0.079 14.427 + 275.500 106.150 0.318 0.079 13.148 + 275.750 107.470 0.339 0.077 12.678 + 276.000 106.945 0.355 0.076 12.469 + 276.250 106.370 0.373 0.075 12.483 + 276.500 103.916 0.380 0.071 12.498 + 276.750 95.217 0.372 0.066 13.249 + 277.000 81.509 0.369 0.049 14.867 + 277.250 72.793 0.351 0.035 20.952 + 277.500 62.216 0.296 0.018 23.511 + 277.750 56.022 0.228 0.005 29.005 + 278.000 52.332 0.194 0.002 37.165 + 278.250 49.895 0.165 0.003 47.639 + 278.500 48.085 0.160 0.008 52.454 + 278.750 46.900 0.167 0.014 48.699 + 279.000 48.220 0.215 0.018 42.714 + 279.250 50.810 0.247 0.020 36.072 + 279.500 52.113 0.255 0.023 30.473 + 279.750 52.824 0.270 0.028 27.750 + 280.000 52.891 0.297 0.033 24.340 diff --git a/examples/deployments/example_panel_app/static/js/wellio/dist/test/test.js b/examples/deployments/example_panel_app/static/js/wellio/dist/test/test.js new file mode 100644 index 0000000..f8dd9e1 --- /dev/null +++ b/examples/deployments/example_panel_app/static/js/wellio/dist/test/test.js @@ -0,0 +1,8 @@ +var test = require('tape'); + +test('timing test', function (t) { + t.plan(1); + + t.equal(typeof Date.now, 'function'); + var start = Date.now(); +}); diff --git a/examples/deployments/example_panel_app/static/js/wellio/dist/test/test_lasload.js b/examples/deployments/example_panel_app/static/js/wellio/dist/test/test_lasload.js new file mode 100644 index 0000000..365f0fd --- /dev/null +++ b/examples/deployments/example_panel_app/static/js/wellio/dist/test/test_lasload.js @@ -0,0 +1,58 @@ +var test = require('tape'); +const wellio = require('../index.js'); + +test('LASloaded file matches expected string', function (t) { + t.plan(1); + + let test_str = `~VERSION INFORMATION + VERS. 2.0 : CWLS LOG ASCII STANDARD -VERSION 2.0 + WRAP. NO : ONE LINE PER DEPTH STEP +~WELL INFORMATION +#MNEM.UNIT DATA DESCRIPTION +#----- ----- ---------- ------------------------- +STRT .M 1670.0000 :START DEPTH +STOP .M 1660.0000 :STOP DEPTH +STEP .M -0.1250 :STEP +NULL . -999.25 :NULL VALUE +COMP . ANY OIL COMPANY INC. :COMPANY +WELL . AAAAA_2 :WELL +FLD . WILDCAT :FIELD +LOC . 12-34-12-34W5M :LOCATION +PROV . ALBERTA :PROVINCE +SRVC . ANY LOGGING COMPANY INC. :SERVICE COMPANY +DATE . 13-DEC-86 :LOG DATE +UWI . 100123401234W500 :UNIQUE WELL ID +~CURVE INFORMATION +#MNEM.UNIT API CODES CURVE DESCRIPTION +#------------------ ------------ ------------------------- + DEPT .M : 1 DEPTH + DT .US/M 60 520 32 00 : 2 SONIC TRANSIT TIME + RHOB .K/M3 45 350 01 00 : 3 BULK DENSITY + NPHI .V/V 42 890 00 00 : 4 NEUTRON POROSITY + SFLU .OHMM 07 220 04 00 : 5 SHALLOW RESISTIVITY + SFLA .OHMM 07 222 01 00 : 6 SHALLOW RESISTIVITY + ILM .OHMM 07 120 44 00 : 7 MEDIUM RESISTIVITY + ILD .OHMM 07 120 46 00 : 8 DEEP RESISTIVITY +~PARAMETER INFORMATION +#MNEM.UNIT VALUE DESCRIPTION +#-------------- ---------------- ----------------------------------------------- + MUD . GEL CHEM : MUD TYPE + BHT .DEGC 35.5000 : BOTTOM HOLE TEMPERATURE + BS .MM 200.0000 : BIT SIZE + FD .K/M3 1000.0000 : FLUID DENSITY + MATR . SAND : NEUTRON MATRIX + MDEN . 2710.0000 : LOGGING MATRIX DENSITY + RMF .OHMM 0.2160 : MUD FILTRATE RESISTIVITY + DFD .K/M3 1525.0000 : DRILL FLUID DENSITY +~OTHER + Note: The logging tools became stuck at 625 metres causing the data + between 625 metres and 615 metres to be invalid. +~A DEPTH DT RHOB NPHI SFLU SFLA ILM ILD +1670.000 123.450 2550.000 0.450 123.450 123.450 110.200 105.600 +1669.875 123.450 2550.000 0.450 123.450 123.450 110.200 105.600 +1669.750 123.450 2550.000 0.450 123.450 123.450 110.200 105.600`; + + let well_string = wellio.loadLAS("assets/lasio_test.LAS"); + + t.equal(well_string === test_str, true); +}); diff --git a/examples/deployments/example_panel_app/static/js/wellio/package.json b/examples/deployments/example_panel_app/static/js/wellio/package.json new file mode 100644 index 0000000..022afa0 --- /dev/null +++ b/examples/deployments/example_panel_app/static/js/wellio/package.json @@ -0,0 +1,86 @@ +{ + "_args": [ + [ + "wellio@0.1.7", + "C:\\Users\\natha\\PycharmProjects\\wellioviz" + ] + ], + "_from": "wellio@0.1.7", + "_id": "wellio@0.1.7", + "_inBundle": false, + "_integrity": "sha512-J0E39NeUT0PWTrULO4EsP0uOx9HWOfNtJIKFLHsFw3hlRn6pES1YLBQvRIiFFFRN1b4oPzqrxE2d/PEn9oKfOw==", + "_location": "/wellio", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "wellio@0.1.7", + "name": "wellio", + "escapedName": "wellio", + "rawSpec": "0.1.7", + "saveSpec": null, + "fetchSpec": "0.1.7" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/wellio/-/wellio-0.1.7.tgz", + "_spec": "0.1.7", + "_where": "C:\\Users\\natha\\PycharmProjects\\wellioviz", + "author": { + "name": "Justin Gosses" + }, + "bugs": { + "url": "https://github.com/JustinGOSSES/wellio.js/issues" + }, + "description": "Provides functionality to load a LAS 2.0 formatted well log file and convert it to a json file and then return different information about the well log", + "devDependencies": { + "ajv-cli": "^3.0.0", + "eslint-config-google": "^0.9.1", + "eslint-config-standard": "^11.0.0", + "eslint-plugin-import": "^2.9.0", + "eslint-plugin-node": "^6.0.1", + "eslint-plugin-promise": "^3.7.0", + "eslint-plugin-standard": "^3.0.1", + "tape": "~4.9.0" + }, + "files": [ + "dist/index.js", + "dist/test/test.js", + "dist/test/test.LAS", + "dist/test/test_lasload.js" + ], + "homepage": "https://github.com/JustinGOSSES/wellio.js#readme", + "keywords": [ + "LAS", + "LAS2.0", + "Well", + "Well-log", + "log", + "geology", + "stratigraphy", + "geoscience", + "IO", + "well", + "welllog", + "Log", + "geology", + "welly", + "lasio" + ], + "license": "MIT", + "main": "dist/index.js", + "name": "wellio", + "repository": { + "type": "git", + "url": "git+https://github.com/JustinGOSSES/wellio.js.git" + }, + "scripts": { + "test": "dist/test/test.js", + "test-all": "tape dist/test/test*.js", + "test-las2json": "tape dist/test/las2json/test_*.js", + "test-lasload": "tape dist/test/test_lasload.js" + }, + "unpkg": "dist/index.js", + "version": "0.1.7" +} diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/index.js b/examples/deployments/example_panel_app/static/js/wellioviz/dist/index.js similarity index 100% rename from example_deployments/example_panel_app/static/js/wellioviz/dist/index.js rename to examples/deployments/example_panel_app/static/js/wellioviz/dist/index.js diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted.js b/examples/deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted.js similarity index 100% rename from example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted.js rename to examples/deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted.js diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted2.js b/examples/deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted2.js similarity index 100% rename from example_deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted2.js rename to examples/deployments/example_panel_app/static/js/wellioviz/dist/index_eslint_busted2.js diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/test/test.js b/examples/deployments/example_panel_app/static/js/wellioviz/dist/test/test.js similarity index 100% rename from example_deployments/example_panel_app/static/js/wellioviz/dist/test/test.js rename to examples/deployments/example_panel_app/static/js/wellioviz/dist/test/test.js diff --git a/example_deployments/example_panel_app/static/js/wellioviz/dist/trial.js b/examples/deployments/example_panel_app/static/js/wellioviz/dist/trial.js similarity index 100% rename from example_deployments/example_panel_app/static/js/wellioviz/dist/trial.js rename to examples/deployments/example_panel_app/static/js/wellioviz/dist/trial.js diff --git a/example_deployments/example_panel_app/templates/index.html b/examples/deployments/example_panel_app/templates/index.html similarity index 71% rename from example_deployments/example_panel_app/templates/index.html rename to examples/deployments/example_panel_app/templates/index.html index 3d1764f..a9d99ca 100644 --- a/example_deployments/example_panel_app/templates/index.html +++ b/examples/deployments/example_panel_app/templates/index.html @@ -6,7 +6,8 @@ - + + {{ bokeh_css }} {{ bokeh_js }} @@ -14,9 +15,9 @@ - + + + {{ plot_div|indent(8) }} {{ plot_script|indent(8) }}
    diff --git a/example_deployments/example_panel_app/templates/js/bundle.js b/examples/deployments/example_panel_app/templates/js/bundle.js similarity index 100% rename from example_deployments/example_panel_app/templates/js/bundle.js rename to examples/deployments/example_panel_app/templates/js/bundle.js diff --git a/example_deployments/example_panel_app/templates/js/call_plots.js b/examples/deployments/example_panel_app/templates/js/call_plots.js similarity index 100% rename from example_deployments/example_panel_app/templates/js/call_plots.js rename to examples/deployments/example_panel_app/templates/js/call_plots.js diff --git a/example_deployments/example_panel_app/templates/js/get_wellio.js b/examples/deployments/example_panel_app/templates/js/get_wellio.js similarity index 100% rename from example_deployments/example_panel_app/templates/js/get_wellio.js rename to examples/deployments/example_panel_app/templates/js/get_wellio.js diff --git a/example_deployments/example_panel_app/templates/js/main.js b/examples/deployments/example_panel_app/templates/js/main.js similarity index 100% rename from example_deployments/example_panel_app/templates/js/main.js rename to examples/deployments/example_panel_app/templates/js/main.js diff --git a/example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_1.js b/examples/deployments/example_panel_app/templates/js/old_for_reference/bundle_old_1.js similarity index 100% rename from example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_1.js rename to examples/deployments/example_panel_app/templates/js/old_for_reference/bundle_old_1.js diff --git a/example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_temp.js b/examples/deployments/example_panel_app/templates/js/old_for_reference/bundle_old_temp.js similarity index 100% rename from example_deployments/example_panel_app/templates/js/old_for_reference/bundle_old_temp.js rename to examples/deployments/example_panel_app/templates/js/old_for_reference/bundle_old_temp.js diff --git a/example_deployments/example_panel_app/templates/js/old_for_reference/call_plots_old.js b/examples/deployments/example_panel_app/templates/js/old_for_reference/call_plots_old.js similarity index 100% rename from example_deployments/example_panel_app/templates/js/old_for_reference/call_plots_old.js rename to examples/deployments/example_panel_app/templates/js/old_for_reference/call_plots_old.js diff --git a/example_deployments/example_panel_app/templates/js/vkbeautify.js b/examples/deployments/example_panel_app/templates/js/vkbeautify.js similarity index 100% rename from example_deployments/example_panel_app/templates/js/vkbeautify.js rename to examples/deployments/example_panel_app/templates/js/vkbeautify.js diff --git a/examples/deployments/example_panel_app/templates/main.js b/examples/deployments/example_panel_app/templates/main.js new file mode 100644 index 0000000..c01c8c8 --- /dev/null +++ b/examples/deployments/example_panel_app/templates/main.js @@ -0,0 +1,2 @@ +say_hi() +// plot_log("current_log") diff --git a/example_deployments/example_panel_app/templates/styles.css b/examples/deployments/example_panel_app/templates/styles.css similarity index 100% rename from example_deployments/example_panel_app/templates/styles.css rename to examples/deployments/example_panel_app/templates/styles.css diff --git a/example_standalone_webpage/00-01-11-082-23W4-0.LAS b/examples/deployments/example_standalone_webpage/00-01-11-082-23W4-0.LAS similarity index 100% rename from example_standalone_webpage/00-01-11-082-23W4-0.LAS rename to examples/deployments/example_standalone_webpage/00-01-11-082-23W4-0.LAS diff --git a/example_standalone_webpage/00_01-01-073-05W5_0-1.json b/examples/deployments/example_standalone_webpage/00_01-01-073-05W5_0-1.json similarity index 100% rename from example_standalone_webpage/00_01-01-073-05W5_0-1.json rename to examples/deployments/example_standalone_webpage/00_01-01-073-05W5_0-1.json diff --git a/example_standalone_webpage/make_a_plot.js b/examples/deployments/example_standalone_webpage/make_a_plot.js similarity index 100% rename from example_standalone_webpage/make_a_plot.js rename to examples/deployments/example_standalone_webpage/make_a_plot.js diff --git a/example_standalone_webpage/static/test_bokeh.js b/examples/deployments/example_standalone_webpage/static/test_bokeh.js similarity index 100% rename from example_standalone_webpage/static/test_bokeh.js rename to examples/deployments/example_standalone_webpage/static/test_bokeh.js diff --git a/example_standalone_webpage/well_log_viz/curve_box.js b/examples/deployments/example_standalone_webpage/well_log_viz/curve_box.js similarity index 100% rename from example_standalone_webpage/well_log_viz/curve_box.js rename to examples/deployments/example_standalone_webpage/well_log_viz/curve_box.js diff --git a/example_standalone_webpage/well_log_viz/d3.js b/examples/deployments/example_standalone_webpage/well_log_viz/d3.js similarity index 100% rename from example_standalone_webpage/well_log_viz/d3.js rename to examples/deployments/example_standalone_webpage/well_log_viz/d3.js diff --git a/example_standalone_webpage/well_log_viz/format_template.js b/examples/deployments/example_standalone_webpage/well_log_viz/format_template.js similarity index 100% rename from example_standalone_webpage/well_log_viz/format_template.js rename to examples/deployments/example_standalone_webpage/well_log_viz/format_template.js diff --git a/example_standalone_webpage/well_log_viz/single_well_log_display.js b/examples/deployments/example_standalone_webpage/well_log_viz/single_well_log_display.js similarity index 100% rename from example_standalone_webpage/well_log_viz/single_well_log_display.js rename to examples/deployments/example_standalone_webpage/well_log_viz/single_well_log_display.js diff --git a/example_standalone_webpage/well_log_viz/test_log.html b/examples/deployments/example_standalone_webpage/well_log_viz/test_log.html similarity index 100% rename from example_standalone_webpage/well_log_viz/test_log.html rename to examples/deployments/example_standalone_webpage/well_log_viz/test_log.html diff --git a/example_standalone_webpage/well_log_viz/test_log.json b/examples/deployments/example_standalone_webpage/well_log_viz/test_log.json similarity index 100% rename from example_standalone_webpage/well_log_viz/test_log.json rename to examples/deployments/example_standalone_webpage/well_log_viz/test_log.json diff --git a/example_standalone_webpage/well_viz_html.html b/examples/deployments/example_standalone_webpage/well_viz_html.html similarity index 80% rename from example_standalone_webpage/well_viz_html.html rename to examples/deployments/example_standalone_webpage/well_viz_html.html index 6ef055b..ef2ce69 100644 --- a/example_standalone_webpage/well_viz_html.html +++ b/examples/deployments/example_standalone_webpage/well_viz_html.html @@ -3,9 +3,9 @@ - + - + From 3c159425ea4003de07572d65e67a3cc3ccc93d7b Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Fri, 12 Jun 2020 13:42:15 -0700 Subject: [PATCH 10/17] Added configuration for jest unit testing. Added abstract class-like objects covering: curve fills, curves, tracks, and well logs with multiple tracks. I have a plan to add "well section" type template that handles drawing multiple well logs. --- dist/fill_templates/curve_fill_template.js | 14 + .../log_style_templates/log_curve_template.js | 51 + dist/test/curve_fill_template.test.js | 5 + dist/test/{test.js => data_for_testing.js} | 0 dist/test/log_templates.test.js | 28 + dist/test/track_template.test.js | 18 + dist/track_templates/track_template.js | 36 + dist/well_log_templates/well_log_template.js | 10 + .../test/{test.js => data_for_testing.js} | 0 package-lock.json | 8293 ++++++++++++++--- package.json | 92 +- 11 files changed, 7049 insertions(+), 1498 deletions(-) create mode 100644 dist/fill_templates/curve_fill_template.js create mode 100644 dist/log_style_templates/log_curve_template.js create mode 100644 dist/test/curve_fill_template.test.js rename dist/test/{test.js => data_for_testing.js} (100%) create mode 100644 dist/test/log_templates.test.js create mode 100644 dist/test/track_template.test.js create mode 100644 dist/track_templates/track_template.js create mode 100644 dist/well_log_templates/well_log_template.js rename examples/deployments/example_panel_app/static/js/wellioviz/dist/test/{test.js => data_for_testing.js} (100%) diff --git a/dist/fill_templates/curve_fill_template.js b/dist/fill_templates/curve_fill_template.js new file mode 100644 index 0000000..fd950e6 --- /dev/null +++ b/dist/fill_templates/curve_fill_template.js @@ -0,0 +1,14 @@ +class CurveFillTemplate { + constructor(params={}) { + this.curve_name = "default" + this.fill = "no" + this.fill_direction = "left" + this.cutoffs = Array(0) // TODO should take values OR curve names + this.fill_colors = Array(0) + //Update template based on passed params + for (const [key, value] in Object.entries(params)){ + obj[key] = value + } + } +} +module.exports = CurveFillTemplate \ No newline at end of file diff --git a/dist/log_style_templates/log_curve_template.js b/dist/log_style_templates/log_curve_template.js new file mode 100644 index 0000000..a6a28be --- /dev/null +++ b/dist/log_style_templates/log_curve_template.js @@ -0,0 +1,51 @@ +// Base sort of abstract template, specialized templates can override pieces of this +const fill_template = require('../fill_templates/curve_fill_template'); +class LogCurveTemplate { + // const obj = {} + // Define Default Settings Values + constructor(params={}) { + this.curve_name = "default" + this.color = "black" + this.stroke_type = "solid" + this.stroke_linecap = "butt" + this.stroke_width = 1.0 + this.stroke_transparency = 1.0 + this.fill = new fill_template() + this.units = "unkn" + this.depth_limits = {"min": "autocalculate", "max": "autocalculate"} + this.curve_limits = {"min": -100000, "max":3} // TODO: This needs to be looked at more + this.data = Array(0) + this.data_id = "" + this.well_name = "default" + this.uwi14 = "00000000000000" + this.isLinear = true // false sets to a log scale + this.depth_type = "MD" + this.depth_units = "meter" + // Define Template Functions + // TODO: decide if null are handled here or at load validation + //Update template based on passed params + for (const [key, value] in Object.entries(params)){ + obj[key] = value + } + } + // Simple function to set the data that is associated with this curve + define_data(data) { + // Add data to a template + // TODO: Validation step here?? + this.data = data + return this + } + // Function change the target curve name and data for the instance of curve template + set_curve_and_data(curve_name, data, params={}){ + this.define_data(data) + this.curve_name = curve_name + //Update template based on passed params + for (const [key, value] in Object.entries(params)){ + obj[key] = value + } + return this + } + +} + +module.exports = LogCurveTemplate; \ No newline at end of file diff --git a/dist/test/curve_fill_template.test.js b/dist/test/curve_fill_template.test.js new file mode 100644 index 0000000..2c4d347 --- /dev/null +++ b/dist/test/curve_fill_template.test.js @@ -0,0 +1,5 @@ +const fill_template = require('../fill_templates/curve_fill_template'); + +test('default fill curve template curve_name is a property', () => { + expect(new fill_template()).toHaveProperty("curve_name") +}) diff --git a/dist/test/test.js b/dist/test/data_for_testing.js similarity index 100% rename from dist/test/test.js rename to dist/test/data_for_testing.js diff --git a/dist/test/log_templates.test.js b/dist/test/log_templates.test.js new file mode 100644 index 0000000..7d7ce84 --- /dev/null +++ b/dist/test/log_templates.test.js @@ -0,0 +1,28 @@ +const log_curve_template = require('../log_style_templates/log_curve_template'); +let test_curve_data_1 = [ + {'Depth': 0.0, 'Default': 1.0}, + {'Depth': 1.0, 'Default': 0.0}, + {'Depth': 2.0, 'Default': 1.0}, + {'Depth': 4.0, 'Default': 2.0}, +] + +let test_curve_data_2 = [ + {'Depth': 1.0, 'RHOB': 1.0}, + {'Depth': 2.0, 'RHOB': 0.0}, + {'Depth': 3.0, 'RHOB': 1.0}, + {'Depth': 4.0, 'RHOB': 2.0}, +] + +test('default log curve template name is a property', () => { + expect(new log_curve_template()).toHaveProperty("curve_name") + }) + + +test('test define data function', () => { + expect(new log_curve_template().define_data(test_curve_data_1).data[0]['Depth']).toBeLessThan(0.5) +}) + +test('test define curve and data function', () => { + expect(new log_curve_template().set_curve_and_data( + 'RHOB', test_curve_data_2).data[0]['Depth']).toBeGreaterThan(0.5) +}) diff --git a/dist/test/track_template.test.js b/dist/test/track_template.test.js new file mode 100644 index 0000000..acc28cb --- /dev/null +++ b/dist/test/track_template.test.js @@ -0,0 +1,18 @@ +const track_template = require('../track_templates/track_template'); +const log_curve_template = require('../log_style_templates/log_curve_template'); + +let test_curve_data = [ + {'Depth': 1.0, 'RHOB': 1.0}, + {'Depth': 2.0, 'RHOB': 0.0}, + {'Depth': 3.0, 'RHOB': 1.0}, + {'Depth': 4.0, 'RHOB': 2.0}, +] +let test_curve = new log_curve_template().set_curve_and_data('RHOB', test_curve_data) + +test('default track name is a property', () => { + expect(new track_template()).toHaveProperty("track_name") +}) + +test('add curve works', () => { + expect(new track_template().add_curve(test_curve).curves['RHOB'].curve_name).toBe("RHOB") +}) diff --git a/dist/track_templates/track_template.js b/dist/track_templates/track_template.js new file mode 100644 index 0000000..28fae8d --- /dev/null +++ b/dist/track_templates/track_template.js @@ -0,0 +1,36 @@ + +const log_curve_template = require('../log_style_templates/log_curve_template'); + +class TrackTemplate { + constructor(params={}) { + this.track_name = "default" + this.show_well_name = true + this.show_depth_type = false + this.show_curves_units = true + this.show_null = false + this.show_track_title = false + this.grid_lines = true + this.independent_scale = true + this.mouse_over = true + this.mouse_over_depth_only = false + this.grid_color = "#D3D3D3" + this.grid_stroke_width = 0.2 + this.track_dimensions = {"height": 500, "width": 260} + this.scale_denominator = 2 + this.margin = {"top": 10, "right": 10, "bottom": 30, "left": 60} + this.title = {"text": "default", "font": "16px"} + this.div_id = "default_track" + this.curves = {} + // TODO: look at other potential track level variables + for (const [key, value] in Object.entries(params)){ + obj[key] = value + } + } + + add_curve(curve) { + this.curves[curve.curve_name] = curve + return this + } + +} +module.exports = TrackTemplate \ No newline at end of file diff --git a/dist/well_log_templates/well_log_template.js b/dist/well_log_templates/well_log_template.js new file mode 100644 index 0000000..1b6a78d --- /dev/null +++ b/dist/well_log_templates/well_log_template.js @@ -0,0 +1,10 @@ +class WellLogTemplate { + constructor(params = {}) { + this.well_log_header = {} + this.tracks = {} + this.log_border_padding = 20.0 + this.pick_lines = {} + this.other_lines = Array(0) + this. + } +} \ No newline at end of file diff --git a/examples/deployments/example_panel_app/static/js/wellioviz/dist/test/test.js b/examples/deployments/example_panel_app/static/js/wellioviz/dist/test/data_for_testing.js similarity index 100% rename from examples/deployments/example_panel_app/static/js/wellioviz/dist/test/test.js rename to examples/deployments/example_panel_app/static/js/wellioviz/dist/test/data_for_testing.js diff --git a/package-lock.json b/package-lock.json index e62036a..a44d539 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,12 +13,175 @@ "@babel/highlight": "^7.10.1" } }, + "@babel/core": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.2", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.2", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", + "dev": true, + "requires": { + "@babel/types": "^7.10.1" + } + }, "@babel/helper-validator-identifier": { "version": "7.10.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", "dev": true }, + "@babel/helpers": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, "@babel/highlight": { "version": "7.10.1", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", @@ -30,1267 +193,4151 @@ "js-tokens": "^4.0.0" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "@babel/parser": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "acorn": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", - "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", - "dev": true + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } }, - "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true + "@babel/plugin-syntax-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", + "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", - "dev": true + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz", + "integrity": "sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } }, - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", + "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "@babel/helper-plugin-utils": "^7.10.1" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/template": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" + } + }, + "@babel/traverse": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" }, "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true } } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" } }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "dependencies": { - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "has": "^1.0.3" + "p-locate": "^4.1.0" } }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" + "p-try": "^2.0.0" } }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" + "p-limit": "^2.2.0" } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@jest/console": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.0.1.tgz", + "integrity": "sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "jest-message-util": "^26.0.1", + "jest-util": "^26.0.1", + "slash": "^3.0.0" }, "dependencies": { - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "has": "^1.0.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" + "color-name": "~1.1.4" } }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" + "has-flag": "^4.0.0" } } } }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "@jest/core": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.0.1.tgz", + "integrity": "sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ==", "dev": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "@jest/console": "^26.0.1", + "@jest/reporters": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.0.1", + "jest-config": "^26.0.1", + "jest-haste-map": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-resolve-dependencies": "^26.0.1", + "jest-runner": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "jest-watcher": "^26.0.1", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "inherits": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "inherits": "2.0.1" + "glob": "^7.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "@jest/environment": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.0.1.tgz", + "integrity": "sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "@jest/fake-timers": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.0.1.tgz", + "integrity": "sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg==", "dev": true, "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" + "@jest/types": "^26.0.1", + "@sinonjs/fake-timers": "^6.0.1", + "jest-message-util": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1" } }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "@jest/globals": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.0.1.tgz", + "integrity": "sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA==", "dev": true, "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "@jest/environment": "^26.0.1", + "@jest/types": "^26.0.1", + "expect": "^26.0.1" } }, - "browserify": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.1.tgz", - "integrity": "sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==", + "@jest/reporters": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.0.1.tgz", + "integrity": "sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g==", "dev": true, "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.0.1", + "jest-resolve": "^26.0.1", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "node-notifier": "^7.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.1.3" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "@jest/source-map": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.0.0.tgz", + "integrity": "sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ==", "dev": true, "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "@jest/test-result": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.0.1.tgz", + "integrity": "sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg==", "dev": true, "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "@jest/console": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "@jest/test-sequencer": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz", + "integrity": "sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@jest/test-result": "^26.0.1", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.0.1", + "jest-runner": "^26.0.1", + "jest-runtime": "^26.0.1" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "@jest/transform": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.0.1.tgz", + "integrity": "sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "@babel/core": "^7.1.0", + "@jest/types": "^26.0.1", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.0.1", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "@jest/types": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.0.1.tgz", + "integrity": "sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==", "dev": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "@sinonjs/commons": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", + "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", "dev": true, "requires": { - "pako": "~1.0.5" + "type-detect": "4.0.8" } }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "@sinonjs/commons": "^1.7.0" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "@types/babel__core": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.8.tgz", + "integrity": "sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } }, - "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true + "@types/babel__traverse": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.12.tgz", + "integrity": "sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@types/node": "*" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", "dev": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@types/istanbul-lib-coverage": "*" } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "@types/node": { + "version": "14.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.13.tgz", + "integrity": "sha512-rouEWBImiRaSJsVA+ITTFM6ZxibuAlTuNOCyxVbwreu6k6+ujs7DfnU9o+PShFhET78pMBl3eH+AGSI5eOTkPA==", "dev": true }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "@types/prettier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.1.tgz", + "integrity": "sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==", "dev": true }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", "dev": true, "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" + "@types/yargs-parser": "*" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, - "confusing-browser-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", - "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", "dev": true }, - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", "dev": true }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "color-convert": "^1.9.0" } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "sprintf-js": "~1.0.2" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + } + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true + }, + "babel-jest": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.0.1.tgz", + "integrity": "sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw==", + "dev": true, + "requires": { + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz", + "integrity": "sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz", + "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz", + "integrity": "sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.0.0", + "babel-preset-current-node-syntax": "^0.1.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bn.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.1.tgz", + "integrity": "sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", "public-encrypt": "^4.0.0", "randombytes": "^2.0.0", "randomfill": "^1.0.3" } }, - "d3": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.0.tgz", - "integrity": "sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==", + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "d3": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.0.tgz", + "integrity": "sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", + "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" + }, + "d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", + "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" + }, + "d3-geo": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz", + "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diff-sequences": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", + "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.2.tgz", + "integrity": "sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.2.tgz", + "integrity": "sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", + "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.1" + } + }, + "eslint-config-google": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", + "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", + "dev": true + }, + "eslint-config-standard": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", + "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", + "integrity": "sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==", + "dev": true, + "requires": { + "ignore": "^3.3.6", + "minimatch": "^3.0.4", + "resolve": "^1.3.3", + "semver": "^5.4.1" + } + }, + "eslint-plugin-promise": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", + "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", + "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==", + "dev": true + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expect": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.0.1.tgz", + "integrity": "sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.0.0", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-regex-util": "^26.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" + "escape-string-regexp": "^1.0.5" } }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } }, - "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } }, - "d3-brush": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", - "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "locate-path": "^2.0.0" } }, - "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, "requires": { - "d3-array": "1", - "d3-path": "1" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" } }, - "d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true }, - "d3-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", - "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } }, - "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { - "d3-array": "^1.1.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } }, - "d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, "requires": { - "d3-dispatch": "1", - "d3-selection": "1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, - "d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "d3-ease": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", - "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" - }, - "d3-fetch": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", - "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, "requires": { - "d3-dsv": "1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, - "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "d3-format": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", - "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" - }, - "d3-geo": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz", - "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==", + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, "requires": { - "d3-array": "1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true }, - "d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, "requires": { - "d3-color": "1" + "whatwg-encoding": "^1.0.5" } }, - "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, - "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "requires": { - "d3-color": "1", - "d3-interpolate": "1" - } + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true }, - "d3-selection": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", - "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true }, - "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { - "d3-path": "1" + "safer-buffer": ">= 2.1.2 < 3" } }, - "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true }, - "d3-time-format": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", - "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, "requires": { - "d3-time": "1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } } }, - "d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, - "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "once": "^1.3.0", + "wrappy": "1" } }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", "dev": true, "requires": { - "ms": "^2.1.1" + "source-map": "~0.5.3" } }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, - "deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "ci-info": "^2.0.0" } }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, - "doctrine": { + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true, + "optional": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "esutils": "^2.0.2" + "is-extglob": "^2.1.1" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "isobject": "^3.0.1" } }, - "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "has": "^1.0.1" } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true }, - "es-abstract": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.2.tgz", - "integrity": "sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==", + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" + "has-symbols": "^1.0.1" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "optional": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-docker": "^2.0.0" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -1299,564 +4346,1215 @@ } } }, - "eslint-config-airbnb-base": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", - "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.9", - "object.assign": "^4.1.0", - "object.entries": "^1.1.1" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "eslint-config-google": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", - "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", - "dev": true + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } }, - "eslint-config-standard": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", - "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==", - "dev": true + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } }, - "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "jest": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.0.1.tgz", + "integrity": "sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "@jest/core": "^26.0.1", + "import-local": "^3.0.2", + "jest-cli": "^26.0.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-cli": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.0.1.tgz", + "integrity": "sha512-pFLfSOBcbG9iOZWaMK4Een+tTxi/Wcm34geqZEqrst9cZDkTQ1LZ2CnBrTlHWuYAiTMFr0EQeK52ScyFU8wK+w==", "dev": true, "requires": { - "ms": "2.0.0" + "@jest/core": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "prompts": "^2.0.1", + "yargs": "^15.3.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "jest-changed-files": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.0.1.tgz", + "integrity": "sha512-q8LP9Sint17HaE2LjxQXL+oYWW/WeeXMPE2+Op9X3mY8IEGFVc14xRxFjUuXUbcPAlDLhtWdIEt59GdQbn76Hw==", "dev": true, "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" + "@jest/types": "^26.0.1", + "execa": "^4.0.0", + "throat": "^5.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "ms": "2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "ms": { + "execa": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", - "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "ms": "2.0.0" + "path-key": "^3.0.0" } }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "shebang-regex": "^3.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, - "eslint-plugin-node": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", - "integrity": "sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==", - "dev": true, - "requires": { - "ignore": "^3.3.6", - "minimatch": "^3.0.4", - "resolve": "^1.3.3", - "semver": "^5.4.1" - } - }, - "eslint-plugin-promise": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", - "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", - "dev": true - }, - "eslint-plugin-standard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", - "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==", - "dev": true - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "jest-config": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.0.1.tgz", + "integrity": "sha512-9mWKx2L1LFgOXlDsC4YSeavnblN6A4CPfXFiobq+YYLaBMymA/SczN7xYTSmLaEYHZOcB98UdoN4m5uNt6tztg==", "dev": true, "requires": { - "estraverse": "^5.1.0" + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.0.1", + "@jest/types": "^26.0.1", + "babel-jest": "^26.0.1", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.0.1", + "jest-environment-node": "^26.0.1", + "jest-get-type": "^26.0.0", + "jest-jasmine2": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "micromatch": "^4.0.2", + "pretty-format": "^26.0.1" }, "dependencies": { - "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "jest-diff": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.0.1.tgz", + "integrity": "sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ==", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "chalk": "^4.0.0", + "diff-sequences": "^26.0.0", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "detect-newline": "^3.0.0" } }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "jest-each": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.0.1.tgz", + "integrity": "sha512-OTgJlwXCAR8NIWaXFL5DBbeS4QIYPuNASkzSwMCJO+ywo9BEa6TqkaSWsfR7VdbMLdgYJqSfQcIyjJCNwl5n4Q==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "jest-get-type": "^26.0.0", + "jest-util": "^26.0.1", + "pretty-format": "^26.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "jest-environment-jsdom": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.0.1.tgz", + "integrity": "sha512-u88NJa3aptz2Xix2pFhihRBAatwZHWwSiRLBDBQE1cdJvDjPvv7ZGA0NQBxWwDDn7D0g1uHqxM8aGgfA9Bx49g==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1", + "jsdom": "^16.2.2" } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "jest-environment-node": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.0.1.tgz", + "integrity": "sha512-4FRBWcSn5yVo0KtNav7+5NH5Z/tEgDLp7VRQVS5tCouWORxj+nI+1tOLutM07Zb2Qi7ja+HEDoOUkjBSWZg/IQ==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/types": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-util": "^26.0.1" } }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "jest-get-type": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", + "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", "dev": true }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "jest-haste-map": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.0.1.tgz", + "integrity": "sha512-J9kBl/EdjmDsvyv7CiyKY5+DsTvVOScenprz/fGqfLg/pm1gdjbwwQ98nW0t+OIt+f+5nAVaElvn/6wP5KO7KA==", "dev": true, "requires": { - "is-callable": "^1.1.3" + "@jest/types": "^26.0.1", + "@types/graceful-fs": "^4.1.2", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-serializer": "^26.0.0", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "jest-jasmine2": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.0.1.tgz", + "integrity": "sha512-ILaRyiWxiXOJ+RWTKupzQWwnPaeXPIoLS5uW41h18varJzd9/7I0QJGqg69fhTT1ev9JpSSo9QtalriUN0oqOg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.0.1", + "@jest/source-map": "^26.0.0", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.0.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.0.1", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "pretty-format": "^26.0.1", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.0.1.tgz", + "integrity": "sha512-93FR8tJhaYIWrWsbmVN1pQ9ZNlbgRpfvrnw5LmgLRX0ckOJ8ut/I35CL7awi2ecq6Ca4lL59bEK9hr7nqoHWPA==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" } }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "jest-matcher-utils": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz", + "integrity": "sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "chalk": "^4.0.0", + "jest-diff": "^26.0.1", + "jest-get-type": "^26.0.0", + "pretty-format": "^26.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "jest-message-util": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.0.1.tgz", + "integrity": "sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.0.1", + "@types/stack-utils": "^1.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "jest-mock": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.0.1.tgz", + "integrity": "sha512-MpYTBqycuPYSY6xKJognV7Ja46/TeRbAZept987Zp+tuJvMN0YBWyyhG9mXyYQaU3SBI0TUlSaO5L3p49agw7Q==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "@jest/types": "^26.0.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", "dev": true }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", "dev": true }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "jest-resolve": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.0.1.tgz", + "integrity": "sha512-6jWxk0IKZkPIVTvq6s72RH735P8f9eCJW3IM5CX/SJFeKq1p2cZx0U49wf/SdMlhaB/anann5J2nCJj6HrbezQ==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "jest-util": "^26.0.1", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "jest-resolve-dependencies": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.0.1.tgz", + "integrity": "sha512-9d5/RS/ft0vB/qy7jct/qAhzJsr6fRQJyGAFigK3XD4hf9kIbEH5gks4t4Z7kyMRhowU6HWm/o8ILqhaHdSqLw==", "dev": true, "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "@jest/types": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.0.1" } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "jest-runner": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.0.1.tgz", + "integrity": "sha512-CApm0g81b49Znm4cZekYQK67zY7kkB4umOlI2Dx5CwKAzdgw75EN+ozBHRvxBzwo1ZLYZ07TFxkaPm+1t4d8jA==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@jest/console": "^26.0.1", + "@jest/environment": "^26.0.1", + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.0.1", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.0.1", + "jest-jasmine2": "^26.0.1", + "jest-leak-detector": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-resolve": "^26.0.1", + "jest-runtime": "^26.0.1", + "jest-util": "^26.0.1", + "jest-worker": "^26.0.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "jest-runtime": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.0.1.tgz", + "integrity": "sha512-Ci2QhYFmANg5qaXWf78T2Pfo6GtmIBn2rRaLnklRyEucmPccmCKvS9JPljcmtVamsdMmkyNkVFb9pBTD6si9Lw==", + "dev": true, + "requires": { + "@jest/console": "^26.0.1", + "@jest/environment": "^26.0.1", + "@jest/fake-timers": "^26.0.1", + "@jest/globals": "^26.0.1", + "@jest/source-map": "^26.0.0", + "@jest/test-result": "^26.0.1", + "@jest/transform": "^26.0.1", + "@jest/types": "^26.0.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.0.1", + "jest-haste-map": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-mock": "^26.0.1", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.0.1", + "jest-snapshot": "^26.0.1", + "jest-util": "^26.0.1", + "jest-validate": "^26.0.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "jest-serializer": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.0.0.tgz", + "integrity": "sha512-sQGXLdEGWFAE4wIJ2ZaIDb+ikETlUirEOBsLXdoBbeLhTHkZUJwgk3+M8eyFizhM6le43PDCCKPA1hzkSDo4cQ==", "dev": true, "requires": { - "source-map": "~0.5.3" + "graceful-fs": "^4.2.4" } }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "jest-snapshot": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.0.1.tgz", + "integrity": "sha512-jxd+cF7+LL+a80qh6TAnTLUZHyQoWwEHSUFJjkw35u3Gx+BZUNuXhYvDqHXr62UQPnWo2P6fvQlLjsU93UKyxA==", "dev": true, "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "@babel/types": "^7.0.0", + "@jest/types": "^26.0.1", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.0.1", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.0.1", + "jest-get-type": "^26.0.0", + "jest-matcher-utils": "^26.0.1", + "jest-message-util": "^26.0.1", + "jest-resolve": "^26.0.1", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^26.0.1", + "semver": "^7.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-util": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.0.1.tgz", + "integrity": "sha512-byQ3n7ad1BO/WyFkYvlWQHTsomB6GIewBh8tlGtusiylAlaxQ1UpS0XYH0ngOyhZuHVLN79Qvl6/pMiDMSSG1g==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -1870,9 +5568,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1900,15 +5598,78 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "strip-ansi": { + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.0.1.tgz", + "integrity": "sha512-u0xRc+rbmov/VqXnX3DlkxD74rHI/CfS5xaV2VpeaVySjbb1JioNVOyly5b56q2l9ZKe7bVG5qWmjfctkQb0bA==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.0.0", + "leven": "^3.1.0", + "pretty-format": "^26.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "camelcase": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -1920,105 +5681,99 @@ } } }, - "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "jest-watcher": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.0.1.tgz", + "integrity": "sha512-pdZPydsS8475f89kGswaNsN3rhP6lnC3/QDCppP7bg1L9JQz7oU9Mb/5xPETk1RHDCWeqmVC47M4K5RR7ejxFw==", "dev": true, "requires": { - "has": "^1.0.1" + "@jest/test-result": "^26.0.1", + "@jest/types": "^26.0.1", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.0.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "jest-worker": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2035,6 +5790,64 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz", + "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.0.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2056,6 +5869,21 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -2068,6 +5896,30 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, "labeled-stream-splicer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", @@ -2078,6 +5930,12 @@ "stream-splicer": "^2.0.0" } }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -2088,6 +5946,12 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -2122,6 +5986,53 @@ "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -2133,6 +6044,22 @@ "safe-buffer": "^5.1.2" } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -2151,6 +6078,21 @@ } } }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -2184,6 +6126,27 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -2234,6 +6197,25 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -2246,6 +6228,52 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.1.tgz", + "integrity": "sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^7.2.1", + "shellwords": "^0.1.1", + "uuid": "^7.0.3", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -2258,6 +6286,12 @@ "validate-npm-package-license": "^3.0.1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "npm": { "version": "6.14.5", "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.5.tgz", @@ -5364,12 +9398,64 @@ } } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -5382,6 +9468,15 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -5463,6 +9558,15 @@ } } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "object.values": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", @@ -5577,6 +9681,18 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -5648,6 +9764,18 @@ "error-ex": "^1.2.0" } }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", @@ -5706,12 +9834,33 @@ "sha.js": "^2.4.8" } }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -5721,12 +9870,57 @@ "find-up": "^2.1.0" } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "pretty-format": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.0.1.tgz", + "integrity": "sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw==", + "dev": true, + "requires": { + "@jest/types": "^26.0.1", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -5745,6 +9939,22 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -5767,12 +9977,28 @@ } } }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -5804,6 +10030,12 @@ "safe-buffer": "^5.1.0" } }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", @@ -5866,12 +10098,130 @@ } } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "resolve": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", @@ -5881,12 +10231,35 @@ "path-parse": "^1.0.6" } }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -5906,6 +10279,12 @@ "through": "~2.3.4" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -5925,6 +10304,12 @@ "inherits": "^2.0.1" } }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -5951,17 +10336,205 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -6012,6 +10585,13 @@ "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", "dev": true }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -6024,6 +10604,18 @@ "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", "dev": true }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -6043,12 +10635,171 @@ } } }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -6081,12 +10832,82 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -6142,6 +10963,27 @@ "readable-stream": "^2.0.2" } }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -6363,6 +11205,18 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", @@ -6387,6 +11241,39 @@ "has-flag": "^3.0.0" } }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -6471,12 +11358,39 @@ } } }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -6511,6 +11425,79 @@ "os-tmpdir": "~1.0.2" } }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, "tslib": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", @@ -6523,6 +11510,21 @@ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -6532,6 +11534,12 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -6544,6 +11552,15 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", @@ -6563,6 +11580,58 @@ "xtend": "^4.0.1" } }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -6572,6 +11641,12 @@ "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -6590,6 +11665,12 @@ } } }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -6613,12 +11694,53 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true, + "optional": true + }, "v8-compile-cache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, + "v8-to-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -6629,12 +11751,56 @@ "spdx-expression-parse": "^3.0.0" } }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, "wellio": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/wellio/-/wellio-0.1.7.tgz", @@ -6650,6 +11816,40 @@ "wellio": "^0.1.7" } }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -6659,12 +11859,65 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6680,11 +11933,127 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } } diff --git a/package.json b/package.json index 453d357..bc04c5e 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,55 @@ { - "name": "wellioviz", - "version": "0.0.28", + "author": "Justin Gosses", + "bugs": { + "url": "https://github.com/JustinGOSSES/wellioviz/issues" + }, + "dependencies": { + "d3": "^5.15.0", + "npm": "^6.14.5", + "wellioviz": "^0.0.28", + "wellio": "^0.1.7" + }, "description": "Provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library.", - "main": "dist/index.js", - "unpkg": "dist/index.js", - "scripts": { - "test": "dist/test/test.js", - "make_bundle": "cd docs/js && browserify call_plots.js main.js get_wellio.js vkbeautify.js -o bundle.js" + "devDependencies": { + "browserify": "^16.5.1", + "eslint": "^6.8.0", + "eslint-config-airbnb-base": "^14.1.0", + "eslint-config-google": "^0.9.1", + "eslint-config-standard": "^11.0.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-node": "^6.0.1", + "eslint-plugin-promise": "^3.7.0", + "eslint-plugin-standard": "^3.0.1", + "tape": "~4.9.0", + "jest": "^26.0.1" + }, + "directories": { + "doc": "docs" }, "files": [ - "dist/test/test.js", + "dist/test/data_for_testing.js", "dist/test/test.LAS", - "dist/index.js" + "dist/index.js", + "dist/log_style_templates/log_curve_template.js", + "dist/test/log_templates.test.js" ], - "repository": { - "type": "git", - "url": "git+https://github.com/JustinGOSSES/wellioviz.git" + "homepage": "https://github.com/JustinGOSSES/wellioviz", + "jest": { + "verbose": true, + "roots": [ + "./dist/test/", + "./dist/", + "./dist/log_style_templates/", + "./" + ], + "modulePathIgnorePatterns": ["./examples/"], + "moduleFileExtensions": [ + "js", + "jsx", + "json", + "ts", + "tsx" + ] }, "keywords": [ "LAS", @@ -38,31 +72,17 @@ "web", "d3.js" ], - "author": "Justin Gosses", "license": "Apache-2.0", - "dependencies": { - "d3": "^5.15.0", - "npm": "^6.14.5", - "wellioviz": "^0.0.28", - "wellio": "^0.1.7" - }, - "devDependencies": { - "browserify": "^16.5.1", - "eslint": "^6.8.0", - "eslint-config-airbnb-base": "^14.1.0", - "eslint-config-google": "^0.9.1", - "eslint-config-standard": "^11.0.0", - "eslint-plugin-import": "^2.20.2", - "eslint-plugin-node": "^6.0.1", - "eslint-plugin-promise": "^3.7.0", - "eslint-plugin-standard": "^3.0.1", - "tape": "~4.9.0" + "main": "dist/index.js", + "name": "wellioviz", + "repository": { + "type": "git", + "url": "git+https://github.com/JustinGOSSES/wellioviz.git" }, - "bugs": { - "url": "https://github.com/JustinGOSSES/wellioviz/issues" + "scripts": { + "test": "jest", + "make_bundle": "cd docs/js && browserify call_plots.js main.js get_wellio.js vkbeautify.js -o bundle.js" }, - "homepage": "https://github.com/JustinGOSSES/wellioviz", - "directories": { - "doc": "docs" - } + "unpkg": "dist/index.js", + "version": "0.0.28" } From bdfa163707609bd6ef3836d3fdb6895c82d52188 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Fri, 12 Jun 2020 15:52:46 -0700 Subject: [PATCH 11/17] Currently working through the structure of the style templates and such and trying to make it easier to extend/handle modified templates. --- dist/base_template.js | 13 + dist/curve_alias/curve_alias.js | 0 dist/fill_templates/curve_fill_template.js | 9 +- dist/index.js | 6 +- dist/log_style_templates/CAL.js | 14 + dist/log_style_templates/GR.js | 14 + .../log_style_templates/log_curve_template.js | 9 +- dist/test/track_template.test.js | 2 +- dist/test/well_log_template.test.js | 5 + dist/test/well_section_template.test.js | 5 + dist/track_templates/CaliperGR_track.js | 18 + .../NeutronDensityPorosity_track.js | 0 dist/track_templates/Resistivity_track.js | 0 dist/track_templates/default_sub_track.js | 17 + dist/track_templates/track_template.js | 13 +- .../triple_combo_template.js | 10 + dist/well_log_templates/well_log_template.js | 16 +- .../well_section_templates.js | 23 + .../well_viz_html.html | 2 +- .../draw_logs_with_templates.js | 11 + .../static/00-01-11-082-23W4-0.LAS | 919 ++++++++++++++++++ .../test_new_templates/well_viz_html.html | 23 + 22 files changed, 1108 insertions(+), 21 deletions(-) create mode 100644 dist/base_template.js create mode 100644 dist/curve_alias/curve_alias.js create mode 100644 dist/log_style_templates/CAL.js create mode 100644 dist/log_style_templates/GR.js create mode 100644 dist/test/well_log_template.test.js create mode 100644 dist/test/well_section_template.test.js create mode 100644 dist/track_templates/CaliperGR_track.js create mode 100644 dist/track_templates/NeutronDensityPorosity_track.js create mode 100644 dist/track_templates/Resistivity_track.js create mode 100644 dist/track_templates/default_sub_track.js create mode 100644 dist/well_log_templates/triple_combo_template.js create mode 100644 dist/well_section_templates/well_section_templates.js create mode 100644 examples/deployments/test_new_templates/draw_logs_with_templates.js create mode 100644 examples/deployments/test_new_templates/static/00-01-11-082-23W4-0.LAS create mode 100644 examples/deployments/test_new_templates/well_viz_html.html diff --git a/dist/base_template.js b/dist/base_template.js new file mode 100644 index 0000000..fa282f4 --- /dev/null +++ b/dist/base_template.js @@ -0,0 +1,13 @@ +class BaseTemplate { + constructor(params={}) { + this.handle_params(params) + } + + handle_params(params) { + for (const [key, value] in Object.entries(params)){ + this[key] = value + } + return this + } +} +module.exports(BaseTemplate) \ No newline at end of file diff --git a/dist/curve_alias/curve_alias.js b/dist/curve_alias/curve_alias.js new file mode 100644 index 0000000..e69de29 diff --git a/dist/fill_templates/curve_fill_template.js b/dist/fill_templates/curve_fill_template.js index fd950e6..9ff3f07 100644 --- a/dist/fill_templates/curve_fill_template.js +++ b/dist/fill_templates/curve_fill_template.js @@ -1,14 +1,15 @@ -class CurveFillTemplate { +const BaseTemplate = require("../base_template") + +class CurveFillTemplate extends BaseTemplate{ constructor(params={}) { + super(); this.curve_name = "default" this.fill = "no" this.fill_direction = "left" this.cutoffs = Array(0) // TODO should take values OR curve names this.fill_colors = Array(0) //Update template based on passed params - for (const [key, value] in Object.entries(params)){ - obj[key] = value - } + this.handle_params(params) } } module.exports = CurveFillTemplate \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 1e6d0a4..7036761 100644 --- a/dist/index.js +++ b/dist/index.js @@ -47,7 +47,11 @@ * @returns {obj} It returns the d3.js object and all its functions as a module. */ d3: require("d3"), - + TrackTemplate: require('./log_style_templates/log_curve_template'), + WellLogTemplate: require('./well_log_templates/well_log_template'), + WellSectionTemplate: require('./well_section_templates/well_section_templates'), + CurveFillTemplate: require('./fill_templates/curve_fill_template'), + LogCurveTemplate: require('./log_style_templates/log_curve_template'), /** * A function that directs users to the docs if they need help. * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. diff --git a/dist/log_style_templates/CAL.js b/dist/log_style_templates/CAL.js new file mode 100644 index 0000000..998eacd --- /dev/null +++ b/dist/log_style_templates/CAL.js @@ -0,0 +1,14 @@ +const LogCurveTemplate = require("./log_curve_template") + +class CAL extends LogCurveTemplate { + constructor(params={}) { + super(params); + this.curve_name = "CAL" + this.units = "cm" + this.stroke_type = "dash" // TODO Warning! This might not be a thing haha + for (const [key, value] in Object.entries(params)){ + obj[key] = value + } + } +} +module.exports(CAL) \ No newline at end of file diff --git a/dist/log_style_templates/GR.js b/dist/log_style_templates/GR.js new file mode 100644 index 0000000..33e53b9 --- /dev/null +++ b/dist/log_style_templates/GR.js @@ -0,0 +1,14 @@ +const LogCurveTemplate = require("./log_curve_template") + +class GR extends LogCurveTemplate { + constructor(params={}) { + super(params); + this.curve_name = "GR" + this.fill = null // TODO: GR Fill + this.units = "API" + for (const [key, value] in Object.entries(params)){ + obj[key] = value + } + } +} +module.exports(GR) \ No newline at end of file diff --git a/dist/log_style_templates/log_curve_template.js b/dist/log_style_templates/log_curve_template.js index a6a28be..7bdbec4 100644 --- a/dist/log_style_templates/log_curve_template.js +++ b/dist/log_style_templates/log_curve_template.js @@ -1,9 +1,12 @@ // Base sort of abstract template, specialized templates can override pieces of this const fill_template = require('../fill_templates/curve_fill_template'); -class LogCurveTemplate { +const BaseTemplate = require("../base_template") + +class LogCurveTemplate extends BaseTemplate { // const obj = {} // Define Default Settings Values constructor(params={}) { + super(); this.curve_name = "default" this.color = "black" this.stroke_type = "solid" @@ -24,9 +27,7 @@ class LogCurveTemplate { // Define Template Functions // TODO: decide if null are handled here or at load validation //Update template based on passed params - for (const [key, value] in Object.entries(params)){ - obj[key] = value - } + this.handle_params(params) } // Simple function to set the data that is associated with this curve define_data(data) { diff --git a/dist/test/track_template.test.js b/dist/test/track_template.test.js index acc28cb..367542d 100644 --- a/dist/test/track_template.test.js +++ b/dist/test/track_template.test.js @@ -10,7 +10,7 @@ let test_curve_data = [ let test_curve = new log_curve_template().set_curve_and_data('RHOB', test_curve_data) test('default track name is a property', () => { - expect(new track_template()).toHaveProperty("track_name") + expect(new track_template()).toHaveProperty("track_template_name") }) test('add curve works', () => { diff --git a/dist/test/well_log_template.test.js b/dist/test/well_log_template.test.js new file mode 100644 index 0000000..4ecba45 --- /dev/null +++ b/dist/test/well_log_template.test.js @@ -0,0 +1,5 @@ +const log_template = require('../well_log_templates/well_log_template'); + +test('default well log name is a property', () => { + expect(new log_template()).toHaveProperty("log_template_name") +}) \ No newline at end of file diff --git a/dist/test/well_section_template.test.js b/dist/test/well_section_template.test.js new file mode 100644 index 0000000..1f0bd0c --- /dev/null +++ b/dist/test/well_section_template.test.js @@ -0,0 +1,5 @@ +const well_section_template = require('../well_section_templates/well_section_templates'); + +test('default well section template is a property', () => { + expect(new well_section_template()).toHaveProperty("template_name") +}) \ No newline at end of file diff --git a/dist/track_templates/CaliperGR_track.js b/dist/track_templates/CaliperGR_track.js new file mode 100644 index 0000000..2dde565 --- /dev/null +++ b/dist/track_templates/CaliperGR_track.js @@ -0,0 +1,18 @@ +const DefaultSubTrack = require("./default_sub_track") +const GR = require("../log_style_templates/GR") +const CAL = require("../log_style_templates/CAL") + +class CaliperGRTrack extends DefaultSubTrack { + constructor(params = {}) { + super(params); + this.track_template_name = 'CAL_GR' + this.div_id = 'cal_gr_track' + this.title = {"text": "CAL - GR", "font": "16px"} + this.curves = {'GR': new GR, 'CAL': new CAL} + for (const [key, value] in Object.entries(params)){ + obj[key] = value + } + } + +} +module.exports = CaliperGRTrack \ No newline at end of file diff --git a/dist/track_templates/NeutronDensityPorosity_track.js b/dist/track_templates/NeutronDensityPorosity_track.js new file mode 100644 index 0000000..e69de29 diff --git a/dist/track_templates/Resistivity_track.js b/dist/track_templates/Resistivity_track.js new file mode 100644 index 0000000..e69de29 diff --git a/dist/track_templates/default_sub_track.js b/dist/track_templates/default_sub_track.js new file mode 100644 index 0000000..bde6429 --- /dev/null +++ b/dist/track_templates/default_sub_track.js @@ -0,0 +1,17 @@ +const TrackTemplate = require("./track_template") + +class DefaultSubTrack extends TrackTemplate { + constructor(params = {}) { + super(params); + this.track_template_name = 'default' + this.show_well_name = false + this.show_depth_type = false + this.independent_scale = false + this.div_id = 'sub_track' + for (const [key, value] in Object.entries(params)){ + obj[key] = value + } + } + +} +module.exports = DefaultSubTrack \ No newline at end of file diff --git a/dist/track_templates/track_template.js b/dist/track_templates/track_template.js index 28fae8d..ce1e533 100644 --- a/dist/track_templates/track_template.js +++ b/dist/track_templates/track_template.js @@ -1,9 +1,10 @@ - +const BaseTemplate = require("../base_template") const log_curve_template = require('../log_style_templates/log_curve_template'); -class TrackTemplate { +class TrackTemplate extends BaseTemplate{ constructor(params={}) { - this.track_name = "default" + super() + this.track_template_name = "default" this.show_well_name = true this.show_depth_type = false this.show_curves_units = true @@ -16,15 +17,13 @@ class TrackTemplate { this.grid_color = "#D3D3D3" this.grid_stroke_width = 0.2 this.track_dimensions = {"height": 500, "width": 260} - this.scale_denominator = 2 + this.scale_numerator = 2 this.margin = {"top": 10, "right": 10, "bottom": 30, "left": 60} this.title = {"text": "default", "font": "16px"} this.div_id = "default_track" this.curves = {} // TODO: look at other potential track level variables - for (const [key, value] in Object.entries(params)){ - obj[key] = value - } + this.handle_params(params) } add_curve(curve) { diff --git a/dist/well_log_templates/triple_combo_template.js b/dist/well_log_templates/triple_combo_template.js new file mode 100644 index 0000000..f7eaf16 --- /dev/null +++ b/dist/well_log_templates/triple_combo_template.js @@ -0,0 +1,10 @@ +const WellLogTemplate = require('../well_log_templates/well_log_template'); +const CaliperGR_track = require("../track_templates/CaliperGR_track") +class TripleCombo extends WellLogTemplate { + constructor(params= {}) { + super(params); + this.tracks = { + 'CAL_GR': new CaliperGR_track() + } + } +} \ No newline at end of file diff --git a/dist/well_log_templates/well_log_template.js b/dist/well_log_templates/well_log_template.js index 1b6a78d..aec794f 100644 --- a/dist/well_log_templates/well_log_template.js +++ b/dist/well_log_templates/well_log_template.js @@ -1,10 +1,20 @@ -class WellLogTemplate { +const BaseTemplate = require("../base_template") + +class WellLogTemplate extends BaseTemplate{ constructor(params = {}) { + super() + this.log_template_name = "default" this.well_log_header = {} this.tracks = {} this.log_border_padding = 20.0 this.pick_lines = {} this.other_lines = Array(0) - this. + this.max_width = 1000.0 + this.uniform_scroll = true + this.vertical_scale_numerator = 30 + this.div_id = "default_well_log" + //Update template based on passed params + this.handle_params(params) } -} \ No newline at end of file +} +module.exports = WellLogTemplate \ No newline at end of file diff --git a/dist/well_section_templates/well_section_templates.js b/dist/well_section_templates/well_section_templates.js new file mode 100644 index 0000000..a9977aa --- /dev/null +++ b/dist/well_section_templates/well_section_templates.js @@ -0,0 +1,23 @@ +const BaseTemplate = require("../base_template") + +class WellSectionTemplate extends BaseTemplate{ + constructor(params={}) { + super() + this.template_name = 'default' + this.well_section_header = {} + this.uniform_scale = true + this.use_uniform_padding = true + this.padding = 50.0 + this.uniform_scroll = true + this.horizontal_scale_numerator = 100 + this.vertical_scale_numerator = 50 + this.log_template_to_use = null // TODO: Fill this in?? + this.well_data = Array(0) + this.div_id = "well_section_default" + //Update template based on passed params + this.handle_params(params) + } + +} + +module.exports = WellSectionTemplate \ No newline at end of file diff --git a/examples/deployments/example_standalone_webpage/well_viz_html.html b/examples/deployments/example_standalone_webpage/well_viz_html.html index ef2ce69..d0863d2 100644 --- a/examples/deployments/example_standalone_webpage/well_viz_html.html +++ b/examples/deployments/example_standalone_webpage/well_viz_html.html @@ -7,7 +7,7 @@ - +

    "HELLO!"

    diff --git a/examples/deployments/test_new_templates/draw_logs_with_templates.js b/examples/deployments/test_new_templates/draw_logs_with_templates.js new file mode 100644 index 0000000..8359e20 --- /dev/null +++ b/examples/deployments/test_new_templates/draw_logs_with_templates.js @@ -0,0 +1,11 @@ + +async function plot_log(div_id, url="./static/00-01-11-082-23W4-0.LAS") { + let ShaleSiltCutOff = 80 + let SiltSandCutOff = 55 + // var fileUrltoWellLog = "https://gist.githubusercontent.com/JustinGOSSES/2685e588d5c2f2a0ba1591ec7b9c9421/raw/415fe8a2f27dc7621f06f60ffd40a62c0d55a0f0/00-01-01-095-19W4-0.las" + var fetched = await fetch(url) + var well_as_string = await fetched.text() + var well = wellio.las2json(well_as_string) + let depth_curve_name = "DEPT" + +} \ No newline at end of file diff --git a/examples/deployments/test_new_templates/static/00-01-11-082-23W4-0.LAS b/examples/deployments/test_new_templates/static/00-01-11-082-23W4-0.LAS new file mode 100644 index 0000000..fe958e1 --- /dev/null +++ b/examples/deployments/test_new_templates/static/00-01-11-082-23W4-0.LAS @@ -0,0 +1,919 @@ +~VERSION INFORMATION + VERS. 2.0: CWLS LOG ASCII STANDARD -VERSION 2.0 + WRAP. NO: ONE LINE PER DEPTH STEP +~WELL INFORMATION BLOCK +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ------------------- ------------------------------- +# Generated from Intellog Unique Number CW_82_90/WELL/185 +WELL. 01-11-082-23W4 : Well_name - WELL +LOC . 00/01-11-082-23W4/0 : Location - LOCATION +UWI . 00/01-11-082-23W4/0 : Uwi - UNIQUE WELL ID +ENTR. JAYE : Entered - ENTERED BY +SRVC. SCHLUMBERGER : Scn - SERVICE COMPANY +DATE. 31 JAN. 86 : Date - LOG DATE +STRT.M 225 : top_depth - START DEPTH +STOP.M 442 : bot_depth - STOP DEPTH +STEP.M 0.25 : increment - STEP LENGTH + NULL. -999.2500:NULL Value +~CURVE INFORMATION BLOCK +#MNEM UNIT ERCB CURVE CODE CURVE DESCRIPTION +#----------- ------------------ ---------------------------------- +DEPT.M 00 001 00 00 : DEPTH - DEPTH +GR .API 00 310 00 00 : GR - GAMMA RAY +CALI.MM 00 280 01 00 : CAL - CALIPER +NPHI.V/V 00 330 00 00 : PHIN - NEUTRON POROSITY (SANDSTONE) +DPHI.V/V 00 890 00 00 : PHID - DENSITY POROSITY (SANDSTONE) +ILD .OHMM 00 120 00 00 : RESD - DEEP RESISTIVITY (DIL) +~PARAMETER INFORMATION +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ----------- ------------------------------ +GL .M 611.1 : gl - GROUND LEVEL ELEVATION +EREF.M 614.7 : kb - ELEVATION OF DEPTH REFERENCE +DATM.M 611.1 : datum - DATUM ELEVATION +TDD .M 443 : tdd - TOTAL DEPTH DRILLER +RUN . ONE : Run - RUN NUMBER +ENG . BRADSHAW : Engineer - RECORDING ENGINEER +WIT . KOSS : Witness - WITNESSED BY +BASE. SLAVE LAKE : Branch - HOME BASE OF LOGGING UNIT +MUD . GEL CHEM : Mud_type - MUD TYPE +MATR. SANDSTONE : Logunit - NEUTRON MATRIX +TMAX.C 22 : BHT - MAXIMUM RECORDED TEMPERATURE +BHTD.M 443 : BHTDEP - MAXIMUM RECORDED TEMPERATURE +RMT .C 22 : MDTP - TEMPERATURE OF MUD +MUDD.KG/M 0 : MWT - MUD DENSITY +NEUT. 1 : NEUTRON - NEUTRON TYPE +RESI. 0 : RESIST - RESISTIVITY TYPE +RM .OHMM 6.75 : RM - RESISTIVITY OF MUD +RMC .OHMM 5.483 : RMC - RESISTIVITY OF MUD CAKE +RMF .OHMM 6.16 : RMF - RESISTIVITY OF MUD FILTRATE +SUFT.C 4 : SUFT - SURFACE TEMPERATURE +~A DEPTH GR CAL PHIN PHID RESD + 225.000 76.341 272.906 0.000 0.305 3.269 + 225.250 78.050 274.819 0.497 0.301 3.124 + 225.500 83.001 279.018 0.563 0.318 2.986 + 225.750 80.224 280.416 0.570 0.326 2.881 + 226.000 80.567 276.520 0.596 0.314 2.897 + 226.250 81.220 277.600 0.611 0.310 2.935 + 226.500 80.873 279.208 0.614 0.296 3.018 + 226.750 80.774 279.249 0.605 0.294 3.104 + 227.000 80.989 280.136 0.582 0.296 3.121 + 227.250 80.897 281.532 0.560 0.301 3.167 + 227.500 80.797 281.782 0.569 0.305 3.173 + 227.750 80.821 281.219 0.584 0.307 3.178 + 228.000 80.225 279.487 0.580 0.297 3.220 + 228.250 82.878 277.244 0.555 0.279 3.268 + 228.500 85.141 276.666 0.541 0.271 3.323 + 228.750 87.851 275.680 0.530 0.273 3.380 + 229.000 86.070 276.983 0.528 0.266 3.456 + 229.250 86.788 276.713 0.546 0.270 3.508 + 229.500 85.068 274.880 0.563 0.278 3.534 + 229.750 83.287 272.961 0.578 0.287 3.580 + 230.000 82.192 271.973 0.569 0.296 3.647 + 230.250 85.588 268.791 0.546 0.300 3.716 + 230.500 92.220 265.096 0.527 0.269 3.764 + 230.750 92.996 253.099 0.530 0.233 3.864 + 231.000 92.401 249.514 0.537 0.231 3.944 + 231.250 93.052 248.931 0.528 0.244 4.095 + 231.500 92.581 248.347 0.509 0.256 4.251 + 231.750 86.375 247.575 0.508 0.255 4.496 + 232.000 76.745 248.341 0.496 0.255 5.042 + 232.250 67.736 248.911 0.478 0.246 6.060 + 232.500 64.461 248.430 0.473 0.247 7.325 + 232.750 56.387 247.760 0.476 0.259 9.582 + 233.000 47.566 246.659 0.469 0.283 12.747 + 233.250 44.852 245.870 0.441 0.317 15.938 + 233.500 46.314 244.471 0.458 0.334 20.536 + 233.750 45.283 244.307 0.472 0.339 27.838 + 234.000 41.633 243.839 0.461 0.337 33.968 + 234.250 41.036 243.465 0.430 0.331 35.730 + 234.500 44.742 244.027 0.441 0.329 36.470 + 234.750 47.760 244.382 0.449 0.329 36.947 + 235.000 46.667 244.225 0.444 0.335 38.790 + 235.250 46.571 243.544 0.494 0.337 41.033 + 235.500 48.093 243.480 0.500 0.327 44.478 + 235.750 47.873 243.534 0.477 0.329 45.145 + 236.000 48.523 244.098 0.483 0.337 44.969 + 236.250 50.482 244.866 0.508 0.347 43.548 + 236.500 50.635 245.743 0.560 0.351 40.694 + 236.750 49.544 246.835 0.497 0.366 39.705 + 237.000 48.385 247.709 0.475 0.381 39.623 + 237.250 46.293 247.753 0.484 0.372 41.757 + 237.500 51.431 247.180 0.466 0.370 46.209 + 237.750 46.974 246.703 0.457 0.360 52.796 + 238.000 42.452 246.026 0.476 0.350 60.434 + 238.250 42.479 244.409 0.511 0.343 66.500 + 238.500 49.050 243.003 0.515 0.352 69.036 + 238.750 45.839 243.777 0.515 0.335 69.415 + 239.000 43.376 244.335 0.518 0.325 68.881 + 239.250 44.896 244.916 0.504 0.344 67.590 + 239.500 50.345 244.853 0.470 0.359 66.823 + 239.750 49.873 245.310 0.445 0.363 66.062 + 240.000 48.720 245.775 0.429 0.360 64.094 + 240.250 46.378 245.932 0.442 0.361 65.057 + 240.500 41.547 245.966 0.478 0.363 70.123 + 240.750 41.200 245.703 0.500 0.350 76.296 + 241.000 45.651 245.544 0.499 0.330 80.558 + 241.250 46.052 246.010 0.488 0.317 82.226 + 241.500 46.518 246.055 0.487 0.324 85.523 + 241.750 48.663 246.307 0.459 0.346 89.116 + 242.000 51.496 247.072 0.452 0.356 87.774 + 242.250 49.404 248.274 0.462 0.363 85.803 + 242.500 47.251 248.726 0.480 0.365 89.409 + 242.750 46.468 248.563 0.476 0.364 96.554 + 243.000 44.505 247.687 0.466 0.362 100.991 + 243.250 43.783 246.993 0.470 0.365 102.891 + 243.500 44.686 246.522 0.490 0.367 105.418 + 243.750 45.270 246.467 0.514 0.362 107.804 + 244.000 45.863 246.308 0.529 0.351 111.074 + 244.250 47.760 246.347 0.524 0.350 111.478 + 244.500 47.972 247.538 0.507 0.352 109.385 + 244.750 49.370 249.982 0.490 0.354 106.128 + 245.000 47.032 251.477 0.473 0.355 100.863 + 245.250 45.126 252.867 0.472 0.357 93.896 + 245.500 46.961 250.941 0.471 0.355 87.577 + 245.750 50.107 248.711 0.461 0.353 79.862 + 246.000 49.883 249.067 0.466 0.353 72.826 + 246.250 43.056 249.067 0.501 0.344 67.289 + 246.500 41.277 251.055 0.509 0.332 64.796 + 246.750 44.669 251.383 0.520 0.336 64.665 + 247.000 43.888 252.781 0.535 0.349 65.142 + 247.250 42.917 254.484 0.545 0.361 65.377 + 247.500 39.831 256.617 0.523 0.365 66.355 + 247.750 38.050 257.697 0.493 0.359 67.731 + 248.000 40.757 259.622 0.476 0.358 70.445 + 248.250 40.037 261.440 0.482 0.361 74.940 + 248.500 39.195 262.413 0.498 0.370 80.928 + 248.750 39.097 262.139 0.501 0.372 85.127 + 249.000 38.128 262.602 0.481 0.371 89.206 + 249.250 38.096 263.824 0.471 0.363 91.396 + 249.500 40.053 263.837 0.488 0.361 91.554 + 249.750 40.079 263.368 0.487 0.363 89.329 + 250.000 38.989 263.306 0.466 0.360 85.056 + 250.250 40.637 262.520 0.443 0.353 81.141 + 250.500 40.537 262.357 0.463 0.341 76.972 + 250.750 39.443 260.019 0.473 0.328 71.790 + 251.000 38.910 258.610 0.470 0.325 67.972 + 251.250 39.876 257.307 0.468 0.340 66.697 + 251.500 42.643 257.770 0.492 0.357 68.851 + 251.750 44.415 258.232 0.494 0.367 80.912 + 252.000 43.447 257.961 0.479 0.355 90.214 + 252.250 45.968 256.457 0.465 0.346 78.344 + 252.500 43.625 255.358 0.458 0.343 47.342 + 252.750 49.949 253.121 0.470 0.344 28.662 + 253.000 48.978 250.881 0.479 0.343 21.297 + 253.250 42.650 250.200 0.429 0.338 16.094 + 253.500 37.069 251.910 0.311 0.318 14.403 + 253.750 33.108 253.410 0.318 0.249 13.060 + 254.000 41.052 252.723 0.429 0.250 11.754 + 254.250 55.101 249.342 0.489 0.261 9.576 + 254.500 67.528 249.806 0.476 0.283 7.360 + 254.750 77.154 254.941 0.437 0.289 6.075 + 255.000 76.059 253.848 0.447 0.280 5.286 + 255.250 76.586 251.294 0.443 0.273 5.080 + 255.500 73.934 253.312 0.423 0.273 5.264 + 255.750 71.845 250.980 0.416 0.280 5.760 + 256.000 68.382 247.901 0.450 0.287 6.422 + 256.250 63.611 244.628 0.476 0.290 7.647 + 256.500 59.963 243.539 0.508 0.305 9.965 + 256.750 56.750 242.954 0.513 0.351 12.023 + 257.000 53.848 242.896 0.485 0.360 13.107 + 257.250 55.685 243.364 0.427 0.336 13.917 + 257.500 55.648 243.609 0.411 0.330 15.781 + 257.750 53.746 244.075 0.424 0.335 17.962 + 258.000 53.958 244.328 0.446 0.334 19.803 + 258.250 52.306 243.755 0.446 0.342 20.636 + 258.500 51.148 243.695 0.473 0.348 21.381 + 258.750 51.487 243.951 0.489 0.344 21.702 + 259.000 53.387 244.198 0.495 0.345 21.215 + 259.250 53.475 243.830 0.488 0.347 20.506 + 259.500 52.443 242.116 0.484 0.351 19.971 + 259.750 52.159 240.809 0.495 0.352 19.123 + 260.000 52.999 239.927 0.476 0.351 18.589 + 260.250 55.081 239.757 0.461 0.350 17.699 + 260.500 55.361 238.349 0.457 0.350 17.076 + 260.750 54.203 241.614 0.465 0.347 16.290 + 261.000 53.546 243.531 0.461 0.342 15.511 + 261.250 50.270 245.136 0.441 0.341 14.797 + 261.500 49.114 246.115 0.438 0.344 14.410 + 261.750 52.322 246.175 0.459 0.351 14.462 + 262.000 52.471 246.008 0.477 0.355 14.569 + 262.250 54.005 245.321 0.464 0.352 14.135 + 262.500 54.647 245.799 0.452 0.346 13.159 + 262.750 53.117 246.257 0.455 0.335 12.624 + 263.000 52.708 246.194 0.448 0.323 12.294 + 263.250 54.667 245.923 0.448 0.319 12.178 + 263.500 55.070 245.659 0.452 0.336 12.062 + 263.750 55.222 246.017 0.462 0.351 12.197 + 264.000 54.939 246.494 0.478 0.359 12.520 + 264.250 54.092 246.638 0.487 0.362 13.046 + 264.500 53.560 246.777 0.480 0.366 13.217 + 264.750 55.338 247.347 0.465 0.358 13.567 + 265.000 57.854 248.137 0.468 0.353 13.979 + 265.250 60.562 248.071 0.481 0.359 14.376 + 265.500 60.654 247.690 0.464 0.360 14.482 + 265.750 57.001 247.114 0.448 0.355 14.183 + 266.000 56.281 247.053 0.463 0.357 14.128 + 266.250 54.127 247.514 0.478 0.360 14.020 + 266.500 54.094 247.774 0.488 0.362 14.230 + 266.750 51.130 248.344 0.437 0.358 14.470 + 267.000 43.368 248.596 0.243 0.281 15.744 + 267.250 36.917 249.157 0.181 0.082 19.283 + 267.500 36.071 249.314 0.182 0.032 27.760 + 267.750 38.965 248.729 0.188 0.043 37.068 + 268.000 40.674 247.638 0.202 0.059 38.123 + 268.250 40.390 247.589 0.204 0.068 37.196 + 268.500 40.854 247.727 0.212 0.074 35.618 + 268.750 43.128 248.607 0.241 0.086 32.663 + 269.000 44.089 248.855 0.336 0.172 28.365 + 269.250 44.927 247.033 0.412 0.294 25.006 + 269.500 45.142 244.283 0.451 0.344 20.681 + 269.750 46.540 243.493 0.479 0.347 18.095 + 270.000 49.248 243.435 0.450 0.343 17.230 + 270.250 47.343 243.173 0.423 0.346 17.066 + 270.500 42.201 243.426 0.422 0.351 17.062 + 270.750 39.734 243.788 0.442 0.355 17.028 + 271.000 40.077 244.242 0.448 0.359 17.154 + 271.250 42.034 246.055 0.454 0.360 17.346 + 271.500 43.431 246.106 0.468 0.362 17.441 + 271.750 42.649 245.955 0.473 0.363 17.735 + 272.000 40.810 245.985 0.468 0.364 17.666 + 272.250 40.464 246.446 0.460 0.359 17.663 + 272.500 42.798 246.505 0.450 0.358 17.660 + 272.750 43.013 246.435 0.460 0.361 17.624 + 273.000 43.349 246.486 0.466 0.363 17.622 + 273.250 46.061 246.629 0.460 0.361 17.752 + 273.500 48.020 246.577 0.460 0.358 17.681 + 273.750 48.918 246.415 0.464 0.359 17.350 + 274.000 47.325 246.768 0.462 0.359 16.993 + 274.250 46.169 247.236 0.479 0.359 16.831 + 274.500 46.883 247.598 0.477 0.361 16.797 + 274.750 49.218 247.739 0.482 0.356 16.668 + 275.000 50.302 247.687 0.486 0.351 16.823 + 275.250 48.837 247.415 0.465 0.352 17.497 + 275.500 49.238 246.529 0.474 0.352 18.301 + 275.750 48.330 246.579 0.458 0.354 18.856 + 276.000 46.363 247.145 0.446 0.365 19.067 + 276.250 44.585 247.607 0.470 0.369 19.245 + 276.500 45.116 247.962 0.464 0.370 19.278 + 276.750 47.941 249.053 0.471 0.373 19.347 + 277.000 49.091 249.825 0.462 0.375 19.344 + 277.250 46.191 250.177 0.452 0.376 19.341 + 277.500 45.844 250.221 0.437 0.376 19.410 + 277.750 44.065 250.163 0.431 0.372 19.591 + 278.000 42.846 249.808 0.440 0.365 19.698 + 278.250 41.939 249.027 0.466 0.336 20.069 + 278.500 39.786 248.754 0.480 0.328 20.523 + 278.750 39.380 248.377 0.484 0.357 20.870 + 279.000 40.905 247.387 0.463 0.375 21.143 + 279.250 42.364 246.291 0.444 0.369 21.379 + 279.500 42.327 244.891 0.445 0.367 21.375 + 279.750 41.797 242.123 0.459 0.365 21.332 + 280.000 40.453 239.780 0.458 0.366 21.409 + 280.250 39.735 245.538 0.468 0.368 21.486 + 280.500 41.316 249.328 0.478 0.372 21.522 + 280.750 43.403 249.892 0.480 0.371 21.520 + 281.000 43.119 247.548 0.479 0.375 21.637 + 281.250 42.525 244.904 0.467 0.367 21.634 + 281.500 44.731 243.177 0.450 0.357 21.630 + 281.750 46.255 241.142 0.452 0.352 21.628 + 282.000 48.030 239.846 0.444 0.351 21.583 + 282.250 49.052 240.510 0.434 0.352 21.579 + 282.500 47.086 241.491 0.428 0.360 21.496 + 282.750 44.001 243.409 0.463 0.370 21.492 + 283.000 41.594 245.114 0.506 0.375 21.570 + 283.250 40.066 244.337 0.483 0.370 21.566 + 283.500 39.656 242.925 0.460 0.359 21.482 + 283.750 40.931 242.661 0.417 0.359 21.318 + 284.000 41.085 243.126 0.417 0.371 21.194 + 284.250 40.924 244.204 0.422 0.374 21.310 + 284.500 40.828 244.773 0.445 0.371 21.267 + 284.750 38.676 244.721 0.439 0.370 21.303 + 285.000 38.204 245.068 0.432 0.379 21.140 + 285.250 39.602 244.802 0.462 0.382 21.058 + 285.500 41.062 244.856 0.467 0.383 20.976 + 285.750 43.022 244.898 0.457 0.381 20.737 + 286.000 43.672 244.952 0.445 0.379 20.502 + 286.250 41.085 244.372 0.444 0.370 20.154 + 286.500 38.929 243.479 0.481 0.357 20.380 + 286.750 40.706 243.003 0.501 0.348 20.530 + 287.000 41.789 241.805 0.458 0.345 20.488 + 287.250 40.136 239.982 0.437 0.378 20.447 + 287.500 40.100 238.159 0.465 0.379 20.252 + 287.750 40.440 236.336 0.482 0.381 20.059 + 288.000 41.406 235.340 0.484 0.379 19.944 + 288.250 41.244 237.161 0.494 0.380 19.680 + 288.500 43.763 240.212 0.500 0.383 19.530 + 288.750 44.414 243.687 0.487 0.378 19.271 + 289.000 40.703 245.914 0.437 0.371 18.981 + 289.250 41.855 247.522 0.422 0.365 18.836 + 289.500 44.061 250.994 0.436 0.374 18.692 + 289.750 40.167 256.958 0.462 0.388 18.584 + 290.000 37.761 275.805 0.483 0.395 18.372 + 290.250 37.293 291.324 0.520 0.396 18.130 + 290.500 38.380 301.759 0.533 0.392 17.589 + 290.750 40.899 311.778 0.504 0.387 17.227 + 291.000 41.610 313.898 0.521 0.384 16.872 + 291.250 39.648 317.062 0.549 0.385 16.649 + 291.500 39.734 318.561 0.533 0.389 16.460 + 291.750 43.627 309.364 0.488 0.399 16.426 + 292.000 47.269 296.224 0.467 0.400 16.641 + 292.250 47.733 284.012 0.480 0.400 16.795 + 292.500 46.390 248.432 0.496 0.421 16.793 + 292.750 45.733 236.636 0.494 0.402 16.539 + 293.000 48.004 235.336 0.487 0.386 16.382 + 293.250 49.714 236.417 0.510 0.383 16.075 + 293.500 49.369 236.465 0.528 0.386 15.714 + 293.750 46.840 236.306 0.515 0.385 15.332 + 294.000 46.558 239.880 0.507 0.380 15.101 + 294.250 47.275 244.600 0.495 0.374 14.929 + 294.500 49.728 245.581 0.486 0.355 14.485 + 294.750 48.448 246.156 0.456 0.330 13.975 + 295.000 47.480 246.607 0.436 0.365 13.406 + 295.250 46.944 247.382 0.425 0.381 13.430 + 295.500 47.724 247.956 0.433 0.381 13.759 + 295.750 46.128 247.994 0.463 0.380 14.098 + 296.000 47.403 247.529 0.474 0.378 14.362 + 296.250 47.309 247.361 0.469 0.372 14.360 + 296.500 46.834 246.893 0.466 0.363 13.880 + 296.750 49.604 247.458 0.463 0.351 13.167 + 297.000 53.746 247.395 0.460 0.350 12.514 + 297.250 59.194 247.337 0.453 0.347 11.628 + 297.500 59.471 247.071 0.458 0.346 10.805 + 297.750 59.002 246.705 0.454 0.349 9.964 + 298.000 60.277 245.721 0.470 0.348 9.190 + 298.250 61.548 244.722 0.478 0.345 8.443 + 298.500 62.388 243.206 0.474 0.342 7.714 + 298.750 62.230 241.279 0.526 0.331 7.359 + 299.000 61.134 239.872 0.525 0.317 7.399 + 299.250 61.164 241.791 0.492 0.318 7.871 + 299.500 62.123 242.775 0.513 0.329 8.942 + 299.750 62.155 241.780 0.522 0.338 10.198 + 300.000 58.379 242.964 0.445 0.316 11.477 + 300.250 49.058 244.988 0.268 0.269 12.117 + 300.500 46.159 246.172 0.260 0.107 11.980 + 300.750 57.775 247.680 0.417 0.194 10.945 + 301.000 70.516 248.343 0.459 0.247 9.888 + 301.250 70.545 248.918 0.494 0.276 8.025 + 301.500 68.827 249.270 0.515 0.275 7.223 + 301.750 69.233 249.936 0.515 0.273 6.890 + 302.000 72.311 250.295 0.501 0.267 6.954 + 302.250 74.772 250.865 0.490 0.266 7.032 + 302.500 76.045 251.755 0.497 0.266 6.797 + 302.750 79.065 251.579 0.479 0.265 6.423 + 303.000 81.333 250.481 0.488 0.271 6.532 + 303.250 71.452 248.144 0.515 0.291 7.120 + 303.500 59.888 246.219 0.530 0.313 8.478 + 303.750 49.883 244.491 0.493 0.334 9.926 + 304.000 45.050 242.157 0.483 0.349 11.753 + 304.250 47.076 241.779 0.488 0.350 13.428 + 304.500 50.716 241.939 0.500 0.344 14.285 + 304.750 48.188 241.156 0.498 0.338 14.941 + 305.000 49.399 240.264 0.467 0.332 15.366 + 305.250 49.865 238.753 0.461 0.330 15.625 + 305.500 48.832 237.444 0.496 0.339 15.447 + 305.750 48.048 235.409 0.527 0.348 15.129 + 306.000 47.708 233.066 0.501 0.349 15.127 + 306.250 49.725 232.388 0.477 0.341 15.382 + 306.500 50.191 235.030 0.466 0.339 16.487 + 306.750 47.973 238.715 0.449 0.347 18.244 + 307.000 45.321 242.400 0.435 0.345 20.265 + 307.250 43.918 245.140 0.437 0.337 22.133 + 307.500 46.065 245.502 0.467 0.342 23.064 + 307.750 46.840 242.222 0.485 0.354 23.409 + 308.000 46.368 241.960 0.499 0.363 22.164 + 308.250 45.836 242.623 0.516 0.365 19.212 + 308.500 45.923 245.059 0.524 0.358 16.936 + 308.750 47.510 246.560 0.531 0.347 15.561 + 309.000 51.278 246.503 0.500 0.332 14.514 + 309.250 53.423 246.250 0.486 0.315 13.923 + 309.500 50.835 246.703 0.436 0.285 13.817 + 309.750 47.435 247.367 0.242 0.245 14.452 + 310.000 43.164 248.659 0.192 0.088 15.088 + 310.250 40.636 249.432 0.194 -0.009 15.871 + 310.500 40.849 247.511 0.256 -0.042 16.260 + 310.750 47.109 244.853 0.315 0.154 16.350 + 311.000 53.806 240.745 0.455 0.236 16.286 + 311.250 53.709 238.510 0.451 0.310 15.683 + 311.500 53.300 236.789 0.451 0.333 14.491 + 311.750 58.687 235.694 0.462 0.339 13.668 + 312.000 59.773 235.849 0.487 0.345 13.261 + 312.250 56.811 236.102 0.500 0.339 13.159 + 312.500 55.468 236.769 0.508 0.337 13.133 + 312.750 54.437 238.576 0.488 0.344 13.057 + 313.000 56.021 241.743 0.475 0.344 13.031 + 313.250 57.607 245.526 0.463 0.343 13.029 + 313.500 57.386 246.204 0.470 0.344 13.002 + 313.750 55.857 245.739 0.498 0.345 13.000 + 314.000 54.575 245.457 0.505 0.343 13.071 + 314.250 54.853 244.261 0.467 0.340 13.020 + 314.500 55.006 242.223 0.476 0.341 13.166 + 314.750 57.588 240.931 0.494 0.344 13.413 + 315.000 57.865 240.868 0.485 0.344 13.361 + 315.250 57.144 240.612 0.472 0.339 12.963 + 315.500 58.108 240.546 0.460 0.339 12.767 + 315.750 56.578 240.591 0.463 0.340 12.789 + 316.000 57.727 240.224 0.491 0.341 12.812 + 316.250 57.567 239.015 0.491 0.335 12.930 + 316.500 56.410 240.204 0.474 0.332 12.953 + 316.750 55.316 238.696 0.473 0.336 12.951 + 317.000 55.159 238.848 0.489 0.336 12.827 + 317.250 58.113 239.825 0.480 0.342 12.801 + 317.500 61.695 239.976 0.487 0.351 12.727 + 317.750 62.158 238.884 0.501 0.348 12.630 + 318.000 60.254 238.721 0.521 0.347 12.534 + 318.250 60.843 238.662 0.529 0.343 12.344 + 318.500 61.059 238.705 0.498 0.340 12.181 + 318.750 60.713 238.342 0.480 0.340 11.997 + 319.000 62.609 237.455 0.468 0.341 11.772 + 319.250 63.633 236.675 0.470 0.349 11.683 + 319.500 63.288 236.297 0.481 0.354 11.528 + 319.750 65.122 235.510 0.475 0.355 11.312 + 320.000 65.712 235.037 0.465 0.360 11.141 + 320.250 62.810 234.879 0.471 0.351 10.912 + 320.500 60.532 231.807 0.500 0.343 10.707 + 320.750 62.493 233.308 0.517 0.339 10.545 + 321.000 61.895 237.716 0.531 0.343 10.425 + 321.250 59.245 238.080 0.511 0.353 10.326 + 321.500 56.966 238.544 0.510 0.354 10.286 + 321.750 57.930 238.482 0.506 0.353 10.439 + 322.000 59.265 237.694 0.496 0.353 10.478 + 322.250 58.795 237.220 0.492 0.355 10.694 + 322.500 59.882 235.506 0.502 0.356 10.875 + 322.750 60.283 234.721 0.508 0.355 10.792 + 323.000 64.548 234.877 0.515 0.354 10.142 + 323.250 72.615 235.965 0.531 0.349 9.283 + 323.500 80.058 237.771 0.509 0.308 8.292 + 323.750 79.403 240.302 0.486 0.283 6.961 + 324.000 79.366 245.957 0.476 0.273 6.742 + 324.250 79.456 251.308 0.485 0.276 6.615 + 324.500 81.729 254.370 0.498 0.276 6.727 + 324.750 80.449 255.444 0.481 0.272 6.892 + 325.000 80.479 255.077 0.483 0.261 7.035 + 325.250 80.253 254.294 0.508 0.261 6.994 + 325.500 80.343 253.612 0.522 0.259 6.773 + 325.750 79.252 252.720 0.523 0.252 6.329 + 326.000 72.547 250.178 0.532 0.243 5.948 + 326.250 68.400 247.415 0.528 0.239 5.516 + 326.500 70.608 242.166 0.499 0.240 4.799 + 326.750 80.793 238.053 0.498 0.251 4.014 + 327.000 87.117 236.964 0.499 0.262 3.633 + 327.250 76.985 238.773 0.502 0.266 3.694 + 327.500 73.836 241.104 0.486 0.250 3.990 + 327.750 68.566 243.436 0.467 0.226 4.432 + 328.000 69.966 245.252 0.478 0.196 5.025 + 328.250 72.486 246.849 0.505 0.201 6.075 + 328.500 68.900 248.351 0.505 0.269 7.274 + 328.750 64.130 248.917 0.508 0.295 8.694 + 329.000 58.985 248.449 0.494 0.303 10.314 + 329.250 56.645 247.035 0.465 0.292 11.392 + 329.500 60.536 245.939 0.454 0.281 12.005 + 329.750 71.530 245.464 0.462 0.257 12.026 + 330.000 76.919 245.513 0.468 0.237 11.196 + 330.250 78.754 244.942 0.457 0.220 9.053 + 330.500 78.844 244.257 0.454 0.218 8.571 + 330.750 76.627 244.196 0.459 0.265 8.634 + 331.000 74.411 243.832 0.464 0.266 8.846 + 331.250 74.876 243.459 0.472 0.264 9.149 + 331.500 73.407 242.988 0.475 0.268 9.321 + 331.750 73.684 242.616 0.479 0.268 9.320 + 332.000 76.082 242.763 0.489 0.261 9.179 + 332.250 78.477 243.852 0.496 0.251 9.092 + 332.500 79.564 244.624 0.482 0.250 8.904 + 332.750 77.846 243.948 0.467 0.249 8.754 + 333.000 78.435 242.537 0.462 0.245 8.573 + 333.250 81.516 241.853 0.464 0.243 8.428 + 333.500 82.791 242.214 0.472 0.244 8.364 + 333.750 81.509 242.474 0.475 0.252 8.394 + 334.000 79.418 242.519 0.470 0.255 8.520 + 334.250 78.075 242.356 0.477 0.255 8.566 + 334.500 80.224 243.123 0.483 0.257 8.728 + 334.750 79.876 246.294 0.479 0.258 8.825 + 335.000 78.097 248.412 0.469 0.258 8.974 + 335.250 75.445 250.331 0.462 0.253 9.177 + 335.500 73.727 249.956 0.454 0.246 9.350 + 335.750 73.007 247.510 0.439 0.245 9.454 + 336.000 73.035 244.961 0.424 0.255 9.417 + 336.250 77.738 244.383 0.444 0.263 9.276 + 336.500 78.138 245.474 0.457 0.260 9.016 + 336.750 73.741 247.488 0.448 0.254 8.797 + 337.000 67.164 249.199 0.440 0.254 8.730 + 337.250 59.902 247.893 0.433 0.307 8.712 + 337.500 57.810 245.240 0.459 0.306 8.793 + 337.750 59.270 243.840 0.484 0.270 9.128 + 338.000 58.802 243.361 0.474 0.258 9.584 + 338.250 60.324 242.677 0.459 0.273 9.949 + 338.500 62.221 242.002 0.444 0.288 10.387 + 338.750 61.252 241.005 0.448 0.257 10.602 + 339.000 59.723 239.701 0.464 0.247 10.944 + 339.250 58.751 237.980 0.476 0.282 11.088 + 339.500 58.783 238.443 0.466 0.302 11.211 + 339.750 59.243 241.507 0.458 0.293 11.316 + 340.000 60.269 241.340 0.473 0.285 10.999 + 340.250 62.789 239.106 0.472 0.283 10.473 + 340.500 66.122 238.843 0.462 0.273 10.219 + 340.750 62.908 239.617 0.448 0.268 10.198 + 341.000 59.569 240.486 0.438 0.298 10.177 + 341.250 61.157 241.468 0.454 0.304 10.214 + 341.500 63.303 241.824 0.471 0.275 10.328 + 341.750 64.767 242.914 0.432 0.238 10.522 + 342.000 64.356 243.788 0.430 0.202 10.761 + 342.250 63.949 243.624 0.443 0.198 10.963 + 342.500 65.157 243.155 0.439 0.213 10.737 + 342.750 72.228 242.999 0.453 0.230 10.185 + 343.000 76.992 242.523 0.497 0.270 9.047 + 343.250 73.779 242.368 0.520 0.278 8.234 + 343.500 69.445 242.409 0.446 0.263 7.752 + 343.750 68.475 242.658 0.377 0.178 7.607 + 344.000 70.310 242.503 0.352 0.121 7.677 + 344.250 74.762 241.821 0.369 0.205 8.625 + 344.500 76.537 240.103 0.474 0.250 9.490 + 344.750 73.574 238.592 0.474 0.270 10.172 + 345.000 72.664 238.015 0.459 0.259 10.018 + 345.250 73.129 237.540 0.459 0.237 8.882 + 345.500 73.094 237.797 0.520 0.248 7.904 + 345.750 70.193 237.944 0.528 0.316 7.442 + 346.000 68.662 238.196 0.505 0.329 7.247 + 346.250 68.316 239.069 0.489 0.332 7.638 + 346.500 67.098 240.571 0.501 0.326 8.612 + 346.750 69.556 242.798 0.519 0.319 9.693 + 347.000 70.333 245.128 0.500 0.315 10.526 + 347.250 70.859 247.359 0.485 0.312 11.093 + 347.500 71.448 248.234 0.484 0.307 10.703 + 347.750 68.361 248.176 0.486 0.294 7.804 + 348.000 65.582 247.496 0.489 0.257 7.170 + 348.250 61.995 247.442 0.491 0.227 6.892 + 348.500 63.397 248.007 0.480 0.245 6.762 + 348.750 66.226 248.155 0.476 0.265 6.673 + 349.000 67.003 248.413 0.487 0.268 6.622 + 349.250 68.338 248.978 0.510 0.260 6.621 + 349.500 70.797 249.126 0.505 0.261 6.632 + 349.750 73.379 249.065 0.476 0.267 6.669 + 350.000 75.091 248.807 0.486 0.270 6.794 + 350.250 74.618 248.430 0.482 0.269 6.844 + 350.500 74.897 248.687 0.467 0.265 6.843 + 350.750 74.985 248.942 0.485 0.260 6.842 + 351.000 74.826 248.880 0.523 0.244 6.880 + 351.250 76.101 248.831 0.517 0.233 6.943 + 351.500 78.125 248.878 0.485 0.228 7.021 + 351.750 76.969 249.022 0.469 0.215 7.113 + 352.000 75.311 249.696 0.470 0.195 7.112 + 352.250 77.334 250.150 0.482 0.193 7.084 + 352.500 79.979 249.990 0.463 0.239 7.096 + 352.750 79.136 249.309 0.449 0.234 7.162 + 353.000 80.533 249.366 0.450 0.223 7.014 + 353.250 82.555 249.922 0.469 0.234 7.106 + 353.500 82.395 250.392 0.461 0.255 7.105 + 353.750 82.861 250.639 0.473 0.259 7.117 + 354.000 80.958 250.788 0.465 0.255 7.050 + 354.250 80.798 251.355 0.455 0.255 6.969 + 354.500 81.323 251.294 0.450 0.254 6.981 + 354.750 81.041 250.926 0.449 0.241 7.046 + 355.000 81.565 248.583 0.445 0.233 7.246 + 355.250 81.843 245.617 0.449 0.224 7.438 + 355.500 80.251 239.639 0.457 0.224 7.854 + 355.750 76.663 240.519 0.466 0.238 8.230 + 356.000 72.891 244.622 0.465 0.289 8.921 + 356.250 69.802 246.427 0.460 0.300 9.227 + 356.500 68.833 247.094 0.467 0.299 8.918 + 356.750 67.552 246.938 0.491 0.286 8.381 + 357.000 62.158 246.567 0.480 0.282 8.223 + 357.250 59.446 245.886 0.459 0.272 8.731 + 357.500 59.723 245.208 0.439 0.255 9.219 + 357.750 58.317 245.147 0.420 0.237 10.318 + 358.000 57.224 245.305 0.432 0.212 11.700 + 358.250 56.690 245.765 0.425 0.186 14.010 + 358.500 57.592 245.812 0.414 0.178 15.947 + 358.750 58.301 245.858 0.420 0.222 18.118 + 359.000 61.946 245.793 0.511 0.317 16.521 + 359.250 61.661 245.745 0.535 0.320 15.094 + 359.500 63.495 245.481 0.486 0.307 14.318 + 359.750 67.573 245.109 0.442 0.291 13.659 + 360.000 70.781 243.595 0.459 0.288 12.884 + 360.250 67.380 241.662 0.482 0.286 12.017 + 360.500 67.471 242.124 0.499 0.279 11.250 + 360.750 71.672 243.105 0.494 0.270 10.732 + 361.000 72.199 243.672 0.473 0.264 10.257 + 361.250 67.429 243.930 0.448 0.257 10.027 + 361.500 68.703 244.078 0.467 0.255 9.821 + 361.750 72.968 244.538 0.488 0.254 9.727 + 362.000 77.671 244.998 0.478 0.252 9.653 + 362.250 74.584 245.893 0.459 0.251 9.633 + 362.500 69.438 246.441 0.446 0.252 9.632 + 362.750 68.219 246.800 0.438 0.252 9.757 + 363.000 69.559 247.159 0.474 0.258 9.885 + 363.250 72.824 247.618 0.502 0.260 9.977 + 363.500 77.214 248.806 0.497 0.257 10.088 + 363.750 80.421 249.269 0.482 0.256 10.125 + 364.000 78.205 247.450 0.471 0.256 9.604 + 364.250 79.105 241.888 0.493 0.250 9.025 + 364.500 78.949 242.451 0.485 0.242 9.007 + 364.750 78.723 245.829 0.462 0.235 8.989 + 365.000 77.382 247.844 0.446 0.230 8.970 + 365.250 75.291 249.133 0.456 0.228 8.885 + 365.500 74.134 249.598 0.464 0.219 8.784 + 365.750 75.969 249.852 0.450 0.218 8.717 + 366.000 81.418 250.103 0.458 0.229 8.505 + 366.250 86.498 249.944 0.447 0.239 8.345 + 366.500 87.330 249.991 0.444 0.244 8.112 + 366.750 87.552 250.241 0.474 0.246 7.709 + 367.000 88.135 250.399 0.485 0.246 7.466 + 367.250 86.731 250.441 0.467 0.243 7.149 + 367.500 83.953 250.171 0.451 0.241 7.055 + 367.750 80.864 249.910 0.462 0.242 7.040 + 368.000 78.460 249.024 0.454 0.240 7.336 + 368.250 68.209 248.240 0.446 0.242 7.893 + 368.500 66.742 247.972 0.470 0.257 8.636 + 368.750 70.825 248.744 0.465 0.267 9.593 + 369.000 73.586 248.893 0.452 0.274 10.736 + 369.250 74.055 249.253 0.425 0.282 12.243 + 369.500 69.471 249.613 0.410 0.280 14.497 + 369.750 66.442 249.761 0.399 0.250 15.833 + 370.000 62.607 248.980 0.368 0.167 16.375 + 370.250 59.582 247.876 0.341 0.123 16.526 + 370.500 58.362 247.202 0.313 0.111 16.648 + 370.750 60.699 247.036 0.360 0.124 16.961 + 371.000 64.214 247.296 0.367 0.134 17.411 + 371.250 62.808 247.758 0.342 0.108 17.973 + 371.500 61.404 248.321 0.326 0.058 18.208 + 371.750 64.051 248.993 0.377 0.073 17.501 + 372.000 72.239 249.764 0.406 0.129 15.810 + 372.250 75.819 250.846 0.409 0.183 14.282 + 372.500 73.539 251.200 0.383 0.188 13.753 + 372.750 74.255 250.323 0.378 0.186 13.244 + 373.000 76.275 249.637 0.418 0.169 12.898 + 373.250 75.618 249.063 0.426 0.202 12.680 + 373.500 69.230 247.753 0.406 0.203 12.488 + 373.750 68.756 245.201 0.373 0.161 12.771 + 374.000 70.847 241.612 0.383 0.136 14.293 + 374.250 72.737 238.854 0.454 0.182 15.639 + 374.500 75.820 237.243 0.454 0.246 15.784 + 374.750 76.844 237.596 0.441 0.224 15.605 + 375.000 74.067 240.663 0.421 0.205 15.169 + 375.250 72.599 243.615 0.379 0.184 14.884 + 375.500 74.687 246.879 0.370 0.163 14.743 + 375.750 78.950 249.316 0.423 0.122 14.851 + 376.000 83.717 249.877 0.452 0.201 14.766 + 376.250 83.991 248.680 0.443 0.202 14.272 + 376.500 83.456 244.990 0.442 0.203 13.337 + 376.750 83.609 244.417 0.436 0.210 12.795 + 377.000 84.759 243.936 0.423 0.209 12.205 + 377.250 86.157 244.402 0.434 0.208 11.622 + 377.500 86.312 245.179 0.450 0.211 11.045 + 377.750 82.974 246.054 0.436 0.212 11.189 + 378.000 79.572 247.658 0.418 0.204 11.357 + 378.250 79.792 248.851 0.423 0.181 12.219 + 378.500 81.624 249.517 0.446 0.161 13.320 + 378.750 81.026 250.597 0.451 0.187 13.802 + 379.000 81.871 251.687 0.444 0.205 13.567 + 379.250 82.769 252.347 0.447 0.207 12.211 + 379.500 81.795 252.712 0.482 0.202 11.583 + 379.750 81.327 252.757 0.474 0.194 11.323 + 380.000 83.098 251.454 0.461 0.190 11.110 + 380.250 84.687 249.322 0.435 0.175 11.026 + 380.500 85.647 249.056 0.417 0.158 11.003 + 380.750 86.360 249.625 0.428 0.159 11.022 + 381.000 85.765 250.915 0.443 0.174 11.020 + 381.250 84.483 252.001 0.455 0.172 11.080 + 381.500 83.951 252.457 0.450 0.166 11.100 + 381.750 84.040 253.125 0.430 0.190 11.015 + 382.000 85.252 253.482 0.435 0.205 11.013 + 382.250 88.522 254.155 0.450 0.195 11.012 + 382.500 78.763 254.617 0.449 0.176 10.969 + 382.750 77.173 254.970 0.420 0.156 10.864 + 383.000 82.683 254.401 0.417 0.205 10.862 + 383.250 84.269 254.335 0.434 0.215 10.902 + 383.500 83.053 253.769 0.457 0.210 11.023 + 383.750 82.269 252.985 0.438 0.193 11.379 + 384.000 76.564 252.609 0.408 0.173 11.925 + 384.250 75.968 252.346 0.383 0.139 12.662 + 384.500 79.363 252.284 0.386 0.160 12.997 + 384.750 82.878 252.436 0.406 0.200 12.995 + 385.000 91.696 252.899 0.429 0.202 12.235 + 385.250 93.219 252.743 0.417 0.188 11.606 + 385.500 91.374 251.542 0.415 0.181 11.050 + 385.750 91.593 250.750 0.463 0.181 10.782 + 386.000 92.117 249.756 0.463 0.203 10.700 + 386.250 93.704 249.912 0.441 0.212 10.698 + 386.500 93.543 252.344 0.421 0.208 10.697 + 386.750 91.392 253.113 0.411 0.201 10.735 + 387.000 91.358 253.057 0.411 0.196 10.774 + 387.250 92.004 251.237 0.428 0.202 10.833 + 387.500 91.845 247.336 0.473 0.198 11.037 + 387.750 90.757 244.995 0.469 0.184 11.118 + 388.000 90.967 250.757 0.452 0.174 11.137 + 388.250 91.620 253.186 0.452 0.179 11.135 + 388.500 92.830 252.093 0.445 0.184 11.197 + 388.750 93.610 250.579 0.423 0.181 11.237 + 389.000 92.328 248.544 0.417 0.178 11.257 + 389.250 92.104 245.377 0.425 0.191 11.275 + 389.500 92.567 245.004 0.445 0.191 11.253 + 389.750 92.843 246.090 0.452 0.182 11.314 + 390.000 92.501 245.306 0.446 0.171 11.312 + 390.250 90.780 243.286 0.463 0.162 11.289 + 390.500 88.128 247.599 0.462 0.167 11.266 + 390.750 88.970 249.397 0.461 0.194 11.244 + 391.000 91.362 254.629 0.443 0.198 11.244 + 391.250 92.265 257.584 0.414 0.175 11.030 + 391.500 90.549 254.202 0.403 0.149 10.885 + 391.750 92.943 251.339 0.406 0.137 10.228 + 392.000 97.891 251.513 0.421 0.189 9.887 + 392.250 99.294 251.965 0.407 0.204 8.949 + 392.500 97.454 252.317 0.407 0.193 8.748 + 392.750 97.418 252.053 0.435 0.188 8.648 + 393.000 94.579 252.092 0.432 0.188 8.647 + 393.250 88.933 250.371 0.425 0.176 9.533 + 393.500 84.349 248.864 0.416 0.228 10.994 + 393.750 85.935 244.963 0.419 0.238 13.018 + 394.000 84.346 240.544 0.410 0.241 14.762 + 394.250 83.248 240.290 0.402 0.232 17.186 + 394.500 80.036 240.947 0.378 0.180 20.007 + 394.750 80.067 243.185 0.384 0.162 22.688 + 395.000 78.784 245.103 0.404 0.173 26.413 + 395.250 73.263 246.485 0.392 0.181 30.462 + 395.500 67.371 250.167 0.377 0.167 34.478 + 395.750 64.223 251.157 0.367 0.160 38.805 + 396.000 65.249 251.296 0.356 0.153 42.381 + 396.250 65.525 251.872 0.348 0.135 46.548 + 396.500 63.682 251.909 0.339 0.107 52.290 + 396.750 63.150 252.065 0.305 0.097 55.627 + 397.000 64.490 252.104 0.286 0.092 55.304 + 397.250 65.576 251.426 0.334 0.093 51.776 + 397.500 66.783 251.478 0.406 0.141 45.389 + 397.750 68.126 251.950 0.427 0.184 33.661 + 398.000 68.149 252.299 0.395 0.177 28.206 + 398.250 69.486 252.556 0.380 0.159 26.858 + 398.500 72.504 252.487 0.373 0.138 25.478 + 398.750 75.089 252.220 0.380 0.142 24.350 + 399.000 74.430 252.058 0.399 0.173 23.537 + 399.250 75.270 252.001 0.420 0.219 22.623 + 399.500 77.231 252.257 0.435 0.236 21.785 + 399.750 79.561 252.615 0.445 0.247 21.296 + 400.000 77.162 252.669 0.447 0.256 21.173 + 400.250 75.130 252.706 0.442 0.260 21.248 + 400.500 72.413 252.759 0.436 0.241 21.286 + 400.750 69.140 252.490 0.427 0.226 21.282 + 401.000 70.912 252.118 0.425 0.210 21.279 + 401.250 70.941 251.958 0.437 0.228 21.275 + 401.500 70.718 251.902 0.435 0.225 21.392 + 401.750 67.133 250.810 0.388 0.144 22.250 + 402.000 62.237 247.006 0.347 0.115 25.421 + 402.250 59.777 245.600 0.319 0.082 29.153 + 402.500 58.241 246.069 0.298 0.060 31.779 + 402.750 59.457 246.522 0.306 0.085 32.195 + 403.000 65.090 247.399 0.340 0.135 30.369 + 403.250 71.538 249.326 0.350 0.152 26.522 + 403.500 71.939 250.505 0.353 0.154 25.158 + 403.750 70.791 251.701 0.357 0.151 24.456 + 404.000 71.185 251.117 0.370 0.152 23.772 + 404.250 72.207 251.377 0.410 0.170 22.978 + 404.500 74.420 251.316 0.426 0.196 21.756 + 404.750 77.187 251.574 0.411 0.206 20.407 + 405.000 80.337 252.252 0.407 0.197 18.962 + 405.250 82.485 252.599 0.409 0.193 16.251 + 405.500 83.440 252.951 0.404 0.196 14.904 + 405.750 81.164 253.310 0.420 0.184 14.985 + 406.000 79.262 252.737 0.410 0.178 15.469 + 406.250 78.980 252.267 0.397 0.169 16.119 + 406.500 78.694 251.683 0.397 0.157 16.734 + 406.750 78.720 251.627 0.413 0.152 17.242 + 407.000 78.995 251.679 0.429 0.157 17.865 + 407.250 77.403 250.991 0.392 0.146 18.408 + 407.500 77.430 250.728 0.369 0.127 19.110 + 407.750 78.953 250.878 0.355 0.117 19.506 + 408.000 79.232 251.553 0.355 0.129 19.650 + 408.250 80.442 251.906 0.371 0.148 19.281 + 408.500 83.149 251.845 0.376 0.152 18.637 + 408.750 82.056 251.591 0.367 0.144 18.082 + 409.000 82.520 251.636 0.364 0.142 17.511 + 409.250 82.610 251.779 0.398 0.177 16.957 + 409.500 82.140 252.137 0.416 0.175 16.608 + 409.750 82.229 252.287 0.415 0.174 16.327 + 410.000 80.451 252.957 0.419 0.175 15.114 + 410.250 83.904 253.734 0.434 0.167 14.418 + 410.500 86.800 254.812 0.442 0.155 13.832 + 410.750 90.507 256.940 0.434 0.188 13.345 + 411.000 91.590 256.884 0.433 0.192 13.021 + 411.250 89.188 255.888 0.425 0.161 12.728 + 411.500 88.287 253.549 0.403 0.132 12.584 + 411.750 89.249 253.799 0.379 0.090 12.605 + 412.000 93.262 254.572 0.361 0.103 12.556 + 412.250 96.591 255.765 0.403 0.128 12.483 + 412.500 99.112 256.954 0.411 0.177 12.529 + 412.750 96.522 257.833 0.394 0.169 12.386 + 413.000 97.236 257.773 0.387 0.134 12.154 + 413.250 99.446 255.638 0.398 0.123 11.594 + 413.500 100.345 256.309 0.391 0.171 11.312 + 413.750 99.686 257.082 0.365 0.170 11.163 + 414.000 101.770 255.682 0.377 0.159 10.892 + 414.250 105.225 256.551 0.433 0.156 10.748 + 414.500 105.941 258.470 0.434 0.172 10.666 + 414.750 105.718 259.547 0.422 0.168 10.584 + 415.000 106.556 261.153 0.398 0.172 10.424 + 415.250 106.772 262.343 0.392 0.190 10.384 + 415.500 104.928 271.010 0.448 0.205 10.266 + 415.750 100.472 275.314 0.420 0.182 10.557 + 416.000 83.734 264.349 0.354 0.113 11.661 + 416.250 82.329 254.009 0.326 0.081 13.223 + 416.500 90.145 253.229 0.340 0.085 15.511 + 416.750 98.276 253.478 0.382 0.162 18.434 + 417.000 102.168 253.741 0.395 0.190 19.611 + 417.250 97.522 254.198 0.392 0.197 19.979 + 417.500 95.055 253.203 0.397 0.195 19.752 + 417.750 80.999 251.176 0.400 0.220 19.823 + 418.000 54.168 248.622 0.396 0.244 23.917 + 418.250 44.725 246.381 0.392 0.284 28.694 + 418.500 39.395 242.170 0.393 0.310 45.546 + 418.750 36.180 235.987 0.410 0.315 55.784 + 419.000 34.464 241.020 0.425 0.320 76.189 + 419.250 33.991 246.153 0.422 0.310 80.441 + 419.500 36.699 251.390 0.409 0.300 78.339 + 419.750 45.203 253.208 0.406 0.297 74.455 + 420.000 49.093 253.663 0.411 0.292 67.261 + 420.250 50.991 254.028 0.444 0.286 60.761 + 420.500 51.767 254.280 0.455 0.315 54.172 + 420.750 54.723 252.869 0.440 0.299 45.651 + 421.000 61.356 250.733 0.417 0.281 40.094 + 421.250 69.611 249.021 0.372 0.257 35.082 + 421.500 82.352 247.505 0.334 0.196 26.511 + 421.750 87.177 249.423 0.326 0.156 18.102 + 422.000 87.457 252.168 0.339 0.157 14.747 + 422.250 86.237 254.393 0.360 0.155 13.074 + 422.500 81.344 255.273 0.360 0.162 12.286 + 422.750 78.627 255.429 0.346 0.159 12.101 + 423.000 86.319 254.330 0.327 0.151 11.851 + 423.250 104.855 253.757 0.415 0.154 11.412 + 423.500 111.427 252.449 0.410 0.175 9.193 + 423.750 83.100 250.933 0.394 0.186 8.181 + 424.000 71.474 249.319 0.367 0.190 9.435 + 424.250 65.644 249.365 0.305 0.144 11.534 + 424.500 63.180 249.620 0.282 0.098 16.143 + 424.750 74.299 249.667 0.306 0.095 23.724 + 425.000 92.523 249.712 0.340 0.094 25.909 + 425.250 100.781 250.171 0.364 0.104 25.233 + 425.500 101.742 249.802 0.408 0.136 22.540 + 425.750 103.204 248.186 0.423 0.172 16.874 + 426.000 105.599 248.443 0.418 0.189 12.444 + 426.250 104.630 246.833 0.409 0.211 10.766 + 426.500 65.710 245.422 0.394 0.233 10.784 + 426.750 63.555 244.112 0.388 0.254 13.741 + 427.000 63.461 244.889 0.398 0.258 20.615 + 427.250 65.355 246.599 0.395 0.253 27.788 + 427.500 68.936 247.691 0.387 0.248 34.550 + 427.750 68.401 248.248 0.365 0.234 37.101 + 428.000 63.758 249.334 0.345 0.175 37.657 + 428.250 65.216 249.794 0.321 0.147 36.535 + 428.500 77.457 250.357 0.401 0.164 34.140 + 428.750 84.841 250.934 0.406 0.179 29.096 + 429.000 87.984 251.490 0.419 0.184 23.395 + 429.250 86.331 251.017 0.418 0.194 18.704 + 429.500 81.682 249.296 0.402 0.239 18.772 + 429.750 63.575 246.449 0.402 0.280 23.961 + 430.000 63.291 245.653 0.402 0.305 27.480 + 430.250 69.488 244.871 0.391 0.283 27.891 + 430.500 76.189 245.019 0.385 0.217 26.757 + 430.750 67.799 245.061 0.391 0.218 22.129 + 431.000 58.107 245.635 0.427 0.222 15.367 + 431.250 65.425 245.469 0.460 0.199 11.767 + 431.500 77.294 246.241 0.460 0.206 9.786 + 431.750 83.552 246.702 0.441 0.209 8.435 + 432.000 82.147 247.481 0.439 0.207 7.563 + 432.250 76.939 248.041 0.464 0.178 7.001 + 432.500 72.607 248.296 0.450 0.155 6.831 + 432.750 74.629 248.963 0.414 0.153 7.025 + 433.000 81.016 248.808 0.434 0.162 7.487 + 433.250 84.529 248.643 0.418 0.168 8.162 + 433.500 84.682 248.586 0.406 0.167 8.426 + 433.750 81.599 248.326 0.497 0.224 8.314 + 434.000 79.191 248.685 0.545 0.248 8.097 + 434.250 74.856 248.413 0.588 0.325 7.768 + 434.500 75.448 246.697 0.552 0.314 7.313 + 434.750 80.335 245.284 0.520 0.298 7.163 + 435.000 83.980 246.478 0.526 0.291 7.352 + 435.250 89.487 248.090 0.544 0.270 7.242 + 435.500 95.436 248.438 0.555 0.219 7.013 + 435.750 102.382 248.589 0.527 0.188 6.804 + 436.000 100.788 248.120 0.503 0.172 6.829 + 436.250 95.456 247.536 0.495 0.158 7.075 + 436.500 90.874 248.309 0.485 0.222 7.277 + 436.750 91.088 250.968 0.487 0.237 7.554 + 437.000 94.545 252.249 0.494 0.217 7.711 + 437.250 94.448 247.720 0.512 0.207 7.709 + 437.500 91.357 244.342 0.511 0.196 7.536 + 437.750 83.909 242.624 0.506 0.215 7.592 + 438.000 75.087 241.941 0.497 0.243 8.260 + 438.250 67.388 242.402 0.502 0.251 9.297 + 438.500 63.303 242.867 0.530 0.258 10.905 + 438.750 58.594 243.745 0.518 0.278 11.977 + 439.000 57.377 244.411 0.496 0.293 12.789 + 439.250 57.279 245.508 0.469 0.302 12.957 + 439.500 56.683 245.645 0.464 0.256 13.052 + 439.750 54.094 246.008 0.465 0.171 12.977 + 440.000 52.814 245.434 0.468 0.148 12.877 + 440.250 53.715 244.128 0.468 0.162 12.755 + 440.500 53.868 241.678 0.469 0.167 12.705 + 440.750 45.043 237.265 0.472 0.139 12.513 + 441.000 40.211 232.836 0.476 0.151 12.488 + 441.250 41.796 226.862 0.482 0.205 12.416 + 441.500 44.317 220.986 0.489 0.210 12.461 + 441.750 44.409 215.009 0.496 0.216 12.482 + 442.000 44.248 209.656 0.502 0.235 12.410 diff --git a/examples/deployments/test_new_templates/well_viz_html.html b/examples/deployments/test_new_templates/well_viz_html.html new file mode 100644 index 0000000..c6499ee --- /dev/null +++ b/examples/deployments/test_new_templates/well_viz_html.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + +

    "HELLO!"

    +

    Smaller Header

    +
    + + + + + + + + \ No newline at end of file From c279aac83753c2519bcb9f7299d22104e0e3a93e Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 13 Jun 2020 08:04:34 -0700 Subject: [PATCH 12/17] Still working through 'browserify-ing' my additional code. --- dist/base_template.js | 2 +- dist/index.js | 6 +++ dist/log_style_templates/CAL.js | 6 +-- dist/log_style_templates/GR.js | 8 ++- dist/main_funcs.js | 17 +++++++ dist/track_templates/CaliperGR_track.js | 4 +- dist/track_templates/default_sub_track.js | 4 +- dist/track_templates/track_template.js | 50 +++++++++++++++++++ .../triple_combo_template.js | 4 +- dist/well_log_templates/well_log_template.js | 16 ++++++ .../well_section_templates.js | 2 +- docs/js/get_wellio.js | 2 +- .../well_viz_html.html | 3 +- .../draw_logs_with_templates.js | 9 +++- .../test_new_templates/well_viz_html.html | 16 ++++-- .../index_eslint_busted.js | 0 .../index_eslint_busted2.js | 0 {dist => moved_temporarily}/trial.js | 0 package-lock.json | 21 +++----- package.json | 15 ++++-- 20 files changed, 141 insertions(+), 44 deletions(-) create mode 100644 dist/main_funcs.js rename {dist => moved_temporarily}/index_eslint_busted.js (100%) rename {dist => moved_temporarily}/index_eslint_busted2.js (100%) rename {dist => moved_temporarily}/trial.js (100%) diff --git a/dist/base_template.js b/dist/base_template.js index fa282f4..c3dba06 100644 --- a/dist/base_template.js +++ b/dist/base_template.js @@ -10,4 +10,4 @@ class BaseTemplate { return this } } -module.exports(BaseTemplate) \ No newline at end of file +module.exports = BaseTemplate \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 7036761..d8dce65 100644 --- a/dist/index.js +++ b/dist/index.js @@ -52,6 +52,12 @@ WellSectionTemplate: require('./well_section_templates/well_section_templates'), CurveFillTemplate: require('./fill_templates/curve_fill_template'), LogCurveTemplate: require('./log_style_templates/log_curve_template'), + TripleCombo: require("./well_log_templates/triple_combo_template"), + BaseTemplate: require("./base_template"), + CaliperGRTrack: require("./track_templates/CaliperGR_track"), + GR: require("./log_style_templates/GR"), + CAL: require("./log_style_templates/CAL"), + DefaultSubTrack: require("./track_templates/default_sub_track"), /** * A function that directs users to the docs if they need help. * @returns {string} It says = I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. \n If you would like to know what wellioviz does, try wellioviz.define(). \n If you would like to see an example template, try wellioviz.curveBoxTemplateExamples('example') \n If you would like to see an example template defintions, try wellioviz.curveBoxTemplateExamples('definitions') Best of luck. diff --git a/dist/log_style_templates/CAL.js b/dist/log_style_templates/CAL.js index 998eacd..fe1e96d 100644 --- a/dist/log_style_templates/CAL.js +++ b/dist/log_style_templates/CAL.js @@ -6,9 +6,7 @@ class CAL extends LogCurveTemplate { this.curve_name = "CAL" this.units = "cm" this.stroke_type = "dash" // TODO Warning! This might not be a thing haha - for (const [key, value] in Object.entries(params)){ - obj[key] = value - } + this.handle_params(params) } } -module.exports(CAL) \ No newline at end of file +module.exports = CAL \ No newline at end of file diff --git a/dist/log_style_templates/GR.js b/dist/log_style_templates/GR.js index 33e53b9..9dd7132 100644 --- a/dist/log_style_templates/GR.js +++ b/dist/log_style_templates/GR.js @@ -4,11 +4,9 @@ class GR extends LogCurveTemplate { constructor(params={}) { super(params); this.curve_name = "GR" - this.fill = null // TODO: GR Fill + // this.fill = null // TODO: GR Fill this.units = "API" - for (const [key, value] in Object.entries(params)){ - obj[key] = value - } + this.handle_params(params) } } -module.exports(GR) \ No newline at end of file +module.exports = GR \ No newline at end of file diff --git a/dist/main_funcs.js b/dist/main_funcs.js new file mode 100644 index 0000000..478ff54 --- /dev/null +++ b/dist/main_funcs.js @@ -0,0 +1,17 @@ +// let wellio = require('wellio') +// let TripleCombo = require("./well_log_templates/triple_combo_template") + +async function plot_triple_combo_log(div_id, url="./static/00-01-11-082-23W4-0.LAS") { + let ShaleSiltCutOff = 80 + let SiltSandCutOff = 55 + // var fileUrltoWellLog = "https://gist.githubusercontent.com/JustinGOSSES/2685e588d5c2f2a0ba1591ec7b9c9421/raw/415fe8a2f27dc7621f06f60ffd40a62c0d55a0f0/00-01-01-095-19W4-0.las" + var fetched = await fetch(url) + var well_as_string = await fetched.text() + var well = las2json(well_as_string) + // let depth_curve_name = well['CURVE INFORMATION BLOCK'] + var test = new TrackTemplate() + var log = new TripleCombo() + log.load_log(well) + console.log('here') + +} \ No newline at end of file diff --git a/dist/track_templates/CaliperGR_track.js b/dist/track_templates/CaliperGR_track.js index 2dde565..247f997 100644 --- a/dist/track_templates/CaliperGR_track.js +++ b/dist/track_templates/CaliperGR_track.js @@ -9,9 +9,7 @@ class CaliperGRTrack extends DefaultSubTrack { this.div_id = 'cal_gr_track' this.title = {"text": "CAL - GR", "font": "16px"} this.curves = {'GR': new GR, 'CAL': new CAL} - for (const [key, value] in Object.entries(params)){ - obj[key] = value - } + this.handle_params(params) } } diff --git a/dist/track_templates/default_sub_track.js b/dist/track_templates/default_sub_track.js index bde6429..9b6249c 100644 --- a/dist/track_templates/default_sub_track.js +++ b/dist/track_templates/default_sub_track.js @@ -8,9 +8,7 @@ class DefaultSubTrack extends TrackTemplate { this.show_depth_type = false this.independent_scale = false this.div_id = 'sub_track' - for (const [key, value] in Object.entries(params)){ - obj[key] = value - } + this.handle_params() } } diff --git a/dist/track_templates/track_template.js b/dist/track_templates/track_template.js index ce1e533..63c11a1 100644 --- a/dist/track_templates/track_template.js +++ b/dist/track_templates/track_template.js @@ -16,6 +16,7 @@ class TrackTemplate extends BaseTemplate{ this.mouse_over_depth_only = false this.grid_color = "#D3D3D3" this.grid_stroke_width = 0.2 + this.depth_curve = "DEPT" this.track_dimensions = {"height": 500, "width": 260} this.scale_numerator = 2 this.margin = {"top": 10, "right": 10, "bottom": 30, "left": 60} @@ -31,5 +32,54 @@ class TrackTemplate extends BaseTemplate{ return this } + load_log(logs_dict) { + console.log('setting up track data') + var curves_with_data = {} + this.depth_curve = this.get_depth_track_name(logs_dict['CURVE_INFORMATION_BLOCK']) + for (const [key, value] in Object.entries(this.curves)){ + // Check if the curve is in the well log + // TODO: Put curve aliasing here!! + if(key in Object.keys(logs_dict['CURVE_INFORMATION_BLOCK'])){ + // Load the curve + let formatted_log = this.format_log(logs_dict['CURVES'], key) + curves_with_data[key] = value.set_curve_and_data(key, formatted_log) + } else { + curves_with_data[key] = value + } + + } + this.curves = curves_with_data + return this + } + /** + * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, + * array of curves names, and a string for UWI + * and returns the data array of objects that D3.js likes for data used in plotting. + * @param {object} curve_dict wellio style curves + * @param {string} curve_name the name of the curve to format + * @returns {array} returns array of objects that contain key:value pairs of curve name and value at each depth. Depth is also a key:value pair. + */ + format_log(curve_dict, curve_name){ + let depth = curve_dict[this.depth_curve]; + let curve = curve_dict[curve_name] + let curve_data = []; + curve_data.push(curve_dict[curve_name]); + var array_of_object; + array_of_object = []; + for (let eachPt = 0; eachPt < depth.length; eachPt++) { + let obj = {}; + obj[this.depth_curve] = parseFloat(curve_data[0][eachPt]); + obj[curve_name] = parseFloat(curve_data[1][eachPt]) + + + array_of_object.push(obj); + } + return array_of_object + } + + get_depth_track_name(curve_info){ + return Object.keys(curve_info)[0] + } + } module.exports = TrackTemplate \ No newline at end of file diff --git a/dist/well_log_templates/triple_combo_template.js b/dist/well_log_templates/triple_combo_template.js index f7eaf16..67a236b 100644 --- a/dist/well_log_templates/triple_combo_template.js +++ b/dist/well_log_templates/triple_combo_template.js @@ -6,5 +6,7 @@ class TripleCombo extends WellLogTemplate { this.tracks = { 'CAL_GR': new CaliperGR_track() } + this.handle_params(params) } -} \ No newline at end of file +} +module.exports = TripleCombo \ No newline at end of file diff --git a/dist/well_log_templates/well_log_template.js b/dist/well_log_templates/well_log_template.js index aec794f..c99e1e9 100644 --- a/dist/well_log_templates/well_log_template.js +++ b/dist/well_log_templates/well_log_template.js @@ -16,5 +16,21 @@ class WellLogTemplate extends BaseTemplate{ //Update template based on passed params this.handle_params(params) } + + load_log(log_dict) { + console.log('loading log into template') + var tracks_with_data = {} + for (const [key, value] in Object.entries(this.tracks)){ + // Extract Data for each log and load into the track + tracks_with_data[key] = track.load_log(log_dict) + } + // setup well log header + + return this + } + + get_depth_track_name(curve_info){ + return Object.keys(curve_info)[0] + } } module.exports = WellLogTemplate \ No newline at end of file diff --git a/dist/well_section_templates/well_section_templates.js b/dist/well_section_templates/well_section_templates.js index a9977aa..7fff5d2 100644 --- a/dist/well_section_templates/well_section_templates.js +++ b/dist/well_section_templates/well_section_templates.js @@ -1,4 +1,4 @@ -const BaseTemplate = require("../base_template") +let BaseTemplate = require("../base_template"); class WellSectionTemplate extends BaseTemplate{ constructor(params={}) { diff --git a/docs/js/get_wellio.js b/docs/js/get_wellio.js index bcea17b..ab07d93 100644 --- a/docs/js/get_wellio.js +++ b/docs/js/get_wellio.js @@ -2,4 +2,4 @@ wellio = require('wellio'); las2json = wellio.las2json; -wellioviz = require("../../dist/index.js") \ No newline at end of file +wellioviz = require("../../dist") \ No newline at end of file diff --git a/examples/deployments/example_standalone_webpage/well_viz_html.html b/examples/deployments/example_standalone_webpage/well_viz_html.html index d0863d2..ad75808 100644 --- a/examples/deployments/example_standalone_webpage/well_viz_html.html +++ b/examples/deployments/example_standalone_webpage/well_viz_html.html @@ -6,7 +6,8 @@ - + + diff --git a/examples/deployments/test_new_templates/draw_logs_with_templates.js b/examples/deployments/test_new_templates/draw_logs_with_templates.js index 8359e20..fafcb3f 100644 --- a/examples/deployments/test_new_templates/draw_logs_with_templates.js +++ b/examples/deployments/test_new_templates/draw_logs_with_templates.js @@ -1,11 +1,16 @@ -async function plot_log(div_id, url="./static/00-01-11-082-23W4-0.LAS") { +async function plot_log_new(div_id, url="./static/00-01-11-082-23W4-0.LAS") { + // wellioviz.plot_triple_combo_log(div_id, url) let ShaleSiltCutOff = 80 let SiltSandCutOff = 55 // var fileUrltoWellLog = "https://gist.githubusercontent.com/JustinGOSSES/2685e588d5c2f2a0ba1591ec7b9c9421/raw/415fe8a2f27dc7621f06f60ffd40a62c0d55a0f0/00-01-01-095-19W4-0.las" var fetched = await fetch(url) var well_as_string = await fetched.text() var well = wellio.las2json(well_as_string) - let depth_curve_name = "DEPT" + // let depth_curve_name = well['CURVE INFORMATION BLOCK'] + var test = new TrackTemplate() + var log = new TripleCombo() + log.load_log(well) + console.log('here') } \ No newline at end of file diff --git a/examples/deployments/test_new_templates/well_viz_html.html b/examples/deployments/test_new_templates/well_viz_html.html index c6499ee..8f4cd78 100644 --- a/examples/deployments/test_new_templates/well_viz_html.html +++ b/examples/deployments/test_new_templates/well_viz_html.html @@ -5,11 +5,19 @@ - - - + + + + + + + + + + + - +

    "HELLO!"

    Smaller Header

    diff --git a/dist/index_eslint_busted.js b/moved_temporarily/index_eslint_busted.js similarity index 100% rename from dist/index_eslint_busted.js rename to moved_temporarily/index_eslint_busted.js diff --git a/dist/index_eslint_busted2.js b/moved_temporarily/index_eslint_busted2.js similarity index 100% rename from dist/index_eslint_busted2.js rename to moved_temporarily/index_eslint_busted2.js diff --git a/dist/trial.js b/moved_temporarily/trial.js similarity index 100% rename from dist/trial.js rename to moved_temporarily/trial.js diff --git a/package-lock.json b/package-lock.json index a44d539..0445eae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1706,6 +1706,11 @@ } } }, + "browserfy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserfy/-/browserfy-1.0.0.tgz", + "integrity": "sha1-6ErQ6QU7OUNpT1//XKrgfd5HT9M=" + }, "browserify": { "version": "16.5.1", "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.1.tgz", @@ -11802,19 +11807,9 @@ "dev": true }, "wellio": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/wellio/-/wellio-0.1.7.tgz", - "integrity": "sha512-J0E39NeUT0PWTrULO4EsP0uOx9HWOfNtJIKFLHsFw3hlRn6pES1YLBQvRIiFFFRN1b4oPzqrxE2d/PEn9oKfOw==" - }, - "wellioviz": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/wellioviz/-/wellioviz-0.0.28.tgz", - "integrity": "sha512-gTadYw3WPkNSb6ZRFQyFn9ADL9Y4+Jj5vADcjSUTKHkuawTO2ukV9joEFoaAztrjZnN3yyMef9i6O6jeFor/Ig==", - "requires": { - "d3": "^5.15.0", - "npm": "^6.14.5", - "wellio": "^0.1.7" - } + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/wellio/-/wellio-0.1.8.tgz", + "integrity": "sha512-c/mii/g0rVZwp4YrMyGvuGBM9X5tRS+VMpwPL6REUzKQd5YtgRVHiJvFgxzu7C4LegfsUzPPbqyXPuEfVmGGkA==" }, "whatwg-encoding": { "version": "1.0.5", diff --git a/package.json b/package.json index bc04c5e..b0a66d2 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,11 @@ "url": "https://github.com/JustinGOSSES/wellioviz/issues" }, "dependencies": { + "browserfy": "^1.0.0", "d3": "^5.15.0", "npm": "^6.14.5", - "wellioviz": "^0.0.28", - "wellio": "^0.1.7" + "wellio": "^0.1.8", + "wellioviz": "file:./dist/index.js" }, "description": "Provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library.", "devDependencies": { @@ -21,10 +22,12 @@ "eslint-plugin-promise": "^3.7.0", "eslint-plugin-standard": "^3.0.1", "tape": "~4.9.0", - "jest": "^26.0.1" + "jest": "^26.0.1", + "wellioviz": "file:./dist/index.js" }, "directories": { - "doc": "docs" + "doc": "docs", + "dist": "dist" }, "files": [ "dist/test/data_for_testing.js", @@ -42,7 +45,9 @@ "./dist/log_style_templates/", "./" ], - "modulePathIgnorePatterns": ["./examples/"], + "modulePathIgnorePatterns": [ + "./examples/" + ], "moduleFileExtensions": [ "js", "jsx", From 8726550c7e16e76627047ed191e3c8e2b2557243 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 13 Jun 2020 12:33:02 -0700 Subject: [PATCH 13/17] Making progress on the refactor of the package code. I spent some time setting up a test package so I can bundle it for the browser deployment at the end. I've got log loading propagating through the modules in tests ok. The next part is breaking down and distributing the D3 draw calls throughout the modules. --- dist/base_template.js | 7 + .../log_style_templates/log_curve_template.js | 4 +- dist/test/test_assets/00-01-01-073-05W5-0.LAS | 1091 +++++++++++++++++ dist/test/triple_combo.test.js | 11 + dist/track_templates/default_sub_track.js | 2 +- dist/track_templates/track_template.js | 33 +- .../triple_combo_template.js | 1 + dist/well_log_templates/well_log_template.js | 46 +- .../test_new_templates/static/main.js | 3 + package.json | 17 +- 10 files changed, 1195 insertions(+), 20 deletions(-) create mode 100644 dist/test/test_assets/00-01-01-073-05W5-0.LAS create mode 100644 dist/test/triple_combo.test.js create mode 100644 examples/deployments/test_new_templates/static/main.js diff --git a/dist/base_template.js b/dist/base_template.js index c3dba06..b2a4d69 100644 --- a/dist/base_template.js +++ b/dist/base_template.js @@ -9,5 +9,12 @@ class BaseTemplate { } return this } + + start_draw(div_id){ + let d3 = module.exports.d3; + let noDIV = d3.select("#" + div_id).selectAll("div").remove(); + let noSVG = d3.select("#" + div_id).selectAll("svg").remove(); + return d3 + } } module.exports = BaseTemplate \ No newline at end of file diff --git a/dist/log_style_templates/log_curve_template.js b/dist/log_style_templates/log_curve_template.js index 7bdbec4..d8d07b1 100644 --- a/dist/log_style_templates/log_curve_template.js +++ b/dist/log_style_templates/log_curve_template.js @@ -41,9 +41,7 @@ class LogCurveTemplate extends BaseTemplate { this.define_data(data) this.curve_name = curve_name //Update template based on passed params - for (const [key, value] in Object.entries(params)){ - obj[key] = value - } + this.handle_params(params) return this } diff --git a/dist/test/test_assets/00-01-01-073-05W5-0.LAS b/dist/test/test_assets/00-01-01-073-05W5-0.LAS new file mode 100644 index 0000000..33632e6 --- /dev/null +++ b/dist/test/test_assets/00-01-01-073-05W5-0.LAS @@ -0,0 +1,1091 @@ +~VERSION INFORMATION + VERS. 2.0: CWLS LOG ASCII STANDARD -VERSION 2.0 + WRAP. NO: ONE LINE PER DEPTH STEP +~WELL INFORMATION BLOCK +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ------------------- ------------------------------- +# Generated from Intellog Unique Number CW_73_75/WELL/2722 +WELL. CHEVRON MGSU 1 MITSUE 01-01 : Well_name - WELL +LOC . 00/01-01-073-05W5/0 : Location - LOCATION +UWI . 00/01-01-073-05W5/0 : Uwi - UNIQUE WELL ID +ENTR. JAYE : Entered - ENTERED BY +SRVC. SCHLUMBERGER : Scn - SERVICE COMPANY +DATE. 23 DEC 86 : Date - LOG DATE +STRT.M 390 : top_depth - START DEPTH +STOP.M 650 : bot_depth - STOP DEPTH +STEP.M 0.25 : increment - STEP LENGTH + NULL. -999.2500:NULL Value +~CURVE INFORMATION BLOCK +#MNEM UNIT ERCB CURVE CODE CURVE DESCRIPTION +#----------- ------------------ ---------------------------------- +DEPT.M 00 001 00 00 : DEPTH - DEPTH +DPHI.V/V 00 890 00 00 : PHID - DENSITY POROSITY (SANDSTONE) +NPHI.V/V 00 330 00 00 : PHIN - NEUTRON POROSITY (SANDSTONE) +GR .API 00 310 00 00 : GR - GAMMA RAY +CALI.MM 00 280 01 00 : CAL - CALIPER +ILD .OHMM 00 120 00 00 : RESD - DEEP RESISTIVITY (DIL) +~PARAMETER INFORMATION +#MNEM.UNIT DATA DESCRIPTION OF MNEMONIC +#--------- ----------- ------------------------------ +GL .M 583.3 : gl - GROUND LEVEL ELEVATION +EREF.M 589 : kb - ELEVATION OF DEPTH REFERENCE +DATM.M 583.3 : datum - DATUM ELEVATION +TDD .M 733.4 : tdd - TOTAL DEPTH DRILLER +RUN . ONE : Run - RUN NUMBER +ENG . SIMMONS : Engineer - RECORDING ENGINEER +WIT . SANK : Witness - WITNESSED BY +BASE. S.L. : Branch - HOME BASE OF LOGGING UNIT +MUD . GEL CHEM : Mud_type - MUD TYPE +MATR. SANDSTONE : Logunit - NEUTRON MATRIX +TMAX.C 41 : BHT - MAXIMUM RECORDED TEMPERATURE +BHTD.M 733.8 : BHTDEP - MAXIMUM RECORDED TEMPERATURE +RMT .C 17 : MDTP - TEMPERATURE OF MUD +MUDD.KG/M 1100 : MWT - MUD DENSITY +NEUT. 1 : NEUTRON - NEUTRON TYPE +RESI. 0 : RESIST - RESISTIVITY TYPE +RM .OHMM 2.62 : RM - RESISTIVITY OF MUD +RMC .OHMM 0 : RMC - RESISTIVITY OF MUD CAKE +RMF .OHMM 1.02 : RMF - RESISTIVITY OF MUD FILTRATE +SUFT.C 0 : SUFT - SURFACE TEMPERATURE +~A DEPTH PHID PHIN GR CAL RESD + 390.000 0.199 0.457 82.478 238.379 2.923 + 390.250 0.208 0.456 86.413 238.331 2.925 + 390.500 0.246 0.452 90.229 238.069 2.917 + 390.750 0.266 0.475 90.944 238.752 2.898 + 391.000 0.287 0.484 88.866 239.724 2.890 + 391.250 0.288 0.474 82.638 241.951 2.844 + 391.500 0.241 0.461 83.345 244.478 2.748 + 391.750 0.215 0.471 88.403 247.116 2.725 + 392.000 0.190 0.448 91.038 250.475 2.748 + 392.250 0.219 0.478 89.579 254.764 2.845 + 392.500 0.269 0.552 84.092 258.019 2.939 + 392.750 0.316 0.458 78.479 260.143 3.088 + 393.000 0.299 0.429 72.249 256.370 3.338 + 393.250 0.241 0.385 69.179 253.120 3.580 + 393.500 0.216 0.329 67.349 252.442 3.870 + 393.750 0.293 0.355 58.390 253.526 4.097 + 394.000 0.374 0.481 54.888 256.377 3.848 + 394.250 0.454 0.536 61.614 261.799 3.267 + 394.500 0.508 0.565 68.592 272.700 2.853 + 394.750 0.553 0.578 60.065 300.036 2.630 + 395.000 0.535 0.573 53.025 267.431 2.502 + 395.250 0.507 0.538 64.902 355.538 2.431 + 395.500 0.422 0.458 81.805 384.114 2.429 + 395.750 0.344 0.444 85.120 387.164 2.490 + 396.000 0.332 0.440 76.965 256.995 2.687 + 396.250 0.278 0.440 71.476 238.548 2.807 + 396.500 0.230 0.435 69.652 275.286 2.972 + 396.750 0.208 0.418 68.996 260.768 3.129 + 397.000 0.235 0.424 69.709 247.176 3.276 + 397.250 0.234 0.477 70.504 244.445 3.310 + 397.500 0.227 0.464 70.950 245.215 3.395 + 397.750 0.237 0.419 68.689 247.332 3.548 + 398.000 0.247 0.430 65.494 249.248 3.763 + 398.250 0.250 0.441 61.810 248.998 4.113 + 398.500 0.253 0.439 62.210 249.046 4.436 + 398.750 0.264 0.426 65.527 250.229 4.706 + 399.000 0.282 0.404 70.460 252.661 4.702 + 399.250 0.304 0.467 72.472 256.950 4.558 + 399.500 0.332 0.487 72.876 265.992 4.179 + 399.750 0.501 0.510 69.745 275.241 3.903 + 400.000 0.507 0.480 64.755 269.713 3.693 + 400.250 0.289 0.442 64.783 249.406 3.554 + 400.500 0.252 0.428 65.746 235.404 3.531 + 400.750 0.248 0.408 67.389 235.040 3.581 + 401.000 0.252 0.435 68.414 234.264 3.707 + 401.250 0.252 0.452 69.559 234.433 3.787 + 401.500 0.260 0.436 68.475 233.854 3.950 + 401.750 0.270 0.426 64.971 233.806 4.334 + 402.000 0.255 0.411 61.780 237.163 4.964 + 402.250 0.209 0.368 58.398 238.969 5.590 + 402.500 0.191 0.304 51.237 239.233 5.997 + 402.750 0.103 0.257 45.191 240.113 6.092 + 403.000 0.078 0.340 45.474 241.102 6.132 + 403.250 0.095 0.380 51.519 242.288 6.069 + 403.500 0.186 0.421 57.687 245.137 5.711 + 403.750 0.223 0.401 63.922 246.315 5.062 + 404.000 0.244 0.402 62.958 248.127 4.503 + 404.250 0.268 0.408 56.916 249.829 4.238 + 404.500 0.281 0.404 54.898 250.297 4.140 + 404.750 0.284 0.394 53.010 250.047 4.206 + 405.000 0.283 0.391 51.303 250.192 4.306 + 405.250 0.286 0.380 52.635 250.757 4.253 + 405.500 0.309 0.466 59.803 255.049 4.171 + 405.750 0.364 0.519 64.915 264.307 4.044 + 406.000 0.548 0.486 73.006 287.399 3.936 + 406.250 0.498 0.432 59.894 294.169 3.881 + 406.500 0.413 0.386 53.101 259.908 3.834 + 406.750 0.329 0.381 47.489 239.288 3.845 + 407.000 0.287 0.390 44.979 238.415 3.906 + 407.250 0.283 0.408 49.847 239.188 3.895 + 407.500 0.279 0.430 58.563 240.284 3.885 + 407.750 0.284 0.432 51.026 240.947 3.902 + 408.000 0.302 0.414 44.359 241.827 3.965 + 408.250 0.320 0.392 44.021 242.502 4.167 + 408.500 0.323 0.369 46.097 243.167 4.503 + 408.750 0.293 0.366 53.200 243.965 4.996 + 409.000 0.254 0.369 59.119 244.312 5.380 + 409.250 0.219 0.370 69.196 244.565 5.600 + 409.500 0.215 0.401 73.198 244.823 5.585 + 409.750 0.233 0.408 73.786 244.979 5.275 + 410.000 0.250 0.397 72.827 244.514 4.973 + 410.250 0.279 0.403 68.639 244.468 4.662 + 410.500 0.279 0.393 56.950 244.421 4.226 + 410.750 0.275 0.361 46.131 244.574 3.924 + 411.000 0.292 0.338 38.227 244.623 3.645 + 411.250 0.314 0.361 33.108 244.467 3.501 + 411.500 0.324 0.375 38.535 244.213 3.524 + 411.750 0.315 0.361 47.499 245.514 3.731 + 412.000 0.281 0.336 56.952 246.793 3.965 + 412.250 0.247 0.343 74.906 251.293 4.090 + 412.500 0.316 0.383 81.757 257.854 4.101 + 412.750 0.354 0.509 87.990 270.101 3.991 + 413.000 0.349 0.500 96.765 286.791 3.728 + 413.250 0.325 0.528 90.659 323.020 3.423 + 413.500 0.337 0.521 88.705 323.895 3.357 + 413.750 0.339 0.413 86.381 306.173 3.759 + 414.000 0.324 0.391 78.131 272.324 4.155 + 414.250 0.264 0.403 78.131 256.668 4.786 + 414.500 0.223 0.374 76.861 253.831 5.299 + 414.750 0.223 0.352 65.360 254.084 5.825 + 415.000 0.246 0.331 53.732 254.554 6.178 + 415.250 0.260 0.314 37.332 254.196 6.196 + 415.500 0.230 0.306 59.934 252.697 5.864 + 415.750 0.205 0.340 69.144 250.369 5.579 + 416.000 0.190 0.354 67.499 246.704 4.991 + 416.250 0.263 0.358 51.655 244.580 4.375 + 416.500 0.308 0.345 37.920 243.391 3.987 + 416.750 0.307 0.350 32.929 242.832 3.731 + 417.000 0.285 0.359 40.160 242.881 3.511 + 417.250 0.266 0.358 49.489 243.347 3.587 + 417.500 0.251 0.361 61.672 243.820 3.841 + 417.750 0.220 0.383 70.198 244.377 4.136 + 418.000 0.208 0.421 82.883 246.089 4.429 + 418.250 0.213 0.435 77.207 247.682 4.653 + 418.500 0.208 0.410 70.293 251.055 4.844 + 418.750 0.200 0.385 66.975 253.059 5.006 + 419.000 0.201 0.365 69.053 255.086 5.106 + 419.250 0.214 0.391 74.793 256.679 4.804 + 419.500 0.268 0.439 81.579 260.035 4.330 + 419.750 0.406 0.514 86.821 271.561 3.514 + 420.000 0.517 0.564 80.526 303.443 2.906 + 420.250 0.570 0.601 74.295 320.241 2.699 + 420.500 0.612 0.648 64.963 297.967 2.858 + 420.750 0.645 0.672 55.816 275.906 3.183 + 421.000 0.389 0.512 59.940 250.737 3.484 + 421.250 0.322 0.436 64.005 247.481 4.237 + 421.500 0.297 0.421 64.903 246.819 4.675 + 421.750 0.289 0.416 67.665 247.897 4.174 + 422.000 0.296 0.436 70.483 248.572 3.921 + 422.250 0.303 0.451 69.460 249.033 4.082 + 422.500 0.309 0.443 69.369 249.292 4.265 + 422.750 0.313 0.435 69.588 249.663 4.416 + 423.000 0.313 0.444 70.859 249.710 4.454 + 423.250 0.312 0.449 69.526 249.872 4.407 + 423.500 0.306 0.421 67.323 250.442 4.314 + 423.750 0.294 0.435 66.242 250.285 4.206 + 424.000 0.288 0.451 66.144 250.645 4.071 + 424.250 0.269 0.454 66.113 252.142 3.991 + 424.500 0.242 0.445 70.300 252.709 3.798 + 424.750 0.221 0.426 73.989 254.731 3.662 + 425.000 0.267 0.451 74.826 259.950 3.511 + 425.250 0.292 0.487 74.362 263.923 3.475 + 425.500 0.308 0.477 72.285 257.877 3.485 + 425.750 0.323 0.449 63.882 252.873 3.601 + 426.000 0.341 0.428 56.969 250.333 3.841 + 426.250 0.348 0.398 55.950 248.009 4.246 + 426.500 0.343 0.431 55.295 246.725 4.512 + 426.750 0.340 0.452 54.147 246.163 4.619 + 427.000 0.337 0.417 54.552 246.123 4.675 + 427.250 0.334 0.405 55.701 246.161 4.670 + 427.500 0.335 0.399 56.475 246.209 4.649 + 427.750 0.344 0.393 58.368 246.151 4.627 + 428.000 0.351 0.404 58.833 246.109 4.623 + 428.250 0.345 0.418 58.868 246.364 4.601 + 428.500 0.341 0.433 59.949 246.619 4.597 + 428.750 0.344 0.452 58.801 246.779 4.576 + 429.000 0.352 0.461 58.274 247.038 4.554 + 429.250 0.359 0.434 58.805 247.292 4.541 + 429.500 0.359 0.421 59.578 247.452 4.546 + 429.750 0.347 0.429 60.726 248.135 4.558 + 430.000 0.344 0.450 60.631 248.481 4.563 + 430.250 0.342 0.453 60.105 249.058 4.567 + 430.500 0.334 0.419 58.279 249.411 4.580 + 430.750 0.329 0.437 53.906 249.379 4.601 + 431.000 0.335 0.415 49.970 249.217 4.648 + 431.250 0.339 0.381 50.808 249.155 4.715 + 431.500 0.340 0.400 54.808 249.221 4.755 + 431.750 0.330 0.419 57.193 249.368 4.785 + 432.000 0.336 0.407 59.767 249.849 4.817 + 432.250 0.339 0.417 62.032 250.200 4.848 + 432.500 0.334 0.426 61.815 250.664 4.891 + 432.750 0.331 0.428 58.624 250.927 4.905 + 433.000 0.336 0.421 57.663 250.768 4.908 + 433.250 0.350 0.412 58.375 250.815 4.913 + 433.500 0.349 0.407 60.763 250.243 4.881 + 433.750 0.332 0.401 63.087 250.713 4.849 + 434.000 0.318 0.402 65.102 250.762 4.808 + 434.250 0.281 0.416 69.601 260.426 4.584 + 434.500 0.436 0.498 73.292 276.189 4.139 + 434.750 0.476 0.546 75.055 305.489 3.655 + 435.000 0.476 0.575 74.779 325.491 3.138 + 435.250 0.432 0.463 74.561 283.581 3.118 + 435.500 0.330 0.435 75.708 266.682 3.407 + 435.750 0.297 0.453 77.722 262.912 3.745 + 436.000 0.281 0.456 80.049 258.322 4.116 + 436.250 0.264 0.455 76.175 253.715 4.741 + 436.500 0.243 0.448 67.153 249.330 5.019 + 436.750 0.264 0.430 60.052 248.136 5.024 + 437.000 0.310 0.406 52.393 248.090 5.086 + 437.250 0.328 0.384 45.416 248.136 5.129 + 437.500 0.328 0.397 43.775 248.600 5.144 + 437.750 0.319 0.402 43.805 249.687 5.177 + 438.000 0.302 0.419 44.217 250.465 5.231 + 438.250 0.316 0.416 45.667 250.723 5.305 + 438.500 0.321 0.425 47.372 251.189 5.330 + 438.750 0.322 0.418 48.770 251.553 5.304 + 439.000 0.319 0.405 49.914 251.910 5.279 + 439.250 0.310 0.395 51.807 252.586 5.197 + 439.500 0.294 0.427 55.561 253.462 5.048 + 439.750 0.270 0.458 60.552 254.244 4.867 + 440.000 0.260 0.463 63.123 254.703 4.755 + 440.250 0.314 0.407 54.538 254.443 4.723 + 440.500 0.331 0.360 48.800 253.163 4.799 + 440.750 0.337 0.381 44.122 251.873 4.894 + 441.000 0.344 0.434 42.289 250.894 5.038 + 441.250 0.352 0.438 49.390 250.326 5.148 + 441.500 0.364 0.417 50.107 250.156 5.172 + 441.750 0.351 0.415 48.092 250.117 5.217 + 442.000 0.349 0.400 46.638 250.054 5.250 + 442.250 0.347 0.369 45.550 250.012 5.275 + 442.500 0.334 0.391 41.860 249.863 5.280 + 442.750 0.326 0.412 42.947 249.503 5.266 + 443.000 0.331 0.428 45.082 248.826 5.270 + 443.250 0.349 0.427 48.958 248.361 5.295 + 443.500 0.358 0.411 49.672 248.110 5.319 + 443.750 0.354 0.397 43.878 248.155 5.354 + 444.000 0.344 0.409 43.781 248.319 5.340 + 444.250 0.334 0.398 46.917 248.356 5.335 + 444.500 0.321 0.391 47.942 248.217 5.350 + 444.750 0.311 0.412 44.433 248.160 5.365 + 445.000 0.318 0.412 44.157 248.102 5.379 + 445.250 0.330 0.393 47.286 247.652 5.364 + 445.500 0.339 0.404 50.852 247.379 5.319 + 445.750 0.346 0.399 46.920 247.127 5.294 + 446.000 0.339 0.401 45.340 247.271 5.309 + 446.250 0.315 0.435 47.167 247.435 5.445 + 446.500 0.282 0.368 50.791 247.906 5.754 + 446.750 0.237 0.317 45.802 247.949 6.184 + 447.000 0.095 0.152 43.232 247.902 6.759 + 447.250 0.039 0.179 42.949 247.645 7.387 + 447.500 0.075 0.268 44.849 247.278 8.212 + 447.750 0.183 0.358 46.173 247.225 8.792 + 448.000 0.274 0.389 48.809 247.383 8.573 + 448.250 0.309 0.380 49.460 247.856 7.627 + 448.500 0.341 0.396 45.832 248.005 6.835 + 448.750 0.356 0.392 42.269 248.474 5.879 + 449.000 0.350 0.389 45.215 248.828 5.289 + 449.250 0.342 0.402 48.099 249.506 5.052 + 449.500 0.338 0.414 46.578 249.462 4.936 + 449.750 0.335 0.393 45.248 249.202 4.922 + 450.000 0.331 0.384 44.846 248.838 4.917 + 450.250 0.335 0.403 45.685 248.579 4.894 + 450.500 0.344 0.410 46.086 247.929 4.872 + 450.750 0.333 0.406 46.303 247.763 4.877 + 451.000 0.324 0.404 46.644 247.500 4.881 + 451.250 0.335 0.408 48.352 247.339 4.923 + 451.500 0.358 0.412 47.699 247.095 4.944 + 451.750 0.353 0.413 47.609 246.928 4.923 + 452.000 0.333 0.407 48.760 246.870 4.908 + 452.250 0.334 0.407 50.024 247.231 4.867 + 452.500 0.333 0.433 51.852 247.593 4.873 + 452.750 0.332 0.453 54.242 247.749 4.867 + 453.000 0.341 0.440 58.736 247.807 4.863 + 453.250 0.348 0.429 54.241 247.453 4.849 + 453.500 0.349 0.437 51.606 247.185 4.845 + 453.750 0.341 0.448 49.224 246.941 4.830 + 454.000 0.329 0.431 47.391 246.683 4.817 + 454.250 0.325 0.401 45.065 246.626 4.803 + 454.500 0.324 0.378 46.835 246.889 4.808 + 454.750 0.327 0.411 49.406 247.465 4.830 + 455.000 0.338 0.421 50.865 248.244 4.854 + 455.250 0.349 0.424 51.085 248.601 4.831 + 455.500 0.353 0.432 51.553 248.963 4.836 + 455.750 0.351 0.443 52.383 249.317 4.858 + 456.000 0.339 0.435 53.221 249.780 4.872 + 456.250 0.333 0.415 51.706 250.031 4.978 + 456.500 0.332 0.400 50.682 250.805 5.076 + 456.750 0.342 0.413 49.658 259.441 5.186 + 457.000 0.599 0.552 55.952 276.438 5.250 + 457.250 0.574 0.622 62.062 296.953 5.207 + 457.500 0.533 0.617 68.664 285.843 5.001 + 457.750 0.259 0.516 75.208 273.187 4.688 + 458.000 0.215 0.434 79.208 262.177 4.563 + 458.250 0.224 0.417 81.600 257.794 4.499 + 458.500 0.246 0.416 82.555 258.985 4.420 + 458.750 0.260 0.448 83.643 258.616 4.375 + 459.000 0.265 0.458 81.132 256.500 4.346 + 459.250 0.253 0.456 74.463 253.963 4.358 + 459.500 0.257 0.446 68.481 250.920 4.379 + 459.750 0.276 0.428 61.755 247.555 4.366 + 460.000 0.302 0.415 56.699 247.095 4.370 + 460.250 0.317 0.398 55.987 248.177 4.391 + 460.500 0.313 0.408 56.453 247.505 4.420 + 460.750 0.306 0.395 56.729 246.644 4.350 + 461.000 0.301 0.397 54.343 246.587 4.313 + 461.250 0.300 0.406 54.808 246.639 4.230 + 461.500 0.302 0.400 56.143 247.096 4.210 + 461.750 0.303 0.387 55.987 247.785 4.206 + 462.000 0.305 0.408 55.715 248.352 4.163 + 462.250 0.306 0.430 56.489 248.815 4.082 + 462.500 0.306 0.438 57.514 249.059 3.980 + 462.750 0.306 0.416 58.905 249.347 3.902 + 463.000 0.307 0.408 63.711 249.284 3.841 + 463.250 0.309 0.421 65.605 249.222 3.816 + 463.500 0.312 0.426 64.147 248.756 3.820 + 463.750 0.316 0.428 61.759 248.290 3.816 + 464.000 0.321 0.435 58.195 247.937 3.841 + 464.250 0.322 0.422 55.498 247.470 3.896 + 464.500 0.321 0.407 57.262 247.309 3.973 + 464.750 0.320 0.416 59.526 247.154 4.044 + 465.000 0.319 0.425 59.742 246.899 4.124 + 465.250 0.316 0.429 57.294 246.858 4.183 + 465.500 0.309 0.445 56.457 246.803 4.211 + 465.750 0.300 0.428 55.933 246.949 4.254 + 466.000 0.268 0.278 52.736 247.210 4.289 + 466.250 0.182 0.210 46.752 247.579 4.367 + 466.500 0.081 0.196 41.762 247.942 4.478 + 466.750 0.038 0.204 38.693 248.088 4.679 + 467.000 0.060 0.237 43.807 248.360 4.935 + 467.250 0.118 0.307 50.477 248.399 5.579 + 467.500 0.222 0.387 54.910 248.459 6.132 + 467.750 0.268 0.400 54.011 248.722 6.579 + 468.000 0.298 0.403 53.736 249.076 6.784 + 468.250 0.288 0.408 54.444 249.332 6.230 + 468.500 0.302 0.415 55.289 249.921 5.819 + 468.750 0.326 0.427 55.441 250.383 5.435 + 469.000 0.327 0.410 55.779 250.833 5.028 + 469.250 0.314 0.394 56.368 251.200 4.592 + 469.500 0.296 0.420 56.956 251.252 4.139 + 469.750 0.245 0.414 56.496 251.299 4.006 + 470.000 0.141 0.365 54.358 251.359 4.225 + 470.250 0.061 0.210 47.563 251.312 4.867 + 470.500 0.022 0.214 45.054 251.257 5.379 + 470.750 0.001 0.197 46.261 251.504 6.024 + 471.000 0.008 0.180 47.285 251.465 7.004 + 471.250 0.040 0.201 47.565 251.300 8.158 + 471.500 0.187 0.289 50.079 251.464 9.290 + 471.750 0.253 0.356 52.775 252.752 11.361 + 472.000 0.282 0.397 56.156 254.873 14.668 + 472.250 0.306 0.419 49.118 256.262 12.131 + 472.500 0.309 0.435 44.934 258.395 9.717 + 472.750 0.299 0.424 46.513 259.373 7.237 + 473.000 0.299 0.426 57.333 260.154 6.041 + 473.250 0.302 0.424 63.442 260.826 5.090 + 473.500 0.308 0.409 62.358 261.178 4.428 + 473.750 0.310 0.417 62.201 261.329 4.066 + 474.000 0.313 0.420 63.412 261.381 3.812 + 474.250 0.305 0.395 63.940 262.056 3.696 + 474.500 0.284 0.418 65.148 262.325 3.686 + 474.750 0.262 0.435 67.536 262.373 3.731 + 475.000 0.235 0.406 69.430 262.428 3.805 + 475.250 0.218 0.400 65.180 262.058 3.902 + 475.500 0.222 0.420 62.734 261.706 4.009 + 475.750 0.235 0.450 66.425 261.563 4.222 + 476.000 0.250 0.424 70.794 261.492 4.321 + 476.250 0.259 0.414 72.066 261.443 4.366 + 476.500 0.256 0.437 74.141 261.503 4.403 + 476.750 0.254 0.467 74.111 261.542 4.448 + 477.000 0.256 0.433 68.003 261.698 4.486 + 477.250 0.256 0.414 65.058 263.004 4.524 + 477.500 0.259 0.401 68.997 263.978 4.528 + 477.750 0.269 0.396 65.742 264.851 4.533 + 478.000 0.250 0.408 62.423 266.047 4.563 + 478.250 0.244 0.421 63.513 266.715 4.567 + 478.500 0.251 0.416 66.269 267.189 4.605 + 478.750 0.202 0.417 73.557 267.544 4.610 + 479.000 0.182 0.425 73.959 268.734 4.640 + 479.250 0.181 0.437 69.220 270.131 4.679 + 479.500 0.228 0.449 65.962 271.313 4.727 + 479.750 0.258 0.431 66.612 272.194 4.688 + 480.000 0.280 0.415 70.178 269.661 4.597 + 480.250 0.245 0.398 72.691 265.579 4.449 + 480.500 0.202 0.403 72.288 261.708 4.354 + 480.750 0.215 0.424 68.535 257.530 4.383 + 481.000 0.245 0.417 63.669 253.849 4.436 + 481.250 0.266 0.399 59.110 249.975 4.550 + 481.500 0.274 0.394 57.840 250.031 4.545 + 481.750 0.286 0.406 56.506 250.389 4.358 + 482.000 0.307 0.395 54.925 250.657 4.109 + 482.250 0.312 0.404 55.266 250.910 3.961 + 482.500 0.303 0.423 56.788 251.063 3.891 + 482.750 0.295 0.468 63.018 251.119 3.837 + 483.000 0.298 0.509 61.314 250.856 3.841 + 483.250 0.303 0.468 56.445 250.598 3.925 + 483.500 0.309 0.449 56.913 250.030 4.002 + 483.750 0.307 0.442 58.494 249.368 4.113 + 484.000 0.306 0.432 57.594 249.207 4.178 + 484.250 0.303 0.431 56.758 249.153 4.253 + 484.500 0.291 0.444 57.721 249.417 4.314 + 484.750 0.278 0.481 60.107 249.878 4.309 + 485.000 0.268 0.479 63.610 250.040 4.233 + 485.250 0.275 0.459 69.968 250.096 4.174 + 485.500 0.289 0.447 64.231 250.037 4.109 + 485.750 0.298 0.428 57.812 250.194 4.036 + 486.000 0.307 0.416 53.319 250.462 3.920 + 486.250 0.316 0.444 53.288 250.720 3.815 + 486.500 0.325 0.444 56.853 251.072 3.713 + 486.750 0.323 0.427 60.361 252.671 3.634 + 487.000 0.318 0.422 60.015 254.084 3.544 + 487.250 0.310 0.451 58.437 254.548 3.514 + 487.500 0.303 0.457 59.335 254.915 3.452 + 487.750 0.291 0.457 61.227 255.055 3.379 + 488.000 0.314 0.447 57.662 255.116 3.332 + 488.250 0.319 0.426 58.687 255.158 3.268 + 488.500 0.316 0.447 63.058 255.211 3.222 + 488.750 0.306 0.456 68.172 254.641 3.206 + 489.000 0.294 0.436 65.601 254.175 3.167 + 489.250 0.286 0.416 59.182 253.620 3.182 + 489.500 0.302 0.400 56.982 253.355 3.191 + 489.750 0.307 0.436 56.334 253.715 3.212 + 490.000 0.305 0.464 55.932 257.279 3.227 + 490.250 0.300 0.443 56.579 260.132 3.285 + 490.500 0.288 0.430 61.077 261.940 3.363 + 490.750 0.265 0.447 71.523 263.028 3.507 + 491.000 0.192 0.374 64.114 263.592 3.798 + 491.250 0.141 0.257 61.788 263.641 4.143 + 491.500 0.091 0.246 64.237 262.867 4.537 + 491.750 0.142 0.306 67.249 264.784 4.803 + 492.000 0.206 0.378 65.788 267.732 5.211 + 492.250 0.255 0.431 58.752 269.842 5.506 + 492.500 0.276 0.434 60.085 271.857 5.615 + 492.750 0.262 0.434 69.745 273.054 5.215 + 493.000 0.240 0.433 65.854 274.245 4.444 + 493.250 0.234 0.437 65.086 275.329 4.043 + 493.500 0.257 0.443 65.793 276.105 3.920 + 493.750 0.260 0.448 67.747 276.462 3.830 + 494.000 0.254 0.442 69.698 276.616 3.776 + 494.250 0.250 0.429 70.417 276.564 3.766 + 494.500 0.252 0.413 70.442 276.409 3.805 + 494.750 0.251 0.396 69.797 276.372 3.851 + 495.000 0.250 0.404 68.335 276.318 3.898 + 495.250 0.251 0.430 65.514 276.166 3.961 + 495.500 0.248 0.450 64.614 276.222 3.987 + 495.750 0.252 0.457 68.245 276.269 4.021 + 496.000 0.244 0.461 70.444 276.721 4.047 + 496.250 0.255 0.463 70.165 277.198 4.081 + 496.500 0.251 0.455 68.524 277.445 4.132 + 496.750 0.241 0.425 66.325 277.916 4.182 + 497.000 0.229 0.402 64.494 278.482 4.233 + 497.250 0.220 0.411 63.035 278.840 4.285 + 497.500 0.209 0.432 64.494 279.418 4.354 + 497.750 0.200 0.404 67.134 279.669 4.473 + 498.000 0.205 0.397 70.697 279.835 4.683 + 498.250 0.224 0.414 71.966 279.789 4.996 + 498.500 0.232 0.428 70.698 279.724 4.736 + 498.750 0.239 0.441 65.951 279.877 4.383 + 499.000 0.243 0.410 68.217 280.658 4.281 + 499.250 0.229 0.410 68.746 280.498 4.214 + 499.500 0.215 0.428 69.150 279.934 4.186 + 499.750 0.207 0.444 70.918 279.887 4.159 + 500.000 0.204 0.455 72.186 279.829 4.155 + 500.250 0.197 0.447 72.157 279.987 4.166 + 500.500 0.191 0.433 72.186 279.834 4.178 + 500.750 0.191 0.431 72.589 279.471 4.206 + 501.000 0.218 0.441 72.558 277.777 4.186 + 501.250 0.215 0.453 71.785 276.478 4.159 + 501.500 0.205 0.460 71.013 276.111 4.132 + 501.750 0.218 0.459 70.234 275.237 4.082 + 502.000 0.255 0.449 69.091 274.464 4.002 + 502.250 0.272 0.443 67.077 274.203 3.852 + 502.500 0.283 0.438 64.815 274.461 3.748 + 502.750 0.296 0.423 63.041 275.130 3.682 + 503.000 0.308 0.415 60.597 275.492 3.624 + 503.250 0.315 0.405 59.390 275.657 3.580 + 503.500 0.308 0.394 58.861 276.432 3.524 + 503.750 0.291 0.376 58.395 277.000 3.501 + 504.000 0.274 0.380 58.487 277.257 3.517 + 504.250 0.260 0.393 59.208 276.594 3.567 + 504.500 0.267 0.400 60.593 275.499 3.728 + 504.750 0.263 0.408 63.540 272.863 3.895 + 505.000 0.248 0.410 65.934 270.023 4.100 + 505.250 0.244 0.417 66.088 268.729 4.245 + 505.500 0.236 0.421 66.920 267.649 4.265 + 505.750 0.223 0.401 69.311 266.769 4.253 + 506.000 0.207 0.387 71.389 266.618 4.234 + 506.250 0.196 0.391 72.534 266.572 4.229 + 506.500 0.214 0.416 73.311 266.199 4.233 + 506.750 0.220 0.434 73.535 264.611 4.190 + 507.000 0.212 0.434 73.374 263.313 4.139 + 507.250 0.202 0.429 71.667 262.227 4.104 + 507.500 0.218 0.440 68.600 261.445 4.024 + 507.750 0.242 0.428 64.040 260.879 3.917 + 508.000 0.293 0.410 58.182 260.726 3.819 + 508.250 0.328 0.402 56.600 261.203 3.682 + 508.500 0.334 0.414 54.277 262.282 3.543 + 508.750 0.330 0.402 53.439 264.193 3.385 + 509.000 0.329 0.413 54.772 265.168 3.168 + 509.250 0.331 0.428 56.603 266.470 3.077 + 509.500 0.333 0.443 55.887 267.447 2.983 + 509.750 0.335 0.418 53.439 268.532 2.898 + 510.000 0.340 0.400 51.860 268.996 2.831 + 510.250 0.341 0.402 52.758 269.047 2.766 + 510.500 0.335 0.428 54.089 268.595 2.742 + 510.750 0.329 0.440 56.108 268.017 2.745 + 511.000 0.323 0.452 57.382 268.179 2.773 + 511.250 0.322 0.461 58.157 268.848 2.849 + 511.500 0.325 0.458 58.556 270.037 2.983 + 511.750 0.327 0.442 58.967 271.434 3.118 + 512.000 0.325 0.425 59.176 273.351 3.209 + 512.250 0.316 0.404 59.208 274.745 3.366 + 512.500 0.306 0.418 58.744 276.028 3.484 + 512.750 0.300 0.403 57.476 277.543 3.614 + 513.000 0.301 0.399 56.200 278.412 3.755 + 513.250 0.306 0.410 55.987 279.598 3.909 + 513.500 0.311 0.418 57.566 280.581 4.047 + 513.750 0.313 0.424 56.295 280.941 4.135 + 514.000 0.315 0.423 51.179 281.621 4.147 + 514.250 0.318 0.402 52.141 281.771 4.144 + 514.500 0.317 0.403 54.097 281.615 4.116 + 514.750 0.316 0.417 55.429 281.675 4.112 + 515.000 0.316 0.426 55.834 281.523 4.062 + 515.250 0.317 0.438 56.180 281.468 4.013 + 515.500 0.317 0.426 56.700 281.013 3.920 + 515.750 0.319 0.410 57.849 280.655 3.808 + 516.000 0.320 0.420 58.129 280.685 3.638 + 516.250 0.323 0.430 57.913 280.535 3.501 + 516.500 0.325 0.434 55.089 280.694 3.413 + 516.750 0.326 0.421 49.849 280.538 3.378 + 517.000 0.324 0.408 51.746 280.587 3.394 + 517.250 0.321 0.435 53.015 280.441 3.494 + 517.500 0.320 0.446 49.884 280.798 3.638 + 517.750 0.321 0.433 48.052 281.259 3.752 + 518.000 0.324 0.448 51.060 281.628 3.672 + 518.250 0.326 0.452 53.822 281.681 3.662 + 518.500 0.327 0.447 55.404 281.834 3.631 + 518.750 0.326 0.439 55.374 281.881 3.621 + 519.000 0.329 0.427 54.041 282.241 3.610 + 519.250 0.330 0.415 52.086 282.815 3.614 + 519.500 0.328 0.421 48.955 283.799 3.631 + 519.750 0.333 0.450 49.173 284.471 3.675 + 520.000 0.336 0.448 51.558 284.832 3.727 + 520.250 0.337 0.431 51.280 284.366 3.780 + 520.500 0.335 0.413 50.632 283.285 3.833 + 520.750 0.331 0.400 51.097 282.301 3.895 + 521.000 0.326 0.403 54.292 281.217 3.935 + 521.250 0.324 0.435 60.087 280.340 3.969 + 521.500 0.323 0.420 59.002 280.086 3.979 + 521.750 0.321 0.413 55.747 279.933 4.036 + 522.000 0.321 0.410 51.065 279.983 4.116 + 522.250 0.321 0.402 51.035 280.239 4.190 + 522.500 0.320 0.393 52.120 280.084 4.202 + 522.750 0.325 0.397 55.561 279.824 4.112 + 523.000 0.330 0.404 55.469 279.460 3.920 + 523.250 0.327 0.407 52.154 279.112 3.669 + 523.500 0.321 0.411 51.502 278.744 3.465 + 523.750 0.319 0.422 53.455 278.693 3.297 + 524.000 0.309 0.438 57.085 278.843 3.173 + 524.250 0.265 0.387 62.322 278.893 3.194 + 524.500 0.223 0.336 65.767 278.852 3.338 + 524.750 0.135 0.270 64.743 278.692 3.560 + 525.000 0.141 0.289 71.159 278.739 3.995 + 525.250 0.162 0.325 72.681 278.794 4.499 + 525.500 0.188 0.424 71.038 278.854 5.057 + 525.750 0.221 0.452 67.471 278.596 5.138 + 526.000 0.273 0.457 59.750 278.649 4.745 + 526.250 0.305 0.441 59.537 279.007 4.358 + 526.500 0.293 0.427 61.364 279.058 3.972 + 526.750 0.277 0.413 61.830 279.725 3.675 + 527.000 0.262 0.408 62.051 280.717 3.530 + 527.250 0.247 0.416 62.264 281.591 3.527 + 527.500 0.270 0.424 61.612 282.259 3.611 + 527.750 0.290 0.441 57.180 282.621 3.655 + 528.000 0.304 0.464 57.400 282.574 3.699 + 528.250 0.294 0.445 58.608 283.141 3.766 + 528.500 0.278 0.425 59.879 284.960 3.833 + 528.750 0.262 0.417 61.401 286.761 4.006 + 529.000 0.258 0.416 62.857 289.288 4.170 + 529.250 0.255 0.417 65.251 292.345 4.399 + 529.500 0.218 0.416 67.323 293.743 4.554 + 529.750 0.212 0.424 69.025 293.063 4.592 + 530.000 0.232 0.446 65.336 288.879 4.511 + 530.250 0.258 0.435 62.515 286.449 4.399 + 530.500 0.261 0.437 61.307 285.365 4.297 + 530.750 0.261 0.434 64.066 285.428 4.293 + 531.000 0.247 0.421 68.004 285.676 4.428 + 531.250 0.238 0.429 69.524 285.935 4.618 + 531.500 0.224 0.422 64.845 286.300 4.881 + 531.750 0.211 0.406 60.286 286.358 5.061 + 532.000 0.215 0.413 61.185 286.307 5.230 + 532.250 0.224 0.409 65.310 286.358 5.335 + 532.500 0.221 0.397 65.897 286.509 5.420 + 532.750 0.227 0.424 61.835 286.557 5.455 + 533.000 0.240 0.459 64.907 286.411 5.369 + 533.250 0.233 0.403 64.255 286.153 5.274 + 533.500 0.215 0.375 61.310 286.203 5.182 + 533.750 0.179 0.352 63.637 285.846 5.177 + 534.000 0.188 0.405 68.072 285.270 5.269 + 534.250 0.218 0.457 62.398 284.501 5.496 + 534.500 0.190 0.271 55.114 284.031 5.884 + 534.750 0.132 0.266 49.126 284.401 6.444 + 535.000 0.074 0.376 61.375 284.966 6.758 + 535.250 0.160 0.405 66.924 286.578 6.958 + 535.500 0.199 0.409 71.856 287.554 6.809 + 535.750 0.210 0.400 71.886 288.740 6.383 + 536.000 0.200 0.398 72.231 289.723 5.863 + 536.250 0.201 0.415 73.318 290.503 5.506 + 536.500 0.213 0.428 74.030 290.969 5.250 + 536.750 0.221 0.439 73.995 291.431 5.090 + 537.000 0.222 0.406 70.932 291.784 4.991 + 537.250 0.215 0.390 68.913 292.047 4.940 + 537.500 0.233 0.396 68.511 292.109 4.890 + 537.750 0.232 0.423 71.329 292.050 4.867 + 538.000 0.218 0.448 74.771 292.102 4.871 + 538.250 0.200 0.429 76.415 292.157 4.839 + 538.500 0.183 0.443 76.386 292.317 4.780 + 538.750 0.197 0.460 76.667 292.673 4.662 + 539.000 0.215 0.427 76.201 292.624 4.596 + 539.250 0.225 0.416 73.443 292.564 4.465 + 539.500 0.236 0.434 69.689 292.209 4.370 + 539.750 0.236 0.447 64.701 291.952 4.309 + 540.000 0.247 0.429 62.434 291.586 4.265 + 540.250 0.235 0.419 66.560 291.229 4.214 + 540.500 0.200 0.406 71.053 291.172 4.186 + 540.750 0.199 0.391 72.758 291.227 4.166 + 541.000 0.222 0.420 68.388 292.414 4.170 + 541.250 0.241 0.411 63.025 292.155 4.262 + 541.500 0.264 0.397 66.716 292.317 4.338 + 541.750 0.250 0.412 70.218 292.883 4.398 + 542.000 0.238 0.434 72.117 293.349 4.470 + 542.250 0.225 0.456 72.642 293.620 4.490 + 542.500 0.218 0.451 72.608 294.183 4.520 + 542.750 0.220 0.430 71.337 294.647 4.567 + 543.000 0.219 0.420 72.919 295.423 4.666 + 543.250 0.217 0.424 76.114 296.297 4.741 + 543.500 0.214 0.442 76.703 296.758 4.816 + 543.750 0.212 0.443 74.193 296.914 4.857 + 544.000 0.211 0.435 72.242 296.662 4.880 + 544.250 0.213 0.448 71.713 296.206 4.858 + 544.500 0.217 0.462 71.307 295.839 4.844 + 544.750 0.221 0.465 74.252 295.367 4.858 + 545.000 0.220 0.443 77.697 294.402 4.835 + 545.250 0.219 0.421 77.663 293.617 4.804 + 545.500 0.216 0.419 78.935 292.949 4.763 + 545.750 0.208 0.431 79.091 292.378 4.740 + 546.000 0.199 0.431 74.720 291.805 4.719 + 546.250 0.192 0.427 74.068 290.622 4.715 + 546.500 0.186 0.438 77.015 289.735 4.684 + 546.750 0.190 0.448 79.527 288.461 4.661 + 547.000 0.193 0.450 83.277 287.567 4.623 + 547.250 0.199 0.431 84.178 286.276 4.593 + 547.500 0.213 0.409 80.673 285.000 4.554 + 547.750 0.226 0.399 78.224 284.422 4.498 + 548.000 0.239 0.385 78.255 283.955 4.420 + 548.250 0.251 0.403 80.955 283.695 4.390 + 548.500 0.267 0.427 80.059 283.652 4.370 + 548.750 0.254 0.449 78.166 283.695 4.325 + 549.000 0.247 0.427 76.644 283.539 4.313 + 549.250 0.238 0.409 72.771 283.592 4.366 + 549.500 0.229 0.397 67.219 284.161 4.486 + 549.750 0.218 0.410 61.050 285.247 4.750 + 550.000 0.229 0.438 55.811 286.857 5.105 + 550.250 0.201 0.296 56.461 288.252 5.621 + 550.500 0.175 0.298 66.042 290.479 6.063 + 550.750 0.145 0.340 74.882 292.792 6.103 + 551.000 0.160 0.392 78.387 296.268 5.563 + 551.250 0.184 0.420 81.084 297.963 5.119 + 551.500 0.195 0.426 81.732 299.563 4.889 + 551.750 0.186 0.434 82.138 301.383 4.740 + 552.000 0.190 0.437 79.500 303.082 4.545 + 552.250 0.180 0.417 76.121 305.207 4.342 + 552.500 0.176 0.394 72.928 307.110 4.123 + 552.750 0.183 0.421 72.838 309.349 3.858 + 553.000 0.181 0.454 74.667 310.635 3.617 + 553.250 0.173 0.444 78.107 311.711 3.449 + 553.500 0.169 0.435 80.061 313.328 3.319 + 553.750 0.176 0.461 81.332 314.510 3.297 + 554.000 0.183 0.481 82.170 315.902 3.319 + 554.250 0.191 0.475 81.766 318.240 3.404 + 554.500 0.191 0.437 79.255 319.951 3.557 + 554.750 0.184 0.397 78.854 321.555 3.788 + 555.000 0.177 0.399 80.868 322.738 4.047 + 555.250 0.185 0.421 81.023 323.293 4.221 + 555.500 0.191 0.441 76.591 324.181 4.085 + 555.750 0.188 0.455 75.257 324.958 3.816 + 556.000 0.179 0.470 78.016 325.731 3.511 + 556.250 0.178 0.452 78.234 326.619 3.291 + 556.500 0.195 0.478 74.546 327.593 2.994 + 556.750 0.226 0.510 75.817 329.296 2.866 + 557.000 0.261 0.494 79.136 330.895 3.022 + 557.250 0.234 0.455 76.563 332.597 3.328 + 557.500 0.219 0.440 74.237 334.521 3.651 + 557.750 0.209 0.451 73.523 336.121 3.946 + 558.000 0.206 0.449 73.678 338.023 4.234 + 558.250 0.206 0.435 75.322 341.692 4.341 + 558.500 0.197 0.428 76.533 346.201 4.370 + 558.750 0.176 0.440 72.287 349.971 4.466 + 559.000 0.186 0.452 67.417 352.807 4.545 + 559.250 0.204 0.448 62.614 355.442 4.644 + 559.500 0.230 0.435 57.311 355.913 4.807 + 559.750 0.250 0.436 55.418 355.029 5.033 + 560.000 0.263 0.450 56.317 348.682 5.329 + 560.250 0.253 0.455 55.981 343.978 5.579 + 560.500 0.260 0.410 54.768 342.072 6.007 + 560.750 0.262 0.387 54.739 341.181 6.467 + 561.000 0.249 0.365 53.839 340.822 6.783 + 561.250 0.237 0.338 53.312 340.882 6.726 + 561.500 0.226 0.340 57.128 341.035 6.462 + 561.750 0.217 0.372 60.944 341.397 5.923 + 562.000 0.213 0.393 62.211 341.768 5.429 + 562.250 0.211 0.407 63.548 341.815 4.921 + 562.500 0.205 0.412 64.260 341.552 4.640 + 562.750 0.189 0.415 64.788 341.193 4.465 + 563.000 0.189 0.411 65.687 340.834 4.346 + 563.250 0.191 0.400 67.142 340.575 4.285 + 563.500 0.189 0.387 72.694 340.411 4.241 + 563.750 0.187 0.379 74.089 340.265 4.222 + 564.000 0.187 0.396 71.457 340.011 4.241 + 564.250 0.188 0.402 69.687 340.674 4.206 + 564.500 0.199 0.410 68.417 341.552 4.147 + 564.750 0.207 0.431 67.331 341.293 4.120 + 565.000 0.198 0.408 65.317 339.897 4.241 + 565.250 0.186 0.394 61.625 336.650 4.601 + 565.500 0.200 0.381 56.823 335.256 5.029 + 565.750 0.217 0.371 56.730 334.072 5.354 + 566.000 0.234 0.382 55.706 333.702 5.797 + 566.250 0.235 0.382 53.007 333.350 6.431 + 566.500 0.228 0.320 50.682 333.499 7.042 + 566.750 0.176 0.278 47.923 334.381 7.541 + 567.000 0.093 0.297 49.444 335.874 7.477 + 567.250 0.143 0.341 54.065 337.474 6.867 + 567.500 0.199 0.394 58.375 339.599 6.167 + 567.750 0.224 0.416 61.008 341.927 5.579 + 568.000 0.238 0.424 57.446 343.634 4.889 + 568.250 0.260 0.431 54.192 344.918 4.374 + 568.500 0.289 0.453 58.063 346.002 4.092 + 568.750 0.298 0.457 58.777 346.573 3.881 + 569.000 0.268 0.428 56.769 345.077 3.805 + 569.250 0.248 0.418 56.112 341.517 3.873 + 569.500 0.237 0.413 56.638 339.707 4.024 + 569.750 0.229 0.390 57.106 338.201 4.398 + 570.000 0.217 0.364 57.879 336.602 4.898 + 570.250 0.192 0.346 56.485 335.733 5.235 + 570.500 0.206 0.374 54.967 335.464 5.419 + 570.750 0.230 0.426 54.377 335.211 5.355 + 571.000 0.246 0.439 55.465 335.169 5.279 + 571.250 0.256 0.429 58.843 335.315 5.118 + 571.500 0.257 0.411 66.686 335.468 4.781 + 571.750 0.249 0.395 61.077 335.724 4.432 + 572.000 0.233 0.382 57.695 336.097 4.178 + 572.250 0.213 0.364 58.787 336.248 4.066 + 572.500 0.226 0.393 60.305 336.303 4.002 + 572.750 0.238 0.388 60.705 336.355 3.998 + 573.000 0.245 0.394 60.550 336.406 3.994 + 573.250 0.253 0.407 60.151 336.661 4.006 + 573.500 0.238 0.438 59.683 336.915 4.070 + 573.750 0.208 0.424 59.159 337.081 4.237 + 574.000 0.187 0.416 57.822 336.716 4.322 + 574.250 0.187 0.409 52.584 336.556 4.383 + 574.500 0.206 0.402 52.056 336.822 4.419 + 574.750 0.222 0.404 57.049 337.185 4.482 + 575.000 0.234 0.401 61.854 337.853 4.613 + 575.250 0.214 0.386 62.444 338.321 4.794 + 575.500 0.216 0.358 60.059 338.885 4.973 + 575.750 0.214 0.312 58.043 339.871 5.109 + 576.000 0.167 0.278 56.586 340.643 5.279 + 576.250 0.126 0.341 54.945 340.698 5.444 + 576.500 0.170 0.371 54.352 340.544 5.584 + 576.750 0.212 0.387 54.882 340.694 5.579 + 577.000 0.227 0.404 56.030 341.065 5.523 + 577.250 0.237 0.394 57.303 341.129 5.465 + 577.500 0.227 0.391 57.827 341.378 5.379 + 577.750 0.210 0.407 56.555 341.432 5.354 + 578.000 0.191 0.392 52.556 341.371 5.420 + 578.250 0.173 0.369 53.950 340.305 5.600 + 578.500 0.186 0.360 55.225 338.579 5.786 + 578.750 0.191 0.349 55.998 332.132 5.945 + 579.000 0.187 0.343 56.528 327.632 6.040 + 579.250 0.179 0.348 56.313 324.992 6.046 + 579.500 0.170 0.375 56.530 324.123 5.995 + 579.750 0.156 0.393 60.467 323.759 5.802 + 580.000 0.177 0.409 64.590 323.288 5.543 + 580.250 0.188 0.401 64.620 322.511 5.314 + 580.500 0.196 0.390 60.869 321.230 4.963 + 580.750 0.206 0.412 59.475 319.928 4.723 + 581.000 0.196 0.406 63.667 316.988 4.701 + 581.250 0.181 0.387 67.787 315.080 4.884 + 581.500 0.164 0.378 72.651 313.792 5.171 + 581.750 0.173 0.385 78.081 313.116 5.364 + 582.000 0.159 0.389 79.909 312.657 5.378 + 582.250 0.190 0.405 80.807 312.908 5.235 + 582.500 0.214 0.394 81.709 313.583 4.945 + 582.750 0.210 0.390 82.798 314.048 4.723 + 583.000 0.197 0.408 83.507 312.962 4.562 + 583.250 0.206 0.401 83.040 310.322 4.498 + 583.500 0.213 0.392 78.483 306.758 4.596 + 583.750 0.204 0.383 75.352 304.640 4.931 + 584.000 0.184 0.357 72.472 303.977 5.379 + 584.250 0.159 0.314 70.083 303.509 5.857 + 584.500 0.116 0.306 67.384 302.219 6.330 + 584.750 0.096 0.330 66.609 301.234 6.752 + 585.000 0.120 0.326 70.858 300.458 7.297 + 585.250 0.132 0.308 74.797 299.686 7.740 + 585.500 0.135 0.312 77.557 299.633 7.909 + 585.750 0.162 0.334 76.100 299.892 7.698 + 586.000 0.179 0.370 74.207 300.777 7.216 + 586.250 0.205 0.353 71.760 301.655 6.714 + 586.500 0.192 0.339 68.254 302.433 6.413 + 586.750 0.185 0.327 68.412 302.992 6.383 + 587.000 0.178 0.356 71.480 303.469 6.413 + 587.250 0.166 0.387 74.302 303.616 6.552 + 587.500 0.149 0.348 76.069 303.767 6.759 + 587.750 0.138 0.330 71.263 304.343 6.970 + 588.000 0.150 0.345 71.173 304.497 7.229 + 588.250 0.149 0.318 72.628 304.443 7.456 + 588.500 0.145 0.301 72.969 304.599 7.533 + 588.750 0.132 0.337 73.248 305.180 7.484 + 589.000 0.143 0.401 75.080 305.631 7.547 + 589.250 0.184 0.432 77.902 305.786 7.784 + 589.500 0.177 0.383 76.569 305.633 8.074 + 589.750 0.156 0.328 71.637 305.273 8.204 + 590.000 0.122 0.310 70.619 304.918 8.210 + 590.250 0.124 0.351 71.763 304.561 8.096 + 590.500 0.148 0.396 74.837 304.187 7.806 + 590.750 0.165 0.371 77.592 304.048 7.442 + 591.000 0.136 0.355 81.470 304.195 7.394 + 591.250 0.113 0.368 83.177 304.551 7.401 + 591.500 0.099 0.344 80.166 305.338 7.619 + 591.750 0.085 0.326 73.316 306.108 7.990 + 592.000 0.072 0.321 70.927 307.714 8.318 + 592.250 0.075 0.328 73.006 309.106 8.420 + 592.500 0.087 0.330 77.255 310.496 8.165 + 592.750 0.111 0.320 80.634 312.202 7.625 + 593.000 0.137 0.314 83.703 313.907 6.608 + 593.250 0.188 0.372 88.137 316.962 5.444 + 593.500 0.247 0.446 91.703 320.526 4.085 + 593.750 0.331 0.466 93.408 327.501 3.117 + 594.000 0.370 0.479 85.750 339.748 2.474 + 594.250 0.435 0.507 77.535 359.538 1.927 + 594.500 0.490 0.548 68.823 381.813 1.727 + 594.750 0.580 0.579 62.651 411.838 1.622 + 595.000 0.562 0.579 63.117 412.407 1.549 + 595.250 0.551 0.548 66.003 357.163 1.616 + 595.500 0.587 0.586 67.832 371.168 1.721 + 595.750 0.528 0.513 78.466 373.707 1.863 + 596.000 0.483 0.487 77.323 347.914 2.063 + 596.250 0.563 0.652 68.111 352.618 2.444 + 596.500 0.642 0.371 65.544 388.540 2.944 + 596.750 0.367 0.353 67.243 385.384 3.641 + 597.000 0.180 0.367 69.942 361.253 4.265 + 597.250 0.219 0.390 71.959 330.503 5.071 + 597.500 0.269 0.400 72.737 343.271 5.764 + 597.750 0.310 0.403 73.571 344.671 6.046 + 598.000 0.280 0.399 74.096 340.378 6.132 + 598.250 0.221 0.372 74.690 331.645 6.103 + 598.500 0.187 0.361 74.717 327.355 5.985 + 598.750 0.210 0.395 75.182 331.022 5.912 + 599.000 0.238 0.409 76.022 337.799 5.840 + 599.250 0.256 0.391 77.602 341.151 5.857 + 599.500 0.267 0.383 81.913 344.210 6.006 + 599.750 0.242 0.372 77.727 340.119 6.348 + 600.000 0.214 0.366 77.945 330.975 6.679 + 600.250 0.183 0.346 78.712 322.179 7.157 + 600.500 0.151 0.323 73.907 317.361 7.500 + 600.750 0.255 0.297 71.080 317.815 7.185 + 601.000 0.314 0.400 69.931 328.493 6.618 + 601.250 0.349 0.441 72.686 343.715 5.191 + 601.500 0.358 0.463 77.476 331.577 3.937 + 601.750 0.338 0.459 81.341 323.455 3.708 + 602.000 0.298 0.439 80.874 321.650 3.843 + 602.250 0.280 0.425 77.987 320.140 4.141 + 602.500 0.257 0.412 76.710 317.599 4.729 + 602.750 0.223 0.392 75.867 314.541 5.261 + 603.000 0.129 0.346 73.415 310.658 5.842 + 603.250 0.027 0.416 69.224 306.775 6.134 + 603.500 0.320 0.443 67.328 302.476 6.111 + 603.750 0.342 0.437 71.755 320.695 6.021 + 604.000 0.303 0.336 76.612 317.122 5.965 + 604.250 0.212 0.349 79.795 309.112 6.044 + 604.500 0.156 0.358 82.857 304.296 6.453 + 604.750 0.107 0.331 85.980 300.002 6.851 + 605.000 0.108 0.345 89.351 297.875 7.060 + 605.250 0.119 0.358 89.439 296.791 6.776 + 605.500 0.135 0.368 88.532 297.548 6.218 + 605.750 0.150 0.365 93.824 298.723 5.979 + 606.000 0.137 0.342 90.261 298.870 6.092 + 606.250 0.160 0.366 86.811 299.841 6.529 + 606.500 0.187 0.365 79.159 302.257 7.498 + 606.750 0.174 0.328 68.709 302.506 7.990 + 607.000 0.191 0.312 57.457 286.953 9.279 + 607.250 0.212 0.312 50.667 273.467 10.898 + 607.500 0.204 0.308 46.169 266.490 11.922 + 607.750 0.199 0.302 41.485 263.849 11.464 + 608.000 0.295 0.285 38.907 263.066 8.678 + 608.250 0.388 0.278 48.970 267.544 6.948 + 608.500 0.606 0.449 63.865 284.313 5.450 + 608.750 0.662 0.550 74.980 328.035 4.563 + 609.000 0.492 0.467 77.608 328.387 5.020 + 609.250 0.333 0.393 60.284 309.015 5.885 + 609.500 0.271 0.348 50.150 289.539 7.269 + 609.750 0.199 0.336 43.420 268.619 9.114 + 610.000 0.180 0.323 36.322 288.383 11.863 + 610.250 0.208 0.317 31.017 276.036 13.932 + 610.500 0.224 0.301 27.387 264.517 15.674 + 610.750 0.211 0.282 28.898 255.365 17.051 + 611.000 0.189 0.252 33.136 246.936 17.020 + 611.250 0.168 0.235 35.518 246.989 14.685 + 611.500 0.144 0.243 30.895 247.646 12.981 + 611.750 0.172 0.286 37.921 247.167 11.200 + 612.000 0.290 0.376 53.933 246.485 8.967 + 612.250 0.379 0.344 61.827 245.816 7.780 + 612.500 0.296 0.322 68.914 245.640 7.008 + 612.750 0.217 0.307 65.345 245.373 6.126 + 613.000 0.175 0.310 55.890 244.999 5.405 + 613.250 0.202 0.320 53.003 244.222 4.681 + 613.500 0.225 0.333 52.162 243.958 4.154 + 613.750 0.238 0.338 50.389 243.892 3.748 + 614.000 0.250 0.321 47.379 243.932 3.504 + 614.250 0.240 0.327 48.023 244.907 3.332 + 614.500 0.227 0.338 50.466 245.779 3.174 + 614.750 0.248 0.347 46.773 245.719 3.024 + 615.000 0.267 0.345 47.604 245.135 2.974 + 615.250 0.263 0.332 49.425 244.343 2.974 + 615.500 0.243 0.312 47.655 243.563 3.030 + 615.750 0.222 0.299 47.495 242.675 3.169 + 616.000 0.249 0.314 50.802 242.197 3.487 + 616.250 0.237 0.329 55.722 242.761 3.716 + 616.500 0.196 0.329 59.340 243.114 4.042 + 616.750 0.165 0.328 62.031 243.151 4.471 + 617.000 0.143 0.333 65.399 242.986 5.078 + 617.250 0.139 0.345 71.063 242.921 5.565 + 617.500 0.152 0.362 69.416 243.381 6.226 + 617.750 0.163 0.299 55.066 243.629 6.913 + 618.000 0.134 0.273 44.311 244.605 7.634 + 618.250 0.088 0.221 35.105 244.742 8.653 + 618.500 0.070 0.228 30.668 244.783 9.290 + 618.750 0.120 0.297 32.242 245.031 9.000 + 619.000 0.166 0.308 37.161 244.670 8.384 + 619.250 0.170 0.291 42.642 244.187 7.737 + 619.500 0.159 0.265 48.800 243.818 7.220 + 619.750 0.150 0.253 55.703 243.964 6.515 + 620.000 0.152 0.278 62.048 244.932 6.103 + 620.250 0.169 0.300 67.213 246.733 5.858 + 620.500 0.179 0.324 72.938 250.697 5.804 + 620.750 0.150 0.338 80.584 251.045 5.902 + 621.000 0.154 0.345 61.962 248.820 6.208 + 621.250 0.164 0.327 56.471 248.346 6.604 + 621.500 0.174 0.307 56.189 248.075 6.972 + 621.750 0.181 0.307 61.169 247.298 7.091 + 622.000 0.189 0.318 68.380 246.615 6.921 + 622.250 0.198 0.315 68.777 245.839 6.544 + 622.500 0.203 0.298 61.676 245.466 6.459 + 622.750 0.209 0.307 56.002 245.192 6.820 + 623.000 0.214 0.317 56.212 244.918 7.308 + 623.250 0.193 0.289 49.918 244.548 8.424 + 623.500 0.092 0.192 42.326 244.081 9.638 + 623.750 0.058 0.154 38.258 244.634 10.583 + 624.000 0.031 0.178 38.784 245.711 11.427 + 624.250 0.016 0.237 42.711 246.158 11.535 + 624.500 0.047 0.272 49.239 246.207 9.841 + 624.750 0.094 0.297 57.195 246.039 7.938 + 625.000 0.111 0.322 58.396 245.363 6.391 + 625.250 0.141 0.361 53.530 245.088 5.204 + 625.500 0.170 0.325 49.526 244.208 4.465 + 625.750 0.185 0.333 44.904 243.418 4.128 + 626.000 0.196 0.325 41.213 242.528 3.889 + 626.250 0.209 0.276 38.761 242.266 3.760 + 626.500 0.201 0.276 37.295 242.405 3.789 + 626.750 0.184 0.307 36.826 242.859 3.941 + 627.000 0.198 0.315 38.648 242.605 4.091 + 627.250 0.208 0.276 44.249 242.441 4.335 + 627.500 0.193 0.276 54.993 242.684 4.603 + 627.750 0.169 0.310 63.568 243.037 4.933 + 628.000 0.136 0.345 68.982 243.070 5.179 + 628.250 0.120 0.367 60.582 242.817 5.437 + 628.500 0.268 0.499 51.439 242.844 5.581 + 628.750 0.364 0.530 45.328 242.590 5.357 + 629.000 0.476 0.467 36.183 242.619 4.665 + 629.250 0.385 0.355 27.597 242.562 4.086 + 629.500 0.352 0.310 29.670 242.187 3.598 + 629.750 0.303 0.289 26.782 242.017 3.140 + 630.000 0.276 0.266 22.342 241.867 2.791 + 630.250 0.249 0.248 21.997 241.792 2.684 + 630.500 0.225 0.237 25.369 241.633 2.797 + 630.750 0.196 0.228 36.670 241.676 3.182 + 631.000 0.147 0.254 50.821 241.725 3.435 + 631.250 0.096 0.287 55.184 242.379 3.668 + 631.500 0.172 0.304 40.772 242.834 3.872 + 631.750 0.199 0.299 30.761 243.075 3.759 + 632.000 0.231 0.292 24.031 243.127 3.501 + 632.250 0.264 0.293 26.287 243.468 3.411 + 632.500 0.254 0.312 29.720 243.823 3.515 + 632.750 0.244 0.311 31.297 244.284 3.676 + 633.000 0.230 0.295 32.249 244.940 3.824 + 633.250 0.221 0.272 34.009 246.429 3.999 + 633.500 0.325 0.323 38.989 251.733 4.238 + 633.750 0.490 0.370 45.892 287.916 4.491 + 634.000 0.519 0.557 53.290 337.009 4.671 + 634.250 0.768 0.549 64.653 355.640 4.760 + 634.500 0.734 0.566 66.973 336.988 4.932 + 634.750 0.729 0.557 62.475 386.493 5.130 + 635.000 0.783 0.536 60.019 349.360 5.237 + 635.250 0.703 0.546 61.843 309.955 5.247 + 635.500 0.773 0.539 65.216 311.236 5.045 + 635.750 0.810 0.576 67.406 356.301 4.771 + 636.000 0.461 0.627 68.545 311.529 4.345 + 636.250 0.323 0.443 60.827 291.122 4.101 + 636.500 0.256 0.286 50.073 285.489 4.003 + 636.750 0.241 0.298 39.625 287.290 3.981 + 637.000 0.209 0.299 37.605 288.671 4.033 + 637.250 0.232 0.295 38.814 289.647 4.298 + 637.500 0.235 0.285 38.089 290.405 4.598 + 637.750 0.231 0.277 37.127 291.373 5.077 + 638.000 0.226 0.272 38.514 292.346 5.523 + 638.250 0.222 0.297 41.882 294.351 6.260 + 638.500 0.241 0.402 46.989 296.252 7.016 + 638.750 0.321 0.433 48.010 297.737 7.893 + 639.000 0.435 0.480 46.481 300.266 8.913 + 639.250 0.451 0.467 43.718 301.748 10.606 + 639.500 0.488 0.545 42.875 302.510 12.226 + 639.750 0.315 0.483 41.227 301.109 10.372 + 640.000 0.251 0.358 39.148 300.423 7.970 + 640.250 0.198 0.305 40.596 300.780 6.889 + 640.500 0.185 0.303 44.901 300.821 6.205 + 640.750 0.177 0.291 43.312 300.761 5.726 + 641.000 0.163 0.281 36.769 300.495 5.558 + 641.250 0.152 0.283 33.757 300.950 5.548 + 641.500 0.161 0.298 34.526 301.398 5.528 + 641.750 0.172 0.295 39.695 301.028 5.426 + 642.000 0.183 0.281 38.792 300.345 5.198 + 642.250 0.201 0.278 36.893 299.975 5.073 + 642.500 0.198 0.300 36.735 300.945 5.017 + 642.750 0.206 0.329 36.451 302.742 4.924 + 643.000 0.310 0.399 36.287 308.678 4.852 + 643.250 0.336 0.390 39.349 313.676 4.852 + 643.500 0.332 0.381 44.704 318.156 4.916 + 643.750 0.509 0.381 45.471 323.667 6.280 + 644.000 0.595 0.535 42.831 322.469 7.487 + 644.250 0.340 0.240 39.077 297.419 8.777 + 644.500 0.224 0.203 38.421 280.114 10.004 + 644.750 0.160 0.152 35.038 269.312 11.255 + 645.000 0.004 0.090 29.673 261.816 12.381 + 645.250 0.010 0.091 29.823 259.588 13.418 + 645.500 0.018 0.097 31.520 259.529 14.380 + 645.750 0.021 0.088 31.854 259.575 15.154 + 646.000 0.015 0.065 30.642 259.714 15.791 + 646.250 0.003 0.055 29.116 259.446 16.271 + 646.500 -0.005 0.053 28.460 259.277 16.517 + 646.750 -0.005 0.056 27.370 258.502 16.799 + 647.000 0.009 0.062 25.415 258.226 16.957 + 647.250 0.019 0.067 23.640 258.369 17.182 + 647.500 0.014 0.072 26.889 258.517 17.474 + 647.750 0.005 0.074 29.639 259.086 17.574 + 648.000 -0.011 0.074 31.711 259.426 17.608 + 648.250 -0.010 0.075 33.344 260.405 17.478 + 648.500 -0.004 0.079 36.037 261.784 17.220 + 648.750 0.000 0.088 38.599 263.173 16.934 + 649.000 0.007 0.098 41.662 264.141 16.559 + 649.250 0.017 0.111 46.210 264.697 15.834 + 649.500 0.023 0.126 51.129 265.467 14.449 + 649.750 0.028 0.146 58.340 266.024 12.236 + 650.000 0.036 0.166 64.622 266.581 10.576 diff --git a/dist/test/triple_combo.test.js b/dist/test/triple_combo.test.js new file mode 100644 index 0000000..88cc817 --- /dev/null +++ b/dist/test/triple_combo.test.js @@ -0,0 +1,11 @@ +let TripleCombo = require("../well_log_templates/triple_combo_template") +let wellio = require('wellio') +let log_test = wellio.loadLAS("./dist/test/test_assets/00-01-01-073-05W5-0.LAS") +let log = wellio.las2json(log_test) +test('default track name is a property', () => { + expect(new TripleCombo()).toHaveProperty("log_template_name") +}) + +test('load a log into triple combo template', () => { + expect(new TripleCombo().load_log(log).well_log_header['WELL']).toBe("CHEVRON MGSU 1 MITSUE 01-01") +}) \ No newline at end of file diff --git a/dist/track_templates/default_sub_track.js b/dist/track_templates/default_sub_track.js index 9b6249c..37e2967 100644 --- a/dist/track_templates/default_sub_track.js +++ b/dist/track_templates/default_sub_track.js @@ -8,7 +8,7 @@ class DefaultSubTrack extends TrackTemplate { this.show_depth_type = false this.independent_scale = false this.div_id = 'sub_track' - this.handle_params() + this.handle_params(params) } } diff --git a/dist/track_templates/track_template.js b/dist/track_templates/track_template.js index 63c11a1..b49cdf9 100644 --- a/dist/track_templates/track_template.js +++ b/dist/track_templates/track_template.js @@ -35,22 +35,38 @@ class TrackTemplate extends BaseTemplate{ load_log(logs_dict) { console.log('setting up track data') var curves_with_data = {} - this.depth_curve = this.get_depth_track_name(logs_dict['CURVE_INFORMATION_BLOCK']) - for (const [key, value] in Object.entries(this.curves)){ + this.depth_curve = this.get_depth_track_name(logs_dict['CURVE INFORMATION BLOCK']) + for (let curve in this.curves){ // Check if the curve is in the well log // TODO: Put curve aliasing here!! - if(key in Object.keys(logs_dict['CURVE_INFORMATION_BLOCK'])){ + if(curve in logs_dict['CURVE INFORMATION BLOCK']){ // Load the curve - let formatted_log = this.format_log(logs_dict['CURVES'], key) - curves_with_data[key] = value.set_curve_and_data(key, formatted_log) + let formatted_log = this.format_log(logs_dict['CURVES'], curve) + curves_with_data[curve] = this.curves[curve].set_curve_and_data(curve, formatted_log) } else { - curves_with_data[key] = value + curves_with_data[curve] = this.curves[curve] } } this.curves = curves_with_data return this } + + draw(div_id) { + console.log('here') + // Define Track Size + + // Define Track Header + + // Handle Grid Lines + + // Handle Mouseover + + // TODO Secondary Depth Track + + // + } + /** * convertWellJSONToObj is a function that takes in wellio style JSON of all LAS file well log information, * array of curves names, and a string for UWI @@ -63,6 +79,7 @@ class TrackTemplate extends BaseTemplate{ let depth = curve_dict[this.depth_curve]; let curve = curve_dict[curve_name] let curve_data = []; + curve_data.push(curve_dict[this.depth_curve]) curve_data.push(curve_dict[curve_name]); var array_of_object; array_of_object = []; @@ -82,4 +99,6 @@ class TrackTemplate extends BaseTemplate{ } } -module.exports = TrackTemplate \ No newline at end of file +module.exports = TrackTemplate + +// TODO write a track that does text, images, rectangular boxes, etc \ No newline at end of file diff --git a/dist/well_log_templates/triple_combo_template.js b/dist/well_log_templates/triple_combo_template.js index 67a236b..cb66453 100644 --- a/dist/well_log_templates/triple_combo_template.js +++ b/dist/well_log_templates/triple_combo_template.js @@ -6,6 +6,7 @@ class TripleCombo extends WellLogTemplate { this.tracks = { 'CAL_GR': new CaliperGR_track() } + this.log_template_name = 'Triple Combination' this.handle_params(params) } } diff --git a/dist/well_log_templates/well_log_template.js b/dist/well_log_templates/well_log_template.js index c99e1e9..73e0d03 100644 --- a/dist/well_log_templates/well_log_template.js +++ b/dist/well_log_templates/well_log_template.js @@ -20,17 +20,59 @@ class WellLogTemplate extends BaseTemplate{ load_log(log_dict) { console.log('loading log into template') var tracks_with_data = {} - for (const [key, value] in Object.entries(this.tracks)){ + for (let track in this.tracks){ // Extract Data for each log and load into the track - tracks_with_data[key] = track.load_log(log_dict) + tracks_with_data[track] = this.tracks[track].load_log(log_dict) } // setup well log header + this.well_log_header['WELL'] = this.get_well_name(log_dict['WELL INFORMATION BLOCK']) + this.well_log_header['UWI'] = this.get_well_uwi(log_dict['WELL INFORMATION BLOCK']) + + // TODO set units + + // TODO set depth limits + return this } + draw(div_id) { + let d3 = this.start_draw(div_id) + let drawn_tracks; + drawn_tracks = []; + let counter = 0 + for (let track in this.tracks) { + let curvebox_holder = d3.select("#" + div_id).append("div"); + curvebox_holder.style("vertical-align", "middle") + .attr("id", div_id + "curvebox_holder" + i); + // TODO Handle alias-ing of well name or a backup string of some kind + let track_div_id = div_id + this.well_log_header['WELL'] + track + counter + let drawn_template = this.tracks[track].draw(track_div_id) + drawn_tracks.push(drawn_template) + counter += 1 + } + // TODO Handle non-track related drawing here + + // Well Header + + // Draw Tops + + + + return drawn_tracks + console.log('starting here') + } + get_depth_track_name(curve_info){ return Object.keys(curve_info)[0] } + + get_well_name(well_info){ + return well_info['WELL']['DATA'] + } + + get_well_uwi(well_info){ + return well_info['UWI']['DATA'] + } } module.exports = WellLogTemplate \ No newline at end of file diff --git a/examples/deployments/test_new_templates/static/main.js b/examples/deployments/test_new_templates/static/main.js new file mode 100644 index 0000000..5ae7c2f --- /dev/null +++ b/examples/deployments/test_new_templates/static/main.js @@ -0,0 +1,3 @@ +let wellio = require('wellio') +let wellioviz = require('wellioviz') + diff --git a/package.json b/package.json index b0a66d2..2bbc065 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "browserfy": "^1.0.0", "d3": "^5.15.0", "npm": "^6.14.5", - "wellio": "^0.1.8", - "wellioviz": "file:./dist/index.js" + "wellio": "^0.1.8" }, "description": "Provides functionality to visualize well logs, particularly those already converted to JSON, using d3.js visualization library.", "devDependencies": { @@ -22,8 +21,7 @@ "eslint-plugin-promise": "^3.7.0", "eslint-plugin-standard": "^3.0.1", "tape": "~4.9.0", - "jest": "^26.0.1", - "wellioviz": "file:./dist/index.js" + "jest": "^26.0.1" }, "directories": { "doc": "docs", @@ -33,7 +31,12 @@ "dist/test/data_for_testing.js", "dist/test/test.LAS", "dist/index.js", - "dist/log_style_templates/log_curve_template.js", + "dist/log_style_templates/", + "dist/fill_templates/", + "dist/track_templates/", + "dist/well_log_templates/", + "dist/well_section_templates/", + "dist/base_template.js", "dist/test/log_templates.test.js" ], "homepage": "https://github.com/JustinGOSSES/wellioviz", @@ -79,7 +82,7 @@ ], "license": "Apache-2.0", "main": "dist/index.js", - "name": "wellioviz", + "name": "@testwellioviz/wellioviz", "repository": { "type": "git", "url": "git+https://github.com/JustinGOSSES/wellioviz.git" @@ -89,5 +92,5 @@ "make_bundle": "cd docs/js && browserify call_plots.js main.js get_wellio.js vkbeautify.js -o bundle.js" }, "unpkg": "dist/index.js", - "version": "0.0.28" + "version": "0.0.30" } From 0cdf7159454778b4fcede07d3f359aedcf37e0f4 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 13 Jun 2020 14:14:30 -0700 Subject: [PATCH 14/17] Still slogging through the drawing code, trying to understand/refactor it. Switching gears now for a break towards getting panel working more dynamically with wellioviz. --- dist/track_templates/track_template.js | 2 + dist/well_log_templates/well_log_template.js | 52 ++++++++++++++++--- .../deployments/example_panel_app/main.py | 3 +- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/dist/track_templates/track_template.js b/dist/track_templates/track_template.js index b49cdf9..291b235 100644 --- a/dist/track_templates/track_template.js +++ b/dist/track_templates/track_template.js @@ -54,6 +54,8 @@ class TrackTemplate extends BaseTemplate{ draw(div_id) { console.log('here') + let d3 = module.exports.d3; + d3.select("#" + div_id).selectAll("*").remove(); // Define Track Size // Define Track Header diff --git a/dist/well_log_templates/well_log_template.js b/dist/well_log_templates/well_log_template.js index 73e0d03..60d4b0e 100644 --- a/dist/well_log_templates/well_log_template.js +++ b/dist/well_log_templates/well_log_template.js @@ -5,6 +5,7 @@ class WellLogTemplate extends BaseTemplate{ super() this.log_template_name = "default" this.well_log_header = {} + this.header_height = 50.0 this.tracks = {} this.log_border_padding = 20.0 this.pick_lines = {} @@ -12,7 +13,11 @@ class WellLogTemplate extends BaseTemplate{ this.max_width = 1000.0 this.uniform_scroll = true this.vertical_scale_numerator = 30 + this.log_max_depth = 20000.0 + this.log_min_depth = 0.0 this.div_id = "default_well_log" + this.units = "metric" + this.depth_curve_name = "DEPT" //Update template based on passed params this.handle_params(params) } @@ -27,12 +32,10 @@ class WellLogTemplate extends BaseTemplate{ // setup well log header this.well_log_header['WELL'] = this.get_well_name(log_dict['WELL INFORMATION BLOCK']) this.well_log_header['UWI'] = this.get_well_uwi(log_dict['WELL INFORMATION BLOCK']) - - // TODO set units - - // TODO set depth limits - - + // get depth limits + this.log_max_depth = this.get_max_depth(log_dict['WELL INFORMATION BLOCK']) + this.log_min_depth = this.get_min_depth(log_dict['WELL INFORMATION BLOCK']) + this.depth_curve_name = this.get_depth_track_name(log_dict['CURVE INFORMATION BLOCK']) return this } @@ -41,6 +44,9 @@ class WellLogTemplate extends BaseTemplate{ let drawn_tracks; drawn_tracks = []; let counter = 0 + // Well Header + this.draw_track_header(div_id) + for (let track in this.tracks) { let curvebox_holder = d3.select("#" + div_id).append("div"); curvebox_holder.style("vertical-align", "middle") @@ -52,8 +58,7 @@ class WellLogTemplate extends BaseTemplate{ counter += 1 } // TODO Handle non-track related drawing here - - // Well Header + // Draw Tops @@ -63,6 +68,29 @@ class WellLogTemplate extends BaseTemplate{ console.log('starting here') } + draw_track_header(div_id){ + let svg_header = 'track_header' + div_id + let svg_holder = d3.select("#" + div_id).append("div") + .attr("class", "svg_holder") + .style("overflow-x", "auto"); + svg_header = d3.select("#" + svg_header).append("svg"); + svg_header.attr("class", "header"); + + // TODO: Compute Width of log before here + svg_header.attr("width", width) + .attr("height", this.header_height); + svg_header.append("g"); + svg_header.style("display", "block"); + + svg_header.append("text") + .attr("x", (margin.left) / 2) + .attr("y", "1em") + .attr("text-anchor", "middle") + .style("font-size", "10px") + .style("text-decoration", "underline") + .text(this.depth_curve_name); // TODO: Add units and such + } + get_depth_track_name(curve_info){ return Object.keys(curve_info)[0] } @@ -74,5 +102,13 @@ class WellLogTemplate extends BaseTemplate{ get_well_uwi(well_info){ return well_info['UWI']['DATA'] } + + get_max_depth(well_info) { + return parseFloat(well_info['STRT']['DATA']) + } + + get_min_depth(well_info) { + return parseFloat(well_info['STOP']['DATA']) + } } module.exports = WellLogTemplate \ No newline at end of file diff --git a/examples/deployments/example_panel_app/main.py b/examples/deployments/example_panel_app/main.py index 31e4f8e..7b3c9a8 100644 --- a/examples/deployments/example_panel_app/main.py +++ b/examples/deployments/example_panel_app/main.py @@ -15,8 +15,9 @@ print('creating column') main_column = pn.Column(width=900) -test_html = pn.panel('

    Hi!

    ') +test_html = pn.panel('

    Hi select a log file!

    ') main_column.append(test_html) +main_column.append(pn.widgets.FileInput(accept='.LAS,.json,.las', name='File Input')) main_column.append(pn.panel("")) print('trying to add to doc') main_column.servable() From 4a8b8a417ee4f8e8addfba22b6c9f1fd47c0d6c6 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 13 Jun 2020 15:39:08 -0700 Subject: [PATCH 15/17] updated docs to include instructions for running the panel app example deployment. --- docs/INSTALLATION.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 5afe15f..9de6331 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -59,6 +59,11 @@ You're probably not going to use wellioviz on the backend. The one exception is 7. However, if you run `wellioviz.help` you'll now see returned on the next line =`'I'm really no help. Please check out the docs at https://justingosses.github.io/wellioviz/ or the main README.md at https://github.com/JustinGOSSES/wellioviz. Best of luck.'`. 8. Further wellioviz functions are just the variable name you created `wellioviz` + `.` + function name with arguments included inside the `()`. +### Run Example Holoviews Panel/Bokeh Deployment +1. pip install panel (and its dependancies) +2. clone/download repository source code +3. In the command line, navigate to the examples/deployments/ folder +4. From the command line, run panel serve example_panel_app --show ### Install in a Jupyter Notebook with JavaScript Kernal -- IN PROGRESS -- From ebc3f55e1d75934295a8a80f853730be7a3f01a8 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 13 Jun 2020 15:40:52 -0700 Subject: [PATCH 16/17] minor modifications to try to make the panel app more dynamic. Still having trouble passing the file data to the javascript side on a callback. --- .../deployments/example_panel_app/main.py | 18 ++++++++++++++++- .../static/js/make_a_plot.js | 20 +++++++++++++------ .../static/js/wellio/bundle.js | 8 ++++---- .../example_panel_app/templates/index.html | 2 +- .../example_standalone_webpage/make_a_plot.js | 4 ++-- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/examples/deployments/example_panel_app/main.py b/examples/deployments/example_panel_app/main.py index 7b3c9a8..99e18b0 100644 --- a/examples/deployments/example_panel_app/main.py +++ b/examples/deployments/example_panel_app/main.py @@ -1,5 +1,7 @@ from bokeh.plotting import curdoc import panel as pn +import lasio + print('in panel doc setup') # pn.extension( # js_files={ @@ -13,12 +15,26 @@ # # css_file=main_dir + "../docs/css/main.css" # ) + +# def load_callback(event, value): +# print('load this {}'.format(value)) +code = ''' + plot_log(\"current_log\", source.value) + target.text = \"done\" +''' + +markdown = pn.pane.Markdown("Markdown display", width=400) +file_load_selector = pn.widgets.FileInput(accept='.LAS,.json,.las', name='File Input') +# file_load_selector.link(file_load_selector, callbacks={'value': load_callback}) +file_load_selector.jslink(target=markdown, code={'value': code}) +# file_load_selector.jscallback(value=code, args={'value': file_load_selector.value}) print('creating column') main_column = pn.Column(width=900) test_html = pn.panel('

    Hi select a log file!

    ') main_column.append(test_html) -main_column.append(pn.widgets.FileInput(accept='.LAS,.json,.las', name='File Input')) +main_column.append(file_load_selector) main_column.append(pn.panel("")) +main_column.append(markdown) print('trying to add to doc') main_column.servable() doc = curdoc() diff --git a/examples/deployments/example_panel_app/static/js/make_a_plot.js b/examples/deployments/example_panel_app/static/js/make_a_plot.js index a973cc5..493f5e7 100644 --- a/examples/deployments/example_panel_app/static/js/make_a_plot.js +++ b/examples/deployments/example_panel_app/static/js/make_a_plot.js @@ -1,14 +1,22 @@ -async function plot_log(div_id) { +async function plot_log(div_id, log_str="") { let ShaleSiltCutOff = 80 let SiltSandCutOff = 55 - var fileUrltoWellLog = "https://gist.githubusercontent.com/JustinGOSSES/2685e588d5c2f2a0ba1591ec7b9c9421/raw/415fe8a2f27dc7621f06f60ffd40a62c0d55a0f0/00-01-01-095-19W4-0.las" - var fetched = await fetch(fileUrltoWellLog) - var well_as_string = await fetched.text() - var well_json_01_01_095_19W4 = wellio.las2json(well_as_string) + var well_json_01_01_095_19W4; + if (log_str === "") { + let fileUrltoWellLog = "./00-01-11-082-23W4-0.las" + let fetched = await fetch(fileUrltoWellLog) + let log_str = await fetched.text() + well_json_01_01_095_19W4 = wellio.las2json(log_str) + } else { + console.log(log_str) + well_json_01_01_095_19W4 = wellio.las2json(log_str) + } + + let depth_curve_name = "DEPT" let three_things_2 = wellioviz.fromJSONofWEllGetThingsForPlotting(well_json_01_01_095_19W4, depth_curve_name) let curve_names2 = Array(6) ["DEPT", "GR", "CALI", "NPHI", "DPHI", "ILD"] - let uwi2 = "00/01-01-095-19W4/0" + let uwi2 = three_things_2["uwi"] let well_log_curves_reformatted_for_d3_2 = three_things_2["well_log_curves_reformatted_for_d3"] var example_template = wellioviz.curveBoxTemplateExamples("example") var gr_plot_template_noFill = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ["CALI"], ["black"], [""], [ diff --git a/examples/deployments/example_panel_app/static/js/wellio/bundle.js b/examples/deployments/example_panel_app/static/js/wellio/bundle.js index b378032..e3a3850 100644 --- a/examples/deployments/example_panel_app/static/js/wellio/bundle.js +++ b/examples/deployments/example_panel_app/static/js/wellio/bundle.js @@ -22818,14 +22818,14 @@ } var counter_of_curve_names = 0; - console.log("curve_data_line_array.length = ", curve_data_line_array.length) - console.log("curve_data_line_array = ", curve_data_line_array) + // console.log("curve_data_line_array.length = ", curve_data_line_array.length) + // console.log("curve_data_line_array = ", curve_data_line_array) var last_curv_data_line_position = curve_data_line_array.length - 1; - console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) + // console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) curve_data_line_array[last_curv_data_line_position] = curve_data_line_array[last_curv_data_line_position].replace("\r", "") - console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) + // console.log("curve_data_line_array[last_curv_data_line_position] = ", curve_data_line_array[last_curv_data_line_position]) for (k = 0; k < curve_data_line_array.length; k++) { if (curve_data_line_array[k] !== "") { lasjson["CURVES"][curve_names_array_holder[counter_of_curve_names]].push(curve_data_line_array[k]) diff --git a/examples/deployments/example_panel_app/templates/index.html b/examples/deployments/example_panel_app/templates/index.html index a9d99ca..0692071 100644 --- a/examples/deployments/example_panel_app/templates/index.html +++ b/examples/deployments/example_panel_app/templates/index.html @@ -6,7 +6,7 @@ - + {{ bokeh_css }} diff --git a/examples/deployments/example_standalone_webpage/make_a_plot.js b/examples/deployments/example_standalone_webpage/make_a_plot.js index a973cc5..597c856 100644 --- a/examples/deployments/example_standalone_webpage/make_a_plot.js +++ b/examples/deployments/example_standalone_webpage/make_a_plot.js @@ -7,8 +7,8 @@ async function plot_log(div_id) { var well_json_01_01_095_19W4 = wellio.las2json(well_as_string) let depth_curve_name = "DEPT" let three_things_2 = wellioviz.fromJSONofWEllGetThingsForPlotting(well_json_01_01_095_19W4, depth_curve_name) - let curve_names2 = Array(6) ["DEPT", "GR", "CALI", "NPHI", "DPHI", "ILD"] - let uwi2 = "00/01-01-095-19W4/0" + let curve_names2 = three_things_2['curve_names'] + let uwi2 = three_things_2['uwi'] let well_log_curves_reformatted_for_d3_2 = three_things_2["well_log_curves_reformatted_for_d3"] var example_template = wellioviz.curveBoxTemplateExamples("example") var gr_plot_template_noFill = wellioviz.minimumDataIntoTemplateFunc(example_template, well_log_curves_reformatted_for_d3_2, [uwi2], ["CALI"], ["black"], [""], [ From 2696d640fa935970063737bae3f2aaa64bf14a87 Mon Sep 17 00:00:00 2001 From: nathan_geology Date: Sat, 13 Jun 2020 15:42:18 -0700 Subject: [PATCH 17/17] minor style update to the documentation --- docs/INSTALLATION.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 9de6331..a7ed922 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -60,10 +60,10 @@ You're probably not going to use wellioviz on the backend. The one exception is 8. Further wellioviz functions are just the variable name you created `wellioviz` + `.` + function name with arguments included inside the `()`. ### Run Example Holoviews Panel/Bokeh Deployment -1. pip install panel (and its dependancies) -2. clone/download repository source code -3. In the command line, navigate to the examples/deployments/ folder -4. From the command line, run panel serve example_panel_app --show +1. Run `pip install panel` (and its dependancies) from your python enviroment command line. +2. Clone/download this repository's source code +3. In the command line, navigate to the "examples/deployments/" folder +4. From the command line, run `panel serve example_panel_app --show` ### Install in a Jupyter Notebook with JavaScript Kernal -- IN PROGRESS --