First commit
authorBenjamin Auder <benjamin.auder@somewhere>
Mon, 22 Jan 2018 15:09:19 +0000 (16:09 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Mon, 22 Jan 2018 15:09:19 +0000 (16:09 +0100)
52 files changed:
.gitignore [new file with mode: 0644]
README.md [new file with mode: 0644]
TODO [new file with mode: 0644]
data/README [new file with mode: 0644]
data/curves_to_db/README [new file with mode: 0644]
data/curves_to_db/curves2db.R [new file with mode: 0644]
data/curves_to_db/curves2db_jc.R [new file with mode: 0644]
data/curves_to_db/example.R [new file with mode: 0644]
data/curves_to_db/init_db.sql [new file with mode: 0644]
data/preprocessing/Makefile [new file with mode: 0644]
data/preprocessing/README [new file with mode: 0644]
data/preprocessing/convert_to_CSV.c [new file with mode: 0644]
data/preprocessing/expected_output_test.csv [new file with mode: 0644]
data/preprocessing/input_test.csv [new file with mode: 0644]
doc/1101.4744.pdf [new file with mode: 0644]
doc/cugliari-mathamsud2016.pdf [new file with mode: 0644]
pkg/DESCRIPTION [new file with mode: 0644]
pkg/LICENSE [new file with mode: 0644]
pkg/NAMESPACE [new file with mode: 0644]
pkg/R/A_NAMESPACE.R [new file with mode: 0644]
pkg/R/clustering.R [new file with mode: 0644]
pkg/R/computeSynchrones.R [new file with mode: 0644]
pkg/R/computeWerDists.R [new file with mode: 0644]
pkg/R/de_serialize.R [new file with mode: 0644]
pkg/R/main.R [new file with mode: 0644]
pkg/R/plot.R [new file with mode: 0644]
pkg/R/simulateCurve.R [new file with mode: 0644]
pkg/R/utils.R [new file with mode: 0644]
pkg/inst/testdata/de_serialize.csv [new file with mode: 0644]
pkg/man/claws.Rd [new file with mode: 0644]
pkg/man/clustering.Rd [new file with mode: 0644]
pkg/man/computeMedoidsIndices.Rd [new file with mode: 0644]
pkg/man/computeSynchrones.Rd [new file with mode: 0644]
pkg/man/computeWerDists.Rd [new file with mode: 0644]
pkg/man/curvesToContribs.Rd [new file with mode: 0644]
pkg/man/de_serialize.Rd [new file with mode: 0644]
pkg/man/epclust-package.Rd [new file with mode: 0644]
pkg/man/epclustFilter.Rd [new file with mode: 0644]
pkg/src/filter.c [new file with mode: 0644]
pkg/tests/testthat.R [new file with mode: 0644]
pkg/tests/testthat/helper-clustering.R [new file with mode: 0644]
pkg/tests/testthat/helper-common.R [new file with mode: 0644]
pkg/tests/testthat/test-assignMedoids.R [new file with mode: 0644]
pkg/tests/testthat/test-clustering.R [new file with mode: 0644]
pkg/tests/testthat/test-computeSynchrones.R [new file with mode: 0644]
pkg/tests/testthat/test-computeWerDists.R [new file with mode: 0644]
pkg/tests/testthat/test-de_serialize.R [new file with mode: 0644]
pkg/tests/testthat/test-filterMA.R [new file with mode: 0644]
pkg/tests/testthat/test-utils.R [new file with mode: 0644]
pkg/vignettes/epclust.ipynb [new file with mode: 0644]
temp/WerDist.R [new file with mode: 0644]
temp/wave.m [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..67ca303
--- /dev/null
@@ -0,0 +1,50 @@
+#datasets
+/data/*
+!/data/README
+!/data/preprocessing/
+!/data/curves_to_db/
+
+#files generated by initialize.sh
+/.gitfat
+/.gitattributes
+
+#ignore temporary files
+*~
+*.swp
+
+#ignore binary files generated by claws()
+*.epclust.bin
+
+#ignore R session files
+.Rhistory
+.RData
+
+#ignore roxygen2 generated files
+/epclust/NAMESPACE
+/epclust/man/*.Rd
+!/epclust/man/*-package.Rd
+
+#ignore R CMD build/check genrated files
+/*.Rcheck/
+/*.tar.gz
+
+#ignore jupyter generated file (HTML vignette, and reports)
+*.ipynb.html
+
+#ignore object files and executables
+*.o
+*.so
+*.exe
+
+#ignore RcppExports, generated by Rcpp::compileAttributes
+/epclust/R/RcppExports.R
+/epclust/src/RcppExports.cpp
+
+#misc
+Rprof.out
+*.zip
+.Rproj.user
+*.Rproj
+
+# temp
+/temp/*.xls
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..3c88963
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+# Clustering of EDF power curves from Linky data
+
+Joint work with [Jairo Cugliari](http://eric.univ-lyon2.fr/~jcugliari/),
+[Yannig Goude](https://scholar.google.com/citations?user=D-OLEG4AAAAJ&hl=fr) and
+[Jean-Michel Poggi](http://www.math.u-psud.fr/~poggi/)
+
+---
+
+This program takes N time-series in input and is divided in two stages:
+  1. (Heuristic) k-medoids algorithm in parallel to obtain K1 centers, K1 &#8810; N
+  2. Clustering from WER distances to obtain the final K2 &lt; K1 group representations
+
+See ?epclust once the package is loaded.
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..b96bad4
--- /dev/null
+++ b/TODO
@@ -0,0 +1,41 @@
+simulateur : complètement aléatoire ? from Irish dataset ?
+wmtsa : wavBootstrap
+wavelets methods in statistics with R - p180
+
+Essayer distance wdist du package biwavelet ?
+
+geometric structure of high dim data and dim reduction 2011
+
+Piste à explorer pour les comparaisons: H20
+
+renvoyer nombre d'individues par classe ?
+hypothèse : données déjà ordonnées 48 1/2H sur 365j
+utiliser mixmod avec modèles allongés
+doit tourner sur machine plutôt standard, utilisateur "lambda"
+
+#https://stat.ethz.ch/pipermail/r-help/2011-June/280133.html
+#randCov = function(d)
+#{
+#      x <- matrix(rnorm(d*d), nrow=d)
+#      x <- x / sqrt(rowSums(x^2))
+#      x %*% t(x)
+#}
+
+#TODO: map-reduce more appropriate R/clustering.R ligne 88
+
+#TODO: use dbs(),
+               #https://www.r-bloggers.com/debugging-parallel-code-with-dbs/
+               #http://gforge.se/2015/02/how-to-go-parallel-in-r-basics-tips/
+
+PLOT:
+plot manifold 2D distances WER /
+fenetre tempo forme des courbes /
+medoids /
+gain en prevision: clust puis full --> enercast
+
+réduire taille 17519 trop long ?
+
+TODO: revoir les arguments, simplifier (dans les clustering...),
+
+#si pas lissage --> on doit trouver 1 : TOCHECK
+#regarder biwavelets smooth.wavelet : s'en inspirer
diff --git a/data/README b/data/README
new file mode 100644 (file)
index 0000000..4914fbb
--- /dev/null
@@ -0,0 +1,19 @@
+Available dataset: data.london.gov.uk/dataset/smartmeter-energy-use-data-in-london-households
+
+Power-Networks-LCL-June2015(withAcornGps)      meter reading
+
+########################################################################
+
+Australian smart-city dataset:
+data.gouv.au/dataset/smart-grid-smart-city-customer-trial-data
+Now unavailable, but maybe some hope https://data.gov.au/datarequest/98266a0b-6e0c-4092-9e3b-9e3b4cab20ad
+
+CDINTERVALREADINGALLNOQUOTES.CSV.7z     meter reading
+sgsc-cthanplug-readings.7z              Home Aread Network Plug readings
+
+########################################################################
+
+EDF data (undisclosed)
+2009.rar                               25K data for year 2009
+2010.rar                               25K data for year 2010
+2011.zip                               25K data for year 2011
diff --git a/data/curves_to_db/README b/data/curves_to_db/README
new file mode 100644 (file)
index 0000000..5a13a26
--- /dev/null
@@ -0,0 +1,20 @@
+0] Precondition: current folder, containing init_db.sql and curves2db.R
+   must be readable by the postgres user (some other weird restrictions ...)
+
+1] Initialization:
+  a) log in as postgres user:
+             sudo -i -u postgres
+       b) launch PostgreSQL shell:
+             psql
+       c) execute init script:
+             \i /path/to/init_db.sql
+
+2] Launch DB-filling script:
+  a) check/tune parameters at the beginning of curves2db.R
+       b) run the script
+
+=====
+
+WARNING: very slow for large datasets
+
+read_db.R: example usage to read curves from DB
diff --git a/data/curves_to_db/curves2db.R b/data/curves_to_db/curves2db.R
new file mode 100644 (file)
index 0000000..9f0e9d0
--- /dev/null
@@ -0,0 +1,43 @@
+require(RPostgreSQL)
+require(data.table)
+
+nb_curves_per_request <- 100 #curves per (insert) request
+tot_nb_curves <- 25e3 #total number of curves
+dimension <- 15000 #number of sample points
+nb_clust <- 15 #number of clusters
+temp_file <- "tmp_curves_batch" #(accessible) temporary file to store curves
+
+# Init connection with DB
+driver <- PostgreSQL(fetch.default.rec = nb_curves_per_request)
+con <- dbConnect(driver, user="user", password="pwd",
+       host="localhost", port="5432", dbname="db")
+
+# Replace next call + func with any custom initialization
+ref_centroids <- sapply(1:nb_clust, function(k) cumsum(rnorm(dimension)))
+genRandCurves <- function(indices) {
+       mat <- sapply(indices, function(i) {
+               if (i > tot_nb_curves)
+                       return (NULL)
+               j <- sample(ncol(ref_centroids), 1)
+               ref_centroids[,j] + rnorm(dimension)
+       })
+       # fwrite() write per columns => need to "transpose" mat; but it's quite inefficient...
+       lapply(1:dimension, function(i) mat[i,])
+}
+
+# Loop: generate nb_curves_per_request curves, store them on a temp file,
+# and insert into DB using COPY command (should be faster than insert)
+nb_curves <- 0
+while (nb_curves < tot_nb_curves)
+{
+       curves <- genRandCurves((nb_curves+1):(nb_curves+nb_curves_per_request))
+       fwrite(curves, temp_file, append=FALSE, sep=",")
+       # Required hack: add brackets (PostgreSQL syntax ...)
+       system(paste("sed -i 's/\\(.*\\)/{\\1}/g' ",temp_file,sep=''))
+       query <- paste("COPY series (curve) FROM '", normalizePath(temp_file), "';", sep='')
+       dbSendQuery(con, query)
+       nb_curves <- nb_curves + nb_curves_per_request
+}
+
+dbDisconnect(con)
+unlink(temp_file)
diff --git a/data/curves_to_db/curves2db_jc.R b/data/curves_to_db/curves2db_jc.R
new file mode 100644 (file)
index 0000000..dfeab0c
--- /dev/null
@@ -0,0 +1,45 @@
+library(RPostgreSQL)
+library(data.table)
+
+nb_curves_per_request <- 5     # curves per (insert) request
+#tot_nb_curves <- 25e3           # total number of curves
+#dimension <- 17519              # number of sample points
+#nb_clust <- 15                  # number of clusters
+temp_file <- "tmp_curves_batch" # (accessible) temporary file to store curves
+
+# Init connection with DB
+driver <- PostgreSQL(fetch.default.rec = nb_curves_per_request)
+con    <- dbConnect(driver, user = "irsdi", password = "irsdi2017",
+                    host = "localhost", port = "5432", dbname = "edf25m")
+
+setwd("~/tmp/")
+ref_centroids <- fread("2009_matrix-dt.csv")
+#ref_centroids <- sapply(1:nb_clust, function(k) cumsum(rnorm(dimension)))
+
+genRandCurves <- function(line, times) {
+       #ids   <- as.integer(sprintf("%04i", seq_len(times) - 1)) * 1e6 + line[1]
+       ids   <- as.integer(sprintf("%010i", (seq_len(times) - 1) * 1e6 + line[1]))
+       curve <- as.matrix(line[-1])
+       #  simus <- lapply(1:times, function(i) line[-1] * runif(length(curve), .95, 1.05))
+       perturbances <- matrix(runif(length(curve) * times, .95, 1.05), nrow = times)
+       #curves_sim   <- cbind(ids, t(apply(perturbances, 1, FUN = '*', curve)))
+       curves_sim   <- data.frame(ids, t(apply(perturbances, 1, FUN = '*', curve)))
+       # series in columns, data as data.frame (as fwrite requests)
+       return(curves_sim)
+}
+
+# Loop: generate nb_curves_per_request curves, store them on a temp file,
+# and insert into DB using COPY command (should be faster than insert)
+system.time(
+    for (i in seq_len(nrow(ref_centroids))) {
+                       curves <- genRandCurves(line = as.matrix(ref_centroids[i, ]), times = nb_curves_per_request)
+                       fwrite(curves, temp_file, append = FALSE, sep = ",", col.names = FALSE)
+                       # Required hack: add brackets (PostgreSQL syntax ...)
+                       system(paste("sed -i 's/\\(.*\\)/{\\1}/g' ", temp_file, sep = ''))
+                       query <- paste("COPY series (curve) FROM '", normalizePath(temp_file), "';", sep = '')
+                       dbSendQuery(con, query) 
+         }
+)
+
+dbDisconnect(con)
+unlink(temp_file)
diff --git a/data/curves_to_db/example.R b/data/curves_to_db/example.R
new file mode 100644 (file)
index 0000000..d8c6a47
--- /dev/null
@@ -0,0 +1,46 @@
+require(RPostgreSQL)
+
+##############################
+# Follow steps in README first
+##############################
+
+nb_curves_per_request <- 100 #curves per (select) request
+
+# Init connection with DB
+driver <- PostgreSQL(fetch.default.rec = nb_curves_per_request)
+con <- dbConnect(driver, user="irsdi", password="irsdi2017",
+       host="localhost", port="5432", dbname="edf25m")
+
+# Fill associative array, map index to identifier
+indexToID_inDB <- as.character(
+       dbGetQuery(con, 'SELECT DISTINCT id FROM series')[,"id"] )
+
+# Function to retrieve curves within some indices range
+getCurves <- function(indices)
+{
+       indices = indices[ indices <= length(indexToID_inDB) ]
+       if (length(indices) == 0)
+               return (NULL)
+       request <- "SELECT curve FROM series WHERE id in ("
+       for (i in seq_along(indices))
+       {
+               request <- paste(request, indexToID_inDB[ indices[i] ],  sep="")
+               if (i < length(indices))
+                       request <- paste(request, ",", sep="")
+       }
+       request <- paste(request, ")", sep="")
+       df_series <- dbGetQuery(con, request)
+
+#weird result: an integer, and then string "{val1,val2,val3,...,valD}" :/
+#print(summary(df_series))
+df_series
+#      matrix(df_series[,"value"], ncol=length(indices))
+}
+
+# Test
+#curves <- getCurves(c(1:3,7,11))
+library(epclust)
+res <- claws(getCurves, 50, 15, 500, 500, random=FALSE, ncores_clust=3, verbose=TRUE)
+
+dbDisconnect(con)
+unlink(temp_file)
diff --git a/data/curves_to_db/init_db.sql b/data/curves_to_db/init_db.sql
new file mode 100644 (file)
index 0000000..fb2dc7b
--- /dev/null
@@ -0,0 +1,8 @@
+-- Se loguer avec droits admin sur un serveur PostgreSQL
+-- (en local ou non). Puis :
+
+-- superuser status required to use command 'copy' ...
+create role irsdi with superuser login password 'irsdi2017';
+create database edf25m with owner irsdi;
+\c edf25m irsdi -- connect to DB as irsdi
+create table series ( id serial primary key, curve real[] );
diff --git a/data/preprocessing/Makefile b/data/preprocessing/Makefile
new file mode 100644 (file)
index 0000000..097420e
--- /dev/null
@@ -0,0 +1,4 @@
+TARGET = transform.exe
+
+$(TARGET): convert_to_CSV.c
+       gcc convert_to_CSV.c -lm -lcgds -o $(TARGET)
diff --git a/data/preprocessing/README b/data/preprocessing/README
new file mode 100644 (file)
index 0000000..1a860df
--- /dev/null
@@ -0,0 +1,4 @@
+Converter from raw by-columns CSV format to by-rows CSV file
+(much smaller), as epclust::claws() expect as CSV input.
+
+Dependency: cgds, https://git.auder.net/?p=cgds.git
diff --git a/data/preprocessing/convert_to_CSV.c b/data/preprocessing/convert_to_CSV.c
new file mode 100644 (file)
index 0000000..b3ff3be
--- /dev/null
@@ -0,0 +1,205 @@
+#define __STDC_FORMAT_MACROS //to print 64bits unsigned integers
+#include <inttypes.h>
+#include <cgds/Vector.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+#include <stdio.h>
+
+// Read an integer char by char, and position the cursor to next character
+char readInt(FILE* stream, int* integer)
+{
+       *integer = 0;
+       char curChar = fgetc(stream);
+       int sign = (curChar == '-' ? -1 : 1);
+       while (curChar < '0' || curChar > '9')
+               curChar = fgetc(stream);
+       while (curChar >= '0' && curChar <= '9')
+       {
+               *integer = 10 * (*integer) + (int) (curChar - '0');
+               curChar = fgetc(stream);
+       }
+       (*integer) *= sign;
+       return curChar; //separator, endline or .,e,E (if inside readReal)
+}
+
+// Read a real number char by char, and position the cursor to next character
+char readReal(FILE* stream, float* real)
+{
+       int integerPart, exponent = 0, fractionalPart = 0, countZeros = 0;
+       char curChar = readInt(stream, &integerPart);
+       if (curChar == '.')
+       {
+               //need to count zeros
+               while ((curChar = fgetc(stream)) == '0')
+                       countZeros++;
+               if (curChar >= '1' && curChar <= '9')
+               {
+                       ungetc(curChar, stream);
+                       curChar = readInt(stream, &fractionalPart);
+               }
+       }
+       if (curChar == 'e' || curChar == 'E')
+               curChar = readInt(stream, &exponent);
+       *real = ( integerPart + (integerPart>=0 ? 1. : -1.) * (float)fractionalPart
+               / pow(10,countZeros+floor(log10(fractionalPart>0 ? fractionalPart : 1)+1)) )
+                       * pow(10,exponent);
+
+       return curChar; //separator or endline
+}
+
+// Parse a line into integer+float (ID, value)
+static void scan_line(FILE* ifile, char sep,
+       int posID, int* ID, int posValue, float* value)
+{
+       char curChar;
+       int position = 1;
+       while (1)
+       {
+               if (position == posID)
+                       curChar = readInt(ifile, ID);
+               else if (position == posValue)
+                       curChar = readReal(ifile, value);
+               else
+                       curChar = fgetc(ifile); //erase the comma (and skip field then)
+
+               // Continue until next separator (or line end or file end)
+               while (!feof(ifile) && curChar != '\n' && curChar != sep)
+                       curChar = fgetc(ifile);
+               position++;
+
+               if (curChar == '\n' || feof(ifile))
+               {
+                       // Reached end of line
+                       break;
+               }
+       }
+}
+
+// Main job: parse a data file into a conventional CSV file in rows, without header
+// Current limitations:
+//  - remove partial series (we could fill missing values instead)
+//  - consider missing fields == 0 (if ,,)
+//  - IDs should be st. pos. integers
+//  - UNIX linebreaks only (\n)
+int transform(const char* ifileName, int posID, int posValue,
+       const char* ofileName, int nbItems, char sep)
+{
+       uint64_t processedLines = 0; //execution trace
+       uint32_t seriesCount=0, skippedSeriesCount=0, mismatchLengthCount=0;
+       int tsLength, lastID=0, ID, firstID, eof;
+       float value, tmpVal;
+       Vector* tsBuffer = vector_new(float);
+       FILE* ifile = fopen(ifileName, "r");
+       // Output file to write time-series sequentially, CSV format.
+       FILE* ofile = fopen(ofileName, "w");
+
+       // Skip header
+       char curChar;
+       do
+               curChar = fgetc(ifile);
+       while (curChar != '\n');
+
+       // Process one client (ID in first column) at a time
+       while (1)
+       {
+
+               eof = feof(ifile);
+               if (!eof)
+               {
+                       // Is there anything left to read? (file may end with '\n')
+                       curChar = fgetc(ifile);
+                       if (!feof(ifile) && curChar != '\n')
+                       {
+                               // Yes: read current line
+                               ungetc(curChar, ifile);
+                               scan_line(ifile, sep, posID, &ID, posValue, &value);
+                       }
+                       else
+                               eof = 1;
+               }
+
+               if (ID != lastID || eof)
+               {
+                       if (lastID > 0)
+                       {
+                               // Just starting a new time-series (or EOF): process the last one
+                               if (tsLength == vector_size(tsBuffer))
+                               {
+                                       for (int i=0; i<tsLength-1; i++)
+                                       {
+                                               vector_get(tsBuffer, i, tmpVal);
+                                               fprintf(ofile, "%g%c", tmpVal, sep);
+                                       }
+                                       vector_get(tsBuffer, tsLength-1, tmpVal);
+                                       fprintf(ofile, "%g\n", tmpVal);
+                                       seriesCount++;
+                                       if (nbItems > 0 && ++seriesCount >= nbItems)
+                                               break;
+                               }
+                               else
+                               {
+                                       // Mismatch lengths: skip series
+                                       mismatchLengthCount++;
+                               }
+                       }
+                       else
+                               firstID = ID;
+                       if (eof)
+                       {
+                               // Last serie is processed
+                               break;
+                       }
+                       // Reinitialize current index of new serie
+                       tsLength = 0;
+                       lastID = ID;
+               }
+
+               // Fill values buffer
+               if (ID != firstID)
+               {
+                       if (tsLength < vector_size(tsBuffer))
+                               vector_set(tsBuffer, tsLength, value);
+               }
+               else
+               {
+                       // First serie is reference: push all values
+                       vector_push(tsBuffer, value);
+               }
+               tsLength++;
+
+               if ((++processedLines) % 1000000 == 0)
+                       fprintf(stdout,"Processed %"PRIu64" lines\n", processedLines);
+       }
+
+       // finally print some statistics
+       fprintf(stdout,"NOTE: %u series retrieved.\n",seriesCount);
+       if (mismatchLengthCount > 0)
+               fprintf(stdout,"WARNING: %u mismatch series lengths.\n",mismatchLengthCount);
+
+       fclose(ifile);
+       fclose(ofile);
+       return 0;
+}
+
+int main(int argc, char** argv)
+{
+       if (argc < 4) //program name + 3 arguments
+       {
+               printf("Usage: transform ifileName posID posValue [ofileName [nbItems [sep]]]\n \
+  - ifileName: name of by-columns CSV input file\n \
+  - posID: position of the identifier in a line (start at 1)\n \
+  - posValue: position of the value of interest in a line\n \
+  - ofileName: name of the output file; default: out.csv\n \
+  - nbItems: number of series to retrieve; default: 0 (all)\n \
+  - sep: fields separator; default: ','\n");
+               return 0;
+       }
+       else
+       {
+               return transform(argv[1], atoi(argv[2]), atoi(argv[3]),
+                       argc > 4 ? argv[4] : "out.csv",
+                       argc > 5 ? atoi(argv[5]) : 0,
+                       argc > 6 ? argv[6][0] : ',');
+       }
+}
diff --git a/data/preprocessing/expected_output_test.csv b/data/preprocessing/expected_output_test.csv
new file mode 100644 (file)
index 0000000..f837a25
--- /dev/null
@@ -0,0 +1,3 @@
+1.05,2,3
+10000,1,0
+325,-2000,15.55
diff --git a/data/preprocessing/input_test.csv b/data/preprocessing/input_test.csv
new file mode 100644 (file)
index 0000000..be85ae7
--- /dev/null
@@ -0,0 +1,16 @@
+ID,field1,field2,field3
+1,Z28,1.05,NA
+1,A32,2.,NA
+1,B21,3.,0
+2,F12,1e4,0
+2,H234,1.,1
+2,J785,0.,1
+3,S213,4.,0
+3,NaN,50.,-15,NA
+4,R234,2.1e2,1
+4,P0,2,NA
+4,D2,-23e3,0
+4,V23,-3.1e1,0
+5,N52,3.25e2,NaN
+5,NaN,-2.0e3,NaN
+5,I3,15.55,NA
diff --git a/doc/1101.4744.pdf b/doc/1101.4744.pdf
new file mode 100644 (file)
index 0000000..2bfdafb
--- /dev/null
@@ -0,0 +1 @@
+#$# git-fat 5f2ff090cd11aeff66809f2757b3f6ea6bfb035b               905139
diff --git a/doc/cugliari-mathamsud2016.pdf b/doc/cugliari-mathamsud2016.pdf
new file mode 100644 (file)
index 0000000..b3a5e8a
--- /dev/null
@@ -0,0 +1 @@
+#$# git-fat 96fc0307b651a06a05f81c1f5d0f79a1fbd2bd45              2760474
diff --git a/pkg/DESCRIPTION b/pkg/DESCRIPTION
new file mode 100644 (file)
index 0000000..5b6e110
--- /dev/null
@@ -0,0 +1,44 @@
+Package: epclust
+Title: Clustering Individual Electricity Power Curves
+Description: Electric Power curves CLUSTering, through their wavelets
+    decomposition. The main function 'claws' takes (usually long) time-series
+    in input, and return as many clusters centers as requested, along with their
+    ranks and synchrones (sum of all curves in one group).
+    For the method, see ?claws and https://arxiv.org/abs/1101.4744.
+    For usage examples, see ?claws and package vignette.
+Version: 0.1-0
+Author: Benjamin Auder <Benjamin.Auder@math.u-psud.fr> [aut,cre],
+    Jairo Cugliari <Jairo.Cugliari@univ-lyon2.fr> [aut],
+    Yannig Goude <Yannig.Goude@edf.fr> [ctb],
+    Jean-Michel Poggi <Jean-Michel.Poggi@math.u-psud.fr> [ctb]
+Maintainer: Benjamin Auder <Benjamin.Auder@math.u-psud.fr>
+Depends:
+    R (>= 3.0.0)
+Imports:
+    methods,
+    parallel,
+    cluster,
+    bigmemory,
+    wavethresh,
+    Rwave
+Suggests:
+    synchronicity,
+    devtools,
+    testthat,
+    roxygen2,
+    MASS,
+    wmtsa,
+    DBI,
+    digest
+License: MIT + file LICENSE
+RoxygenNote: 6.0.1
+Collate:
+    'main.R'
+    'clustering.R'
+    'de_serialize.R'
+    'A_NAMESPACE.R'
+    'computeSynchrones.R'
+    'computeWerDists.R'
+    'plot.R'
+    'simulateCurve.R'
+    'utils.R'
diff --git a/pkg/LICENSE b/pkg/LICENSE
new file mode 100644 (file)
index 0000000..2e72cd4
--- /dev/null
@@ -0,0 +1,23 @@
+Copyright (c) 2016-2017, Benjamin Auder
+              2016-2017, Jairo Cugliari
+              2016-2017, Yannig Goude
+              2016-2017, Jean-Michel Poggi
+
+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/pkg/NAMESPACE b/pkg/NAMESPACE
new file mode 100644 (file)
index 0000000..ef73764
--- /dev/null
@@ -0,0 +1,29 @@
+# Generated by roxygen2: do not edit by hand
+
+export(binarize)
+export(binarizeTransform)
+export(claws)
+export(clusteringTask1)
+export(clusteringTask2)
+export(computeClusters1)
+export(computeClusters2)
+export(computeSynchrones)
+export(computeWerDists)
+export(curvesToContribs)
+export(getDataInFile)
+importFrom(Rcpp,evalCpp)
+importFrom(Rcpp,sourceCpp)
+importFrom(Rwave,cwt)
+importFrom(bigmemory,as.big.matrix)
+importFrom(bigmemory,big.matrix)
+importFrom(bigmemory,is.big.matrix)
+importFrom(cluster,pam)
+importFrom(methods,is)
+importFrom(parallel,clusterExport)
+importFrom(parallel,makeCluster)
+importFrom(parallel,parLapply)
+importFrom(parallel,stopCluster)
+importFrom(stats,spline)
+importFrom(wavelets,dwt)
+importFrom(wavelets,wt.filter)
+useDynLib(epclust)
diff --git a/pkg/R/A_NAMESPACE.R b/pkg/R/A_NAMESPACE.R
new file mode 100644 (file)
index 0000000..3e29918
--- /dev/null
@@ -0,0 +1,15 @@
+#' @include de_serialize.R
+#' @include clustering.R
+#' @include main.R
+#'
+#' @useDynLib epclust
+#'
+#' @importFrom Rwave cwt
+#' @importFrom cluster pam
+#' @importFrom parallel makeCluster clusterExport parLapply stopCluster
+#' @importFrom wavethresh wd filter.select
+#' @importFrom stats spline
+#' @importFrom methods is
+#' @importFrom bigmemory big.matrix as.big.matrix is.big.matrix
+#' @importFrom utils head tail
+NULL
diff --git a/pkg/R/clustering.R b/pkg/R/clustering.R
new file mode 100644 (file)
index 0000000..5b5f668
--- /dev/null
@@ -0,0 +1,94 @@
+#' Two-stage clustering, within one task (see \code{claws()})
+#'
+#' \code{clusteringTask1()} runs one full stage-1 task, which consists in iterated
+#' clustering on nb_curves / ntasks energy contributions, computed through
+#' discrete wavelets coefficients.
+#' \code{clusteringTask2()} runs a full stage-2 task, which consists in WER distances
+#' computations between medoids (indices) output from stage 1, before applying
+#' the second clustering algorithm on the distances matrix.
+#'
+#' @param getContribs Function to retrieve contributions from initial series indices:
+#'   \code{getContribs(indices)} outputs a contributions matrix, in columns
+#' @inheritParams claws
+#' @inheritParams computeSynchrones
+#' @inheritParams computeWerDists
+#'
+#' @return The indices of the computed (resp. K1 and K2) medoids.
+#'
+#' @name clustering
+#' @rdname clustering
+#' @aliases clusteringTask1 clusteringTask2
+NULL
+
+#' @rdname clustering
+#' @export
+clusteringTask1 <- function(indices, getContribs, K1, algoClust1, nb_items_clust,
+       ncores_clust=3, verbose=FALSE)
+{
+       if (verbose)
+               cat(paste("*** Clustering task 1 on ",length(indices)," series [start]\n", sep=""))
+
+       if (length(indices) <= K1)
+               return (indices)
+
+       parll <- (ncores_clust > 1)
+       if (parll)
+       {
+               # outfile=="" to see stderr/stdout on terminal
+               cl <-
+                       if (verbose)
+                               parallel::makeCluster(ncores_clust, outfile = "")
+                       else
+                               parallel::makeCluster(ncores_clust)
+               parallel::clusterExport(cl, c("getContribs","K1","verbose"), envir=environment())
+       }
+       # Iterate clustering algorithm 1 until K1 medoids are found
+       while (length(indices) > K1)
+       {
+               # Balance tasks by splitting the indices set - as evenly as possible
+               indices_workers <- .splitIndices(indices, nb_items_clust, min_size=K1+1)
+               indices <-
+                       if (parll)
+                       {
+                               unlist( parallel::parLapply(cl, indices_workers, function(inds) {
+                                       require("epclust", quietly=TRUE)
+                                       inds[ algoClust1(getContribs(inds), K1) ]
+                               }) )
+                       }
+                       else
+                       {
+                               unlist( lapply(indices_workers, function(inds)
+                                       inds[ algoClust1(getContribs(inds), K1) ]
+                               ) )
+                       }
+               if (verbose)
+               {
+                       cat(paste("*** Clustering task 1 on ",length(indices)," medoids [iter]\n", sep=""))
+               }
+       }
+       if (parll)
+               parallel::stopCluster(cl)
+
+       indices #medoids
+}
+
+#' @rdname clustering
+#' @export
+clusteringTask2 <- function(indices, getSeries, K2, algoClust2, nb_series_per_chunk,
+       smooth_lvl, nvoice, nbytes, endian, ncores_clust=3, verbose=FALSE)
+{
+       if (verbose)
+               cat(paste("*** Clustering task 2 on ",length(indices)," medoids\n", sep=""))
+
+       if (length(indices) <= K2)
+               return (indices)
+
+       # A) Compute the WER distances (Wavelets Extended coefficient of deteRmination)
+       distances <- computeWerDists(indices, getSeries, nb_series_per_chunk,
+               smooth_lvl, nvoice, nbytes, endian, ncores_clust, verbose)
+
+       # B) Apply clustering algorithm 2 on the WER distances matrix
+       if (verbose)
+               cat(paste("*** algoClust2() on ",nrow(distances)," items\n", sep=""))
+       indices[ algoClust2(distances,K2) ]
+}
diff --git a/pkg/R/computeSynchrones.R b/pkg/R/computeSynchrones.R
new file mode 100644 (file)
index 0000000..3a29546
--- /dev/null
@@ -0,0 +1,67 @@
+#' computeSynchrones
+#'
+#' Compute the synchrones curves (sums of clusters elements) from a matrix of medoids,
+#' using euclidian distance.
+#'
+#' @param medoids matrix of K medoids curves in columns
+#' @param nb_curves How many series? (this is known, at this stage)
+#' @inheritParams claws
+#' @inheritParams computeWerDists
+#'
+#' @return A matrix of K synchrones in columns (same length as the series)
+#'
+#' @export
+computeSynchrones <- function(medoids, getSeries, nb_curves,
+       nb_series_per_chunk, ncores=3, verbose=FALSE)
+{
+       # Synchrones computation is embarassingly parallel: compute it by chunks of series
+       computeSynchronesChunk <- function(indices)
+       {
+               # Obtain a chunk of reference series
+               series_chunk <- getSeries(indices)
+               nb_series_chunk <- ncol(series_chunk)
+
+               # Get medoids indices for this chunk of series
+               mi <- assignMedoids(series_chunk, medoids[,])
+
+               # Update synchrones using mi above, grouping it by values of mi (in 1...K)
+               # to avoid too many lock/unlock
+               for (i in seq_len(K))
+               {
+                       # lock / unlock required because several writes at the same time
+                       if (parll)
+                               synchronicity::lock(m)
+                       synchrones[,i] <- synchrones[,i] + rowSums(as.matrix(series_chunk[,mi==i]))
+                       if (parll)
+                               synchronicity::unlock(m)
+               }
+               NULL
+       }
+
+       K <- ncol(medoids)
+       L <- nrow(medoids)
+       # Use bigmemory (shared==TRUE by default) + synchronicity to fill synchrones in //
+       synchrones <- bigmemory::big.matrix(nrow=L, ncol=K, type="double", init=0.)
+       # NOTE: synchronicity is only for Linux & MacOS; on Windows: run sequentially
+       parll <- (ncores > 1 && requireNamespace("synchronicity",quietly=TRUE)
+               && Sys.info()['sysname'] != "Windows")
+
+       if (parll)
+               m <- synchronicity::boost.mutex() #for lock/unlock, see computeSynchronesChunk
+
+       if (verbose)
+               cat(paste("--- Compute ",K," synchrones with ",nb_curves," series\n", sep=""))
+
+       # Balance tasks by splitting 1:nb_curves into groups of size <= nb_series_per_chunk
+       indices_workers <- .splitIndices(seq_len(nb_curves), nb_series_per_chunk)
+       ignored <-
+               if (parll)
+               {
+                       parallel::mclapply(indices_workers,
+                               function(inds) computeSynchronesChunk(inds), mc.cores=ncores)
+               }
+               else
+                       lapply(indices_workers, computeSynchronesChunk)
+
+       return (synchrones[,])
+}
diff --git a/pkg/R/computeWerDists.R b/pkg/R/computeWerDists.R
new file mode 100644 (file)
index 0000000..130954f
--- /dev/null
@@ -0,0 +1,134 @@
+#' computeWerDists
+#'
+#' Compute the WER distances between the series at specified indices, which are
+#' obtaind by \code{getSeries(indices)}
+#'
+#' @param indices Indices of the series to consider
+#' @param getSeries Function to retrieve series (argument: 'inds', integer vector),
+#'   as columns of a matrix
+#' @param ncores Number of cores for parallel runs
+#' @inheritParams claws
+#'
+#' @return A distances matrix of size K x K where K == length(indices)
+#'
+#' @export
+computeWerDists <- function(indices, getSeries, nb_series_per_chunk, smooth_lvl=3,
+       nvoice=4, nbytes=4, endian=.Platform$endian, ncores=3, verbose=FALSE)
+{
+       n <- length(indices)
+       L <- length(getSeries(1)) #TODO: not very neat way to get L
+       noctave <- ceiling(log2(L)) #min power of 2 to cover serie range
+       # Since a CWT contains noctave*nvoice complex series, we deduce the number of CWT to
+       # retrieve/put in one chunk.
+       nb_cwt_per_chunk <- max(1, floor(nb_series_per_chunk / (nvoice*noctave*2)))
+
+       # Initialize result as a square big.matrix of size 'number of medoids'
+       Xwer_dist <- bigmemory::big.matrix(nrow=n, ncol=n, type="double")
+
+       shift <- 1 #roughly equivalent to s0 in biwavelets & cie. TODO: as arg?
+
+       cwt_file <- tempfile(pattern="epclust_cwt.bin_")
+       # Compute the getSeries(indices) CWT, and store the results in the binary file
+       computeSaveCWT <- function(inds)
+       {
+               if (verbose)
+                       cat("   Compute save CWT on ",length(inds)," indices\n", sep="")
+
+               # Obtain CWT as big vectors of real part + imaginary part (concatenate)
+               ts_cwt <- sapply(inds, function(i) {
+                       ts <- scale(ts(getSeries(i)), center=TRUE, scale=FALSE)
+                       ts_cwt <- Rwave::cwt(ts, noctave+ceiling(shift/nvoice), nvoice,
+                               w0=2*pi, twoD=TRUE, plot=FALSE)
+                       ts_cwt <- ts_cwt[,(1+shift):(noctave*nvoice+shift)]
+                       c( as.double(Re(ts_cwt)),as.double(Im(ts_cwt)) )
+               })
+
+               # Serialization
+               binarize(ts_cwt, cwt_file, nb_cwt_per_chunk, ",", nbytes, endian)
+       }
+
+       # Function to retrieve a synchrone CWT from (binary) file
+       getCWT <- function(index, L)
+       {
+               flat_cwt <- getDataInFile(index, cwt_file, nbytes, endian)
+               cwt_length <- length(flat_cwt) / 2
+               re_part <- as.matrix(flat_cwt[1:cwt_length], nrow=L)
+               im_part <- as.matrix(flat_cwt[(cwt_length+1):(2*cwt_length)], nrow=L)
+               re_part + 1i * im_part
+       }
+
+       # Compute distances between columns i and j for j>i
+       computeDistances <- function(i)
+       {
+               if (parll)
+               {
+                       # parallel workers start with an empty environment
+                       require("epclust", quietly=TRUE)
+                       Xwer_dist <- bigmemory::attach.big.matrix(Xwer_dist_desc)
+               }
+
+               if (verbose)
+                       cat(paste("   Distances from ",i," to ",i+1,"...",n,"\n", sep=""))
+
+               # Get CWT of column i, and run computations for columns j>i
+               cwt_i <- getCWT(i, L)
+               WX  <- filterMA(Mod(cwt_i * Conj(cwt_i)), smooth_lvl)
+
+               for (j in (i+1):n)
+               {
+                       cwt_j <- getCWT(j, L)
+
+                       # Compute the ratio of integrals formula 5.6 for WER^2
+                       # in https://arxiv.org/abs/1101.4744v2 paragraph 5.3
+                       num <- filterMA(Mod(cwt_i * Conj(cwt_j)), smooth_lvl)
+                       WY <- filterMA(Mod(cwt_j * Conj(cwt_j)), smooth_lvl)
+                       wer2 <- sum(colSums(num)^2) / sum(colSums(WX) * colSums(WY))
+
+                       Xwer_dist[i,j] <- sqrt(L * ncol(cwt_i) * (1 - wer2))
+                       Xwer_dist[j,i] <- Xwer_dist[i,j]
+               }
+               Xwer_dist[i,i] <- 0.
+       }
+
+       if (verbose)
+               cat(paste("--- Precompute and serialize synchrones CWT\n", sep=""))
+
+       # Split indices by packets of length at most nb_cwt_per_chunk
+       indices_cwt <- .splitIndices(indices, nb_cwt_per_chunk)
+       # NOTE: next loop could potentially be run in //. Indices would be permuted (by
+       # serialization order), and synchronicity would be required because of concurrent
+       # writes. Probably not worth the effort - but possible.
+       for (inds in indices_cwt)
+               computeSaveCWT(inds)
+
+       parll <- (ncores > 1)
+       if (parll)
+       {
+               # outfile=="" to see stderr/stdout on terminal
+               cl <-
+                       if (verbose)
+                               parallel::makeCluster(ncores, outfile="")
+                       else
+                               parallel::makeCluster(ncores)
+               Xwer_dist_desc <- bigmemory::describe(Xwer_dist)
+               parallel::clusterExport(cl, envir=environment(),
+                       varlist=c("parll","n","L","Xwer_dist_desc","getCWT","verbose"))
+       }
+
+       if (verbose)
+               cat(paste("--- Compute WER distances\n", sep=""))
+
+       ignored <-
+               if (parll)
+                       parallel::clusterApplyLB(cl, seq_len(n-1), computeDistances)
+               else
+                       lapply(seq_len(n-1), computeDistances)
+       Xwer_dist[n,n] <- 0.
+
+       if (parll)
+               parallel::stopCluster(cl)
+
+       unlink(cwt_file) #remove binary file
+
+       Xwer_dist[,] #~small matrix K1 x K1
+}
diff --git a/pkg/R/de_serialize.R b/pkg/R/de_serialize.R
new file mode 100644 (file)
index 0000000..cb964b6
--- /dev/null
@@ -0,0 +1,150 @@
+#' (De)Serialization of a [big]matrix or data stream
+#'
+#' \code{binarize()} serializes a matrix or CSV file with minimal overhead, into a
+#' binary file. \code{getDataInFile()} achieves the inverse task: she retrieves (ASCII)
+#' data rows from indices in the binary file. Finally, \code{binarizeTransform()}
+#' serialize transformations of all data chunks. To use it a data-retrieval function
+#' must be provided -- thus \code{binarize} will most likely be used first
+#' (and then a function defined to seek in generated binary file)
+#'
+#' @param data_ascii Matrix (by columns) or CSV file or connection (by rows)
+#' @param data_bin_file Name of binary file on output of \code{binarize()}
+#'   or input of \code{getDataInFile()}
+#' @param nb_per_chunk Number of lines to process in one batch
+#' @param getData Function to retrieve data chunks
+#' @param transform Transformation function to apply on data chunks
+#' @param indices Indices of the lines to retrieve
+#' @inheritParams claws
+#'
+#' @return For \code{getDataInFile()}, a matrix with columns corresponding to the
+#'   requested indices. \code{binarizeTransform()} returns the number of processed lines.
+#'   \code{binarize()} is designed to serialize in several calls, thus returns nothing.
+#'
+#' @name de_serialize
+#' @rdname de_serialize
+#' @aliases binarize binarizeTransform getDataInFile
+NULL
+
+#' @rdname de_serialize
+#' @export
+binarize <- function(data_ascii, data_bin_file, nb_per_chunk,
+       sep=",", nbytes=4, endian=.Platform$endian)
+{
+       # data_ascii can be of two types: [big.]matrix, or connection
+       if (is.character(data_ascii))
+               data_ascii <- file(data_ascii, open="r")
+       else if (methods::is(data_ascii,"connection") && !isOpen(data_ascii))
+               open(data_ascii)
+       is_matrix <- !methods::is(data_ascii,"connection")
+
+       # At first call, the length of a stored row is written. So it's important to determine
+       # if the serialization process already started.
+       first_write <- (!file.exists(data_bin_file) || file.info(data_bin_file)$size == 0)
+
+       # Open the binary file for writing (or 'append' if already exists)
+       data_bin <- file(data_bin_file, open=ifelse(first_write,"wb","ab"))
+
+       if (first_write)
+       {
+               # Write data length on first call: number of items always on 8 bytes
+               writeBin(0L, data_bin, size=8, endian=endian)
+               if (is_matrix)
+                       data_length <- nrow(data_ascii)
+               else #connection
+               {
+                       # Read the first line to know data length, and write it then
+                       data_line <- scan(data_ascii, double(), sep=sep, nlines=1, quiet=TRUE)
+                       writeBin(data_line, data_bin, size=nbytes, endian=endian)
+                       data_length <- length(data_line)
+               }
+       }
+
+       if (is_matrix)
+       {
+               # Data is processed by chunks; although this may not be so useful for (normal) matrix
+               # input, it could for a file-backed big.matrix. It's easier to follow a unified pattern.
+               index <- 1
+       }
+       repeat
+       {
+               if (is_matrix)
+               {
+                       data_chunk <-
+                               if (index <= ncol(data_ascii))
+                                       as.double(data_ascii[,index:min(ncol(data_ascii),index+nb_per_chunk-1)])
+                               else
+                                       double(0)
+                       index <- index + nb_per_chunk
+               }
+               else #connection
+                       data_chunk <- scan(data_ascii, double(), sep=sep, nlines=nb_per_chunk, quiet=TRUE)
+
+               # Data size is unknown in the case of a connection
+               if (length(data_chunk)==0)
+                       break
+
+               # Write this chunk of data to the binary file
+               writeBin(data_chunk, data_bin, size=nbytes, endian=endian)
+       }
+
+       if (first_write)
+       {
+               # Write data_length, == (file_size-1) / (nbytes*nbWritten) at offset 0 in data_bin
+               ignored <- seek(data_bin, 0)
+               writeBin(data_length, data_bin, size=8, endian=endian)
+       }
+       close(data_bin)
+
+       if ( ! is_matrix )
+               close(data_ascii)
+}
+
+#' @rdname de_serialize
+#' @export
+binarizeTransform <- function(getData, transform, data_bin_file, nb_per_chunk,
+       nbytes=4, endian=.Platform$endian)
+{
+       nb_items <- 0 #side-effect: store the number of transformed items
+       index <- 1
+       repeat
+       {
+               # Retrieve a chunk of data in a binary file (generally obtained by binarize())
+               data_chunk <- getData((index-1)+seq_len(nb_per_chunk))
+               if (is.null(data_chunk))
+                       break
+
+               # Apply transformation on the current chunk (by columns)
+               transformed_chunk <- transform(data_chunk)
+
+               # Save the result in binary format
+               binarize(transformed_chunk, data_bin_file, nb_per_chunk, ",", nbytes, endian)
+
+               index <- index + nb_per_chunk
+               nb_items <- nb_items + ncol(data_chunk)
+       }
+       nb_items #number of transformed items
+}
+
+#' @rdname de_serialize
+#' @export
+getDataInFile <- function(indices, data_bin_file, nbytes=4, endian=.Platform$endian)
+{
+       data_bin <- file(data_bin_file, "rb") #source binary file
+
+       data_size <- file.info(data_bin_file)$size #number of bytes in the file
+       # data_length: length of a vector in the binary file (first element, 8 bytes)
+       data_length <- readBin(data_bin, "integer", n=1, size=8, endian=endian)
+
+       # Seek all 'indices' columns in the binary file, using data_length and nbytes
+       # to compute the offset ( index i at 8 + i*data_length*nbytes )
+       data_ascii <- do.call( cbind, lapply( indices, function(i) {
+               offset <- 8+(i-1)*data_length*nbytes
+               if (offset >= data_size)
+                       return (NULL)
+               ignored <- seek(data_bin, offset) #position cursor at computed offset
+               readBin(data_bin, "double", n=data_length, size=nbytes, endian=endian)
+       } ) )
+       close(data_bin)
+
+       data_ascii #retrieved data, in columns
+}
diff --git a/pkg/R/main.R b/pkg/R/main.R
new file mode 100644 (file)
index 0000000..1eafdcb
--- /dev/null
@@ -0,0 +1,334 @@
+#' CLAWS: CLustering with wAvelets and Wer distanceS
+#'
+#' Cluster electricity power curves (or any series of similar nature) by applying a
+#' two stage procedure in parallel (see details).
+#' Input series must be sampled on the same time grid, no missing values.
+#'
+#' Summary of the function execution flow:
+#' \enumerate{
+#'   \item Compute and serialize all contributions, obtained through discrete wavelet
+#'     decomposition (see Antoniadis & al. [2013])
+#'   \item Divide series into \code{ntasks} groups to process in parallel. In each task:
+#'   \enumerate{
+#'     \item iterate the first clustering algorithm on its aggregated outputs,
+#'       on inputs of size \code{nb_items_clust}\cr
+#'         -> K1 medoids indices
+#'     \item optionally, if WER=="mix":\cr
+#'       a. compute WER distances (K1xK1) between medoids\cr
+#'       b. apply the 2nd clustering algorithm\cr
+#'          -> K2 medoids indices
+#'   }
+#'   \item Launch a final task on the aggregated outputs of all previous tasks:
+#'     ntasks*K1 if WER=="end", ntasks*K2 otherwise
+#'   \item Compute synchrones (sum of series within each final group)
+#' }
+#' 
+#' The main argument -- \code{series} -- has a quite misleading name, since it can be
+#' either a [big.]matrix, a CSV file, a connection or a user function to retrieve series.
+#' When \code{series} is given as a function it must take a single argument,
+#' 'indices': integer vector equal to the indices of the curves to retrieve;
+#' see SQLite example.
+#' WARNING: the return value must be a matrix (in columns), or NULL if no matches.
+#' 
+#' Note: Since we don't make assumptions on initial data, there is a possibility that
+#' even when serialized, contributions do not fit in RAM. For example,
+#' 30e6 series of length 100,000 would lead to a +4Go contribution matrix. Therefore,
+#' it's safer to place these in (binary) files; that's what we do.
+#'
+#' @param series Access to the N (time-)series, which can be of one of the four
+#'   following types:
+#'   \itemize{
+#'     \item [big.]matrix: each column contains the (time-ordered) values of one
+#'       time-serie
+#'     \item connection: any R connection object providing lines as described above
+#'     \item character: name of a CSV file containing series in rows (no header)
+#'     \item function: a custom way to retrieve the curves; it has only one argument:
+#'       the indices of the series to be retrieved. See SQLite example
+#'   }
+#' @param K1 Number of clusters to be found after stage 1 (K1 << N)
+#' @param K2 Number of clusters to be found after stage 2 (K2 << K1)
+#' @param nb_series_per_chunk Number of series to retrieve in one batch
+#' @param nb_items_clust Number of items in 1st clustering algorithm input
+#' @param algoClust1 Clustering algorithm for stage 1. A function which takes (data, K)
+#'   as argument where data is a matrix in columns and K the desired number of clusters,
+#'   and outputs K medoids ranks. Default: PAM.
+#' @param algoClust2 Clustering algorithm for stage 2. A function which takes (dists, K)
+#'   as argument where dists is a matrix of distances and K the desired number of
+#'   clusters, and outputs K medoids ranks. Default: PAM.
+#' @param wav_filt Wavelet transform filter, as a string "Family:FilterNumber"; see
+#'   ?wavethresh::wd
+#' @param contrib_type Type of contribution: "relative", "logit" or "absolute" (any
+#'   prefix)
+#' @param WER "end" to apply stage 2 after stage 1 has fully iterated, or "mix" to apply
+#'   stage 2 at the end of each task
+#' @param smooth_lvl Smoothing level: odd integer, 1 == no smoothing.
+#' @param nvoice Number of voices within each octave for CWT computations
+#' @param random TRUE (default) for random chunks repartition
+#' @param ntasks Number of tasks (parallel iterations to obtain K1 [if WER=="end"]
+#'   or K2 [if WER=="mix"] medoids); default: 1.\cr
+#'   Note: ntasks << N (number of series), so that N is "roughly divisible" by ntasks
+#' @param ncores_tasks Number of parallel tasks ('1' == sequential tasks)
+#' @param ncores_clust Number of parallel clusterings in one task
+#' @param sep Separator in CSV input file (if any provided)
+#' @param nbytes 4 or 8 bytes to (de)serialize a floating-point number
+#' @param endian Endianness for (de)serialization: "little" or "big"
+#' @param verbose FALSE: nothing printed; TRUE: some execution traces
+#'
+#' @return A list:
+#' \itemize{
+#'   \item medoids: matrix of the final K2 medoids curves
+#'   \item ranks: corresponding indices in the dataset
+#'   \item synchrones: sum of series within each final group
+#' }
+#'
+#' @references Clustering functional data using Wavelets [2013];
+#'   A. Antoniadis, X. Brossat, J. Cugliari & J.-M. Poggi.
+#'   Inter. J. of Wavelets, Multiresolution and Information Procesing,
+#'   vol. 11, No 1, pp.1-30. doi:10.1142/S0219691313500033
+#'
+#' @examples
+#' \dontrun{
+#' # WER distances computations are too long for CRAN (for now)
+#' # Note: on this small example, sequential run is faster
+#'
+#' # Random series around cos(x,2x,3x)/sin(x,2x,3x)
+#' x <- seq(0,50,0.05)
+#' L <- length(x) #1001
+#' ref_series <- matrix( c(cos(x),cos(2*x),cos(3*x),sin(x),sin(2*x),sin(3*x)), ncol=6 )
+#' library(wmtsa)
+#' series <- do.call( cbind, lapply( 1:6, function(i)
+#'   do.call(cbind, wmtsa::wavBootstrap(ref_series[,i], n.realization=40)) ) )
+#' # Mix series so that all groups are evenly spread
+#' permut <- (0:239)%%6 * 40 + (0:239)%/%6 + 1
+#' series = series[,permut]
+#' #dim(series) #c(240,1001)
+#' res_ascii <- claws(series, K1=30, K2=6, nb_series_per_chunk=500,
+#'   nb_items_clust=100, random=FALSE, verbose=TRUE, ncores_clust=1)
+#'
+#' # Same example, from CSV file
+#' csv_file <- tempfile(pattern="epclust_series.csv_")
+#' write.table(t(series), csv_file, sep=",", row.names=FALSE, col.names=FALSE)
+#' res_csv <- claws(csv_file, 30, 6, 500, 100, random=FALSE, ncores_clust=1)
+#'
+#' # Same example, from binary file
+#' bin_file <- tempfile(pattern="epclust_series.bin_")
+#' nbytes <- 8
+#' endian <- "little"
+#' binarize(csv_file, bin_file, 500, ",", nbytes, endian)
+#' getSeries <- function(indices) getDataInFile(indices, bin_file, nbytes, endian)
+#' res_bin <- claws(getSeries, 30, 6, 500, 100, random=FALSE, ncores_clust=1)
+#' unlink(csv_file)
+#' unlink(bin_file)
+#'
+#' # Same example, from SQLite database
+#' library(DBI)
+#' series_db <- dbConnect(RSQLite::SQLite(), "file::memory:")
+#' # Prepare data.frame in DB-format
+#' n <- ncol(series)
+#' times_values <- data.frame(
+#'   id = rep(1:n,each=L),
+#'   time = rep( as.POSIXct(1800*(1:L),"GMT",origin="2001-01-01"), n ),
+#'   value = as.double(series) )
+#' dbWriteTable(series_db, "times_values", times_values)
+#' # Fill associative array, map index to identifier
+#' indexToID_inDB <- as.character(
+#'   dbGetQuery(series_db, 'SELECT DISTINCT id FROM times_values')[,"id"] )
+#' serie_length <- as.integer( dbGetQuery(series_db,
+#'   paste("SELECT COUNT(*) FROM times_values WHERE id == ",indexToID_inDB[1],sep="")) )
+#' getSeries <- function(indices) {
+#'   indices = indices[ indices <= length(indexToID_inDB) ]
+#'   if (length(indices) == 0)
+#'     return (NULL)
+#'   request <- "SELECT id,value FROM times_values WHERE id in ("
+#'   for (i in seq_along(indices)) {
+#'     request <- paste(request, indexToID_inDB[ indices[i] ],  sep="")
+#'     if (i < length(indices))
+#'       request <- paste(request, ",", sep="")
+#'   }
+#'   request <- paste(request, ")", sep="")
+#'   df_series <- dbGetQuery(series_db, request)
+#'   matrix(df_series[,"value"], nrow=serie_length)
+#' }
+#' res_db <- claws(getSeries, 30, 6, 500, 100, random=FALSE, ncores_clust=1)
+#' dbDisconnect(series_db)
+#'
+#' # All results should be equal:
+#' all(res_ascii$ranks == res_csv$ranks
+#'   & res_ascii$ranks == res_bin$ranks
+#'   & res_ascii$ranks == res_db$ranks)
+#' }
+#' @export
+claws <- function(series, K1, K2, nb_series_per_chunk, nb_items_clust=5*K1,
+       algoClust1=function(data,K) cluster::pam(t(data),K,diss=FALSE,pamonce=1)$id.med,
+       algoClust2=function(dists,K) cluster::pam(dists,K,diss=TRUE,pamonce=1)$id.med,
+       wav_filt="Coiflets:1", contrib_type="absolute", WER="end", smooth_lvl=3, nvoice=4,
+       random=TRUE, ntasks=1, ncores_tasks=1, ncores_clust=3, sep=",", nbytes=4,
+       endian=.Platform$endian, verbose=FALSE)
+{
+       # Check/transform arguments
+       if (!is.matrix(series) && !bigmemory::is.big.matrix(series)
+               && !is.function(series)
+               && !methods::is(series,"connection") && !is.character(series))
+       {
+               stop("'series': [big]matrix, function, file or valid connection (no NA)")
+       }
+       K1 <- .toInteger(K1, function(x) x>=2)
+       K2 <- .toInteger(K2, function(x) x>=2)
+       nb_series_per_chunk <- .toInteger(nb_series_per_chunk, function(x) x>=1)
+       nb_items_clust <- .toInteger(nb_items_clust, function(x) x>K1)
+       random <- .toLogical(random)
+       wav_filt <- strsplit(wav_filt, ':')[[1]]
+       wav_family <- wav_filt[1]
+       wav_number <- wav_filt[2]
+       tryCatch({ignored <- wavethresh::filter.select(wav_number, wav_family)},
+               error=function(e) stop("Invalid wavelet filter; see ?wavethresh::filter.select") )
+       ctypes <- c("relative","absolute","logit")
+       contrib_type <- ctypes[ pmatch(contrib_type,ctypes) ]
+       if (is.na(contrib_type))
+               stop("'contrib_type' in {'relative','absolute','logit'}")
+       if (WER!="end" && WER!="mix")
+               stop("'WER': in {'end','mix'}")
+       random <- .toLogical(random)
+       ntasks <- .toInteger(ntasks, function(x) x>=1)
+       ncores_tasks <- .toInteger(ncores_tasks, function(x) x>=1)
+       ncores_clust <- .toInteger(ncores_clust, function(x) x>=1)
+       if (!is.character(sep))
+               stop("'sep': character")
+       nbytes <- .toInteger(nbytes, function(x) x==4 || x==8)
+       verbose <- .toLogical(verbose)
+
+       # Binarize series if it is not a function; the aim is to always use a function,
+       # to uniformize treatments. An equally good alternative would be to use a file-backed
+       # bigmemory::big.matrix, but it would break the "all-is-function" pattern.
+       if (!is.function(series))
+       {
+               if (verbose)
+                       cat("...Serialize time-series (or retrieve past binary file)\n")
+               series_file <- ".series.epclust.bin"
+               if (!file.exists(series_file))
+                       binarize(series, series_file, nb_series_per_chunk, sep, nbytes, endian)
+               getSeries <- function(inds) getDataInFile(inds, series_file, nbytes, endian)
+       }
+       else
+               getSeries <- series
+
+       # Serialize all computed wavelets contributions into a file
+       contribs_file <- ".contribs.epclust.bin"
+       if (verbose)
+               cat("...Compute contributions and serialize them (or retrieve past binary file)\n")
+       if (!file.exists(contribs_file))
+       {
+               nb_curves <- binarizeTransform(getSeries,
+                       function(curves) curvesToContribs(curves, wav_filt, contrib_type),
+                       contribs_file, nb_series_per_chunk, nbytes, endian)
+       }
+       else
+       {
+               # TODO: duplicate from getDataInFile() in de_serialize.R
+               contribs_size <- file.info(contribs_file)$size #number of bytes in the file
+               contrib_length <- readBin(contribs_file, "integer", n=1, size=8, endian=endian)
+               nb_curves <- (contribs_size-8) / (nbytes*contrib_length)
+       }
+       getContribs <- function(indices) getDataInFile(indices, contribs_file, nbytes, endian)
+
+       # A few sanity checks: do not continue if too few data available.
+       if (nb_curves < K2)
+               stop("Not enough data: less series than final number of clusters")
+       nb_series_per_task <- round(nb_curves / ntasks)
+       if (nb_series_per_task < K2)
+               stop("Too many tasks: less series in one task than final number of clusters")
+
+       # Generate a random permutation of 1:N (if random==TRUE);
+       # otherwise just use arrival (storage) order.
+       indices_all <- if (random) sample(nb_curves) else seq_len(nb_curves)
+       # Split (all) indices into ntasks groups of ~same size
+       indices_tasks <- lapply(seq_len(ntasks), function(i) {
+               upper_bound <- ifelse( i<ntasks, min(nb_series_per_task*i,nb_curves), nb_curves )
+               indices_all[((i-1)*nb_series_per_task+1):upper_bound]
+       })
+
+       parll <- (ncores_tasks > 1)
+       if (parll && ntasks>1)
+       {
+               # Initialize parallel runs: outfile="" allow to output verbose traces in the console
+               # under Linux. All necessary variables are passed to the workers.
+               cl <-
+                       if (verbose)
+                               parallel::makeCluster(ncores_tasks, outfile="")
+                       else
+                               parallel::makeCluster(ncores_tasks)
+               varlist <- c("ncores_clust","verbose", #task 1 & 2
+                       "K1","getContribs","algoClust1","nb_items_clust") #task 1
+               if (WER=="mix")
+               {
+                       # Add variables for task 2
+                       varlist <- c(varlist, "K2","getSeries","algoClust2","nb_series_per_chunk",
+                               "smooth_lvl","nvoice","nbytes","endian")
+               }
+               parallel::clusterExport(cl, varlist, envir <- environment())
+       }
+
+       # This function achieves one complete clustering task, divided in stage 1 + stage 2.
+       # stage 1: n indices  --> clusteringTask1(...) --> K1 medoids (indices)
+       # stage 2: K1 indices --> K1xK1 WER distances --> clusteringTask2(...) --> K2 medoids,
+       # where n == N / ntasks, N being the total number of curves.
+       runTwoStepClustering <- function(inds)
+       {
+               # When running in parallel, the environment is blank: we need to load the required
+               # packages, and pass useful variables.
+               if (parll && ntasks>1)
+                       require("epclust", quietly=TRUE)
+               indices_medoids <- clusteringTask1(inds, getContribs, K1, algoClust1,
+                       nb_items_clust, ncores_clust, verbose)
+               if (WER=="mix")
+               {
+                       indices_medoids <- clusteringTask2(indices_medoids, getSeries, K2, algoClust2,
+                               nb_series_per_chunk,smooth_lvl,nvoice,nbytes,endian,ncores_clust,verbose)
+               }
+               indices_medoids
+       }
+
+       if (verbose)
+       {
+               message <- paste("...Run ",ntasks," x stage 1", sep="")
+               if (WER=="mix")
+                       message <- paste(message," + stage 2", sep="")
+               cat(paste(message,"\n", sep=""))
+       }
+
+       # As explained above, we obtain after all runs ntasks*[K1 or K2] medoids indices,
+       # depending whether WER=="end" or "mix", respectively.
+       indices_medoids_all <-
+               if (parll && ntasks>1)
+                       unlist( parallel::parLapply(cl, indices_tasks, runTwoStepClustering) )
+               else
+                       unlist( lapply(indices_tasks, runTwoStepClustering) )
+
+       if (parll && ntasks>1)
+               parallel::stopCluster(cl)
+
+       # For the last stage, ncores_tasks*(ncores_clusts+1) cores should be available:
+       #  - ntasks for level 1 parallelism
+       #  - ntasks*ncores_clust for level 2 parallelism,
+       # but since an extension MPI <--> tasks / OpenMP <--> sub-tasks is on the way,
+       # it's better to just re-use ncores_clust
+       ncores_last_stage <- ncores_clust
+
+       # Run last clustering tasks to obtain only K2 medoids indices
+       if (verbose)
+               cat("...Run final // stage 1 + stage 2\n")
+       indices_medoids <- clusteringTask1(indices_medoids_all, getContribs, K1, algoClust1,
+               nb_items_clust, ncores_tasks*ncores_clust, verbose)
+
+       indices_medoids <- clusteringTask2(indices_medoids, getSeries, K2, algoClust2,
+               nb_series_per_chunk,smooth_lvl,nvoice,nbytes,endian,ncores_last_stage,verbose)
+
+       # Compute synchrones, that is to say the cumulated power consumptions for each of the
+       # K2 final groups.
+       medoids <- getSeries(indices_medoids)
+       synchrones <- computeSynchrones(medoids, getSeries, nb_curves, nb_series_per_chunk,
+               ncores_last_stage, verbose)
+
+       # NOTE: no need to use big.matrix here, because only K2 << K1 << N remaining curves
+       list("medoids"=medoids, "ranks"=indices_medoids, "synchrones"=synchrones)
+}
diff --git a/pkg/R/plot.R b/pkg/R/plot.R
new file mode 100644 (file)
index 0000000..8d2c961
--- /dev/null
@@ -0,0 +1,15 @@
+#TODO: some visualization
+#for (i in 1:6) {plot(medoids_ascii[i,1:200],type="l",ylim=c(-5,5),col=i);par(new=TRUE)}
+#...
+#PLOT:
+#plot manifold 2D distances WER / --> récupérer les distances ? quand ?
+#fenetre tempo forme des courbes / --> OK (jour[type] / semaine, indices en arg)
+#medoids / --> OK (moyennés sur 1 jour / type de jour / semaine)
+#gain en prevision: clust puis full --> enercast (comment l'utiliser ?)
+#
+#> plot(cr$medoids[1:100,1],type="l")
+#> #for (i in 1:15)plot(cr$medoids[1:100,1],type="l")
+#> r = range(cr$medoids[1:96,])
+#> for (i in 1:15) {plot(cr$medoids[1:96,i],type="l",ylim=r,col=i); par(new=TRUE) }
+#> 
+#
diff --git a/pkg/R/simulateCurve.R b/pkg/R/simulateCurve.R
new file mode 100644 (file)
index 0000000..97aeac8
--- /dev/null
@@ -0,0 +1,42 @@
+Ref_Centroids <<- NULL
+Tot_Nb_Curves <<- NA
+
+#' initCentroids
+#'
+#' Must be called before getDetRandCurve()
+#'
+#' @param N Number of curves
+#' @param D Number of sample points
+#' @param K Number of clusters
+#'
+#' @export
+initClustersParams <- function(N, D, K)
+{
+       # Generate K centroids
+       Ref_Centroids <<- sapply(1:K, function(k) cumsum(rnorm(D)))
+       Tot_Nb_Curves <<- N
+}
+
+#' getDetRandCurve
+#'
+#' TODO: improve this (using known clusters centers...)
+#'
+#' @param i Some index
+#'
+#' @examples
+#' \dontrun{
+#' initCentroids(N=250000, D=15000, K=15)
+#' res_ascii <- claws(getDetRandCurve, K1=50, K2=15, nb_series_per_chunk=500,
+#'   nb_items_clust=100, random=FALSE, verbose=TRUE, ncores_clust=3)
+#' }
+#' @export
+getDetRandCurve <- function(indices)
+{
+       sapply(indices, function(i) {
+               if (i > Tot_Nb_Curves)
+                       return (NULL)
+               set.seed(i)
+               j <- sample(ncol(Ref_Centroids), 1)
+               Ref_Centroids[,j] + rnorm(nrow(Ref_Centroids))
+       })
+}
diff --git a/pkg/R/utils.R b/pkg/R/utils.R
new file mode 100644 (file)
index 0000000..12fada2
--- /dev/null
@@ -0,0 +1,140 @@
+# Check integer arguments with functional conditions
+.toInteger <- function(x, condition)
+{
+       errWarn <- function(ignored)
+               paste("Cannot convert argument' ",substitute(x),"' to integer", sep="")
+       if (!is.integer(x))
+               tryCatch({x <- as.integer(x)[1]; if (is.na(x)) stop()},
+                       warning=errWarn, error=errWarn)
+       if (!condition(x))
+       {
+               stop(paste("Argument '",substitute(x),
+                       "' does not verify condition ",body(condition), sep=""))
+       }
+       x
+}
+
+# Check logical arguments
+.toLogical <- function(x)
+{
+       errWarn <- function(ignored)
+               paste("Cannot convert argument' ",substitute(x),"' to logical", sep="")
+       if (!is.logical(x))
+               tryCatch({x <- as.logical(x)[1]; if (is.na(x)) stop()},
+                       warning=errWarn, error=errWarn)
+       x
+}
+
+#' curvesToContribs
+#'
+#' Compute the discrete wavelet coefficients for each series, and aggregate them in
+#' energy contribution across scales as described in https://arxiv.org/abs/1101.4744v2
+#'
+#' @param curves [big.]matrix of series (in columns), of size L x n
+#' @param wav_filt Wavelet transform filter, as a vector c(Family,FilterNumber)
+#' @inheritParams claws
+#'
+#' @return A matrix of size log(L) x n containing contributions in columns
+#'
+#' @export
+curvesToContribs <- function(curves, wav_filt, contrib_type)
+{
+       series <- as.matrix(curves)
+       L <- nrow(series)
+       D <- ceiling( log2(L) )
+       # Series are interpolated to all have length 2^D
+       nb_sample_points <- 2^D
+       apply(series, 2, function(x) {
+               interpolated_curve <- spline(1:L, x, n=nb_sample_points)$y
+               W <- wavethresh::wd(interpolated_curve, wav_filt[2], wav_filt[1])$D
+               # Compute the sum of squared discrete wavelet coefficients, for each scale
+               nrj <- sapply( 1:D, function(i) ( sqrt( sum(W[(2^D-(2^i-1)):(2^D-2^(i-1))]^2) ) ) )
+               if (contrib_type!="absolute")
+                       nrj <- nrj / sum(nrj)
+               if (contrib_type=="logit")
+                       nrj <- - log(1 - nrj)
+               unname( nrj )
+       })
+}
+
+# Helper function to divide indices into balanced sets.
+# Ensure that all indices sets have at least min_size elements.
+.splitIndices <- function(indices, nb_per_set, min_size=1)
+{
+       L <- length(indices)
+       nb_workers <- floor( L / nb_per_set )
+       rem <- L %% nb_per_set
+       if (nb_workers == 0 || (nb_workers==1 && rem==0))
+       {
+               # L <= nb_per_set, simple case
+               return (list(indices))
+       }
+
+       indices_workers <- lapply( seq_len(nb_workers), function(i)
+               indices[(nb_per_set*(i-1)+1):(nb_per_set*i)] )
+
+       rem <- L %% nb_per_set #number of remaining unassigned items
+       if (rem == 0)
+               return (indices_workers)
+
+       rem <- (L-rem+1):L
+       # If remainder is smaller than min_size, feed it with indices from other sets
+       # until either its size exceed min_size (success) or other sets' size
+       # get lower min_size (failure).
+       while (length(rem) < min_size)
+       {
+               index <- length(rem) %% nb_workers + 1
+               if (length(indices_workers[[index]]) <= min_size)
+               {
+                       stop("Impossible to split indices properly for clustering.
+                               Try increasing nb_items_clust or decreasing K1")
+               }
+               rem <- c(rem, tail(indices_workers[[index]],1))
+               indices_workers[[index]] <- head( indices_workers[[index]], -1)
+       }
+       return ( c(indices_workers, list(rem) ) )
+}
+
+#' assignMedoids
+#'
+#' Find the closest medoid for each curve in input
+#'
+#' @param curves (Chunk) of series whose medoids indices must be found
+#' @param medoids Matrix of medoids (in columns)
+#'
+#' @return The vector of integer assignments
+#' @export
+assignMedoids <- function(curves, medoids)
+{
+       nb_series <- ncol(curves)
+       mi <- rep(NA,nb_series)
+       for (i in seq_len(nb_series))
+               mi[i] <- which.min( colSums( sweep(medoids, 1, curves[,i], '-')^2 ) )
+       mi
+}
+
+#' filterMA
+#'
+#' Filter [time-]series by replacing all values by the moving average of values
+#' centered around current one. Border values are averaged with available data.
+#'
+#' @param M_ A real matrix of size LxD
+#' @param w_ The (odd) number of values to average
+#'
+#' @return The filtered matrix (in columns), of same size as the input
+#' @export
+filterMA <- function(M_, w_)
+       .Call("filterMA", M_, w_, PACKAGE="epclust")
+
+#' cleanBin
+#'
+#' Remove binary files to re-generate them at next run of \code{claws()}.
+#' To be run in the folder where computations occurred (or no effect).
+#'
+#' @export
+cleanBin <- function()
+{
+       bin_files <- list.files(pattern="*.epclust.bin", all.files=TRUE)
+       for (file in bin_files)
+               unlink(file)
+}
diff --git a/pkg/inst/testdata/de_serialize.csv b/pkg/inst/testdata/de_serialize.csv
new file mode 100644 (file)
index 0000000..93e4938
--- /dev/null
@@ -0,0 +1,300 @@
+-5.99111002404243;6.09197938814759;-4.01558812707663;3.93923367839307;-1.40557636972517;-9.86592999659479;-4.67069430276752;-6.27562338020653;5.39506115950644;-0.65252021420747;-5.67792695946991;-0.308132213540375;-9.38223069533706;-6.19397971313447;2.16966223437339;-3.37941604666412;-1.90149905160069;-8.60223644878715;2.27425246033818;-1.46612398326397;7.57760594133288;2.00122968293726;1.68261247687042;4.7125943377614;4.27578664384782;-7.10167997982353;7.18189124483615;-3.07555097620934;-9.76314822677523;8.78715363331139;0.541225853376091;8.40070626698434;8.47684922628105;-7.32871437445283;-2.25794360041618;8.48425711039454;-1.44004794303328;0.453428803011775;8.65412176586688;7.49030228238553;-3.26864612754434;-7.84683137666434;-8.38512760121375;-5.59564815368503;0.83087011706084;1.94810075685382;-6.62994835525751;8.82968955207616;-7.63684036675841;-4.1796627920121
+5.56166209746152;3.63476124592125;9.65063011739403;2.58371195755899;-3.54721572250128;5.76430567074567;-4.20792349614203;-1.7747308826074;9.92149821016937;-9.04043455142528;9.96754202060401;-1.06469704769552;0.208937861025333;-4.99582556076348;-0.307519361376762;9.44671027362347;-6.34441807866096;-6.50696228723973;1.09367396682501;4.87398409284651;-5.91781189199537;-8.87786568142474;-3.34072523750365;2.50928055960685;1.3370816828683;3.57816372532398;6.79859290830791;2.96105345711112;-3.82899271324277;-6.4745998987928;-8.00874652806669;1.1485605686903;-7.86562416702509;-4.13296896964312;-7.27860941085964;3.98073970340192;-8.3380227861926;-2.54314832855016;-3.39878119528294;0.443414067849517;7.7084747934714;-3.3377232355997;-4.26929884590209;2.42695094551891;4.66557514388114;9.88088393583894;-6.84519893489778;-0.132398591376841;-9.69338546507061;-9.30057165212929
+-4.27790883928537;8.54399996344;1.98478472419083;3.18291102536023;-7.78951381333172;9.34020467102528;5.35332398489118;8.27344763558358;6.92680158652365;8.66677643265575;4.11256624851376;-8.14088875893503;0.187252364121377;-2.28860639501363;6.47276528179646;-1.87373716849834;4.01831180788577;8.56358884368092;1.34453794453293;-3.02477489691228;9.98009264469147;-2.13497364893556;9.64792437385768;9.93462882004678;-5.83917528390884;-7.99798976629972;-0.0207795342430472;-8.64935163408518;-7.62531423475593;9.98291352298111;-0.765806804411113;-7.23727893549949;5.7013938203454;-9.50437915977091;7.99148275516927;-5.17894525546581;-7.06019699107856;-0.441356366500258;1.57953222747892;2.80733188614249;9.43039015401155;-1.99636704288423;-8.04735373705626;5.05451947450638;-6.0013065719977;-6.64572222158313;2.84347581677139;-6.34999194182456;-5.35493952222168;5.20973869133741
+6.28349837847054;-9.88785487599671;7.17207330744714;2.50074112787843;1.1757329525426;-3.72024702373892;9.68001602683216;8.43351959716529;-4.7622150182724;1.41226341482252;-7.03970272559673;-2.63345723971725;8.22853572200984;-8.87697510421276;6.06995472218841;-7.85019746981561;6.07687663752586;-9.45125001017004;8.55621201917529;-3.01414574962109;1.04932316113263;7.60444486979395;6.55822394881397;-6.34177817497402;-8.57970610260963;-5.26093765161932;-8.11418192926794;6.46379621233791;-7.45446590241045;3.83486692328006;3.62270947080106;-0.78201720956713;5.0425355695188;4.06784125138074;-7.3734268033877;-2.8624132880941;-9.37966479919851;-5.27211782056838;1.28689931239933;-0.915793487802148;-5.86381055414677;1.51645111385733;-0.672820913605392;3.00368834286928;-0.913971974514425;-2.56702654063702;-6.44175439141691;6.21596738230437;-4.26139841787517;9.75969514343888
+-0.555241722613573;3.08856598101556;-2.77629354968667;9.5398712484166;-8.97099836263806;-7.927818717435;0.616671973839402;-7.64541552402079;2.28765503503382;2.034608325921;1.61567925941199;-2.35305371228606;0.884489398449659;-6.09538667369634;-8.73352404683828;-1.07064069248736;-6.69789627194405;1.68486810754985;3.02300567273051;-1.77082426846027;7.02385315671563;-4.03976466041058;-1.86854218598455;-4.27289005834609;2.92005789466202;-1.44194131717086;-2.65693483874202;-7.63314134441316;6.05476430617273;-8.99003298021853;2.04669086262584;9.58168961107731;-5.66932845395058;-1.03326183278114;2.32100614346564;-2.95879447367042;7.73089170455933;8.9863203605637;9.28669069427997;0.060067237354815;4.79730778373778;-8.50601910147816;-2.82116231974214;8.10044421814382;-5.13142714742571;1.14633444231004;5.88691407348961;-3.84035070892423;-2.76613425929099;-2.00862702447921
+-7.1078405668959;-7.83485744148493;-0.064642378129065;-1.54910679906607;6.01520232390612;9.29956739768386;-6.23102214653045;6.29008744843304;-7.1282304963097;-0.628084372729063;-5.94382859766483;-5.15816350467503;1.75894993823022;-6.82299681473523;8.15264359582216;6.01522653363645;0.943607809022069;-2.07920002751052;-8.64601735491306;3.02782893646508;-5.24346714373678;-0.81309303175658;-3.23806890286505;-0.0505476212128997;-6.66166782844812;-5.01577256247401;8.29713302198797;-9.47806749958545;1.08590355608612;-7.11038887966424;4.09084449987859;7.51168268267065;-6.90509103238583;-1.43332478124648;-2.55749259144068;-7.76613438967615;1.58353842329234;-6.51613355148584;-3.87047898024321;0.897695375606418;0.648272153921425;-7.66020894981921;-7.09357706364244;-5.21191824693233;-2.00325528159738;8.39784345123917;9.05623400118202;-3.93236601259559;3.88460693880916;-9.50648911297321
+-4.82467344496399;3.29910593107343;-9.83559275045991;8.51643323432654;-1.15209127776325;6.25308275222778;4.27422012202442;-9.50145967304707;6.56882122624665;-1.90641219262034;-6.18001434486359;-9.71815815661103;-1.18622012902051;7.74989302735776;6.82143118232489;1.39349824748933;-2.79281751718372;4.16919318959117;-6.1107723088935;-1.26121213659644;-9.39302952960134;9.36512931250036;4.2747776536271;1.00350602064282;9.86019285861403;7.78676367364824;6.87706595752388;-0.350320199504495;-8.77165420912206;3.79048117436469;0.218000989407301;-3.85754316579551;8.69256630074233;6.29095724318177;5.53997157607228;-4.18635090813041;2.55027650855482;-1.07850628904998;7.91123784612864;-2.71028093062341;-8.14806463196874;4.91046604234725;7.27025864180177;5.66942136734724;-0.840896302834153;-0.804166789166629;-9.83207799494267;-9.55312236212194;-8.9476827904582;7.94521495699883
+-2.08401874173433;-6.2612697808072;-7.225535614416;5.43063005432487;-0.400145333260298;8.04494060110301;0.261134593747556;-5.30205584131181;2.49307315330952;5.88783884420991;-7.17108622658998;1.48609550204128;-4.39373320434242;-2.48499670997262;-2.2800793685019;-7.11981725879014;-2.95436083339155;-6.91170560661703;5.52474544383585;-7.79949861112982;-2.26013036910444;-1.28038879483938;2.98451753798872;-8.95586364902556;4.19380205217749;-8.25271561741829;9.88195908255875;-1.29885253030807;-4.84307841863483;-0.481335590593517;-4.25532323308289;3.36245745420456;2.20836560707539;-9.21452489215881;5.61118557117879;1.69039043597877;-1.44199044443667;2.01326294802129;-1.86943834181875;-6.08090989291668;-8.97251039743423;7.906090086326;-2.11337944492698;8.42689494602382;4.96969990432262;6.50086670182645;-4.04133487958461;5.56677715852857;8.42992727644742;6.33610950782895
+-3.94653886556625;-0.996815674006939;1.98583316989243;3.1672039302066;1.90098508261144;7.9272475419566;5.14781475067139;2.71931947674602;2.11245241574943;-8.40257101692259;9.26309630740434;-9.41002506762743;-5.33029825892299;9.96528302319348;-5.21778509020805;-5.31358911190182;1.39611883554608;6.388961202465;-0.291690304875374;-9.74420133978128;-2.31937171891332;-6.50680883321911;5.05621114280075;4.43948831409216;3.38982551824301;-0.32882952131331;-2.53537443932146;-7.54250570200384;-9.61085741408169;6.85252154245973;-8.62339474260807;-4.67779808677733;4.68228333164006;5.09129495359957;-4.35151666402817;2.97390782739967;-2.82759028021246;-9.65530488174409;9.47832887526602;8.71490919496864;9.84390048310161;-0.320754079148173;-1.48932875599712;7.81936845276505;-0.290932888165116;-2.53298420924693;-4.97645414900035;-3.26840717811137;3.40065252035856;-5.33890429418534
+6.11658720299602;6.09766808804125;4.80072860606015;2.71977247204632;2.5376614369452;-2.29985898826271;1.18405658286065;6.60825458355248;-7.06195234786719;-1.3515767455101;-6.95229655597359;8.35021649487317;8.31414266955107;8.14777401741594;-3.99716059677303;6.34416899643838;-9.31574083864689;-8.15669790841639;-0.502038039267063;2.18196843750775;-8.83679980877787;-9.20976772438735;3.12075764406472;0.656940345652401;4.80506334919482;-5.18773631192744;-1.20721332728863;6.06814407743514;1.32697912398726;-7.10908576380461;8.15922968555242;-4.16385540273041;-8.69697487913072;-2.35560281202197;-0.0787335867062211;-7.96098545193672;0.588687136769295;7.96645723283291;9.92084440309554;-0.239791185595095;3.98741200566292;-4.35804017819464;3.58944675885141;-6.5072133904323;-7.17670815531164;8.18223688285798;-8.80737183149904;4.55008483957499;-6.69267203658819;-6.89897628501058
+-6.58798035234213;4.08955611288548;3.64052339456975;-8.76401795074344;0.901448950171471;3.22399380151182;2.9812628775835;3.50783177651465;-6.01093934848905;6.38428489677608;-6.09182314947248;-8.72344069648534;6.39644813723862;-6.1226934986189;-0.652158232405782;7.11236072704196;9.12880156654865;-8.75938009470701;-7.86406361032277;3.07432108093053;-6.63162079639733;7.24501671269536;-7.70954647101462;4.33919192757457;0.386462328024209;4.35927729588002;-0.262796203605831;0.841725748032331;8.95562276244164;-6.95512767415494;8.88356673531234;4.67220981605351;9.2248866148293;-1.55621830839664;3.50662674289197;-7.84510968718678;-3.21387386880815;-5.68206920754164;4.99295190908015;-3.87525116559118;-2.62973550241441;0.893698465079069;-9.85932365059853;-1.08747715130448;8.25088419951499;2.26209090556949;-7.07302084658295;-0.313832303509116;-9.6913606626913;3.59634899068624
+-5.50493486691266;0.547313434071839;-6.96309841703624;6.30690331105143;6.86814821790904;-8.85414354037493;-3.32970139104873;-3.21622291114181;-3.1452421983704;-9.92800306063145;-3.61213484779;-6.60062063019723;-0.591869060881436;7.00582389254123;7.37272115424275;9.52878833282739;-1.29208818543702;4.4641058659181;5.82229759544134;2.87941738031805;6.6757629532367;-6.44774462096393;-5.92626246623695;-3.013138868846;3.93160079140216;2.80956105329096;-9.51777553651482;-7.15529802255332;-9.48301809374243;-0.71662659291178;-9.27443404216319;-3.99063573218882;-2.75379366241395;0.146913258358836;3.22162381839007;-2.06488256342709;9.55363607499748;8.48647070582956;7.99228140618652;-1.10119287390262;6.4946341747418;-0.0833454914391041;-7.62242338620126;8.65725270472467;4.63667741045356;2.45652395766228;-6.97437290567905;0.796974101103842;7.42864692118019;-6.64305191952735
+2.83320816233754;-4.57049124874175;-7.69664623774588;6.75181637052447;9.89616787526757;2.50402439385653;2.41438207216561;-9.90302627906203;-6.18873280938715;9.18912077322602;-3.27696837950498;-3.63982657901943;5.05821050144732;-3.65630195010453;-1.66271678637713;8.29057548660785;-3.86862223502249;-9.55829865764827;-3.91599066089839;6.98940670117736;-3.44415053259581;4.63964404072613;-6.23275880236179;5.55225826334208;5.32933415379375;2.32438556849957;-9.50710778590292;-3.93154848366976;2.19796908088028;-7.34191222116351;-0.194851798005402;3.51611630991101;-1.59444791730493;4.67161844950169;-2.23712075036019;9.71127158496529;4.98029159847647;0.529828788712621;8.79571975208819;9.20799651183188;-5.37523219361901;-9.48888165410608;-6.2924122530967;2.95205181464553;-0.840128343552351;-8.88349752873182;-3.33466045558453;-8.01418033894151;9.22120091039687;6.72450349666178
+2.96496651135385;-2.37372169736773;4.04767765197903;9.81329711619765;-1.76305334083736;-7.1781800640747;-6.62033715285361;-9.75384766235948;8.70065887458622;-4.98762426432222;4.73883477039635;0.297544817440212;6.40471848659217;-4.62745455559343;-3.25593322981149;-0.814487733878195;2.78316492214799;7.29979610070586;-4.7633174341172;5.71612353436649;-5.51630630623549;-4.23968271352351;4.57959620747715;8.46055172383785;-4.38114650081843;3.45112686045468;-1.59991927910596;-2.08998568356037;5.82325629424304;5.82407410722226;-8.80211228039116;6.18523168377578;-0.920695029199123;-6.78327451925725;5.53838543128222;4.38908399548382;6.72492952086031;4.64991273358464;-2.41740827448666;5.05910949315876;-7.49243909027427;-3.52311754133552;2.1123818308115;-1.71826402191073;8.93672264181077;1.15610185544938;6.87800812534988;1.04406159836799;8.43088848050684;-9.01546466629952
+-2.45452993083745;9.96981901116669;9.95674644131213;-9.52918522059917;-5.53114997688681;8.81051413714886;-8.14156963024288;-7.78973524924368;-9.1689979005605;-2.48610560316592;-4.54865146894008;-3.64996504969895;4.21779362950474;5.84646020550281;-8.07933177798986;-4.6138743404299;-2.67978163901716;0.241198837757111;0.442491928115487;7.01054193545133;4.6646587504074;-4.40176161006093;-9.26672363188118;9.67409782577306;0.295302872546017;-3.0993273248896;6.19704634416848;2.09595120511949;-9.25478328019381;-6.01596330292523;7.85204073414207;-5.93169902916998;9.36764599755406;9.78961595799774;-8.39734949637204;9.80105575174093;-3.52921275887638;0.690834731794894;-3.96995201706886;5.83305196836591;-7.4785395199433;-1.84707157779485;4.84827115666121;-1.28765324596316;1.53445097152144;7.81896035652608;-8.1318202894181;-1.291708284989;-6.63788264617324;7.71318997256458
+5.54311371874064;-4.57956881728023;8.57825052924454;-0.00629843212664127;3.62408272456378;-3.92371126450598;-5.3429859643802;9.28890994284302;-6.57130951061845;4.20910513959825;-5.22270091343671;-1.88525175210088;8.34913940168917;9.5354787632823;8.7312666978687;-1.08363633975387;1.91176176071167;8.48774180281907;-5.17658091615885;0.648338478058577;5.78456607181579;1.8997963052243;-6.31986453663558;4.96359834447503;0.689360862597823;-5.75299424584955;3.17349233664572;1.17566830012947;-3.45473870169371;0.922512686811388;2.1582779660821;-8.80664631724358;7.62962232343853;-1.48872158490121;-8.61551633104682;4.48251374531537;0.776691865175962;-3.27591939363629;-7.16670050751418;-1.71004578471184;-6.03286165278405;2.98638639040291;6.25778499059379;-7.28782199323177;-1.63364578504115;-3.47887120675296;-4.73949139472097;-4.68877365812659;-0.902259782887995;7.17075899709016
+-2.25563341751695;-9.65634897816926;-4.50784161686897;-9.53603638336062;-1.24783514533192;-3.50667026359588;1.60067703109235;-7.11403546854854;-8.75555433798581;8.13295150641352;-1.02290201466531;7.60313296224922;1.73526138998568;-1.05539943557233;-4.91345847025514;4.03911029454321;7.09510532673448;-2.94147584587336;7.93598263058811;9.9335668887943;-6.5970963658765;1.33800734300166;2.66837507952005;-8.98697106633335;-8.87626448646188;-1.81574519723654;-9.93344332557172;4.35294308234006;1.63184174336493;4.77931168396026;-5.40794489905238;-7.52705461345613;7.7181733539328;2.90667420253158;-6.34858728386462;8.99566538166255;-3.89486842323095;1.88004003372043;8.11262029688805;9.7031738050282;1.07829707209021;7.91270839516073;3.48495083395392;-8.58465017285198;1.25114455353469;-9.0776892984286;-0.112344161607325;-6.96122802328318;6.64438774809241;-3.6569780530408
+7.55460073705763;-1.57141141127795;9.63321931194514;-9.64783519972116;2.0229628495872;-1.41143830493093;-9.83733981382102;-4.45132583379745;8.83050497155637;6.39075063634664;-1.78386251442134;1.07005827594548;-4.56248788163066;-9.10446475725621;2.58480595890433;5.75444627553225;3.99164186324924;4.13557602092624;-9.20259411912411;-2.50018648337573;2.46391792781651;6.47518439684063;2.10816598497331;-7.84468435682356;1.01608911529183;-5.28400717303157;9.31644456461072;-7.07057661376894;-0.677524302154779;-2.71310372743756;-8.5716870194301;-8.97342779673636;8.44439392909408;-6.28430183045566;3.69744544383138;-1.94884893950075;-7.21551705151796;-8.51142555009574;6.51247883681208;-7.74459492880851;1.41768600791693;-6.71547355595976;-9.09986917860806;-8.30116115044802;0.118706170469522;6.11547774635255;-8.42940211296082;-5.96438711509109;7.92597730644047;-3.16388644278049
+-7.16875873506069;-1.51163667440414;-3.22166280820966;2.95872716233134;0.594113604165614;2.08994795568287;-1.55292163603008;-4.94734247215092;-7.63451824896038;-7.81696120742708;-4.9513409473002;3.31892170011997;6.63503758143634;9.62644790299237;-3.99692733772099;2.51251505687833;8.78649998921901;1.72410587314516;-5.60823167674243;2.58748695719987;3.12054172158241;-4.82277669012547;-4.82130565680563;3.34050357341766;6.69578420463949;-8.12739795539528;-4.98305839020759;-3.39548557065427;7.52364553976804;9.89249139092863;-0.561892157420516;-9.99517355579883;-4.93786464910954;9.73472006618977;-8.35642389487475;7.93094721157104;5.79303242266178;-9.05771692283452;-6.91718983463943;5.04972266964614;-9.77434428874403;-2.82926830928773;6.78966398350894;-6.96142533328384;-4.42772309295833;0.393355386331677;-9.71538761630654;-1.12926435656846;-1.69677730184048;-2.49042382929474
+3.41744750738144;-8.14223444089293;-0.443026209250093;-9.58925256039947;-6.9834697060287;3.25637705624104;-1.69310695491731;6.16673256270587;0.456696758046746;7.61315575800836;3.30301044043154;-9.21251266729087;-0.202364143915474;-6.489008362405;2.13053271174431;2.95746327377856;-6.75572398118675;1.42052224371582;-6.43982070032507;-3.24549691285938;-0.0305873388424516;3.10628271661699;9.61851283442229;3.9670617878437;-6.60114926751703;-7.72463688161224;3.97409281227738;9.06944466289133;-0.543670458719134;-2.65327470377088;2.62578653171659;6.29547716584057;7.47540174052119;-7.61636518407613;6.9674157910049;-9.39464117866009;6.87626756727695;9.93815904483199;-2.36957104876637;-0.806055292487144;5.82153033465147;5.51000168547034;2.02938216272742;0.884072394110262;3.42785980086774;-1.05918074958026;-1.6855870001018;-2.04611662775278;3.64119549747556;-0.0420155376195908
+6.06058635748923;-8.22533232625574;-9.25086511299014;9.60925932507962;-1.86639670282602;7.43957200553268;-7.67521293833852;-4.78432103991508;-4.27104977890849;-2.27904137223959;8.37050220463425;-4.8987022601068;-7.16159181669354;7.95262897852808;5.87808454409242;-7.29562730994076;-3.64283780567348;-9.8048567539081;6.31205731537193;8.52079626172781;7.51916867215186;2.84270864445716;-1.85553651303053;-8.72844046913087;6.67904421221465;2.72570051252842;8.67883946746588;5.88915083091706;-4.64588890783489;9.49283662717789;-7.25936393719167;3.26732074376196;-3.10149902012199;-9.49706068728119;0.115818688645959;1.61181165836751;7.32165087014437;-0.450497339479625;3.93607898615301;2.76247952133417;-9.22230862081051;1.30690613761544;-7.52335071563721;-5.43543281964958;-7.79268598649651;7.43566827382892;9.47038734797388;2.42906987201422;7.64154692646116;-3.72595748398453
+-9.05318473931402;4.63992902077734;-3.7890755943954;6.29881289321929;-0.0608525471761823;2.07263354212046;6.92479663528502;-2.6558639574796;-9.25740223377943;4.04482900630683;-2.58630413096398;-2.13402931112796;-5.8345719659701;6.89737563021481;-0.980054107494652;5.40719712153077;-5.18039403483272;4.143674694933;3.9376083528623;7.08667541388422;1.52106238994747;8.29260762315243;9.5306308567524;-3.65844008512795;-1.87828255351633;-9.04836761765182;-3.46215487457812;5.07485519163311;9.11928489804268;-1.02392062544823;6.67494759894907;-4.97781648766249;-6.74564712680876;-5.05211438052356;5.90286176186055;7.46488709002733;8.94347812514752;9.13688989821821;-2.74367607198656;-2.51238927710801;1.46207971964031;8.7686855206266;-7.97585710883141;-1.59172606654465;-9.67164946254343;-8.87131167575717;-4.02516987640411;0.53542488720268;8.79882094450295;3.22957335971296
+-4.79033831972629;-5.45275121927261;-4.03935112990439;-3.68443993851542;-3.30415948759764;2.05597496591508;2.93497577309608;1.50110174901783;4.76257419213653;4.02748956345022;1.98908730875701;-4.12250634282827;2.79120877385139;0.10846144054085;-9.57149976864457;-6.68987467419356;8.32716850098222;-7.23154141567647;6.83675733860582;-2.94451680034399;8.12096502166241;-1.0387019161135;6.49156397208571;7.72842490579933;-8.12859291210771;-1.98538270313293;8.5323558235541;-7.71161305252463;-0.0860823458060622;7.75877353269607;-0.988940703682601;9.0873039001599;-7.58593099191785;2.31584541965276;4.2768907174468;7.53754244651645;2.10744365584105;-4.08006713725626;4.26246562041342;-7.90270674508065;-1.7391036497429;1.73936014529318;-9.13782540243119;-0.613625263795257;9.76147255394608;5.65568360034376;-6.08206174802035;-1.2953801266849;1.47623665630817;-3.64157991949469
+-6.32213391829282;1.63256200496107;-4.59778513759375;6.07725286856294;3.77156724687666;0.238019269891083;-2.47270492836833;-1.55347530264407;3.38795695453882;4.75033275783062;0.000444916076958179;6.46780325099826;0.878725708462298;1.25312715768814;-5.93650947790593;6.07264245860279;8.95566208753735;-2.46978349518031;-2.19028395134956;-1.63465932942927;6.73349340911955;7.5104163819924;-0.419359090737998;3.61969999969006;1.73833802342415;-6.30910350941122;-4.5448163151741;3.92618911340833;3.10417879372835;9.1193398879841;3.39713511522859;-7.58855897933245;6.70140842441469;4.71577982418239;3.18427069112659;0.662016160786152;0.641421731561422;-3.87776472605765;2.23891017958522;-5.70845711044967;3.78385842312127;-5.56394339539111;-5.7211968395859;3.59887219499797;9.02178614400327;5.26069945655763;2.46407526079565;2.22140019759536;-3.15050366800278;5.02185027115047
+-0.517207672819495;4.02603727765381;-4.4920440018177;-7.96223008539528;3.46848805435002;-7.24085041321814;-5.24153688456863;4.10674364771694;0.211641909554601;-1.96128299459815;-3.49699365440756;-5.5417252285406;-9.45131580810994;-0.759130027145147;-0.935313971713185;7.44485776871443;8.5754040395841;-2.94299320783466;6.44185143522918;1.90588413737714;-8.79072826821357;3.20475848857313;8.76219321973622;-0.265259062871337;-9.20809146016836;4.52248305082321;-7.12583218235523;-0.440601012669504;-0.431031621992588;5.71633460465819;-9.48431351687759;1.20917025953531;-3.85759335476905;-9.46086764801294;-8.78662840928882;-4.81306031811982;-7.74029701016843;1.94248005747795;-7.84652207046747;-3.28509542159736;-9.06044173054397;3.3311347104609;4.45286493748426;7.92704021092504;-8.7800888158381;9.58969853818417;2.13141615036875;-2.38194210454822;-1.1552334530279;5.81780242267996
+7.31987956445664;3.49543758202344;-6.90817901864648;5.83799114916474;-5.0286250282079;-2.04430658835918;7.74299997836351;5.05775599274784;-1.7745612654835;-1.95966858416796;-1.36875258293003;-1.99590221047401;-4.81798367574811;-1.28461350221187;3.20474651642144;-8.83645244408399;2.22556193359196;-7.62048637960106;6.51935544330627;-9.69311437569559;8.79279342014343;4.74977867677808;-4.41462945658714;-4.15802877396345;3.80160081200302;8.09343419037759;-6.50126829743385;8.43197276815772;-3.18494480103254;-2.07064097747207;3.80741665605456;-7.636065967381;3.36537234950811;-5.99591940641403;4.37809678260237;-0.72895341552794;-3.23824863415211;-0.784061681479216;7.5923515483737;7.40001022350043;7.12497903965414;7.24531960207969;-9.46103904396296;1.79069729056209;-9.10331551916897;5.92331940308213;-4.1666440712288;-9.94899316225201;0.421894928440452;3.17260536365211
+-2.66563178040087;1.02010156493634;1.91831392236054;-3.99274630937725;4.46301823481917;3.15561853349209;-8.36875531822443;-0.0794133730232716;-0.596560020931065;-9.77260923013091;6.97202037554234;-4.32895883452147;-3.38654334656894;7.68028037622571;-3.58884675893933;4.67114515602589;7.3061205400154;-4.75148085970432;3.39862396009266;-1.28858898766339;6.29568306729198;-6.07481511309743;4.02824791613966;-8.16262731794268;9.30957493837923;-2.58876322302967;7.54315311554819;5.52168857306242;-0.802911845967174;-5.53446257021278;5.10584350209683;6.08047980349511;-5.74706594925374;-8.65060579963028;6.38113628141582;-2.42200864013284;6.64570546709001;9.22555357217789;-8.67380856536329;-1.35813123546541;-6.76040771882981;-0.672390926629305;-7.22563870251179;7.57751382421702;-1.47762543521821;-8.03486973978579;-1.98737789411098;1.09938036184758;3.48866782616824;-9.7962148161605
+1.57660657539964;9.86596251837909;3.30284657888114;-9.84254728071392;8.59943727962673;-3.08263121172786;-5.53361545782536;-9.38733319286257;7.35205564647913;-9.09459216054529;-4.77839151863009;1.54214700683951;-8.95378019660711;7.99804591573775;-4.62034357711673;6.1528013413772;3.43706391751766;9.69401543028653;8.70277454145253;7.86302651278675;3.74956210143864;-7.89424253161997;0.960950683802366;2.6041183527559;-1.69067610986531;-4.41504944581538;-3.01977816037834;-6.41451691742986;-6.49767054244876;-9.22603278886527;-8.25192264746875;-0.520512103103101;-8.08141904883087;4.14975757244974;-7.1418173564598;-9.82927437871695;-0.115757710300386;-5.580746200867;1.66495450306684;-6.04089539032429;6.03171671275049;7.43860245682299;2.71880173590034;-0.509598175995052;6.87110791448504;-4.90721886046231;-3.6128058983013;6.62097443360835;6.01485115941614;3.58575295191258
+-0.623623509891331;-4.70445264596492;-0.166210485622287;-2.80830771196634;-4.68588944990188;-7.74246557615697;-0.39785266853869;0.108013479039073;8.94595441408455;-8.18652064073831;-8.01955088973045;9.42617224995047;-0.690835048444569;4.33169636875391;7.98758657649159;3.70473424904048;7.94311464298517;5.86305781267583;4.89389355294406;9.4526179600507;-3.95877537783235;7.48304290231317;5.93263875227422;-2.25602917838842;5.11899677570909;9.73343981895596;7.91166257113218;8.75578843057156;-4.52680201735348;-4.8306071665138;3.34447095636278;-2.04755787272006;-4.70680868253112;-9.56305187195539;-0.697575444355607;7.26221247110516;-2.77843256015331;-5.59578961227089;-9.76378528866917;-2.09408446215093;-4.67677154112607;9.71905020065606;-1.38788050506264;-8.34421751555055;7.67306808847934;3.87383313383907;-9.79257558938116;6.18326647207141;2.57582517806441;5.29078590217978
+9.56758018583059;-9.97940706089139;6.07915934175253;4.70161586534232;-8.01795999519527;6.59562956541777;-1.36546249501407;-2.45388432405889;1.66900666896254;-3.50823249667883;1.64123731665313;-9.21717223711312;-7.17852905392647;-9.31798371486366;-4.68099418561906;-6.69020929839462;1.62639948539436;-4.57839431706816;-2.41342678666115;5.55631524417549;0.426935562863946;-5.16342213377357;-1.081721666269;5.44555953703821;4.16686878073961;-5.84341147448868;-3.56657513417304;8.94180291797966;7.12474199477583;-8.97931499406695;-0.158083136193454;2.93745786882937;6.6567892068997;-5.58841039892286;-2.71589668467641;7.49168962240219;2.66950196120888;6.1505338922143;4.72540596034378;-5.23278244305402;8.37725587189198;9.05841097701341;0.33499856479466;6.43686454743147;7.36209424212575;-8.14983690623194;-9.01179099921137;-5.50814356654882;-5.74135868344456;7.84542412962765
+-8.11621478758752;5.0570728443563;7.85974203143269;-7.23622140940279;-4.39685625955462;-6.15423948038369;-0.119104362092912;4.73688066471368;-9.18998572975397;-2.06550145987421;2.38206949084997;9.08877089619637;-6.02906052954495;5.76419284101576;-1.41243915073574;3.85415309108794;-5.51838518120348;3.67024926934391;-7.54912348929793;6.7516977712512;-3.33282585721463;1.43246228341013;1.8622886762023;-1.6853960044682;-5.81563600804657;-0.533030047081411;-2.31989202089608;-3.35756331216544;-5.99790034815669;-7.51444650813937;0.90159825515002;5.28528802096844;6.56954290345311;-3.25907463673502;3.87271403335035;-9.64368193410337;8.53224963415414;1.71334250830114;-8.72193491552025;-5.47142012044787;2.26883907336742;1.94672846700996;-2.23262426909059;1.90536370035261;2.72422062698752;9.38590216450393;-9.38570089172572;-1.92977998405695;6.4164771605283;1.42801257316023
+-1.49343525990844;4.75699068978429;-2.97171449288726;-5.50333723425865;-9.33995778672397;5.92078695539385;9.57754138391465;4.07081151846796;3.87981420382857;-0.300040291622281;-8.42576669994742;6.85497744940221;5.0919244159013;7.67156573012471;-3.80572286900133;-7.07522415090352;-8.01710911095142;8.7248011585325;-4.18310130946338;-2.58380705025047;-9.82257118914276;5.99701995495707;5.96035694237798;6.0035197949037;-3.6685677152127;2.65024381689727;1.46409966982901;6.48602719418705;-3.14937876537442;-2.83261779695749;2.08443106617779;-3.79225950222462;8.26517930720001;-0.997222559526563;6.9936422072351;3.28620308544487;4.98736918438226;-3.93511638510972;5.40512185078114;-4.94671603199095;6.76755408290774;3.37079979013652;1.10543148592114;-1.16840434726328;-4.16703861672431;-9.31744928937405;-3.39056121185422;-2.18122433871031;9.32587375864387;4.88737859763205
+-4.8883317084983;-0.211850274354219;-4.78062395937741;7.39102026913315;-7.68393334001303;1.6447317134589;-1.20398910250515;0.404231962747872;-2.13459057733417;-4.99079247005284;2.7639606082812;6.66603040881455;5.03329851198941;-3.79905038978904;-8.60932225827128;1.64218329824507;-9.30384042672813;9.86582613550127;-0.884803947992623;5.25329104159027;-8.03659643046558;-2.99820674117655;-6.319973571226;3.36149439681321;9.34901864267886;-0.807972904294729;-9.77867828216404;-3.44294508453459;1.14998618140817;4.32901110965759;-1.77279409952462;6.66934166569263;6.41287064645439;2.22841633483768;6.95154365152121;-8.67307546548545;0.681033227592707;5.82253693602979;-9.54200433567166;3.04542462341487;-1.09840464312583;-2.58765481412411;-6.71184905804694;7.55641326773912;4.37370973173529;2.75149444583803;-6.29532531369478;-6.76255785860121;-4.88280536606908;-2.97702243085951
+7.16604243032634;-1.41757050063461;-6.76948918495327;0.588635168969631;3.12288450542837;-5.83258273545653;-8.56447088066489;-0.611732639372349;-8.70007551740855;-9.50427914038301;-6.34349363390356;1.52535633184016;-2.77314032893628;3.17530858330429;-8.41122891753912;9.35447541065514;1.62160587497056;-3.13680839724839;-9.92041741032153;5.40465913712978;-3.96305748727173;6.52009481564164;-1.21086929924786;2.53232198767364;3.59790042974055;-3.9507598336786;8.41104035731405;-7.86249335855246;1.58453160896897;8.42966565396637;1.2445120466873;-9.12766779307276;7.57679098285735;-4.9527494981885;7.2988043865189;4.04472530819476;-4.88163129426539;7.66449701040983;6.04567062109709;6.61798760294914;-6.87836715020239;-6.6302471794188;3.24854924809188;7.98440180718899;-3.96392052527517;9.89427550695837;-6.71274041291326;-4.88433759193867;9.93674933444709;6.85329139698297
+-2.9897689120844;-7.66080080065876;-9.82010369189084;-9.94472322519869;-9.74108290858567;7.43822222575545;8.69996895547956;-9.61664034053683;-4.06280619557947;-9.91089176852256;-7.29239944368601;-1.34975153021514;-6.30612638778985;-9.94059149641544;1.36137312278152;5.48505709972233;-8.51911158766598;4.17825089301914;-3.40451462659985;-0.334759256802499;-4.85319584608078;8.92252004239708;0.583983650431037;-0.468778726644814;-3.13092159572989;-2.41926136426628;1.75728084053844;9.35676401481032;3.85012946091592;-3.25980240944773;-0.505193173885345;-2.95777581166476;3.53399305604398;-0.0563488295301795;0.493103046901524;-9.49669384863228;7.22149929963052;1.91134665161371;-7.70913070067763;3.99135289248079;9.43481113296002;9.15261505171657;-2.57165221497416;7.04018985386938;-9.84480943996459;7.86017573438585;-6.61825221031904;2.04131052363664;-2.74821265600622;-4.38138500787318
+-5.71790605783463;5.35688389558345;5.86972198449075;8.69607850909233;-2.92939694132656;-4.16020388249308;-6.45236130803823;-4.54609876964241;-7.23582490347326;3.54564569890499;2.8445062180981;-6.92807871848345;0.503315823152661;0.605273558758199;0.00690480228513479;0.551357823424041;8.91903375741094;-2.58365475572646;0.375435696914792;2.01474169269204;5.60280693694949;-9.5194531371817;-3.36625447962433;3.68671867530793;-7.83178000710905;7.66155876219273;-1.3680913625285;7.59704615920782;0.0427042925730348;-2.46163073461503;1.76355461124331;-0.103497942909598;4.47345491498709;-8.08270305395126;3.59882523305714;-6.81572507601231;9.03345405124128;-3.82726813666523;-7.71685764659196;-1.94530359935015;-5.11601604986936;-0.329233701340854;4.10813175607473;-1.37319125235081;-2.30357343796641;2.04049892257899;5.66816307138652;5.49024468753487;-0.848308559507132;3.44279074110091
+-2.56809388287365;-9.85932882409543;0.0249091256409883;3.72920040972531;5.11656710878015;7.6730122230947;-9.57498245406896;9.44261365570128;7.47577882371843;-9.45569972041994;-4.06787052750587;8.60675425734371;2.24882948212326;-7.42206788621843;3.62512222491205;-7.50226194038987;9.05195349827409;8.88173265382648;8.77285787370056;9.4146457221359;-1.11248928122222;-5.42417121119797;-0.0823469692841172;7.52239372581244;7.87842808291316;7.71145073696971;4.53794018831104;-1.23630180489272;8.24717667885125;-2.53159935120493;-3.19910218473524;-0.465044523589313;-2.5457836035639;-5.94904254656285;-0.353405484929681;9.91814009379596;6.54659283347428;-3.70523381978273;-1.8008789094165;2.4985323054716;5.3978058276698;1.54026869684458;0.357379862107337;-4.79188160039485;-8.54773080442101;-9.8150230338797;-9.7088626679033;-3.27258340548724;-4.36727583408356;8.43146437313408
+-8.51391274016351;-2.96506328973919;-5.84841376170516;5.11368956882507;-5.78916967380792;7.47483239509165;-7.30356042273343;3.15872349310666;-7.66966140829027;-5.45432413928211;2.81372224446386;-6.69676554389298;-2.36514313146472;-9.73603751510382;5.74963155202568;-4.32630913332105;2.42507983930409;-3.02633812185377;4.14591151755303;3.19921696558595;1.80773281492293;-5.28296536300331;-6.74118642229587;-0.367022771388292;6.15719215013087;-9.4998254487291;4.17782797478139;-2.05885622650385;-9.82614876702428;-5.34203098621219;5.90663083828986;3.84394369553775;-8.84406769648194;-2.93557896278799;5.7335139811039;-1.43640536349267;0.984109835699201;-2.12668252643198;-1.20188327971846;6.56793628819287;5.19290394149721;4.01222863700241;7.14335937984288;0.0328461173921824;4.29212857503444;2.68488798756152;-5.27218044735491;9.48427015915513;-8.25333390384912;0.618718359619379
+7.94718282762915;-3.30737337470055;5.44203070923686;1.78788180463016;-2.08242425695062;-0.82344095222652;8.24899414554238;-7.45866999961436;6.98712789919227;2.74613333866;5.75370097067207;-8.32663762848824;-1.19306060951203;2.35745889600366;1.86612876132131;2.02466882299632;-6.6237538959831;-8.48377518355846;3.60563549678773;-4.78441413957626;-9.4654355943203;-9.39642613753676;2.9494576761499;7.35961393453181;0.897669829428196;-8.51045117713511;9.39881348051131;9.64288896415383;-2.78482221532613;-3.76202760264277;-6.40073756221682;-4.46743075270206;-4.42809059750289;6.88588298857212;8.07309789583087;2.85596635658294;2.25693224463612;8.55233104433864;-4.86258537042886;-8.21254170034081;1.93334060255438;-6.16557371336967;-3.65501959808171;0.480977497063577;9.28457754198462;-4.48172679636627;0.848144600167871;-0.30663616489619;1.00820258259773;-1.95729444734752
+-1.12181774806231;4.71165293361992;9.68202261719853;-8.70633504353464;7.29478360619396;8.09392159339041;8.98349532391876;7.11520899087191;-8.27564097940922;-8.61109174787998;4.23540493473411;6.42242084722966;-0.146580734290183;8.13702854327857;5.18827351741493;0.599929890595376;-7.56182725541294;-9.91077422630042;-3.96480510011315;-7.09557519294322;-7.24036346655339;3.68707227520645;4.16183582507074;-0.474082231521606;6.6314813029021;-5.17944993916899;-6.64404936134815;5.14880875125527;-7.2314644837752;-7.63704332057387;-9.59129150491208;7.95655273832381;-1.50385643355548;-6.56893932726234;9.97739696875215;-3.09758025221527;-3.48088608589023;0.61227785423398;-3.61655151471496;-8.9626623224467;-7.23655032459646;-3.7026597885415;-0.467815711162984;-0.0306342262774706;8.3263913076371;-9.00984680745751;7.82072035595775;-8.75097704585642;9.99541852157563;-3.63800574094057
+7.89245452266186;2.51036514993757;7.75983864907175;6.05175707489252;-8.25068082660437;-5.99768362473696;-9.4382698694244;-7.15310583356768;-9.28573449142277;0.636927955783904;-1.01566868368536;6.76332386676222;-9.3603436416015;-9.69915464986116;-1.70015484560281;0.559830344282091;-2.49798674602062;-2.10294104646891;-0.716064148582518;8.28729986213148;-6.03726006112993;-3.76405553426594;6.00690367165953;7.32065521646291;7.80532889068127;-2.40318783558905;9.26499746739864;3.27043159864843;-6.33020353969187;1.79938823916018;-1.36250032112002;8.66010834928602;4.9906805343926;-1.02923723403364;8.74784462153912;9.78333008941263;4.56177536398172;0.943346354179084;-7.38879073876888;-6.79731824435294;-8.34142121020705;4.83800846152008;1.80807555094361;-2.06675613764673;8.84733838960528;1.47846925538033;-5.00846911687404;2.95120015274733;7.27678569965065;0.193319674581289
+-8.9206091593951;2.84452999942005;-8.28821156639606;6.91393417771906;-2.77691016439348;6.7346290173009;-4.55175919923931;0.860671722330153;-1.99002710171044;-3.35090624168515;-1.13911453634501;6.80301684420556;0.0339894834905863;2.75203232653439;-9.62815971579403;-3.90661644283682;3.87810005340725;9.52700214926153;1.03502041194588;3.91203133389354;2.83035803120583;-6.91057770978659;-2.27485264651477;8.70265702251345;-9.93387368507683;-0.161721417680383;-0.0393130909651518;-1.09058049041778;-7.8960529435426;3.37100561708212;0.733358566649258;-6.78887630812824;8.09489744715393;-9.92927260696888;2.82338567543775;-4.25427901092917;-2.6199600379914;-6.9715547002852;-1.33424779865891;5.31064122449607;3.52571927942336;2.54493581131101;-3.30979688558728;-3.34598369896412;-3.13182070851326;1.1322255153209;1.21394130401313;9.45761893875897;-2.78228453360498;5.76871737837791
+5.99502488039434;6.22828561812639;-0.680591883137822;1.09449432697147;8.86983006261289;-2.2261479916051;6.02698366623372;-6.1535144969821;2.81459123361856;-3.06592823006213;-8.75936943572015;3.46024656668305;7.23300481680781;-2.92493070475757;5.70426419842988;-3.93732030875981;4.26312459167093;-8.16037893295288;-8.26546239666641;5.89915780350566;4.82986521907151;6.101453313604;3.60065375920385;6.81502480059862;-0.489160832948983;4.81957164593041;-9.79526793584228;8.56430793646723;9.45055678021163;1.62589379586279;-6.13198310136795;-7.34379832167178;1.23172259889543;-1.06355838943273;-6.34649143088609;6.16154406219721;-4.16995244566351;-4.59447091910988;8.78772267606109;6.80230668745935;-6.20415731333196;0.455496711656451;-4.30038240738213;8.43167995568365;2.78505173511803;-6.72329601366073;5.40276675950736;-7.78687880374491;7.74638138711452;-1.53704123105854
+4.86732064280659;5.91052974574268;-6.40852503478527;-7.89693703874946;8.17324349656701;-4.2924782494083;-3.6605364875868;-1.01681438740343;0.0934193003922701;-4.78387591894716;-6.10556273255497;-3.46239224541932;-9.95392384938896;-6.79081581998616;-6.78481423296034;6.75500924233347;-7.00164869893342;4.00987530127168;-9.84022695105523;3.45687629655004;-6.41832673922181;-9.40436818636954;-2.20305510330945;-4.26909246481955;-4.8069503204897;5.43418534100056;-6.88791730906814;1.97824918199331;2.33668406959623;9.6295473864302;1.93693857174367;7.46066854335368;-4.87757281865925;6.92906916607171;-5.1622962532565;-5.13023678679019;-4.66204381547868;4.75612418260425;-0.871482095681131;-6.12426439765841;-2.0016355952248;-5.45273571740836;-1.58058820292354;8.99661986157298;8.70799627620727;7.16743976809084;-8.57798557728529;9.03557957150042;-9.53951785340905;-8.79133679438382
+4.74188090767711;-6.65597233921289;-6.47133667487651;8.3553625177592;-7.15806649066508;7.01818962581456;-1.88049746211618;2.07487216219306;8.75765956938267;-3.82010160479695;3.91083471942693;-7.1915373718366;0.538025111891329;-4.78455728385597;1.63009005598724;-4.32849344797432;-8.88401072006673;5.7834510365501;-3.63842898979783;7.15370271354914;-0.64489480573684;-1.26907341647893;-4.34520571958274;1.62814259529114;1.65270195808262;4.52234840486199;-1.16160937119275;-3.84998565539718;4.56671433057636;-5.37888950668275;9.74916609935462;-4.69350897707045;5.62937404494733;5.88784463703632;8.57865821104497;0.100286775268614;-4.7167591098696;-0.322843356989324;5.53564711473882;-5.60036451090127;5.33858974464238;-3.35589336697012;4.62991579901427;-9.01021199300885;-1.36112819425762;7.72845009341836;6.80246408563107;-9.8499970138073;1.60874316934496;-0.404610158875585
+2.53495121374726;3.49807751830667;-1.38193160295486;0.878368401899934;5.35511773545295;-7.9109781049192;-0.359326894395053;8.45584474969655;7.83979426138103;-6.59457494970411;2.99120002891868;1.26604196615517;7.17518330551684;-3.42993800528347;-6.21312699746341;-3.12263160012662;6.7829580930993;-0.54490502923727;-1.65036883205175;1.31852483376861;7.07563559059054;1.1283080978319;8.40835514478385;-4.83921650797129;3.29763387795538;2.75881771463901;-3.56367575936019;-2.35129713080823;-3.36980833206326;-9.14517290424556;-4.01366611942649;-9.29863329511136;5.23246760014445;-6.97801535017788;-4.26217185799032;-7.82863946631551;-7.51436424441636;2.05814913380891;1.11576593015343;0.0799104757606983;-2.96441030222923;8.16960684489459;-6.37398056220263;9.76035920903087;-1.32970710750669;-2.14799136854708;-8.32034746184945;6.61223362665623;-9.00344949681312;-1.76086214836687
+8.59070560429245;4.64303413871676;-3.5264164628461;-9.63876494672149;8.75216672196984;0.5767293414101;-9.06689652707428;-2.34722666442394;3.26677539385855;7.41497586015612;-2.0766855077818;3.34821577649564;-5.48211031127721;7.72983390372247;-0.377031369134784;-3.58905838336796;1.26608576625586;-1.3185391202569;6.92063398193568;-9.42390974611044;-1.88434407114983;-0.0389173207804561;5.4371102899313;-7.67804926726967;9.57565387245268;9.79213737417012;5.08908208459616;3.62567762844265;9.96195533778518;9.60568392183632;2.22387095913291;9.74220988340676;-3.2250403566286;1.80076894816011;2.80407750979066;-0.966656603850424;3.22464642114937;8.09097690042108;-7.65738395508379;7.72553388494998;6.22766889166087;-2.44050608482212;9.7412530425936;2.74971497245133;-9.8200703272596;3.42076507862657;6.27034530043602;-8.45489498227835;-1.75638917833567;-1.45173881668597
+-7.55510824266821;-4.05226785689592;-8.46944477409124;-7.44432581588626;-3.72307337354869;8.57197809033096;-6.76373870112002;3.85703951120377;2.93342122342438;-5.42574554216117;-4.37970974948257;-0.109753916040063;1.49474548175931;3.83537199813873;-4.64304187335074;-5.01841280609369;0.850754273124039;4.62905308231711;9.84040515962988;-6.75228084437549;-5.94231522176415;4.81784577015787;7.82765791751444;2.20599657855928;9.47943292092532;-1.32826143410057;1.37459236662835;-8.95143279340118;0.841090553440154;-9.05427529010922;1.52571597602218;7.2166850278154;-2.35347273759544;-1.08993409667164;-8.04128687828779;-0.585844130255282;-7.09883810020983;2.86779824178666;-2.7976137958467;1.71891046222299;-7.93394335079938;-3.6191345565021;0.0695816008374095;-1.05379871558398;-1.23123410157859;-4.43299329373986;4.1030779434368;-0.559596684761345;3.53785188402981;-8.00376379396766
+8.82649006787688;-9.20906350482255;0.325927729718387;-7.28792765643448;-9.67309590429068;-3.64452245645225;-7.53642846830189;0.385561012662947;6.83836167678237;-0.797065054066479;-2.27481397334486;-1.69788770843297;-4.7544498834759;0.845495387911797;-5.04966400563717;8.89105378184468;3.94694234244525;7.84769481047988;6.3553066086024;-4.52060542535037;-0.601997971534729;-3.92239920329303;-4.68814271967858;-3.4471552586183;6.32695669773966;4.95933212339878;-5.76173460576683;-1.89982394687831;-6.66493751108646;-0.464448933489621;3.50168023724109;-2.08320326637477;-2.34592954162508;7.39796250127256;5.08821941446513;2.12965016253293;-6.8371368246153;-7.23144539166242;2.9369526123628;4.67972092330456;-3.22976267430931;-7.09811336360872;-5.6060827197507;8.02057474851608;3.91100723762065;3.03663491737098;-9.02060676831752;-0.470437286421657;-0.0157075095921755;4.47726119309664
+-7.88221014197916;-0.298085412941873;-6.99524151161313;-6.19228637777269;6.6139682661742;8.42973092570901;-3.27877222094685;9.25872318912297;4.71705415751785;4.94468008168042;-7.30284357909113;3.12980266753584;-9.17334706988186;7.51543523278087;4.58924116566777;9.74675798788667;-0.757985687814653;-9.48760035447776;-2.03398765530437;8.13195711001754;-2.03232600819319;5.69795960560441;6.08172502368689;2.2989723039791;5.00026321038604;9.31553744710982;-2.04420228954405;2.83088357653469;7.037871517241;-3.22991915978491;-9.37548839487135;9.15990571025759;-4.27550952415913;5.75550771318376;-5.06459732074291;6.91289002541453;8.23896185960621;-1.12182468641549;7.11189089342952;-9.18824827298522;9.33021860662848;6.28013634122908;3.42599566560239;1.97886774782091;-5.06174432113767;-6.72880216501653;-5.45353352557868;7.22435439005494;1.24044981319457;6.05068526696414
+5.53793372120708;1.39380327891558;-2.88770580664277;8.55697140097618;8.1587625015527;4.06480320263654;1.12433072645217;-0.797029179520905;9.47740622796118;-8.94996948540211;4.12934850435704;-6.5073189791292;-9.0064352331683;6.07936593238264;5.04529451485723;0.705368830822408;3.87987399939448;-8.64793461747468;5.14611533842981;2.57207640446723;4.41719588357955;-9.34219762217253;5.49960151780397;-3.09555389452726;3.55876644607633;-9.84891472384334;0.301669239997864;4.69281562138349;0.0434418162330985;-7.95866712462157;2.68098099622875;5.10830444749445;-9.25789934117347;-5.86844364181161;-8.74670451972634;-8.84602655656636;8.68230276275426;-7.03068880364299;-3.1851365743205;0.155002945102751;-4.02334615588188;3.05739392060786;5.08897490333766;2.63357321266085;3.54662192985415;-8.10055195819587;-1.36501204222441;-5.33861299045384;9.26466718781739;5.96073275897652
+7.64502575155348;-4.12700312677771;-4.76754215080291;-1.38044374063611;1.28771326970309;-4.14971057325602;8.85822052601725;9.42520892247558;3.01214323379099;-4.35082443524152;7.14760513976216;9.23496279399842;6.68521089479327;0.667698476463556;6.469467850402;2.69303062930703;-7.12197645567358;-0.129223326221108;3.39648094959557;2.12424989324063;-3.16603377461433;-8.20345265325159;-5.622170092538;-7.3059078771621;8.92854413483292;1.52211813256145;3.86238354723901;-6.41392834950238;1.32465331349522;-7.62994586024433;7.11237808223814;5.03404103219509;-1.61152421031147;2.87437895312905;2.5618775608018;-1.49258923251182;-7.82290188129991;-1.27729704603553;-4.39047310966998;5.79288036562502;9.03927858453244;-1.95875682402402;-4.63042743038386;-8.14277360681444;0.964936930686235;-3.85788358747959;-2.11597292218357;-0.321984272450209;6.38938677031547;2.80768275726587
+-0.81368294544518;1.95784389041364;-6.10331403557211;-7.20027423463762;0.700089856982231;1.94193148519844;3.24658365920186;1.6978986049071;-2.37222754396498;1.88102996442467;-5.32073812559247;-4.72114922013134;-2.11240594740957;2.27773518301547;-2.62059896718711;8.62282339949161;9.76881930604577;1.23830833472311;-5.29417823534459;-3.44819477759302;8.01228578668088;-6.89360428601503;-2.24520915653557;-7.51496486365795;1.27853149082512;0.290035353973508;-3.77792796120048;6.07092661783099;-4.84232302289456;3.67620054632425;-9.70522412564605;0.835944614373147;2.22609678748995;-5.61790818348527;-9.54996341839433;-3.21432260796428;1.31426815874875;-3.03057582583278;-8.74047038145363;-9.91036786232144;-1.49523952044547;1.73995968420058;-1.18951784912497;-4.64512207079679;9.66470275539905;-8.84676475543529;-6.63127190899104;-0.550642898306251;-2.44336794596165;3.26580839697272
+3.15447240136564;-3.1963386433199;7.02405348420143;7.04466226976365;-0.45760553330183;-6.79985712748021;5.26138607878238;-0.813477127812803;2.77676986064762;1.5649137692526;4.01607820298523;-9.33215011842549;6.06129611842334;8.70029578916728;6.08740785159171;-1.86893987935036;2.41131436545402;1.03798003867269;-1.37451505754143;-9.19706561136991;3.81529469974339;-7.09610770456493;-9.36465247534215;7.18480780255049;4.94715091306716;-7.35988158266991;9.8829529248178;-9.90588113199919;5.49715080764145;9.08089912030846;-1.57102320808917;-8.07608189061284;-7.80156546272337;-1.66149453725666;4.62889446876943;1.95115807000548;-6.76954560913146;7.65719733200967;-6.44583738874644;6.84809767641127;-6.09757526312023;2.94110630638897;7.22879364620894;1.49317448493093;-2.05758109688759;-7.37762192729861;6.38912876136601;0.914225918240845;8.23493148665875;0.693702925927937
+2.88287016563118;3.48468493204564;9.38632683362812;-4.75943609140813;-7.67120397184044;8.63012614659965;3.46168364863843;-9.22588005196303;-2.98566811252385;-0.245637092739344;6.16077087353915;-7.81493296846747;2.74236247874796;-7.19338290859014;-0.97842515911907;-4.88050881307572;-6.18717443663627;-5.35036964807659;6.97451424784958;4.77068027947098;2.20785125624388;6.29350261762738;9.44920927751809;3.6352401226759;5.24196971207857;5.77454000711441;-4.53225224278867;0.77063855715096;-1.26279471907765;2.41604559123516;5.6109838699922;-3.1292087584734;4.820696557872;-2.81385651323944;2.51280345022678;1.20768278371543;-7.48147576116025;4.90958854090422;8.18410711362958;-5.33989242278039;-0.635218732059002;-0.752834719605744;1.81269255466759;3.40501999482512;2.9416597308591;-7.02790317125618;-1.24220044817775;0.904062478803098;9.34805035125464;0.135588701814413
+-8.01540955435485;4.5064777508378;4.805200076662;5.6151045113802;7.26892073173076;6.76949971355498;3.64899952895939;-8.31305658444762;8.26574877370149;6.90136838238686;6.03632636368275;9.02863113675267;-4.41204419825226;-4.02743422426283;1.01520324125886;9.80418410152197;-1.83304108679295;6.76850588992238;9.62998501490802;-0.576242208480835;-7.87361384369433;7.89411603007466;4.00851529557258;-4.64396314229816;-3.21816065348685;3.87013769708574;5.96482357941568;1.72373935114592;-4.528101333417;-8.75136823393404;3.32838837057352;6.60893698222935;1.02899536024779;-8.26691837050021;7.93900053948164;4.54534764867276;4.89516806788743;-8.42719566076994;4.17100512888283;-7.24960573483258;-4.5272343698889;-4.65198566671461;2.21761337015778;0.867439433932304;-5.76858965214342;-9.04059366788715;0.179995675571263;-2.62135375291109;2.46167166158557;7.79551742132753
+9.41763775423169;6.24472396448255;1.91554664168507;8.97380054928362;7.17832291964442;5.02888627815992;-4.34073326643556;-6.68334860820323;-9.96807305607945;7.16759256552905;8.27568534761667;2.88288130424917;4.58724866621196;-6.79523810278624;-5.74901788495481;3.22836168576032;1.11773445270956;5.10828180238605;-9.88431707490236;-9.59029931109399;8.09749137610197;3.65731302183121;4.30669906549156;0.331426565535367;-4.32960664387792;-3.26440036296844;-4.20041137840599;-2.596485754475;-8.81357689853758;-9.3388121528551;8.7182873301208;-7.98104760702699;-7.28907284792513;8.22269257623702;2.30340962763876;-2.60702661238611;0.151186101138592;6.89190596807748;2.69723683595657;5.71461303159595;-9.6875613508746;8.20696467999369;-3.25879409443587;2.06531906034797;4.10797224380076;-0.779500994831324;5.74796469882131;3.56084072496742;5.79378932248801;-6.18365133646876
+0.947227156721056;9.92548175156116;8.18487363867462;-8.28567575663328;-8.17274506669492;9.45431906264275;2.91663221083581;-3.72611258644611;6.39825499616563;-1.94396551698446;1.90260530915111;6.45940804854035;4.68737086746842;-6.55928468797356;-3.81910098716617;2.33146529644728;-8.56976830400527;8.68725304957479;-5.97553556784987;4.26039827056229;0.774759794585407;-6.93149731028825;7.81683984212577;-3.83265746291727;-1.82360089849681;-3.86448997538537;7.16560726985335;5.02178324386477;-0.337578728795052;6.64274689275771;1.45240859128535;4.63251922745258;-5.85941527504474;-4.61014056112617;8.70899222791195;-3.36950816679746;-5.14754912350327;0.0948651134967804;-8.10533760581166;8.92916787415743;2.46517062652856;7.15390225872397;6.23628649394959;0.107151106931269;-3.4417914506048;5.40715578943491;9.02729232329875;-3.54316443670541;-8.64749174099416;2.61032172478735
+7.5297148199752;-5.90907148551196;8.52867572568357;-7.02972650062293;5.84005551878363;9.88288041669875;6.40367341227829;1.65122729260474;-0.0796619663015008;-2.65194510109723;-7.08142191171646;8.32100134342909;-9.20596856158227;4.70292401034385;0.681368187069893;-5.2473213756457;-7.46752290055156;8.43179099727422;-4.38122631981969;5.95802613068372;6.43421316053718;-7.78748981188983;1.32804025895894;-8.63443123176694;2.56081323605031;8.52989992592484;-2.01305299531668;8.45677931327373;-4.39140548929572;-7.30806006584316;-1.30682557355613;-4.40495588816702;-0.66371729131788;6.67138367891312;-0.0840134266763926;9.74778834730387;7.50012032222003;7.44655998423696;-8.82446318864822;5.99334392696619;7.71115825045854;6.68522032443434;6.16877499967813;9.21358064748347;-5.78250619117171;-3.03591842297465;7.06571624614298;-5.28671209234744;-1.74862056039274;5.9956770716235
+3.94855330232531;-6.27801774069667;-0.341800283640623;-5.44539473485202;0.301919728517532;-0.129577242769301;6.02621331810951;-1.91095087211579;-9.50250397436321;2.54336910322309;-9.14305586367846;0.977928773500025;-4.78747677057981;-4.6495933458209;3.03481502458453;4.69625399447978;-8.19904777687043;-5.18448456656188;-8.10640260577202;-7.69465442746878;5.21765874233097;9.37514339573681;-1.67834052816033;-0.652907202020288;-6.94855611305684;-4.60938068572432;3.53244685567915;3.9927041484043;-2.25157784763724;4.03087308630347;7.72096796426922;-1.59566354937851;7.9332694131881;6.42400247976184;-7.38206772599369;-1.36830838862807;3.53916783817112;4.62848441209644;-5.59204350225627;0.0949912099167705;7.14470965322107;1.20812741108239;-9.13252626545727;-1.90477718599141;3.42486371286213;7.98743918072432;6.90944929141551;8.74085192102939;8.65550321061164;4.5616489648819
+0.196191784925759;-1.1131964949891;-2.31887477915734;-6.96069803088903;3.99772690609097;-7.34759088605642;-0.826713456772268;7.71030681673437;1.47829948458821;8.4803326940164;-9.84429683536291;-5.05180222447962;-9.19717570301145;0.0623977836221457;-4.2078874912113;-8.16898175980896;-4.17373089585453;7.81140649691224;-6.48322398774326;-7.65357401687652;-9.58667530678213;0.828552283346653;8.08019505348057;1.939443256706;-5.68195681553334;-9.19873657636344;-5.89994497131556;-3.80131133832037;7.98414011020213;7.38923156633973;9.89329090807587;9.74365190602839;-8.73158735223114;-6.44804376643151;6.68001781217754;0.656113545410335;-9.29192056879401;-6.26327028963715;1.44404149148613;0.85711345076561;-2.25082904566079;7.11211734917015;7.93495330028236;-1.96082395967096;0.246588946320117;9.17603645008057;9.79209084995091;-8.72019011992961;1.05583598371595;0.878927730955184
+5.98236089106649;7.71176424343139;-2.12018561549485;1.94419323466718;-3.01156632136554;9.35049200896174;4.82913864776492;6.39599019661546;6.1802611220628;-9.29984886664897;-6.45879538264126;7.61196602601558;3.75188122969121;3.11095239128917;7.1987618971616;9.64104761835188;6.0272665694356;7.92184451129287;-1.49510096292943;-4.00107925292104;3.81368038710207;1.51539119891822;-1.03351158089936;-5.66273770760745;9.03425266500562;6.03222625330091;3.92575482837856;5.33831739798188;-3.167764400132;-9.3390917731449;-3.80648204591125;8.57960453722626;3.8083083787933;4.69547235872597;-6.28852539230138;-8.88577844947577;-5.42228173930198;-2.60332296136767;8.01014157943428;3.90384714119136;5.24391589686275;-2.0895324787125;3.90956838615239;9.05573742464185;-0.948056341148913;-2.14966357685626;-7.65748802572489;-6.58326540607959;-3.51653407793492;6.27935248427093
+7.59511317592114;3.51607027929276;3.37642766535282;-0.719295982271433;-9.70511645078659;5.02827357966453;-3.2842931477353;5.93309335876256;0.352599774487317;9.289555773139;-8.56663505081087;-5.70290315430611;9.60537631995976;7.63199700973928;-4.11798128392547;-8.98468430154026;-0.689846146851778;-9.71872158814222;-9.77861385792494;-7.90598839521408;-3.11819458380342;-3.07904437184334;8.48744599614292;-1.70458458829671;-7.47186656109989;4.26289190538228;5.79235349781811;0.439276173710823;3.92934147268534;0.424896334297955;-9.13889926392585;7.84178737550974;-7.02761561609805;-3.71449577622116;-9.2688930220902;5.99897452630103;-4.14324998855591;9.16529704350978;1.24440661165863;-5.12962541542947;-4.72526430152357;-6.40715467743576;7.95117756351829;-6.29125093575567;-2.61407724581659;-0.602988847531378;-8.56954963877797;-2.58539931382984;2.28525106329471;-4.52433341182768
+9.43134347442538;9.1542839910835;6.13647624850273;-9.38623803667724;-6.8035674886778;8.14084000419825;-0.732498290017247;6.96429990697652;2.70796328317374;1.50010556448251;2.24621898494661;8.14452734775841;0.160052580758929;8.95262165926397;6.38813979923725;-1.67775083798915;1.81270621716976;-8.82866952568293;6.57054343260825;-9.3312627216801;9.33067517355084;3.07909613009542;1.32566312793642;-9.3902226164937;8.65741995163262;2.51507873646915;-6.71872619539499;2.22711252514273;-7.29310043621808;8.67387610953301;1.96950415614992;9.04532562941313;1.40586344990879;5.32689515035599;-7.47245952486992;-0.395275084301829;9.63849470019341;-5.23402236867696;7.86872649099678;-4.17118997313082;-0.168893286027014;9.17053323704749;9.11005074623972;2.48756076674908;9.2557518184185;-7.57612152025104;-3.73447528108954;3.16528449766338;-4.23075961880386;4.73816198762506
+-1.59191705286503;-2.54696560557932;-1.70788002666086;1.34477977640927;-1.60588799975812;2.82918409910053;5.12614805717021;-2.3403711616993;-4.34693345800042;7.88324889261276;-9.14866235107183;-6.43856486771256;0.00492434483021498;-3.4649616247043;-9.22093203291297;-2.65846100635827;8.7889091251418;-5.59807025827467;4.02450872119516;-7.27078306954354;-1.57721798401326;-5.94131277874112;7.61400102172047;2.47624912299216;-0.350982556119561;-8.4203256200999;9.7217182116583;5.17775582615286;3.87116133235395;9.75780936423689;8.22618580423295;-6.95932735223323;4.16823486797512;9.64103942271322;-6.05024878401309;9.9330934509635;6.76281602587551;5.9559299563989;-6.79840042255819;-1.25659896992147;9.1194940218702;4.35728271491826;9.29887417238206;8.59560882207006;-9.06144586391747;-2.13433771859854;-6.02634951937944;-1.01182665675879;9.4169505732134;-7.97864945139736
+5.68409119732678;5.35605769604445;-4.12972067948431;5.0954502960667;4.4684939365834;-7.65595036093146;-9.45584606379271;-1.25750120263547;-7.74229896720499;1.71782299876213;5.02792886458337;4.24019599799067;-7.10544417146593;9.37249805778265;-7.85522937308997;-7.12138461414725;-3.23372145183384;-3.1233029672876;7.11773424874991;-0.460396413691342;-4.25498497206718;-8.31788174808025;-4.04179822653532;1.55949757434428;-0.159165924414992;-7.69773832987994;-6.1785849975422;7.08199937827885;-4.45654181297868;-4.51472556684166;9.89540688227862;8.34783568046987;-6.7936183558777;-6.21079830918461;4.06971768010408;1.25655929557979;0.0276300916448236;-7.57330910302699;5.37061974406242;-5.41228297632188;5.27769490610808;-0.481898793950677;-9.4032455701381;2.11821494624019;-3.52128348313272;-5.28234888333827;-3.94443815108389;6.5089252172038;-6.73499886412174;-7.19287923537195
+9.6100640995428;3.46247075125575;7.4122749408707;9.51876264531165;2.45039470959455;3.2232182752341;-4.94607309345156;0.659947427920997;-8.64641916472465;6.42808636184782;5.03150404896587;1.26094969455153;-5.48821151256561;8.11734619084746;3.66342244669795;-8.22387534193695;1.58695536665618;-9.39125302713364;-4.91291321348399;2.91344504337758;5.61382187530398;-6.55371945351362;-9.630041513592;-1.01874536834657;-1.47173742763698;4.69869496300817;3.10558515135199;0.103076505474746;-2.90839713066816;-3.21618268731982;5.33576835412532;-9.42547481972724;9.81157292611897;-3.0705752549693;-4.89890982862562;4.41476271487772;-2.86635111551732;3.47993534989655;5.83426548168063;-6.65154829621315;5.47785251867026;2.94926915317774;-7.16471045743674;-1.5358693851158;-8.08899894356728;3.18043591454625;-0.0853216368705034;-7.23353205248713;2.96108670067042;-2.48010469134897
+-7.55084292963147;5.02330612856895;-4.88774265628308;9.88358601462096;-1.74664577934891;-9.67734570149332;-6.7956027854234;-2.37559215631336;2.45390890166163;6.68737342115492;7.1038386458531;-8.61183523200452;-4.07939381897449;1.36907602194697;-7.83392283599824;6.8963785097003;-9.54728842712939;8.54537358973175;-6.20665206573904;-4.91457242053002;-0.603656833991408;-2.8007267229259;6.49973660241812;0.199258117936552;-8.60503618605435;7.77186336927116;6.26778533216566;7.89606155827641;4.70146337058395;-3.90696557238698;-0.736330603249371;0.7679528510198;4.65491313487291;-9.22936591785401;7.18484039418399;-2.21496573183686;-9.94432440493256;-8.23949242476374;2.49775278847665;3.71956997551024;9.42678078543395;-3.05874708574265;-2.36681151203811;4.03969350270927;9.07617476768792;-4.25600992515683;-5.95278941094875;-0.952863115817308;7.98996728379279;4.26548573654145
+-4.8784654121846;3.59571964945644;3.94936395809054;3.3603585883975;-0.198070276528597;-6.77253487985581;8.28839012421668;-5.09222329594195;8.06143241934478;-3.3784102415666;-3.81487671751529;2.23229830153286;-8.1492616282776;6.15739786066115;-7.77266642544419;-2.55777148995548;-7.17777450103313;1.73520685639232;1.9898408325389;2.43510488886386;-3.00433347467333;7.79198361560702;8.81656422279775;4.84053384978324;2.10856005549431;-0.187303968705237;-3.78895361442119;3.49062109366059;-7.03599650412798;6.04222702328116;-7.33516531065106;-8.27605272177607;2.15348104946315;-5.3738600993529;-7.23654178436846;-0.0580762419849634;7.58749057538807;-4.4869239628315;-2.31333400122821;-7.8175915684551;7.30864818673581;0.529177975840867;0.00597890000790358;-3.1611747527495;5.70955698844045;2.82580012455583;-7.64675438869745;-3.2698565768078;6.03460449725389;9.14835776202381
+9.94176246225834;3.29939676914364;-0.509146112017334;-9.006690797396;2.33558282256126;9.58953105378896;-9.04523015487939;3.67086790502071;-7.61880874168128;-9.24416293855757;6.32632378023118;-7.91328943800181;8.17280690651387;1.92577681038529;2.68703726585954;0.674581010825932;-0.448614074848592;5.83024462219328;3.0665114056319;-1.85066869016737;-8.46763245761395;-5.21928946021944;-3.40141104068607;2.34973980579525;-5.35823660902679;-4.432208891958;1.44816348329186;9.54686354845762;-3.26222606934607;3.60317715909332;-0.213120747357607;0.450165388174355;0.942172869108617;6.67940038722008;-2.63766158837825;-3.32085303030908;3.2001273939386;-7.53791513852775;6.47018374409527;9.70868515316397;2.87592162843794;9.13410037755966;-9.17365663684905;0.996466046199203;-5.76690127607435;4.43980269134045;4.00849624536932;1.88888250850141;1.98391064535826;3.80478540435433
+-7.31250869110227;3.75351521652192;6.76733057480305;0.114665203727782;1.74734284635633;1.81329473853111;-5.55679035838693;-0.103755043819547;4.19369962532073;5.66960691474378;8.84666813071817;2.26824468467385;-8.157251724042;3.64821111783385;6.55711772385985;-7.58725037798285;-1.70703512616456;-9.16415356565267;-3.50028604269028;-1.36009704321623;2.24038260057569;-1.77954464219511;4.43508220370859;-0.261632665060461;4.59658214822412;-9.42563220858574;-8.72973933350295;-5.28500779531896;-7.14674498420209;0.369205926544964;-0.450218790210783;9.08458787016571;7.20316820777953;2.63543673790991;-7.90191150736064;-2.65247156377882;-2.00195136945695;8.376653813757;-6.05194044765085;6.37560038361698;-4.18731074780226;8.55500751640648;-9.69058339949697;8.28570223413408;0.191209255717695;9.68718947377056;-6.50831526145339;8.58129821252078;8.65373087115586;8.65283731836826
+0.810047425329685;9.09182402770966;-7.01722346246243;-3.94484228920192;0.0467825774103403;6.39087687712163;-7.22347355913371;7.79555755667388;-1.86718550510705;4.18556454125792;-4.35758389998227;2.84628190565854;-7.87971705663949;-7.01292719691992;2.26488570682704;9.04133213218302;-2.64521738514304;0.970460642129183;8.82265342399478;-4.39011416397989;5.6817828444764;-0.603205575607717;4.61320037487894;0.0591804180294275;3.81705985870212;-2.02244708314538;9.9640251789242;-0.471495385281742;5.46849795617163;3.73031134717166;-5.00760145951062;8.3569962810725;3.0442107655108;-6.30617012735456;-7.40309449844062;3.94147648476064;-0.897210040129721;5.95940936356783;-2.24671883042902;8.23244843166322;4.83369234483689;-5.41951136197895;8.17645464092493;-2.43182128760964;-2.27276456076652;-2.32158226892352;9.59983144886792;3.58793767634779;0.356022818014026;-8.92319831997156
+-4.38958806917071;5.12169658206403;-7.20016661565751;-7.28780738543719;7.55769857671112;-8.23784770909697;-6.74556862097234;8.37897916790098;9.57929751835763;-4.11334386095405;-0.247219623997808;3.33110813517123;-8.09371331706643;0.221778242848814;-2.76501253712922;-3.26639543753117;-8.04604539182037;2.04904052428901;0.809520971961319;-8.66655059158802;1.4878292940557;-2.8915941528976;-4.29714912548661;-4.68920185696334;0.110404542647302;2.99352379050106;6.73224682919681;-8.28894444741309;7.551921736449;-1.67807340621948;-2.77438204269856;-9.83085647691041;8.07810702361166;2.63762733433396;-2.82801687251776;-0.474286917597055;7.67434468492866;9.56224128138274;-2.66986554022878;-5.44519442599267;6.78307266905904;-5.84306109696627;9.62651640176773;-1.17675073910505;9.55708215478808;4.60222815163434;1.74384914338589;-6.50934424716979;1.73131539020687;7.36163840163499
+3.68456031195819;-7.04950397834182;5.67444883286953;1.1076814122498;6.579355658032;-7.18406192492694;6.58809051848948;-0.856192321516573;9.02032445184886;-3.45932426396757;2.76269936934114;5.21484745200723;3.46080103423446;8.22673759423196;-6.41088864766061;6.23159178066999;-9.9601315939799;5.28689619619399;0.537687130272388;-5.88867008220404;2.25699251983315;-4.65339679736644;6.92897523753345;9.647919642739;-6.61438395734876;-8.44186185393482;-0.855684783309698;3.27934006229043;2.63007452245802;-4.37120233196765;9.56633601803333;6.47411525249481;-4.35413385741413;5.90003594756126;-2.9805602831766;-4.89579827990383;6.2555784964934;1.63515523541719;-4.20387055259198;7.53070854581892;6.24508563894778;3.98279001004994;0.841096937656403;8.41982824727893;-3.24613694567233;-0.287596764974296;-2.89567725267261;6.01293952669948;4.58158012479544;-3.50320864468813
+-1.47061941679567;2.18036967795342;7.64314111322165;-3.5735028097406;-3.6270472407341;-3.09613426681608;1.19530706200749;8.97060927469283;3.49308067932725;-8.11307349707931;2.85683237016201;1.73062622081488;-1.50201718788594;-5.75289596803486;-5.49668138846755;8.84082668926567;-4.24944819882512;7.38893454894423;-6.4177999086678;-0.719041624106467;-2.67200144939125;-5.9480105061084;3.30875990446657;6.42973841633648;-3.54925338178873;0.8612648723647;3.78499758895487;5.03757579252124;9.57609968259931;-6.04499085340649;-3.74279699288309;-9.26831092685461;-2.29645392857492;4.31911814026535;-1.74471355509013;-3.07070164009929;-7.30439161416143;-4.42463068757206;-2.52651572693139;-7.22030927892774;5.05506447982043;1.0708196554333;-1.64879617281258;9.13592308294028;0.902748187072575;-8.24739404022694;-6.11175344791263;3.80935320165008;9.34958796482533;4.30636868812144
+-2.67588027752936;2.09601637441665;8.78883001860231;0.143889379687607;9.30870572570711;9.93339925538749;2.43971387390047;-0.189344133250415;-4.20921569690108;6.67722115293145;-8.04729002527893;-9.30994694586843;8.27824538573623;6.95554476696998;-2.80128425918519;-6.67566622141749;8.53126233909279;7.82904327847064;-4.83086983673275;-5.11232351418585;-3.70686452370137;-5.07626619655639;6.63709016982466;7.86789775360376;-0.270091821439564;5.3667094418779;-6.64880780503154;-3.48985321354121;9.26846806425601;1.66822160594165;-0.23041405249387;-5.97890976816416;-1.82336898054928;-7.94308658223599;9.64748226571828;2.74043194018304;-7.58914089761674;7.0178202399984;5.82638586405665;4.75908996071666;-3.22977333329618;2.27750526275486;-8.41858551371843;1.55836327467114;-3.30718321725726;4.54139644745737;-0.500530982390046;2.52616507466882;1.91365013364702;-9.00934558361769
+8.0309698311612;-5.31856902409345;0.513038705103099;8.79427482374012;7.2955538565293;1.42208584118634;4.17477853130549;-7.66309153754264;-9.31081472896039;-6.67002926114947;-9.8184413369745;8.52294407319278;-2.54643957130611;6.32513594813645;-0.183560382574797;-7.77733351569623;-8.71068205218762;-2.83061850816011;6.35680021252483;-1.854906398803;3.59337896108627;-5.88680188637227;9.22912194859236;-0.414151675067842;6.78482361603528;4.2724270792678;-7.93947253376245;5.11391645763069;-1.76623563747853;-7.71628010086715;-3.79358693026006;5.8677414059639;4.96797786094248;-7.11016732268035;4.23647400457412;5.89991374872625;3.53313330095261;7.08816097583622;-0.340053481049836;9.88902195822448;7.61179819703102;-5.07624170277268;-1.69363197870553;-6.48618578445166;-8.84598926175386;0.540341385640204;8.80254603456706;2.02941586729139;-4.85346951987594;4.5675358409062
+-1.52733760885894;2.14204500894994;7.32700733933598;8.01855648867786;-4.3621929269284;-2.19718579668552;3.05226348806173;5.00819665379822;-3.70232636108994;9.58234040532261;2.60187239851803;-7.09651372395456;-0.297255283221602;5.45009859837592;3.26542731374502;4.06145885586739;-9.02856267057359;-8.67104243021458;-2.01552807819098;-3.1310198828578;1.2985251378268;-5.68042704835534;0.383855747058988;3.97792574949563;-7.09386900998652;-0.309196161106229;-5.68661446683109;4.68387888744473;9.04833001084626;0.412577600218356;8.80075233522803;-8.12061057426035;-1.0888834670186;0.0249302107840776;-8.74608316458762;-7.60087754111737;4.18333353474736;-2.17452030163258;3.59907821752131;4.34301564469934;9.63979823049158;1.1131776869297;7.09384296089411;-4.55728287808597;-9.2321755643934;-4.57711332477629;1.28075984306633;0.988598340190947;4.8277351539582;-0.0564898969605565
+-3.45677435863763;-5.18956944346428;3.55541788507253;-1.28601314965636;-3.0888873199001;0.92406983487308;4.07847431953996;-7.16725109145045;3.09041223023087;-7.72179686464369;-6.96413758676499;0.439629377797246;-2.45485302060843;-5.99517086986452;4.0223287185654;-9.44661860819906;7.43245124816895;4.4007818447426;8.93626714590937;-2.5311028631404;9.25938994158059;-7.25555012002587;-2.8146751364693;0.693368082866073;0.0185628328472376;6.01245338097215;-2.52586280461401;6.25700511503965;3.14740401692688;-7.73492245934904;7.11446681059897;5.02814739011228;-8.37389091961086;7.68239214550704;2.74350878316909;-1.79711238946766;5.51452151034027;-9.54665888100863;4.67858093325049;4.74869189318269;-1.48032128345221;-4.22211178112775;7.260443395935;-1.43355814740062;1.5365415206179;3.16275394987315;-0.792260942980647;-4.16225602384657;-8.12820808030665;7.72447271738201
+9.07663071993738;-9.09285803791136;-6.84069806244224;1.64910723920912;5.82831922452897;3.32411860115826;-0.979053885675967;-2.45495033916086;-6.56607587821782;-2.97419705428183;-6.18377277161926;6.29819170106202;7.07232824526727;-3.54394390247762;7.81686789356172;1.04270061478019;7.05883978400379;-8.34047398064286;4.08075407613069;-6.78703537210822;7.87362052127719;-9.09868211485445;6.08195584267378;9.0578045649454;7.33553003519773;7.15507443994284;5.82467907108366;-8.60539271961898;5.37191659212112;5.73322283104062;-0.730176982469857;-9.71932263113558;1.51408564299345;-4.48912273626775;-0.278135784901679;-9.85495301429182;-0.901787118054926;9.18658097274601;-4.63502914179116;4.99179140198976;3.96869939751923;-3.98697834461927;-8.41316219884902;-7.38733797799796;-0.91202418319881;0.369946658611298;0.946048651821911;5.82336022518575;7.51253905240446;-5.0889286538586
+5.9838814754039;2.0036651333794;7.58742224890739;-2.48752381652594;2.36475697718561;0.315773030743003;8.11356682796031;5.59124040417373;2.7115530660376;7.92778094764799;-6.12706723622978;5.17749150749296;7.08207912743092;6.36263509746641;-4.14445062633604;8.75075311865658;-7.82036246731877;-7.53676665015519;2.03125651925802;-8.13781419768929;-8.55818122625351;-2.33445800840855;-2.58864006493241;3.47276484128088;8.60548769123852;-0.383699098601937;-4.06112329103053;-3.82429465651512;-5.56995804421604;-9.65936105698347;-3.06801662314683;5.1502884645015;8.61170943360776;1.13788110669702;-4.85885797534138;2.33410443179309;6.25223616603762;-3.22703337296844;-0.618330468423665;4.452152736485;-4.8029417404905;-2.50925816595554;-5.07722052745521;-6.97733020409942;-0.554525461047888;-7.52937489189208;-0.267396932467818;2.7365641715005;7.62134131509811;-0.39805346634239
+0.869838469661772;-8.63880100194365;5.11458644177765;1.55080389231443;-3.27927637845278;7.68129528034478;-1.12718927673995;-7.02098687179387;-6.92888979800045;4.16335580404848;-1.45535134710371;-9.31031085085124;7.37347217742354;9.39766991883516;-3.04179997183383;6.83296283707023;9.07021315768361;3.26684719417244;0.804076134227216;-2.13155559264123;-1.80065548047423;0.103053390048444;-7.72771771065891;-9.95871024206281;1.99065336026251;-5.52795949857682;-3.85010180994868;1.86716862488538;2.04240911640227;3.02734602708369;5.5157862091437;-7.60726878419518;8.61083716154099;-9.41897338721901;6.40567752532661;4.82041814364493;-6.02341481950134;5.05736423656344;3.17224442958832;1.09031824395061;2.47447310946882;6.55644346959889;7.09658372215927;2.32208782341331;-9.20845623128116;-7.18265812378377;-0.596436886116862;-1.38139072805643;9.48863041587174;5.21983074489981
+5.25765737053007;-7.14939076919109;-8.9184361230582;-1.89520191866904;-8.85302043985575;3.29473089426756;-2.19152795616537;-2.65737609937787;5.55595824029297;5.6356728868559;-2.03446232248098;8.63252327311784;-2.78967414516956;0.857518455013633;1.84099900536239;-0.780068701133132;1.89012206159532;6.25709841493517;5.6162403523922;5.83396856207401;-7.04209479968995;9.01268223300576;8.44468893948942;-4.65441527310759;-0.0425578141584992;-3.37301634252071;7.80180146452039;-9.53165717422962;1.88331707846373;3.29312958754599;5.05727875046432;-5.2293436974287;1.18554376065731;-1.22703139204532;6.05272342916578;7.22879116889089;-1.29365653265268;-2.43183875922114;-9.71554478164762;0.903925485908985;-9.75378688424826;-6.07541558798403;-3.41042575892061;1.47645306773484;7.9073997400701;-6.12475798930973;-2.71423174999654;-6.39252256602049;-4.9647055612877;-4.91056113038212
+6.05747884139419;-6.82477865368128;6.72378267627209;6.058021010831;-8.79381559789181;4.02116121258587;3.91162849962711;-4.90970537997782;2.47059821616858;5.78431915491819;-0.923619125969708;5.64517721533775;-4.7895028674975;7.80050948262215;8.5765867959708;-0.347843235358596;0.603568856604397;-4.4573614699766;-1.40038692392409;2.82686786260456;1.67348935268819;7.01872532721609;-6.00865463260561;-8.28009390737861;-0.932107483968139;-8.70374864898622;1.71063084155321;-1.88875409308821;-8.87085768394172;4.62011993862689;3.14043511170894;-5.54701712913811;2.09687483031303;9.27628397475928;6.05783166363835;5.82847393117845;-3.66388352122158;4.43596716970205;5.37646076176316;4.14898486807942;-7.0371428783983;-6.48959367536008;5.6871609762311;8.10304615646601;-8.36649523582309;-1.52703508734703;-0.398371447809041;7.68786026164889;5.1994559308514;-6.38459217268974
+9.08667263574898;1.41918651759624;-5.48826304264367;-7.84910065121949;-6.12108887638897;8.09357545804232;9.00055520702153;6.15006953012198;5.16064741648734;4.40030350815505;-7.95989839825779;-8.0976842250675;-8.83913282770663;-3.92087821848691;-7.44100946001709;7.1653697360307;-8.47471422050148;-8.29250143375248;-6.89048332162201;-9.71396342851222;-1.66743383742869;4.85658640507609;7.57681662682444;5.88851914275438;9.40348392352462;1.24595783650875;-2.92228526901454;5.29886804986745;3.40106900315732;-0.573637778870761;-0.805844124406576;-1.21098381001502;0.301912035793066;9.7912514815107;-1.54097915627062;5.33719146624207;-5.8338171383366;-8.91203588806093;8.35267086047679;9.29905687458813;-6.75333186518401;-4.35755024198443;8.06922858115286;-7.34137091785669;-6.06442934367806;-4.2312008375302;-0.633985255844891;-9.85489909537137;8.15041346475482;-8.27639307826757
+8.04878862574697;-4.03702049981803;8.80161846522242;-8.50874301046133;-6.31479832809418;3.71822828426957;9.46298809722066;-9.63934818282723;-4.61881599854678;1.60786955151707;1.38666909653693;4.53409617766738;-4.54191185068339;-5.13052692636847;-4.67228278517723;2.23335377406329;-3.27299406286329;2.0701420167461;9.02721880935133;1.40916472300887;2.72830529138446;-7.45615346357226;-2.21988969948143;-3.04899293929338;8.57367963064462;-8.66906080860645;5.8418265171349;9.95219867210835;-1.82483630720526;-0.623082998208702;-5.85885060951114;-8.55706305708736;7.45552203152329;2.50463150441647;-6.06806002557278;7.16012196149677;7.2406194312498;0.921907536685467;-3.19202446378767;-8.50383928511292;-6.46022224798799;7.04077630769461;1.30514663644135;7.9933548392728;-3.83255059365183;-8.03408762440085;2.86459759343415;-7.61412719730288;5.51702842116356;-2.83807815052569
+-5.61462798621505;-8.81018853280693;9.97262663673609;8.4748601121828;6.85969521291554;2.83757433760911;6.27775496803224;5.88238662108779;-0.446188417263329;-7.45279222726822;-4.69868096988648;-4.59708680398762;-7.29328518267721;-4.44605199154466;9.4478357443586;-9.63665398769081;-1.77625325974077;6.4847139082849;3.28734656330198;8.53298646397889;-2.54450412001461;3.02073501981795;-3.18561343941838;9.442546851933;-4.85084695741534;-8.74636843334883;8.47915959078819;8.97383309900761;-7.59781069587916;-4.00313588790596;-2.82393303699791;1.53830187860876;6.59248060546815;-1.70328066684306;5.67381250206381;-4.92642959579825;-1.16201119497418;9.24035937059671;8.73578972183168;-2.67838879022747;-5.02699238248169;-6.43184520769864;5.58382318355143;-4.24139388371259;3.10692681465298;-0.530186146497726;9.82591894920915;-7.91117428336293;6.967285531573;5.18182333558798
+-9.89407291635871;-4.19153634924442;9.29672972299159;-4.4933940237388;7.45161499362439;5.13788327109069;0.528814899735153;5.89835804421455;2.54883700981736;8.92322771716863;2.85539890639484;-7.98213106580079;-1.86930645722896;-8.2518075639382;-2.87045215722173;-8.88296117540449;1.61902905907482;-2.39569583907723;8.08137973770499;-4.29146957118064;9.11411983892322;2.87193689029664;-8.17048462573439;-0.45043065212667;-9.57315278705209;1.85482719447464;4.76876315195113;7.31579923536628;1.795619498007;-5.10263097472489;3.00857811700553;8.37868543341756;8.35035168100148;-1.76199602894485;-7.3381193401292;3.4886149642989;5.72875111829489;2.65701266005635;-0.870002964511514;-6.81987721472979;-4.41580639220774;-4.73171808291227;8.50881292950362;9.11629976704717;1.66374988853931;-8.5142755927518;-3.70844325050712;-4.77143938653171;-9.61425952613354;-6.60339917521924
+-6.72986705321819;-5.59756385628134;5.69470681250095;-7.81636457424611;1.8322914140299;1.88249679747969;-6.85153061058372;-9.01504325680435;-0.551987001672387;-0.0402928562834859;-7.99889495130628;-2.09044289309531;-7.73650207556784;-7.07301927730441;-0.0254029966890812;-8.9837708324194;1.19010261259973;5.6209343764931;-2.20579896587878;6.37353925965726;-4.63823550846428;-4.87715474329889;2.19614076893777;1.58460851758718;3.20272694341838;7.46942510362715;1.09576587565243;-0.272498466074467;-0.550274597480893;0.571426567621529;-0.904803164303303;-4.24230416305363;-2.79885834082961;-4.28347432054579;-0.0975221302360296;-9.79383808560669;-1.81562092155218;2.93604556005448;-1.14726688712835;8.40824632439762;7.43999872356653;0.293309255503118;6.31571726873517;-4.3401456438005;-8.46902028191835;-6.90059061162174;3.45282852649689;-2.12839905638248;4.53164340462536;6.86576626263559
+0.127323199994862;-2.21807172056288;-6.5357240056619;7.55871692206711;2.1249585179612;-7.52752860542387;4.42435899749398;-2.26831795182079;8.93157082609832;5.76555591076612;3.43559378292412;1.62476166151464;6.3177321664989;-7.07606756594032;-8.92616124358028;-0.150108016096056;-7.85736015997827;-4.89981613587588;-8.56543152127415;4.37935933936387;-5.81759517081082;2.2887986432761;6.59792263992131;-3.1499032350257;4.57338702864945;-9.39783432520926;-0.823600585572422;6.09872681088746;-8.99672783911228;8.14494760241359;3.39843132533133;3.85345159564167;4.28726430051029;1.5541593497619;4.60626594722271;-1.13089588005096;9.72044998779893;3.16393727902323;5.18982935231179;-4.66547892894596;-4.02048296760768;7.36024208366871;-7.5449299486354;-0.238334881141782;1.87156259547919;-4.30094154551625;5.86475658230484;8.84819561149925;9.0897281607613;0.720361769199371
+-2.04157086089253;4.73782371263951;3.91314689069986;-7.95204462483525;8.89105096459389;3.08649790473282;5.08209316059947;-1.69071173295379;-3.2540211128071;1.41127790790051;-3.68691354524344;0.499446797184646;-8.59142582863569;-4.89857415668666;3.6666701361537;-0.541766732931137;-3.3406919054687;3.16182754933834;6.65286915376782;-6.34436692576855;7.74641205091029;-0.618513599038124;1.6348203830421;4.05028315726668;9.18857582379133;-3.00563166849315;2.24795394577086;-8.22025329805911;-6.60483591724187;-8.42546899802983;1.33516137022525;-6.25941745471209;-1.97119723074138;-0.688127772882581;0.366803831420839;-2.22393247764558;7.30315303429961;4.57164344377816;-9.66723528224975;-7.69532242324203;2.13276829104871;-1.46456203889102;-3.53382900357246;-8.68513144552708;7.06090664025396;3.56655342038721;3.22084251325577;1.34111096616834;8.08832353912294;9.5854779984802
+0.315539282746613;-3.35830288473517;6.57978064846247;1.41794370021671;0.717603242956102;-9.81692431494594;-4.2526738345623;7.85448794718832;-0.280424389056861;-4.91921694017947;-3.3007836388424;-8.5597753059119;8.11801631934941;7.07524037919939;5.83000961691141;9.39825369976461;9.51770250219852;6.38160537928343;-4.24469198100269;6.43815882969648;3.63472523167729;-1.60760037135333;-7.13026626035571;8.34002853836864;9.27457585930824;3.56772354803979;5.41044434532523;-0.463096685707569;2.18271040357649;-0.98526522051543;-6.11911343876272;-6.78257025778294;-6.31479511968791;-4.71871350891888;-9.72237530630082;3.27898391988128;-5.28679143171757;-1.1044163769111;8.68530528154224;8.42833195813;1.35951363481581;-3.49495551548898;8.24836160521954;-6.99942888692021;0.830936543643475;-8.52343286387622;-6.9826883636415;-9.10700149368495;3.4956566337496;8.34153132978827
+-3.93902249634266;-3.63682196475565;-2.52887601498514;3.55603614356369;-8.07116343639791;-1.42558112274855;-2.00167623814195;3.02165564615279;-6.7546604713425;-5.42397222481668;-6.91442778334022;7.08086456172168;-2.13073491118848;0.279609863646328;-8.66187417879701;4.89230304490775;9.43317751400173;-6.08834599610418;-0.852941633202136;8.33533759694546;1.24841046053916;-3.34688086528331;-4.87468946259469;-4.03326639905572;1.01552272681147;5.27360185049474;-3.30627192277461;1.9817282538861;-3.94093555863947;3.35085627157241;1.88481913413852;-2.4685558443889;4.81797978747636;-8.15348238218576;0.0903876405209303;0.44260592199862;-0.745477224700153;-6.39363156165928;5.30107019934803;-8.78899694886059;-9.24197039566934;-9.45789049845189;-5.4991923365742;-7.03580262605101;4.8425895627588;4.64481466915458;7.59254783391953;-6.71187261585146;1.98452193755656;7.58999283891171
+-1.26752119977027;-5.4942009691149;-3.58563989866525;-8.18671545013785;1.74711939878762;1.64377530571073;5.07163258269429;7.27992502972484;1.07841361314058;2.21078632865101;3.75965410843492;3.71743847150356;1.3834722712636;3.38391853496432;-9.64680399280041;0.249479128979146;8.70015239343047;3.34138864651322;5.02264796756208;-5.06285530980676;-4.57541001494974;6.12825077958405;-5.88213377166539;9.2390928696841;-8.62783451098949;0.321187586523592;-3.72169496957213;8.9675477752462;-4.71233579330146;-6.01173321250826;7.51288876403123;-6.14267650526017;-0.394390132278204;8.13314924482256;-1.22023111674935;1.31177912931889;-6.90202031750232;-9.18083638418466;9.38795374706388;9.28420060779899;9.4448029063642;5.37694026716053;3.5553791327402;7.31764144264162;9.23531253822148;5.85579582024366;-0.456987814977765;-5.19038459751755;-7.47082584537566;8.03753325715661
+3.86745349504054;3.26200865674764;-5.62653247732669;-2.58988637011498;1.01651018019766;-0.690691703930497;1.21216704137623;2.60597560089082;0.258550327271223;5.63006665557623;-5.52889929153025;-1.08318258076906;-9.18897869065404;-9.85656794160604;-8.56996416114271;-3.93776414450258;3.1955081038177;-4.76063050795346;-5.27699470054358;6.07979329768568;3.93179255537689;-5.80440940801054;-3.46795558929443;-5.69108496420085;-8.64222277421504;-2.54221030045301;2.18793721869588;-3.21936763823032;3.67253770586103;-9.99449786264449;6.47161897271872;-4.71481488086283;-4.23279612790793;-1.17452101781964;8.18785829469562;3.56997561175376;8.96742055658251;6.88299609348178;-9.08894202671945;2.34384539537132;-1.6012602346018;-0.253180260770023;7.0148813445121;7.50420282129198;-6.39087376650423;0.0913445139303803;2.41162427701056;0.187755413353443;6.00797186139971;-1.21419369708747
+8.14174106344581;7.63357441872358;9.8312184214592;8.93885911442339;7.33231227379292;-1.42076523974538;-2.30972016695887;6.64102445356548;1.51225072331727;-3.92053232062608;-7.37207562662661;-4.1599652543664;-0.423420472070575;-6.27683937549591;8.02650989498943;-1.52518211398274;5.71003125980496;-8.38336637243629;4.81649333611131;-6.6665065381676;2.44491672609001;4.82190507464111;8.53631013538688;-0.887690708041191;0.639475616626441;-6.36283550877124;1.5791191207245;-5.22765482310206;8.73469307553023;-6.51222434360534;1.91009815316647;6.38201188761741;6.23860103078187;-0.719227138906717;-1.28545502200723;-6.23601580038667;-4.63647830300033;-3.36031056940556;-4.60939527489245;2.26724219042808;3.77912943251431;1.17503957357258;2.97954835928977;-2.96413036994636;-9.42629620898515;-3.45965817105025;6.40004890970886;-7.61416575871408;9.80488727800548;-2.11111814249307
+9.62563292123377;-6.77119625732303;-4.62504975497723;-1.37905093375593;0.407378152012825;4.25064330454916;0.982947214506567;-2.50789946876466;7.9964994173497;-1.85784399975091;-8.95628078840673;-8.79391294438392;-2.71490545012057;-5.38950186688453;6.23826494906098;-1.53289395850152;0.873624165542424;-5.43482447974384;8.62892145756632;1.16285816766322;-1.77650860510767;-8.73083064798266;-0.684402580372989;9.21937418635935;6.76820499356836;9.50288491789252;-2.13873331435025;6.4467306016013;-5.48012983053923;0.0701229646801949;7.72952080238611;4.60980580653995;8.07808786164969;-0.487957228906453;-5.39672298356891;2.18507206067443;-5.94471095595509;-8.26673603616655;7.50955885276198;8.90561992768198;-2.9697480937466;-6.90579281188548;-7.3244853829965;4.8109153052792;-4.7292092256248;4.33955173473805;7.06680200994015;-5.14193814247847;5.34082293976098;-2.09466504864395
+-6.41016873531044;0.482539855875075;-0.422357157804072;7.14863276109099;5.8324559731409;-7.86125815939158;-6.90152262803167;3.66476114373654;5.67373424768448;3.33628870546818;-7.18507935293019;-6.08560477383435;-6.73564099706709;8.02456178702414;-5.79309572000057;-7.94817756861448;-0.16563733574003;-1.26778526697308;9.45755186490715;-6.37572942767292;2.52486592158675;8.36081102490425;-6.79570670705289;2.81548430677503;6.97058793623;3.5571512253955;-3.41017216444016;5.99255844950676;-3.9602539408952;0.900034285150468;9.30296453647316;9.02831103652716;4.15287719108164;8.65107616875321;-9.37166183255613;-1.73296314664185;-9.70300076063722;-4.59278227295727;9.93519863113761;-5.63389187678695;9.91746266838163;0.925957444123924;8.93196733202785;1.01608416996896;-8.94816293846816;-8.05144414305687;9.83592677861452;-7.67222470603883;-7.89900119882077;9.70890576019883
+-3.12440277077258;9.60240144748241;5.25999537669122;-3.47778196912259;0.129551561549306;8.8450449379161;-2.92711615562439;-9.67926230281591;5.23335465230048;8.95506538916379;-9.24793686717749;-7.52782738301903;7.21272090915591;-4.2344917729497;-1.93253816105425;0.102909440174699;-1.19881702121347;0.733338822610676;9.51190693769604;6.61714054178447;-4.05575089622289;5.87952032219619;8.70071286335588;-6.44277450628579;-1.70011465903372;7.59772302117199;2.34605173580348;-1.67057059239596;2.73666973225772;6.84380169026554;2.82338928896934;-9.12827800959349;-4.8074315674603;3.63843571394682;8.77405527513474;6.92847958765924;3.94348544068635;2.44502423331141;2.97119963914156;7.49145087320358;7.89368192665279;-2.37061657942832;-8.54613527655602;4.79178472887725;-7.33341188170016;-9.04954609461129;4.66384723782539;7.24490805529058;-9.07234300393611;4.11711134482175
+9.1953965742141;9.34180012438446;9.0051025012508;-1.41493578441441;2.68304429482669;2.47088419273496;-8.77397664356977;2.39265365060419;-4.34398994315416;5.30692075844854;6.90129715017974;9.57830054219812;-2.92943282052875;1.9435086613521;-9.32822250761092;5.47829426359385;6.41045905184001;9.5883260294795;0.216942327097058;0.176556813530624;-2.98760859761387;7.10042742546648;-6.82631568517536;7.92374716605991;-3.05293837096542;-7.51290664542466;1.32421588059515;-5.52101951092482;-2.89297816343606;-9.91141605656594;7.72854215931147;6.08795522712171;-5.60741963796318;5.95254342071712;9.64109390974045;-3.82950315717608;5.01677656080574;-3.67570725269616;2.34966521617025;4.214963237755;7.55257543642074;9.3678473494947;-9.90781171247363;-5.92413020785898;-6.19536026846617;-0.248967004008591;8.76275239512324;9.71857312135398;-7.83379437867552;-7.60305350180715
+7.05761578865349;6.29401635378599;9.44788675289601;-0.0324399070814252;-6.74596004653722;7.07070856355131;3.14691608771682;6.2186740944162;-2.00125417206436;-3.8373811962083;-2.26054063532501;-0.312024718150496;-2.55778135266155;5.10029567405581;-7.88156019058079;-2.98364222981036;2.86190547514707;0.347033846192062;1.61384512204677;9.14729083422571;5.30774652492255;-4.99072165228426;1.52527194004506;-0.833382247947156;-5.04255980718881;-7.44303567800671;9.00746120139956;-7.11874233093113;9.17468346655369;6.24552720226347;1.91839925944805;-7.13431476149708;-5.36832856014371;9.08854630310088;-6.62696684710681;-1.32042647805065;1.41293591354042;-1.77891246043146;-1.17238024249673;6.22700829990208;-1.56543803866953;-3.82728355005383;-1.22111055068672;4.38546339981258;8.07950359769166;7.36134652514011;-7.90688618086278;5.70166740566492;9.45750160608441;-5.77399546746165
+8.88541072141379;7.40516565740108;-2.83008494414389;-6.23385473154485;-8.93636619672179;-4.36000898480415;9.22153347171843;3.02329523023218;-2.99874737858772;8.71702449396253;7.25737906992435;-6.35732441674918;-9.79537260252982;-7.48754078987986;-4.00456994306296;1.32264823652804;6.28067469689995;-1.96916951797903;0.552540388889611;-5.68714318796992;0.600178660824895;4.30977049749345;9.87971957307309;2.3242930136621;6.08995991293341;-7.33795175328851;-0.660432665608823;2.43071308825165;-5.79058230854571;-4.05858379788697;-2.65530774369836;2.17679345514625;-6.4776782784611;9.57629198674113;1.48382533341646;8.54868368711323;9.95879979804158;2.17248331289738;8.68237853981555;6.41019566915929;8.2245298428461;7.40904869977385;4.62658020667732;5.00383646693081;8.17069072276354;1.63867647759616;3.88728866819292;-3.97695891559124;-7.6029277453199;9.81449080631137
+-0.813781805336475;-1.688740728423;-2.86653371993452;2.66785811632872;1.14900406450033;-2.57919661700726;4.51413183473051;6.35795894544572;-9.37409195117652;4.26237686537206;-1.10762593802065;-0.432778624817729;-6.52837635949254;-5.0729246949777;-6.08863873872906;2.52699800767004;4.32214444037527;9.61209983564913;-4.89025600720197;-2.40963821299374;-7.04359333030879;6.13092914689332;-3.47958593163639;4.52028292231262;-2.25266561377794;-7.32123308815062;-4.91925806738436;0.742329279892147;-3.50515619851649;-2.49319510534406;4.50594971887767;9.54502692911774;2.8062415169552;0.301366946659982;2.43363062851131;3.21249858941883;6.40012585557997;3.85846167337149;7.76199588086456;0.0312632694840431;-6.22249796055257;6.37382397893816;9.24797739833593;-4.92008765228093;8.38835299015045;0.126847829669714;-5.65497127361596;-6.04486391879618;7.47271488420665;-6.32271251175553
+2.06759649794549;-7.77381744235754;7.22129270900041;-3.82614549715072;-3.05697869043797;1.45855280570686;9.47475377935916;-5.6937118852511;-6.22230394277722;1.06999440584332;-7.80300880782306;9.1487236507237;-9.09992463886738;0.918206130154431;-4.69655898399651;2.03710921574384;6.38432385865599;5.0242077652365;-6.41480230726302;7.61045504361391;9.37218660954386;2.98334233462811;4.67593791894615;3.88216889929026;-4.68200136441737;-1.10424632206559;-3.75194186344743;-1.39411061536521;1.35641532950103;-3.03522656671703;-0.471623660996556;6.19622674304992;-6.32387476507574;-5.16263334546238;-9.25467207562178;1.57874369993806;-1.01847164798528;-4.68203269410878;-1.18607229087502;8.98686777800322;-6.01309356279671;5.73706627357751;2.81804482452571;7.39821346011013;9.44254342932254;1.62173265591264;-6.97792805731297;9.60681090597063;-0.480104275047779;-7.51042114570737
+-6.11702085006982;-5.64799884799868;-7.4375347327441;-3.60263195354491;1.94081525318325;-2.1671821270138;-1.39313278719783;8.34065662231296;0.0355394929647446;9.46594414301217;-2.39164099097252;2.95199882239103;-9.32528944220394;7.19393907580525;-4.2184579372406;-1.30740606226027;3.62988541834056;8.39165221899748;-3.29206770285964;-1.18080137763172;-2.54893206525594;2.81789766158909;-9.97242355719209;-7.43518519215286;7.00958816334605;-7.93183344881982;4.99354732222855;-0.527612362056971;-9.49664896354079;-3.61193811520934;5.99532007239759;4.67868274077773;-4.19975804630667;7.77646874077618;-4.5598607417196;4.57904067821801;8.73239024076611;-1.1092025693506;-0.99370036739856;8.20118652191013;2.84734902437776;-6.35834740009159;7.03268847428262;6.2615706352517;7.74592844303697;-3.67909801192582;3.76807120628655;-5.62445948831737;-4.35825488530099;5.49425264354795
+-6.83166848495603;-0.614455221220851;5.28590796981007;-8.68536532856524;8.41234778985381;9.16364326607436;9.44499047007412;-2.00615955051035;-8.31420606933534;-7.46631977614015;9.27293786779046;-5.30698705930263;-4.49833783786744;-8.82819691672921;6.01981780026108;-8.9534228015691;-4.56475790124387;-6.77500025834888;5.30941696371883;-6.01976606529206;-9.46772139985114;6.577333137393;5.06242979783565;1.67267518583685;-8.29514723736793;-1.90846882294863;-7.22304928582162;9.73888639826328;4.11412792745978;1.47009233478457;-7.78690821025521;9.18800093699247;-3.29094240441918;-3.69382215663791;8.18457553628832;-4.53971336130053;2.45767083019018;2.84062358085066;3.39307704940438;-3.91851240303367;8.56765225064009;3.94282407127321;-2.54541678354144;-3.86801490094513;-7.67172416206449;-3.31585549283773;-6.35316723491997;-4.2873529298231;-3.56943179853261;2.54656776320189
+-3.72271561063826;1.3274192577228;-7.70684462971985;1.76630825269967;4.74042924121022;-8.37242804467678;3.01712035667151;-3.64059148356318;-2.35805603209883;1.80199389345944;9.24507831223309;9.27100853994489;-9.80618702247739;-0.254086195491254;-7.99716506619006;-6.84127592016011;-8.22589653078467;-6.32097417488694;-3.36384229827672;-8.00537902396172;3.29076105728745;-1.43938215915114;6.70480558648705;0.0258892774581909;8.2943964889273;9.59374759811908;-7.7183237252757;-9.09996735397726;5.11770071927458;7.9318104730919;-2.09667228162289;-1.37419661972672;-8.84597341530025;-2.66557823400944;9.00096810422838;-7.56054286379367;-7.32695202808827;-9.25446461420506;7.08624028135091;3.76667344011366;2.86323332227767;-0.57819886598736;-1.51814673095942;-4.03109015896916;-3.62062799744308;6.50606864597648;-4.66119491960853;6.89710798673332;-2.63250114861876;-0.631392546929419
+-2.38699537701905;9.19455356430262;-3.49862798582762;1.32229094393551;-7.92333092074841;8.56922125909477;-9.85199993941933;-1.75330684054643;-7.27939085103571;9.02813107240945;-6.1165216891095;9.8574047582224;-0.843828329816461;9.80030965525657;-0.146942059509456;3.56519911438227;-2.99741609953344;3.99083195254207;8.54049349203706;-3.11337502207607;5.0618592184037;-6.62319996859878;1.31932692136616;-8.65493835415691;1.854966012761;-4.58273836411536;7.73260733112693;-8.51872405037284;-8.12767461873591;-8.75998779200017;-8.15513059031218;-1.67121191974729;4.11425502970815;0.116492789238691;-5.94574813265353;5.74174338486046;-6.21935391798615;7.90619076695293;9.58471389953047;8.31626632250845;-2.21604278776795;1.88265491276979;8.99125100579113;-9.81327084824443;0.44498760253191;3.96111642476171;-5.0433725072071;-6.67099049314857;1.67690435890108;1.30849273875356
+-8.66543639916927;-2.25495719816536;6.39934111386538;4.37952212523669;-7.46177469845861;3.39415127411485;8.25489982496947;-1.76098369527608;-2.10473388899118;8.22862747125328;4.44785844068974;-6.25017926562577;-4.25287398975343;5.8878059964627;-3.16792338620871;-1.44989128224552;-6.63704924285412;-7.73378962650895;7.39882979076356;9.60719884373248;-8.81296709179878;2.687942776829;5.72915816213936;-4.46262274868786;9.72606453578919;-7.53243392333388;7.21547652035952;-8.01533193793148;-1.4876542892307;2.01247007120401;-4.27834322676063;7.73349804803729;-1.39311986975372;6.52135290205479;-2.49163521453738;0.779676167294383;9.24653062131256;-0.422009252943099;8.74332062900066;9.22052184119821;3.87561238370836;-2.13664302136749;-6.72358294948936;-2.94205358717591;-0.0318210478872061;8.88695639092475;2.2786030266434;9.89967876113951;-5.19965452607721;5.1395539008081
+1.34062726516277;7.25214009173214;0.462510664947331;-9.64985116384923;-4.83234830200672;1.19679539930075;1.18762445636094;9.01225329376757;1.74144230317324;-9.89695373922586;-4.9284586450085;8.88016398064792;-6.35523851029575;2.51400575041771;3.01511487457901;-5.17946398351341;7.78971879277378;2.89023607037961;-2.27251328993589;4.97775164432824;-7.88881113752723;8.31670898012817;8.09479309245944;-8.96138658281416;9.13539999164641;-7.06364237237722;7.50019152648747;1.49958888534456;-7.98740386031568;0.881503978744149;0.0734072783961892;3.07944511529058;5.10538856498897;0.466743838042021;9.70448441337794;2.68106861971319;7.43887806776911;-3.7781185656786;8.91424091998488;-3.47651570569724;-8.82688296958804;3.15268283244222;6.31367885973305;-3.7243631016463;-3.34820461459458;-6.85388130135834;5.22976275999099;8.41586777474731;2.34432525467128;5.55042492225766
+1.72590331640095;9.61483290884644;-4.63883475866169;4.36777646653354;-0.37520372774452;-3.28701284714043;-5.22389123681933;-4.48140778578818;-1.14053173922002;-1.701954822056;5.77589865773916;6.17617213632911;-0.960778081789613;5.17034356482327;-7.77656577061862;5.9322845004499;-1.61139028612524;-8.61491837073117;-2.7084653545171;-4.3117214133963;-0.440626842901111;0.00815483275800943;-8.02188742440194;-2.97557249199599;8.52550928015262;-0.232499274425209;6.88659785781056;8.92080539371818;8.12700755428523;5.29286078643054;4.36481483280659;-4.20171352103353;-7.34519377816468;-1.79220674093813;-5.15451510436833;-5.85201465990394;-4.57871035207063;0.208904170431197;-9.54462502617389;-9.52398955821991;3.66800423245877;-9.64162058662623;-7.77840574271977;-6.80916529614478;-8.48873598501086;-0.207788813859224;5.16864425502717;-3.66692005190998;2.8129247482866;-2.14695573784411
+0.58305093087256;3.10060207732022;2.49960486777127;-8.73185034375638;9.38518075738102;-1.71893717721105;2.27435647509992;6.24312953557819;-2.90620294865221;2.77003848925233;5.84361126180738;5.68693692795932;6.88589361030608;-1.04573171585798;0.0563993584364653;-3.51099448744208;-1.0252928500995;7.48782037757337;-1.2884227046743;9.04598653782159;3.81973708048463;-0.142853511497378;-3.86985729448497;3.87089184485376;-3.8995356252417;0.147410798817873;-3.7359687499702;6.46325236652046;2.75328976102173;3.31468446180224;6.80232872255147;-0.849659838713706;2.03512744512409;9.42533983848989;4.07544574700296;-9.0019291639328;6.62354563828558;2.78724132571369;7.28251917287707;3.76613582484424;7.99856950063258;-8.1277575250715;-4.24606862012297;9.71575803123415;8.62997751682997;-7.1373195014894;-6.41956504900008;-7.47391717508435;6.59426532685757;8.34302859380841
+-4.47370579466224;-6.37718683574349;9.05361400451511;-2.21360110677779;1.58400736749172;6.18853077292442;-9.56854367163032;0.56116511579603;-6.82278726715595;-2.97146503813565;-3.71269455179572;-9.79063019622117;8.55083782691509;8.33268531132489;1.82671365328133;-5.28543731197715;-6.24614913016558;8.66584007162601;0.231029940769076;-6.83136350475252;4.05762175098062;-0.615917509421706;1.50599387474358;-9.53176336362958;6.88449881505221;-8.14233609009534;-5.45086920727044;-6.21569591574371;8.5863892454654;-0.0388798769563437;-6.39087982010096;-2.14319819118828;1.40350762289017;-9.46559344884008;0.701143825426698;3.90927036758512;-6.43718676175922;7.06148450728506;-1.01129377726465;0.727826287038624;1.33631488773972;-5.41421267203987;0.770580642856658;6.88661207444966;1.52158313430846;5.7330016978085;4.78333205450326;9.92654364556074;3.20502283982933;-4.8587352829054
+-6.2696030177176;-5.66504379734397;-5.84746282547712;7.41331971250474;3.52453719358891;9.33533949311823;-5.01677997875959;1.21353666298091;2.86800951231271;-8.63000140991062;-2.84075632225722;6.18868300691247;-6.00336534902453;8.45456557814032;-9.48186363093555;-8.11226186808199;2.35006656963378;1.30099335685372;0.514884945005178;-6.51538286358118;6.90449036192149;2.08501486107707;6.73903371673077;-7.0217707939446;0.860650786198676;9.5490623312071;-2.64837988186628;-9.61132486350834;-4.47414196562022;-6.15500197280198;-4.90731664467603;2.89977055508643;-3.19143446162343;6.27245705574751;-7.59213345125318;2.85627523437142;-6.92161742132157;1.45756377838552;-0.781106874346733;7.02531694900244;2.35292636789382;-4.795015999116;2.58142631035298;6.88870531506836;-3.84552306495607;-2.05601957626641;-1.2351439287886;3.30966630019248;1.14322631154209;-1.66944076307118
+7.41363691166043;-6.78300902247429;6.56345662195235;-6.34885646868497;-5.15266163740307;-1.20122958905995;-0.70059219840914;6.06813245918602;-0.27748916298151;-1.8295347969979;-5.57560249697417;0.0363599881529808;8.7844109069556;-9.40375678706914;-9.95899972505867;-9.39540310762823;6.50216091889888;2.04790202900767;-2.95763570349663;-6.65682766586542;1.47622708696872;-0.807571117766201;1.16551897954196;-3.60741364769638;7.70406389143318;-7.13161589577794;3.45972251147032;-1.19557352270931;-3.05681050289422;-6.83285018894821;4.78882503695786;-6.17497598286718;4.99847130849957;-4.33341850526631;9.15403921157122;-5.37722879555076;-6.46731601562351;-6.53842975385487;-2.39947918336838;-1.84100771788508;2.553278231062;-4.72215220332146;-0.467907683923841;-2.92518422473222;-3.90338325407356;2.25802437402308;5.67949794698507;-5.22046844474971;5.48336903098971;3.70080151129514
+1.95947275962681;-9.9389560893178;-5.28780450578779;1.16659370251;-5.21523711271584;4.27695204038173;3.10319839511067;4.05524849891663;2.93234036769718;-7.05326229799539;-7.01423651538789;1.71422965824604;7.9844335373491;-9.71415316220373;-6.61539456341416;7.38771711476147;9.28920969367027;2.00970558449626;4.82539783231914;5.02415762282908;5.68249196745455;3.26771257910877;0.908421687781811;-2.40307355765253;-3.68813050445169;9.04561732895672;1.16028033662587;-3.13862017355859;-1.94950381293893;4.78091069031507;9.06615128740668;0.529077677056193;9.32651383802295;0.539960404857993;-0.394974364899099;1.08334608376026;1.17621950339526;-8.75426016747952;-9.24221706576645;-7.21283551771194;7.05628560390323;-1.90766716841608;-9.25174745265394;-9.82705867383629;4.91483921185136;-8.18806549534202;-6.5441129449755;-4.62532268371433;-3.37055301759392;6.37386097107083
+-7.47391475364566;9.36897641979158;0.784543044865131;-3.92422168515623;7.2089677862823;-8.99782432243228;2.80276688281447;6.1957645136863;9.68851057812572;9.33272585272789;-8.37368623353541;4.9364613275975;-7.11828942876309;-9.94381425902247;9.29133203346282;-3.53748252615333;-5.52632631268352;-0.453737783245742;4.36916975770146;6.92390886601061;4.1456995299086;-4.17943225242198;7.14042995125055;0.355266486294568;-5.44260669965297;6.46878794766963;-8.57970973942429;4.17089282535017;7.93446801137179;9.11284763365984;0.37194665055722;6.17445892188698;3.09490928892046;4.77303856052458;-2.72998732514679;-6.44904529675841;6.75625334959477;-4.41328167449683;7.91885690763593;-1.16913868114352;-6.69103281572461;0.437153931707144;-8.03077362943441;-9.99614290427417;4.47235179599375;8.27335151378065;8.76497724559158;-8.6226039705798;-2.13357295375317;-4.52819545287639
+-1.44364402629435;-9.31343291886151;-7.41676325444132;-6.43913027364761;-4.88778586033732;-4.65280569158494;6.62616807036102;8.28897858038545;9.70942735206336;-3.57106500770897;-0.868860231712461;-2.49568172264844;-6.59943131264299;1.45673542283475;-8.18387965671718;7.16273276600987;-3.61636189743876;3.26161419972777;1.24116047285497;-1.96407735813409;1.99380614794791;9.8065058561042;-3.06798769161105;-3.81972367875278;3.12080192379653;-1.80440566502512;-2.80232059769332;0.364106404595077;5.97939553204924;-0.279456190764904;-8.94516188185662;-0.638592098839581;-8.46591249573976;9.87421008758247;8.13257004600018;-4.94130531325936;-7.63414190616459;9.09187814686447;-6.19168255478144;3.23900121729821;-6.7184547521174;7.73791728541255;-7.7068654820323;6.21961033437401;-8.68589719291776;2.04958737362176;-9.14945144671947;4.18248917441815;-6.35385415051132;1.43585404846817
+-6.05251183267683;-4.56139313988388;-0.567983258515596;-1.3504597498104;4.20824019704014;-8.1175423366949;1.00077201146632;-0.381644759327173;-0.758939124643803;7.23534285090864;-8.41230859979987;-9.80377302039415;-7.93761785142124;0.970655023120344;8.25642888899893;1.61311400122941;-7.03488789964467;-5.28922477737069;6.6616266220808;9.50378472451121;-0.888471053913236;-8.86378120165318;-9.60248291958123;0.00130669679492712;-4.13681256584823;-5.33238669391721;-4.85480045434088;6.07451606541872;4.83522154390812;8.23740515392274;-0.573791810311377;-3.09239474125206;3.67892992217094;9.53804251272231;-4.21402811538428;-9.65315533336252;-6.65937933605164;-9.95562045834959;-0.336163830943406;-7.73994815070182;-7.69121915567666;5.59667808469385;-0.233978880569339;0.90077324770391;6.20679932646453;2.40010479930788;-4.86332477070391;-3.8066531252116;-6.31383175030351;1.98436942882836
+8.26879738364369;-4.40207021310925;-9.81449048034847;8.33970424719155;1.36106943245977;-0.076077370904386;-3.93275185488164;-6.08951268251985;-5.59873486403376;1.10083456151187;-6.64803463499993;-0.913323778659105;7.53021462354809;2.10657561197877;-3.95513519179076;-5.03009808249772;4.28521802648902;2.61469395831227;-6.14148291759193;-3.13353890553117;-7.40163208451122;9.35647363308817;8.40489867608994;5.6144343316555;-5.64123222138733;-2.57635842543095;-7.12064785417169;-7.15504857711494;-4.81092867441475;-1.65826643817127;7.38372687250376;-2.56976290605962;0.0955894635990262;-8.18985568359494;-5.30711927451193;8.36279789917171;-9.92330106906593;-8.79541437607259;-6.45071119535714;3.83545550517738;-0.0611186772584915;-8.91647153999656;-6.40783783514053;-8.13189884647727;9.00357683189213;4.40368394833058;-6.0449150390923;9.62318208068609;1.73081177286804;2.31216251850128
+-2.86650056485087;2.17226666398346;-8.92458805814385;1.73654411453754;-3.78162737004459;8.16831300966442;8.24282486923039;6.21246439404786;2.67152288928628;-2.50509775709361;-3.24271786957979;5.35159039311111;-9.09829614683986;3.33700043149292;-5.92733497731388;-7.26276196539402;-6.04734321124852;1.83022211771458;6.45266404375434;9.30778273846954;5.68388445302844;-1.90264916978776;-8.14970981329679;-7.8369702398777;1.14513879176229;-5.23330777417868;-8.1506397947669;9.45381830446422;2.36470068339258;2.99911600071937;5.9403733862564;2.37585047259927;1.71247851103544;8.3894249657169;-1.20923016220331;-4.70406285021454;6.0029130987823;-8.28637634404004;9.26967866718769;3.9235005993396;7.74040237534791;-9.86360748764127;-6.76134577952325;-4.95065935887396;-5.06672724615782;-7.53248889464885;-2.43611037731171;-4.72422494087368;-0.784550379030406;-7.92837040964514
+-2.25308901164681;-2.60946494527161;-9.51571988873184;6.81778023950756;-9.2629509139806;9.69034135341644;-6.85062797740102;-5.00809322111309;-1.65806939825416;9.36386180110276;-8.02535269875079;-3.09625711292028;-0.831218748353422;-9.27570289932191;9.42323306109756;4.16071799583733;-4.50551458634436;9.95364248752594;-3.76498645171523;-3.0570434127003;5.87888922542334;-6.14737098105252;3.22709647938609;-7.81511316541582;-6.62838428746909;7.05814873799682;-3.99674999993294;-7.25658240262419;-0.495684007182717;8.72276860754937;-0.546008120290935;-6.34250553324819;9.26251647993922;6.3378865737468;-0.203867540694773;4.14237005170435;0.989834126085043;7.77946672867984;5.44489343184978;7.29374757967889;1.70455596409738;4.79492489714175;6.64482740219682;-9.03949208091944;-1.40150342602283;-5.57738986797631;-1.74825127236545;-1.15760928019881;4.64697171468288;1.62063849158585
+-6.18999034631997;-2.89904119912535;5.47200730070472;0.608036601915956;1.2307620793581;-6.05180263053626;-5.35064739640802;0.671287360601127;-6.29805590957403;2.94401241932064;4.34555194806308;3.51935054641217;3.30969431903213;-7.45100515428931;-5.88149430695921;8.52946079336107;-6.47281181067228;-6.92870030645281;7.53942786715925;6.71508303843439;2.33556279912591;-3.46733850892633;7.28086438030005;4.14440138265491;9.26498039159924;5.0236459588632;7.68794066738337;-6.67125489097089;-1.47491356823593;0.47538741491735;1.97679908480495;-1.25582712702453;7.55690325982869;-9.09282457083464;-4.60562052670866;6.32844035048038;-1.63582686334848;-7.7906201640144;-6.02971228770912;2.90727159474045;4.57233566790819;-6.97235418949276;-9.35461165849119;-3.13052962068468;-4.3742404691875;7.2924563428387;2.431152863428;8.95015500951558;1.13521439488977;9.33174176607281
+8.82391363848001;6.93405598867685;-4.32556035462767;-9.28066507913172;2.88769792765379;-6.71239790972322;0.612691543065012;-3.69145249016583;-2.3223581071943;4.89758805837482;-0.280748996883631;9.06847022008151;-8.26036601793021;-3.78479862585664;-8.34769956767559;-0.497442344203591;0.545383649878204;-8.60269096679986;1.45250325556844;-5.83539239596575;-5.31945702154189;2.01017672661692;8.99847276508808;-4.57829297054559;-6.73880299553275;-6.84036950115114;8.10040366835892;3.28650006093085;-0.745348506607115;4.8122379835695;-0.904234889894724;8.65553590934724;3.3961871964857;0.616362043656409;6.06208660174161;5.1428898004815;-0.977819180116057;0.155783086083829;4.39900927245617;-2.90600827895105;-1.82333080563694;7.0848698168993;3.35924342274666;-6.79321852046996;0.83061286713928;-8.76323040574789;2.22358791157603;2.30245322920382;-6.19110965635628;-8.24563961476088
+-7.2074040863663;-6.58911434933543;5.39981002453715;-6.66059087496251;2.49625192023814;0.329945236444473;-9.60694596171379;-3.36876588407904;-6.00919485557824;0.888561494648457;4.36754138674587;7.68113921862096;9.88073176704347;8.77691654954106;6.36624320875853;0.742281461134553;-9.18085060548037;6.28553843125701;0.516336052678525;-4.19230399653316;-1.07459411490709;-3.69776942301542;7.47134583536536;3.61779130995274;-1.25194079708308;-0.235315370373428;-2.73388172499835;5.22251767572016;-4.38959214836359;1.58340147696435;-6.84890246484429;-1.14067037124187;8.14248995389789;6.25048961956054;4.46602103766054;5.0937467161566;-0.274897692725062;8.54844685643911;7.54961409140378;4.48220821097493;6.33607318624854;4.5519052259624;9.03439571149647;8.1594356149435;5.33103166148067;4.28442451637238;3.23517377022654;4.26317188888788;-2.03604876063764;4.07691245432943
+-1.97750920429826;-5.21170406136662;5.29398586601019;2.9298631940037;2.71872031036764;5.05324863828719;-3.01751235965639;8.84446229320019;-0.180215062573552;-0.73728411924094;6.28141317050904;-9.52332561835647;8.78852944355458;-8.10995562467724;6.72388267237693;-9.75892403628677;8.55991824064404;0.796198337338865;-0.421855919994414;8.9274726761505;5.74414959177375;-5.61079922597855;1.74433350563049;2.06946072168648;-5.88748630601913;7.65985953155905;0.954321678727865;-3.50388170685619;-4.76723367813975;9.28428760264069;6.15136929322034;-8.9112085942179;3.07347420137376;2.01631204225123;-8.90713632106781;-5.5793876433745;7.25688466802239;3.54378206655383;8.02536692004651;-4.58785366732627;-3.61664316616952;2.12031902745366;-9.78302544914186;3.5716555500403;3.15413188654929;-4.21961171086878;-7.36363738309592;4.06998954713345;-5.57889316231012;-5.92606509570032
+3.19909994024783;-9.10929650068283;4.27442864049226;2.8961667465046;-8.72942726127803;-6.10455685760826;0.243805604986846;-3.79712807014585;0.0998182082548738;4.70164790283889;9.82713827397674;-5.17023807391524;7.32946954201907;-7.00850563589483;6.12986507359892;2.974619618617;-8.43344592023641;-7.62494274415076;-4.57830943632871;-1.53353486675769;1.44321556203067;-2.09058369044214;-8.91670180018991;-7.05642845015973;6.80273296777159;-4.55914824269712;-7.16294179670513;6.00812579970807;6.61762140225619;5.01127382274717;7.71540152374655;-9.08127579372376;-1.30275829695165;5.48699955455959;7.01767654623836;9.29536865092814;-8.32672083284706;7.64515112619847;-5.43272183742374;7.3316686693579;-4.35330439824611;9.29456050042063;-5.04497813992202;1.09350302722305;3.9326743921265;-9.54251074697822;-2.78958857059479;0.806468068622053;-8.3102493127808;-3.64598507992923
+-4.42683343309909;-2.65953115653247;-4.08126171212643;7.51229572575539;-8.75984517857432;7.24462479818612;7.92206697631627;3.93105175346136;-0.577038913033903;-6.1121272156015;-6.25875303521752;-0.12128684669733;-6.94079138804227;2.56319291889668;7.42887553293258;-1.55572551302612;-9.12936742883176;-6.88578765839338;8.54028175584972;-8.0706226779148;5.64297837670892;2.55666562356055;8.69298056699336;-9.67087593860924;8.32124466076493;4.75034237839282;-6.39755947515368;-9.86583662685007;-9.59930378943682;2.15447430498898;2.60978083591908;-9.02492079883814;6.51004285551608;-9.04680627863854;-2.74441007059067;-1.38667373917997;-2.88165495265275;9.84877930488437;1.10887533053756;6.66374658234417;-1.72938954085112;2.35288620460778;-9.11183001007885;8.44148928765208;6.6289784386754;8.81467163562775;8.48799383733422;-6.01479887031019;-8.0818656552583;-4.83021007385105
+-1.00780457258224;-3.12241953331977;1.14186963997781;8.46221962943673;9.70311262644827;1.62427699193358;4.85718935728073;-3.43495892360806;-6.11930601298809;4.48621047660708;7.16295519378036;-4.20717918779701;6.30848148372024;1.33969656191766;3.32829313818365;5.10542567819357;-2.61976774781942;0.513579482212663;-7.21292211674154;-2.19503489788622;0.81789490301162;-9.36456049792469;-4.48135544080287;9.17696073185652;-6.70669915154576;-4.64259206783026;-0.0313382502645254;-0.87486517149955;6.51621045544744;-5.91864337678999;-4.10994870588183;-3.39652915019542;7.59974529501051;7.55740130320191;0.344195896759629;6.15099901333451;8.7406008830294;4.5747328735888;9.03824046719819;5.16995188780129;1.93171956576407;2.49224812258035;6.54476013965905;-8.33562597632408;9.94219330605119;-6.89149430021644;-5.45725639443845;1.10147409606725;2.35786264296621;9.21824536751956
+3.508220911026;-8.37041154969484;1.47649184335023;-0.168524482287467;4.44535099901259;6.39739027246833;5.16317438334227;-6.1089969612658;6.3644908554852;-3.73278624843806;9.37531264033169;-0.23818647954613;1.56378269195557;0.784909939393401;-7.86568795330822;-5.752122416161;-6.47520557045937;4.05212988145649;-6.92029261495918;-3.36258471943438;1.99681537225842;-1.19211972225457;-6.40348813962191;-2.6117178844288;4.14505429565907;-6.51697845198214;-9.77395982015878;-0.252966741099954;3.60116204246879;-4.89167187362909;-9.89703107625246;-8.98762253113091;-4.96908225119114;-7.88975509814918;-4.70982759725302;8.96989137865603;-7.87718508858234;-4.80202125385404;7.72188774775714;9.00675571057945;-3.91329480800778;-2.6617670012638;2.25651202257723;-2.76957236230373;7.38560207653791;-7.84111845307052;-6.31706991698593;-2.95365523546934;7.97793868929148;0.370111805386841
+0.790796657092869;-0.305668511427939;-8.83194700814784;0.845253905281425;-5.47151085454971;2.73825395852327;-1.65388620924205;7.87636140361428;-4.32104048784822;4.29341500625014;-6.34137095417827;3.54803372174501;-6.68902239296585;0.917561976239085;-8.52709270548075;9.93958227802068;-9.89874674938619;-7.66556123271585;8.21022649295628;-6.61650194320828;-5.92985277995467;-3.207828826271;-5.64399983268231;6.58167721703649;-5.66939694341272;0.970545154996216;-9.02502146549523;-4.3556113820523;6.47996780462563;1.17626396007836;-1.39309485908598;1.85735539067537;2.87813828326762;6.40437889844179;-5.63711635768414;2.48078885022551;8.24699006509036;0.21504667121917;-2.58789849001914;3.16612878348678;1.42585075460374;1.82480591349304;-1.2128930632025;-9.06600701622665;-8.97587907966226;4.66839961241931;6.43922708928585;6.33819255046546;-9.57959039136767;-9.11523401737213
+3.52479954715818;9.07612181734294;9.13105230312794;-3.19056758657098;3.61459624022245;4.76725474465638;-0.859897155314684;3.21796644479036;-1.62061078008264;0.794236250221729;-9.74958803504705;-2.49639989342541;9.04270286206156;-0.838942993432283;-8.70077252388;-7.30220446828753;2.76631386484951;-4.38567272853106;5.99348291289061;6.5029977215454;2.57700253743678;-1.20600725989789;-8.61054419539869;0.604196023195982;-5.09381465613842;6.50153913069516;-0.932367704808712;6.34226120542735;-8.26511617749929;-2.79025986790657;-3.09881550259888;-5.86307171732187;-4.80057631153613;0.92703933827579;-7.34696300700307;3.23090828023851;-0.105695924721658;9.50090489350259;7.76185750495642;5.63324259128422;-3.7652263790369;-2.23893922287971;6.27920161467046;1.37893187813461;-3.61076751258224;-7.20604675356299;1.27877499908209;-6.95683129597455;-4.63703219778836;9.34457608964294
+9.42792478948832;1.79173714481294;-8.83588847704232;9.03160407207906;-1.12665064632893;3.54119814932346;8.9847440039739;2.36017175018787;-4.23284582328051;-2.40224641282111;-6.39312745537609;3.24562240857631;-6.69468488078564;-8.53720226325095;-6.80358875077218;-2.35494617838413;-0.887250825762749;7.26793575100601;-0.139385503716767;-6.60204165615141;4.15703419595957;9.93006150703877;1.3378267781809;0.469139292836189;-8.55192816350609;-8.70951033197343;-1.06218051165342;0.310709718614817;-9.31268179789186;-7.39951421972364;6.23104190919548;-3.52858059573919;-0.210526064038277;5.08108494337648;-7.11799460463226;-5.1721994811669;7.12855459656566;6.09804395120591;5.81695154309273;4.3319796724245;-5.92803511768579;5.06669278256595;1.39786747284234;-9.63656146544963;9.68601448927075;-2.70654186140746;-7.29532702825963;3.10248360503465;-4.64136809576303;8.66296981927007
+-8.50401147734374;4.5914801210165;0.852371877990663;4.89518234040588;-2.51540513709188;2.87312312051654;9.98047882691026;-0.74385738465935;-9.11578360479325;5.58321033138782;9.24936711788177;7.77873313054442;-8.6368244048208;-3.74186962842941;-4.96456573717296;-7.90028703399003;-7.11841878015548;-7.06995819229633;1.02115587797016;-4.98801856767386;0.217049801722169;-2.05337598454207;-6.08443035278469;-3.28932282980531;0.64328727312386;9.85321600455791;-6.27962950151414;8.44758423045278;-5.32093848567456;-4.81952053494751;-4.55441490281373;1.75490952096879;-1.66643579490483;-6.78414432797581;6.51849128771573;5.51577271427959;9.68286937102675;8.3213278464973;-9.09610885661095;-5.83131710533053;5.0370329990983;-5.49464255571365;0.0756950676441193;9.70022583846003;3.78612269647419;-7.57019630167633;-4.32620131410658;5.08162550162524;3.39177530724555;-5.43369045015424
+-6.3406087551266;2.52026097849011;-4.69241548329592;0.623455755412579;6.84819799847901;-2.65132881235331;1.61816818639636;1.2805492291227;-0.0857266550883651;5.37900016643107;1.42665598541498;-2.41055043879896;-4.40305531490594;2.61920158285648;-8.21523082908243;5.99852595012635;-0.894789420999587;-2.88282130844891;8.2150532817468;-9.3723754119128;-4.42739386111498;4.93454198818654;6.25699993222952;-3.8750328682363;-8.88567429501563;-6.40916280914098;8.90840174630284;-5.87495192885399;1.69805448502302;7.0679810969159;-4.15579873137176;3.57498956844211;6.723807528615;8.40322743169963;8.78277498763055;7.94595346320421;-5.29355793260038;6.789774550125;-5.94823975116014;7.70046763587743;6.82917811907828;5.75657728128135;1.65830940473825;-0.893370895646513;4.47505489457399;9.57572595681995;1.18132831063122;9.93587005417794;-2.39467846695334;3.22555605322123
+-4.90205138456076;-9.49331347364932;-5.09728376287967;2.167978445068;-8.30108064692467;-9.22161987517029;0.720972996205091;8.88817208819091;5.89752499945462;8.39208358898759;4.94418641086668;5.30896388925612;-1.25834849663079;-3.7295339256525;6.92978526931256;-3.55002663098276;-6.64718347601593;7.70053455140442;-4.19689622707665;-0.0644626235589385;-8.1607854180038;-4.75033127702773;3.15462619066238;-8.45896730199456;5.70506838615984;6.58006580080837;6.96905937045813;-2.64567589387298;-9.2160217044875;-9.09368834923953;6.20128462091088;-6.6847681812942;-6.87047251034528;-0.603168876841664;5.22797644603997;9.7832392109558;9.00861654430628;2.56432270165533;-8.93128791358322;-2.73463043849915;7.2795104701072;7.18340280931443;5.25814331136644;-0.116870966739953;0.274194553494453;9.1654017707333;-1.43554119858891;-3.74300207942724;5.79631687607616;-9.69362790696323
+-8.69463306386024;-1.57580969855189;-7.49815960880369;-9.14254488889128;2.9400821402669;-0.347977229394019;5.11138757690787;5.15072606503963;-9.51021414715797;5.05632291547954;2.96961848624051;0.232828971929848;-1.02447125129402;-9.4566061720252;-7.85616458393633;9.61717263795435;3.39381982572377;-4.58377881906927;5.67052725702524;3.20155232679099;-0.622063693590462;0.000554840080440044;-9.56018135882914;6.61918069701642;-3.25385118369013;-6.78169880062342;6.65985894389451;-9.96974786743522;5.73945212177932;-1.55048402026296;-4.26209037657827;0.617669303901494;8.70989023242146;8.98990499321371;9.48306899983436;9.00568921118975;-2.49897909816355;1.95671602152288;2.91018326301128;-6.09917889349163;8.80169735755771;6.7663351399824;4.34187800157815;5.72313737589866;-6.91851386334747;1.89817102160305;-7.24338172934949;9.45201537106186;9.37857157550752;-7.51560475211591
+8.27689591795206;1.99666962493211;-8.77978533972055;-8.39228676166385;-2.09242042154074;9.79728656355292;9.62230180390179;8.09036314021796;4.5292210066691;9.51740204822272;-5.23936495184898;-6.9597766501829;9.98155551031232;5.0999305350706;-5.70716180372983;7.31420148629695;-2.60135137010366;-0.0788930151611567;6.92875699140131;8.84206828195602;-6.96672081481665;1.55112818814814;0.35387403331697;-8.81568981334567;-8.65817919373512;0.126191503368318;9.43049007095397;-8.30579729750752;1.59438075497746;-0.261977971531451;3.50237905979156;8.03234689403325;-3.17822486162186;-1.99692141264677;-0.627687089145184;-3.51150374859571;-7.67014218028635;-0.0722854817286134;-7.5711494544521;-9.65599500574172;2.93120869901031;9.36773032415658;-2.93691101949662;-4.25363476853818;-8.13969431445003;3.94173499196768;8.25269416440278;-7.38626020029187;-3.45195922069252;-3.42096284497529
+-4.12582437507808;9.33213990647346;-6.63816643413156;-4.44879728369415;-0.785655276849866;2.16357245109975;7.10610381793231;-1.90307206008583;9.06363135203719;-7.35333725810051;1.52091695927083;-8.2965054595843;-9.71298461779952;7.6271896995604;-3.34979788400233;-5.70070710033178;6.58598077017814;-7.40762033965439;-3.84857010561973;9.21154408250004;-5.71228307206184;-8.83354367222637;-4.70642724540085;0.213604639284313;-0.073687438853085;-9.82524910010397;-9.74815708585083;4.16930603794754;3.1665819697082;6.45482060499489;0.488181966356933;5.96241873223335;-4.85907664522529;-8.5750058433041;-2.36049781553447;-4.69471250660717;-7.13195823598653;-2.50876605510712;1.54906118754297;2.50277873128653;9.85057396348566;2.15480760205537;2.54113291855901;2.67960674129426;1.42306068446487;-2.10383660625666;-6.06840668711811;3.06452539283782;6.40868505928665;-6.41094958409667
+-9.79701604694128;8.41780634131283;4.68373208772391;-9.61420649196953;1.86435046605766;9.10342033021152;6.1671423073858;1.28924548625946;7.59940932504833;-5.07401096634567;9.41063766367733;6.05666727758944;3.45492855180055;7.44151291437447;5.4632151639089;-2.17018962372094;7.37838910426944;-0.396751584485173;7.37898100633174;-4.64623012114316;9.08841694705188;-6.90806663129479;7.16136754024774;-9.57785041071475;6.14275820553303;4.90488178562373;3.23507562279701;-1.30999537650496;-8.72480250429362;-0.181203815154731;0.16717042773962;-0.782079645432532;2.23960675764829;-3.77999903634191;9.56239046528935;8.9037752058357;-0.714842979796231;5.10476880241185;-2.67571757547557;-2.10578347090632;7.98738100100309;5.29681359883398;0.574973844923079;-0.262904544360936;9.01519512291998;1.58872404135764;0.314693790860474;4.014922962524;-8.13309229910374;4.48212650604546
+2.86707506980747;9.99437420628965;-6.87443798873574;0.78949776943773;-6.36228031478822;-5.40995740797371;6.8091411748901;-3.6830671178177;-0.419756122864783;0.518813114613295;0.918815587647259;6.14214936736971;-5.55261994246393;-4.29844717495143;-8.44694900792092;4.81070086359978;4.81282328255475;6.04358912911266;0.331648234277964;-3.07000590022653;8.51289036683738;-7.7383781131357;2.43270221631974;-4.6216620830819;5.71097737643868;-2.73986547254026;3.00771745387465;8.26366719789803;0.656872079707682;-7.73973986972123;-2.41006447467953;-8.55496358126402;7.19616094138473;-9.6566754207015;-8.2459440594539;-0.358971226960421;-8.4852325450629;8.59016067348421;-1.05130626820028;-3.24577676132321;-3.18882305175066;-3.20990464650095;-9.91658235900104;-7.16417921241373;4.30088105145842;4.80146985966712;-3.95527136512101;-7.40698622073978;7.47819171287119;-1.47483076900244
+-1.9055395713076;7.19673475250602;-9.49155875947326;2.00596006121486;-6.6162357153371;-2.87561901379377;2.87395852152258;-1.1990177584812;2.98743216320872;-2.95973691157997;0.268614902161062;3.09290814213455;6.36957151815295;-9.98184197116643;-1.44934598822147;3.66187070030719;4.21329418197274;3.97133988793939;6.91825336311013;-2.86543378606439;-3.72914514970034;8.87905356008559;8.87816275004297;-8.4020841633901;-4.72796403802931;9.06124998815358;-9.78610653895885;9.18365455698222;-6.48770782630891;-1.49345427751541;9.36930490192026;-0.282558663748205;-5.31149661168456;0.219124020077288;-6.15291905589402;9.20870569068938;-3.03952971473336;-1.84984532184899;-9.639134532772;6.0432399995625;6.77749441470951;9.50673033483326;4.69980734400451;5.25937422644347;-9.44994871504605;4.93163706269115;7.8629667731002;-9.1593996854499;7.0792219415307;8.2972823921591
+4.5544915413484;-5.07355393841863;-1.25956093426794;1.37545123230666;1.4620567811653;6.21778680942953;-6.39393929392099;-1.58507856540382;-6.73812873195857;1.86490276828408;-8.23960195761174;7.66479449812323;-4.74494194611907;-5.55087639484555;2.69738534931093;-0.244169039651752;8.50821433588862;-8.09587190393358;7.12805147282779;8.00950230564922;-3.4404650516808;7.77855429798365;-9.66666211839765;-9.73976318258792;3.76527718268335;-7.36739443149418;-6.86182538047433;-4.99146879184991;3.95393116399646;-2.55547997541726;7.5605336856097;0.95625220797956;8.34275261033326;0.785373467952013;0.814141938462853;0.82791191060096;6.80471925530583;-4.75839384831488;-1.61200111266226;3.10800462029874;5.35727060865611;2.19464685302228;-1.82959465309978;9.42625254858285;8.6457228846848;-5.9477466205135;-6.02977020200342;-4.6641711704433;1.20475988369435;-1.90712523646653
+-8.14032736234367;3.52765763178468;-1.61763130687177;-0.820047245360911;0.612462740391493;-5.18772464711219;-1.45750217605382;3.36448149755597;2.79544399585575;-3.82851323578507;1.65740632917732;-4.61249715648592;5.3815577365458;-5.43277536984533;-6.50253160391003;-8.07763365563005;8.80965556483716;9.55332934390754;0.943094152025878;8.49984985310584;5.75352696236223;-6.06264850124717;-5.49861507490277;-4.55566884484142;-2.0733023667708;-2.53643434960395;-2.47373111080378;6.12848618999124;-7.16343694366515;-1.19014707393944;-7.93096653651446;-9.02238451875746;-4.53868053387851;4.6723991446197;-8.51063243113458;-4.97975703794509;-0.965737015940249;1.70380107592791;1.4633609354496;-0.367587362416089;4.01702380273491;0.743841943331063;2.85206605680287;5.69153688382357;0.511521464213729;9.02903440408409;0.944787478074431;7.1405735053122;2.06687046680599;1.20340092107654
+5.25210387539119;7.39213094580919;-7.6782790152356;8.87099163606763;-8.16121452022344;-8.52706918027252;5.35080088768154;2.65164258889854;1.58070020377636;5.60676149558276;9.85057897865772;-0.339681999757886;-1.26070504076779;1.38642223551869;-8.05265588220209;-3.02056669257581;7.75394339114428;-0.0573388300836086;-8.37702564429492;-4.82946320436895;-2.59702689945698;-0.640411917120218;9.60580035112798;2.87219792138785;4.95854143984616;0.00539291650056839;3.09428973589092;-7.9881330858916;8.27404351439327;6.13781211897731;0.541881788522005;-3.35351219866425;4.83106748666614;-3.49259464070201;-0.524957356974483;8.47593734972179;-3.12410345301032;2.63012849260122;-6.5633330354467;-3.13064152374864;3.3447769517079;1.27911321818829;-7.38141245674342;5.3459590068087;-5.00196790322661;-3.5465806350112;8.99227125570178;2.57552512921393;2.93833598028868;0.583903845399618
+-0.607435181736946;-8.57779789250344;-1.03203933686018;-6.09366004820913;9.7625153278932;-8.86751341167837;-9.53049757983536;-6.0512841725722;-8.73903045896441;-6.19153189938515;-8.54663754347712;-9.38305440824479;4.18933322187513;-8.75551992096007;8.34806928411126;-3.94054638687521;-4.35130827128887;6.76772067323327;-7.471585245803;4.3343635648489;5.84242941811681;-9.00026824790984;7.18356913421303;4.94177899789065;-0.486275758594275;9.2307932022959;6.0768819693476;-5.98855473101139;-1.20289846789092;-4.07445393968374;-4.54563970677555;7.94524814002216;4.31595574133098;4.20476016588509;-8.65517749916762;6.57401224598289;-4.28902839776129;2.31542661320418;1.27183344680816;8.21590887848288;-4.75271612405777;-2.04530862625688;3.41265307739377;3.40517899021506;7.10917460732162;-2.59375364053994;-6.29297694656998;-7.30007561389357;-1.61899278406054;4.49719647876918
+0.316534345038235;4.85579585656524;-9.51594197191298;-5.40443098638207;6.52125573251396;5.64861403778195;0.0530292931944132;-0.949580352753401;6.78486157208681;2.30013921391219;1.90041024703532;2.50681472942233;-6.68208161368966;-6.50950179435313;-5.92104440554976;0.753119233995676;7.76442528702319;6.89517251681536;-8.50403419230133;5.7193565228954;0.31300138682127;-3.73413267079741;3.10483125038445;-7.8274951595813;-6.86974655371159;-2.6985887857154;-0.352621064521372;8.99940754286945;9.89198453724384;-8.234978094697;-0.980507479980588;8.47552075982094;8.58291591983289;6.51038828771561;8.24252993799746;-4.70909711439162;4.40748018212616;-1.40203851275146;8.96753245033324;-4.99626042786986;-9.46494646836072;-3.77734441310167;-1.41931410878897;-0.0224698521196842;8.84366611018777;-9.61147433612496;-4.84616274945438;3.63190074451268;1.35761508718133;-9.36787838116288
+0.83659048192203;5.05299378186464;4.7632589424029;-9.38892582431436;-0.838347119279206;-2.51799550373107;-1.83160331565887;-4.60148960351944;7.83395621459931;7.13261562865227;-8.38008266407996;8.69043004699051;-0.76537202578038;2.61369714979082;-8.12359760515392;-0.281719681806862;9.51477109454572;-7.67043383792043;-7.00673907995224;2.44982382748276;2.20566452480853;7.43600688874722;-0.12379520572722;3.10491532552987;-8.50646079983562;8.75100534409285;-7.61367995291948;2.26415817625821;-6.70040364842862;1.00594270043075;2.59169648401439;3.59813840594143;-5.25472038425505;-8.82329287473112;2.61971853673458;8.29947899095714;-6.37669785413891;4.26457539200783;2.53356738016009;2.9609639197588;5.29849748592824;6.78740506060421;-1.38773881364614;4.2378852609545;-6.26694520935416;8.72493854723871;3.38200774975121;9.98059984762222;7.33467714395374;9.57394378259778
+3.21077594067901;4.94690019637346;-1.9329564506188;-2.68348155543208;8.29521401785314;-0.0872677331790328;9.80444651097059;-9.62995049543679;7.49867053236812;0.373104545287788;8.42865655664355;-8.5815907549113;3.97980380803347;4.36460334807634;-6.61758844740689;-0.311262393370271;9.43566404748708;-0.83735394757241;-2.85330581478775;-4.70145368482918;-3.14170357771218;3.02539701107889;-8.26050906907767;-7.98934230580926;8.49568411242217;-2.30491954367608;8.86419584043324;5.2222540974617;8.12600307632238;-1.94678911473602;-5.88351112790406;-4.49323174543679;-8.24676240794361;9.42196121904999;3.68163034319878;8.48566188011318;7.45363098569214;-3.11597641091794;-3.56744905933738;-3.26261204201728;9.64472283609211;-0.641348478384316;-8.29989743884653;-0.778174581937492;-3.84299632161856;9.06119785271585;2.05083237960935;-8.00742004066706;-9.51395190320909;-6.2248536804691
+-8.80953424144536;-6.26644219271839;-4.35066811274737;-7.51698418520391;1.93337107077241;-9.3531416868791;8.01039023324847;-5.46777385752648;2.18706842046231;-6.16950612980872;6.06029677204788;0.873433486558497;-1.66038176976144;5.16859433613718;7.81237726099789;-5.64042353071272;-4.03564281295985;0.806399094872177;6.76030667964369;-4.99598454218358;1.16621098015457;3.88540446292609;9.27718575112522;-1.08230180107057;7.78263555839658;1.54359728097916;-0.511861923150718;9.2677791742608;7.38356412388384;-9.10679307300597;-4.97157610952854;-0.19477631431073;3.52962946984917;-2.46414735913277;-4.99102174770087;-9.63643073569983;-6.08171962201595;5.4776560747996;-4.97163775376976;6.61302676424384;8.06507073808461;8.20173625834286;-7.70966949872673;-6.61073814611882;4.6355271153152;-3.11433415394276;-4.89181558601558;-1.30851223599166;-3.69512655306607;-5.11796618811786
+0.389959397725761;-1.8392796209082;8.15746320411563;8.81743130739778;-9.55418068915606;0.303716827183962;-0.124281337484717;2.58145359810442;-8.94505776464939;1.76411067601293;-5.41388932149857;6.86341973021626;-2.4002989847213;-8.24708099011332;0.554120987653732;5.82327020354569;6.16716720163822;0.415079235099256;-7.47244188096374;0.176945389248431;-7.23641445860267;5.1597852492705;-5.23881112225354;8.03650898393244;-5.52713779266924;-9.85978229902685;6.90024834591895;1.17765450850129;3.60767122358084;9.15455336216837;2.27297156117857;-9.95470080524683;-2.33834126964211;7.66574618406594;4.51280252076685;0.116825536824763;6.90424179658294;-2.87219517398626;2.51122182700783;6.17868727073073;-3.77466984093189;-4.3522620992735;1.85439884196967;8.806336754933;9.49743019416928;-8.81119028665125;-0.271330894902349;6.29008654970676;-1.93085529375821;6.41151667572558
+-8.57393995393068;7.08974332548678;8.36523013655096;-3.59540650155395;6.82951823808253;5.23337120655924;7.41193688474596;-7.25992619991302;4.41365682985634;-2.4351133685559;4.74616640247405;-8.53937163949013;0.826874012127519;-9.03044596780092;7.1337473532185;-7.64146413654089;3.55636827182025;6.31754708476365;-9.65060587506741;6.31403451319784;-6.44362856633961;-0.266904984600842;0.987185244448483;-3.32661009393632;-8.29766058828682;-0.523954615928233;-7.23969505168498;-2.7404208201915;8.52293891832232;4.03488797601312;-6.46920797880739;3.26956118457019;-3.23818278498948;6.44556982908398;5.81944096367806;-2.9962354991585;5.92108539305627;-8.70039769914001;0.493016107939184;-6.64702890440822;-7.0927205029875;1.79288160987198;-2.48738626949489;9.06889098696411;-4.9418787099421;-4.08262504264712;-2.41161247249693;2.34559600241482;-6.96458895225078;-8.28720529098064
+-1.06228482443839;6.03792135138065;-7.44441461749375;-4.69746742397547;-0.554328514263034;6.11196629237384;2.92160672601312;1.35680493433028;6.37636314611882;-3.72903176117688;-9.19027257710695;1.28955706488341;5.68021176848561;2.1611547190696;-7.12573830038309;-6.68124425690621;2.55627882201225;3.7248766515404;2.16551599092782;9.86644382122904;7.68462513107806;2.43160285521299;-8.99505646433681;-7.81063195783645;1.40017960220575;-6.18591049220413;-1.81491534691304;0.514184031635523;-8.56428889557719;-9.82413906604052;0.094589963555336;9.75202944595367;-6.92809709347785;2.19934315886348;8.6264938255772;1.90603709314018;-0.77644158154726;-0.778299947269261;-9.70696386415511;-7.48056669719517;-0.517354873009026;-2.86890924908221;-3.77920784987509;-1.587995714508;-6.47590936627239;-7.76299787685275;-6.59847404807806;-1.26784544903785;-9.21983082313091;1.16886359173805
+6.91860208753496;-6.67035263497382;-0.874993721954525;-4.35497237369418;-9.69570108223706;-6.77402595058084;-8.14395159017295;0.491899182088673;-0.910623408854008;-3.94026707857847;-0.617207461036742;9.06701318919659;3.18452451378107;7.64979151077569;7.04491299111396;-9.72441794350743;-1.17947142571211;0.253233686089516;8.83897838648409;-3.62807603087276;5.22751998156309;-6.12197251059115;-1.58498665317893;3.7109847413376;-4.25962190609425;9.30803728755563;3.26034512836486;6.06200096197426;-9.76837543770671;7.08425327204168;-3.32373599987477;-9.67540088109672;-6.92970734089613;-9.56357557326555;1.51831703726202;-0.979277831502259;6.70138230547309;-5.80961316358298;-9.73287588916719;9.95737380813807;-8.77932744566351;8.94714494235814;-4.88451763056219;1.05128690600395;8.46371881663799;5.16668249387294;5.86396459955722;-4.08493327442557;-1.84090652968735;4.1493414202705
+5.45460110530257;6.55276417266577;9.77412060834467;-7.4157200474292;-7.4389843037352;-6.9704103237018;6.00653798785061;-8.79160965327173;1.31193143315613;-9.5218651695177;6.24148211907595;3.60163398087025;-4.60851274896413;-3.51563943084329;-0.631562466733158;1.65049562696368;-4.80870923493057;3.71903289109468;-6.90973691642284;4.44493972696364;7.76355054695159;3.45174088608474;7.54361702129245;-7.53600655123591;7.18486444558948;-8.54463370982558;-9.39622168894857;-3.92271944321692;2.3197080893442;-5.15025401022285;-9.30484144948423;-9.33073982130736;-1.66229232214391;-1.47412831429392;0.0562406564131379;-1.7506610089913;-4.19590657111257;-6.37022403534502;9.24333764705807;4.63271207176149;-6.31949646398425;7.81948260962963;-4.25788121763617;2.53610464278609;-6.96914018597454;-5.03025754820555;-8.84790370706469;-3.98401740938425;-7.2972294408828;0.126817617565393
+6.28398277796805;-7.2657062811777;7.17382790055126;-3.69328191038221;-4.26757763139904;7.91790408082306;0.860767313279212;-4.20746754389256;-0.811078427359462;8.92806275282055;-2.1993380272761;-4.65154523495585;0.093799508176744;8.45522540621459;-6.92119023296982;-3.73361739329994;4.82420654967427;-2.10580450017005;-5.51670510787517;-6.90581709612161;-2.07016156055033;-7.16143102850765;2.90661159902811;0.520067452453077;7.25945292040706;5.51875114906579;-1.46659343037754;9.28044541273266;6.46018193103373;2.59434508159757;-1.00467436015606;7.80377476476133;5.0320157315582;-5.25640518870205;7.56219502538443;-8.99534815922379;-8.44164839945734;-5.89737694244832;9.84384888317436;3.40801878832281;-1.52352213859558;5.98559646867216;0.715890317223966;-1.12972444854677;5.30319002922624;5.92095705680549;-8.10594452545047;-6.37482196092606;1.36547615751624;4.4244628585875
+1.17858408018947;-7.78241307474673;-2.19016138464212;2.4183292593807;2.43922696448863;7.75614299811423;3.42426695395261;-1.52872789185494;1.8674489017576;-3.11214508023113;-1.66147133801132;9.65685945935547;2.0539545500651;7.95718860812485;-2.82001351006329;8.78485488705337;-8.55199223384261;9.47149782907218;-2.69006352405995;5.87171663995832;-3.24826740659773;3.68161730933934;-5.92508691828698;6.0316742118448;3.50334915798157;-3.71955846901983;-6.27866766415536;-8.93821572884917;5.30806259252131;9.65420433785766;-0.340762319974601;-1.24841116834432;0.641623558476567;7.78446984943002;-0.190294617787004;4.96813970152289;-9.71176461316645;4.98057190328836;9.23755552154034;-8.88756968546659;-4.65563950594515;4.02594391256571;4.35231161303818;5.46325506642461;-2.60244176257402;-6.58563665580004;4.8456671833992;-2.12043206673115;-4.32773591019213;-7.46460216119885
+-5.70879332721233;0.688178665004671;-0.00491475220769644;2.92294911574572;-8.74659787863493;-1.69998010154814;8.4937945753336;-0.980966165661812;8.86648426298052;-1.12665721215308;-9.34168538544327;0.0708714826032519;-0.996461673639715;9.92660240270197;-9.01697345077991;1.74918481148779;-7.7310163108632;-7.73487287573516;-4.06677180435508;-8.89255720656365;-3.74521539080888;-9.11711280234158;4.86311137210578;6.55741200782359;-3.27180138323456;-2.79901137575507;-7.23879435565323;3.80275023635477;4.85590634401888;5.7333468599245;8.38933817110956;5.11195491533726;-9.08292802982032;-6.48951762821525;0.542274741455913;-3.04924800992012;-3.91630100551993;0.472397170960903;-0.587223223410547;1.42286984249949;5.37323087453842;3.6092672124505;9.07335772179067;-3.36998488754034;9.60549661889672;-6.13193342462182;-8.92539020162076;1.30873643793166;1.67602774687111;2.09316059481353
+0.904657300561666;2.53450419288129;8.78505495842546;3.52517602033913;3.45617428887635;1.86788577120751;-4.92829923518002;0.863321726210415;-7.54422215279192;-2.97792103607208;6.53102980926633;-8.57122032437474;-8.37148773018271;6.93353895097971;8.88658265117556;3.46773007884622;-2.45132819283754;1.85745242517442;-6.3460603589192;-4.91079698782414;-1.58952195663005;-0.101563143543899;5.59465010650456;5.89202701114118;4.18189133517444;4.64128393679857;-0.715409126132727;0.529293278232217;1.14291221834719;-9.73887359257787;-6.79954290390015;-0.193516444414854;8.96659469697624;2.41599187254906;-8.21617754176259;-3.45096854027361;1.99467342812568;1.44197082612664;-4.6375791169703;-0.40071411523968;7.20769257284701;-2.8103741677478;-1.74095689319074;-5.89126886799932;-0.874087102711201;3.73424340505153;-8.89404637273401;4.13496837951243;-7.72802661173046;8.46320623997599
+-2.53197703510523;-9.10033765248954;-2.15669664088637;-2.35229820013046;7.12552270852029;3.71359564363956;-2.02172331046313;9.38536966219544;9.35092031490058;-1.62867454346269;-2.49908971600235;-1.83032405097038;3.79577487241477;4.72478931304067;-1.66842305101454;-1.9494027690962;-5.96953279338777;-1.04720265604556;-7.71695964038372;-7.93585166800767;6.89231362659484;1.87218579463661;3.47153833135962;-6.51895791292191;3.75199492555112;-4.75210011936724;-3.65536973811686;-7.56622805260122;1.5360897872597;-4.81049984227866;5.4549068864435;-1.56778260599822;-4.70490799285471;-3.57994272839278;-5.67454937379807;8.27888809610158;5.54019138216972;-8.038215120323;-7.04737371765077;6.75324061885476;-9.34328905772418;-9.65172574855387;-2.76166061405092;3.46901847049594;5.52273858804256;0.745911402627826;0.161566226743162;9.46246444247663;-0.134702743962407;-0.372281693853438
+7.33751705382019;-5.39394373539835;8.97936861030757;3.90432733576745;1.26899187453091;1.95660208817571;-0.846501206979156;0.551006160676479;2.09229260217398;4.01522838044912;-3.82153962738812;-7.20648965798318;7.76550442446023;-4.90782615263015;-9.13146500010043;-3.70581006165594;-1.24923864379525;1.19176662061363;4.42575864028186;-6.43586108461022;6.42738189082593;5.74080475606024;7.21914323046803;9.43984671030194;-1.51742544490844;5.98069887142628;0.395186701789498;-1.85074949171394;-0.491810948587954;-8.49018273409456;3.78557935822755;-6.540686939843;6.02094395551831;-9.05542124994099;9.63057048153132;-3.19633895065635;8.72754849959165;-8.13109650742263;-0.489551383070648;-3.78635996952653;8.79996698815376;3.23201613035053;-8.07510597631335;0.590360811911523;8.90303335152566;2.83721358049661;7.91075536981225;5.09223131928593;2.74238063488156;-7.73498951457441
+2.45756761170924;-1.75811498425901;-5.55493999272585;9.76235794834793;7.00124145485461;8.51742659695446;9.79065185412765;5.67820763681084;3.86831898242235;-4.47066200897098;0.755994375795126;1.55493630096316;-0.124284960329533;0.824993220157921;-7.50098941847682;-3.27472204808146;7.31382853817195;8.88189358171076;0.764291733503342;-2.14086145628244;-8.50238561630249;-2.74367111735046;9.04067064169794;6.8223410891369;3.87194559443742;-1.47992454934865;-8.51931388489902;-1.44365921150893;-3.37857009842992;-3.11298702377826;-7.46677787043154;-8.55852603446692;5.49902260769159;-8.45443927682936;7.58247877005488;-4.65997071936727;8.89170825015754;6.38291700277478;1.10265413764864;-5.53134931251407;4.04384706169367;-6.75683927722275;-0.908254743553698;5.9033886808902;1.12981245387346;0.928667229600251;3.88623404316604;-4.10668841563165;-7.91797217447311;-6.9656286528334
+-9.68539971392602;3.25756878592074;-5.58685212861747;-0.106556233949959;6.75127055961639;5.81252279691398;-7.87703800946474;-4.61785912048072;1.7217861302197;2.39691704045981;5.47164970077574;3.24458546005189;-6.69605115894228;6.82703250087798;-0.174100669100881;-7.21131109632552;1.65630633477122;4.68767112586647;1.99674016330391;-5.36094699520618;-6.21156367938966;2.33531289733946;4.56204061862081;-0.340575203299522;-2.37647056113929;-8.59817288815975;8.33403107710183;3.33233840297908;-3.89455786906183;7.67132556531578;9.7110108518973;5.40258788969368;-8.48375346045941;7.10923964623362;-3.48191462922841;-5.10722616687417;5.07291667163372;6.28913316875696;-8.31979295704514;-6.27674295566976;3.09110087808222;2.68496077042073;2.61983125004917;1.3396777305752;-5.91613451484591;0.911181862466037;-4.52109396923333;-3.59130095224828;-3.17676933016628;-0.702075236476958
+2.75739633478224;0.975936492905021;-2.50566658563912;-3.62793597858399;-4.86996096558869;8.60804095864296;-1.98335045482963;-2.72658841218799;5.21981784142554;8.09452272485942;-6.50541228242218;7.18933712225407;0.414922358468175;5.57451302185655;4.71636217553169;0.872014029882848;-1.25434716232121;1.12444006372243;-8.52754519321024;2.87367307581007;9.14855210576206;-2.26510733831674;-4.8503985023126;2.26077073719352;6.90457687713206;9.39341070596129;0.606947327032685;1.21062601916492;-4.71252759918571;7.55131305661052;-1.03266155812889;-0.00349230132997036;9.07334731891751;-4.4279914861545;-7.25856069009751;5.14303853269666;1.61175615154207;-2.59391250554472;-3.16036144271493;2.93107841629535;-0.960731622762978;9.26685845479369;-5.71439674124122;3.57607674319297;-7.24905188195407;-1.20369793381542;-2.28288420476019;-2.32572861015797;4.18264000676572;-8.89962213579565
+6.44564392510802;-2.67384049948305;-6.57741490751505;0.873691309243441;1.63998847361654;0.291062043979764;9.64715232606977;-5.1813497999683;5.24666407611221;8.71679187752306;-9.98080814257264;3.93201538361609;-7.9631683556363;-2.65321439132094;-4.66331230010837;-3.79923573229462;-7.11350915022194;-7.17976265586913;2.2050014231354;9.2135170288384;-0.345449117012322;-1.29826918710023;3.39615950360894;3.26544479932636;-7.86760402843356;-7.43265011813492;2.17560122255236;-4.38948880881071;-6.64937370456755;6.1180602805689;6.9541593035683;-1.10468006227165;9.63865716475993;5.47907536383718;2.90935065597296;-3.5374956484884;-3.38090053759515;7.03624990768731;-7.68724595196545;-9.20749126933515;2.20215589739382;-8.90778907109052;2.5832800893113;-3.22003698907793;1.41440861392766;-8.98586420807987;8.5658928565681;4.84592974185944;-5.76722124125808;6.97718877810985
+8.67946958169341;3.4833551151678;-6.61140421405435;-7.07610000390559;1.829729443416;-9.24187393859029;3.36165560409427;6.84402123559266;-6.50880533270538;9.45837174076587;2.93337886687368;5.68558517843485;7.30419246479869;-0.949981212615967;5.77722899150103;5.41540766600519;-3.28222951851785;-8.92962900456041;-7.14013548567891;8.1407381221652;-6.33846293669194;7.74697369895875;3.80557643715292;9.17136916425079;6.38030983973294;-8.02773985080421;-7.7870996389538;-5.57869080454111;9.01879916898906;7.07253214903176;-3.13018032815307;3.01929673645645;-2.55415711086243;5.59011637698859;-5.42114949785173;-8.56278161983937;7.7506029419601;-8.22441546246409;-2.72874669637531;9.92303123697639;1.04252211749554;-4.46220649406314;9.40187325701118;-7.35281874891371;-9.42508724052459;7.60752508882433;-6.13356879446656;-1.17443501017988;-8.65507181268185;-3.50855915341526
+4.31603640317917;6.0983418719843;7.98001465853304;9.702383056283;5.788449421525;-9.6992511022836;0.751671520993114;5.72402642574161;-6.56086623203009;-8.14781580585986;-8.5026995325461;-2.06920829601586;-5.88958289474249;4.15790643543005;-2.98511558678001;1.23632055241615;-2.84400852397084;2.98509567510337;-8.58745833858848;9.20195610728115;0.562871862202883;-2.37032048869878;7.28774977382272;-7.48539788648486;-0.369366519153118;8.68970898445696;-5.99870771169662;0.12819800991565;-2.7592148212716;-3.52074214722961;-5.54994197096676;-9.96846592985094;-2.69346251618117;-3.77527982462198;9.45722617674619;-3.53874537628144;4.85570863820612;-9.82899568043649;-0.415683682076633;5.33842940814793;-5.66485447343439;6.36788605712354;4.50477785430849;1.23192914761603;9.39458650536835;9.01956884656101;1.58383049536496;9.77645097766072;5.42337217368186;-1.64176743477583
+-7.70350125618279;-3.97380971349776;5.19960747566074;-4.38791948370636;-6.18224503938109;-1.38662185519934;-6.87152039259672;-6.53129175771028;-1.60215020179749;-2.25635383743793;-7.85844179801643;-2.94027282390743;3.59643143601716;-1.05072289705276;-7.3486432665959;2.34560098964721;9.52078453730792;5.7729694340378;-7.6778070628643;8.15683328546584;-3.83751065470278;7.52963287290186;-1.1687992606312;0.276584876701236;2.21786157693714;-3.40146514587104;5.74855008162558;-3.05644544772804;5.57827578857541;-7.85069631878287;4.71743633039296;-1.85468953568488;-3.62996686715633;-7.49863925389946;6.72275467310101;6.55893434304744;1.38782521244138;-7.29690986219794;-4.08515234012157;-3.28261086251587;3.1795342033729;-6.70219963416457;-5.67374413833022;-5.46678576152772;-3.88363015837967;8.95233920775354;1.10723451245576;9.51496082823724;-4.69101608730853;-0.641343691386282
+-3.01660002209246;1.45672439131886;9.26492777653039;6.76532477606088;4.93312164675444;-9.71387037541717;-1.7236199695617;-3.13005869276822;3.71414421591908;5.10014091152698;-2.57677298039198;1.06030837632716;5.61166736297309;7.12506202049553;-5.98703466355801;3.27553170733154;-2.92409309186041;5.99079445004463;-6.27334316726774;4.07736709341407;8.37334704119712;6.49388709571213;6.6476108552888;0.31770896166563;-8.63144996576011;-3.38424392510206;8.78036736045033;-8.76805676613003;-7.95680356677622;-5.66444766707718;-7.04771209973842;-0.575602208264172;-3.72760799713433;0.140035417862236;-1.7646492132917;-2.29670417960733;-9.10904937889427;-7.24782139994204;0.578272799029946;4.0816215518862;7.4180217878893;-0.82949644420296;6.29716033581644;-5.84553353954107;-9.48206776287407;-2.58682204410434;1.7833018116653;-9.44248476997018;6.72979204915464;1.25874545890838
+-0.968155134469271;-9.74141770042479;-7.05993589479476;-5.17030370887369;8.56228229124099;3.92250423785299;-0.611011045984924;0.560200847685337;2.19031152781099;4.26236295606941;1.64454696234316;7.0933645311743;-4.24920218065381;-4.49704595841467;1.59333191346377;3.64248533733189;4.06391128897667;-2.54951938055456;9.52573374379426;9.26327783148736;-2.27688841987401;2.9169437661767;8.22059568949044;6.30496629979461;-2.6478282827884;5.66981447860599;-9.79285966139287;-2.37170448061079;-5.68320056423545;0.948180835694075;0.836768881417811;-0.44257752597332;-5.82661182619631;2.94687433168292;4.54121169634163;5.6615513144061;-7.44719040580094;-2.13804463390261;9.17932700365782;9.71507846843451;4.71086319070309;-6.0439985897392;-1.21700365561992;2.51805744599551;-4.73503059241921;-0.702986340038478;-0.530005060136318;-1.06266265269369;7.58586215786636;-2.78813234064728
+6.54849174898118;-5.48024521674961;-8.80801967345178;-4.97434516903013;-8.97798938676715;-8.13921663444489;7.79057358857244;-4.92758466862142;-8.96299715153873;7.0149612845853;1.65525004267693;-3.3864088403061;5.10832054540515;-8.54629247449338;7.88175765890628;8.09862166643143;-9.34647041838616;4.80559871066362;0.643347804434597;2.8486593067646;7.45202360674739;-3.96409636363387;3.6317504523322;-6.40108341351151;7.1136472793296;-0.852550878189504;5.49494010396302;-9.87808970268816;-1.93337360862643;-7.07048228010535;-6.85454066377133;-3.13814197666943;2.81180259771645;3.43344273976982;6.66089128702879;7.37658593803644;-1.7637436138466;3.00499432254583;3.77536722458899;3.76540400553495;8.5193853545934;6.46603471599519;-3.27413973864168;-9.66023569460958;-6.58100315835327;-2.71160370204598;-2.91160366497934;1.84891270939261;-4.92941492702812;2.80114682856947
+-9.8991023702547;3.7187577271834;2.89715076331049;3.76410324592143;-2.79186184518039;0.985185257159173;4.51631876640022;8.63946678582579;8.97443400230259;0.815915786661208;0.323176975362003;6.19003171101213;-7.99652709625661;-0.540122599340975;-4.34675545897335;-2.63473640661687;-8.23910658247769;1.55794673133641;5.77052873559296;7.93065783567727;4.9055531155318;-4.65001706033945;7.57577848155051;-9.84663463197649;-2.44930846150964;-5.7598017482087;1.59259426873177;-4.8119123885408;6.22960763052106;6.35174436029047;-1.97489832993597;3.00289826933295;-4.22831402160227;-8.37135300040245;3.29280649777502;-5.84636874496937;6.50214368943125;-5.94331404659897;5.72140318341553;8.31790511962026;-0.472692037001252;-4.88601249177009;-5.93602196313441;0.486243888735771;2.91842703707516;-5.78088595531881;9.88578847143799;-3.32651604898274;8.34018607623875;9.41798688378185
+6.21535782236606;8.9913742011413;7.3069722019136;-3.24242390692234;2.28417357895523;1.61046010442078;-3.42379455454648;-4.53583050053567;6.29269937518984;1.15790827199817;-5.71249465458095;4.29609895218164;7.04723381437361;3.34432796575129;-3.1974043417722;-8.79461012315005;-6.16035570856184;-6.78182761184871;-6.1549559654668;8.157286955975;-2.00474317651242;4.8566575627774;0.587738272733986;8.36131731513888;2.58451645728201;-9.8491968261078;-3.87371752876788;-4.95025091804564;-7.38070774823427;-8.73016642406583;2.53677364438772;8.26612140983343;-1.8457227293402;3.63014731090516;7.66145219095051;2.10839924402535;9.79618756100535;8.05180001072586;8.47972913645208;5.47904858831316;9.76528415456414;8.18380524870008;2.53081917297095;-0.014072391204536;5.0726196821779;-9.75518371444196;-4.04100209474564;-4.51086671091616;-3.75912470277399;4.43632322829217
+8.54544773697853;-4.95790643617511;-5.45758763328195;-2.65031752642244;-6.13025578670204;-0.59348801150918;-9.47580080479383;-9.22369475476444;-3.87583303730935;-0.996413170360029;-5.87419266346842;3.39770489837974;8.38985246606171;-1.88056175131351;-1.46427852567285;-0.689136725850403;-5.90340529568493;-4.79490731842816;9.15241351816803;6.43395402934402;-6.40263932291418;3.46855591516942;8.63541206344962;-7.10804822389036;8.11535490676761;3.99622148834169;-0.33051532227546;1.3372342986986;1.65199672337621;9.19014530722052;8.41630812734365;-8.00682168453932;7.05095378216356;-6.7642316268757;7.68582740798593;-5.62167691066861;9.02140699326992;5.15163673087955;2.6410766504705;-8.5003059450537;2.06032627727836;-1.99138996656984;1.279710046947;-6.89036693889648;-8.10407501645386;-4.69780416693538;-4.61272101849318;7.95214945450425;-9.1536878189072;-3.82358233444393
+5.38710033055395;4.5241325115785;2.92926379479468;6.13213381264359;7.20892962068319;3.19070463068783;-9.94835214689374;-0.245730681344867;-6.89682730939239;-9.86004324629903;3.14389394596219;1.41429916489869;5.48684432636946;2.25366476457566;5.44235370121896;-7.55124946590513;3.93249257002026;-3.27343479264528;4.8891808046028;2.47596741653979;0.0242107268422842;-6.9871360482648;4.95478892698884;-3.64574478473514;8.49375510588288;1.99613568373024;-8.21902429219335;2.14303491171449;-0.333655024878681;-5.85453356150538;-4.09627993125468;-5.79990521073341;9.9706591758877;-3.22228979319334;1.61897731013596;-2.76993614155799;-6.69637855608016;8.73208443634212;8.48460561595857;-2.01892691664398;3.13120614737272;-2.94637120328844;-2.48550499323756;8.74936764594167;-4.72120466642082;-0.35140688996762;9.37875682488084;-8.64086464978755;7.39585579838604;2.83942918758839
+-0.277742655016482;6.49507964961231;0.0427414989098907;-9.86721075605601;6.00174880120903;-3.0392463831231;7.55616521462798;-8.52356114890426;-1.18136951699853;-8.9992003235966;8.41556896455586;-0.719336937181652;9.82025291305035;-2.60474751703441;-7.00007952284068;9.91166374646127;-6.60728700924665;-4.72326859366149;-4.0532791800797;-1.59698917530477;2.49414374120533;5.15104410704225;-9.87231359817088;8.56129843275994;-4.42077559418976;-6.07007850892842;-6.73033447004855;2.5694218557328;4.14372336585075;2.03120285179466;5.67284445278347;-2.28329448029399;-9.27673916798085;-7.87727477028966;2.69829825963825;-5.07535051554441;-4.5623538736254;-1.39423212502152;-5.7856589416042;-6.95092563517392;8.62163309939206;2.98448394518346;4.3307153088972;9.55673456192017;0.360611877404153;4.08728231675923;1.64149705320597;-8.67866774089634;-1.95386708248407;-2.06305974628776
+2.17067448887974;-9.57589868921787;9.85634818673134;-6.63288117386401;0.309270545840263;3.75291007105261;-7.22512705717236;-5.39875577203929;8.94933057017624;-8.39201361872256;-0.727223213762045;-2.72072898223996;-0.975302844308317;-7.10717065725476;-4.45589861366898;-0.683130254037678;8.68529470171779;3.3385516423732;6.70067880768329;3.85663856752217;-8.48860471975058;7.02364462893456;-7.9317791480571;-2.81490166671574;1.64826075546443;-6.36258098762482;9.71521446015686;-9.13466441445053;7.06956060603261;2.8776582935825;-7.84561533480883;-6.48961248341948;8.75900006853044;-5.2334088133648;1.64134445600212;9.54355244059116;4.33853960596025;-9.53843520022929;7.523981356062;-5.16683623660356;-1.72559796832502;-3.51350012235343;3.0763698508963;-1.62185428198427;-2.02345695812255;-7.62055523693562;1.7609107401222;1.51798068545759;-6.99411939829588;2.1988278767094
+3.41142809949815;-1.13492716103792;-6.34183189831674;4.19649858493358;-6.10920543782413;7.90835531894118;7.41302538663149;0.891136266291142;9.72103329375386;4.94559880811721;-3.25810594018549;-7.1707166871056;-9.27478119265288;-9.04625846538693;-4.80379967484623;-7.06472716294229;-6.92422637250274;7.81909159384668;2.90488606318831;0.0998770445585251;-1.47128882352263;-5.80453521572053;8.24956396128982;4.79573211167008;5.28941491618752;-7.50585825648159;-3.05766843724996;2.38307071849704;0.0173642765730619;-5.52582597360015;0.315820365212858;4.62422240525484;8.62031231634319;1.60615558736026;-5.13704173732549;-6.51393581647426;-4.34861003421247;-7.5337178632617;-3.79813568666577;2.68615590874106;-1.77287216763943;5.11539303697646;7.84194942098111;9.50034199748188;-9.23877334222198;-4.18160686735064;6.74618884921074;-1.86243458185345;7.32904070522636;-6.79613776039332
+-8.70074650272727;-6.948007424362;-2.04103160183877;-2.14950171299279;-0.62429279088974;-3.25313493609428;5.66892423667014;2.98211205285043;8.92996797803789;0.15941746532917;3.64660972729325;0.259552183561027;-0.530556882731616;-0.880140876397491;0.713998782448471;5.3278486430645;-6.35190832894295;-8.74496302567422;3.57483381405473;-1.7408639844507;-1.59563273191452;-2.66657172236592;-5.14071884099394;2.72406151983887;-9.39745854586363;-6.10989885870367;-8.2845009630546;-9.15288002695888;-3.3389636920765;-3.60277211759239;-9.19061058666557;-3.38315000291914;-8.39763905387372;8.95165974274278;-6.80744574405253;-4.68849152326584;-9.68822959810495;-6.28772452939302;-4.75675612222403;4.63357742875814;-0.697172619402409;-9.50365241616964;0.163982142694294;0.0961073115468025;-0.258643515408039;3.14315177965909;-6.73955151811242;6.62028905935585;-0.869519119150937;-9.37773948069662
+-6.93034023512155;7.067985907197;-1.85044622980058;-4.77439039386809;9.39024893566966;-8.96815827582031;7.02385758049786;-2.73540872149169;3.93253676593304;9.78195562027395;7.81248951796442;5.11255661025643;5.29051839374006;4.53508305363357;2.88503857329488;3.76037651672959;-9.42541466094553;9.56689503509551;-7.63008336070925;-6.72701247502118;-4.98090384528041;-0.62778711784631;1.59753437153995;-7.93602412566543;3.54676278773695;0.468317833729088;-8.96917895879596;5.03638572990894;-7.88049203343689;-4.89850124809891;3.09973037801683;1.38685770332813;3.87126866262406;-3.79360884428024;-0.557143767364323;5.24206825066358;3.77614070661366;9.39473863691092;-5.17108213156462;-5.16031304839998;0.153391030617058;-7.54477693233639;0.556641928851604;-8.22449180763215;-6.65215369779617;3.57868634629995;-6.72275126446038;-2.47677918057889;7.57447514217347;4.70409241970628
+6.85111835598946;-9.21209653839469;-2.01732572633773;-9.32181288953871;2.71641222760081;5.51847536116838;9.14054713211954;3.34488157648593;-8.64911175798625;-9.2027387721464;7.80456039123237;-0.5020642420277;-7.66371973324567;-4.97844972647727;8.68713399861008;6.76838885527104;3.12923659104854;4.24935601651669;3.25819509569556;-2.05173585563898;5.2677529072389;-3.0833692708984;-5.67121701315045;-9.71485385671258;-4.51671163085848;-6.48276884574443;0.0432546995580196;6.62306156475097;-1.66263627819717;4.71571189817041;-5.48839549999684;-7.45748846326023;-2.07703122869134;-2.23012984730303;4.41261335276067;8.399747624062;-9.33382574934512;-0.491064381785691;-7.10640012752265;7.70891197025776;-6.6482143336907;-3.86045361403376;8.73167912941426;8.6726563051343;-6.44173853099346;7.54286439158022;5.94765002373606;-3.24252856895328;-9.50267767067999;-3.5325232334435
+1.15791859105229;-3.56976653449237;-9.25281628035009;-6.18618804961443;2.96332268044353;3.5133292619139;-6.5550865419209;-1.11682076472789;-1.0300366114825;7.61911478359252;1.76861288025975;-3.06797217577696;6.61041747778654;-6.22702968772501;4.84298333525658;7.94914052821696;1.03190562222153;8.93794980831444;0.197952268645167;0.46409978531301;1.34532960131764;7.95580376405269;-9.70410351641476;4.02495271060616;0.674524949863553;-9.93090648204088;9.55908120144159;-1.15928896237165;5.39703932590783;6.69171602465212;0.811182814650238;3.25706950388849;1.14829120226204;-2.6338558876887;-4.94175132829696;-3.37647691834718;-2.65148676000535;6.48871270474046;-1.66211509145796;5.80398735124618;7.05200992990285;6.46019583102316;4.95955741498619;-9.51690160669386;3.03950681351125;6.05556068010628;5.15176194254309;7.92760123964399;6.96420246269554;-5.81099713686854
+-0.514624682255089;-3.6003744462505;-6.83733629062772;3.13942701090127;2.44363521691412;4.82769627124071;-8.18094795104116;3.43111460562795;8.88389486353844;2.28895436506718;9.23732921481133;4.61860691197217;9.81584092602134;-6.57457135617733;5.04224746022373;1.30633255466819;-6.79801226593554;-8.29599210992455;6.09762378968298;5.92686200980097;-7.50510568730533;-5.91346404515207;1.18590955156833;9.75728630553931;-7.33045813627541;-5.45284091960639;8.85127836372703;3.54462676215917;-9.61092894896865;-6.54284448362887;-4.33948844671249;4.04227792285383;-1.00302690640092;-1.60935539286584;-7.01356111094356;5.79337101895362;8.61724014393985;-1.94977133534849;-5.53239761851728;5.71754884906113;-3.04699057713151;-3.14381502568722;-0.459334612824023;-7.68144058994949;5.84648699965328;4.41845816094428;2.78657690156251;-8.62998094409704;-8.17904158029705;8.30148515757173
+-0.969148315489292;7.0290537411347;1.39857622329146;8.41864227782935;8.71982920449227;2.02023581601679;0.550630218349397;-8.80440297070891;1.85677129309624;-9.90758516360074;-1.94169008173048;6.23128797858953;9.49715143069625;-2.64922167640179;4.65959071647376;-9.26824997644871;-2.19056308735162;4.14649166632444;6.94530078209937;4.44423614535481;6.28586205653846;4.8786844778806;3.82324586156756;0.328818839043379;5.13078054413199;9.89701275713742;8.42173884157091;-0.952080572023988;5.83382822107524;-8.27664421871305;-0.870528961531818;-6.0221798857674;0.418369569815695;6.01458748802543;-7.55613657645881;6.1758108669892;-1.70585083309561;4.97558487579226;-1.7530301027;-4.67699096538126;6.32661230862141;2.26053401362151;-3.02717692684382;7.00751515571028;-3.69367125444114;-5.13270919211209;-2.94111131224781;4.34500259812921;0.849223360419273;8.88291218318045
+-3.56436772737652;2.9878376564011;-8.07274385355413;-1.26747969072312;-9.5178015017882;-2.26492417044938;-8.15276972483844;5.71841089054942;-9.04424853622913;-7.22491390071809;-4.74400103092194;-4.95507249608636;0.198484328575432;5.85707894526422;-7.28596075437963;-3.12663908582181;3.77642373088747;-2.84982516430318;6.15959104616195;-9.93403933476657;-5.4606921877712;-3.65827389992774;-2.48365051113069;9.29696749895811;-3.38648021221161;-6.44795887637883;-7.35712938010693;-4.89157258998603;0.200851778499782;8.67296358104795;7.42950724903494;-2.97261194791645;-1.44470657221973;-1.9632272189483;8.71068435255438;5.23390575777739;6.7308060452342;7.1362202661112;-6.97609317023307;-1.85509336180985;-4.56354479771107;7.20855776686221;-6.05786783620715;5.25104318279773;-6.94182708859444;-8.45826979260892;1.9722020579502;-3.80140669643879;-3.83920757565647;-5.07485061883926
+5.59648144524544;0.68161629140377;-8.94478471484035;-1.30299435928464;3.47748900298029;1.71523602679372;-4.22266541980207;2.48739044182003;-4.56443545408547;-3.18587770685554;1.29874385427684;-9.04682640917599;4.56543426960707;9.51193175278604;-8.23197796475142;3.37396290618926;8.11167258303612;6.35610398370773;9.05977683141828;9.71156071871519;2.14268277399242;3.60671655274928;-4.15018137078732;-7.04358570743352;8.47935509867966;2.16851933393627;6.98211905080825;1.98495294433087;-8.26164586469531;-3.49385571200401;4.29377673659474;-4.93103204295039;9.67715637292713;-4.38142008613795;-7.246632585302;-8.68860371876508;0.179215455427766;-7.62778594624251;-7.4869047710672;0.860944525338709;4.13751086220145;-8.99184851907194;2.39331068936735;2.87443690001965;-9.5428165094927;8.28305366449058;-1.68342226184905;7.99106395337731;6.14128963090479;5.26968685444444
+9.08629323821515;-6.00818364880979;-2.03405281528831;-7.48261235188693;-6.05562220327556;2.92229162529111;4.8480359185487;-3.72120348736644;0.151694542728364;-5.57192062027752;9.17522354051471;2.73642494808882;-4.27096295170486;-1.71373880468309;1.02244019042701;-5.54012804757804;-4.21687328256667;7.9675763566047;4.00897512212396;0.6373401125893;-3.51458796765655;5.42838950175792;-6.55675900634378;8.83823245298117;5.42234464548528;9.2211599368602;-5.27656737249345;5.35819419659674;-9.44324722513556;8.78078414592892;2.24646658170968;-4.20931151136756;7.62308788485825;7.36622615717351;5.45118854381144;-4.54676821362227;4.54360076691955;6.55411649961025;-9.93329391349107;-2.58235051296651;7.02524564228952;-6.32011633366346;-9.94727465324104;-2.68965356517583;6.07665463350713;-2.59474551770836;-5.60289376415312;5.74922123923898;1.21538883540779;5.62217375729233
+2.63926642946899;-3.48635534290224;4.63807919528335;-9.16498122736812;-7.19137615989894;0.782325644977391;6.05603780597448;3.60719146206975;9.29027878213674;-3.4073520777747;-6.44959800876677;-3.58361105434597;8.1047109188512;2.0218428876251;0.602213838137686;-8.59269950073212;7.59629425127059;-0.478752478957176;-2.31057300698012;-3.35026779212058;3.81833601277322;3.05769986938685;9.49482336640358;-1.00546735804528;-9.76169793866575;-5.81943580880761;-8.02128785289824;3.0841301754117;1.02182132191956;-2.94893626589328;3.18366916850209;-9.91123924963176;-5.87786647956818;-1.70958464499563;5.93543269205838;4.03540784493089;-0.930717890150845;9.48192656971514;9.79068549349904;-2.18421835452318;4.50411227531731;-7.23519864026457;3.34141975268722;-3.63061067182571;8.13959081657231;-0.158622926101089;2.54901580512524;-7.57270279340446;4.49353096541017;-1.31516555324197
+-3.61516498960555;-5.26189937256277;5.07877815980464;-8.23543624486774;4.15301690343767;-7.41085326299071;-4.06056290958077;-2.71653216332197;8.67766286246479;8.30005414318293;-2.42591871879995;-5.36010504700243;-9.91310347337276;0.0863928999751806;-9.86123410984874;-3.88429845683277;2.72369846701622;-6.99051297269762;1.94289575796574;-9.19626949355006;0.725263352505863;6.80708915926516;-6.97365087922662;4.6072335075587;-1.54503578785807;-0.0537946028634906;2.72572461515665;2.91556777432561;1.81311980355531;8.10370047576725;2.636080943048;-7.85005915444344;-5.87876802776009;-1.14872858393937;-1.61490581929684;1.53595589101315;2.19502593856305;6.77391332108527;-1.0335495043546;-5.17002992797643;-5.63528732396662;0.872366740368307;6.08526663854718;-0.26201150380075;-6.97918451856822;7.10332767106593;6.10918307676911;-3.19054721388966;6.00346125662327;1.59105264116079
+-1.8311863206327;-6.74529477022588;3.02414978388697;-9.47040408849716;5.41907732840627;3.04177694022655;3.00636054482311;-4.0458494098857;2.63025599066168;9.17775240261108;7.42097159847617;-1.08546697534621;-2.35953886993229;0.513823390938342;8.79628949798644;4.41538565326482;-4.74448594264686;-5.76205251738429;-0.245502856560051;3.91950414516032;6.14804762415588;-3.22915533091873;2.37071781419218;4.21646641567349;-6.75198063720018;0.395384184084833;0.9042255487293;1.73257764428854;-2.49926630873233;0.235687377862632;-6.1609226744622;-6.37691811192781;-2.20666754059494;-1.93354498594999;-7.77323364745826;9.81373854912817;0.734481709077954;-2.98589302226901;5.35986911971122;-1.24902879819274;-5.77135204803199;1.62975768558681;-2.91918267961591;-2.5617987010628;6.33228154852986;-3.44446306116879;-2.31512944679707;8.42078708577901;-0.372694986872375;7.79288818128407
+-9.9968913057819;-4.08906517550349;8.49662301596254;-8.0013120546937;-6.69060134328902;9.96386567596346;7.15944093186408;3.11702438630164;2.44685144629329;-3.77987907268107;-1.03799988515675;-0.609709280543029;2.23080033902079;8.21432246826589;8.15047500655055;6.95821544155478;-1.40572688542306;1.09425755217671;-5.54005865007639;-3.02802296821028;3.89913749881089;6.44445454701781;9.10305547527969;7.45030640624464;8.41519098263234;9.5596327399835;2.17597109731287;-6.27848902251571;0.73685422539711;2.75593811646104;-9.75031835027039;3.20047008339316;5.89837131090462;2.12909632362425;-9.01182347908616;5.49312581773847;1.56863276846707;-3.58898811973631;-8.90042546205223;-4.89331224001944;4.76471369620413;-2.07614230457693;-9.93023096583784;-7.81164357438684;5.35083097405732;-2.07508448977023;-1.22860996983945;-5.82287763245404;9.63483445346355;-9.94631655979902
+-9.20690337661654;-4.87609037198126;2.36908451654017;-7.01290716417134;-8.27917313668877;-0.580415511503816;7.09634688682854;9.3332193326205;2.01802468858659;-9.14500421378762;-1.00027617998421;-7.27859733626246;-2.33737151604146;-7.29078019037843;1.10894088633358;-3.19147808477283;5.26237807236612;3.35211993195117;2.8360338229686;1.74350833985955;-6.97067487519234;-0.991746606305242;-9.54823082312942;-7.46350964065641;-5.62542609870434;-4.31366593576968;1.60380837507546;7.76801513507962;-9.32136774994433;6.12855676561594;-1.37882949318737;8.82770906202495;8.02834565751255;0.067402021959424;-5.44691354967654;9.35673906933516;8.61434472724795;-4.16677474509925;-4.88795991521329;-4.11107582971454;8.59618469141424;6.76560894586146;-5.03881849814206;4.25956691615283;-9.13227781187743;-4.69291769433767;-8.22906301356852;-2.69651089794934;-7.49057369306684;5.71623909752816
+-5.72288321796805;0.325224143452942;-5.76548724900931;3.16331430803984;-2.03082147054374;5.44173903297633;-4.66799199115485;8.93294293433428;7.5018798885867;-1.56950543168932;8.0705145187676;-4.82245516497642;-3.50313008762896;2.45314280968159;9.12769857328385;9.20804996509105;-1.03438198566437;8.80594124551862;2.13365591131151;6.08515456784517;-4.58063945639879;7.17903611250222;-3.71484014671296;6.41030041035265;-3.49147737491876;-9.34932172764093;-1.63496344350278;3.83788582868874;-2.11876887828112;-8.26930981595069;9.70879747066647;-9.37871498987079;-1.49549610447139;2.95847463887185;1.10145362094045;8.92993279267102;1.8330845143646;-0.685432706959546;-8.19635324180126;-5.12762856669724;3.42035803478211;-5.1728872815147;8.0490801949054;4.05253827106208;1.38873771764338;-5.81306250300258;-5.21244052797556;0.951820844784379;7.06457456573844;-8.62530542071909
+9.7140674572438;-0.0161504140123725;2.57568429689854;9.48514162097126;-7.46677849441767;8.18275235127658;-6.50854687206447;1.6474270587787;-7.45352650992572;7.91962017305195;-7.71219177637249;8.93195684999228;0.03971460275352;6.27375605516136;-4.91619557142258;-5.27931916061789;6.28579484298825;-5.98096042871475;5.71865316014737;9.55906458664685;0.613134056329727;6.87623593490571;-7.18028963543475;0.352699630893767;4.62328164838254;1.78207905497402;-7.24611462559551;-3.82353330031037;-5.37262629251927;-1.66675174608827;-6.65102636441588;6.2209722911939;-7.93403944000602;-5.45542862731963;4.13200833369046;-3.09232181403786;-5.33080773428082;-8.26500259805471;9.06428879592568;3.93776691984385;-4.73602035548538;3.62852405756712;2.56922538392246;5.70067520719022;7.06678818911314;4.1706877714023;-4.81026605702937;5.04214215092361;-5.91114264912903;-4.15528997778893
+8.389075207524;-3.60078829340637;-6.77056359592825;4.34982114471495;-5.40710287634283;7.66361061483622;-3.94581720698625;8.50605284795165;9.6662818454206;-0.374799091368914;5.92729905154556;-7.96580001246184;-0.396952982991934;0.520286220125854;0.846534119918942;1.36754395905882;9.03859289828688;8.17431956529617;8.43488112092018;7.67859247513115;3.78546926658601;7.08975734654814;-6.94305814802647;4.7898716153577;8.52318871300668;7.71236596629024;-9.22557928133756;-8.40972180478275;-7.06137529574335;-7.4639192642644;4.93178401142359;1.72697820235044;-9.65200442820787;7.92222713585943;-3.00831816159189;-7.79680773615837;-9.06708436086774;-4.55802915617824;9.68829355202615;-2.80980451032519;2.7354819374159;9.26521672401577;-9.46400971151888;-0.927567784674466;-1.34482190478593;-5.80059734173119;2.50153325963765;-5.21875993814319;9.45028357207775;-9.53726762440056
+7.42237744387239;0.674435365945101;9.73260939121246;-0.512775909155607;-4.5600782521069;-3.06555196177214;5.97134187351912;-8.28357793856412;0.864027463831007;8.10732272453606;-9.58701376337558;2.54408415872604;-1.33316815365106;-1.4212964149192;-0.585657148621976;-5.09066503029317;-2.62450214475393;7.98188296612352;1.87461807858199;-0.56466493755579;-5.79482825472951;-1.79534981027246;2.16769330669194;-5.65398706123233;2.10429414641112;7.92378368787467;7.90083386935294;-3.35318072233349;3.16728893201798;-7.9271261068061;-9.86281040590256;-7.55230008624494;-5.40386028122157;-1.15300202276558;-2.98329431097955;-5.7738835318014;-4.67683780472726;7.31508396565914;-3.58992267865688;6.60105891991407;-2.86596473772079;-0.869922954589128;6.00930977612734;-7.74542072787881;-2.17139226850122;1.89493245445192;6.93357979878783;5.53906913846731;-3.0712346220389;6.67658575810492
+-8.15200243145227;-1.56990354880691;-8.65159855689853;-3.46754433121532;-9.33221948333085;-2.5171528942883;-1.12540043890476;-6.56648315023631;-9.43395493086427;6.1103944061324;1.80917422287166;-8.1636385852471;9.78718451224267;-5.7775535620749;4.9179901368916;8.10492993332446;5.59462263714522;-0.243776543065906;2.00799540616572;-5.55205207783729;8.06583961471915;0.443116654641926;3.08147839736193;-6.74062156118453;1.5821419749409;6.50796928908676;-6.60798935685307;-0.501539646647871;0.774376392364502;-6.23698879033327;9.92068173363805;-2.74543696083128;-0.102093238383532;-3.60286995302886;-3.79136404488236;-5.43700770009309;5.60333411209285;-2.89744427427649;9.36700220219791;-3.35135591216385;-2.68276723567396;-6.4352527493611;2.44132371619344;-1.54554918408394;2.50760117545724;-1.10213391017169;2.31955316849053;-3.18546535912901;-8.92137648072094;-4.72537727560848
+0.266582751646638;7.41030978504568;-0.295420573092997;3.97390636615455;6.08881121035665;-6.81731712538749;7.53329935949296;3.60289933625609;8.15554866567254;3.65468562114984;4.69545113388449;-1.63537338376045;-5.38754866924137;-0.0305571872740984;-4.83596207108349;4.09054569434375;-0.0253098923712969;0.91698132455349;-2.09210307337344;6.1117547750473;-8.77724021207541;-8.40669033583254;3.07152085471898;5.511246137321;5.00595754012465;3.03831319790334;-1.9994547823444;0.390170458704233;-3.92756162211299;5.03047222271562;4.75308910012245;0.478049018420279;-3.450682843104;-3.71787153650075;7.48186964076012;-1.34245234075934;-0.74814910069108;0.0773549173027277;-0.10600149165839;-3.43844595830888;3.15512147732079;-8.25181344524026;3.05799363646656;-0.847960156388581;1.71675940975547;2.77502507437021;8.49833187181503;9.47071284987032;-5.6726202648133;-0.786988083273172
+-9.12079828325659;-4.83928014989942;-6.14141302648932;-5.00621873885393;-9.63167583104223;-8.55401612818241;5.24924353230745;8.57286246027797;9.20960722025484;-0.416921782307327;2.88629315793514;1.41942766495049;-6.37616125866771;9.60828610230237;-6.66466498747468;-6.99464292265475;-3.62294318154454;3.03401398938149;-0.314482226967812;-0.664902627468109;-2.41442902479321;3.82167611271143;4.73002382088453;-8.33908590953797;6.439249352552;-6.99142186902463;9.81456888373941;5.72861298453063;3.85985675267875;3.46844958607107;7.49977088999003;3.72457149904221;-3.74832312576473;-0.0453486246988177;-7.43971921037883;-3.9290847722441;8.27379230875522;8.46238985657692;1.81584601290524;2.62284752447158;6.57820523250848;9.76105397567153;-3.45553074032068;7.97009297180921;2.11688261013478;8.00091157667339;5.79071769490838;-9.50876102317125;-7.75948914233595;-6.93583616521209
+1.06734992936254;-4.66686605941504;-6.97254315949976;-2.06232264172286;6.88083598390222;-8.5072385519743;-7.5264786509797;-9.11126621067524;-5.49083237536252;4.75231144111603;7.07686661276966;9.1340512689203;8.78906883765012;4.97879057191312;-1.29120536148548;-4.16300807613879;-6.89381652977318;4.41110711079091;-7.23677867092192;2.05260054208338;-8.2057486474514;-5.18655605148524;-4.42477460950613;8.61399848479778;-0.92333264183253;-6.03845196776092;-8.8702739123255;-1.0069820471108;-0.567320096306503;9.53005773480982;-3.78811005502939;-2.59463399648666;2.99993569031358;-5.5619054986164;0.471029616892338;5.4993251664564;-9.30680270306766;-3.99859437253326;5.75771457049996;-1.2186867184937;-8.85986532084644;7.26374609861523;-0.896416753530502;-6.36119248811156;2.61567273177207;2.64561051037163;5.50860541407019;3.95400266163051;5.52712457254529;0.458679627627134
+9.04347927775234;0.925111793912947;-6.5890140645206;-3.97142501547933;7.47535032685846;5.29497373849154;-5.76514535117894;1.28704437520355;-0.285980557091534;5.42957017198205;1.40569214709103;5.86907400749624;9.6838612947613;9.96016904711723;-0.19122030120343;4.43207967560738;1.42021753825247;2.08361527416855;0.223106383346021;-4.04741070698947;-7.44351265020669;-5.36971309222281;-9.02599108871073;-9.15283886250108;-5.94819627236575;8.29199259635061;-1.49331769440323;0.65075094345957;-0.0865436811000109;-5.8230308862403;-3.9649027492851;-3.10827291570604;2.32920923270285;-1.57697084825486;-9.31980202440172;-1.77909384015948;9.37151326332241;1.23671074397862;1.14657157566398;9.8870027763769;0.346198319457471;4.54211007803679;-2.76287849061191;-4.59310674574226;-5.68911477457732;-1.54175722505897;0.496689351275563;7.14857417158782;7.40511100739241;-4.42105219233781
+-9.08680622465909;-7.79974689241499;7.03489989973605;-9.6459135832265;4.08746875356883;-4.72357693128288;-1.93946099374443;-6.00670780986547;-4.07123860437423;-9.32156852912158;-9.50675596483052;1.87287672422826;-9.6614623721689;-3.21708597708493;5.29623160604388;0.861116843298078;4.16597294155508;-3.53373759426177;2.17461056541651;9.32876457925886;-5.66715260967612;-7.18429239001125;8.70856867171824;-1.70981333125383;-0.635543297976255;6.38310603797436;7.19868785701692;-9.45673872251064;9.77897406090051;7.68110088072717;-4.8440659372136;-5.72628719732165;5.98283904138952;-5.81272002775222;6.06682668440044;-0.61161866877228;0.605402104556561;5.35853186156601;3.03805638570338;-9.57998882047832;-2.06741970963776;3.7249715346843;5.1227496471256;-9.98529989272356;5.98677750211209;-0.891087404452264;-3.3382136374712;0.562720443122089;-3.11666978523135;5.64655931666493
+4.87611875869334;1.08852512668818;-2.4079489801079;4.40188338980079;1.47024405188859;8.05036503821611;8.84034446440637;-8.07246596552432;-8.85925860144198;9.19463071972132;3.17547146230936;6.6015538200736;-1.04514891281724;7.38896849565208;-3.45188729930669;5.16177063807845;-0.790461571887136;9.48610063176602;-8.95462666638196;5.19831297919154;4.48241927661002;-7.11835524998605;6.06846794020385;1.31411834619939;8.37583670858294;-3.30050981137902;9.63333849329501;1.76556742750108;6.86233211308718;5.15788461081684;-2.6012306381017;-7.71898939739913;-0.0360721861943603;1.45752762909979;2.89990332443267;-9.11636450327933;8.21356733329594;9.60271773394197;-1.60700141917914;-6.86759877949953;-6.35545847471803;-3.36100164335221;-4.45516668725759;-7.47766804881394;-2.21497938036919;3.83594316896051;8.96890766452998;5.94925688114017;2.2428995417431;-1.53576326556504
+7.40181047469378;-1.64008994586766;-0.794584867544472;4.72043320070952;-1.84851598925889;1.64312538225204;3.85024208575487;-3.07457590475678;3.41697588562965;-3.4447901789099;-1.06940753757954;-8.70463846251369;8.7803232902661;1.18252351414412;-3.86414915788919;-4.01735261548311;5.82833961583674;8.12929902691394;-6.96242501959205;-0.762195568531752;3.88705191202462;1.53270384762436;-5.3289058431983;-2.65827590133995;0.390146654099226;-3.23959928471595;-5.95534838736057;9.44494664203376;7.45560119859874;-4.27893817424774;2.0058385329321;1.58474969677627;-7.70675871055573;-3.6351725179702;-7.84597794990987;0.357371745631099;7.33296442776918;0.881194928660989;-0.750834923237562;-2.79197432100773;-2.10312145296484;8.67047500796616;7.55416033789515;7.02098547481;1.74311713315547;-3.23622269555926;3.64266584161669;-9.50140206608921;2.01616789679974;-9.34917363338172
+1.10245620366186;3.64859597291797;-5.07220193743706;1.24480245169252;8.13924977555871;8.37813265621662;-3.58717294409871;6.56430739443749;2.01543461531401;-4.01252585463226;2.75527242105454;-4.37542709521949;2.32260448392481;7.09522721823305;-9.55839208792895;2.37732416018844;1.05942654889077;0.335460305213928;-6.01041825953871;-7.44012943468988;4.70908721443266;-4.04203151352704;-6.23735384084284;-2.63758525718004;-7.36848982982337;-8.42636987566948;-8.08679717592895;-4.92481764871627;-2.78066116385162;-8.59389926306903;9.88977935630828;8.57499003410339;-6.18865667842329;8.54208169505;7.34471867792308;-0.715350578539073;5.3825487755239;-3.88392396271229;0.692569562233984;-0.513743367046118;-5.52465970627964;2.74970930069685;-6.13823329098523;-1.71621854882687;-4.82556563802063;-1.17461189627647;5.67569959443063;-9.12363872397691;6.53548595961183;-7.74526258464903
+4.03913186863065;-6.54946563765407;1.14065948873758;4.45693125016987;-4.06460834667087;-7.36742219887674;1.98994457256049;-0.842022555880249;-9.35522371437401;6.80390196386725;-8.20039347279817;-8.01288897637278;9.86960926093161;8.85850031860173;-4.841178660281;4.01107300072908;2.50096324831247;9.76120821200311;-9.83429775107652;-1.38300405815244;-0.0354667706415057;6.81137128733099;-8.25281667523086;-4.99451112002134;4.91221997886896;-1.13211130257696;0.410387585870922;-1.51419454719871;7.0557654928416;-0.523844216950238;4.17163026984781;1.45375987514853;5.3127669589594;-6.19121300522238;3.93711299169809;-5.9377861674875;1.55124350450933;-4.38080912921578;-5.76762622222304;-6.09547153115273;-3.34381448104978;-6.41591772437096;-0.575166563503444;8.81352910771966;7.7745270030573;-6.60415642429143;-7.97247717622668;-6.26513416413218;0.211469423957169;4.59759064018726
+3.3564811758697;3.76827357336879;-0.496356426738203;-1.61189121659845;-0.193452225066721;-8.6836329754442;2.47168106492609;2.15815224684775;-8.36188714019954;-4.13293316029012;-2.9663371713832;7.25894717499614;6.25543114729226;4.16441398207098;4.95523544494063;-3.48740544635803;-0.620532231405377;7.70125454291701;-2.61901085264981;-2.05719217192382;5.51767648197711;-6.39898375142366;-6.03603812400252;2.63256668113172;-6.93840724416077;8.48974390421063;7.79168720822781;-5.40354465134442;-1.37660760432482;-4.78406215086579;4.42811124492437;-2.69302525557578;-6.431242255494;1.41859598457813;-1.57821123953909;9.04024626128376;-1.58178344368935;2.92503581382334;8.12043711077422;-6.02748512756079;5.78235615044832;-3.76338687259704;-9.3774564191699;3.86143447365612;-1.87440981622785;-1.02964827325195;-9.74831577856094;-0.826059458777308;-5.54254278540611;8.47498255316168
+6.51625304948539;-9.12596761714667;-3.56085025239736;-7.04036152921617;8.73255136888474;6.10968403052539;-5.28272980358452;-3.01782671827823;-0.801769951358438;3.15723386127502;-0.881542363204062;-4.26154263783246;8.88829582370818;5.07151897996664;2.29239782784134;-6.05529396329075;-1.78706293925643;-4.65817524120212;-6.99612620752305;7.87806522101164;-8.3407814707607;2.61227265000343;7.05759965348989;-6.8669834593311;-3.58061105944216;-8.18982965312898;-9.47686187457293;8.34288404323161;7.99825679976493;8.97779501974583;-1.28743418492377;-0.508785150013864;2.22761468496174;-5.13516517356038;-8.94523833412677;-2.80339382123202;-1.69986235443503;9.81163020245731;-0.415959972888231;-9.23231930937618;9.99301855452359;6.17416377179325;1.83920232579112;7.02068481128663;1.41735767479986;-7.9658550908789;-2.03691609203815;6.00567223038524;-4.19148456305265;-9.25734566524625
+-8.35326236672699;-3.05381521582603;7.96425322536379;-6.07427330221981;7.86944725550711;1.84916768223047;7.69330481998622;-4.16353383101523;-7.9774221079424;-3.94415457267314;-4.66728708241135;7.27161168120801;-5.45197159983218;6.38594484888017;7.39240979310125;7.42741400841624;4.9137621326372;2.70814758259803;-7.38005200400949;-2.71801170427352;-3.36625151336193;6.2168337777257;6.97256474755704;-9.14715440943837;-3.66983549203724;4.04165155719966;-3.03097696043551;1.56374318059534;8.23456170037389;0.304676503874362;4.17140888981521;-1.20026829652488;9.49243207462132;3.35113286506385;4.78687290567905;6.29071699921042;-9.21985229477286;9.18913362547755;8.36508100386709;-2.57319248747081;4.20783739071339;8.02474921569228;7.34835855197161;-8.63113931845874;4.31394592858851;6.13531599752605;6.01714534219354;-1.18631308432668;-3.54735987726599;4.19937219005078
+-7.41603819187731;-7.24737668875605;-1.00352134089917;0.0445131398737431;5.95437958370894;5.26975725777447;6.86633281875402;-6.00323977414519;0.622088117524981;2.13723202235997;9.21768597327173;0.446970053017139;2.29637150187045;3.51630492135882;4.3034496717155;-5.07820583414286;-8.78066495992243;-7.05503002274781;-1.93655944429338;1.31602752488106;-5.41635806672275;-0.787256481125951;-1.65284467861056;-8.35016876459122;-9.49530126061291;-4.33529548812658;3.79248723853379;9.71247119363397;6.28720059525222;-7.54683678038418;5.36388149019331;-4.50855239294469;3.03337258286774;-6.83640195056796;-1.0477028042078;1.8652941705659;6.8393779033795;-7.55743506830186;4.0675878804177;-7.5723665393889;0.696204714477062;-4.0946443984285;3.28152636997402;-9.03458246495575;0.377278351224959;1.63624918553978;4.15281774476171;-1.03631648235023;-3.64599047228694;-1.73975646495819
+-7.73488151840866;-2.94001560658216;2.53505774307996;2.05004214774817;-0.155122000724077;9.9347318103537;-0.442806999199092;0.306037422269583;0.829177391715348;-7.27289321832359;1.63741719443351;0.0400470942258835;8.77264257054776;-4.99052625149488;-3.74055358581245;5.04774524830282;-7.36897138413042;4.17838190682232;0.709548471495509;-1.25757737085223;6.99218726716936;1.1952548334375;-4.1542936116457;-0.940481591969728;-5.01979811117053;5.03452390432358;-5.13175318483263;-2.14301680214703;8.19808349013329;-2.75739376898855;6.10877208877355;-3.8410705095157;1.84306217357516;2.29786356445402;0.572758484631777;5.82209080923349;1.67163426522166;0.130781885236502;-0.21282637026161;6.19699859526008;3.43213066924363;-7.55507536698133;7.89705220144242;5.44382556341588;3.71533285826445;5.42494980152696;8.45907041803002;-4.47899712715298;-1.38756198808551;-8.86317755561322
+7.93731191661209;3.26460125856102;-9.94455125182867;-4.37696715816855;6.05190865229815;-2.04581647180021;2.5098591344431;4.96702239383012;1.67016624007374;5.35454288590699;6.58644740935415;3.19256379269063;-1.81186340749264;6.08538806904107;-3.54344808030874;6.96182317100465;-9.72655866295099;-4.45570431649685;5.107605708763;1.44008814357221;8.00036001484841;5.75642764568329;-6.02772703859955;9.24479927867651;-0.376905943267047;1.14108609501272;0.235032010823488;-5.84096095524728;-3.23059704620391;3.45805838238448;-7.73923923261464;-3.19965503178537;-7.83230923581868;6.94800067692995;-1.2444423744455;-9.73796383943409;7.91956437751651;7.80503801070154;9.67672892846167;0.515780095010996;-3.21648442186415;8.61590535845608;1.59253937657923;0.0581349013373256;1.16578348446637;7.91633712593466;-7.3337450902909;9.06852599233389;-4.22304670326412;8.57643555849791
+-4.05595523770899;-6.99380675330758;8.68689033668488;6.41426921822131;1.92541531287134;4.51659633778036;-5.0022453116253;-2.10720262955874;1.41914609353989;-0.67881962750107;-6.07611125800759;4.11749868653715;-1.96244114544243;-5.68819476291537;-7.75834440719336;7.95495928730816;-3.83427711669356;-2.74955648463219;-5.61426238622516;-8.78957410342991;7.79294334817678;-9.29848183412105;-2.50068598426878;3.61032663378865;4.98483754228801;-3.45778064336628;-5.08640134241432;4.20225021895021;3.37923508137465;6.89614120405167;8.65213078912348;-7.05108434893191;-9.23602370545268;5.29506633523852;-5.32917513512075;4.68255490064621;-8.44140959437937;9.8397453641519;-2.04123672563583;3.81747283041477;9.42519997712225;2.38629559520632;8.53226229082793;0.322713339701295;-3.15910501871258;-9.04794673901051;7.93389149010181;8.05093875154853;-3.613336449489;-0.408292673528194
+5.23314647842199;7.90393210481852;6.82275642640889;3.00640545319766;3.50072170607746;-2.76000963058323;0.0144254975020885;9.10782671999186;-8.06184262502939;-1.94329299964011;-4.49249370954931;9.33218107558787;-4.85320082399994;4.96675859671086;-9.36464690603316;1.06825763825327;-3.63719924353063;0.0769210606813431;-5.69944015238434;-3.68958342354745;-4.87166850361973;-4.60926011670381;1.69821362011135;2.08880991209298;-6.03431351948529;-3.71249850373715;-4.50684884097427;5.91585997957736;-7.81175798270851;-3.2377245137468;6.76543802488595;-2.43343741632998;-8.94563796464354;-2.98327059019357;-5.06208308972418;-4.85473548993468;7.0877737691626;9.13274674676359;-0.481965062208474;-6.07795880641788;-9.3235728610307;-8.22336078621447;-3.70754390023649;7.05729445442557;-2.9830060666427;-9.98171922750771;-7.15581737924367;-7.26065665949136;-7.39457490853965;0.739239156246185
+6.52583407703787;-7.22687032073736;-2.77436162810773;-2.62114267796278;0.305482367984951;4.41147557925433;-2.08871121518314;-0.617301086895168;0.46001248061657;-3.1605990184471;-2.07901001907885;-1.4047566242516;1.34346378501505;1.53001967351884;8.31021318212152;7.82918704207987;-4.77481119800359;-5.29731663409621;4.2223651940003;9.20353577937931;4.87464583478868;8.63982956390828;4.63026980403811;-4.44696452468634;-8.18474827799946;7.23484305199236;-6.93534945137799;-0.0472921645268798;-4.04408576432616;-7.6829143287614;-5.62140105757862;-0.38839706685394;-0.480393548496068;8.17354400176555;-9.85454940237105;-3.20624460466206;8.18714360240847;-7.16573346871883;-2.11969644296914;-0.512397461570799;3.30621504224837;4.35846887528896;-2.90902475360781;-3.8419878249988;5.78657075297087;-3.41068885754794;-9.0698229521513;-3.83405076339841;-1.03074628859758;1.34444233030081
+-9.44212152156979;-9.67330718878657;-2.43906966410577;-3.02850528154522;0.306199351325631;3.63954077474773;-1.7963857576251;-0.378867778927088;8.29737352207303;-0.484756682999432;8.77802851144224;-3.46431315876544;4.22246416565031;4.14673158433288;7.11329829879105;-7.87753583397716;-1.55816738493741;-3.35271171759814;-4.91952967830002;-0.624271663837135;-0.168414521031082;5.02635720651597;-8.26526412274688;-7.02169851865619;-7.10409880615771;-8.08453768026084;0.331105194054544;-7.92655337136239;-6.33626939263195;6.51019660755992;6.93120763637125;0.547751220874488;-3.5078943381086;-9.16861151345074;5.54031274281442;-3.49505067802966;-4.44173436611891;-2.53629862330854;1.0340049257502;7.58890550583601;-8.35486326366663;7.59208886418492;-0.892125144600868;1.87112770043314;8.42909672763199;6.12804259173572;-7.07674020435661;-3.77826076932251;0.111120198853314;-8.44311767723411
+4.38418470788747;1.85708405449986;8.46206207759678;-4.59484127815813;0.414647390134633;0.524647245183587;9.55170799978077;5.62107507139444;-5.15639480669051;8.09681442566216;7.71982653997838;-4.94275208562613;-3.08685829862952;5.10225055273622;9.58333013113588;9.88642768934369;7.65789283439517;-1.96787662338465;-2.81613413244486;-2.21648797858506;-0.764029109850526;8.04414443671703;8.56351802591234;6.55469271820039;-0.30012755189091;-4.75023183971643;4.13559135980904;-4.14096715860069;-1.7473048530519;1.94555690977722;1.6086255107075;2.33773379120976;8.33527268841863;8.25256857089698;7.57323216181248;-0.992953572422266;-6.16152776405215;8.73219945468009;-8.78837703727186;1.34522145614028;-1.62787667941302;8.59512887895107;-1.76376153714955;6.44506523851305;7.85705285612494;-2.40642982535064;7.88654152303934;-5.13881942257285;-2.90239157620817;7.56665132008493
+-1.85193200595677;6.11238184850663;-5.31904996838421;6.1270427564159;1.09663453884423;7.7640682272613;-6.7933551222086;8.4626897610724;3.86566106695682;-0.680588651448488;-0.712763140909374;5.15908774454147;-5.87384912651032;3.67830383591354;-3.53616933804005;-5.92594652436674;-7.37337265629321;9.14542506914586;4.24118026625365;4.87666197121143;-0.424845512025058;7.35139052849263;2.55008875392377;6.68262872844934;-1.93683247081935;2.76835071388632;9.65346479322761;-0.349986520595849;7.50055733136833;-9.89540789276361;8.72463681735098;-0.548905655741692;3.44527849927545;2.68392292317003;-0.626543685793877;9.09583524800837;3.62992947455496;-4.61542466189712;-3.68955834303051;-9.3695415975526;-7.47715935111046;-7.24786943290383;-5.15750915743411;-9.90130585618317;-5.89866369962692;5.44527580961585;-6.19769876357168;7.69261878915131;7.90376904886216;-5.70369704626501
+-8.10411280486733;9.48637879919261;-0.537043083459139;2.58909155149013;-8.89178489334881;-0.475318250246346;-7.64334189239889;-4.54461069311947;-2.17578352428973;1.76178428344429;-0.156988482922316;-5.48755872994661;8.43600269407034;-6.87763990368694;-7.37439137417823;-6.50114732794464;2.0500796334818;0.488925985991955;6.68445863761008;6.12067910842597;5.88983139488846;6.29309406969696;5.84585980977863;7.21234594937414;-1.96398003492504;1.10331339295954;2.40463704802096;7.37691144924611;9.87497966270894;-9.54097533598542;8.73474629595876;4.5446188095957;-6.04689277242869;1.15258096717298;-4.60770557634532;-4.99076470267028;2.3115301085636;-3.62195512279868;-1.99660851154476;-3.10984789859504;-3.36581202689558;4.52888814732432;-3.26245826669037;0.00373832415789366;-1.6997971618548;-3.87004877906293;-6.99340460356325;8.42600321862847;-5.66031120251864;9.8352440353483
+-4.9544560816139;-0.289430138655007;-8.89355124905705;-6.58020699862391;0.167975714430213;-2.50234695151448;-4.18217134661973;-2.27659297175705;5.35417100880295;4.11391313187778;8.79664265085012;-5.92246127780527;-0.286254337988794;1.95362218189985;1.79879401810467;-1.41514655668288;1.63319347891957;-7.94013634324074;-1.39856289606541;-6.32670309860259;3.94252275582403;4.56495098769665;9.87564062234014;-0.705595370382071;4.823176888749;-4.68982730992138;-1.46089500747621;9.63879718445241;6.47705601528287;1.29312799777836;-2.87382133770734;9.493905948475;-3.65941742900759;-5.21624160930514;6.56065740156919;-8.17661788780242;9.84803852625191;2.79736126307398;-4.42370866425335;5.55116047617048;6.87039746437222;-8.11823395546526;-3.86408601421863;2.58959512691945;1.73903326503932;-6.92778443917632;-0.182388271205127;-7.62079354375601;-0.611573439091444;4.10679309628904
+-9.57689464557916;9.93615285027772;8.26689862646163;8.53446148335934;4.23860462848097;-9.37341316137463;-7.98039355315268;3.07303929235786;9.4485729187727;6.32294106762856;9.28026579786092;-2.41333067882806;0.792351961135864;-1.2781950738281;-8.86307388078421;2.53543831873685;6.28652101382613;-1.94353824481368;8.96550734527409;-9.80503350496292;-3.1137806782499;-2.3451732005924;-0.161909619346261;6.48068119306117;-6.09676657244563;0.904373601078987;-3.48399080801755;-8.36457673460245;4.39035198185593;9.5607249904424;1.40279059763998;-0.391681133769453;3.78168719820678;4.58427242469043;2.54963802639395;3.11168029438704;6.85630430467427;5.14265440870076;9.49336152523756;-8.18450801074505;3.52677134331316;6.47583621088415;5.63527134247124;-1.38474613893777;-5.3877641633153;5.55733960587531;-0.125162410549819;-6.59360511694103;3.04022912867367;0.0857851048931479
+-7.48559701722115;-0.569481258280575;3.21534621529281;-0.12324552051723;2.33146011829376;1.75726795103401;-5.82592696882784;0.554159288294613;1.29871415439993;6.1560379806906;-9.30813410319388;9.31554341688752;-4.21790667343885;9.70995259936899;2.68301656935364;8.94417773932219;8.62223849166185;5.08155146148056;-0.728374882601202;-5.532460026443;4.01535561308265;-6.27799574751407;-9.19437568169087;-5.07011177018285;9.91916596889496;4.9521764414385;-4.51449748128653;7.85246380139142;8.16621583886445;-5.86753353476524;7.23925604950637;-5.71779704187065;7.48395556118339;4.0064294449985;3.62913731019944;-5.86368082556874;-6.43922327086329;-3.5361260548234;-7.50939806457609;5.47642586752772;-0.303957755677402;8.34723229054362;-3.14723629038781;-0.198244121856987;5.08898621890694;5.08641151711345;5.79886314924806;-7.53803907893598;8.64158020354807;3.1211434584111
+4.92203949950635;-7.95279817655683;-3.59707578551024;-3.83764812722802;-1.37452111113816;-6.80898802354932;6.34175854735076;-4.2340679327026;5.08902999106795;-1.36455266736448;8.33388085942715;-0.00290188472718;6.28456708043814;-3.05520098656416;8.31118286121637;-7.54609230905771;3.13142497092485;9.03501857072115;-7.62298642192036;5.66631855908781;-8.11621394939721;-8.11643643770367;-0.307748676277697;-0.108808404766023;1.63178510963917;3.61919098068029;8.48299230448902;-5.32988229766488;8.34176381118596;6.94901147391647;-1.33425115607679;-9.84691936522722;9.49516975320876;-5.37054696585983;-1.59569244366139;1.13892278634012;-2.24359389860183;9.85966583248228;-9.07891806680709;-8.66227216552943;0.238122888840735;1.91473758313805;6.87332110013813;-5.16970486845821;-0.281950319185853;-2.18452065251768;8.22628675960004;-0.436282977461815;-9.13972445297986;4.91120086051524
+2.20277619548142;5.67350205499679;3.08917113114148;2.18072438146919;7.37365064676851;4.16294106747955;-6.31727777887136;-1.97712849825621;-3.82793701719493;-2.17933968175203;0.45525040011853;-2.69046608824283;1.27515509258956;4.11708144005388;9.58125773817301;-5.04838331136853;-5.4554438078776;1.32576214615256;7.05480773001909;-9.39454281236976;7.56160849239677;-7.24261081777513;-2.57809015456587;4.19875444378704;6.25802957918495;6.0639762878418;4.2433020286262;-3.56816892512143;-0.205590813420713;9.80859526898712;-8.77971345093101;-6.21482199523598;8.19203209131956;6.61169227212667;7.36570410430431;-4.73981067538261;-0.519286100752652;-2.83253875095397;3.81126791704446;-9.04530869796872;-5.20164022687823;-6.85614578425884;7.52952761016786;9.68140832148492;-7.04058277886361;-4.9217116786167;-0.122157447040081;8.87656197417527;4.70778222661465;5.36929646972567
+-4.38481451943517;-4.08051452133805;4.20397215522826;6.49110969621688;5.61476840171963;7.78695488348603;-9.404032737948;-7.52457986120135;8.84106771554798;-5.3662026906386;-4.58826781250536;5.25443234480917;-6.29125896375626;4.14875522721559;3.31494035664946;-0.072455951012671;-1.58469424583018;5.42111789807677;0.111589352600276;-2.82773818355054;-5.01596231944859;4.98279889579862;-0.961265987716615;-4.19282381888479;1.99861539527774;7.13549932930619;7.97013855539262;0.841783965006471;-8.98740781005472;-2.55642176605761;-4.71094235312194;-6.90254109445959;8.57218996156007;0.995364799164236;-6.4055003831163;-3.23844669852406;4.22467043623328;-6.10438047908247;3.93341863062233;9.9089191108942;-5.91094850562513;-4.33750540018082;0.853968323208392;-3.23199447710067;8.4755556890741;-0.602212278172374;1.13828195258975;-3.52512139361352;-6.32811055518687;-3.78915204200894
+5.72925217449665;-7.15034242253751;-1.81961879599839;-1.50722491089255;9.15507274214178;-0.872528916224837;1.1822428368032;0.683507137000561;-8.52746062912047;-4.58968906197697;-2.9758349340409;4.369613872841;-4.75736282300204;9.31881912983954;-6.40987316146493;0.619952920824289;-0.988697363063693;6.94150828756392;5.36307130474597;-2.77040959335864;6.22578480280936;6.15248781163245;5.27241521049291;-8.73684692662209;-9.27143092732877;2.19552217982709;-9.99088234268129;-3.10184174682945;-4.14959323126823;-3.79578373394907;-2.82464171294123;-4.27542535588145;5.08862643968314;-0.0477500772103667;6.37124033179134;8.42116589657962;0.721725937910378;6.67273321654648;-0.816890685819089;7.16951520647854;-0.420970288105309;9.83815636485815;-7.17383567243814;-5.33369755372405;6.4508492546156;9.11221993621439;6.39733653049916;-7.54411607515067;-2.55118187051266;-1.18276939261705
+-7.90275493171066;4.15172874927521;7.15876077767462;-9.90035359747708;-7.58546414319426;0.687446887604892;9.11861432250589;5.97805412486196;4.08375578001142;-2.55068764556199;9.86591961700469;-8.61782617866993;-9.79684949386865;0.389373898506165;-9.3840268952772;7.69074744544923;-5.90092794504017;-3.26658111531287;2.3730837367475;-9.71389800775796;3.21280807256699;4.16543884668499;1.98607786558568;1.06654078699648;4.78882497642189;5.56786619126797;3.74742423649877;-4.0241655241698;4.06411840580404;-6.29666083492339;7.78910239227116;0.760500705800951;-1.17328683380038;3.69515545200557;6.48094518110156;8.92891703173518;8.89008034020662;-8.46361526753753;-5.45954845380038;-3.83487683255225;-1.50975130498409;-0.0993228517472744;2.52120712772012;-4.06960890628397;-5.77678848057985;8.38459021877497;-7.83558504190296;3.29950592014939;6.82629471644759;1.61710028536618
+5.05435788072646;-1.05212602298707;-6.94547143299133;-3.51664951071143;-4.44737686309963;-0.200211494229734;4.95635294821113;-8.92024105414748;7.62629227247089;-3.49253267981112;4.40951623953879;0.0499026710167527;-4.12864485755563;-0.985067011788487;0.436343061737716;5.20745602902025;-0.252505117096007;-8.93502310849726;-3.40007257647812;9.25532312598079;-6.34877419564873;-0.730016543529928;-6.76067380234599;-3.58242340851575;-4.43888690322638;-8.42239372897893;0.83219104912132;-9.91279909852892;0.709755485877395;7.45946100912988;-0.598480254411697;2.06372263841331;-0.604012641124427;-9.41709560807794;-9.46646123193204;9.30649791378528;-2.98574395943433;-1.19304142892361;8.60107386950403;7.59064613375813;-5.30345525126904;-7.46497068088502;4.14173558820039;3.11392121016979;-1.39542937278748;7.67457352951169;-2.40453644189984;-2.97496197745204;4.53189593739808;-5.17405509017408
+6.33212393615395;7.57495445664972;-0.202298783697188;2.92587991803885;8.96173575893044;-8.47703974694014;-8.85389506351203;7.83586745616049;2.69370628520846;-5.14325467403978;1.06768879573792;-0.284136151894927;-9.51233520172536;-9.02230946347117;6.63474711123854;5.19991226494312;2.48342915438116;-3.46827806904912;-7.77392821386456;-2.82399358227849;-7.90723683778197;-6.59743754193187;5.79242267180234;3.75150988344103;4.66528033837676;-7.0773445116356;6.63759363349527;-0.0594410626217723;8.68652820587158;-2.25807085167617;5.64104724675417;0.363003402017057;-6.86859249603003;-3.39387360960245;-0.362286642193794;6.12843008246273;-5.97864548675716;9.07114812172949;0.75890704523772;-1.01894175168127;-1.21891789138317;4.55765646882355;-4.14950251113623;7.6534331869334;-4.76987124420702;-6.83157108724117;-5.77451508957893;2.16681226622313;-8.24771340936422;5.24151925928891
+-1.75399336498231;-5.7939344458282;-9.32651845738292;9.64296016376466;-6.42805401235819;-6.02400666568428;-5.0655109109357;-4.51475251466036;2.935910243541;-8.84833389427513;-5.65754166338593;-3.36866336874664;2.62855600565672;-1.01474686991423;6.92091701552272;6.59974572248757;-9.41196028608829;-6.99131103698164;2.90103410836309;-5.34367288928479;4.93763487320393;2.42644134908915;-1.91709566861391;1.91217525862157;5.44630645774305;-8.86011967435479;-6.89077975228429;-6.81290222797543;-9.17867548298091;-3.63611375913024;1.40874698292464;0.392915038391948;-0.408156053163111;4.37227353453636;-4.74820102564991;8.12186692841351;-1.6761615825817;3.35560170933604;-0.352764464914799;6.83822765946388;-7.99232516437769;1.59963061567396;-7.36015815287828;-9.36374636366963;-8.44977100379765;-6.30131197161973;-8.21292127016932;7.88410588633269;-8.40164477471262;-1.7963360529393
+-7.2860603267327;-8.76660048961639;-1.18165362626314;4.22509982250631;-5.49608017783612;2.26501293480396;7.68215553369373;-9.29462018422782;6.17642854806036;-4.66847725212574;-9.24205696675926;-2.91933824308217;-4.33884585276246;5.20688711665571;5.67606999538839;9.38824217766523;-8.2486286573112;0.710946298204362;5.56023497600108;7.24665323272347;-0.519044217653573;4.81084862258285;-4.66659036464989;3.67833810858428;-1.71761728823185;-7.6949709514156;-6.39208371285349;-0.269398302771151;-2.19097043387592;-1.88136447686702;-5.59424642007798;-1.64377202745527;-2.34289284329861;-9.69792034942657;-4.28491426631808;-4.58314519841224;-2.15583154931664;-9.58248457871377;-6.29604706075042;1.97521144524217;8.20141684729606;6.69354733545333;-7.49633757863194;1.65740416385233;-8.4041993599385;-1.85260641388595;2.01231711078435;-5.43206232134253;-5.20109578967094;-7.06730884034187
+6.24512508511543;-0.0808962341398001;-8.93900645431131;8.72169336304069;-2.19437178689986;5.26120429392904;-0.257736966013908;4.53994601964951;9.68353912699968;7.59376661852002;8.33098668139428;-8.68915687780827;-1.51810744311661;0.287311407737434;-1.84650360606611;-2.83779848832637;-0.499656046740711;5.99538220092654;-4.47810220997781;-9.66682789381593;5.9978907648474;-2.53576355054975;-7.57517200428993;-0.805202019400895;-2.74775532074273;4.77216996252537;-6.80369787383825;-5.38386335130781;-1.46108193323016;-4.37351390719414;-2.37988119479269;-5.82552611362189;2.78863840270787;8.54036649223417;6.41029816586524;-7.59876132011414;-9.41887283232063;3.85973167140037;2.37575851846486;-9.90165393799543;-4.68090679030865;4.96107502840459;-9.82737109065056;4.52507088892162;8.30390044488013;-2.16531005688012;-9.72490641288459;-2.40684479940683;6.56142291147262;-6.12807348836213
+-6.89380166586488;3.43383439816535;2.67324096057564;-6.13261948805302;9.09514994826168;2.10021797101945;-2.90903128217906;1.04262887500226;0.288630747236311;-7.34614734537899;-7.93220693711191;1.90820278599858;6.00464188028127;-8.85229794774204;9.62993982248008;9.68595736194402;5.27919683139771;6.78114439360797;-2.84581801388413;2.29776052292436;2.93103167321533;6.15415258798748;-7.22870586905628;9.85982392448932;8.22466928511858;-1.1524177249521;-6.93457860965282;1.13883781246841;5.7262449292466;2.50995504669845;2.20707215368748;4.04647886753082;-0.279388106428087;-6.07969851698726;-7.46136094909161;5.96828286536038;-0.0735028181225061;9.20786177739501;5.56700299493968;4.44382494315505;4.2322701215744;1.43304464407265;-0.688686133362353;2.68234317656606;-1.0390174947679;-2.68379193730652;7.65955937094986;-7.46235843747854;6.60204032436013;4.30183042772114
+-7.84154618624598;-1.40319516416639;-3.75590218696743;1.07503809034824;-6.10026490874588;4.39225042238832;4.15389127563685;-7.98421324230731;-5.37200640421361;-3.4354439470917;2.72242345381528;9.56798792816699;9.90035164635628;-2.90861143730581;-9.77840671781451;6.72203383408487;1.59844014327973;3.99656384252012;-7.97595120500773;6.87126556411386;0.711812800727785;-8.6959225917235;-6.3604522915557;6.93076588213444;-8.64904708694667;-4.86306069418788;5.83155129570514;1.75829433370382;-4.30232729762793;-1.78537758998573;6.31780280265957;1.1650811880827;-6.33676528930664;-5.59834774583578;-5.4160725325346;-5.91392675414681;-4.98702747281641;7.8330975305289;-8.52717966306955;-2.86736097186804;2.59203864727169;8.83711152710021;-1.47266270592809;4.54545453190804;-1.69129789341241;-2.74692742619663;-7.14817830827087;4.72512230742723;-7.00746574439108;2.85067315679044
+-9.30480472743511;-3.3834219397977;1.82437452487648;-3.08822523802519;5.91655746102333;1.51594488415867;6.72874163370579;5.56474911980331;7.84257113933563;-8.93797003664076;1.6866602236405;9.04020834248513;8.03593002725393;7.61158816050738;0.0335679296404123;9.8188043339178;0.518680936656892;2.42488397285342;0.22119268309325;-8.52964601013809;6.70208004303277;2.62869058642536;-8.88397344853729;-1.80673114024103;5.03316289745271;3.08295069262385;-3.85703328996897;-7.23392143379897;0.599877298809588;-5.40025772992522;-6.62405495066196;2.21114620100707;-1.65234157815576;3.63579470198601;0.743761188350618;-9.68482581432909;-2.94284879229963;3.09332078322768;0.295658926479518;3.79248795099556;6.43935937900096;-8.18897570949048;-8.82844815962017;2.68638353794813;-9.34816522989422;-3.09307308867574;-3.05695691611618;-1.14421939942986;-6.67619314044714;-1.5547381946817
+-0.273921848274767;4.28439895156771;5.34721648320556;2.68099914304912;-1.59431705716997;2.05431394279003;-2.77577721979469;4.54339298419654;-6.25116678420454;-4.57347002346069;3.76631236635149;-4.95827722828835;-1.4220368815586;9.53843018040061;8.19458189886063;-6.09508336056024;9.6949996938929;5.89017421472818;-0.686638480983675;-3.14164497889578;7.99711269792169;-3.78870348446071;-6.59577463753521;-2.77227915357798;3.25967900920659;-1.3697888283059;-1.71984341461211;-4.45678400341421;-5.85152716841549;-9.62002797517926;4.85967083834112;8.85268460027874;-5.97546714823693;8.89081788249314;-8.7872965587303;2.91039566043764;2.39304513204843;4.02185037732124;0.591052165254951;-6.82524642441422;-3.83839997462928;-0.8730080537498;2.91083774529397;3.79762465134263;6.92758167162538;-7.30936149600893;-9.15090386755764;4.67704681213945;0.275953314267099;-6.13871857989579
+-5.61757161747664;-3.59601089265198;-7.2785690240562;3.65378024056554;-7.64602398499846;5.67494024056941;3.65997684188187;2.1529297856614;7.69103437662125;-2.37212903331965;6.97361489757895;7.55283848848194;6.46598388906568;8.05302733089775;6.16313410457224;2.77735941112041;-8.93740472849458;-4.75735254120082;9.75367588922381;-0.285933343693614;-4.11263340618461;5.72689131367952;-9.4310140889138;8.53095151949674;5.57224438060075;0.720958150923252;7.31371992267668;5.14516940806061;8.21258471347392;9.11775350105017;-8.45722260419279;6.70327575411648;-4.80139579623938;-8.59250117558986;-0.440126918256283;-6.7050477815792;4.71715358551592;-5.70998476818204;-9.2081894306466;-8.65098568610847;-8.63112266175449;3.04855482187122;8.47921430133283;9.55090504605323;6.70802811160684;-1.43876992166042;-0.918863443657756;0.124524394050241;-0.890619978308678;-9.17991734109819
+4.02163029648364;-1.13368820399046;6.23582161031663;-6.13037082832307;-1.60669187549502;-7.86454192362726;-5.51537558436394;3.32642941735685;-0.995853384956717;-3.47707239445299;-7.93528824113309;-4.45575483608991;-0.193080459721386;9.80591978877783;-5.670012133196;4.03421464841813;-1.35197209659964;6.88216282986104;-2.89635306689888;-2.30419000145048;3.78139675594866;-5.86996724829078;8.87486635707319;6.52907396201044;4.94483883026987;-2.54959260579199;-5.68671665154397;9.8050092626363;5.78833218663931;9.80305224191397;-4.52360541559756;-2.44286432862282;-2.01952903997153;5.39249318186194;9.34012298006564;-8.42717807274312;6.81538264267147;-1.0199411958456;2.83644374459982;-7.61072750203311;-7.14789744466543;-6.16983259562403;6.14414204377681;5.66712920553982;-8.6212145164609;-4.56824728287756;6.45208663772792;-8.4530690126121;8.71066469233483;8.95753474440426
+-9.49346350040287;-0.29116322286427;-8.57446210458875;9.34901367872953;-5.43387416750193;3.17204491235316;-8.59298116061836;9.41234603058547;-7.17849805485457;4.20034803915769;9.48122198693454;8.00296795554459;-4.32211545296013;3.81656508427113;0.415328829549253;1.64385596755892;6.98785749729723;-1.19018197059631;2.35076653771102;9.66898170765489;-7.73325969930738;3.22778905276209;-9.32378028985113;-0.658049746416509;8.30846545752138;7.69601566251367;8.38845012243837;-7.10576466284692;-3.46146046184003;-2.78239521197975;-1.42884312663227;-4.30518612265587;-9.52865519095212;-5.06440684664994;-1.86433108989149;9.77641178295016;-1.09231965150684;1.07997097074986;-4.14564902428538;-3.77240884117782;5.48313104081899;-9.10435067955405;0.126990475691855;-0.155734266154468;3.96053025964648;1.8231702176854;-8.42941547743976;0.574334980919957;-8.37284281849861;4.09163013100624
+5.03065141383559;7.91431119665504;-2.33448339160532;-4.24260158091784;-8.18076802883297;-8.64932359196246;-6.1524017713964;-4.13489266764373;8.28768185805529;3.94461839925498;-2.65856635291129;7.45319098234177;-8.47506585996598;6.36953071225435;9.83018851373345;-2.84530495293438;-3.07847840245813;-9.9914758047089;5.25460495613515;8.73078107833862;7.94389305170625;-3.80520822945982;2.2840756457299;-9.03417652938515;0.0911658443510532;4.3690918572247;0.105934832245111;9.73666593898088;-1.68205184396356;0.222289492376149;6.62279982119799;2.99822344910353;-8.10619601979852;9.01817454490811;0.358996638096869;9.58989076316357;0.0647725164890289;8.00786312203854;-4.84180338680744;-8.49423152860254;8.51604827214032;0.542373745702207;3.60352720599622;4.76241720374674;8.47722476813942;-4.13000972010195;3.04935756139457;8.36650051642209;-6.49290133267641;-4.51098936144263
+-4.13170841056854;-3.89194413088262;4.28903279826045;-6.47482853382826;8.49766437895596;-1.7996884835884;9.47842861525714;3.33715287037194;7.15590020176023;7.07812782842666;-7.47315299231559;2.61856132652611;6.05795829556882;7.434559809044;0.0482881208881736;1.11446089111269;1.45345623604953;-4.28553762380034;3.19188049063087;9.11620521917939;-1.62059062160552;-4.85320566222072;9.85405401792377;-1.64338232018054;9.83841431792825;-9.57021838054061;7.7304670587182;-0.520252636633813;-8.02828829269856;2.23638567142189;1.41313328407705;-7.13491473346949;6.77962530404329;-4.67010321561247;-4.78618510067463;7.24184566177428;-4.39773431047797;4.76854139007628;1.50851922109723;4.45089953951538;1.93294665310532;-8.69277125690132;9.16242608334869;-2.17238161247224;-0.928302179090679;-7.9293877677992;6.67201889213175;0.235900054685771;-9.41629700362682;0.690708011388779
+5.73676319792867;-4.69523388426751;8.17381833679974;7.0726999361068;4.26659238524735;-6.84566229581833;-0.436000130139291;2.90853652637452;7.07749349065125;-0.642769145779312;0.396282491274178;-7.06797429826111;2.83332935534418;2.90628528688103;-3.54144958779216;-9.95030286721885;-0.0534800719469786;-8.52128295693547;5.81711397971958;-1.86789736617357;-8.87894546147436;-0.507104257121682;6.39768346212804;1.83232601266354;9.09038087818772;7.86262373905629;-4.44792794529349;-4.53821402974427;6.80609257891774;5.38437793496996;4.12546702194959;4.59903342649341;8.19570883642882;9.52374482993037;-1.00166943855584;7.65225436072797;-4.13463127799332;7.42486928123981;-4.68436909839511;3.24062082450837;-3.03173455875367;7.12965227197856;-9.74420038983226;-7.6155641535297;-4.52480589970946;2.11921980604529;3.23962240945548;-3.52202324662358;-9.3875077040866;-9.76375365164131
+6.57405426260084;3.86266333516687;8.11181522440165;9.64470342732966;-3.73751518316567;5.18562239594758;0.0731784617528319;9.91582605522126;6.79898086935282;-8.65302253514528;-5.69534641224891;-4.48268915060908;7.91834339965135;4.8508729506284;3.23359879665077;-6.40309527982026;-4.20369584579021;1.54079776722938;-5.44202606659383;-4.21643396373838;-5.62653096858412;2.71068348083645;8.22596977930516;-9.62387652136385;-5.31894993036985;9.38314106781036;1.36560067068785;0.381502294912934;9.04919115826488;-4.36781742610037;3.87973027769476;6.41143540386111;-8.24994595255703;-8.13030551653355;-7.53322523552924;9.85775749664754;-8.76860135234892;2.28887437377125;-3.75512097496539;-5.84941172972322;7.50700366683304;-3.38761567603797;3.04318433627486;-7.96442613936961;5.29443372506648;-0.0983054237440228;-7.79721167869866;-7.8971891105175;-9.89552580285817;2.4109326954931
+-8.68512563873082;2.87126640789211;-8.13318781089038;-4.82640306465328;-3.28065287321806;-3.63968024030328;-0.630053654313087;-8.92749693710357;-1.90892150159925;-3.52246764115989;4.89130036439747;5.09426331613213;2.97630462795496;5.29656909871846;7.83015787601471;1.02696769870818;1.66812792886049;-1.53740840032697;8.08795597404242;-1.56427923124284;4.50817017350346;-9.89027515985072;-6.22996104415506;8.79576141480356;-2.03115202952176;-9.71150313038379;-4.36934941448271;-4.30558771826327;8.41793595813215;-8.53638322558254;-4.47206841781735;-5.20792425610125;3.93544143531471;2.27508529555053;3.12243071384728;-9.22212891280651;3.96950045134872;1.34436349384487;4.90737130399793;4.09046037122607;-9.52164916321635;-6.03637848980725;2.88837647531182;-3.17543282173574;-3.91513381619006;-8.49906518124044;1.27900284714997;1.74497885629535;-2.56012651603669;-4.70417483709753
+4.09962727222592;-1.05255278293043;7.1119390334934;-1.74589172471315;5.8466725749895;4.60894927382469;8.00343976356089;1.13402302842587;6.29164564423263;-2.62376999948174;-6.36310472153127;2.9961855802685;9.33419220149517;5.66546637564898;-6.73646044917405;-7.69331824500114;9.00321049615741;3.61072167754173;5.06614178419113;9.91605116520077;2.6635506702587;9.31446024682373;6.19194713886827;-4.12731626071036;-3.92079354729503;-3.78120466601104;-8.38664351496845;1.97716658003628;-2.5141688529402;-7.60416805744171;2.05325417686254;1.15506448317319;3.55384534224868;-3.79880733322352;-7.83813508227468;-5.23889498319477;7.83566943369806;-2.537348321639;-9.16493926662952;4.75276506505907;-4.18844823725522;-7.16723343357444;-0.678267627954483;7.89775767829269;0.454767323099077;4.02759786695242;-6.66810868307948;-0.398521306924522;3.81283874623477;-7.88920890074223
+-8.35035951808095;-2.80423099640757;0.0116473156958818;-9.3769966205582;3.78397620283067;-2.64376348350197;8.04132471326739;5.75216874480247;-3.49192757625133;9.77590810041875;3.28677326440811;-1.39239703770727;2.67182677518576;9.98352720402181;4.12578717805445;-2.98797861207277;5.10229186154902;6.03591841179878;-3.58728131279349;1.00780650507659;-1.87952497974038;-3.0292028747499;6.59361871425062;-8.20574358571321;4.46695161517709;-7.85159802529961;7.37413368653506;8.55681118555367;-0.706145470030606;4.52425187919289;-9.88959302194417;-2.6929001417011;3.61159090418369;-1.03121505118906;-8.84425576310605;-0.858807684853673;3.30505600199103;9.80788079556078;-5.62545171938837;8.42155627440661;4.34178008232266;-1.35865573771298;-1.85941773001105;7.31783837545663;-2.91046266444027;2.36365301534534;8.31426402553916;2.51060056034476;9.71390139311552;-3.4887803485617
+-0.141701325774193;-7.00247646309435;-4.08379600383341;-9.65385288000107;8.37717457208782;-6.07155227568001;-5.45206444803625;6.70105377677828;-9.49207265395671;-4.63962049223483;0.0736191030591726;5.25236270856112;-8.6087663192302;7.30532060842961;-1.90733037423342;9.52906612306833;-6.37468389235437;-7.82218022737652;7.50122993253171;-8.28780607320368;-7.43126157671213;8.85100537911057;1.43893138505518;-0.513520599342883;-7.26788990665227;-8.1279207393527;-8.9099827921018;-3.62811353523284;-7.32644802890718;-4.74133675452322;-1.07092974241823;7.14329155627638;4.41420138813555;6.79185380227864;6.64303112775087;2.80368442647159;3.91855613328516;-4.40367183182389;-9.60085490252823;2.67772580962628;6.17863035295159;-8.53051309008151;6.63645803462714;8.88576813042164;1.87520241830498;9.10952773876488;-0.111036999151111;-1.68290142901242;-7.9867067374289;-5.82690706476569
+-3.13985489774495;9.27073751110584;0.981867164373398;9.67043654061854;1.62785263266414;-5.89098313823342;6.97849767282605;-8.32953762728721;-3.678346471861;-8.38991450611502;-8.22790271602571;8.91944763250649;0.907396343536675;2.16255443170667;3.93064402975142;-8.28994683455676;-2.0509992679581;-0.857820231467485;6.36512629222125;5.79042457509786;5.59491266962141;-6.60348861478269;-6.5255735302344;3.7729255668819;-5.02579417545348;6.30913335829973;7.13613166008145;9.05436259694397;-6.60988301504403;-1.66365942917764;1.27389890141785;3.37803176604211;8.87701463419944;-2.86761993076652;4.56835886463523;8.58527791220695;-0.353709226474166;5.68678537383676;5.60867160558701;-9.84118827618659;4.0100304922089;-5.39743221364915;-1.73092950135469;-5.62479582149535;1.86797053553164;-0.963405836373568;1.35767233557999;5.98959596827626;0.510635552927852;-8.03746108431369
+-2.58051255717874;-2.50810381490737;7.61281630024314;6.98109184391797;-1.07714717742056;4.37914725393057;7.8001956269145;9.54836768563837;-9.75996137596667;2.88925112225115;-8.74202525708824;4.75238044280559;-5.45141253620386;-8.89085555449128;-6.50515382178128;9.6735160285607;-9.26614988129586;-0.89328610803932;-7.47308059129864;-8.4466530289501;-7.65302724670619;5.18767122644931;-5.52709631621838;-6.96485129185021;0.318112722598016;6.03588104713708;-8.7098296219483;-1.95751323364675;7.26989864371717;-0.0378504442051053;-3.40761184692383;8.57618155889213;-2.54913576878607;5.46099709812552;6.62846800405532;-0.536032561212778;-4.14036758244038;7.27065737359226;-9.24641519319266;-9.49598229490221;5.51759734284133;9.11491983104497;2.34956446569413;-7.30433610267937;3.46061826683581;-6.18017149623483;-2.71922287531197;3.82344056386501;-9.63205051142722;3.95829054061323
+-5.19320321734995;-4.40582175273448;-9.96954153757542;-2.66557408496737;9.73252706229687;-1.48343767505139;-0.533855040557683;4.67966087628156;5.8414972666651;9.25592701882124;-1.92859614267945;-3.39417546521872;-7.90151545777917;-3.50486355833709;-9.99786586500704;7.18205966986716;-8.48065205384046;-6.20944578200579;6.06594277080148;-7.32437520753592;2.16967761516571;0.034055644646287;6.74599451944232;3.85132446419448;-6.22156867291778;0.484299594536424;5.65923468209803;-7.4715317459777;-7.43804370518774;-7.20156909432262;7.74685141164809;3.79649917129427;0.350112398155034;-7.77353921439499;-9.93114510551095;2.81007817480713;4.27120653446764;-2.6099449954927;-2.96778385993093;1.00047274958342;-3.83710484020412;-6.1945230467245;-3.51225940510631;0.670211701653898;-6.76071268040687;0.245979940518737;3.85088450275362;-3.59249762259424;-5.64497579354793;8.84622166398913
+3.73718305490911;3.55719261337072;4.65208908542991;-6.65655109565705;-1.83852412737906;-1.2482486711815;3.72523979749531;9.40339623019099;8.99760266300291;-2.79446063563228;6.46633912809193;-7.2360261855647;-5.09243596345186;1.20767377316952;-8.23785312008113;8.88930885121226;2.38610762637109;2.75913177523762;-9.45353828370571;-6.90237890928984;4.00345696602017;-7.73956480901688;1.15987632889301;-5.69152780342847;-8.05638337042183;-5.28574252966791;-8.34863489493728;2.71183617878705;-1.78263947367668;-7.06780633889139;2.85255953669548;-8.88374635949731;-3.2920540869236;-7.8658055420965;4.83216187916696;-8.57041496317834;7.30692484416068;9.34206881560385;8.85052775032818;3.80956936161965;-3.21498250588775;-7.10818667430431;6.34731671772897;-3.26681780163199;-9.30217488668859;0.93480309471488;-2.16983610298485;6.69889839366078;-3.61426829360425;-6.89180164132267
+2.3788336198777;-7.63113574124873;-5.51093879155815;0.59368709102273;-4.4723196933046;-9.61546230129898;-8.39224779047072;7.92707804590464;-7.10143370553851;-1.41194361262023;-6.52601599227637;-9.97517548967153;-1.61017966456711;4.12928593810648;-4.98455019202083;4.50556674040854;-3.06073345243931;5.80815649591386;-7.92923712637275;-0.87795099709183;8.00962653476745;6.48445606697351;7.53754985053092;-9.41382222808897;-5.29830467421561;2.96326701063663;4.80577910784632;6.51261984370649;-1.1430878425017;2.13597077876329;5.56230977643281;8.56366262771189;4.30776828434318;-7.0734215574339;-2.44480899069458;-2.00430816039443;5.01331821084023;3.0129767768085;8.33705903030932;-5.20573399029672;-8.84877873584628;3.18959271535277;0.801504524424672;-2.68570859916508;-3.7126901326701;-8.34428914356977;4.71884707920253;-0.138583839870989;-8.40811075642705;-7.29073310736567
+0.812282902188599;4.76211580913514;-1.87395466025919;9.64633217081428;-9.60474694147706;3.97445482667536;8.88092167209834;-5.0607381016016;5.97572566941381;3.73333433177322;5.21077498327941;-0.909044770523906;5.65805181860924;-4.92132091894746;-4.72714444156736;8.02972089033574;-7.61354716960341;-3.95360076799989;2.96234561596066;6.67503412812948;-0.55022937245667;-2.31635202653706;6.30808570887893;0.565804215148091;1.91502279601991;-0.337986038066447;-1.41362830065191;0.719030192121863;-6.9833963830024;1.53049129061401;-8.13285185955465;-0.636371625587344;7.65642759855837;0.831766813062131;-9.52552540693432;3.30818677786738;-7.48678117059171;-3.47864614799619;0.316430814564228;7.06165228504688;7.02035943977535;-2.42230932693928;-0.341749773360789;-0.507863662205637;3.78391134552658;8.15949625801295;6.37556643225253;-2.9469975316897;-5.26952075771987;-5.01877466682345
+5.1786354649812;-7.52294154372066;3.34905544295907;8.93987443298101;-8.26323410496116;4.03246198780835;-2.14110259898007;0.302235344424844;0.444292132742703;-4.67253972776234;-8.31317789852619;-3.84183284826577;-9.39631237648427;1.24717963859439;-3.88831850141287;0.649426076561213;-9.08205716405064;-2.93145864270627;9.99007356818765;4.37513921409845;-6.10827164724469;-2.42427532561123;-2.01796398963779;1.68640641961247;8.16120836418122;4.73402281291783;-4.05434843152761;-8.78409006167203;-5.53034830372781;-2.46995013672858;-3.41787083540112;9.72719104960561;3.34714439231902;-3.61494807526469;-4.74709247238934;7.90262167807668;-7.37862889654934;-6.30149140954018;-3.51723111700267;-5.5289577273652;5.82721752114594;6.29513912834227;-8.85417982935905;5.54040019400418;6.05894653592259;0.182865508832037;-9.01517204008996;6.41986085101962;-6.50361240375787;6.57327459193766
+-1.46687913220376;-8.99968769401312;5.48226056154817;6.81349199730903;4.12437573075294;-9.70151789486408;-6.57387415412813;-4.59822274278849;-3.98993472103029;4.16204956825823;6.52613454498351;3.21577304974198;9.5227389736101;0.707293464802206;3.63971971906722;4.34607340022922;-9.53643591143191;-9.1415795031935;3.42251767404377;5.19698369782418;-4.57588483113796;-5.31585318036377;2.91199385654181;-8.87717387173325;0.8044045092538;-3.00849272403866;1.15514568053186;-4.73351316526532;-5.64950689673424;-0.214598430320621;4.89777817390859;-7.04534684773535;4.68967908527702;2.14321138337255;7.05817265436053;1.63101615384221;-2.04154179431498;9.97986984904855;-8.63335656002164;4.22467611264437;7.76633675675839;-9.82788771856576;-5.48174610827118;7.87750559393317;4.83233605045825;-5.95184094738215;1.01422998122871;6.85198963154107;-3.68456994649023;0.484411246143281
+-3.63094906322658;-0.0237854896113276;-7.85120171029121;-5.92126277275383;-2.65099758747965;-9.78737656027079;-9.38516815192997;-6.17865479551256;-7.59573831222951;4.02348282746971;-9.68598420731723;1.95261656306684;7.73337536025792;-2.33539627399296;-6.47370964288712;-5.54950498510152;-7.54064668435603;-1.67788243852556;0.793657363392413;-7.63706705998629;1.16219637449831;-6.33513073436916;-3.64374247845262;-7.19684295821935;-5.48967978451401;-9.01186204049736;3.43639881815761;6.52756869792938;9.54621728044003;9.89761384669691;5.53219772409648;2.03980414196849;-8.78931230865419;1.21708222199231;-5.75831745285541;-9.33307729661465;0.277683455497026;2.51820014324039;-2.99030701164156;-9.21461168210953;-5.82599927671254;1.53300027828664;-3.59680765774101;-2.38809743896127;-0.779147180728614;9.98779877554625;2.84246403723955;-2.10900487843901;-1.96082320529968;-1.57728883437812
+4.13637737743556;-2.19541364349425;0.336990994401276;-6.79807990789413;5.12163170613348;0.405222587287426;0.0366898719221354;-7.27860816288739;-2.23090359941125;7.18492890242487;-7.7393960300833;3.07336391881108;7.66912742517889;-7.71543519571424;9.59670113399625;-4.8441476887092;8.16075176000595;-8.29539924860001;-8.01354818046093;0.34245986957103;8.34308627992868;6.21629758737981;8.28974552918226;-3.34652735386044;-8.57326531782746;-2.61974926106632;-9.87982987426221;-1.89595791511238;-9.26993497181684;4.55693005118519;0.96279957331717;-9.50940007343888;-8.86184039991349;-4.73346177954227;7.36718291882426;9.25297518726438;-8.81309171207249;0.499881100840867;-7.10459939669818;-2.54821771755815;4.32862077374011;4.31483610533178;3.00784581806511;4.44511608220637;-0.268686735071242;-7.74461681488901;-1.44016421400011;-5.32140275463462;-4.57148602697998;8.17421949468553
+3.44084776006639;4.05141893774271;3.94102522637695;7.05715226475149;2.281792787835;-3.33232121542096;-1.49812578689307;-4.83502467628568;-1.9381002523005;-3.77363048493862;-2.35570536460727;0.939885270781815;1.57880264334381;9.20694430358708;-6.34555234573781;-0.360321495682001;7.84715958405286;6.88507489860058;-5.5178756499663;9.65834321919829;-5.99402341991663;-3.36920572444797;8.33661115262657;-7.49785778578371;-1.53455414809287;-6.60937970504165;-9.15503247641027;7.66495417337865;-9.33879197109491;-4.69809594098479;9.89266976248473;6.57757340464741;9.16761432774365;4.98866349458694;-6.43233226146549;5.69349301513284;-7.64250522945076;4.30322025902569;2.61751029174775;-7.58589731529355;2.17156048398465;3.37245039176196;-1.98120248503983;6.80614704731852;-9.84234187286347;3.52703548036516;-7.05813230480999;7.03708408400416;-6.99129723478109;1.74666188657284
+0.211302051320672;-0.658811200410128;9.79749950114638;-4.42464305087924;9.1313413484022;-6.20300948619843;2.79211555607617;-2.81779560726136;1.55074771959335;-2.03789934050292;0.383745180442929;1.56233792193234;1.07972933445126;-5.21666633430868;3.90179195441306;7.14648436289281;-5.23585677146912;-0.745496372692287;-5.05379871465266;6.62562966346741;0.528438608162105;9.22195811290294;-0.0805547460913658;4.79824886657298;2.57991813123226;-6.19742069859058;8.94835722167045;7.12405987083912;-0.358272837474942;3.99009291548282;5.02585023641586;-9.20708511490375;8.26087993104011;-0.208844668231905;5.23289180826396;-6.06888697482646;-0.303219319321215;-7.69299285020679;4.3629853008315;-7.46300567872822;5.04277984146029;5.95432132016867;1.23047543223947;8.46533536911011;-8.12581890728325;8.68938002735376;-3.97242938634008;-2.18800216913223;-1.16225173231214;5.89395856019109
+-0.248136636801064;-7.00533059891313;2.61770765297115;5.47447952441871;5.97110067959875;-9.97067962307483;-6.24613041058183;4.99672390054911;0.1114067947492;-3.02665262017399;3.5416857432574;3.41407525818795;-9.23143412917852;-9.64231944642961;-0.750980018638074;5.1398600358516;7.40396608132869;8.63208265509456;6.06620086822659;3.41826975345612;-0.262974100187421;2.01480410061777;-1.68177888263017;1.79082320071757;0.430037477053702;-0.889840167947114;-3.02292268723249;9.73154653329402;-1.95854722522199;3.19072195328772;-3.5158622963354;-9.61690363008529;-0.513510885648429;-5.12007627636194;6.52031890116632;-5.56782856583595;-5.31602958682925;1.93942493759096;6.07310573104769;8.19729000329971;-5.20757180638611;4.21958519611508;-1.95014377590269;-2.08005023188889;1.80146276485175;6.13450299482793;-2.66873076092452;7.78979437891394;-5.81737099215388;5.78732018359005
+-5.95134048722684;0.64440977293998;-9.31509895715863;-5.4715353762731;6.31604399997741;7.95098804868758;4.98104906175286;3.1234361929819;3.41750358231366;8.24159506708384;5.27541634161025;8.65885046776384;2.62035835068673;-5.89217300526798;-2.35680581070483;-8.02168586757034;-4.96191075537354;-7.59403725620359;6.92593610379845;-8.72566321864724;-5.68809172138572;-1.58769465517253;-2.85978107713163;3.89673663303256;-1.10919849015772;-3.63074521999806;0.974732809700072;6.3015559501946;-3.58811778947711;-1.1886235140264;-7.73947279900312;-0.883014108985662;-8.01558345556259;7.00241860002279;-1.07420144136995;8.54066533967853;3.05392569862306;-9.05407186597586;-0.861789649352431;-8.22129244916141;0.0433695875108242;-9.5641315029934;1.83408316690475;-1.26781403552741;1.29040053579956;0.340163954533637;8.88768725097179;-6.57996650785208;-3.38268752209842;0.678116483613849
+-3.15379882697016;4.40788864623755;-4.87773448228836;9.94672800414264;-3.20182284805924;7.24458023440093;-2.6591873774305;-8.58270069118589;8.79775083158165;0.15961604192853;-6.87503800727427;7.14515350759029;-3.32896967884153;8.60295389778912;5.04593676421791;8.00039655528963;2.05014457926154;-6.59530120901763;1.05942416936159;-8.79985303618014;-8.59121645335108;6.68008273467422;7.14516978245229;-2.79120061080903;5.23752531036735;6.44265171606094;-8.10193601995707;1.23983829282224;3.7075563846156;-6.6168950451538;4.42287204321474;9.43685141392052;2.24058589432389;2.11461717262864;-7.58389663882554;-6.15004493389279;-5.37361245602369;4.59839195478708;-9.64914015959948;9.39597575459629;3.52368575055152;-1.62553398869932;-9.27141367923468;-7.81656253151596;-6.31225804798305;8.80325742997229;-5.96373555716127;0.147199262864888;-8.55569012928754;2.72068470250815
+-3.45444160047919;-3.02118091378361;2.46614801231772;0.279745501466095;-0.549177997745574;4.13749341852963;3.31298363395035;-2.90611634030938;-1.13101646769792;-3.65228141658008;-7.33881335705519;9.04890135396272;-3.22416743263602;-3.97284165024757;7.28987690061331;-8.64527582656592;9.8327271733433;-8.8733169157058;8.15113948658109;-1.28479420673102;5.81378670874983;8.15907931886613;-4.24974825698882;-7.73280487395823;-2.70050728227943;8.43875158112496;3.79422562196851;1.65303555782884;-4.1533130267635;-7.05723270308226;1.99189153499901;6.68018584139645;0.711789890192449;7.88870974909514;-1.96660622023046;7.43465032894164;-3.85417049285024;-7.20230542123318;6.86398940160871;-6.54390341136605;4.26609706133604;5.48916168510914;7.43011978454888;8.19896493572742;0.181111288256943;4.97137335129082;8.70282070245594;0.212359144352376;4.00053424295038;5.6763632548973
+-6.15133660845459;1.02186263073236;6.15947534795851;-4.33009461965412;9.15040839463472;-5.70805890485644;4.09793534781784;6.22995025012642;-8.3233016403392;3.66662106942385;-1.47846284788102;-6.9479204621166;-2.8762770909816;5.37258503958583;8.72115936130285;-2.94797374401242;-6.59947487991303;4.56825393252075;0.0444928416982293;-3.17647418938577;-2.70225362386554;-1.35037671308964;-5.81237059552222;-7.40872968453914;5.28651172760874;8.25758079532534;-0.761458249762654;-3.29966388642788;-7.07559139002115;-4.83024627435952;-4.66614903416485;-2.72781424224377;9.00248317979276;2.88579841144383;-2.42074457462877;8.62721321638674;-3.86734030675143;-8.04232738912106;6.33914357982576;3.69739590678364;0.54462849162519;4.83799585141242;-5.33279031980783;-3.16615222021937;-9.61449617519975;-6.49036905728281;7.9131946945563;-9.71907482482493;7.6806648960337;-4.28310630843043
+4.00735397823155;-3.53623060975224;-5.89975991751999;-8.5516019212082;-3.23074541985989;1.76440019160509;0.961063588038087;3.61831777729094;6.93281101994216;3.43995634000748;1.33956457022578;-3.26313689816743;0.559191438369453;-3.04376086220145;-1.3460869435221;-3.81480578333139;7.93403325602412;1.31473672110587;-4.6245998935774;4.9237128905952;7.41564477793872;7.74492192547768;-0.366384605877101;-2.04689065925777;-1.76678320858628;1.58001702278852;-2.14355442207307;6.64704934693873;-8.24592318385839;-1.60983437206596;6.87427286989987;7.66381112392992;-8.68369482457638;-8.60488536767662;-9.26863124128431;-2.07755739334971;5.44206429738551;7.1747568435967;-5.15986390411854;-2.1877652965486;2.39638868719339;-2.27123739663512;1.28395509440452;0.783659843727946;-4.65773993171751;4.08428370021284;-7.84401192795485;5.33471958711743;-6.43817460630089;0.986041408032179
+8.83325396105647;-9.83566348440945;-7.23657253663987;3.80275092553347;-7.31872680597007;-1.39065472409129;-9.75384030956775;6.7440623184666;9.45356335956603;-5.09692958556116;-7.02596968505532;1.30144567228854;3.51990150287747;-8.86977589689195;4.89032328594476;4.18366018682718;8.19704079069197;1.58380834385753;0.332736312411726;-1.88324408605695;-1.5346704563126;-1.47734647151083;4.88907438702881;-9.85626785550267;-5.63517595175654;-2.87998725194484;1.83566893916577;-3.12193839810789;5.8953476138413;7.29849769268185;0.189725873060524;5.55926604196429;-6.3330541132018;-9.21461439225823;-9.73868964239955;-3.49825104698539;1.04665959253907;9.48543031234294;1.58305872697383;-9.71569777932018;7.6867732219398;3.95505938213319;-3.52684511803091;8.54676174465567;6.34100080467761;0.98570269998163;7.97342596109957;-5.71468184702098;9.68896745238453;-4.89466839935631
+0.672246124595404;-1.48453511763364;9.20422844123095;-3.03589998278767;5.12909416574985;-5.72289548814297;-1.34595673065633;6.43533964175731;-5.88364278897643;9.58082197699696;5.25551766622812;-0.0025742594152689;8.93277161754668;-8.34639484062791;1.80900567211211;-0.658556199632585;9.45040756836534;0.649222205393016;3.17807751242071;-2.8040471766144;0.475360844284296;0.991908069700003;1.91525365691632;-2.99864396918565;-3.25425634626299;-4.89486262202263;0.39805153850466;-8.08801249600947;-4.95644022710621;8.43810020945966;-3.99248391855508;-0.67017633933574;-1.4660124015063;5.91610794886947;6.51989583391696;6.355194253847;5.69779612123966;9.07943447120488;-6.96073609869927;-5.80264110118151;-7.82543138135225;3.39310676325113;-3.25581192504615;-0.197024857625365;4.34864603448659;4.73846157547086;-6.58771425951272;-2.13905732147396;9.59588900208473;7.09341956302524
+7.58107749279588;3.63982708659023;7.94682327192277;8.65511973388493;-1.80020107887685;-8.86353590060025;-0.410251705907285;-6.25156533904374;7.49228127300739;0.291720223613083;-1.40225255861878;5.24093471467495;3.2388056255877;9.35618491377681;7.13469320442528;-2.11256563197821;2.66506948973984;2.42585891857743;-2.65157056972384;-2.25142591632903;-9.7589177871123;-1.46207853686064;7.78914960566908;-8.00710367504507;0.0879993615671992;-3.02862690296024;4.67298408970237;-4.26656357012689;-4.92751302197576;1.69091826304793;-2.4817012809217;6.87315701972693;3.87922691181302;0.695008668117225;5.99294395651668;8.06331487838179;9.90766021888703;7.3382741259411;-4.15873585734516;9.96236407663673;-7.8340743528679;5.14761667698622;-0.405810507945716;-9.76196404080838;-4.7261382220313;-5.02373667899519;-5.9931758698076;6.99181018397212;-2.50402072444558;0.717650055885315
+9.74050461314619;-6.03554190136492;-7.91061689145863;9.55278289504349;1.30419270601124;-0.222371271811426;0.438202661462128;-5.42422731872648;6.41767673194408;-7.9478767234832;4.64703406672925;5.62365466263145;6.97534032166004;1.55760694760829;7.78080401476473;7.54665846005082;-3.29416751395911;-1.30827293731272;6.92499411758035;-6.66808532550931;2.03736873343587;6.30820686928928;-0.845594028942287;2.58359028026462;-4.54435805324465;-7.58535352069885;2.21260562539101;-1.31204725243151;-3.69171060621738;5.784692754969;-8.44472392462194;-3.39541365858167;-1.47627397906035;3.59253119211644;-1.84993412811309;-8.71974320150912;2.71703039761633;2.85816551651806;-0.738424081355333;3.67838666308671;-5.0520585803315;-6.57176409848034;3.15003295429051;-1.77502567879856;-1.11495275981724;-0.2137091755867;9.02115891687572;-8.45922585576773;-3.22759276721627;3.66495259106159
+-0.963809005916119;0.332446284592152;-0.424088849686086;4.1910248901695;-5.71721099317074;8.55298625305295;-6.57420556992292;-5.04477551672608;-0.395305943675339;-3.65346211008728;-6.49775304365903;5.8396471105516;-8.93199569080025;-8.16322598140687;2.4867172120139;-2.72649912163615;-6.84059537947178;1.84159512165934;5.76419666875154;-6.46783592179418;-4.36516441404819;-9.15441046003252;-3.09866877738386;8.90153735876083;-3.0282928282395;-5.37652145605534;-3.52156199514866;1.75426101312041;-0.543876825831831;-6.46772329229861;9.85788447782397;-9.5675030676648;-4.59289375226945;-0.224606916308403;-0.944285970181227;5.74221878312528;3.29453577753156;9.18692180886865;5.56816820055246;9.43155385553837;2.73250436410308;3.212522524409;-4.22125696204603;0.751238148659468;-8.55142373126;7.72935832850635;-3.77345030661672;-9.9059846997261;-5.81246025394648;0.0550226494669914
+-9.83750865329057;-6.75566212739795;7.35276787541807;5.41200376115739;6.90440714359283;-3.80504971835762;-8.22416848037392;-5.63469466287643;6.05722258333117;6.02107546757907;9.30642815306783;8.58502996619791;-6.06204251758754;-7.92654625605792;-3.78712947946042;6.98026668746024;4.08223039470613;-6.50454617105424;8.20557251572609;-4.66814196202904;-9.5083824545145;-9.37921803910285;0.903021916747093;8.15888987854123;-2.9844108922407;-3.20388241671026;-3.14658686518669;3.45413522794843;-7.39788152743131;6.7496055457741;-4.3647347483784;8.74933863058686;4.53504576347768;3.09399851597846;-4.80296953581274;4.89087061025202;-0.843561650253832;3.39998902287334;0.310276309028268;-4.39462620299309;7.68135104328394;3.29146259464324;-2.30281976051629;1.75494364928454;8.11310010496527;-7.7073623938486;5.99727008491755;-4.94156718719751;-6.11469796393067;7.56009753327817
+3.44123572576791;4.14071591570973;-5.64473695121706;-1.13854938186705;-8.71971555519849;-3.10240144841373;-5.20975683815777;-6.45941623020917;-5.00602967105806;9.50895761605352;0.7786820596084;2.82543493900448;-6.22941717971116;-3.69184895418584;4.66685818973929;-2.72665885277092;6.06477081310004;-1.41921114176512;0.465673850849271;-6.09520417638123;-3.85083809960634;-6.61040975246578;2.67489212565124;-7.31187355238944;8.86950870510191;7.26803990546614;-6.21392598375678;5.04795501474291;-1.45798281300813;-3.93183385021985;-6.33775315247476;9.16967602446675;4.34239516034722;9.43996965885162;-0.988722261972725;1.88126740977168;-7.05838020890951;2.37899182830006;6.51584465522319;9.45845275651664;0.131198763847351;-7.71356721408665;7.53601674456149;-6.34791882243007;-6.85531780589372;0.815682453103364;-4.02297066990286;-8.38654296007007;-0.95435687340796;-9.76483441423625
+0.84526464343071;3.89179492369294;3.53452338837087;-1.02044679224491;-5.66052835434675;2.95387692283839;0.43044843710959;-5.14410382602364;-2.01011417899281;-2.70746933761984;-5.99080903455615;7.72365500219166;3.34418029058725;-1.31404872052372;2.02791671268642;-1.25798556022346;-9.27795349154621;-3.49014874082059;0.0461325608193874;-5.50638746004552;-3.94017679151148;5.91782537754625;-6.64940666873008;2.35801106784493;-6.21543854940683;-8.98759094066918;8.45224136020988;9.76900878362358;-1.98158158455044;-9.53261459711939;7.43367160670459;5.91043272521347;-9.84266332350671;6.58008144702762;5.91281076427549;0.448405374772847;0.324925309978426;-9.93832284584641;-9.94513901416212;5.49800807144493;2.36064803786576;3.54679064825177;-8.76806116197258;7.07305972930044;-3.978913850151;-6.75583509728312;6.99688302353024;-2.14868041686714;-9.46923668030649;-9.83330625575036
+-5.85500108078122;0.463563385419548;-1.65101959370077;6.33230119943619;-4.60886753164232;0.221633068285882;1.84922148939222;9.34178712777793;-6.34770014788955;3.79634737502784;1.89652511849999;-1.07521350029856;-6.05542838107795;-6.11244003288448;7.92879093438387;2.69975190516561;-2.75648928713053;5.66965250298381;0.223541064187884;5.09782412089407;7.09253320470452;8.07030969765037;8.50386802572757;4.3156718602404;9.45966539904475;1.26665619201958;6.07941235881299;8.95459773018956;-5.41993672959507;2.35338847152889;-7.36394508741796;4.83850894495845;6.24882419127971;3.66485083475709;8.53682290297002;-7.15516003780067;-1.94161557592452;1.59710324835032;7.09335811901838;-5.32654274720699;-2.17087759170681;-2.8187341010198;-2.527862386778;2.88914163596928;3.74434725381434;0.690650627948344;-4.33533595874906;6.42489056568593;8.15357240848243;8.26486410107464
+-7.60722906794399;3.58694082591683;-7.07694637589157;-9.22526464331895;1.25925150699914;6.88485514838248;7.92434043716639;-5.69990066345781;-8.70962245389819;9.38953314907849;-4.33115480933338;6.90089716110379;3.21560696233064;-4.38024623785168;-0.512402951717377;1.0985059896484;7.41011197678745;7.63306649401784;6.33220714051276;1.45998797379434;6.14860663656145;-6.52121302671731;9.59552004467696;-0.972729017958045;4.19765453319997;5.76753225177526;-3.27513075433671;4.71945026889443;4.92829197086394;6.14954872056842;8.49586667027324;8.11001389287412;-0.363893024623394;7.96487390063703;5.34838935360312;4.64559729676694;-8.77614463679492;-1.41073029953986;-0.330490935593843;-2.9042265098542;-8.71894991025329;2.85547721665353;-1.5813402319327;-4.54317546449602;9.51367505360395;-3.51313415449113;2.25199613720179;2.7842125389725;9.43134021013975;-7.80473307240754
+1.92395100370049;-8.93611112143844;-4.06091617420316;6.06776695232838;9.10878786817193;3.14165704417974;-1.02651773020625;-4.44037376902997;-0.640321499668062;-8.31950309686363;-6.36133561842144;-4.82511576265097;-1.7566239181906;6.11657340545207;3.60016554128379;3.65973438601941;2.45537996292114;-6.342180413194;0.213265577331185;-6.89521970227361;-1.61198620684445;3.89337158296257;-3.41350711416453;8.54283534921706;-2.45311813894659;-1.72633720561862;4.30204379372299;0.188188920728862;3.09258261695504;9.43667139392346;-5.9241593722254;2.88449699990451;5.18554989714175;7.84374577924609;8.77669028472155;8.58684713020921;6.06567447073758;-6.62299821618944;-5.53452834486961;8.26169884763658;3.93097185064107;-1.28312472719699;2.33026368543506;-9.01424609590322;-6.28484042361379;-1.12672682385892;3.32404897082597;2.12685634382069;3.53269481565803;8.47927087917924
+4.17765623424202;0.681213526986539;-1.72585264779627;6.01460637059063;1.46002802997828;-6.27489195205271;-8.80491291172802;1.15750160999596;-4.17502905707806;5.00575791113079;-9.59346296731383;7.96534090768546;3.74331522732973;-9.40215796697885;5.7397010596469;-1.07698030769825;-4.13576975930482;-2.83782399259508;8.2556071691215;5.35854370333254;-9.4766285829246;2.09140193648636;7.55599706433713;4.45900144055486;-2.3583302507177;-7.54078679252416;5.52224181126803;-0.862822839990258;-8.43945985659957;-7.22234750632197;-1.73031309153885;-0.158245586790144;5.24732520338148;4.01480949483812;-5.40815243963152;0.193815981037915;7.92814413551241;9.55093077383935;2.96679739840329;2.79801344033331;9.8794179270044;1.17210150230676;-3.40937833767384;8.94201069604605;-9.52477384358644;-6.94694932550192;5.7927365694195;3.929613083601;8.08833801653236;-4.05397207476199
+1.50266909971833;-6.68402771931142;4.88206738140434;-6.78644688334316;-5.87546578608453;-7.29050312191248;2.34352420084178;-3.10924975667149;-0.383342010900378;7.36909604165703;4.10755759570748;5.92460259329528;-3.13472704496235;-0.223634662106633;7.32076317537576;2.15690093114972;8.65061008837074;7.11373063270003;-0.771594098769128;1.99343077838421;9.24453770276159;3.42939872294664;-2.70780949853361;-1.64409202057868;-2.11503935977817;6.54480206314474;-6.08183293137699;0.785245005972683;1.66091259103268;8.63070397172123;8.9707274036482;3.3247988531366;6.31001752335578;-2.4568994436413;-8.51578925270587;7.59546167682856;-5.70922889281064;-2.38869517575949;-7.93713907711208;9.66123735066503;-7.55591842345893;-5.01343458890915;-6.64019245654345;-8.28682831022888;-4.35490884352475;4.42233108915389;3.56182926800102;-6.73390297219157;-3.68345078546554;2.04183448571712
+1.85045029036701;8.41795700602233;-4.38453448936343;0.404267385601997;2.25592006929219;2.2671782085672;3.04789711721241;0.832428517751396;-4.22513405326754;0.562675539404154;0.0243629887700081;4.10584938712418;-7.67324351239949;-2.07135136704892;5.77150504104793;1.8892207974568;7.24780068732798;3.15266153775156;4.8702714825049;-2.25387635175139;9.97839164920151;4.41693349741399;-7.13475835043937;8.84416682645679;7.55167020484805;-0.206361981108785;-7.02366723213345;-6.69259991962463;3.17941514309496;-8.60028730239719;1.36627619620413;-5.80737562850118;9.84935480635613;4.45783339906484;1.15908470004797;-9.51833435334265;5.73097701184452;-6.86409590300173;-0.751708676107228;9.26046326290816;3.65344792604446;-8.06970803067088;-0.262640006840229;-6.90483701881021;-9.95195472147316;-4.8840561741963;-1.0324636194855;-4.64805215131491;5.25561080314219;-5.22005567792803
+-5.18959170207381;-8.00200340338051;-5.782440751791;-8.7190187908709;0.897424020804465;9.29450007155538;9.0950888954103;-0.752067659050226;-0.219086459837854;0.637031705118716;3.10674699489027;1.16765648592263;3.02043490577489;-1.47443274501711;9.28429604973644;5.83788923919201;2.60086404625326;0.731565016321838;-4.59669589065015;-1.16172437090427;-8.37653155904263;8.66806539241225;3.15868415869772;-0.017845006659627;9.74600434303284;3.56972530018538;4.84454223420471;7.52258140593767;2.10704806260765;-8.32379998639226;-1.65953281801194;-6.82760705705732;-2.29787165299058;4.5861299848184;7.30691695120186;-8.22228358592838;-3.00306745804846;-9.5769504411146;7.87716295570135;0.0821259245276451;7.51039915252477;6.66292406618595;0.164906550198793;7.94305197428912;6.42295662779361;8.58592995908111;3.62322201486677;0.796448197215796;5.52108026575297;6.2937538465485
+-8.81974706891924;2.19718046020716;9.24693157430738;7.43198630400002;-0.0070585822686553;-7.90271568112075;7.19220899045467;1.93529481533915;-2.27925521321595;-6.03206246159971;-9.4557872088626;-4.66071699280292;-6.28529662266374;4.31927165947855;9.53987234737724;7.2094347095117;1.39150737319142;-7.00258451048285;8.77816942986101;5.10619441047311;4.99679563567042;-6.95552181452513;7.1223528124392;-4.5382622256875;4.82165154535323;-6.57586624380201;6.30249478854239;5.87780857924372;-1.33615613449365;-3.62924947869033;7.70780337974429;5.73721621651202;3.41107412241399;0.329789277166128;7.61856465600431;9.98581001535058;-4.58937323186547;0.330518414266407;1.56040953937918;6.16061435546726;-0.365296490490437;0.653513846918941;-2.51838797703385;-9.05502039939165;-6.95281335618347;7.48355286195874;2.80147068668157;8.10969306156039;2.50209617428482;-0.314636221155524
+8.51704343687743;3.18952542729676;-2.5737387035042;8.19664612878114;9.50265965424478;-4.66975776012987;2.02127442229539;2.92558474931866;-7.13535660877824;7.3693613987416;9.00772011373192;7.75773896370083;-2.7115570846945;-1.04122353252023;-8.49771040957421;-3.55294010136276;8.62496358342469;7.39094171673059;2.02777643222362;-2.18160981778055;-1.68516180478036;0.825223564170301;-2.44130352977663;8.89385398477316;7.08928042557091;7.44594035670161;-8.95981184672564;-6.62544039078057;-3.61116039566696;-8.75607748050243;8.19705807603896;-5.36208814010024;-6.56102739274502;7.90033573750407;9.23813346307725;6.20146081782877;-0.169275104999542;-8.26386373490095;-3.80014259368181;8.04532123263925;-6.46702378522605;2.65568294562399;-4.86903317738324;3.86243483051658;3.83517004549503;2.96145016793162;-6.9912554230541;3.51329834666103;7.27250324562192;-5.74022637214512
+4.65975082945079;1.03103025816381;-8.26204331126064;-8.9580305526033;-6.23447274323553;3.59147435519844;-0.311128282919526;-9.19148910325021;0.4020811105147;5.93348633032292;9.63767777197063;-3.33142482209951;-1.25190077349544;-9.61523605044931;-0.807232861407101;2.29587906971574;-5.9278377937153;-3.68276782799512;-4.01288039050996;7.89671184495091;-6.30188455339521;-9.66768936254084;-3.5317748459056;-7.89895187597722;7.85148268099874;9.36085755005479;6.77370212506503;5.46805324498564;4.79103818535805;-6.31859075278044;5.2713986299932;-4.71766031812876;9.03056125622243;2.71243603900075;1.39329225756228;1.77125933114439;-0.586289810016751;-9.95136842131615;7.49903141986579;9.93787524756044;2.58628382813185;8.1236878130585;6.77275944966823;1.18944823276252;4.28065205924213;-6.3498562714085;8.94444526638836;-4.41896675154567;-9.38277923036367;6.92051232326776
+-6.13384060095996;8.13119222875684;-0.272525665350258;-9.4768043095246;-5.66589108202606;5.35472322721034;-3.71608731802553;9.9971769284457;0.407986044883728;3.89341159258038;3.84163813199848;-7.22505727317184;-3.24525727424771;6.99810151942074;4.65089433360845;-1.21951038949192;-8.14013602677733;-6.2566306674853;3.34774103015661;9.62394345086068;3.26734184287488;-2.37575739622116;-2.48254535254091;-8.70883881114423;-8.47829936537892;0.418646186590195;-6.72554918564856;3.49138301797211;6.78180746734142;-0.518813817761838;7.18784515745938;-9.41955767106265;-5.6071297172457;3.80525540560484;-3.05630695074797;-0.440179533325136;3.19162144791335;-3.78614617977291;-6.77419588435441;1.35647838935256;0.273657068610191;7.27078906726092;9.83330824878067;-9.66122898738831;1.12873468548059;9.35824740212411;2.01226289384067;7.1316901827231;7.41189812775701;9.42752887494862
+2.79267411679029;-1.01594476494938;-5.78517741058022;-3.09829688165337;-5.8479672530666;-4.42419525235891;6.65427856147289;-2.84739703405648;-8.40753957163543;-6.40591039787978;-0.291606555692852;4.64201013557613;6.91960307769477;-6.36128766927868;-8.38057368062437;9.75526238325983;1.25307531096041;-7.9057002114132;-4.45560533553362;0.669833766296506;-5.05533131305128;9.5676316972822;9.81677890289575;-2.49186496715993;-3.88401562348008;2.62208347674459;-6.25844160094857;3.94112636335194;3.98182791657746;6.11863765865564;3.88760273810476;5.7973565440625;-1.2392918439582;9.76569528691471;-7.58010524325073;8.1567541975528;2.95674892608076;-5.70833620615304;4.09020032268018;-5.20442891400307;-1.10279457177967;5.12779886834323;1.92722450010478;2.24023687653244;0.383118377067149;0.634263386018574;-5.44806733727455;8.2748916419223;-8.63647751044482;-6.81667800061405
+-8.72725997120142;-8.18899086676538;-2.73534313309938;-2.35729963053018;-8.63047481980175;-6.32850039284676;7.04079327639192;-8.11112015973777;-9.80259967967868;2.23644045647234;-7.58839980699122;-1.87694161199033;-7.92501993943006;-1.187744718045;7.42776933591813;0.137573867104948;-2.45055417530239;-3.30027721822262;9.90031794644892;0.424199686385691;2.72242859937251;-2.89816075470299;-0.341046922840178;9.08928358927369;-5.84731702692807;2.14314771350473;2.53528874367476;9.04902327805758;8.72626249678433;-6.76231524441391;-4.92372249718755;1.42553021200001;2.50001019798219;-3.2188491569832;6.08286809641868;1.44819071050733;9.86128674354404;-4.71609472762793;-5.34553851466626;9.39166031777859;-4.79240440763533;-5.06881497334689;3.27165914233774;-4.14738099090755;-8.64353818353266;8.58391440473497;6.48277472238988;7.06657837610692;4.98944866470993;5.19586625508964
+7.8009919822216;-7.93565833475441;8.97411309648305;-6.44773517269641;-1.42380595207214;5.55587096139789;-6.16541659459472;8.68498994968832;-1.19295032229275;-4.55470788292587;2.55838172510266;0.688966265879571;-7.87745343986899;6.38354365248233;-8.49323194939643;7.41709972731769;-2.59713067673147;2.03046775888652;2.84966154489666;5.00215766951442;3.79994398448616;1.9352199928835;-9.65271881781518;9.29075065068901;6.74368037842214;-5.39394814986736;7.9099217010662;4.52505598776042;-9.61519579868764;0.377052640542388;-4.03090025298297;-7.95966167934239;-7.57568609900773;5.31749034766108;-2.83389186020941;1.63047649431974;-3.40090257115662;8.91909937374294;-3.08372204191983;-4.96948155574501;1.8514222279191;4.8722212202847;0.192521275021136;2.41370613221079;6.10297732055187;-3.82881849072874;-2.79055689461529;-2.71612196229398;8.37584989611059;-4.55273206345737
+7.81438383739442;-1.51372209191322;-1.85057146009058;-2.17109142336994;-5.21311559248716;-8.86271759867668;-9.87544095143676;6.87338822055608;0.897539630532265;5.6858438719064;-3.387759947218;-8.16799917258322;-7.23972332663834;9.76083621382713;-3.6143463710323;-0.688498066738248;7.23584584426135;-1.51920504402369;-2.38093832042068;2.10830109659582;7.08069528453052;-8.39384085033089;8.21721104905009;1.29004828166217;-8.51232888642699;-9.82787608169019;-5.34497109241784;4.77480452042073;-1.21913618408144;-0.914144585840404;1.18129659444094;0.279922229237854;-7.67154887318611;5.02575613092631;-4.56889046356082;-9.75793425925076;-0.509182633832097;-7.00469987932593;-2.98161458689719;3.10473163146526;-4.85503940377384;5.24327093269676;-2.77186117134988;-3.58168067410588;8.82561979349703;-5.07769010961056;9.62740895338356;-5.3836271725595;3.53423002641648;7.82088670879602
+-0.451365909539163;6.84112021699548;-4.42354371305555;-5.29241361655295;6.80389895569533;-7.77861976064742;1.49357237387449;-2.35339065082371;-7.81721887178719;-2.40414031315595;-0.395754659548402;-5.79165300354362;-1.2903947243467;2.65687917359173;5.50563386641443;0.834196573123336;-4.80319577269256;-1.22392548713833;4.77754366584122;5.34333050716668;-3.77798126079142;2.89589047431946;-7.44961774908006;-8.14636585302651;0.748985526151955;7.74486270733178;-5.74232000857592;6.80986227467656;-1.6192386765033;6.51530107483268;-4.02350929565728;-5.68768531549722;9.5673744706437;7.72254023700953;-1.31038736552;-5.51889081485569;0.258864741772413;9.80441966094077;1.45621500909328;5.43190744239837;-2.53882837016135;5.09262776002288;7.63310595415533;-7.48650831636041;-6.62117465864867;0.727485627867281;-7.89836632553488;9.20172462705523;-4.81543452944607;-1.15785500966012
+-6.2114098854363;-2.05818870104849;1.26142825931311;2.27071457542479;6.90742480568588;-1.47783466614783;-0.886977477930486;9.67493838630617;-7.12415785528719;5.09112253319472;-7.5209613610059;-4.35205768793821;-3.99539604317397;7.20059189945459;-7.4933135509491;4.50711098499596;-0.366704650223255;7.88592758122832;-1.38953154906631;9.17645469307899;4.1108326613903;9.34107566252351;-1.75066862255335;0.926856114529073;7.84402969293296;-4.27303683012724;-2.0296392031014;-4.26561733242124;-0.101424162276089;0.301307002082467;-4.11309017334133;-6.19143989868462;2.54318545106798;4.1658333921805;8.50724295247346;-0.172696216031909;-2.62687825132161;1.66109876707196;-4.0378973307088;-9.39770493190736;7.44380624033511;9.4088419014588;2.69424568396062;-0.772791355848312;-7.02497810591012;-6.50331583805382;2.65069988090545;-0.162127520889044;-7.0220706006512;6.15741219837219
+1.47581235971302;-8.58117277733982;-2.26166220381856;0.609984272159636;-7.92858179658651;1.93755561951548;-3.58407065272331;1.55775965191424;9.8531856527552;2.33564816880971;-9.43946417421103;-1.09342594631016;8.38989158160985;-9.1350278025493;8.54453065432608;4.81787087861449;1.78355762269348;4.57580386195332;-4.28857985883951;-3.95539185963571;-8.3129100035876;-3.67847084999084;7.20402860082686;-4.40878183115274;-8.06847846135497;2.7357083838433;2.255704626441;-2.08080715499818;0.344708785414696;2.26096059195697;7.83029372338206;-6.30897125229239;-4.41080940887332;-1.40998639166355;5.86266838945448;-4.14825394749641;5.34136097412556;-6.04138418566436;6.37592972721905;-5.38652249146253;7.28743731509894;-1.89080076757818;1.01032626349479;7.00882732402533;8.27342257834971;-4.62677452713251;-5.90399437583983;5.29062979854643;-3.221456236206;4.68538506422192
+7.39098041318357;0.147948488593102;-7.35606583300978;2.49446460977197;-7.52666544169188;-9.27664077840745;4.7007552254945;4.34336939360946;-1.72822924330831;5.16811575740576;-3.76853199210018;-4.37949820887297;-1.58681749366224;0.101681277155876;-1.67935087345541;-1.89109502825886;-8.98319505620748;-1.92560088355094;-6.30671970546246;2.04789850860834;7.65073381830007;-7.0118156587705;-1.53151411097497;2.05661627463996;3.38716062251478;4.15388052817434;2.79965947847813;5.82789617124945;-1.43108887132257;-2.92246665339917;-3.44201811123639;-6.05611854698509;-1.91091530956328;-9.46179006248713;-7.5943543529138;-3.55741284321994;-1.92405510228127;-4.97213911265135;-0.826212195679545;-9.89368190523237;8.96105155348778;-9.34202960692346;-7.76933191809803;-6.59244473092258;2.57233188487589;-2.15875256340951;9.58001294638962;-0.259908880107105;-1.67883233167231;-0.21467815618962
+-3.16336187068373;1.62654326763004;0.947442636825144;-1.7925678845495;-8.76486902590841;7.69932293798774;-8.6972370184958;-6.81938529014587;6.98424716480076;-4.89487716462463;-7.26915988605469;-5.00579615589231;-5.22863074671477;-4.62469973601401;7.51047891099006;-1.58695439808071;-3.65858609322459;-8.1411550892517;0.484010144136846;9.87428206950426;3.1285013910383;-7.25425850134343;-0.903964345343411;-0.355818066745996;6.25197899062186;8.63930428400636;1.08609079848975;-5.6699550151825;2.84639290999621;-3.46992793492973;9.39905427861959;2.59550892747939;-2.2769221663475;5.0904923863709;6.33109448477626;4.38140356447548;-8.60805563628674;-9.44608063437045;-1.60022069234401;-9.81345624662936;-6.66604525409639;-9.6949797263369;8.45351451542228;-5.30030961148441;3.07801845483482;-1.10529175028205;-7.84050490707159;7.07970918156207;0.638091312721372;6.66905846446753
+4.09888526424766;-3.56986604165286;-6.8973425263539;-1.93663124926388;-3.01576106343418;-4.52942948788404;5.95255143009126;2.88664548657835;4.7064278787002;-2.89961637463421;-0.211292831227183;-4.94099374860525;7.58552699349821;7.33137961477041;3.36233808659017;-4.48710202705115;-1.48341205902398;-7.49758848454803;6.0407235333696;3.60934171359986;3.63612078130245;3.09698771685362;3.31156139262021;-7.71326753310859;-5.65267841797322;4.24865530338138;-1.1023169523105;6.88307916279882;8.45713219605386;-4.54224174376577;6.47032823879272;5.75250579509884;-6.10011816956103;-5.30558553989977;-2.34932901803404;4.64775345288217;0.41416872292757;2.4032420059666;-6.49799944832921;2.95014068018645;2.68165802117437;0.5729043437168;-5.36271258257329;2.30898962821811;1.90924686845392;7.17011976987123;-7.43743755389005;1.6490397695452;1.06161612085998;0.0538744824007154
+6.0839369893074;5.61524637509137;-0.89653539005667;-3.11895254533738;1.19989593978971;-2.75617298204452;0.973347239196301;9.93798133451492;8.53254863526672;-9.30103254970163;-8.04326716810465;0.926691102795303;2.72771408315748;-8.04820161312819;-0.953182382509112;-2.88888331968337;-6.33461984805763;-6.97035817429423;4.61237106472254;7.21373147331178;8.03960905410349;-1.42310949973762;-7.73285681847483;6.86140072066337;7.61489154305309;-1.49463433772326;5.63041957095265;-9.29164198227227;7.89657421875745;7.68332990352064;-5.74469934217632;3.02337015513331;5.47636862378567;-0.970255574211478;7.27351123932749;0.770066482946277;-5.73370795231313;9.66454084962606;-3.39752193074673;4.35311884619296;0.125803546980023;-8.11773095745593;3.95727531053126;-8.32146618980914;-5.26591466274112;8.16513730678707;0.157209546305239;-8.40115211438388;-3.18315920885652;-5.44761116616428
+9.95185717009008;1.55671220738441;5.14675101730973;-1.65729726664722;-9.34939151629806;-4.48380290064961;-6.90212300978601;0.395124843344092;-1.82399025186896;-0.691502313129604;-1.01792095694691;-0.258091478608549;1.22356224805117;4.1590531822294;3.84155094623566;2.72463590838015;-0.460569215938449;4.49861680157483;-0.487801469862461;0.331342676654458;-5.23522461298853;-8.17660077475011;6.6155453491956;4.65086958836764;6.6401273291558;-2.00490089599043;-6.37295639142394;-4.33077064342797;-3.39194209314883;5.0322887673974;-6.27708632964641;5.49373329151422;5.34216118976474;6.33156683761626;-0.0637655286118388;8.85932490695268;3.94386449363083;9.43032539915293;-3.05782509967685;2.64970297459513;-2.57805183995515;-9.06334536150098;9.7976361727342;-5.54664642550051;-8.61343830823898;-5.24144548457116;-3.58151400927454;-8.79899716470391;-2.49734652228653;5.08863584604114
+2.51224713865668;2.71042830776423;-5.60679321177304;7.52793726976961;9.73534176126122;3.92891740892082;-5.16159719321877;-0.0808334164321423;-4.12614306434989;-3.74914792366326;-0.551091968081892;-5.26194266509265;-1.5463823126629;5.82562402822077;-6.85637219808996;-8.74188589397818;4.61106388829648;9.83403372578323;4.2319526290521;4.34416880831122;5.18767099361867;-6.5366345923394;7.6035189954564;-3.53591633029282;-7.1178061561659;3.70200027711689;-4.48724326211959;-4.74528391845524;-6.86482488643378;9.11424956750125;-2.52892232034355;2.28784689214081;-2.03524413518608;4.84027809929103;-3.11763348057866;9.52291187830269;3.91109101474285;-0.647191223688424;-9.2794809024781;-0.294842035509646;-0.156894330866635;0.29715531039983;4.64229765813798;-7.78258007019758;0.444478900171816;-3.31753952428699;7.50800064764917;-4.2641036119312;-6.15873030386865;-7.68274993635714
+-0.109479022212327;-1.21531151235104;8.23657590895891;6.59295597113669;-3.79068135283887;-7.23089812789112;4.40600077155977;8.72878727968782;9.90224372129887;3.97586241364479;-4.25852562766522;4.39236808568239;0.616597002372146;6.22378355823457;8.88427547644824;-2.80867631547153;4.73675493616611;-4.74116060882807;0.192459751851857;8.18694994784892;-2.30717644561082;8.29374376218766;1.56528318300843;2.7891603205353;-5.28837394434959;-7.24978073034436;5.237772683613;-2.453772732988;7.77082312386483;-1.85508615802974;-3.91561780590564;-3.23756434489042;2.64155907090753;-4.57756157498807;1.98554937727749;9.43188600242138;5.2329311426729;8.26612012460828;-1.76650998182595;9.77208578493446;5.40630758740008;2.85776939243078;0.531025142408907;-0.28930754866451;-2.36260386649519;4.69780663959682;0.575258089229465;-4.47918040677905;-7.68073175568134;-7.12887870147824
+-3.11267299111933;0.238647819496691;2.45382979046553;5.24692412000149;-7.75672961492091;-4.75825195666403;-2.43095519952476;-7.16670008841902;1.57825658563524;6.61444145254791;2.54727041348815;3.42905248980969;-6.74455556087196;7.77155560441315;2.99588919151574;-1.96105618029833;4.60672521963716;-5.89665849227458;6.09580939169973;0.311477179639041;-0.0800472870469093;-8.36977205239236;-8.43018452636898;0.324460598640144;0.366602991707623;2.07316306885332;-2.93568024411798;5.78491386026144;-9.37272252049297;7.77472713030875;4.89390603266656;9.78222596924752;1.20664063375443;0.946346130222082;7.1952917939052;4.60542751476169;7.61530984658748;-5.08534101769328;-6.20860281400383;-9.41647815518081;-1.75581166055053;5.25427071377635;-0.418966002762318;8.18865921813995;-1.55370619613677;3.83608406875283;-5.76131397392601;-6.91212515812367;-1.0817532800138;1.05462166946381
+8.13120370730758;-0.651712701655924;7.43608376942575;-0.827058176510036;-5.60054781846702;-3.79131905268878;9.51511086430401;9.93227843660861;7.16539784800261;-8.44985309522599;-6.9329643715173;-6.26833967398852;-0.225079208612442;-3.40861015021801;-7.06208189018071;-8.71044587809592;-5.38991645444185;-5.61230098363012;5.8555960888043;-9.0392720606178;2.12033218238503;9.66834955383092;2.62071629986167;-1.87661712989211;6.78168048616499;2.14443852659315;-8.54815276805311;-1.62045371718705;-1.29917486105114;7.24523551296443;7.38269018474966;-2.20076059922576;6.1204277863726;-9.99591069296002;-7.22731178626418;-7.45814816094935;-7.28816821239889;2.27323542349041;-3.50709880236536;-0.466189724393189;5.8290328271687;-2.01490544714034;-9.64238869491965;3.976438655518;1.45515321753919;-9.4817804871127;9.70943210180849;-2.21358876209706;8.5804074909538;9.59443589672446
diff --git a/pkg/man/claws.Rd b/pkg/man/claws.Rd
new file mode 100644 (file)
index 0000000..c01ac7c
--- /dev/null
@@ -0,0 +1,127 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/main.R
+\name{claws}
+\alias{claws}
+\title{CLAWS: CLustering with wAvelets and Wer distanceS}
+\usage{
+claws(getSeries, K1, K2, wf, ctype, WER = "end", random = TRUE,
+  ntasks = 1, ncores_tasks = 1, ncores_clust = 4,
+  nb_series_per_chunk = 50 * K1, min_series_per_chunk = 5 * K1, sep = ",",
+  nbytes = 4, endian = .Platform$endian, verbose = FALSE, parll = TRUE)
+}
+\arguments{
+\item{getSeries}{Access to the (time-)series, which can be of one of the three
+following types:
+\itemize{
+  \item [big.]matrix: each line contains all the values for one time-serie, ordered by time
+  \item connection: any R connection object providing lines as described above
+  \item character: name of a CSV file containing series in rows (no header)
+  \item function: a custom way to retrieve the curves; it has only one argument:
+    the indices of the series to be retrieved. See examples
+}}
+
+\item{K1}{Number of super-consumers to be found after stage 1 (K1 << N)}
+
+\item{K2}{Number of clusters to be found after stage 2 (K2 << K1)}
+
+\item{wf}{Wavelet transform filter; see ?wavelets::wt.filter}
+
+\item{ctype}{Type of contribution: "relative" or "absolute" (or any prefix)}
+
+\item{WER}{"end" to apply stage 2 after stage 1 has fully iterated, or "mix" to apply stage 2
+at the end of each task}
+
+\item{random}{TRUE (default) for random chunks repartition}
+
+\item{ntasks}{Number of tasks (parallel iterations to obtain K1 medoids); default: 1.
+Note: ntasks << N, so that N is "roughly divisible" by N (number of series)}
+
+\item{ncores_tasks}{"MPI" number of parallel tasks (1 to disable: sequential tasks)}
+
+\item{ncores_clust}{"OpenMP" number of parallel clusterings in one task}
+
+\item{nb_series_per_chunk}{(~Maximum) number of series in each group, inside a task}
+
+\item{min_series_per_chunk}{Minimum number of series in each group}
+
+\item{sep}{Separator in CSV input file (if any provided)}
+
+\item{nbytes}{Number of bytes to serialize a floating-point number; 4 or 8}
+
+\item{endian}{Endianness to use for (de)serialization. Use "little" or "big" for portability}
+
+\item{verbose}{Level of verbosity (0/FALSE for nothing or 1/TRUE for all; devel stage)}
+
+\item{parll}{TRUE to fully parallelize; otherwise run sequentially (debug, comparison)}
+}
+\value{
+A big.matrix of the final medoids curves (K2) in rows
+}
+\description{
+Groups electricity power curves (or any series of similar nature) by applying PAM
+algorithm in parallel to chunks of size \code{nb_series_per_chunk}. Input series
+must be sampled on the same time grid, no missing values.
+}
+\examples{
+\dontrun{
+# WER distances computations are a bit too long for CRAN (for now)
+
+# Random series around cos(x,2x,3x)/sin(x,2x,3x)
+x = seq(0,500,0.05)
+L = length(x) #10001
+ref_series = matrix( c(cos(x), cos(2*x), cos(3*x), sin(x), sin(2*x), sin(3*x)),
+  byrow=TRUE, ncol=L )
+library(wmtsa)
+series = do.call( rbind, lapply( 1:6, function(i)
+  do.call(rbind, wmtsa::wavBootstrap(ref_series[i,], n.realization=400)) ) )
+#dim(series) #c(2400,10001)
+medoids_ascii = claws(series, K1=60, K2=6, "d8", "rel", nb_series_per_chunk=500)
+
+# Same example, from CSV file
+csv_file = "/tmp/epclust_series.csv"
+write.table(series, csv_file, sep=",", row.names=FALSE, col.names=FALSE)
+medoids_csv = claws(csv_file, K1=60, K2=6, "d8", "rel", nb_series_per_chunk=500)
+
+# Same example, from binary file
+bin_file = "/tmp/epclust_series.bin"
+nbytes = 8
+endian = "little"
+epclust::binarize(csv_file, bin_file, 500, nbytes, endian)
+getSeries = function(indices) getDataInFile(indices, bin_file, nbytes, endian)
+medoids_bin = claws(getSeries, K1=60, K2=6, "d8", "rel", nb_series_per_chunk=500)
+unlink(csv_file)
+unlink(bin_file)
+
+# Same example, from SQLite database
+library(DBI)
+series_db <- dbConnect(RSQLite::SQLite(), "file::memory:")
+# Prepare data.frame in DB-format
+n = nrow(series)
+time_values = data.frame(
+  id = rep(1:n,each=L),
+  time = rep( as.POSIXct(1800*(0:n),"GMT",origin="2001-01-01"), L ),
+  value = as.double(t(series)) )
+dbWriteTable(series_db, "times_values", times_values)
+# Fill associative array, map index to identifier
+indexToID_inDB <- as.character(
+  dbGetQuery(series_db, 'SELECT DISTINCT id FROM time_values')[,"id"] )
+getSeries = function(indices) {
+  request = "SELECT id,value FROM times_values WHERE id in ("
+  for (i in indices)
+    request = paste(request, i, ",", sep="")
+  request = paste(request, ")", sep="")
+  df_series = dbGetQuery(series_db, request)
+  # Assume that all series share same length at this stage
+  ts_length = sum(df_series[,"id"] == df_series[1,"id"])
+  t( as.matrix(df_series[,"value"], nrow=ts_length) )
+}
+medoids_db = claws(getSeries, K1=60, K2=6, "d8", "rel", nb_series_per_chunk=500)
+dbDisconnect(series_db)
+
+# All computed medoids should be the same:
+digest::sha1(medoids_ascii)
+digest::sha1(medoids_csv)
+digest::sha1(medoids_bin)
+digest::sha1(medoids_db)
+}
+}
diff --git a/pkg/man/clustering.Rd b/pkg/man/clustering.Rd
new file mode 100644 (file)
index 0000000..1768cab
--- /dev/null
@@ -0,0 +1,69 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/clustering.R
+\name{clustering}
+\alias{clustering}
+\alias{clusteringTask1}
+\alias{computeClusters1}
+\alias{computeClusters2}
+\alias{clusteringTask1}
+\alias{clusteringTask2}
+\alias{computeClusters1}
+\alias{computeClusters2}
+\title{Two-stage clustering, withing one task (see \code{claws()})}
+\usage{
+clusteringTask1(indices, getContribs, K1, nb_series_per_chunk,
+  ncores_clust = 1, verbose = FALSE, parll = TRUE)
+
+clusteringTask2(medoids, K2, getRefSeries, nb_ref_curves, nb_series_per_chunk,
+  ncores_clust = 1, verbose = FALSE, parll = TRUE)
+
+computeClusters1(contribs, K1, verbose = FALSE)
+
+computeClusters2(distances, K2, verbose = FALSE)
+}
+\arguments{
+\item{indices}{Range of series indices to cluster in parallel (initial data)}
+
+\item{getContribs}{Function to retrieve contributions from initial series indices:
+\code{getContribs(indices)} outpus a contributions matrix}
+
+\item{K1}{Number of super-consumers to be found after stage 1 (K1 << N)}
+
+\item{nb_series_per_chunk}{(~Maximum) number of series in each group, inside a task}
+
+\item{ncores_clust}{"OpenMP" number of parallel clusterings in one task}
+
+\item{verbose}{Level of verbosity (0/FALSE for nothing or 1/TRUE for all; devel stage)}
+
+\item{parll}{TRUE to fully parallelize; otherwise run sequentially (debug, comparison)}
+
+\item{medoids}{big.matrix of medoids (curves of same length as initial series)}
+
+\item{K2}{Number of clusters to be found after stage 2 (K2 << K1)}
+
+\item{getRefSeries}{Function to retrieve initial series (e.g. in stage 2 after series
+have been replaced by stage-1 medoids)}
+
+\item{nb_ref_curves}{How many reference series? (This number is known at this stage)}
+
+\item{contribs}{matrix of contributions (e.g. output of \code{curvesToContribs()})}
+
+\item{distances}{matrix of K1 x K1 (WER) distances between synchrones}
+}
+\value{
+For \code{clusteringTask1()} and \code{computeClusters1()}, the indices of the
+  computed (K1) medoids. Indices are irrelevant for stage 2 clustering, thus
+  \code{computeClusters2()} outputs a big.matrix of medoids
+  (of size limited by nb_series_per_chunk)
+}
+\description{
+\code{clusteringTask1()} runs one full stage-1 task, which consists in
+  iterated stage 1 clustering (on nb_curves / ntasks energy contributions, computed
+  through discrete wavelets coefficients).
+  \code{clusteringTask2()} runs a full stage-2 task, which consists in synchrones
+  and then WER distances computations, before applying the clustering algorithm.
+  \code{computeClusters1()} and \code{computeClusters2()} correspond to the atomic
+  clustering procedures respectively for stage 1 and 2. The former applies the
+  clustering algorithm (PAM) on a contributions matrix, while the latter clusters
+  a chunk of series inside one task (~max nb_series_per_chunk)
+}
diff --git a/pkg/man/computeMedoidsIndices.Rd b/pkg/man/computeMedoidsIndices.Rd
new file mode 100644 (file)
index 0000000..d78ccfd
--- /dev/null
@@ -0,0 +1,19 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/RcppExports.R
+\name{computeMedoidsIndices}
+\alias{computeMedoidsIndices}
+\title{computeMedoidsIndices}
+\usage{
+computeMedoidsIndices(pMedoids, ref_series)
+}
+\arguments{
+\item{pMedoids}{External pointer}
+
+\item{ref_series}{reference series}
+}
+\value{
+A map serie number -> medoid index
+}
+\description{
+Compute medoids indices
+}
diff --git a/pkg/man/computeSynchrones.Rd b/pkg/man/computeSynchrones.Rd
new file mode 100644 (file)
index 0000000..7cdbb08
--- /dev/null
@@ -0,0 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/clustering.R
+\name{computeSynchrones}
+\alias{computeSynchrones}
+\title{computeSynchrones}
+\usage{
+computeSynchrones(medoids, getRefSeries, nb_ref_curves, nb_series_per_chunk,
+  ncores_clust = 1, verbose = FALSE, parll = TRUE)
+}
+\arguments{
+\item{medoids}{big.matrix of medoids (curves of same length as initial series)}
+
+\item{getRefSeries}{Function to retrieve initial series (e.g. in stage 2 after series
+have been replaced by stage-1 medoids)}
+
+\item{nb_ref_curves}{How many reference series? (This number is known at this stage)}
+
+\item{nb_series_per_chunk}{(~Maximum) number of series in each group, inside a task}
+
+\item{ncores_clust}{"OpenMP" number of parallel clusterings in one task}
+
+\item{verbose}{Level of verbosity (0/FALSE for nothing or 1/TRUE for all; devel stage)}
+
+\item{parll}{TRUE to fully parallelize; otherwise run sequentially (debug, comparison)}
+}
+\value{
+A big.matrix of size K1 x L where L = data_length
+}
+\description{
+Compute the synchrones curves (sum of clusters elements) from a matrix of medoids,
+using L2 distances.
+}
diff --git a/pkg/man/computeWerDists.Rd b/pkg/man/computeWerDists.Rd
new file mode 100644 (file)
index 0000000..cc90a74
--- /dev/null
@@ -0,0 +1,26 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/clustering.R
+\name{computeWerDists}
+\alias{computeWerDists}
+\title{computeWerDists}
+\usage{
+computeWerDists(synchrones, ncores_clust = 1, verbose = FALSE,
+  parll = TRUE)
+}
+\arguments{
+\item{synchrones}{A big.matrix of synchrones, in rows. The series have same length
+as the series in the initial dataset}
+
+\item{ncores_clust}{"OpenMP" number of parallel clusterings in one task}
+
+\item{verbose}{Level of verbosity (0/FALSE for nothing or 1/TRUE for all; devel stage)}
+
+\item{parll}{TRUE to fully parallelize; otherwise run sequentially (debug, comparison)}
+}
+\value{
+A matrix of size K1 x K1
+}
+\description{
+Compute the WER distances between the synchrones curves (in rows), which are
+returned (e.g.) by \code{computeSynchrones()}
+}
diff --git a/pkg/man/curvesToContribs.Rd b/pkg/man/curvesToContribs.Rd
new file mode 100644 (file)
index 0000000..caa2532
--- /dev/null
@@ -0,0 +1,22 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/main.R
+\name{curvesToContribs}
+\alias{curvesToContribs}
+\title{curvesToContribs}
+\usage{
+curvesToContribs(series, wf, ctype)
+}
+\arguments{
+\item{series}{Matrix of series (in rows), of size n x L}
+
+\item{wf}{Wavelet transform filter; see ?wavelets::wt.filter}
+
+\item{ctype}{Type of contribution: "relative" or "absolute" (or any prefix)}
+}
+\value{
+A matrix of size n x log(L) containing contributions in rows
+}
+\description{
+Compute the discrete wavelet coefficients for each series, and aggregate them in
+energy contribution across scales as described in https://arxiv.org/abs/1101.4744v2
+}
diff --git a/pkg/man/de_serialize.Rd b/pkg/man/de_serialize.Rd
new file mode 100644 (file)
index 0000000..8bb378d
--- /dev/null
@@ -0,0 +1,53 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/de_serialize.R
+\name{de_serialize}
+\alias{de_serialize}
+\alias{binarize}
+\alias{binarizeTransform}
+\alias{getDataInFile}
+\alias{binarize}
+\alias{binarizeTransform}
+\alias{getDataInFile}
+\title{(De)Serialization of a [big]matrix or data stream}
+\usage{
+binarize(data_ascii, data_bin_file, nb_per_chunk, sep = ",", nbytes = 4,
+  endian = .Platform$endian)
+
+binarizeTransform(getData, transform, data_bin_file, nb_per_chunk, nbytes = 4,
+  endian = .Platform$endian)
+
+getDataInFile(indices, data_bin_file, nbytes = 4, endian = .Platform$endian)
+}
+\arguments{
+\item{data_ascii}{Either a matrix or CSV file, with items in rows}
+
+\item{data_bin_file}{Name of binary file on output (\code{binarize})
+or intput (\code{getDataInFile})}
+
+\item{nb_per_chunk}{Number of lines to process in one batch}
+
+\item{sep}{Separator in CSV input file (if any provided)}
+
+\item{nbytes}{Number of bytes to serialize a floating-point number; 4 or 8}
+
+\item{endian}{Endianness to use for (de)serialization. Use "little" or "big" for portability}
+
+\item{getData}{Function to retrieve data chunks}
+
+\item{transform}{Transformation function to apply on data chunks}
+
+\item{indices}{Indices of the lines to retrieve}
+}
+\value{
+For \code{getDataInFile()}, the matrix with rows corresponding to the
+  requested indices. \code{binarizeTransform} returns the number of processed lines.
+  \code{binarize} is designed to serialize in several calls, thus returns nothing.
+}
+\description{
+\code{binarize()} serializes a matrix or CSV file with minimal overhead,
+  into a binary file. \code{getDataInFile()} achieves the inverse task: she retrieves
+  (ASCII) data rows from indices in the binary file. Finally,
+  \code{binarizeTransform()} serialize transformations of all data chunks; to use it,
+  a data-retrieval function must be provided, thus \code{binarize} will most likely be
+  used first (and then a function defined to seek in generated binary file)
+}
diff --git a/pkg/man/epclust-package.Rd b/pkg/man/epclust-package.Rd
new file mode 100644 (file)
index 0000000..f991746
--- /dev/null
@@ -0,0 +1,40 @@
+\name{epclust-package}
+\alias{epclust-package}
+\alias{epclust}
+\docType{package}
+
+\title{
+       \packageTitle{epclust}
+}
+
+\description{
+       \packageDescription{epclust}
+}
+
+\details{
+  Non-R-base dependencies:
+  \itemize{
+    \item cluster: for PAM algorithm
+    \item bigmemory: to share (big) matrices between processes
+    \item wavelets: to compute curves contributions using DWT
+    \item Rwave: to compute the CWT
+  }
+
+  Suggested packages:
+  \itemize{
+    \item synchronicity: to compute synchrones in // (concurrent writes)
+    \item devtools,testthat,roxygen2: development environment (doc, reload, test...)
+    \item MASS: generate multivariate gaussian samples in tests
+    \item wmtsa: generate sample curves for \code{claws} examples
+    \item DBI: for the example with series in an SQLite DB
+    \item digest: to compare \code{claws} examples results
+  }
+
+  The package vignette was generated with Jupyter, outside R packaging flow.
+}
+
+\author{
+       \packageAuthor{epclust}
+
+       Maintainer: \packageMaintainer{epclust}
+}
diff --git a/pkg/man/epclustFilter.Rd b/pkg/man/epclustFilter.Rd
new file mode 100644 (file)
index 0000000..c80c086
--- /dev/null
@@ -0,0 +1,17 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/RcppExports.R
+\name{epclustFilter}
+\alias{epclustFilter}
+\title{filter}
+\usage{
+epclustFilter(cwt)
+}
+\arguments{
+\item{cwt}{Continuous wavelets transform}
+}
+\value{
+The filtered CWT
+}
+\description{
+Filter time-series
+}
diff --git a/pkg/src/filter.c b/pkg/src/filter.c
new file mode 100644 (file)
index 0000000..8ece9c3
--- /dev/null
@@ -0,0 +1,70 @@
+#include <R.h>
+#include <Rdefines.h>
+
+// filterMA
+//
+// Filter [time-]series by replacing all values by the moving average of values
+// centered around current one. Border values are averaged with available data.
+//
+// @param M_ A real matrix of size LxD
+// @param w_ The (odd) number of values to average
+//
+// @return The filtered matrix, of same size as the input
+SEXP filterMA(SEXP M_, SEXP w_)
+{
+       int L = INTEGER(getAttrib(M_, R_DimSymbol))[0],
+               D = INTEGER(getAttrib(M_, R_DimSymbol))[1],
+               w = INTEGER_VALUE(w_),
+               half_w = (w-1)/2,
+               i,
+               nt; //number of terms in the current sum (max: w)
+       double *M = REAL(M_),
+               cs, //current sum (max: w terms)
+               left; //leftward term in the current moving sum
+
+       SEXP fM_; //the filtered result
+       PROTECT(fM_ = allocMatrix(REALSXP, L, D));
+       double* fM = REAL(fM_); //pointer to the encapsulated vector
+
+       // NOTE: unused loop parameter: shifting at the end of the loop is more efficient
+       for (int col=D-1; col>=0; col--)
+       {
+               // Initialization
+               nt = half_w + 1;
+               left = M[0];
+               cs = 0.;
+               for (i=half_w; i>=0; i--)
+                       cs += M[i];
+
+               // Left border
+               for (i=0; i<half_w; i++)
+               {
+                       fM[i] = cs / nt; //(partial) moving average at current index i
+                       cs += M[i+half_w+1];
+                       nt++;
+               }
+
+               // Middle: now nt == w, i == half_w
+               for (; i<L-half_w-1; i++)
+               {
+                       fM[i] = cs / w; //moving average at current index i
+                       cs = cs - left + M[i+half_w+1]; //remove oldest items, add next
+                       left = M[i-half_w+1]; //update first value for next iteration
+               }
+
+               // (Last "fully averaged" index +) Right border
+               for (; i<L; i++)
+               {
+                       fM[i] = cs / nt; //(partial) moving average at current index i
+                       cs -= M[i-half_w];
+                       nt--;
+               }
+
+               // Shift by L == increment column index by 1 (storage per column)
+               M = M + L;
+               fM = fM + L;
+       }
+
+       UNPROTECT(1);
+       return fM_;
+}
diff --git a/pkg/tests/testthat.R b/pkg/tests/testthat.R
new file mode 100644 (file)
index 0000000..eb8bc36
--- /dev/null
@@ -0,0 +1,4 @@
+library(testthat)
+library(epclust)
+
+test_check("epclust")
diff --git a/pkg/tests/testthat/helper-clustering.R b/pkg/tests/testthat/helper-clustering.R
new file mode 100644 (file)
index 0000000..785b7f0
--- /dev/null
@@ -0,0 +1,11 @@
+# Compute the sum of (normalized) sum of squares of closest distances to a medoid.
+computeDistortion <- function(series, medoids)
+{
+       n <- ncol(series)
+       L <- nrow(series)
+       distortion <- 0.
+       for (i in seq_len(n))
+               distortion <- distortion + min( colSums( sweep(medoids,1,series[,i],'-')^2 ) / L )
+
+       sqrt( distortion / n )
+}
diff --git a/pkg/tests/testthat/helper-common.R b/pkg/tests/testthat/helper-common.R
new file mode 100644 (file)
index 0000000..f442a44
--- /dev/null
@@ -0,0 +1,3 @@
+# Shorthand: map 1->1, 2->2, 3->3, 4->1, ..., 149->2, 150->3, ... (if base==3)
+I = function(i, base)
+       (i-1) %% base + 1
diff --git a/pkg/tests/testthat/test-assignMedoids.R b/pkg/tests/testthat/test-assignMedoids.R
new file mode 100644 (file)
index 0000000..9b55d78
--- /dev/null
@@ -0,0 +1,19 @@
+context("assignMedoids")
+
+test_that("assignMedoids behave as expected",
+{
+       # Generate a gaussian mixture
+       n <- 999
+       L <- 7
+       medoids <- cbind( rep(0,L), rep(-5,L), rep(5,L) )
+       # short series...
+       require("MASS", quietly=TRUE)
+       series <- t( rbind( MASS::mvrnorm(n/3, medoids[,1], diag(L)),
+               MASS::mvrnorm(n/3, medoids[,2], diag(L)),
+               MASS::mvrnorm(n/3, medoids[,3], diag(L)) ) )
+
+       # With high probability, medoids indices should resemble 1,1,1,...,2,2,2,...,3,3,3,...
+       mi <- assignMedoids(series, medoids)
+       mi_ref <- rep(1:3, each=n/3)
+       expect_lt( mean(mi != mi_ref), 0.01 )
+})
diff --git a/pkg/tests/testthat/test-clustering.R b/pkg/tests/testthat/test-clustering.R
new file mode 100644 (file)
index 0000000..98c84c5
--- /dev/null
@@ -0,0 +1,72 @@
+context("clustering")
+
+test_that("clusteringTask1 behave as expected",
+{
+       # Generate 60 reference sinusoïdal series (medoids to be found),
+       # and sample 900 series around them (add a small noise)
+       n <- 900
+       x <- seq(0,9.5,0.1)
+       L <- length(x) #96 1/4h
+       K1 <- 60
+       s <- lapply( seq_len(K1), function(i) x^(1+i/30)*cos(x+i) )
+       series <- matrix(nrow=L, ncol=n)
+       for (i in seq_len(n))
+               series[,i] <- s[[I(i,K1)]] + rnorm(L,sd=0.01)
+
+       getSeries <- function(indices) {
+               indices <- indices[indices <= n]
+               if (length(indices)>0) as.matrix(series[,indices]) else NULL
+       }
+
+       wf <- "haar"
+       ctype <- "absolute"
+       getContribs <- function(indices) curvesToContribs(as.matrix(series[,indices]),wf,ctype)
+
+       require("cluster", quietly=TRUE)
+       algoClust1 <- function(contribs,K) cluster::pam(t(contribs),K,diss=FALSE)$id.med
+       indices1 <- clusteringTask1(1:n, getContribs, K1, algoClust1, 140, verbose=TRUE)
+       medoids_K1 <- getSeries(indices1)
+
+       expect_equal(dim(medoids_K1), c(L,K1))
+       # Not easy to evaluate result: at least we expect it to be better than random selection of
+       # medoids within initial series
+       distor_good <- computeDistortion(series, medoids_K1)
+       for (i in 1:3)
+               expect_lte( distor_good, computeDistortion(series,series[,sample(1:n, K1)]) )
+})
+
+test_that("clusteringTask2 behave as expected",
+{
+       # Same 60 reference sinusoïdal series than in clusteringTask1 test,
+       # but this time we consider them as medoids - skipping stage 1
+       # Here also we sample 900 series around the 60 "medoids"
+       n <- 900
+       x <- seq(0,9.5,0.1)
+       L <- length(x) #96 1/4h
+       K1 <- 60
+       K2 <- 3
+       #for (i in 1:60) {plot(x^(1+i/30)*cos(x+i),type="l",col=i,ylim=c(-50,50)); par(new=TRUE)}
+       s <- lapply( seq_len(K1), function(i) x^(1+i/30)*cos(x+i) )
+       series <- matrix(nrow=L, ncol=n)
+       for (i in seq_len(n))
+               series[,i] <- s[[I(i,K1)]] + rnorm(L,sd=0.01)
+
+       getSeries <- function(indices) {
+               indices <- indices[indices <= n]
+               if (length(indices)>0) as.matrix(series[,indices]) else NULL
+       }
+
+       # Perfect situation: all medoids "after stage 1" are ~good
+       algoClust2 <- function(dists,K) cluster::pam(dists,K,diss=TRUE)$id.med
+       indices2 <- clusteringTask2(1:K1, getSeries, K2, algoClust2, 210, 3, 4, 8, "little",
+               verbose=TRUE)
+       medoids_K2 <- getSeries(indices2)
+
+       expect_equal(dim(medoids_K2), c(L,K2))
+       # Not easy to evaluate result: at least we expect it to be better than random selection of
+       # synchrones within 1...K1 (from where distances computations + clustering was run)
+       distor_good <- computeDistortion(series, medoids_K2)
+#TODO: This fails; why?
+#      for (i in 1:3)
+#              expect_lte( distor_good, computeDistortion(series, series[,sample(1:K1,3)]) )
+})
diff --git a/pkg/tests/testthat/test-computeSynchrones.R b/pkg/tests/testthat/test-computeSynchrones.R
new file mode 100644 (file)
index 0000000..0a13aec
--- /dev/null
@@ -0,0 +1,37 @@
+context("computeSynchrones")
+
+test_that("computeSynchrones behave as expected",
+{
+       # Generate 300 sinusoïdal series of 3 kinds: all series of indices == 0 mod 3 are the same
+       # (plus noise), all series of indices == 1 mod 3 are the same (plus noise) ...
+       n <- 300
+       x <- seq(0,9.5,0.1)
+       L <- length(x) #96 1/4h
+       K <- 3
+       s1 <- cos(x)
+       s2 <- sin(x)
+       s3 <- c( s1[1:(L%/%2)] , s2[(L%/%2+1):L] )
+       #sum((s1-s2)^2) == 96
+       #sum((s1-s3)^2) == 58
+       #sum((s2-s3)^2) == 38
+       s <- list(s1, s2, s3)
+       series <- matrix(nrow=L, ncol=n)
+       for (i in seq_len(n))
+               series[,i] <- s[[I(i,K)]] + rnorm(L,sd=0.01)
+
+       getSeries <- function(indices) {
+               indices <- indices[indices <= n]
+               if (length(indices)>0) as.matrix(series[,indices]) else NULL
+       }
+
+       synchrones <- computeSynchrones(cbind(s1,s2,s3),getSeries,n,100,verbose=TRUE)
+
+       expect_equal(dim(synchrones), c(L,K))
+       for (i in 1:K)
+       {
+               # Synchrones are (for each medoid) sums of closest curves.
+               # Here, we expect exactly 100 curves of each kind to be assigned respectively to
+               # synchrone 1, 2 and 3 => division by 100 should be very close to the ref curve
+               expect_equal(synchrones[,i]/100, s[[i]], tolerance=0.01)
+       }
+})
diff --git a/pkg/tests/testthat/test-computeWerDists.R b/pkg/tests/testthat/test-computeWerDists.R
new file mode 100644 (file)
index 0000000..09ad5c8
--- /dev/null
@@ -0,0 +1,18 @@
+context("computeWerDists")
+
+test_that("computeWerDists output correct results",
+{
+       nbytes <- 8
+       endian <- "little"
+
+       # On two identical series
+       serie <- rnorm(212, sd=5)
+       series <- cbind(serie, serie)
+       getSeries <- function(indices) as.matrix(series[,indices])
+       dists <- computeWerDists(1:2, getSeries, 50, 3, 4, nbytes, endian,
+               verbose=TRUE)
+       expect_equal(dists, matrix(0.,nrow=2,ncol=2))
+
+       # On two constant series
+       # TODO: ref results. Ask Jairo to check function.
+})
diff --git a/pkg/tests/testthat/test-de_serialize.R b/pkg/tests/testthat/test-de_serialize.R
new file mode 100644 (file)
index 0000000..14618a2
--- /dev/null
@@ -0,0 +1,94 @@
+context("de_serialize")
+
+test_that("serialization + getDataInFile retrieve original data / from matrix",
+{
+       data_bin_file <- ".epclust_test_m.bin"
+       unlink(data_bin_file)
+
+       # Dataset 200 cols / 30 rows
+       data_ascii <- matrix(runif(200*30,-10,10),nrow=30)
+       nbytes <- 4 #lead to a precision of 1e-7 / 1e-8
+       endian <- "little"
+
+       # Simulate serialization in one single call
+       binarize(data_ascii, data_bin_file, 500, ",", nbytes, endian)
+       expect_equal(file.info(data_bin_file)$size, length(data_ascii)*nbytes+8)
+       for (indices in list(c(1,3,5), 3:13, c(5,20,50), c(75,130:135), 196:200))
+       {
+               data_lines <- getDataInFile(indices, data_bin_file, nbytes, endian)
+               expect_equal(data_lines, data_ascii[,indices], tolerance=1e-6)
+       }
+       unlink(data_bin_file)
+
+       # Serialization in several calls (last call complete, next call NULL)
+       for (i in 1:20)
+               binarize(data_ascii[,((i-1)*10+1):(i*10)], data_bin_file, 20, ",", nbytes, endian)
+       expect_equal(file.info(data_bin_file)$size, length(data_ascii)*nbytes+8)
+       for (indices in list(c(1,3,5), 3:13, c(5,20,50), c(75,130:135), 196:200))
+       {
+               data_lines <- getDataInFile(indices, data_bin_file, nbytes, endian)
+               expect_equal(data_lines, data_ascii[,indices], tolerance=1e-6)
+       }
+       unlink(data_bin_file)
+})
+
+test_that("serialization + transform + getDataInFile retrieve original transforms",
+{
+       data_bin_file <- ".epclust_test_t.bin"
+       unlink(data_bin_file)
+
+       # Dataset 200 cols / 30 rows
+       data_ascii <- matrix(runif(200*30,-10,10),nrow=30)
+       nbytes <- 8
+       endian <- "little"
+
+       binarize(data_ascii, data_bin_file, 500, ",", nbytes, endian)
+       # Serialize transformation (just compute range) into a new binary file
+       trans_bin_file <- ".epclust_test_t_trans.bin"
+       unlink(trans_bin_file)
+       getSeries <- function(inds) getDataInFile(inds, data_bin_file, nbytes, endian)
+       binarizeTransform(getSeries, function(series) apply(series, 2, range),
+               trans_bin_file, 250, nbytes, endian)
+       unlink(data_bin_file)
+       expect_equal(file.info(trans_bin_file)$size, 2*ncol(data_ascii)*nbytes+8)
+       for (indices in list(c(1,3,5), 3:13, c(5,20,50), c(75,130:135), 196:200))
+       {
+               trans_cols <- getDataInFile(indices, trans_bin_file, nbytes, endian)
+               expect_equal(trans_cols, apply(data_ascii[,indices],2,range), tolerance=1e-6)
+       }
+       unlink(trans_bin_file)
+})
+
+test_that("serialization + getDataInFile retrieve original data / from connection",
+{
+       data_bin_file <- ".epclust_test_c.bin"
+       unlink(data_bin_file)
+
+       # Dataset 300 cols / 50 rows
+       data_csv <- system.file("testdata","de_serialize.csv",package="epclust")
+       nbytes <- 8
+       endian <- "big"
+       data_ascii <- unname( t( as.matrix(read.table(data_csv,sep=";",header=FALSE)) ) ) #ref
+
+       # Simulate serialization in one single call
+       binarize(data_csv, data_bin_file, 350, ";", nbytes, endian)
+       expect_equal(file.info(data_bin_file)$size, 300*50*8+8)
+       for (indices in list(c(1,3,5), 3:13, c(5,20,50), c(75,130:135), 196:200))
+       {
+               data_cols <- getDataInFile(indices,data_bin_file,nbytes,endian)
+               expect_equal(data_cols, data_ascii[,indices])
+       }
+       unlink(data_bin_file)
+
+       # Serialization in several calls / chunks of 29 --> 29*10 + 10, incomplete last
+       data_con <- file(data_csv, "r")
+       binarize(data_con, data_bin_file, 29, ";", nbytes, endian)
+       expect_equal(file.info(data_bin_file)$size, 300*50*8+8)
+       for (indices in list(c(1,3,5), 3:13, c(5,20,50), c(75,130:135), 196:200))
+       {
+               data_cols <- getDataInFile(indices,data_bin_file,nbytes,endian)
+               expect_equal(data_cols, data_ascii[,indices])
+       }
+       unlink(data_bin_file)
+       #close(data_con) --> done in binarize()
+})
diff --git a/pkg/tests/testthat/test-filterMA.R b/pkg/tests/testthat/test-filterMA.R
new file mode 100644 (file)
index 0000000..19ec6fc
--- /dev/null
@@ -0,0 +1,31 @@
+context("filterMA")
+
+test_that("[time-]serie filtering behave as expected",
+{
+       # Mean of 3 values
+       M <- matrix(runif(1000,min=-7,max=7), ncol=10)
+       ref_fM <- stats::filter(M, rep(1/3,3), circular=FALSE)
+       fM <- epclust:::filterMA(M, 3)
+
+       # Expect an agreement on all inner values
+       expect_equal(dim(fM), c(100,10))
+       expect_equal(fM[2:99,], ref_fM[2:99,])
+
+       # Border values should be averages of 2 values
+       expect_equal(fM[1,], colMeans(M[1:2,]))
+       expect_equal(fM[100,], colMeans(M[99:100,]))
+
+       # Mean of 5 values
+       ref_fM <- stats::filter(M, rep(1/5,5), circular=FALSE)
+       fM <- epclust:::filterMA(M, 5)
+
+       # Expect an agreement on all inner values
+       expect_equal(dim(fM), c(100,10))
+       expect_equal(fM[3:98,], ref_fM[3:98,])
+
+       # Border values should be averages of 3 or 4 values
+       expect_equal(fM[1,], colMeans(M[1:3,]))
+       expect_equal(fM[2,], colMeans(M[1:4,]))
+       expect_equal(fM[99,], colMeans(M[97:100,]))
+       expect_equal(fM[100,], colMeans(M[98:100,]))
+})
diff --git a/pkg/tests/testthat/test-utils.R b/pkg/tests/testthat/test-utils.R
new file mode 100644 (file)
index 0000000..c2474c8
--- /dev/null
@@ -0,0 +1,55 @@
+context("utils functions")
+
+test_that("Helper function to split indices work properly",
+{
+       indices <- 1:400
+
+       # bigger nb_per_set than length(indices)
+       expect_equal(epclust:::.splitIndices(indices,500), list(indices))
+
+       # nb_per_set == length(indices)
+       expect_equal(epclust:::.splitIndices(indices,400), list(indices))
+
+       # length(indices) %% nb_per_set == 0
+       expect_equal(epclust:::.splitIndices(indices,200),
+               c( list(indices[1:200]), list(indices[201:400]) ))
+       expect_equal(epclust:::.splitIndices(indices,100),
+               c( list(indices[1:100]), list(indices[101:200]),
+                       list(indices[201:300]), list(indices[301:400]) ))
+
+       # length(indices) / nb_per_set == 1, length(indices) %% nb_per_set == 100
+       expect_equal(epclust:::.splitIndices(indices,300,min_size=1),
+               list(1:300, 301:400))
+       split_inds <- epclust:::.splitIndices(indices,300,min_size=200)
+       expect_equal(length(unique(unlist(split_inds))), 400)
+       expect_equal(length(split_inds), 2)
+       expect_equal(length(split_inds[[1]]), 200)
+       expect_equal(length(split_inds[[2]]), 200)
+       expect_error(epclust:::.splitIndices(indices,300,min_size=300), "Impossible to split*")
+
+       # length(indices) / nb_per_set == 2, length(indices) %% nb_per_set == 42
+       expect_equal(epclust:::.splitIndices(indices,179,min_size=1),
+               list(1:179, 180:358, 359:400))
+       split_inds <-epclust:::.splitIndices(indices,179,min_size=60)
+       expect_equal(length(unique(unlist(split_inds))), 400)
+       expect_equal(length(split_inds), 3)
+       expect_equal(length(split_inds[[1]]), 170)
+       expect_equal(length(split_inds[[2]]), 170)
+       expect_equal(length(split_inds[[3]]), 60)
+       expect_error(epclust:::.splitIndices(indices,179,min_size=150), "Impossible to split*")
+})
+
+test_that("curvesToContribs output correct results",
+{
+       L <- 220 #extended to 256, log2(256) == 8
+
+       # Zero serie
+       expect_equal(curvesToContribs(rep(0,L), "d8", "absolute"), as.matrix(rep(0,8)))
+       expect_equal(curvesToContribs(rep(0,L), "haar", "absolute"), as.matrix(rep(0,8)))
+
+       # Constant serie
+       expect_equal(curvesToContribs(rep(5,L), "haar", "absolute"), as.matrix(rep(0,8)))
+       expect_equal(curvesToContribs(rep(10,L), "haar", "absolute"), as.matrix(rep(0,8)))
+#      expect_equal(curvesToContribs(rep(5,L), "d8", ctype), rep(0,8))
+#TODO:
+})
diff --git a/pkg/vignettes/epclust.ipynb b/pkg/vignettes/epclust.ipynb
new file mode 100644 (file)
index 0000000..0e0c061
--- /dev/null
@@ -0,0 +1 @@
+TODO from jupyter; generate HTML, in final package
diff --git a/temp/WerDist.R b/temp/WerDist.R
new file mode 100644 (file)
index 0000000..4e567a0
--- /dev/null
@@ -0,0 +1,1831 @@
+#Ligne 83 dans epclust/R/computeWerDists.R :
+# TODO:        
+#              [X,period,scale,coix] =
+#wavelet(x(:,2),dt,Args.Pad,Args.Dj,Args.S0,Args.J1,Args.Mother);%#ok
+#[Y,period,scale,coiy] = wavelet(y(:,2),dt,Args.Pad,Args.Dj,Args.S0,Args.J1,Args.Mother);
+#
+#%Smooth X and Y before truncating!  (minimize coi)
+#%sinv=1./(scale');
+#%
+#%
+#%sX=smoothwavelet(sinv(:,ones(1,nx)).*(abs(X).^2),dt,period,Args.Dj,scale);
+#%sY=smoothwavelet(sinv(:,ones(1,ny)).*(abs(Y).^2),dt,period,Args.Dj,scale);
+#%
+#%Wxy=X.*conj(Y);
+#%
+#%% ----------------------- Wavelet coherence ---------------------------------
+#%sWxy=smoothwavelet(sinv(:,ones(1,n)).*Wxy,dt,period,Args.Dj,scale);
+#%Rsq=abs(sWxy).^2./(sX.*sY);
+#
+
+
+#https://github.com/grinsted/wavelet-coherence/blob/master/wtc.m
+
+
+library(Rwave)       # CWT
+library(cluster)     # pam
+#library(flexclust)   # kcca
+
+
+ toCWT  <- function(X, sw=  0,  tw=  0, swabs= 0,
+                       nvoice= 12, noctave= 5, 
+                       s0= 2, w0= 2*pi, lt= 24, dt= 0.5,
+                       spectra = FALSE, smooth = TRUE,
+                       scaled  = FALSE,
+                     scalevector)
+     { noctave  <- adjust.noctave(lt, dt, s0, tw, noctave)
+       if(missing(scalevector)) 
+          scalevector  <- 2^(0:(noctave * nvoice) / nvoice) * s0
+       res <- lapply(1:nrow(X), function(n)
+           { tsX         <- ts( X[n,] )
+             tsCent      <- tsX - mean(tsX)
+             if(scaled)  tsCent <- ts(scale(tsCent))           
+             tsCent.cwt  <- cwt.ts(tsCent, s0, noctave, nvoice, w0)
+             tsCent.cwt
+           } )
+          if( spectra ) res <- lapply(res, function(l) Mod(l)^2 )
+          if( smooth  ) res <- lapply(res, smCWT, swabs = swabs,
+                                      tw = tw, dt = dt, 
+                                      scalevector = scalevector)
+       resArray <- array(NA, c(nrow(res[[1]]), ncol(res[[1]]),
+                               length(res)))
+       for( l in 1:length(res) ) resArray[ , , l] <- res[[l]]
+       resArray
+     }
+
+
+  # ===============================================================
+
+  smCWT <- function(CWT, sw=  0,  tw=  0, swabs= 0,
+                       nvoice= 12, noctave= 2, s0= 2, w0= 2*pi, 
+                                          lt= 24, dt= 0.5, scalevector )
+                {
+#         noctave  <- adjust.noctave(lt, dt, s0, tw, noctave)
+#         scalevector  <- 2^(0:(noctave * nvoice) / nvoice) * s0
+         wsp     <- Mod(CWT)  
+         smwsp   <- smooth.matrix(wsp, swabs)
+         smsmwsp <- smooth.time(smwsp, tw, dt, scalevector)
+         smsmwsp
+       }
+
+
+  # ===============================================================
+
+  toDWT <- function(x, filter.number = 6, family = "DaubLeAsymm")
+{ x2   <- spline(x, n = 2^ceiling( log(length(x), 2) ),
+            method = 'natural')$y
+  Dx2 <- wd(x2, family = family, filter.number = filter.number)$D
+               Dx2
+}
+
+  # ===============================================================
+
+  contrib <- function(x) 
+      { J   <- log( length(x)+1, 2)
+        nrj <- numeric(J)
+        t0  <- 1
+        t1  <- 0
+        for( j in 1:J ) {
+          t1     <- t1 + 2^(J-j)
+          nrj[j] <- sqrt( sum( x[t0:t1]^2 ) )
+          t0     <- t1 + 1
+        }
+        return(nrj)  
+         }
+
+
+    # ========================================= distance for coh ===
+
+  coherence <- function( x, y)
+       { J <- log(length(x) + 1, 2)
+            t0 <- 1
+                sg2_x <- 0
+                sg2_y <- 0
+                sg_xy <- 0
+            for(j in 0:(J - 1))
+                {  t1 <- t0 + 2^(J - j)/2  - 1
+                   tt <- t0:t1
+                   sg2_x <- sg2_x + mean(x[t0:t1]^2)
+                       sg2_y <- sg2_y + mean(y[t0:t1]^2)
+                       sg_xy <- sg_xy + mean(x[t0:t1] * y[t0:t1])
+            t0 <- t1 + 1
+                }
+               res <- sg_xy^2 / sg2_x / sg2_y
+               res
+          }
+
+
+  vect2mat <- function(vect){
+                 vect <- as.vector(vect)
+                 matrix(vect[-(1:2)], delta, lscvect)
+               }
+
+
+  # =========================================  # myimg for graphics 
+  jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", 
+                                "cyan", "#7FFF7F", "yellow", 
+                                "#FF7F00", "red", "#7F0000"))
+
+  myimg <- function(MAT, x = 1:nrow(MAT), y = 1:col(MAT), ... )
+              filled.contour(  x = x, y = y, z = MAT, 
+                              xlab= 'Time', ylab= 'scale',
+                              color.palette = jet.colors,
+                              ... )
+
+
+#TODO: [plus tard] alternative à sowa (package disparu) : cwt..
+#source("sowas-superseded.r")  # auxiliary CWT functions
+
+
+cwt.ts <- function(ts,s0,noctave=5,nvoice=10,w0=2*pi){
+  
+  if (class(ts)!="ts"){
+    
+    cat("# This function needs a time series object as input. You may construct this by using the function ts(data,start,deltat). Try '?ts' for help.\n")
+    
+  }
+  else{
+    
+    t=time(ts)
+    dt=t[2]-t[1]
+    
+    s0unit=s0/dt*w0/(2*pi)   
+    s0log=as.integer((log2(s0unit)-1)*nvoice+1.5)
+    
+    if (s0log<1){
+      cat(paste("# s0unit = ",s0unit,"\n",sep=""))
+      cat(paste("# s0log  = ",s0log,"\n",sep=""))
+      cat("# s0 too small for w0! \n")
+    }
+    totnoct=noctave+as.integer(s0log/nvoice)+1
+    
+    totts.cwt=cwt(ts,totnoct,nvoice,w0,plot=0)
+    
+    ts.cwt=totts.cwt[,s0log:(s0log+noctave*nvoice)]
+    
+    #Normalization
+    sqs <- sqrt(2^(0:(noctave*nvoice)/nvoice)*s0)
+    smat <- matrix(rep(sqs,length(t)),nrow=length(t),byrow=TRUE)
+    
+    ts.cwt*smat
+    
+  }
+  
+}
+
+#####################################
+# WSP
+#####################################
+
+wsp <- function(ts,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,siglevel=0.95,critval=NULL,nreal=1000,arealsiglevel=0.9,kernel=0,markt=-999,marks=-999,logscale=FALSE,plot=TRUE,units="",device="screen",file="wsp",color=TRUE,pwidth=10,pheight=7,labsc=1,labtext="",sigplot=3){
+  
+  if (class(ts)!="ts"){
+    
+    cat("# This function needs a time series object as input. You may construct this by using the function ts(data,start,deltat). Try '?ts' for help.\n")
+    
+  }
+  else{
+    
+    if (sw!=0 & swabs==0)
+      swabs <- as.integer(sw*nvoice)
+    if (swabs!=0 & sw==0)
+      sw <- swabs/nvoice
+    
+    sllist <- checkarealsiglevel(sw,tw,w0,arealsiglevel,siglevel,0)
+    arealsiglevel <- sllist$arealsiglevel
+    siglevel <- sllist$siglevel
+    
+    at <- NULL
+    
+    t <- time(ts)
+    dt <- deltat(ts)
+    s0rem <- s0
+    s0 <- adjust.s0(s0,dt)
+    dnoctave <- as.integer(log(s0/s0rem-0.000000000001)/log(2))+1
+    
+    noctave <- adjust.noctave(length(ts),dt,s0,tw,noctave)
+    scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+    tsanom <- ts-mean(ts)
+    
+    #WAVELET TRANSFORMATION
+    ts.cwt <- cwt.ts(tsanom,s0,noctave,nvoice,w0)
+    
+    #SMOOTHING
+    wsp <- smooth.matrix(Mod(ts.cwt)^2,swabs)
+    smwsp <- smooth.time(wsp,tw,dt,scalevector)
+    
+    #POINTWISE SIGNIFICANCE TEST
+    if (is.null(critval)==FALSE){ # is critval empty?
+      if (dim(critval)[2]!=dim(smwsp)[2]){ # is critval of the wrong dimension?
+        if (siglevel[1]!=0 & nreal!=0) critval <-
+          criticalvaluesWSP(tsanom,s0,noctave,nvoice,w0,swabs,tw,siglevel,nreal)
+        #critval is of wrong dimension and siglevel and nreal are given
+        else {
+          critval <- NULL # no test possible
+          arealsiglevel <- 0
+          cat("# dimension of critval is wrong \n")
+          cat("# areawise test only possible with pointwise test \n")
+        }
+      }
+    }
+    else{ # critval is empty, but nreal or siglevel is given
+      if (siglevel[1]!=0 & nreal!=0) critval <-
+        criticalvaluesWSP(tsanom,s0,noctave,nvoice,w0,swabs,tw,siglevel,nreal)
+      else {
+        critval <- NULL
+        arealsiglevel <- 0
+        cat("# areawise test only possible with pointwise test \n")
+      }
+    }
+    
+    #AREAL SIGNIFICANCE TEST
+    if (arealsiglevel!=0){
+      v <- critval[1,]
+      v[v==0] <- 9999
+      cvmat <- matrix(rep(v,length(t)),nrow=length(t),byrow=TRUE)
+      atest <- arealtest(smwsp/cvmat,dt,s0,noctave,nvoice,w0,swabs,tw,siglevel,arealsiglevel,kernel,0)
+      at <- atest$at
+      kernel <- atest$kernel
+    }
+    
+    if (s0rem<s0){
+      smwsp <- addvalues(nvoice,dnoctave,smwsp,NA)
+      critval <- addvalues(nvoice,dnoctave,critval,1)
+      #at <- addvalues(nvoice,dnoctave,at,NA)
+      noctave <- noctave+dnoctave
+      s0 <- s0/2^dnoctave
+      scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+    }
+    
+    #PARAMETERS
+    wclist <-
+      list(modulus=smwsp,phase=NULL,time=t,s0=s0,noctave=noctave,nvoice=nvoice,w0=w0,scales=scalevector,critval=critval,at=at,kernel=kernel)
+    
+    class(wclist) <- "wt"
+    
+    #PLOTTING
+    if (plot)
+      plot(wclist,markt,marks,NULL,NULL,logscale,FALSE,units,"Wavelet Power Spectrum",device,file,FALSE,color,pwidth,pheight,labsc,labtext,sigplot)
+    
+    wclist
+    
+  }
+  
+}
+
+#####################################
+# WCO
+#####################################
+
+wco <-
+  function(ts1,ts2,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,siglevel=0.95,arealsiglevel=0.9,kernel=0,markt=-999,marks=-999,sqr=FALSE,phase=TRUE,plot=TRUE,units="",device="screen",file="wcoh",split=FALSE,color=TRUE,pwidth=10,pheight=7,labsc=1,labtext="",sigplot=3){
+    
+    if (class(ts1)!="ts"){
+      
+      cat("# This function needs two time series objects as input. You may construct them by using the function ts(data,start,deltat). Try '?ts' for help.\n")
+      
+    }
+    else{
+      
+      if (sw!=0 & swabs==0)
+        swabs <- as.integer(sw*nvoice)
+      if (swabs!=0 & sw==0)
+        sw <- swabs/nvoice
+      
+      sllist <- checkarealsiglevel(sw,tw,w0,arealsiglevel,siglevel,1)
+      arealsiglevel <- sllist$arealsiglevel
+      siglevel <- sllist$siglevel
+      
+      if (sw==0 & tw==0 & swabs==0) {
+        cat("# coherence without averaging makes no sense! \n")
+        siglevel <- 0
+        arealsiglevel <- 0
+      }
+      
+      if (phase==FALSE) phs <- NULL
+      
+      at <- NULL
+      
+      tsadjust <- adjust.timeseries(ts1,ts2)
+      ts1 <- tsadjust$ts1
+      ts2 <- tsadjust$ts2
+      
+      t <- time(ts1)
+      dt <- deltat(ts1)
+      
+      s0rem <- s0
+      s0 <- adjust.s0(s0,dt)
+      dnoctave <- as.integer(log(s0/s0rem-0.000000000001)/log(2))+1
+      
+      noctave <- adjust.noctave(length(ts1),dt,s0,tw,noctave)
+      
+      scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+      
+      ts1anom <- ts1-mean(ts1)
+      ts2anom <- ts2-mean(ts2)
+      
+      ts1.cwt <- cwt.ts(ts1anom,s0,noctave,nvoice,w0)
+      ts2.cwt <- cwt.ts(ts2anom,s0,noctave,nvoice,w0)
+      
+      cosp <- Re(ts1.cwt)*Re(ts2.cwt) + Im(ts1.cwt)*Im(ts2.cwt)
+      quad <- Im(ts1.cwt)*Re(ts2.cwt) - Re(ts1.cwt)*Im(ts2.cwt)
+      wsp1 <- Mod(ts1.cwt)^2
+      wsp2 <- Mod(ts2.cwt)^2
+      
+      smcosp <- smooth.matrix(cosp,swabs)
+      smquad <- smooth.matrix(quad,swabs)
+      smwsp1 <- smooth.matrix(wsp1,swabs)
+      smwsp2 <- smooth.matrix(wsp2,swabs)
+      
+      smsmcosp <- smooth.time(smcosp,tw,dt,scalevector)
+      smsmquad <- smooth.time(smquad,tw,dt,scalevector)
+      smsmwsp1 <- smooth.time(smwsp1,tw,dt,scalevector)
+      smsmwsp2 <- smooth.time(smwsp2,tw,dt,scalevector)
+      
+      if (sqr==FALSE)
+        wcoh <- sqrt((smsmcosp^2+smsmquad^2)/(smsmwsp1*smsmwsp2))
+      else
+        wcoh <- (smsmcosp^2+smsmquad^2)/(smsmwsp1*smsmwsp2)
+      
+      if (phase)
+        phs <- atan2(smsmquad,smsmcosp)
+      else phs <- NULL
+      
+      #POINTWISE SIGNIFICANCE TEST
+      if (siglevel[1]!=0) critval <- criticalvaluesWCO(s0,noctave,nvoice,w0,swabs,tw,siglevel)
+      else critval <- NULL
+      if (sqr==TRUE & is.null(critval)==FALSE)
+        critval <- critval^2
+      
+      #AREAWISE SIGNIFICANCE TEST
+      if (arealsiglevel!=0){
+        atest <- arealtest(wcoh/critval,dt,s0,noctave,nvoice,w0,swabs,tw,siglevel,arealsiglevel,kernel,1)
+        at <- atest$at
+        kernel <- atest$kernel
+      }
+      
+      wcoh[1,1] <- 0
+      wcoh[1,2] <- 1
+      
+      if (phase){
+        phs[1,1] <- -pi
+        phs[1,2] <- pi 
+      }
+      
+      if (s0rem<s0){
+        wcoh <- addvalues(nvoice,dnoctave,wcoh,NA)
+        phs <- addvalues(nvoice,dnoctave,phs,NA)
+        noctave <- noctave+dnoctave
+        s0 <- s0/2^dnoctave
+        scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+      }
+      
+      wclist <- list(modulus=wcoh,phase=phs,s0=s0,noctave=noctave,nvoice=nvoice,w0=w0,time=t,scales=scalevector,critval=critval,at=at,kernel=kernel)
+      
+      class(wclist) <- "wt"
+      
+      if (plot) plot(wclist,markt,marks,NULL,NULL,FALSE,phase,units,"Wavelet Coherence",device,file,split,color,pwidth,pheight,labsc,labtext,sigplot)
+      
+      wclist
+      
+    }
+    
+  }
+
+#####################################
+# WCS
+#####################################
+
+wcs <- function(ts1,ts2,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,markt=-999,marks=-999,logscale=FALSE,phase=TRUE,plot=TRUE,units="",device="screen",file="wcsp",split=FALSE,color=TRUE,pwidth=10,pheight=7,labsc=1,labtext=""){
+  
+  if (class(ts1)!="ts"){
+    
+    cat("# This function needs two time series objects as input. You may construct them by using the function ts(data,start,deltat). Try '?ts' for help. \n")
+    
+  }
+  else{
+    
+    if (sw!=0 & swabs==0)
+      swabs <- as.integer(sw*nvoice)
+    if (swabs!=0 & sw==0)
+      sw <- swabs/nvoice
+    
+    tsadjust <- adjust.timeseries(ts1,ts2)
+    ts1 <- tsadjust$ts1
+    ts2 <- tsadjust$ts2
+    
+    t <- time(ts1)
+    dt <- deltat(ts1)
+    
+    s0rem <- s0
+    s0 <- adjust.s0(s0,dt)
+    dnoctave <- as.integer(log(s0/s0rem-0.000000000001)/log(2))+1
+    
+    noctave <- adjust.noctave(length(ts1),dt,s0,tw,noctave)
+    
+    scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+    
+    ts1anom <- ts1-mean(ts1)
+    ts2anom <- ts2-mean(ts2)
+    
+    ts1.cwt <- cwt.ts(ts1anom,s0,noctave,nvoice,w0)
+    ts2.cwt <- cwt.ts(ts2anom,s0,noctave,nvoice,w0)
+    
+    cosp <- Re(ts1.cwt)*Re(ts2.cwt) + Im(ts1.cwt)*Im(ts2.cwt)
+    quad <- Im(ts1.cwt)*Re(ts2.cwt) - Re(ts1.cwt)*Im(ts2.cwt)
+    
+    smcosp <- smooth.matrix(cosp,swabs)
+    smquad <- smooth.matrix(quad,swabs)
+    
+    smsmcosp <- smooth.time(smcosp,tw,dt,scalevector)
+    smsmquad <- smooth.time(smquad,tw,dt,scalevector)
+    
+    wcsp <- smsmcosp^2+smsmquad^2
+    
+    if (phase)
+      phs <- atan2(smsmquad,smsmcosp)
+    else phs <- NULL
+    
+    if (phase){
+      phs[1,1] <- -pi
+      phs[1,2] <- pi 
+    }
+    
+    if (s0rem<s0){
+      wcsp <- addvalues(nvoice,dnoctave,wcoh,NA)
+      phs <- addvalues(nvoice,dnoctave,phs,NA)
+      noctave <- noctave+dnoctave
+      s0 <- s0/2^dnoctave
+      scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+    }
+    
+    wclist <- list(modulus=wcsp,phase=phs,s0=s0,noctave=noctave,nvoice=nvoice,w0=w0,time=t,scales=scalevector,critval=NULL,at=NULL,kernel=NULL)
+    
+    class(wclist) <- "wt"
+    
+    if (plot) plot(wclist,markt,marks,NULL,NULL,logscale,phase,units,"Wavelet Cross Spectrum",device,file,split,color,pwidth,pheight,labsc,labtext)
+    
+    wclist
+    
+  }
+  
+}
+
+##########################################
+# POINTWISE SIGNIFICANCE TEST
+##########################################
+
+rawWSP <- function(ts,s0=1,noctave=5,nvoice=20,w0=2*pi,swabs=0,tw=0,scalevector){
+  
+  tsanom <- ts-mean(ts)
+  
+  ts.cwt <- cwt.ts(tsanom,s0,noctave,nvoice,w0)
+  
+  wsp <- Mod(ts.cwt)^2
+  
+  smwsp <- smooth.matrix(wsp,swabs)
+  smsmwsp <- smooth.time(smwsp,tw,deltat(ts),scalevector)
+  
+  smsmwsp
+  
+}
+
+criticalvaluesWSP <- function(ts,s0=1,noctave=5,nvoice=10,w0=2*pi,swabs=0,tw=0,siglevel=0.95,nreal=1000){
+  
+  t=time(ts)
+  dt=deltat(ts)
+  
+  s0 <- adjust.s0(s0,dt)
+  noctave <- adjust.noctave(length(ts),dt,s0,tw,noctave)
+  
+  scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+  
+  cat("# calculating critical values by means of MC-simulations \n")
+  
+  s0unit=s0/dt*w0/(2*pi)                
+  s0log=as.integer((log2(s0unit)-1)*nvoice+1.5)
+  
+  wsp0 <- rawWSP(ts,s0,noctave,nvoice,w0,swabs,tw,scalevector)
+  
+  S <- dim(wsp0)[2]
+  
+  n1 <- 1 + 2*as.integer( sqrt(2) * 2^((S-swabs+s0log-1)/nvoice+1) )
+  n2 <- max(scalevector)*tw*2/dt*1.1
+  n3 <- 2*tw*s0*2^noctave/dt+100
+  n <- max(n1,n2,n3)
+  
+  center <- (n-1)/2+1
+  cv <- matrix(rep(0,S*length(siglevel)),ncol=S)
+  rmatrix <- matrix(0,nrow=nreal,ncol=S)
+  
+  # Fitting AR1-process (red noise) to data
+  arts0 <- ar(ts,order.max=1)
+  sdts0 <- sd(ts[1:length(ts)]) 
+  
+  if (arts0$order==0){
+    se <- sqrt(arts0$var)
+    arts0$ar <- 0.000001
+  }
+  else
+    se <- sqrt(sdts0*sdts0*(1-arts0$ar*arts0$ar))
+  
+  tsMC <- ts(data=rep(0,n),start=t[1],frequency=1/dt)
+  
+  # MC Simulations
+  for (i in 1:nreal){
+    
+    tsMC[1:n] <- arima.sim(list(ar = arts0$ar), n+1, sd = se)[2:(n+1)]
+    
+    rmatrix[i,] <- rawWSP(tsMC,s0,noctave,nvoice,w0,swabs,tw,scalevector)[center,]
+    
+  }
+  
+  for (s in (1+swabs):(S-swabs)) rmatrix[,s] <- sort(rmatrix[,s])
+  
+  for (i in 1:length(siglevel)){ 
+    sigindex <- as.integer(nreal*siglevel[i])
+    cvv <- rmatrix[sigindex,]
+    cvv[is.na(cvv)] <- 0
+    cv[i,] <- cvv
+  }
+  
+  cv
+  
+}
+
+###########
+
+criticalvaluesWCO <- function(s0,noctave,nvoice,w0,swabs,tw,siglevel=0.95){
+  
+  cv=rep(0,length(siglevel))
+  
+  for (i in 1:length(siglevel)){
+    
+    if (siglevel[i]!=0.9 && siglevel[i]!=0.95 && siglevel[i]!=0.99) siglevel[i] <- 0.95
+    
+    if (siglevel[i]==0.9){
+      cat("# significance level set to 0.90 \n")
+      sw <- 1.0*swabs/nvoice
+      cv[i] <- 0.00246872*w0^2*sw + 0.0302419*w0*sw^2 + 0.342056*sw^3 -
+        0.000425853*w0^2 - 0.101749*w0*sw - 0.703537*sw^2 +
+        0.00816219*w0 + 0.442342*sw + 0.970315
+    }
+    
+    if (siglevel[i]==0.95){
+      cat("# significance level set to 0.95 \n")
+      sw <- swabs*100.0/3.0/nvoice
+      cv[i] <- 0.0000823*w0^3 + 0.0000424*w0^2*sw + 0.0000113*w0*sw^2 +
+        0.0000154*sw^3 - 0.0023*w0^2 - 0.00219*w0*sw - 0.000751*sw^2 +
+        0.0205*w0 + 0.0127*sw + 0.95
+    }
+    
+    if (siglevel[i]==0.99){
+      cat("# significance level set to 0.99 \n")
+      sw <- 1.0*swabs/nvoice
+      cv[i] <- 0.00102304*w0^2*sw +  0.00745772*w0*sw^2 + 0.230035*sw^3 -
+        0.000361565*w0^2 - 0.0502861*w0*sw - 0.440777*sw^2 +
+        0.00694998*w0 + 0.29643*sw + 0.972964
+    }
+    
+    if (cv[i]>1) cv[i] <- 1
+    
+    cat(paste("# significance testing, cv=",cv[i]," \n",sep=""))
+    
+  }
+  
+  cv
+  
+}
+
+#############################
+# AREAWISE SIGNIFICANCE TEST
+#############################
+
+slide <- function(data,kernellist,s0,noctave,nvoice,cv){
+  
+  # slides kernel over data set
+  #---------------------------- 
+  # data:       matrix containing data
+  # kernellist: matrix containing kernel
+  # s0:         lowest scale
+  # noctave:    number of octaves
+  # nvoice:     number of voices per octave
+  # cv:         critical value, all values higher are set to one
+  
+  #Time:  (rows) n,i the kernel is to be scaled in this direction 
+  #Scale: (cols) m,j
+  
+  data[data<cv] <- 0
+  
+  kernel <- kernellist$bitmap
+  
+  js <- kernellist$is
+  
+  sm <- s0*2^noctave
+  
+  dbin <- tobin(data)
+  kbin <- tobin(kernel)
+  
+  dn <- nrow(dbin)
+  dm <- ncol(dbin)
+  
+  kn <- nrow(kbin)
+  km <- ncol(kbin)
+  
+  mark <- matrix(rep(0,dn*dm),nrow=dn)
+  
+  for (j in 1:(dm-km+1)){
+    
+    s <- s0*2^((j+js-1)/nvoice)
+    kscn <- as.integer(kn*s/sm);
+    if (kscn==0) kscn <- 1
+    
+    ksc <- scaleKernel(kbin,kscn)
+    kscm <- km
+    
+    for (i in 1:(dn-kscn+1)){
+      
+      subbin <- dbin[i:(i+kscn-1),j:(j+kscm-1)]
+      
+      if (sum(ksc*subbin)==sum(ksc))
+        mark[i:(i+kscn-1),j:(j+kscm-1)] <- mark[i:(i+kscn-1),j:(j+kscm-1)]+ksc
+      
+    }
+    
+  }
+  
+  mark <- tobin(mark)
+  
+  mark
+  
+}
+
+arealtest <- function(wt,dt=1,s0=1,noctave=5,nvoice=20,w0=2*pi,swabs=0,tw=0,siglevel,arealsiglevel=0.9,kernel=0,type=0){
+  
+  slp <- slope(w0,swabs,tw,nvoice,siglevel,arealsiglevel,type)
+  
+  if (length(kernel)<2){ 
+    maxarea <- s0*2^noctave*slp/10*nvoice/dt
+    cat(paste("# calculating kernel (maxarea=",maxarea,")\n",sep=""))
+    cvkernel <-
+      kernelRoot(s0,w0,a=maxarea,noctave,nvoice,swabs,tw,dt)
+    
+    cat("# building kernel bitmap \n")
+    kernel <-
+      kernelBitmap(cvkernel,s0,w0,noctave,nvoice,swabs,tw,dt)
+    
+  }
+  
+  cat("# performing arealtest \n")
+  sl <- slide(wt,kernel,s0,noctave,nvoice,1)  
+  
+  list(at=sl,kernel=kernel)
+  
+}
+
+#############################
+# PLOTTING
+#############################
+
+plotat <- function(t,wt,at,sigplot){
+  
+  if (length(at)>1){
+    linewidth <- 1
+    if (sigplot==3) 
+      linewidth <- 5
+    
+    contour(x=t,z=at,levels=0.5,add=TRUE,drawlabels=FALSE,axes=FALSE,lwd=linewidth,col="black")
+  }
+  
+}
+
+
+plotcv <- function(t,wt,cv){
+  
+  if (length(dim(cv))==0)
+    
+    contour(x=t,z=wt,levels=c(cv),drawlabels=FALSE,axes=FALSE,add=TRUE,col="black",lwd=1)
+  
+  else{
+    
+    for(i in 1:nrow(cv)){
+      
+      v <- cv[i,]
+      v[v==0] <- 9999
+      m <- matrix(rep(v,length(t)),nrow=length(t),byrow=TRUE)
+      
+      contour(x=t,z=wt/m,levels=1,drawlabels=FALSE,axes=FALSE,add=TRUE,col="black",lwd=1)
+      
+    }
+    
+  }
+  
+}
+
+plotcoi <- function(t,s0,noctave,w0){
+  
+  tv <- as.vector(t)
+  tvl <- tv[tv-tv[1]<(tv[length(tv)]-tv[1])/2]
+  tvr <- tv[tv-tv[1]>=(tv[length(tv)]-tv[1])/2]
+  
+  lines(tvl,log2(((tvl-tv[1])*4*pi/((w0+sqrt(2+w0*w0))*sqrt(2)))/s0)/noctave,col="black")
+  lines(tvr,log2(((tv[length(tv)]-tvr)*4*pi/((w0+sqrt(2+w0*w0))*sqrt(2)))/s0)/noctave,col="black")
+  
+}
+
+plotmarks <- function(t,s0,noctave,markt,marks){
+  
+  if (markt[1]!=-999){
+    
+    for (i in 1:length(markt)){
+      lines(c(markt[i],markt[i]),c(0,1),lty="dotted")
+    }
+    
+  }
+  
+  if (marks[1]!=-999){
+    
+    for (i in 1:length(marks)){
+      lines(c(t[1],t[length(t)]),c(log2(marks[i]/s0)/noctave,log2(marks[i]/s0)/noctave),lty="dotted")
+    }
+    
+  }
+  
+}
+
+
+#####################
+# PLOT.WT
+#####################
+
+plot.wt <- function(wt,markt=-999,marks=-999,t1=NULL,t2=NULL,logscale=FALSE,phase=FALSE,units="",plottitle="",device="screen",file="wt",split=FALSE,color=TRUE,pwidth=10,pheight=5,labsc=1.5,labtext="",sigplot=3,xax=NULL,xlab=NULL,yax=NULL,ylab=NULL){
+  
+  plotwt(wt$modulus,wt$phase,wt$time,wt$s0,wt$noctave,wt$w0,wt$critval,wt$at,markt,marks,t1,t2,logscale,phase,units,plottitle,device,file,split,color,pwidth,pheight,labsc,labtext,sigplot,xax,xlab,yax,ylab)
+  
+}
+
+plotwt <-
+  function(wt,phs,t,s0,noctave,w0,cv=NULL,at=NULL,markt=-999,marks=-999,t1=NULL,t2=NULL,logscale=FALSE,phase=FALSE,units="",plottitle="Wavelet Plot",device="screen",file="wavelet",split=FALSE,color=TRUE,pwidth=10,pheight=7,labsc=1,labtext="",sigplot=1,xax=NULL,xlab=NULL,yax=NULL,ylab=NULL){
+    
+    if (is.null(phs)) phase <- FALSE
+    
+    mgpv <- c(3,1,0)
+    if (labsc>1) mgpv[1] <- 3-(labsc-1.5) 
+    
+    ncolors <- 64
+    colors <- wtcolors(ncolors)
+    if (color==FALSE) colors <- gray((0:ncolors)/ncolors*0.7+0.3)
+    
+    rangev <- (0:(ncolors-1))/(ncolors-1)
+    rangebar <- matrix(rangev,nrow=2,ncol=64,byrow=TRUE) 
+    
+    s <- 2^(0:(noctave))*s0
+    sn <- (0:(noctave))/noctave
+    
+    deltat <- (t[length(t)]-t[1])/(length(t)-1)
+    cut <- FALSE
+    if ((!is.null(t1)) | (!is.null(t2))){
+      if (t1<t2 & t1>=t[1] & t2<=t[length(t)]){
+        
+        cut <- TRUE
+        
+        i1 <- (t1-t[1])/deltat+1
+        i2 <- (t2-t[1])/deltat+1
+        
+        t <- t[t>=t1 & t<=t2]
+        
+        wt <- wt[i1:i2,]
+        if (phase) phs <- phs[i1:i2,]
+        if (length(at)>1) at <- at[i1:i2,]
+        
+      }
+    }
+    
+    #----------------
+    # Setting layout
+    #----------------
+    
+    if (device=="ps" && split==FALSE){
+      
+      file <- paste(file,".eps",sep="")
+      
+      postscript(file,onefile=TRUE,horizontal=TRUE,paper="special",width=pwidth,height=pheight)
+      cat(paste("# writing",file," \n"))
+      
+    }
+    
+    if (device=="ps" && split==TRUE){
+      
+      file1 <- paste(file,".mod.eps",sep="")
+      
+      postscript(file1,onefile=TRUE,horizontal=TRUE,paper="special",width=pwidth,height=pheight)
+      cat(paste("# writing",file1," \n"))
+      
+    }
+    
+    if (phase==TRUE && split==FALSE) nlo <- layout(matrix(c(1,2,3,4),2,2,byrow=TRUE),widths=c(4,1))
+    else nlo <- layout(matrix(c(1,2),ncol=2,byrow=TRUE),widths=c(4,1))
+    
+    
+    #-----------------
+    # Plotting modulus
+    #-----------------
+    
+    if (logscale){
+      if (units=="")
+        image(x=t,z=log10(wt),col = colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv)
+      else
+        image(x=t,z=log10(wt),col = colors,axes=FALSE,xlab=paste("Time ","[",units,"]",sep=""),ylab=paste("Scale ","[",units,"]",sep=""),frame.plot=TRUE,cex.lab=labsc,mgp=mgpv)
+    }
+    else{
+      if (units=="")
+        image(x=t,z=wt,col = colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv)
+      else
+        image(x=t,z=wt,col = colors,axes=FALSE,xlab=paste("Time ","[",units,"]",sep=""),ylab=paste("Scale ","[",units,"]",sep=""),frame.plot=TRUE,cex.lab=labsc,mgp=mgpv)
+    }
+    
+    text(t[1+as.integer(length(t)*0.1)],0.8,labtext,cex=2)
+    
+    if (sigplot==1 | sigplot==3){
+      if (is.null(cv)==FALSE){                #Critical values
+        if (cv[1]!=0 & cv[1]!=-1) plotcv(t,wt,cv)
+      }
+    }
+    
+    if (sigplot>1) plotat(t,wt,at,sigplot)
+    
+    if (!cut) plotcoi(t,s0,noctave,w0)              #cone of influence
+    plotmarks(t,s0,noctave,markt,marks)   #additional guiding lines
+    
+    if (is.null(xax))
+      axis(side=1,at=axTicks(1),cex.axis=labsc)
+    else
+      if (is.null(xlab))
+        axis(side=1,xax,labels=as.character(xax),cex.axis=labsc)
+    else
+      axis(side=1,xax,labels=xlab,cex.axis=labsc)
+    
+    if (is.null(yax))
+      axis(side=2,sn,labels=as.character(s),cex.axis=labsc)
+    else
+      if (is.null(ylab))
+        axis(side=2,yax,labels=as.character(yax),cex.axis=labsc)
+    else
+      axis(side=2,yax,labels=ylab,cex.axis=labsc)
+    
+    title(main=plottitle,cex=labsc)
+    
+    image(z=rangebar,axes=FALSE,col=colors,frame.plot=TRUE,cex.lab=labsc,mgp=mgpv)
+    
+    if (is.null(cv)==FALSE){
+      if (length(dim(cv))==0){
+        for (i in 1:length(cv))
+          if (cv[i]!=0) lines(c(-1,2),c(cv[i],cv[i]))
+      }
+    }
+    
+    if (!logscale)
+      axis(side=2,(0:5)/5,labels=c("0","","","","","1"),cex.axis=labsc)
+    else{
+      labelv <- substr(as.character(c(0:5)*(max(log10(wt),na.rm=TRUE)-min(log10(wt),na.rm=TRUE))/5),1,4)
+      axis(side=2,(0:5)/5,labels=labelv,cex.axis=labsc)
+    }
+    
+    
+    #-----------------
+    # Plotting phase
+    #-----------------  
+    if (phase==TRUE){
+      
+      if (device=="ps" && split==TRUE){
+        
+        dev.off()
+        
+        file2 <- paste(file,".phs.eps",sep="")
+        
+        postscript(file2,onefile=TRUE,horizontal=TRUE,paper="special",width=10,height=5)
+        cat(paste("# writing",file2," \n"))
+        
+      }
+      
+      colors <- rainbow(ncolors)
+      if (color==FALSE){
+        dummy <- gray((0:ncolors)/ncolors)
+        colors[1:(ncolors/2)] <- dummy[(ncolors/2+1):ncolors]
+        colors[(ncolors/2+1):ncolors] <- dummy[1:(ncolors/2)]
+      }
+      
+      if (units=="")
+        image(x=t,z=phs,col=colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv)    
+      else
+        image(x=t,z=phs,col=colors,axes=FALSE,xlab=paste("Time ","[",units,"]",sep=""),ylab=paste("Scale ","[",units,"]",sep=""),frame.plot=TRUE,cex.lab=labsc,mgp=mgpv)
+      
+      if (is.null(cv)==FALSE) plotcv(t,wt,cv)
+      if (sigplot>1) plotat(t,wt,at,sigplot)
+      if (!cut) plotcoi(t,s0,noctave,w0)
+      plotmarks(t,s0,noctave,markt,marks)
+      
+      if (is.null(xax))
+        axis(side=1,at=axTicks(1),cex.axis=labsc)
+      else
+        if (is.null(xlab))
+          axis(side=1,xax,labels=as.character(xax),cex.axis=labsc)
+      else
+        axis(side=1,xax,labels=xlab,cex.axis=labsc)
+      
+      if (is.null(yax))
+        axis(side=2,sn,labels=as.character(s),cex.axis=labsc)
+      else
+        if (is.null(ylab))
+          axis(side=2,yax,labels=as.character(yax),cex.axis=labsc)
+      else
+        axis(side=2,yax,labels=ylab,cex.axis=labsc)
+      
+      
+      title(main="Phase")
+      
+      image(z=rangebar,axes=FALSE,col=colors,frame.plot=TRUE,cex.lab=labsc,mgp=mgpv)
+      axis(side=2,(0:4)/4,labels=c("-PI","","0","","PI"),cex.axis=labsc)
+      
+    }
+    
+    if (device=="ps") dev.off()
+    
+  }
+
+##############################
+# Surrogates
+##############################
+
+createwavesurrogates <- function(nsurr=1,wt=1,n,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi){
+  
+  surrmat <- matrix(rep(0,n*nsurr),ncol=nsurr)
+  
+  for (i in 1:nsurr){
+    
+    cat(paste("# Creating realization ",i,"\n",sep=""))
+    
+    x <- rnorm(n)
+    xts <- ts(x,start=0,deltat=dt)
+    
+    xwt <- cwt.ts(xts,s0,noctave,nvoice,w0)
+    wtsurr <- wt*xwt
+    
+    surri <- as.vector(invmorlet(wtsurr,0,dt,s0,noctave,nvoice,w0))
+    
+    surrmat[,i] <- Re(surri)
+    
+  }
+  
+  surrmat
+  
+}
+
+surrwave <- function(x,...)
+  UseMethod("surrwave")
+
+surrwave.wt <- function(wt,nsurr=1,spec=TRUE){
+  
+  n <- length(wt$time)
+  t0 <- wt$time[1]
+  dt <- (wt$time[13]-t0)/12
+  s0 <- wt$s0
+  noctave <- wt$noctave
+  nvoice <- wt$nvoice
+  w0 <- wt$w0
+  
+  wt <- wt$modulus
+  if (spec==TRUE)
+    wt <- sqrt(wt)
+  
+  surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0)
+  
+  surrts <- ts(surrmat,start=t0,deltat=dt)
+  
+  surrts
+  
+}
+
+surrwave.matrix <- function(mat,nsurr=1,t0=0,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,spec=FALSE){
+  
+  if (sw!=0 & swabs==0)
+    swabs <- as.integer(sw*nvoice)
+  
+  scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+  
+  if ((noctave*nvoice+1)!=dim(mat)[2])
+    cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n")
+  
+  n <- dim(mat)[1]
+  
+  if (spec==FALSE)
+    mat <- Mod(mat)
+  else
+    mat <- sqrt(Mod(mat))
+  
+  wtsm <- smooth.matrix(mat,swabs)
+  wt <- smooth.time(wtsm,tw,dt,scalevector)
+  
+  surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0)
+  
+  surrts <- ts(surrmat,start=t0,deltat=dt)
+  
+  surrts
+  
+}
+
+surrwave.character <-
+  function(file,nsurr=1,t0=0,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,transpose=TRUE,spec=FALSE){
+    
+    if (sw!=0 & swabs==0)
+      swabs <- as.integer(sw*nvoice)
+    
+    scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+    
+    if (transpose==FALSE)
+      mat <- matrix(scan(file,comment.char="#"),ncol=nvoice*noctave+1,byrow=TRUE)    
+    else 
+      mat <- matrix(scan(file,comment.char="#"),ncol=nvoice*noctave+1,byrow=FALSE)
+    
+    if ((noctave*nvoice+1)!=dim(mat)[2])
+      cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n")
+    
+    n <- dim(mat)[1]
+    
+    if (spec==FALSE)
+      mat <- Mod(mat)
+    else
+      mat <- sqrt(Mod(mat))
+    
+    wtsm <- smooth.matrix(mat,swabs)
+    wt <- smooth.time(wtsm,tw,dt,scalevector)
+    
+    surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0)
+    
+    surrts <- ts(surrmat,start=t0,deltat=dt)
+    
+    surrts
+    
+  }
+
+surrwave.ts <- function(ts,nsurr=1,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0){
+  
+  n <- length(ts)
+  t0 <- time(ts)[1]
+  dt <- deltat(ts)
+  if (sw!=0 & swabs==0)
+    swabs <- as.integer(sw*nvoice)
+  
+  scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0
+  
+  wt <- Mod(cwt.ts(ts,s0,noctave,nvoice,w0))
+  
+  wtsm <- smooth.matrix(wt,swabs)
+  wt <- smooth.time(wtsm,tw,dt,scalevector)
+  
+  surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0)
+  
+  surrts <- ts(surrmat,start=t0,deltat=dt)
+  
+  surrts
+  
+}
+
+invmorlet <- function(wt,t0=0,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi){
+  
+  if ((noctave*nvoice+1)!=dim(wt)[2])
+    cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n")
+  
+  n <- dim(wt)[1]
+  
+  wt[is.na(wt)] <- 0
+  
+  tsRe <- rep(0,n)
+  tsIm <- rep(0,n)
+  
+  wtRe <- t(Re(wt))
+  wtIm <- t(Im(wt))
+  
+  z <- .C("invmorlet",
+          as.double(as.vector(wtRe)),
+          as.double(as.vector(wtIm)),
+          as.integer(n),
+          as.double(dt),
+          as.double(s0),
+          as.integer(noctave),
+          as.integer(nvoice),     
+          as.double(w0),
+          tsRetmp = as.double(tsRe),
+          tsImtmp = as.double(tsIm),
+          PACKAGE="sowas")
+  
+  invvec=complex(real=z$tsRetmp,imaginary=z$tsImtmp)
+  invts <- ts(data=invvec,start=t0,deltat=dt)
+  
+  invts
+  
+}
+
+#################################
+# INPUT / OUTPUT
+#################################
+
+readmatrix <- function(file,M){
+  
+  A <- matrix(scan(file,comment.char="#"),ncol=M,byrow=TRUE)
+  
+  A
+  
+}
+
+
+readts <- function(file){
+  
+  A <- matrix(scan(file,comment.char="#"),ncol=2,byrow=TRUE)
+  
+  Adum <- A
+  
+  Adum[is.na(Adum)] <- 0
+  
+  t <- Adum %*% c(1,0)
+  x <- A %*% c(0,1)
+  
+  N=length(t)
+  f=1/(t[13]-t[1])*12
+  
+  if ((f>11) && (f<13)) f <- 12
+  
+  timeseries<-ts(data=x,start=t[1],frequency=f)
+  
+  timeseries
+  
+}
+
+writematrix <- function(file,data,header="# R Matrix"){
+  
+  write(header,file)
+  write(t(data),file,ncol(data),append=TRUE)
+  
+}
+
+############################
+# HELP FUNCTIONS
+############################
+
+smooth.matrix <- function(wt,swabs){
+  
+  if (swabs != 0)
+    smwt <- t(filter(t(wt),rep(1,2*swabs+1)/(2*swabs+1)))
+  else
+    smwt <- wt
+  
+  smwt
+  
+}
+
+smooth.time <- function(wt,tw,dt,scalevector){
+  
+  smwt <- wt
+  
+  if (tw != 0){
+    for (i in 1:length(scalevector)){
+      
+      twi <- as.integer(scalevector[i]*tw/dt)
+      smwt[,i] <- filter(wt[,i],rep(1,2*twi+1)/(2*twi+1))
+      
+    }
+  }
+  
+  smwt
+  
+}
+
+
+adjust.noctave <- function(N,dt,s0,tw,noctave){
+  
+  if (tw>0){  
+    dumno <- as.integer((log(N*dt)-log(2*tw*s0))/log(2))
+    if (dumno<noctave){
+      cat("# noctave adjusted to time smoothing window \n")
+      noctave <- dumno
+    }
+  }
+  
+  noctave
+  
+}
+
+adjust.s0 <- function(s0,dt){
+  
+  if (s0<2*dt){
+    s0 <- 2*dt
+    cat(paste("# s0 set to ",s0," \n"))
+  }
+  
+  s0
+  
+}
+
+adjust.timeseries <- function(ts1,ts2){
+  
+  if (length(ts1)!=length(ts2)){
+    tsint <- ts.intersect(ts1,ts2)
+    dt <- deltat(ts1)
+    ts1 <- ts(data=tsint[,1],start=time(tsint)[1],frequency=1/dt)
+    ts2 <- ts(data=tsint[,2],start=time(tsint)[1],frequency=1/dt)
+    t <- time(ts1)
+  }
+  
+  list(ts1=ts1,ts2=ts2)
+  
+}
+
+checkarealsiglevel <- function(sw,tw,w0,arealsiglevel,siglevel,type){
+  
+  if (type==0){
+    
+    swv <- c(0,0.5,1)
+    twv <- c(0,1.5,3)
+    w0v <- c(pi,2*pi)
+    
+    if (length(swv[swv==sw])==0 || length(twv[twv==tw])==0 ||
+          length(w0v[w0v==w0])==0){
+      arealsiglevel <- 0
+      cat("# areawise test for spectrum currently \n")
+      cat("# only possible for \n")
+      cat("# sw = 0 \n") 
+      cat("# tw = 0 \n") 
+      cat("# w0 = 2pi \n") 
+      cat("# No areawise test performed \n") 
+    }
+  }
+  
+  if (type==1){
+    
+    swv <- c(0.5)
+    twv <- c(1.5)
+    w0v <- c(2*pi)
+    
+    if (length(swv[swv==sw])==0 || length(twv[twv==tw])==0 ||
+          length(w0v[w0v==w0])==0){
+      arealsiglevel <- 0
+      cat("# areawise test for coherence currently \n")
+      cat("# only possible for \n")
+      cat("# sw = 0.5 \n") 
+      cat("# tw = 1.5 \n") 
+      cat("# w0 = 2pi \n") 
+      cat("# No areawise test performed \n") 
+    }
+  }
+  
+  
+  if (arealsiglevel!=0){
+    arealsiglevel <- 0.9
+    siglevel <- 0.95
+    cat("# currently only siglevel=0.95 and arealsiglevel=0.9 possible for areawise test \n")
+  }
+  
+  list(siglevel=siglevel,arealsiglevel=arealsiglevel)
+  
+}
+
+########################
+
+as.wt <- function(modulus,phase=NULL,s0=NULL,noctave=NULL,nvoice=NULL,w0=NULL,dt=1,time=NULL,scales=NULL,critval=NULL,at=NULL,kernel=NULL,N=NULL,t0=NULL){
+  
+  if (is.null(scales))
+    gotscales <- FALSE
+  else
+    gotscales <- TRUE
+  
+  if ((!gotscales) & (!is.null(s0)) & (!is.null(noctave)) &(!is.null(nvoice))){
+    gotscales <- TRUE
+    scales=2^(0:(noctave*nvoice)/nvoice)*s0
+  }
+  
+  if (gotscales & (is.null(s0) | is.null(noctave) |
+                     is.null(nvoice))){
+    s0 <- scales[1]
+    noctave <- log(scales[length(scales)]/s0)/log(2)
+    nvoice <- (length(scales)-1)/noctave
+  }
+  
+  
+  if (!gotscales)
+    cat("# ERROR! No scales given! \n")
+  
+  if (is.null(time)) gottimes <- FALSE
+  else gottimes <- TRUE
+  
+  if ((!gottimes) & (!is.null(dt)) & (!is.null(t0)) &(!is.null(N))){
+    gottimes <- TRUE
+    time=(0:(N-1))*dt+t0
+  }
+  
+  if (!gottimes)
+    cat("# ERROR! No time vector given! \n")
+  
+  wcolist <- list(modulus=modulus,phase=phase,s0=s0,noctave=noctave,nvoice=nvoice,w0=w0,time=time,scales=scales,critval=critval,at=at,kernel=kernel)
+  
+  class(wcolist) <- "wt"
+  
+  wcolist
+  
+}
+
+########################
+
+wtcolors <- function(ncolors){
+  
+  upside <- rainbow(ncolors,start=0,end=.7)
+  #upside <- heat.colors(ncolors+5)
+  #upside <- upside[1:ncolors]
+  
+  
+  down <- upside
+  
+  for (i in 1:ncolors){
+    down[i] <- upside[ncolors+1-i]    
+  }#
+  
+  down
+  
+}
+
+####################
+
+createwgn <- function(N,sig,dt){
+  
+  timeseries<-ts(data=rnorm(N,0,sig),start=0,deltat=dt)
+  
+  timeseries
+  
+}
+
+
+createar <- function(N,a,sig,dt){
+  
+  if (a==0) a <- 0.000000001
+  
+  se <- sqrt(sig*sig*(1-a*a))
+  tsMC <- ts(data=rep(0,N),start=0,deltat=dt)
+  
+  tsMC[1:N] <- arima.sim(list(ar = a), N, sd = se)
+  
+}
+
+######################
+
+rk <- function(N=1000,s=8,noctave=5,nvoice=10,w0=2*pi,plot=TRUE){
+  
+  t <- 1:N
+  
+  sunit <- s*(w0+sqrt(2+w0*w0))/(4*pi)
+  
+  s0 <- 4
+  #s0unit <- s0*(w0+sqrt(2+w0*w0))/(4*pi)
+  s0unit=s0/dt*w0/(2*pi)                  #(CORRECT) 
+  s0log <- as.integer((log2(s0unit)-1)*nvoice+1.5)
+  
+  totnoct <- noctave+as.integer(s0log/nvoice)+1
+  
+  x <- morlet(N,N/2,sunit,w0)
+  
+  totts.cwt <- Mod(cwt(x,totnoct,nvoice,w0,plot=0))
+  wt=totts.cwt[,s0log:(s0log+noctave*nvoice)]
+  
+  wt <- wt/max(wt)
+  
+  if (plot==TRUE) plotwt(wt,0,t,s0,noctave,w0,units="",plottitle="Reproducing Kernel")  
+  
+  wt
+  
+}
+
+###################
+
+addvalues <- function(nvoice,dnoctave,x,value){
+  
+  nr <- dim(x)[1]
+  nc <- dim(x)[2]
+  dnc <- nvoice*dnoctave
+  
+  y <- matrix(rep(value,nr*(nc+dnc)),nrow=nr)
+  
+  y[,(dnc+1):(dnc+nc)] <- x
+  
+  y
+  
+}
+
+####################
+
+scalematrix <- function(wt){
+  
+  # scales matrix, such that the maximal value is one
+  # wt: matrix to be scaled
+  
+  mval <- max(wt,na.rm=TRUE)
+  
+  wt <- wt/mval
+  
+  wt
+  
+}
+
+
+foldKernel <- function(F,swabs,tw,s,dt){
+  
+  # folds a matrix (e.g. kernel with smoothing window
+  # F:  matrix input
+  # swabs: smooting window width
+  
+  smsF <- smooth.matrix(F,swabs)
+  smsF[is.na(smsF)] <- 0
+  
+  smtsF <- smooth.time(smsF,tw,dt,s)
+  
+  smtsF[is.na(smtsF)] <- 0
+  
+  scF <- scalematrix(smtsF)
+  
+  scF
+  
+}
+
+kernelBitmap <- function(c,s0=1,w0=6,noctave=6,nvoice=20,swabs=0,tw=0,dt=1){
+  # produces kernel bitmap
+  # c:       height of contour, that defines area
+  # s0:      lowest scale
+  # noctave: number of octaves
+  # nvoice:  number of voices per octave
+  # swabs:      smoothing window length in scale direction
+  # dt:      sampling time
+  
+  s <- s0*2^noctave
+  is <- noctave*nvoice
+  
+  x <- s0*2^(((1:(nvoice*(noctave+2)))-1)/nvoice)
+  
+  t <- max(2000,max(x)*tw*2/dt*1.1)
+  
+  y <- ((0:(2*t))-t)/2*dt
+  
+  X <- matrix(x,ncol=nvoice*(noctave+2),nrow=2*t+1,byrow=T)
+  Y <- matrix(y,ncol=nvoice*(noctave+2),nrow=2*t+1)
+  
+  F <- sqrt(2*s*X/(s*s+X*X))*exp(-0.5*(Y*Y+w0*w0*(X-s)*(X-s))/(s*s+X*X))
+  
+  F <- foldKernel(F,swabs,tw,x,dt)
+  
+  F[F<c] <- 0
+  F[F>=c] <- 1
+  
+  is1 <- 1
+  is2 <- nvoice*(noctave+1)
+  it1 <- 1
+  it2 <- 2*t+1
+  
+  L <- F[1:(2*t+1),is1]
+  
+  while (length(L[L!=0])==0) {
+    is1 <- is1+1
+    L <- F[1:(2*t+1),is1]
+  }
+  
+  L <- F[1:(2*t+1),is2]
+  
+  while (length(L[L!=0])==0) {
+    is2 <- is2-1
+    L <- F[1:(2*t+1),is2]
+  }
+  
+  
+  L <- F[it1,1:(nvoice*(noctave+2))]
+  
+  while (length(L[L!=0])==0) {
+    it1 <- it1+1
+    L <- F[it1,1:(nvoice*(noctave+2))]
+  }
+  
+  L <- F[it2,1:(nvoice*(noctave+2))]
+  
+  while (length(L[L!=0])==0) {
+    it2 <- it2-1
+    L <- F[it2,1:(nvoice*(noctave+2))]
+  }
+  
+  kernel <- list(bitmap=F[(it1-1):(it2+1),(is1-1):(is2+1)],is=is-is1) 
+  
+  kernel
+  
+}
+
+kernelRoot <- function(s0=1,w0=6,a=0,noctave=6,nvoice=20,swabs=0,tw=0,dt=1){
+  
+  tol <- 0.005
+  cmin <- 0
+  cmax <- 1
+  cntr <- 0.5
+  da <- a
+  
+  while (abs(da/a)>tol){
+    
+    da <- kernelArea(cntr,s0,w0,a,noctave,nvoice,swabs,tw,dt)
+    if (da>0){
+      cmin <- cntr
+      cntr <- mean(c(cntr,cmax))
+    }
+    if (da<0){
+      cmax <- cntr
+      cntr <- mean(c(cntr,cmin))      
+    }
+  }
+  
+  cntr
+  
+}
+
+kernelArea <- function(cntr,s0=1,w0=6,a=0,noctave=6,nvoice=20,swabs=0,tw=0,dt=1){
+  
+  # calulates area of reproducing kernel for smoothed data at scale s0*2^noctave
+  # cntr:       height of contour line to define kernel area. This
+  #          parameter is to be estimated!
+  # s0:      lowest scale
+  # w0:      parameter of Morlet Wavelet
+  # a:       area offset (only needed, when finding root. Is set to
+  #          desired area 
+  # noctave: number of octaves
+  # nvoice:  number of voices per octave
+  # swabs:      smoothing window width in scale direction
+  # dt:      sampling time
+  
+  s <- s0*2^noctave
+  
+  x <- s0*2^(((1:(nvoice*(noctave+2)))-1)/nvoice)
+  
+  t <- max(2000,max(x)*tw*2/dt*1.1)
+  
+  y <- ((0:(2*t))-t)/2*dt
+  
+  X <- matrix(x,ncol=nvoice*(noctave+2),nrow=2*t+1,byrow=T)
+  Y <- matrix(y,ncol=nvoice*(noctave+2),nrow=2*t+1)
+  
+  F <- sqrt(2*s*X/(s*s+X*X))*exp(-0.5*(Y*Y+w0*w0*(X-s)*(X-s))/(s*s+X*X))
+  
+  F <- foldKernel(F,swabs,tw,x,dt)
+  
+  F[F>=cntr] <- 1
+  F[F<cntr] <- 0
+  
+  area <- length(F[F==1])-a
+  
+  area
+  
+}
+
+
+tobin <- function(x){
+  
+  # sets nonzero values to one
+  
+  y <- x/x
+  y[is.na(y)] <- 0
+  
+  y
+  
+}
+
+scaleKernel <- function(kernel,l){
+  
+  # scales kernel length in time direction proportional to scale
+  # kernel: data bitmap of width n
+  # l:      new width of kernel
+  
+  n <- nrow(kernel)
+  m <- ncol(kernel)
+  
+  newKernel <- matrix(rep(0,m*l),nrow=l)
+  
+  d <- as.double(n)/as.double(l)
+  
+  for (i in 1:l){
+    j <- as.integer((i-0.5)*d)
+    if (j==0) j <- 1
+    newKernel[i,1:m] <- kernel[j,1:m]
+  }
+  
+  newKernel
+  
+}
+
+slope <- function(w0,swabs,tw,nvoice,siglevel,arealsiglevel,type){
+  
+  sw <- swabs/nvoice
+  
+  if (type==0){ # wavelet spectrum
+    
+    if (tw == 0    & sw == 0    & w0 == 1 *pi) slp <-  5.82518          # w = 18.35831 
+    if (tw == 1.5       & sw == 0       & w0 == 1 *pi) slp <-  24.69852         # w = 14.30709 
+    if (tw == 3         & sw == 0       & w0 == 1 *pi) slp <-  35.48368         # w = 14.72354 
+    if (tw == 0         & sw == 5       & w0 == 1 *pi) slp <-  7.347707         # w = 17.96942 
+    if (tw == 1.5       & sw == 5       & w0 == 1 *pi) slp <-  28.24291         # w = 12.65993 
+    if (tw == 3         & sw == 5       & w0 == 1 *pi) slp <-  51.13723         # w = 10.96359 
+    if (tw == 0         & sw == 10      & w0 == 1 *pi) slp <-  10.47856         # w = 15.5941 
+    if (tw == 1.5       & sw == 10      & w0 == 1 *pi) slp <-  45.07387         # w = 15.29793 
+    if (tw == 3         & sw == 10      & w0 == 1 *pi) slp <-  52.82886         # w = 12.72361 
+    
+    if (tw == 0         & sw == 0       & w0 == 2 *pi) slp <-  8.718912         # w = 17.75933 
+    if (tw == 1.5       & sw == 0       & w0 == 2 *pi) slp <-  11.88006         # w = 15.39648 
+    if (tw == 3         & sw == 0       & w0 == 2 *pi) slp <-  26.55977         # w = 1.064384 
+    if (tw == 0         & sw == 5       & w0 == 2 *pi) slp <-  14.64761         # w = 16.27518 
+    if (tw == 1.5       & sw == 5       & w0 == 2 *pi) slp <-  28.27798         # w = 14.57059 
+    if (tw == 3         & sw == 5       & w0 == 2 *pi) slp <-  63.54121         # w = 12.83778 
+    if (tw == 0         & sw == 10      & w0 == 2 *pi) slp <-  27.78735         # w = 11.95813 
+    if (tw == 1.5       & sw == 10      & w0 == 2 *pi) slp <-  41.27260         # w = 12.03379 
+    if (tw == 3         & sw == 10      & w0 == 2 *pi) slp <-  67.37015         # w = 10.63935 
+    
+  }
+  
+  if (type==1){ # wavelet coherence
+    
+    if (tw==0   & sw==0   & w0==pi) slp <- 999 #not valid
+    if (tw==1.5 & sw==0   & w0==pi) slp <- 1
+    if (tw==3   & sw==0   & w0==pi) slp <- 1
+    if (tw==0   & sw==0.5 & w0==pi) slp <- 1
+    if (tw==1.5 & sw==0.5 & w0==pi) slp <- 1
+    if (tw==3   & sw==0.5 & w0==pi) slp <- 1
+    if (tw==0   & sw==1   & w0==pi) slp <- 1
+    if (tw==1.5 & sw==1   & w0==pi) slp <- 1
+    if (tw==3   & sw==1   & w0==pi) slp <- 1
+    
+    if (tw==0   & sw==0   & w0==2*pi) slp <- 999 #not valid
+    if (tw==1.5 & sw==0   & w0==2*pi) slp <- 1
+    if (tw==3   & sw==0   & w0==2*pi) slp <- 1
+    if (tw==0   & sw==0.5 & w0==2*pi) slp <- 1
+    if (tw==1.5 & sw==0.5 & w0==2*pi) slp <- 8.3
+    if (tw==3   & sw==0.5 & w0==2*pi) slp <- 1
+    if (tw==0   & sw==1   & w0==2*pi) slp <- 1
+    if (tw==1.5 & sw==1   & w0==2*pi) slp <- 1
+    if (tw==3   & sw==1   & w0==2*pi) slp <- 1
+    
+    if (tw==0   & sw==0   & w0==3*pi) slp <- 999 #not valid
+    if (tw==1.5 & sw==0   & w0==3*pi) slp <- 1
+    if (tw==3   & sw==0   & w0==3*pi) slp <- 1
+    if (tw==0   & sw==0.5 & w0==3*pi) slp <- 1
+    if (tw==1.5 & sw==0.5 & w0==3*pi) slp <- 1
+    if (tw==3   & sw==0.5 & w0==3*pi) slp <- 1
+    if (tw==0   & sw==1   & w0==3*pi) slp <- 1
+    if (tw==1.5 & sw==1   & w0==3*pi) slp <- 1
+    if (tw==3   & sw==1   & w0==3*pi) slp <- 1
+    
+    if (tw==0   & sw==0   & w0==4*pi) slp <- 999 #not valid
+    if (tw==1.5 & sw==0   & w0==4*pi) slp <- 1
+    if (tw==3   & sw==0   & w0==4*pi) slp <- 1
+    if (tw==0   & sw==0.5 & w0==4*pi) slp <- 1
+    if (tw==1.5 & sw==0.5 & w0==4*pi) slp <- 1
+    if (tw==3   & sw==0.5 & w0==4*pi) slp <- 1
+    if (tw==0   & sw==1   & w0==4*pi) slp <- 1
+    if (tw==1.5 & sw==1   & w0==4*pi) slp <- 1
+    if (tw==3   & sw==1   & w0==4*pi) slp <- 1
+    
+  }
+  
+  cat(paste("# slope ",slp,"\n",sep=""))
+  
+  slp
+  
+}
+
+#============================
+#============================
+#============================
+
+## 1. Read auxiliar data files ####
+
+identifiants <- read.table("identifs.txt")[ ,1]
+dates0       <- read.table("datesall.txt")[, 1]
+dates        <- as.character(dates0[grep("2009", dates0)])
+rm(dates0)
+
+n     <- length(identifiants)
+p <- delta <- length(dates)
+
+synchros09 <- t(as.matrix(read.table("~/tmp/2009_synchros200RC.txt")))
+#synchros09 <- t(as.matrix(read.table("~/tmp/2009_synchros200-random.txt")))
+
+nas <- which(is.na(synchros09)[, 1]) # some 1/1/2009 are missing
+synchros09[nas, 1] <- rowMeans(synchros09[nas, 2:4]) #valeurs après 1er janvier
+
+#moyenne pondérée pour compléter deux demi-heures manquantes
+imput09 <- synchros09[, 4180:4181] %*% matrix(c(2/3, 1/3, 1/3, 2/3), 2)
+synchros09 <- cbind(synchros09[, 1:4180], imput09, synchros09[, 4181:17518])
+
+conso <- synchros09[-201, ];  # series must be on rows 
+n     <- nrow(conso)
+delta <- ncol(conso)
+
+rm(synchros09, nas)
+
+## 2. Compute WER distance matrix ####
+
+## _.a CWT -- Filtering the lowest freqs (>6m) ####
+# nvoice   <- 4
+# # noctave4 = 2^13 = 8192 half hours ~ 180 days
+# noctave4 <- adjust.noctave(N = delta, dt = 1, s0 = 2,
+#                           tw = 0, noctave = 13)
+# # 4 here represent 2^5 = 32 half-hours ~ 1 day
+# scalevector4  <- 2^(4:(noctave4 * nvoice) / nvoice) * 2
+# lscvect4      <- length(scalevector4)
+# lscvect <- lscvect4  # i should clean my code: werFam demands a lscvect
+
+
+#17000 colonnes coeff 1, puis 17000 coeff 2... [non : dans chaque tranche du cube]
+
+#TODO: une fonction qui fait lignes 59 à 91
+
+#cube:
+# Xcwt4   <- toCWT(conso, noctave = noctave4, dt = 1,
+#                 scalevector = scalevector4,
+#                 lt = delta, smooth = FALSE, 
+#                 nvoice = nvoice)      # observations node with CWT
+# 
+# #matrix:
+# ############Xcwt2 <- matrix(0.0, nrow= n, ncol= 2 + delta * lscvect)
+# #Xcwt2 <- matrix(NA_complex_, nrow= n, ncol= 2 + length((c(Xcwt4[,,1]))))
+# 
+# #NOTE: delta et lscvect pourraient etre gardés à part (communs)
+# for(i in 1:n) 
+#  Xcwt2[i,] <- c(delta, lscvect, Xcwt4[,,i] / max(Mod(Xcwt4[,,i])) ) 
+# 
+# #rm(conso, Xcwt4); gc()
+# 
+# ## _.b WER^2 distances  ########
+# Xwer_dist    <- matrix(0.0, n, n)
+# for(i in 1:(n - 1)){
+#  mat1   <- vect2mat(Xcwt2[i,])
+#  for(j in (i + 1):n){
+#     mat2 <- vect2mat(Xcwt2[j,])
+#     num     <- Mod(mat1 * Conj(mat2))
+#     WX      <- Mod(mat1 * Conj(mat1))
+#     WY      <- Mod(mat2 * Conj(mat2))
+#     smsmnum <- smCWT(num, scalevector = scalevector4)
+#     smsmWX  <- smCWT(WX,  scalevector = scalevector4)
+#     smsmWY  <- smCWT(WY,  scalevector = scalevector4)
+#     wer2    <- sum(colSums(smsmnum)^2)  /
+#       sum( sum(colSums(smsmWX) * colSums(smsmWY)) )
+#     Xwer_dist[i, j] <- sqrt(delta * lscvect * (1 - wer2))
+#     Xwer_dist[j, i] <- Xwer_dist[i, j]
+#   }
+# }
+# diag(Xwer_dist) <- numeric(n)
+# 
+# save(Xwer_dist, file = "../res/2009_synchros200WER.Rdata")
+# save(Xwer_dist, file = "../res/2009_synchros200-randomWER.Rdata")
+
+load("../res/2009_synchros200WER.Rdata")
+#load("../res/2009_synchros200-randomWER.Rdata")
+
+## 3. Cluster using WER distance matrix ####
+#hc    <- hclust(as.dist(Xwer_dist), method = "ward.D")
+#plot(hc)
+# 
+# #clust <- cutree(hc, 2)
+# 
+for(K in 2:30){ 
+  #K <- 3
+  #pamfit <- pam(tdata[-201, ci$selectv], k = K)
+  pamfit <- pam(as.dist(Xwer_dist), k = K, diss = TRUE)
+  
+  #table(pamfit$clustering)
+
+  SC <- matrix(0, ncol = p, nrow = K)
+
+  clustfactor <- pamfit$clustering
+#  for(k in 1:K){ 
+#    clustk <- which(clustfactor == k)
+#  if(length(clustk) > 0) {
+#    if(length(clustk) > 1) {
+#      SCk <- colSums(synchros09[which(clustfactor == k), ])
+#      } else {
+#        SCk <- synchros09[which(clustfactor == k), ]
+#      }
+#      SC[k, ] <- SC[k, ] + SCk
+#      rm(SCk)
+#  }
+#}
+
+#write.table(clustfactor, file = paste0("~/tmp/clustfactorRC", K, ".txt"))
+#write.table(clustfactor, file = "~/tmp/clustfactor3.txt")
+#write.table(clustfactor, file = paste0("~/tmp/clustfactorWER", K, ".txt"))
+write.table(clustfactor, file = paste0("~/tmp/clustfactor-randomWER", K, ".txt"))
+}
+# 
+# # Plots
+# layout(1)
+# matplot(t(SC)[48*10 + 1:(48*30), ],  type = 'l', ylab = '',col = 1:3, lty = 1)
+# matplot(t(SC)[48*100 + 1:(48*30), ], type = 'l', ylab = '', col = 1:3, lty = 1)
+# 
+# 
+# 
diff --git a/temp/wave.m b/temp/wave.m
new file mode 100644 (file)
index 0000000..ce4f1f0
--- /dev/null
@@ -0,0 +1,113 @@
+t = 1:128
+
+n=length(t);
+
+%----------default arguments for the wavelet transform-----------
+Args=struct('Pad',1,...      % pad the time series with zeroes (recommended)
+            'Dj',1/12, ...    % this will do 12 sub-octaves per octave
+            'S0',2*dt,...    % this says start at a scale of 2 years
+            'J1',[],...
+            'Mother','Morlet', ...
+            'MaxScale',[],...   %a more simple way to specify J1
+
+J1 = noctave * nvoice - 1
+
+nx=size(x,1);
+ny=size(y,1);
+
+[X,period,scale] = wavelet(x,Args.Dj,Args.S0,Args.J1);
+[Y,period,scale] = wavelet(y,Args.Dj,Args.S0,Args.J1);
+
+
+
+
+
+## pad with 0 ?
+## compare Rwave and biwavelets
+x = runif(128) #runif(100)
+w1 = wt(cbind(1:128,x), pad = TRUE, dt = NULL, do.sig=FALSE, dj=1/12, J1=51)
+w2 = Rwave::cwt(x, 13, 4, w0=2*pi, twoD=TRUE, plot=FALSE)
+
+
+
+
+
+
+
+
+%Smooth X and Y before truncating!  (minimize coi)
+sinv=1./(scale');
+sX=smoothwavelet(sinv(:,ones(1,nx)).*(abs(X).^2),dt,period,Args.Dj,scale);
+sY=smoothwavelet(sinv(:,ones(1,ny)).*(abs(Y).^2),dt,period,Args.Dj,scale);
+
+% -------- Cross wavelet -------
+Wxy=X.*conj(Y);
+
+% ----------------------- Wavelet coherence ---------------------------------
+sWxy=smoothwavelet(sinv(:,ones(1,n)).*Wxy,dt,period,Args.Dj,scale);
+
+%%%%%% SMOOTHWAVELET
+n=size(wave,2);
+
+%swave=zeros(size(wave));
+twave=zeros(size(wave));
+
+%zero-pad to power of 2... Speeds up fft calcs if n is large
+npad=2.^ceil(log2(n));
+
+k = 1:fix(npad/2);
+k = k.*((2.*pi)/npad);
+k = [0., k, -k(fix((npad-1)/2):-1:1)];
+
+k2=k.^2;
+snorm=scale./dt;
+for ii=1:size(wave,1)
+    F=exp(-.5*(snorm(ii)^2)*k2); %Thanks to Bing Si for finding a bug here.
+    smooth=ifft(F.*fft(wave(ii,:),npad));
+    twave(ii,:)=smooth(1:n);
+end
+
+if isreal(wave)
+    twave=real(twave); %-------hack-----------
+end
+
+%scale smoothing (boxcar with width of .6)
+
+%
+% TODO: optimize. Because this is done many times in the monte carlo run.
+%
+
+
+dj0=0.6;
+dj0steps=dj0/(dj*2);
+% for ii=1:size(twave,1)
+%     number=0;
+%     for l=1:size(twave,1);
+%         if ((abs(ii-l)+.5)<=dj0steps)
+%             number=number+1;
+%             swave(ii,:)=swave(ii,:)+twave(l,:);
+%         elseif ((abs(ii-l)+.5)<=(dj0steps+1))
+%             fraction=mod(dj0steps,1);
+%             number=number+fraction;
+%             swave(ii,:)=swave(ii,:)+twave(l,:)*fraction;
+%         end
+%     end
+%     swave(ii,:)=swave(ii,:)/number;
+% end
+
+kernel=[mod(dj0steps,1); ones(2 * round(dj0steps)-1,1); ...
+   mod(dj0steps,1)]./(2*round(dj0steps)-1+2*mod(dj0steps,1));
+swave=conv2(twave,kernel,'same'); %thanks for optimization by Uwe Graichen
+
+
+
+
+
+
+
+
+Rsq=abs(sWxy).^2./(sX.*sY);
+return Rsq
+
+%varargout={Rsq,period,scale,coi,wtcsig,t};
+%varargout=varargout(1:nargout);