From 7afe6083a7ec16858cd37b9e9d1faa4b56d49eb9 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Mon, 2 Sep 2019 00:30:39 +0300 Subject: [PATCH 01/35] enable testing again. but cmake does not find check on mac os x --- liboptv/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/liboptv/CMakeLists.txt b/liboptv/CMakeLists.txt index 2ad9312d..d51f7c3b 100644 --- a/liboptv/CMakeLists.txt +++ b/liboptv/CMakeLists.txt @@ -4,9 +4,9 @@ set (CMAKE_INSTALL_RPATH "$ORIGIN/../lib:$ORIGIN/") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/") project(OpenPTV) -# enable_testing() +enable_testing() add_subdirectory(src) -# add_subdirectory(tests) +add_subdirectory(tests) INSTALL(DIRECTORY include/ DESTINATION include/optv/) From 010ff0a8c6fd61de86bcb4be056981a67d4d1312 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Mon, 2 Sep 2019 00:43:51 +0300 Subject: [PATCH 02/35] frame_init is not init_frame :) --- liboptv/src/tracking_frame_buf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liboptv/src/tracking_frame_buf.c b/liboptv/src/tracking_frame_buf.c index b2370fd4..62236416 100644 --- a/liboptv/src/tracking_frame_buf.c +++ b/liboptv/src/tracking_frame_buf.c @@ -423,7 +423,7 @@ int write_path_frame(corres *cor_buf, P *path_buf, int num_parts,\ return success; } -/* init_frame() initializes a frame object, allocates its arrays and sets up +/* frame_init() initializes a frame object, allocates its arrays and sets up * the frame data. * * Arguments: From 7be62326630e32e25c28291117b41ed0c96ea023 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Mon, 2 Sep 2019 20:12:06 +0300 Subject: [PATCH 03/35] prepared some structure of what I'd like to do now So if we could start tracking without reading from files it means that we can prepare the buffer before tracking during the separate steps of the algorithm and then we need still to replace the fb_next and read_frame and so on by fb_load or something like this? or maybe all is not necessary - we like give tracker the prio from the previous chunk and let it run like for the first time every time, not continuosly and not membering anything backwards. so we are now will be limited to run tracking only to the size of the buffer itself. not a nice one. if we want to have 10 frames and track using our 4-step algorithm, then we have to create functions that are reading from some memory, fill and advance the buffer in these 10 frames. --- liboptv/include/main.h | 6 ++++++ liboptv/src/main.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 liboptv/include/main.h create mode 100644 liboptv/src/main.c diff --git a/liboptv/include/main.h b/liboptv/include/main.h new file mode 100644 index 00000000..6b0da583 --- /dev/null +++ b/liboptv/include/main.h @@ -0,0 +1,6 @@ +#include +#include +#include + +#include "tracking_run.h" +#include "parameters.h" \ No newline at end of file diff --git a/liboptv/src/main.c b/liboptv/src/main.c new file mode 100644 index 00000000..461c3728 --- /dev/null +++ b/liboptv/src/main.c @@ -0,0 +1,40 @@ +/* main.c +I need this file to start preparing some structure in my head. Alex +*/ + + +int main( int argc, const char* argv[] ) +{ + printf( "\nHello liboptv World\n\n" ); + + // read parameters from the working directory + // for simplicity all names are default and hard coded (sorry) + + + // initialize memory buffers + + for (step = 0; step < N_FRAMES_IN_DIRECTORY-BUFFER_LENGTH-1; step+BUFFER_LENGTH){ + // MAIN LOOP + + // image segmentation of this step and 4 steps forward + for (i = 0; i Date: Mon, 2 Sep 2019 20:56:00 +0300 Subject: [PATCH 04/35] ok, i found opentv_batch repository were we already tried to do something in C and failed. probably it was just me :) --- liboptv/include/main.h | 26 +++++++++++- liboptv/src/main.c | 96 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 117 insertions(+), 5 deletions(-) diff --git a/liboptv/include/main.h b/liboptv/include/main.h index 6b0da583..49ae8abc 100644 --- a/liboptv/include/main.h +++ b/liboptv/include/main.h @@ -1,6 +1,28 @@ +#ifndef main_h + #include #include +#include +#include +#include #include +#include +#include "tiffio.h" + +#include "parameters.h" +#include "track.h" +#include "image_processing.h" +#include "segmentation.h" +#include "tracking_frame_buf.h" +#include "calibration.h" +#include "vec_utils.h" +#include "imgcoord.h" +#include "trafo.h" +#include "correspondences.h" + + + +#define main_h + -#include "tracking_run.h" -#include "parameters.h" \ No newline at end of file +#endif /* main_h */ \ No newline at end of file diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 461c3728..e1761728 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -2,19 +2,109 @@ I need this file to start preparing some structure in my head. Alex */ +#define MAXTARGETS 2048 +#define BUFFER_LENGTH 4 // we do something very simple and studpid here +#include "main.h" int main( int argc, const char* argv[] ) { - printf( "\nHello liboptv World\n\n" ); + // initialize variables + + int i, ntargets; + // DIR *dirp; + // struct dirent *dp; + char file_name[256]; + int step; + unsigned char *img, *img_hp; + target pix[MAXTARGETS], targ_t[MAXTARGETS]; + coord_2d **corrected; + int match_counts[4]; + frame frm; + // read parameters from the working directory // for simplicity all names are default and hard coded (sorry) + + + // 1. process inputs: directory, first frame, last frame + + printf ("This program was called with \"%s\".\n",argv[0]); + + if (argc != 2 && argc != 4) + { + printf("Wrong number of inputs, expecting: \n"); + printf(" ./openptv test_cavity \n"); + printf(" or \n"); + printf(" ./openptv test_cavity 10000 10004 \n"); + return 0; + } + + // change directory to the user-supplied working folder + chdir(argv[1]); + + // 2. read parameters and calibrations + Calibration *calib[4]; // sorry only for 4 cameras now + + control_par *cpar = read_control_par("parameters/ptv.par"); + read_all_calibration(calib, cpar->num_cams); + free_control_par(cpar); + + tracking_run *run = tr_new_legacy("parameters/sequence.par", + "parameters/track.par", "parameters/criteria.par", + "parameters/ptv.par", calib); + + if (argc == 4) + { + run->seq_par->first = atoi(argv[2]); + run->seq_par->last = atoi(argv[3]); + } + printf("from frame %d to frame %d \n", run->seq_par->first, run->seq_par->last); + + target_par *targ_read = read_target_par("parameters/targ_rec.par"); // initialize memory buffers - for (step = 0; step < N_FRAMES_IN_DIRECTORY-BUFFER_LENGTH-1; step+BUFFER_LENGTH){ - // MAIN LOOP + // for (step = 0; step < N_FRAMES_IN_DIRECTORY-BUFFER_LENGTH-1; step+BUFFER_LENGTH){ + // MAIN LOOP - see below we will just give inputs of 10000 10004 as a very simple approach + + // for each camera and for each time step the images are processed + for (step = run->seq_par->first; step < run->seq_par->last+1; step++) { + // prepare frame for correspondences, see below below image segmentation + frame_init(&frm, run->cpar->num_cams, MAXTARGETS); + + for (i = 1; icpar->num_cams+1; i++) { + + // a. read image + sprintf(file_name, "img/cam%d.%d", i, step); + img = (unsigned char *) malloc(run->cpar->imx*run->cpar->imy* \ + sizeof(unsigned char)); + img_hp = (unsigned char *) malloc(run->cpar->imx*run->cpar->imy* \ + sizeof(unsigned char)); + imread(img, file_name); + // b. highpass + if (run->cpar->hp_flag) + { + prepare_image(img, img_hp, 1, 0, 0, run->cpar); + } else { + memcpy(img_hp, img, run->cpar->imx*run->cpar->imy); + } + free(img); + free(img_hp); + // c. segmentation + // detection + //ntargets = peak_fit(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); + ntargets = targ_rec(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); + // here we fill the frame with the targets for the next step - correspondence + frm.num_targets[i] = ntargets; + frm.targets[i] = targ_t; + } // inner loop is camera + + correspondences(&frm, corrected, run->vpar, run->cpar, calib, match_counts); + + } // external loop is frames + + // image segmentation of this step and 4 steps forward for (i = 0; i Date: Mon, 2 Sep 2019 21:06:26 +0300 Subject: [PATCH 05/35] ok structure gets some shape, follow WORK HERE --- liboptv/src/main.c | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index e1761728..8545506d 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -101,30 +101,34 @@ int main( int argc, const char* argv[] ) } // inner loop is camera correspondences(&frm, corrected, run->vpar, run->cpar, calib, match_counts); + // so here is missing frame into run->frame ? + // WORK HERE - } // external loop is frames + } // external loop is through frames + // ok, theoretically we have now a buffer full of stuff from 4 frames + // it's a good buffer on which we can just track stuff + // and then we need to jump to a next chunk, remove all and start over. + // the missing part is how to "chain the chunks" or make a smart use of + // memory and buffers, it's beyond me now + track_forward_start(run); - // image segmentation of this step and 4 steps forward - for (i = 0; iseq_par->first; step < run->seq_par->last; step++) { + trackcorr_c_loop(run, step); + } + trackcorr_c_finish(run, run->seq_par->last); + // probably here we need to send something to plot it + // or store in some memory for the next chunk? + // basically we have a human in the loop here - his/her brain + // will simply follow the velocity values in time like a movie + // and we will store it to binary files. Later if someone wants to do + // tracking, our simmple solution is not good enough. we kind of doing 3D-PIV here + // of 4 frames and show the vectors. The quasi-vectors are not really connected. if we + // will create nice animation - then the user will build trajectories him/herself. - // 3d triangulation of this frame - // fill buffer of 3d positions - } - // apparently all the buffers are full and we can just start tracking - // fill buffer with path_info (path is a trajectory) - // plot and move to the next chunk, jump 4 frames forward and do it again - } -} \ No newline at end of file + return 0; + + +} // should be end of main now \ No newline at end of file From 23b648993b9afc53c633bcdbb41d0f42a1c53758 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Mon, 2 Sep 2019 21:24:30 +0300 Subject: [PATCH 06/35] ok we need to learn from read_frame how to fill in the buffers for tracking_run --- liboptv/src/main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 8545506d..dd87c5bf 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -19,7 +19,8 @@ int main( int argc, const char* argv[] ) target pix[MAXTARGETS], targ_t[MAXTARGETS]; coord_2d **corrected; int match_counts[4]; - frame frm; + n_tupel *con; // for correspondences + frame *frm; // read parameters from the working directory @@ -99,8 +100,9 @@ int main( int argc, const char* argv[] ) frm.num_targets[i] = ntargets; frm.targets[i] = targ_t; } // inner loop is camera - - correspondences(&frm, corrected, run->vpar, run->cpar, calib, match_counts); + frm = generate_test_set(calib, cpar, vpar); + // corrected = correct_frame(frm, calib, cpar, 0.0001); + con = correspondences(frm, corrected, run->vpar, run->cpar, calib, match_counts); // so here is missing frame into run->frame ? // WORK HERE From 458d68a50b3d90d282190e6ed27956c06468d661 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Mon, 2 Sep 2019 21:41:55 +0300 Subject: [PATCH 07/35] small step forward with run->fb->buf[] --- liboptv/src/main.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index dd87c5bf..e68a732a 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -20,7 +20,8 @@ int main( int argc, const char* argv[] ) coord_2d **corrected; int match_counts[4]; n_tupel *con; // for correspondences - frame *frm; + frame frm; + tracking_run *run; // read parameters from the working directory @@ -100,11 +101,11 @@ int main( int argc, const char* argv[] ) frm.num_targets[i] = ntargets; frm.targets[i] = targ_t; } // inner loop is camera - frm = generate_test_set(calib, cpar, vpar); // corrected = correct_frame(frm, calib, cpar, 0.0001); - con = correspondences(frm, corrected, run->vpar, run->cpar, calib, match_counts); + con = correspondences(&frm, corrected, run->vpar, run->cpar, calib, match_counts); // so here is missing frame into run->frame ? // WORK HERE + run->fb->buf[step] } // external loop is through frames @@ -114,9 +115,11 @@ int main( int argc, const char* argv[] ) // the missing part is how to "chain the chunks" or make a smart use of // memory and buffers, it's beyond me now - track_forward_start(run); - for (step = run->seq_par->first; step < run->seq_par->last; step++) { + run->tpar->add = 0; + track_forward_start(run); + + for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) { trackcorr_c_loop(run, step); } trackcorr_c_finish(run, run->seq_par->last); @@ -130,6 +133,16 @@ int main( int argc, const char* argv[] ) // of 4 frames and show the vectors. The quasi-vectors are not really connected. if we // will create nice animation - then the user will build trajectories him/herself. + + /* Clean up */ + for (cam = 0; cam < cpar->num_cams; cam++) + free(corrected[cam]); + deallocate_adjacency_lists(list, cpar->num_cams); + deallocate_target_usage_marks(tusage, cpar->num_cams); + free(con); + free(run->vpar); + free_control_par(run->cpar); + return 0; From 2e44bcde85dbf371ba599d30d58023f7373ae740 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Mon, 2 Sep 2019 21:54:59 +0300 Subject: [PATCH 08/35] filling the structure is difficult when you don't understand the structure --- liboptv/src/main.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index e68a732a..27077e8e 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -20,7 +20,6 @@ int main( int argc, const char* argv[] ) coord_2d **corrected; int match_counts[4]; n_tupel *con; // for correspondences - frame frm; tracking_run *run; @@ -96,16 +95,14 @@ int main( int argc, const char* argv[] ) // c. segmentation // detection //ntargets = peak_fit(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); - ntargets = targ_rec(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); + run->fb->buf[step]->num_targets[i] = targ_rec(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); // here we fill the frame with the targets for the next step - correspondence - frm.num_targets[i] = ntargets; - frm.targets[i] = targ_t; + run->fb->buf[step]->targets[i] = targ_t; } // inner loop is camera // corrected = correct_frame(frm, calib, cpar, 0.0001); - con = correspondences(&frm, corrected, run->vpar, run->cpar, calib, match_counts); + con = correspondences(run->fb->buf[step], corrected, run->vpar, run->cpar, calib, match_counts); // so here is missing frame into run->frame ? // WORK HERE - run->fb->buf[step] } // external loop is through frames @@ -118,7 +115,7 @@ int main( int argc, const char* argv[] ) run->tpar->add = 0; track_forward_start(run); - + for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) { trackcorr_c_loop(run, step); } From 12a855c431c78c63c379aeb160221a20849542fb Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Mon, 2 Sep 2019 21:56:10 +0300 Subject: [PATCH 09/35] trying to fill in teh buffers on the fly. --- liboptv/src/main.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 27077e8e..f5db76fc 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -71,9 +71,6 @@ int main( int argc, const char* argv[] ) // for each camera and for each time step the images are processed for (step = run->seq_par->first; step < run->seq_par->last+1; step++) { - // prepare frame for correspondences, see below below image segmentation - frame_init(&frm, run->cpar->num_cams, MAXTARGETS); - for (i = 1; icpar->num_cams+1; i++) { // a. read image @@ -95,11 +92,9 @@ int main( int argc, const char* argv[] ) // c. segmentation // detection //ntargets = peak_fit(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); - run->fb->buf[step]->num_targets[i] = targ_rec(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); - // here we fill the frame with the targets for the next step - correspondence - run->fb->buf[step]->targets[i] = targ_t; + run->fb->buf[step]->num_targets[i] = targ_rec(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, run->fb->buf[step]->targets[i]); } // inner loop is camera - // corrected = correct_frame(frm, calib, cpar, 0.0001); + corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); con = correspondences(run->fb->buf[step], corrected, run->vpar, run->cpar, calib, match_counts); // so here is missing frame into run->frame ? // WORK HERE From dfc7b1f08d5212e9159e84686ece4bfdde947ddd Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Tue, 3 Sep 2019 08:59:56 +0300 Subject: [PATCH 10/35] do i keep match_counts[3]? --- liboptv/src/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index f5db76fc..82dcf4e6 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -96,6 +96,7 @@ int main( int argc, const char* argv[] ) } // inner loop is camera corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); con = correspondences(run->fb->buf[step], corrected, run->vpar, run->cpar, calib, match_counts); + run->fb->buf[step]->num_parts = match_counts[3]; // sum of all matches? // so here is missing frame into run->frame ? // WORK HERE From 680ac8c2a33023932a879f33ddc00d777aee6b07 Mon Sep 17 00:00:00 2001 From: Yosef Meller Date: Fri, 6 Sep 2019 11:50:09 +0300 Subject: [PATCH 11/35] Separate frame-buffer to a base class and child class. --- liboptv/CMakeLists.txt | 4 +- liboptv/include/tracking_frame_buf.h | 70 ++++++++++++++-- liboptv/include/tracking_run.h | 2 +- liboptv/src/track.c | 4 +- liboptv/src/tracking_frame_buf.c | 116 ++++++++++++++++++--------- liboptv/src/tracking_run.c | 4 +- 6 files changed, 150 insertions(+), 50 deletions(-) diff --git a/liboptv/CMakeLists.txt b/liboptv/CMakeLists.txt index 2ad9312d..d51f7c3b 100644 --- a/liboptv/CMakeLists.txt +++ b/liboptv/CMakeLists.txt @@ -4,9 +4,9 @@ set (CMAKE_INSTALL_RPATH "$ORIGIN/../lib:$ORIGIN/") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/") project(OpenPTV) -# enable_testing() +enable_testing() add_subdirectory(src) -# add_subdirectory(tests) +add_subdirectory(tests) INSTALL(DIRECTORY include/ DESTINATION include/optv/) diff --git a/liboptv/include/tracking_frame_buf.h b/liboptv/include/tracking_frame_buf.h index 15de6ea3..fa2a8f70 100644 --- a/liboptv/include/tracking_frame_buf.h +++ b/liboptv/include/tracking_frame_buf.h @@ -82,11 +82,72 @@ int write_frame(frame *self, char *corres_file_base, char *linkage_file_base, char *prio_file_base, char **target_file_base, int frame_num); +/* + * Following is the frame buffer class, that holds a given number of frame structs, + * and treats them as a deque (doube-ended queue, a queue that can advance forward + * or backward). + * + * The memory locations are advanced with fb_next()/fb_prev(). Filling out the new + * frame that joined the queue and flushing out the frame that exited the queue + * are respectively done using fb_read_frame_at_end() and fb_write_frame_from_start(). + * + * To make it possible to read frames from different sources, we use a + * base-class/child-class structure. framebuf_base is the base class, and implements + * only the memory-advance methods. The filling-out of frames is done by + * "virtual" functions. That is to say, fb_read_frame_at_end, for example, + * only forwards the call to a function that really reads the data. + * + * The virtual functions are placed in the "vtable" by the constructor - the + * function that allocates and populates the child class. + * + * In tracking_framebuf.c and here there's an example child-class that reads + * frame information from *_target files. This is the original mode of + * liboptv. The struct framebuf *inherits* from framebuf_base (by incorporating + * the base as 1st member - the order is important). fb_init(), the constructor, + * then populates the vtable with fb_disk_* functions. These are the derived + * implementations of the base-class virtual functions. + * + * There is also a virtual destructor, fb_free(), which delegates to the free() + * virtual function, and implemented in the example by fb_disk_free(). + * + * Note: fb_disk_free does not release the strings it holds, as I don't remember if + * it owns them. + * + * Yes, in C++ it's easier :) + */ + +// Virtual function table definitions for frame buffer objects: +typedef struct framebuf_base* fbp; typedef struct { + void (*free)(fbp self); + int (*read_frame_at_end)(fbp self, int frame_num, int read_links); + int (*write_frame_from_start)(fbp self, int frame_num); +} fb_vtable; + +typedef struct framebuf_base { + fb_vtable *_vptr; + /* _ring_vec is the underlying double-size vector, buf is the pointer to the start of the ring. */ frame **buf, **_ring_vec; int buf_len, num_cams; +} framebuf_base; + +// These just call the corresponding virtual function. +// Actual implementations are below each child class. +void fb_free(framebuf_base *self); +int fb_read_frame_at_end(framebuf_base *self, int frame_num, int read_links); +int fb_write_frame_from_start(framebuf_base *self, int frame_num); + +// Non-virtual methods of the base class. +void fb_base_init(framebuf_base *new_buf, int buf_len, int num_cams, int max_targets); +void fb_next(framebuf_base *self); +void fb_prev(framebuf_base *self); + +// child class that reads from _target files. +typedef struct { + framebuf_base base; // must be 1st member. + char *corres_file_base, *linkage_file_base, *prio_file_base; char **target_file_base; } framebuf; @@ -94,10 +155,9 @@ typedef struct { void fb_init(framebuf *new_buf, int buf_len, int num_cams, int max_targets,\ char *corres_file_base, char* linkage_file_base, char *prio_file_base, char **target_file_base); -void fb_free(framebuf *self); -void fb_next(framebuf *self); -void fb_prev(framebuf *self); -int fb_read_frame_at_end(framebuf *self, int frame_num, int read_links); -int fb_write_frame_from_start(framebuf *self, int frame_num); + +void fb_disk_free(framebuf_base *self); +int fb_disk_read_frame_at_end(framebuf_base *self, int frame_num, int read_links); +int fb_disk_write_frame_from_start(framebuf_base *self, int frame_num); #endif diff --git a/liboptv/include/tracking_run.h b/liboptv/include/tracking_run.h index 8e935afd..6cc6e146 100644 --- a/liboptv/include/tracking_run.h +++ b/liboptv/include/tracking_run.h @@ -12,7 +12,7 @@ #include "tracking_frame_buf.h" typedef struct { - framebuf *fb; + framebuf_base *fb; sequence_par *seq_par; track_par *tpar; volume_par *vpar; diff --git a/liboptv/src/track.c b/liboptv/src/track.c index a720c918..55b2df75 100644 --- a/liboptv/src/track.c +++ b/liboptv/src/track.c @@ -681,7 +681,7 @@ void trackcorr_c_loop (tracking_run *run_info, int step) { /* Shortcuts into the tracking_run struct */ Calibration **cal; - framebuf *fb; + framebuf_base *fb; track_par *tpar; volume_par *vpar; control_par *cpar; @@ -1002,7 +1002,7 @@ double trackback_c (tracking_run *run_info) track_par *tpar; volume_par *vpar; control_par *cpar; - framebuf *fb; + framebuf_base *fb; Calibration **cal; /* Shortcuts to inside current frame */ diff --git a/liboptv/src/tracking_frame_buf.c b/liboptv/src/tracking_frame_buf.c index b2370fd4..a75b4c6e 100644 --- a/liboptv/src/tracking_frame_buf.c +++ b/liboptv/src/tracking_frame_buf.c @@ -556,33 +556,26 @@ int write_frame(frame *self, char *corres_file_base, char *linkage_file_base, return 1; } -/* fb_init() allocates a frame buffer object and creates the frames - * it buffers. The buffer is a ring-buffer based on a double-size vector. - * - * Arguments: - * int buf_len - number of frames in the buffer. - * int num_cams - number of cameras per frame. - * int max_targets - number of elements to allocate for the different buffers - * held by a frame. - * char *rt_file_base - * - * Returns: - * a pointer to the new dynamically allocated frame-buffer structure. - */ +// ----- Virtual functions redirection -void fb_init(framebuf *new_buf, int buf_len, int num_cams, int max_targets,\ - char *corres_file_base, char *linkage_file_base, char *prio_file_base, - char **target_file_base) -{ +void fb_free(framebuf_base *self) { + self->_vptr->free(self); +} + +int fb_read_frame_at_end(framebuf_base *self, int frame_num, int read_links) { + return self->_vptr->read_frame_at_end(self, frame_num, read_links); +} + +int fb_write_frame_from_start(framebuf_base *self, int frame_num) { + return self->_vptr->write_frame_from_start(self, frame_num); +} + +void fb_base_init(framebuf_base *new_buf, int buf_len, int num_cams, int max_targets) { frame *alloc_frame; - + new_buf->buf_len = buf_len; new_buf->num_cams = num_cams; - new_buf->corres_file_base = corres_file_base; - new_buf->linkage_file_base = linkage_file_base; - new_buf->prio_file_base = prio_file_base; - new_buf->target_file_base = target_file_base; - + new_buf->_ring_vec = (frame **) calloc(buf_len*2, sizeof(frame *)); new_buf->buf = new_buf->_ring_vec + buf_len; @@ -600,15 +593,11 @@ void fb_init(framebuf *new_buf, int buf_len, int num_cams, int max_targets,\ } /* Leaves new_buf->buf pointing to the beginning of _ring_vec, which is what we want. */ + + new_buf->_vptr = (fb_vtable*) malloc(sizeof(fb_vtable)); } -/* fb_free() frees all memory allocated for the frames and ring vector in a - * framebuf object. - * - * Arguments: - * framebuf *self - the framebuf holding the memory to free. - */ -void fb_free(framebuf *self) { +void fb_base_free(framebuf_base *self) { self->buf = self->_ring_vec; while (self->buf != self->_ring_vec + self->buf_len) { @@ -620,6 +609,53 @@ void fb_free(framebuf *self) { free(self->_ring_vec); self->_ring_vec = NULL; + + free(self->_vptr); + self->_vptr = NULL; +} + +// -------- Specific Implementations of virtual functions. + +/* fb_init() allocates a frame buffer object and creates the frames + * it buffers. The buffer is a ring-buffer based on a double-size vector. + * + * Arguments: + * int buf_len - number of frames in the buffer. + * int num_cams - number of cameras per frame. + * int max_targets - number of elements to allocate for the different buffers + * held by a frame. + * char *rt_file_base + * + * Returns: + * a pointer to the new dynamically allocated frame-buffer structure. + */ + +void fb_init(framebuf *new_buf, int buf_len, int num_cams, int max_targets,\ + char *corres_file_base, char *linkage_file_base, char *prio_file_base, + char **target_file_base) +{ + fb_base_init(&new_buf->base, buf_len, num_cams, max_targets); + + // Subclass-specific parameters: + new_buf->corres_file_base = corres_file_base; + new_buf->linkage_file_base = linkage_file_base; + new_buf->prio_file_base = prio_file_base; + new_buf->target_file_base = target_file_base; + + // Set up the virtual functions table: + new_buf->base._vptr->free = fb_disk_free; + new_buf->base._vptr->read_frame_at_end = fb_disk_read_frame_at_end; + new_buf->base._vptr->write_frame_from_start = fb_disk_write_frame_from_start; +} + +/* fb_free() frees all memory allocated for the frames and ring vector in a + * framebuf object. + * + * Arguments: + * framebuf *self - the framebuf holding the memory to free. + */ +void fb_disk_free(framebuf_base *self_base) { + fb_base_free(self_base); } /* fb_next() advances the start pointer of the frame buffer, resetting it to the @@ -628,7 +664,7 @@ void fb_free(framebuf *self) { * Arguments: * framebuf *self - the framebuf to advance. */ -void fb_next(framebuf *self) { +void fb_next(framebuf_base *self) { self->buf++; if (self->buf - self->_ring_vec >= self->buf_len) self->buf = self->_ring_vec; @@ -640,7 +676,7 @@ void fb_next(framebuf *self) { * Arguments: * framebuf *self - the framebuf to advance. */ -void fb_prev(framebuf *self) { +void fb_prev(framebuf_base *self) { self->buf--; if (self->buf < self->_ring_vec) self->buf = self->_ring_vec + self->buf_len - 1; @@ -656,13 +692,15 @@ void fb_prev(framebuf *self) { * Returns: * True on success, false on failure. */ -int fb_read_frame_at_end(framebuf *self, int frame_num, int read_links) { +int fb_disk_read_frame_at_end(framebuf_base *self_base, int frame_num, int read_links) { + framebuf* self = (framebuf*)self_base; + if (read_links) { - return read_frame(self->buf[self->buf_len - 1], self->corres_file_base, + return read_frame(self->base.buf[self->base.buf_len - 1], self->corres_file_base, self->linkage_file_base, self->prio_file_base, self->target_file_base, frame_num); } else { - return read_frame(self->buf[self->buf_len - 1], self->corres_file_base, + return read_frame(self->base.buf[self->base.buf_len - 1], self->corres_file_base, NULL, NULL, self->target_file_base, frame_num); } } @@ -670,14 +708,16 @@ int fb_read_frame_at_end(framebuf *self, int frame_num, int read_links) { /* fb_write_frame_from_start() writes the frame to the first position in the ring. * * Arguments: - * framebuf *self - the framebuf object doing the reading. + * *self - the framebuf object doing the reading. * int frame_num - number of the frame to write in the sequence of frames. * * Returns: * True on success, false on failure. */ -int fb_write_frame_from_start(framebuf *self, int frame_num) { - return write_frame(self->buf[0], self->corres_file_base, +int fb_disk_write_frame_from_start(framebuf_base *self_base, int frame_num) { + framebuf* self = (framebuf*)self_base; + + return write_frame(self->base.buf[0], self->corres_file_base, self->linkage_file_base, self->prio_file_base, self->target_file_base, frame_num); } diff --git a/liboptv/src/tracking_run.c b/liboptv/src/tracking_run.c index cb19bed2..8c983ae2 100644 --- a/liboptv/src/tracking_run.c +++ b/liboptv/src/tracking_run.c @@ -60,8 +60,8 @@ tracking_run *tr_new(sequence_par *seq_par, track_par *tpar, tr->cal = cal; tr->flatten_tol = flatten_tol; - tr->fb = (framebuf *) malloc(sizeof(framebuf)); - fb_init(tr->fb, buf_len, cpar->num_cams, max_targets, + tr->fb = (framebuf_base*) malloc(sizeof(framebuf)); + fb_init((framebuf*)tr->fb, buf_len, cpar->num_cams, max_targets, corres_file_base, linkage_file_base, prio_file_base, seq_par->img_base_name); tr->lmax = norm((tpar->dvxmin - tpar->dvxmax), \ From a4743c7237c064eda2db38c9396328b7d62ed8f1 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Fri, 20 Sep 2019 07:57:31 +0300 Subject: [PATCH 12/35] release img later - @yosefm remark release img later --- liboptv/src/main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 82dcf4e6..3b823ff6 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -87,12 +87,14 @@ int main( int argc, const char* argv[] ) } else { memcpy(img_hp, img, run->cpar->imx*run->cpar->imy); } - free(img); - free(img_hp); // c. segmentation // detection //ntargets = peak_fit(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); run->fb->buf[step]->num_targets[i] = targ_rec(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, run->fb->buf[step]->targets[i]); + + // release temporary memory + free(img); + free(img_hp); } // inner loop is camera corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); con = correspondences(run->fb->buf[step], corrected, run->vpar, run->cpar, calib, match_counts); From 130ac7679d2aec3438a02935dcff939225cd3ff4 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Fri, 20 Sep 2019 21:46:30 +0300 Subject: [PATCH 13/35] added two helper functions from tests and downloaded libtiff 4.010 https://download.osgeo.org/libtiff/ --- liboptv/src/main.c | 77 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 9 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 3b823ff6..66bfe027 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -6,6 +6,65 @@ I need this file to start preparing some structure in my head. Alex #define BUFFER_LENGTH 4 // we do something very simple and studpid here #include "main.h" +// These functions are part of the a test suite, see under /tests + +void read_all_calibration(Calibration *calib[4], control_par *cpar) { + char ori_tmpl[] = "testing_fodder/cal/sym_cam%d.tif.ori"; + char added_name[] = "testing_fodder/cal/cam1.tif.addpar"; + char ori_name[40]; + int cam; + + for (cam = 0; cam < cpar->num_cams; cam++) { + sprintf(ori_name, ori_tmpl, cam + 1); + calib[cam] = read_calibration(ori_name, added_name, NULL); + } +} + +/* correct_frame() performs the transition from pixel to metric to flat + coordinates and x-sorting as required by the correspondence code. + + Arguments: + frame *frm - target information for all cameras. + control_par *cpar - parameters of image size, pixel size etc. + tol - tolerance parameter for iterative flattening phase, see + trafo.h:correct_brown_affine_exact(). +*/ +coord_2d **correct_frame(frame *frm, Calibration *calib[], control_par *cpar, + double tol) +{ + coord_2d **corrected; + int cam, part; + + corrected = (coord_2d **) malloc(cpar->num_cams * sizeof(coord_2d *)); + for (cam = 0; cam < cpar->num_cams; cam++) { + corrected[cam] = (coord_2d *) malloc( + frm->num_targets[cam] * sizeof(coord_2d)); + if (corrected[cam] == NULL) { + /* roll back allocations and fail */ + for (cam -= 1; cam >= 0; cam--) free(corrected[cam]); + free(corrected); + return NULL; + } + + for (part = 0; part < frm->num_targets[cam]; part++) { + pixel_to_metric(&corrected[cam][part].x, &corrected[cam][part].y, + frm->targets[cam][part].x, frm->targets[cam][part].y, + cpar); + + dist_to_flat(corrected[cam][part].x, corrected[cam][part].y, + calib[cam], &corrected[cam][part].x, &corrected[cam][part].y, + tol); + + corrected[cam][part].pnr = frm->targets[cam][part].pnr; + } + + /* This is expected by find_candidate() */ + quicksort_coord2d_x(corrected[cam], frm->num_targets[cam]); + } + return corrected; +} + + int main( int argc, const char* argv[] ) { // initialize variables @@ -14,13 +73,13 @@ int main( int argc, const char* argv[] ) // DIR *dirp; // struct dirent *dp; char file_name[256]; - int step; + int step, cam; unsigned char *img, *img_hp; target pix[MAXTARGETS], targ_t[MAXTARGETS]; coord_2d **corrected; int match_counts[4]; - n_tupel *con; // for correspondences - tracking_run *run; + n_tupel *con; + // read parameters from the working directory @@ -48,7 +107,7 @@ int main( int argc, const char* argv[] ) Calibration *calib[4]; // sorry only for 4 cameras now control_par *cpar = read_control_par("parameters/ptv.par"); - read_all_calibration(calib, cpar->num_cams); + read_all_calibration(calib, cpar); free_control_par(cpar); tracking_run *run = tr_new_legacy("parameters/sequence.par", @@ -96,7 +155,7 @@ int main( int argc, const char* argv[] ) free(img); free(img_hp); } // inner loop is camera - corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); + coord_2d **corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); con = correspondences(run->fb->buf[step], corrected, run->vpar, run->cpar, calib, match_counts); run->fb->buf[step]->num_parts = match_counts[3]; // sum of all matches? // so here is missing frame into run->frame ? @@ -130,10 +189,10 @@ int main( int argc, const char* argv[] ) /* Clean up */ - for (cam = 0; cam < cpar->num_cams; cam++) - free(corrected[cam]); - deallocate_adjacency_lists(list, cpar->num_cams); - deallocate_target_usage_marks(tusage, cpar->num_cams); + for (i = 1; icpar->num_cams+1; i++) + free(corrected[i]); + // deallocate_adjacency_lists(correspond* lists[4][4], cpar->num_cams); + // deallocate_target_usage_marks(tusage, cpar->num_cams); free(con); free(run->vpar); free_control_par(run->cpar); From bf0bbde934b33653764ab6cd443a2a39da6660ac Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Fri, 20 Sep 2019 22:06:50 +0300 Subject: [PATCH 14/35] ok. it compiles and fails as expected :) (base) MacBook-Pro:src alex$ ./main ../tests/testing_fodder/test_cavity/ 10000 10004 This program was called with "./main". Can't open ORI file: testing_fodder/cal/sym_cam1.tif.ori Can't open ORI file: testing_fodder/cal/sym_cam2.tif.ori Can't open ORI file: testing_fodder/cal/sym_cam3.tif.ori Can't open ORI file: testing_fodder/cal/sym_cam4.tif.ori Segmentation fault: 11 --- liboptv/src/main | Bin 0 -> 120592 bytes liboptv/src/main.c | 37 ++++++++++--------------------------- 2 files changed, 10 insertions(+), 27 deletions(-) create mode 100755 liboptv/src/main diff --git a/liboptv/src/main b/liboptv/src/main new file mode 100755 index 0000000000000000000000000000000000000000..757c6c490bb1cef6094b0542792d866f0d3e8af0 GIT binary patch literal 120592 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%0Ab4LFd|d{(V$J^v_FiG7U_E1V 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 z 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 literal 0 HcmV?d00001 diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 66bfe027..f04bdf66 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -79,6 +79,7 @@ int main( int argc, const char* argv[] ) coord_2d **corrected; int match_counts[4]; n_tupel *con; + tracking_run *run; @@ -110,7 +111,7 @@ int main( int argc, const char* argv[] ) read_all_calibration(calib, cpar); free_control_par(cpar); - tracking_run *run = tr_new_legacy("parameters/sequence.par", + run = tr_new_legacy("parameters/sequence.par", "parameters/track.par", "parameters/criteria.par", "parameters/ptv.par", calib); @@ -130,32 +131,15 @@ int main( int argc, const char* argv[] ) // for each camera and for each time step the images are processed for (step = run->seq_par->first; step < run->seq_par->last+1; step++) { - for (i = 1; icpar->num_cams+1; i++) { - - // a. read image - sprintf(file_name, "img/cam%d.%d", i, step); - img = (unsigned char *) malloc(run->cpar->imx*run->cpar->imy* \ - sizeof(unsigned char)); - img_hp = (unsigned char *) malloc(run->cpar->imx*run->cpar->imy* \ - sizeof(unsigned char)); - imread(img, file_name); - // b. highpass - if (run->cpar->hp_flag) - { - prepare_image(img, img_hp, 1, 0, 0, run->cpar); - } else { - memcpy(img_hp, img, run->cpar->imx*run->cpar->imy); - } - // c. segmentation - // detection - //ntargets = peak_fit(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, pix); - run->fb->buf[step]->num_targets[i] = targ_rec(img_hp, targ_read, 0, run->cpar->imx, 0, run->cpar->imy, run->cpar, 1, run->fb->buf[step]->targets[i]); - - // release temporary memory - free(img); - free(img_hp); + for (cam = 0; cam < run->cpar->num_cams; cam++) { + // we decided to focus just on the _targets, so we will read them from the + // test directory test_cavity + run->fb->buf[step]->num_targets[cam] = read_targets( + run->fb->buf[step]->targets[cam], run->fb->target_file_base[cam], step); + // if (run->fb-buf[step]->num_targets[cam] == -1) return 0; + } // inner loop is camera - coord_2d **corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); + corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); con = correspondences(run->fb->buf[step], corrected, run->vpar, run->cpar, calib, match_counts); run->fb->buf[step]->num_parts = match_counts[3]; // sum of all matches? // so here is missing frame into run->frame ? @@ -169,7 +153,6 @@ int main( int argc, const char* argv[] ) // the missing part is how to "chain the chunks" or make a smart use of // memory and buffers, it's beyond me now - run->tpar->add = 0; track_forward_start(run); From 84b1c8a86686ff8291539af9a76980a10d91a87e Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Fri, 20 Sep 2019 23:01:47 +0300 Subject: [PATCH 15/35] not clear where it fails - i don't manage to read_targets --- liboptv/src/main | Bin 120592 -> 120592 bytes liboptv/src/main.c | 15 ++++++++++----- liboptv/src/tracking_frame_buf.c | 4 +++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/liboptv/src/main b/liboptv/src/main index 757c6c490bb1cef6094b0542792d866f0d3e8af0..26962c6d43783a67ed044afa445b1e6ea338af32 100755 GIT binary patch delta 15186 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 delta 14928 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 Iz%~2-1Dp+YOaK4? diff --git a/liboptv/src/main.c b/liboptv/src/main.c index f04bdf66..d2d4f7df 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -9,8 +9,8 @@ I need this file to start preparing some structure in my head. Alex // These functions are part of the a test suite, see under /tests void read_all_calibration(Calibration *calib[4], control_par *cpar) { - char ori_tmpl[] = "testing_fodder/cal/sym_cam%d.tif.ori"; - char added_name[] = "testing_fodder/cal/cam1.tif.addpar"; + char ori_tmpl[] = "cal/cam%d.tif.ori"; + char added_name[] = "cal/cam1.tif.addpar"; char ori_name[40]; int cam; @@ -103,6 +103,8 @@ int main( int argc, const char* argv[] ) // change directory to the user-supplied working folder chdir(argv[1]); + + printf ("changed directory to %s\n",argv[1]); // 2. read parameters and calibrations Calibration *calib[4]; // sorry only for 4 cameras now @@ -110,6 +112,7 @@ int main( int argc, const char* argv[] ) control_par *cpar = read_control_par("parameters/ptv.par"); read_all_calibration(calib, cpar); free_control_par(cpar); + printf("read calibrations\n"); run = tr_new_legacy("parameters/sequence.par", "parameters/track.par", "parameters/criteria.par", @@ -122,7 +125,7 @@ int main( int argc, const char* argv[] ) } printf("from frame %d to frame %d \n", run->seq_par->first, run->seq_par->last); - target_par *targ_read = read_target_par("parameters/targ_rec.par"); + // target_par *targ_read = read_target_par("parameters/targ_rec.par"); // initialize memory buffers @@ -133,10 +136,12 @@ int main( int argc, const char* argv[] ) for (step = run->seq_par->first; step < run->seq_par->last+1; step++) { for (cam = 0; cam < run->cpar->num_cams; cam++) { // we decided to focus just on the _targets, so we will read them from the - // test directory test_cavity + // test directory test_cavity + printf("reading targets from cam %d %s\n", cam,run->fb->target_file_base[cam]); run->fb->buf[step]->num_targets[cam] = read_targets( run->fb->buf[step]->targets[cam], run->fb->target_file_base[cam], step); - // if (run->fb-buf[step]->num_targets[cam] == -1) return 0; + // if (run->fb-buf[step]->num_targets[cam] == -1) return 0; + printf("done \n"); } // inner loop is camera corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); diff --git a/liboptv/src/tracking_frame_buf.c b/liboptv/src/tracking_frame_buf.c index 62236416..db944347 100644 --- a/liboptv/src/tracking_frame_buf.c +++ b/liboptv/src/tracking_frame_buf.c @@ -46,13 +46,15 @@ int read_targets(target buffer[], char* file_base, int frame_num) { int tix, num_targets, scanf_ok; char filein[STR_MAX_LEN + 1]; + printf("inside read_targets\n"); + if (frame_num > 0) { sprintf(filein, "%s%04d%s", file_base, frame_num, "_targets"); } else { strncpy(filein, file_base, STR_MAX_LEN); strncat(filein, "_targets", STR_MAX_LEN); } - + printf("filein %s",filein); FILEIN = fopen (filein, "r"); if (! FILEIN) { printf("Can't open ascii file: %s\n", filein); From 8aa0e131050efe29e4d1f717cd6321846ff5aa93 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sat, 21 Sep 2019 00:07:55 +0300 Subject: [PATCH 16/35] one obvious bug step - run->seq_par->first is resolved --- liboptv/src/main | Bin 120592 -> 120592 bytes liboptv/src/main.c | 34 +++++++++++++++++++++++++------ liboptv/src/tracking_frame_buf.c | 4 +--- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/liboptv/src/main b/liboptv/src/main index 26962c6d43783a67ed044afa445b1e6ea338af32..4d35add148e644f19da9e8bcb54a12a978055892 100755 GIT binary patch delta 14874 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 V{+MR@pB4Q~jy2VNPQw+a{{ws!`Og3V diff --git a/liboptv/src/main.c b/liboptv/src/main.c index d2d4f7df..6963f17e 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -137,16 +137,38 @@ int main( int argc, const char* argv[] ) for (cam = 0; cam < run->cpar->num_cams; cam++) { // we decided to focus just on the _targets, so we will read them from the // test directory test_cavity - printf("reading targets from cam %d %s\n", cam,run->fb->target_file_base[cam]); - run->fb->buf[step]->num_targets[cam] = read_targets( - run->fb->buf[step]->targets[cam], run->fb->target_file_base[cam], step); + printf("reading targets from cam %d %s\n", cam,run->fb->target_file_base[cam]); + printf("step is %d\n",step); + + /* + target tbuf[2]; + target t1 = {0, 1127.0000, 796.0000, 13320, 111, 120, 828903, 1}; + target t2 = {1, 796.0000, 809.0000, 13108, 113, 116, 658928, 0}; + + char *file_base = "testing_fodder/sample_"; + int frame_num = 42; + int targets_read = 0; + + targets_read = read_targets(tbuf, file_base, frame_num); + + */ + + run->fb->buf[step - run->seq_par->first]->num_targets[cam] = read_targets( + run->fb->buf[step - run->seq_par->first]->targets[cam], run->fb->target_file_base[cam], step); + printf("run->fb->buf[step]->num_targets[cam] is %d\n",run->fb->buf[step - run->seq_par->first]->num_targets[cam]); + printf("and first x is %f\n",run->fb->buf[step - run->seq_par->first]->targets[cam][0].x); + // run->fb->buf[step]->num_targets[cam] = target_reads; + //run->fb->buf[step]->targets[cam] = pix; + + // run->fb->buf[step]->num_targets[cam] = read_targets( + // run->fb->buf[step]->targets[cam], run->fb->target_file_base[cam], step); // if (run->fb-buf[step]->num_targets[cam] == -1) return 0; printf("done \n"); } // inner loop is camera - corrected = correct_frame(run->fb->buf[step], calib, cpar, 0.0001); - con = correspondences(run->fb->buf[step], corrected, run->vpar, run->cpar, calib, match_counts); - run->fb->buf[step]->num_parts = match_counts[3]; // sum of all matches? + corrected = correct_frame(run->fb->buf[step - run->seq_par->first], calib, cpar, 0.0001); + con = correspondences(run->fb->buf[step - run->seq_par->first], corrected, run->vpar, run->cpar, calib, match_counts); + run->fb->buf[step - run->seq_par->first]->num_parts = match_counts[3]; // sum of all matches? // so here is missing frame into run->frame ? // WORK HERE diff --git a/liboptv/src/tracking_frame_buf.c b/liboptv/src/tracking_frame_buf.c index db944347..e5c5939f 100644 --- a/liboptv/src/tracking_frame_buf.c +++ b/liboptv/src/tracking_frame_buf.c @@ -46,15 +46,13 @@ int read_targets(target buffer[], char* file_base, int frame_num) { int tix, num_targets, scanf_ok; char filein[STR_MAX_LEN + 1]; - printf("inside read_targets\n"); - if (frame_num > 0) { sprintf(filein, "%s%04d%s", file_base, frame_num, "_targets"); } else { strncpy(filein, file_base, STR_MAX_LEN); strncat(filein, "_targets", STR_MAX_LEN); } - printf("filein %s",filein); + FILEIN = fopen (filein, "r"); if (! FILEIN) { printf("Can't open ascii file: %s\n", filein); From f7ee77a71b9271cfa999b167d74f4896ba353216 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sat, 21 Sep 2019 00:16:43 +0300 Subject: [PATCH 17/35] // we need to push con into the run->fb somehow . --- liboptv/src/main | Bin 120592 -> 120592 bytes liboptv/src/main.c | 146 ++++++++++++++++++++++----------------------- 2 files changed, 71 insertions(+), 75 deletions(-) diff --git a/liboptv/src/main b/liboptv/src/main index 4d35add148e644f19da9e8bcb54a12a978055892..8739565950b747f8071931ef7fdb5055adac9642 100755 GIT binary patch delta 7882 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 X>80GBA=vpXkJkuJwv0Xpmwo>WHPw!_ delta 7815 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 cam++) { + + for (cam = 0; cam < cpar->num_cams; cam++) + { sprintf(ori_name, ori_tmpl, cam + 1); calib[cam] = read_calibration(ori_name, added_name, NULL); } @@ -29,43 +31,46 @@ void read_all_calibration(Calibration *calib[4], control_par *cpar) { tol - tolerance parameter for iterative flattening phase, see trafo.h:correct_brown_affine_exact(). */ -coord_2d **correct_frame(frame *frm, Calibration *calib[], control_par *cpar, - double tol) +coord_2d **correct_frame(frame *frm, Calibration *calib[], control_par *cpar, + double tol) { coord_2d **corrected; int cam, part; - - corrected = (coord_2d **) malloc(cpar->num_cams * sizeof(coord_2d *)); - for (cam = 0; cam < cpar->num_cams; cam++) { - corrected[cam] = (coord_2d *) malloc( + + corrected = (coord_2d **)malloc(cpar->num_cams * sizeof(coord_2d *)); + for (cam = 0; cam < cpar->num_cams; cam++) + { + corrected[cam] = (coord_2d *)malloc( frm->num_targets[cam] * sizeof(coord_2d)); - if (corrected[cam] == NULL) { + if (corrected[cam] == NULL) + { /* roll back allocations and fail */ - for (cam -= 1; cam >= 0; cam--) free(corrected[cam]); + for (cam -= 1; cam >= 0; cam--) + free(corrected[cam]); free(corrected); return NULL; } - - for (part = 0; part < frm->num_targets[cam]; part++) { + + for (part = 0; part < frm->num_targets[cam]; part++) + { pixel_to_metric(&corrected[cam][part].x, &corrected[cam][part].y, - frm->targets[cam][part].x, frm->targets[cam][part].y, - cpar); - + frm->targets[cam][part].x, frm->targets[cam][part].y, + cpar); + dist_to_flat(corrected[cam][part].x, corrected[cam][part].y, - calib[cam], &corrected[cam][part].x, &corrected[cam][part].y, - tol); - + calib[cam], &corrected[cam][part].x, &corrected[cam][part].y, + tol); + corrected[cam][part].pnr = frm->targets[cam][part].pnr; } - + /* This is expected by find_candidate() */ quicksort_coord2d_x(corrected[cam], frm->num_targets[cam]); } return corrected; } - -int main( int argc, const char* argv[] ) +int main(int argc, const char *argv[]) { // initialize variables @@ -80,18 +85,14 @@ int main( int argc, const char* argv[] ) int match_counts[4]; n_tupel *con; tracking_run *run; - - // read parameters from the working directory // for simplicity all names are default and hard coded (sorry) - - // 1. process inputs: directory, first frame, last frame - - printf ("This program was called with \"%s\".\n",argv[0]); - + + printf("This program was called with \"%s\".\n", argv[0]); + if (argc != 2 && argc != 4) { printf("Wrong number of inputs, expecting: \n"); @@ -104,19 +105,19 @@ int main( int argc, const char* argv[] ) // change directory to the user-supplied working folder chdir(argv[1]); - printf ("changed directory to %s\n",argv[1]); - + printf("changed directory to %s\n", argv[1]); + // 2. read parameters and calibrations Calibration *calib[4]; // sorry only for 4 cameras now - + control_par *cpar = read_control_par("parameters/ptv.par"); read_all_calibration(calib, cpar); free_control_par(cpar); printf("read calibrations\n"); - + run = tr_new_legacy("parameters/sequence.par", - "parameters/track.par", "parameters/criteria.par", - "parameters/ptv.par", calib); + "parameters/track.par", "parameters/criteria.par", + "parameters/ptv.par", calib); if (argc == 4) { @@ -124,7 +125,7 @@ int main( int argc, const char* argv[] ) run->seq_par->last = atoi(argv[3]); } printf("from frame %d to frame %d \n", run->seq_par->first, run->seq_par->last); - + // target_par *targ_read = read_target_par("parameters/targ_rec.par"); // initialize memory buffers @@ -132,15 +133,17 @@ int main( int argc, const char* argv[] ) // for (step = 0; step < N_FRAMES_IN_DIRECTORY-BUFFER_LENGTH-1; step+BUFFER_LENGTH){ // MAIN LOOP - see below we will just give inputs of 10000 10004 as a very simple approach - // for each camera and for each time step the images are processed - for (step = run->seq_par->first; step < run->seq_par->last+1; step++) { - for (cam = 0; cam < run->cpar->num_cams; cam++) { - // we decided to focus just on the _targets, so we will read them from the - // test directory test_cavity - printf("reading targets from cam %d %s\n", cam,run->fb->target_file_base[cam]); - printf("step is %d\n",step); - - /* + // for each camera and for each time step the images are processed + for (step = run->seq_par->first; step < run->seq_par->last + 1; step++) + { + for (cam = 0; cam < run->cpar->num_cams; cam++) + { + // we decided to focus just on the _targets, so we will read them from the + // test directory test_cavity + printf("reading targets from cam %d %s\n", cam, run->fb->target_file_base[cam]); + printf("step is %d\n", step); + + /* target tbuf[2]; target t1 = {0, 1127.0000, 796.0000, 13320, 111, 120, 828903, 1}; target t2 = {1, 796.0000, 809.0000, 13108, 113, 116, 658928, 0}; @@ -153,24 +156,20 @@ int main( int argc, const char* argv[] ) */ - run->fb->buf[step - run->seq_par->first]->num_targets[cam] = read_targets( - run->fb->buf[step - run->seq_par->first]->targets[cam], run->fb->target_file_base[cam], step); - printf("run->fb->buf[step]->num_targets[cam] is %d\n",run->fb->buf[step - run->seq_par->first]->num_targets[cam]); - printf("and first x is %f\n",run->fb->buf[step - run->seq_par->first]->targets[cam][0].x); - // run->fb->buf[step]->num_targets[cam] = target_reads; - //run->fb->buf[step]->targets[cam] = pix; - - // run->fb->buf[step]->num_targets[cam] = read_targets( - // run->fb->buf[step]->targets[cam], run->fb->target_file_base[cam], step); - // if (run->fb-buf[step]->num_targets[cam] == -1) return 0; - printf("done \n"); - - } // inner loop is camera + run->fb->buf[step - run->seq_par->first]->num_targets[cam] = read_targets( + run->fb->buf[step - run->seq_par->first]->targets[cam], run->fb->target_file_base[cam], step); + printf("run->fb->buf[step]->num_targets[cam] is %d\n", run->fb->buf[step - run->seq_par->first]->num_targets[cam]); + printf("and first x is %f\n", run->fb->buf[step - run->seq_par->first]->targets[cam][0].x); + } // inner loop is per camera corrected = correct_frame(run->fb->buf[step - run->seq_par->first], calib, cpar, 0.0001); con = correspondences(run->fb->buf[step - run->seq_par->first], corrected, run->vpar, run->cpar, calib, match_counts); - run->fb->buf[step - run->seq_par->first]->num_parts = match_counts[3]; // sum of all matches? - // so here is missing frame into run->frame ? - // WORK HERE + run->fb->buf[step - run->seq_par->first]->num_parts = match_counts[3]; // sum of all matches? + printf("number of matched points is %d \n ", run->fb->buf[step - run->seq_par->first]->num_parts); + // so here is missing frame into run->frame ? + // WORK HERE + + // we need to push con into the run->fb somehow . + } // external loop is through frames @@ -183,31 +182,28 @@ int main( int argc, const char* argv[] ) run->tpar->add = 0; track_forward_start(run); - for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) { + for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) + { trackcorr_c_loop(run, step); } trackcorr_c_finish(run, run->seq_par->last); - // probably here we need to send something to plot it - // or store in some memory for the next chunk? + // probably here we need to send something to plot it + // or store in some memory for the next chunk? // basically we have a human in the loop here - his/her brain // will simply follow the velocity values in time like a movie // and we will store it to binary files. Later if someone wants to do // tracking, our simmple solution is not good enough. we kind of doing 3D-PIV here // of 4 frames and show the vectors. The quasi-vectors are not really connected. if we - // will create nice animation - then the user will build trajectories him/herself. - + // will create nice animation - then the user will build trajectories him/herself. - /* Clean up */ - for (i = 1; icpar->num_cams+1; i++) - free(corrected[i]); - // deallocate_adjacency_lists(correspond* lists[4][4], cpar->num_cams); - // deallocate_target_usage_marks(tusage, cpar->num_cams); + for (cam -= 1; cam >= 0; cam--) free(corrected[cam]); + + free(corrected); free(con); free(run->vpar); free_control_par(run->cpar); return 0; - -} // should be end of main now \ No newline at end of file +} // should be end of main now \ No newline at end of file From 0d107f7be89c08e67def72f40b6187a692677c80 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sat, 21 Sep 2019 18:58:49 +0300 Subject: [PATCH 18/35] got stuck with the structures after corresp_buf need to learn better C --- .gitignore | 1 + liboptv/src/main.c | 154 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 125 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index bad57703..237c0a5b 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ liboptv/build py_bind/optv/*.c py_bind/build *.pyc +liboptv/src/main diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 0f145897..0a28b211 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -78,13 +78,14 @@ int main(int argc, const char *argv[]) // DIR *dirp; // struct dirent *dp; char file_name[256]; - int step, cam; - unsigned char *img, *img_hp; - target pix[MAXTARGETS], targ_t[MAXTARGETS]; - coord_2d **corrected; + int step, cam, geo_id; + target pix[MAXTARGETS], targ_t[MAXTARGETS], targ; + coord_2d **corrected, **sorted_pos; + int **sorted_corresp; int match_counts[4]; - n_tupel *con; + n_tupel *corresp_buf; tracking_run *run; + vec3d res; // read parameters from the working directory // for simplicity all names are default and hard coded (sorry) @@ -140,36 +141,128 @@ int main(int argc, const char *argv[]) { // we decided to focus just on the _targets, so we will read them from the // test directory test_cavity - printf("reading targets from cam %d %s\n", cam, run->fb->target_file_base[cam]); - printf("step is %d\n", step); - - /* - target tbuf[2]; - target t1 = {0, 1127.0000, 796.0000, 13320, 111, 120, 828903, 1}; - target t2 = {1, 796.0000, 809.0000, 13108, 113, 116, 658928, 0}; - - char *file_base = "testing_fodder/sample_"; - int frame_num = 42; - int targets_read = 0; - - targets_read = read_targets(tbuf, file_base, frame_num); - - */ + printf("reading targets from %s%d\n", run->fb->target_file_base[cam], step); run->fb->buf[step - run->seq_par->first]->num_targets[cam] = read_targets( run->fb->buf[step - run->seq_par->first]->targets[cam], run->fb->target_file_base[cam], step); - printf("run->fb->buf[step]->num_targets[cam] is %d\n", run->fb->buf[step - run->seq_par->first]->num_targets[cam]); - printf("and first x is %f\n", run->fb->buf[step - run->seq_par->first]->targets[cam][0].x); + + quicksort_target_y(run->fb->buf[step - run->seq_par->first]->targets[cam], run->fb->buf[step - run->seq_par->first]->num_targets[cam]); + + for (i = 0; i < run->fb->buf[step - run->seq_par->first]->num_targets[cam]; i++) + run->fb->buf[step - run->seq_par->first]->targets[cam][i].pnr = i; + + // debugging purposes print the status of targets - see below another print. + printf("%d targets and the first is %f,%f \n ", + run->fb->buf[step - run->seq_par->first]->num_targets[cam], + run->fb->buf[step - run->seq_par->first]->targets[cam][0].x, + run->fb->buf[step - run->seq_par->first]->targets[cam][0].y); + } // inner loop is per camera corrected = correct_frame(run->fb->buf[step - run->seq_par->first], calib, cpar, 0.0001); - con = correspondences(run->fb->buf[step - run->seq_par->first], corrected, run->vpar, run->cpar, calib, match_counts); - run->fb->buf[step - run->seq_par->first]->num_parts = match_counts[3]; // sum of all matches? + corresp_buf = correspondences(run->fb->buf[step - run->seq_par->first], corrected, run->vpar, run->cpar, calib, match_counts); + run->fb->buf[step - run->seq_par->first]->num_parts = match_counts[3]; printf("number of matched points is %d \n ", run->fb->buf[step - run->seq_par->first]->num_parts); - // so here is missing frame into run->frame ? - // WORK HERE - // we need to push con into the run->fb somehow . - + // first we need to create 3d points after correspondences and fill it into the buffer + // use point_position and loop through the num_parts + // probably feed it directly into the buffer + + // so we split into two parts: + // first i copy the code from correspondences.pyx + // and create the same types of arrays in C + // then we will convert those to 3D using similar approach to what is now in Python + + + // return structures + sorted_pos = (coord_2d **)malloc(run->cpar->num_cams * sizeof(coord_2d *)); + sorted_corresp = (int **)malloc(run->cpar->num_cams * sizeof(int *)); + + int last_count = 0; + + for (int clique_type = 0; clique_type < run->cpar->num_cams; clique_type++) + { + num_points = match_counts[4 - run->cpar->num_cams + clique_type] // for 1-4 cameras + + sorted_pos[clique_type] = (coord_2d *)malloc(num_points * sizeof(coord_2d)); + + if (sorted_pos[clique_type] == NULL) + { + /* roll back allocations and fail */ + for (cam -= 1; cam >= 0; cam--) + free(sorted_pos[clique_type]); + free(sorted_pos); + return NULL; + } + + sorted_corresp[clique_type] = (int *)malloc(num_points * sizeof(int)); + + if (sorted_corresp[clique_type] == NULL) + { + /* roll back allocations and fail */ + for (cam -= 1; cam >= 0; cam--) + free(sorted_corresp[clique_type]); + free(sorted_corresp); + return NULL; + } + + + coord_2d *clique_targs = (coord_2d *)malloc(cpar->num_cams*sizeof(coord_2d *)); + //np.full((num_cams, num_points, 2), PT_UNUSED, + // dtype=np.float64) + int *clique_ids = (int *)malloc(cnp.full((num_cams, num_points), CORRES_NONE, + // dtype=np.int_) + + // Trace back the pixel target properties through the flat metric + // intermediary that's x-sorted. + + for (cam = 0; cam < run->cpar->num_cams; cam++) + { + for ( pt = 0; pt < num_points; pt++) + { + geo_id = corresp_buf[pt + last_count].p[cam]; + if (geo_id < 0) + continue; + + p1 = corrected[cam][geo_id].pnr; + clique_ids[cam][pt] = p1; + + if (p1 > -1) + { + targ = run->fb->buf[step - run->seq_par->first]->targets[cam][p1]; + clique_targs[cam][pt][0] = targ.x; + clique_targs[cam][pt][1] = targ.y; + } + } // points + } // cam + + last_count += num_points; + sorted_pos[clique_type] = clique_targs; + sorted_corresp[clique_type] = clique_ids; + } // cliquies + + // Clean up. + num_targs = match_counts[run->cpar->num_cams - 1]; + + flat = np.array([corrected[i].get_by_pnrs(sorted_corresp[i]) \ + for i in range(len(cals))]) + pos, rcm = point_positions( + flat.transpose(1,0,2), cpar, cals, vpar) + + + vec2d targs_plain[4]; // x,y coordinates in image space for 4 Cameras + + skew_dist = point_position(targs_plain, num_cams, &media_par, calib, res); + + for + pt in range(num_targets) : + targ = targets[pt] + rcm[pt] = point_position((targ.data), num_cams, + cparam._control_par.mm, calib, np.PyArray_GETPTR2(res, pt, 0)) + + // second we need to reassign pointers to targets and refill the buffer with targets + // probably we do not: + // if I understand correctly, this line inside correspondences says that we already updated the frame buffer with the right tnr pointers. + // frm->targets[j][p1].tnr= i; } // external loop is through frames @@ -197,8 +290,9 @@ int main(int argc, const char *argv[]) // of 4 frames and show the vectors. The quasi-vectors are not really connected. if we // will create nice animation - then the user will build trajectories him/herself. - for (cam -= 1; cam >= 0; cam--) free(corrected[cam]); - + for (cam -= 1; cam >= 0; cam--) + free(corrected[cam]); + free(corrected); free(con); free(run->vpar); From e3d0e7625838ea005be1e305a5fe778c8fccfcda Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sat, 21 Sep 2019 20:31:31 +0300 Subject: [PATCH 19/35] build very complex structure and i think it's very simple, see jw_ptv.c --- .gitignore | 1 + liboptv/src/main.c | 80 +++++++++++++++++++++++++++------------------- 2 files changed, 48 insertions(+), 33 deletions(-) diff --git a/.gitignore b/.gitignore index 237c0a5b..db0e96e4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ py_bind/optv/*.c py_bind/build *.pyc liboptv/src/main +liboptv/src/main diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 0a28b211..0b226a99 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -80,7 +80,7 @@ int main(int argc, const char *argv[]) char file_name[256]; int step, cam, geo_id; target pix[MAXTARGETS], targ_t[MAXTARGETS], targ; - coord_2d **corrected, **sorted_pos; + coord_2d **corrected, **sorted_pos, **flat; int **sorted_corresp; int match_counts[4]; n_tupel *corresp_buf; @@ -160,7 +160,7 @@ int main(int argc, const char *argv[]) } // inner loop is per camera corrected = correct_frame(run->fb->buf[step - run->seq_par->first], calib, cpar, 0.0001); corresp_buf = correspondences(run->fb->buf[step - run->seq_par->first], corrected, run->vpar, run->cpar, calib, match_counts); - run->fb->buf[step - run->seq_par->first]->num_parts = match_counts[3]; + run->fb->buf[step - run->seq_par->first]->num_parts = match_counts[run->cpar->num_cams - 1]; printf("number of matched points is %d \n ", run->fb->buf[step - run->seq_par->first]->num_parts); // first we need to create 3d points after correspondences and fill it into the buffer @@ -172,77 +172,91 @@ int main(int argc, const char *argv[]) // and create the same types of arrays in C // then we will convert those to 3D using similar approach to what is now in Python - + + // shortcut + int num_parts = run->fb->buf[step - run->seq_par->first]->num_parts; + // return structures sorted_pos = (coord_2d **)malloc(run->cpar->num_cams * sizeof(coord_2d *)); sorted_corresp = (int **)malloc(run->cpar->num_cams * sizeof(int *)); - int last_count = 0; - - for (int clique_type = 0; clique_type < run->cpar->num_cams; clique_type++) + for (cam = 0; cam < run->cpar->num_cams; cam++) { - num_points = match_counts[4 - run->cpar->num_cams + clique_type] // for 1-4 cameras - - sorted_pos[clique_type] = (coord_2d *)malloc(num_points * sizeof(coord_2d)); - - if (sorted_pos[clique_type] == NULL) + sorted_pos[cam] = (coord_2d *)malloc(num_parts * sizeof(coord_2d)); + if (sorted_pos[cam] == NULL) { /* roll back allocations and fail */ for (cam -= 1; cam >= 0; cam--) - free(sorted_pos[clique_type]); + free(sorted_pos[cam]); free(sorted_pos); return NULL; } - - sorted_corresp[clique_type] = (int *)malloc(num_points * sizeof(int)); + + sorted_corresp[cam] = (int *)malloc(num_parts * sizeof(int)); - if (sorted_corresp[clique_type] == NULL) + if (sorted_corresp[cam] == NULL) { /* roll back allocations and fail */ for (cam -= 1; cam >= 0; cam--) - free(sorted_corresp[clique_type]); + free(sorted_corresp[cam]); free(sorted_corresp); return NULL; } + } + int last_count = 0; - coord_2d *clique_targs = (coord_2d *)malloc(cpar->num_cams*sizeof(coord_2d *)); - //np.full((num_cams, num_points, 2), PT_UNUSED, - // dtype=np.float64) - int *clique_ids = (int *)malloc(cnp.full((num_cams, num_points), CORRES_NONE, - // dtype=np.int_) - - // Trace back the pixel target properties through the flat metric - // intermediary that's x-sorted. + for (int clique_type = 0; clique_type < run->cpar->num_cams; clique_type++) + { + num_points = match_counts[4 - run->cpar->num_cams + clique_type] // for 1-4 cameras for (cam = 0; cam < run->cpar->num_cams; cam++) { - for ( pt = 0; pt < num_points; pt++) + for ( pt = last_count; pt < num_points; pt++) { geo_id = corresp_buf[pt + last_count].p[cam]; if (geo_id < 0) continue; p1 = corrected[cam][geo_id].pnr; - clique_ids[cam][pt] = p1; + sorted_corresp[cam][pt] = p1; if (p1 > -1) { targ = run->fb->buf[step - run->seq_par->first]->targets[cam][p1]; - clique_targs[cam][pt][0] = targ.x; - clique_targs[cam][pt][1] = targ.y; + sorted_pos[cam][pt][0] = targ.x; + sorted_pos[cam][pt][1] = targ.y; } } // points } // cam last_count += num_points; - sorted_pos[clique_type] = clique_targs; - sorted_corresp[clique_type] = clique_ids; - } // cliquies + } // - // Clean up. - num_targs = match_counts[run->cpar->num_cams - 1]; + // sort corrected by the sorted_corresp: + // prepare the memory for + + flat = (coord_2d **)malloc(cpar->num_cams * sizeof(coord_2d *)); + for (cam = 0; cam < run->cpar->num_cams; cam++) + { + flat[cam] = (coord_2d *)malloc( + run->fb->buf[step - run->seq_par->first]->num_targets[cam] * sizeof(coord_2d)); + if (flat[cam] == NULL) + { + /* roll back allocations and fail */ + for (cam -= 1; cam >= 0; cam--) + free(flat[cam]); + free(flat); + return NULL; + } + } + + + for (i=0;i Date: Sat, 21 Sep 2019 22:54:45 +0300 Subject: [PATCH 20/35] maybe it's a first prototype --- liboptv/src/main.c | 156 +++++++++++++-------------------------------- 1 file changed, 44 insertions(+), 112 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 0b226a99..5ef82202 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -74,19 +74,23 @@ int main(int argc, const char *argv[]) { // initialize variables - int i, ntargets; - // DIR *dirp; - // struct dirent *dp; - char file_name[256]; - int step, cam, geo_id; - target pix[MAXTARGETS], targ_t[MAXTARGETS], targ; - coord_2d **corrected, **sorted_pos, **flat; - int **sorted_corresp; + int i, j, ntargets, step, cam, geo_id; + coord_2d **corrected; int match_counts[4]; n_tupel *corresp_buf; tracking_run *run; vec3d res; + corres t_corres = { 3, {96, 66, 26, 26} }; + P t_path = { + .x = {45.219, -20.269, 25.946}, + .prev = -1, + .next = -2, + .prio = 4, + .finaldecis = 1000000.0, + .inlist = 0. + }; + // read parameters from the working directory // for simplicity all names are default and hard coded (sorry) @@ -174,118 +178,46 @@ int main(int argc, const char *argv[]) // shortcut - int num_parts = run->fb->buf[step - run->seq_par->first]->num_parts; - - // return structures - sorted_pos = (coord_2d **)malloc(run->cpar->num_cams * sizeof(coord_2d *)); - sorted_corresp = (int **)malloc(run->cpar->num_cams * sizeof(int *)); - - for (cam = 0; cam < run->cpar->num_cams; cam++) - { - sorted_pos[cam] = (coord_2d *)malloc(num_parts * sizeof(coord_2d)); - if (sorted_pos[cam] == NULL) - { - /* roll back allocations and fail */ - for (cam -= 1; cam >= 0; cam--) - free(sorted_pos[cam]); - free(sorted_pos); - return NULL; + int num_parts = run->fb->buf[step - run->seq_par->first]->num_parts; + int p[4]; + float x[4],y[4],skew_dist; + + + for (i=0; icpar->num_cams; j++) { + if (corresp_buffer[i].p[j] >= 0) + p[j] = corrected[j][con[i].p[j]].pnr; + else + p[j] = -1; } - - sorted_corresp[cam] = (int *)malloc(num_parts * sizeof(int)); - - if (sorted_corresp[cam] == NULL) - { - /* roll back allocations and fail */ - for (cam -= 1; cam >= 0; cam--) - free(sorted_corresp[cam]); - free(sorted_corresp); - return NULL; + + for (j=0, n=0; jcpar->num_cams; j++) { + if (p[j] > -1) { + x[j] = run->fb->buf[step - run->seq_par->first]->num_targets[j][p[j]].x; // crd is pix likely + y[j] = run->fb->buf[step - run->seq_par->first]->num_targets[j][p[j]].y; + n++; + } + else { + x[j] = -1e10; + y[j] = -1e10; + if (p[j] == -2) n = -100; + } } - } - - int last_count = 0; - - for (int clique_type = 0; clique_type < run->cpar->num_cams; clique_type++) - { - num_points = match_counts[4 - run->cpar->num_cams + clique_type] // for 1-4 cameras - - for (cam = 0; cam < run->cpar->num_cams; cam++) - { - for ( pt = last_count; pt < num_points; pt++) - { - geo_id = corresp_buf[pt + last_count].p[cam]; - if (geo_id < 0) - continue; - - p1 = corrected[cam][geo_id].pnr; - sorted_corresp[cam][pt] = p1; - - if (p1 > -1) - { - targ = run->fb->buf[step - run->seq_par->first]->targets[cam][p1]; - sorted_pos[cam][pt][0] = targ.x; - sorted_pos[cam][pt][1] = targ.y; - } - } // points - } // cam - - last_count += num_points; - } // - - - // sort corrected by the sorted_corresp: - // prepare the memory for - - flat = (coord_2d **)malloc(cpar->num_cams * sizeof(coord_2d *)); - for (cam = 0; cam < run->cpar->num_cams; cam++) - { - flat[cam] = (coord_2d *)malloc( - run->fb->buf[step - run->seq_par->first]->num_targets[cam] * sizeof(coord_2d)); - if (flat[cam] == NULL) - { - /* roll back allocations and fail */ - for (cam -= 1; cam >= 0; cam--) - free(flat[cam]); - free(flat); - return NULL; - } - } - - - for (i=0;icpar->num_cams, run->cpar->mm, calib, res); - } - flat = np.array([corrected[i].get_by_pnrs(sorted_corresp[i]) \ - for i in range(len(cals))]) - pos, rcm = point_positions( - flat.transpose(1,0,2), cpar, cals, vpar) - - - vec2d targs_plain[4]; // x,y coordinates in image space for 4 Cameras - - skew_dist = point_position(targs_plain, num_cams, &media_par, calib, res); - - for - pt in range(num_targets) : - targ = targets[pt] - rcm[pt] = point_position((targ.data), num_cams, - cparam._control_par.mm, calib, np.PyArray_GETPTR2(res, pt, 0)) + t_corres[0] = i; + for (cam=0; cam < cpar->num_cams; cam++){ + t_corres[1][cam] = run->fb->buf[step - run->seq_par->first]->targets[cam][p[j]].pnr + } + run->fb->buf[step - run->seq_par->first].correspond[i] = t_corres; - // second we need to reassign pointers to targets and refill the buffer with targets - // probably we do not: - // if I understand correctly, this line inside correspondences says that we already updated the frame buffer with the right tnr pointers. - // frm->targets[j][p1].tnr= i; + t_path.x = res; + run->fb->buf[step - run->seq_par->first].path_info[i] = t_path; } // external loop is through frames - // ok, theoretically we have now a buffer full of stuff from 4 frames - // it's a good buffer on which we can just track stuff - // and then we need to jump to a next chunk, remove all and start over. - // the missing part is how to "chain the chunks" or make a smart use of - // memory and buffers, it's beyond me now - run->tpar->add = 0; track_forward_start(run); From c13e89d1990480a7e00d11e5d298556a6446c2ac Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sat, 21 Sep 2019 23:09:31 +0300 Subject: [PATCH 21/35] at least it compiles --- liboptv/src/main.c | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 5ef82202..6b1453d1 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -186,35 +186,42 @@ int main(int argc, const char *argv[]) for (i=0; icpar->num_cams; j++) { - if (corresp_buffer[i].p[j] >= 0) - p[j] = corrected[j][con[i].p[j]].pnr; + if (corresp_buf[i].p[j] >= 0) + p[j] = corrected[j][corresp_buf[i].p[j]].pnr; else p[j] = -1; } - for (j=0, n=0; jcpar->num_cams; j++) { + for (j=0; jcpar->num_cams; j++) { if (p[j] > -1) { - x[j] = run->fb->buf[step - run->seq_par->first]->num_targets[j][p[j]].x; // crd is pix likely - y[j] = run->fb->buf[step - run->seq_par->first]->num_targets[j][p[j]].y; - n++; + x[j] = run->fb->buf[step - run->seq_par->first]->targets[j][p[j]].x; // crd is pix likely + y[j] = run->fb->buf[step - run->seq_par->first]->targets[j][p[j]].y; + // n++; } else { x[j] = -1e10; y[j] = -1e10; - if (p[j] == -2) n = -100; + // if (p[j] == -2) n = -100; } } - skew_dist = point_position(corrected[j][i], run->cpar->num_cams, run->cpar->mm, calib, res); + vec2d targ; + targ[0] = corrected[j][i].x; + targ[1] = corrected[j][i].y; + skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); - t_corres[0] = i; + t_corres.nr = i; for (cam=0; cam < cpar->num_cams; cam++){ - t_corres[1][cam] = run->fb->buf[step - run->seq_par->first]->targets[cam][p[j]].pnr + t_corres.p[cam] = run->fb->buf[step - run->seq_par->first]->targets[cam][p[j]].pnr; } - run->fb->buf[step - run->seq_par->first].correspond[i] = t_corres; + run->fb->buf[step - run->seq_par->first]->correspond[i] = t_corres; + + t_path.x[0] = res[0]; + t_path.x[1] = res[1]; + t_path.x[2] = res[2]; - t_path.x = res; - run->fb->buf[step - run->seq_par->first].path_info[i] = t_path; + run->fb->buf[step - run->seq_par->first]->path_info[i] = t_path; + } } // external loop is through frames @@ -240,7 +247,7 @@ int main(int argc, const char *argv[]) free(corrected[cam]); free(corrected); - free(con); + free(corresp_buf); free(run->vpar); free_control_par(run->cpar); From 38da36c99ec01bb099770b714eefca50ba5f0377 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 22 Sep 2019 00:26:07 +0300 Subject: [PATCH 22/35] segfaults --- liboptv/src/main.c | 97 +++++++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 44 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 6b1453d1..dd3a850a 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -70,16 +70,18 @@ coord_2d **correct_frame(frame *frm, Calibration *calib[], control_par *cpar, return corrected; } -int main(int argc, const char *argv[]) +// int main(int argc, const char *argv[]) +int main() { // initialize variables - int i, j, ntargets, step, cam, geo_id; + int i, cam, ntargets, step, geo_id; coord_2d **corrected; int match_counts[4]; n_tupel *corresp_buf; tracking_run *run; vec3d res; + vec2d targ; corres t_corres = { 3, {96, 66, 26, 26} }; P t_path = { @@ -96,21 +98,31 @@ int main(int argc, const char *argv[]) // 1. process inputs: directory, first frame, last frame - printf("This program was called with \"%s\".\n", argv[0]); + // printf("This program was called with \"%s\".\n", argv[0]); - if (argc != 2 && argc != 4) - { - printf("Wrong number of inputs, expecting: \n"); - printf(" ./openptv test_cavity \n"); - printf(" or \n"); - printf(" ./openptv test_cavity 10000 10004 \n"); - return 0; - } + // argc = 4; + + // argv[1] = '../tests/testing_fodder/test_cavity/'; + // argv[2] = 10001; + // argv[3] = 10004; + + // if (argc != 2 && argc != 4) + // { + // printf("Wrong number of inputs, expecting: \n"); + // printf(" ./main ../tests/testing_fodder/test_cavity/ 10001 10004 \n"); + // return 0; + // } + + // argv[1] = '../tests/testing_fodder/test_cavity/'; + // argv[2] = 10001; + // argv[3] = 10004; // change directory to the user-supplied working folder - chdir(argv[1]); + // chdir(argv[1]); + + chdir("../tests/testing_fodder/test_cavity/"); - printf("changed directory to %s\n", argv[1]); + // printf("changed directory to %s\n", argv[1]); // 2. read parameters and calibrations Calibration *calib[4]; // sorry only for 4 cameras now @@ -124,11 +136,14 @@ int main(int argc, const char *argv[]) "parameters/track.par", "parameters/criteria.par", "parameters/ptv.par", calib); - if (argc == 4) - { - run->seq_par->first = atoi(argv[2]); - run->seq_par->last = atoi(argv[3]); - } + // if (argc == 4) + // { + // run->seq_par->first = atoi(argv[2]); + // run->seq_par->last = atoi(argv[3]); + // } + run->seq_par->first = 10001; + run->seq_par->last = 10004; + printf("from frame %d to frame %d \n", run->seq_par->first, run->seq_par->last); // target_par *targ_read = read_target_par("parameters/targ_rec.par"); @@ -136,14 +151,14 @@ int main(int argc, const char *argv[]) // initialize memory buffers // for (step = 0; step < N_FRAMES_IN_DIRECTORY-BUFFER_LENGTH-1; step+BUFFER_LENGTH){ - // MAIN LOOP - see below we will just give inputs of 10000 10004 as a very simple approach + // MAIN LOOP - see below we will camust give inputs of 10000 10004 as a very simple approach // for each camera and for each time step the images are processed for (step = run->seq_par->first; step < run->seq_par->last + 1; step++) { for (cam = 0; cam < run->cpar->num_cams; cam++) { - // we decided to focus just on the _targets, so we will read them from the + // we decided to focus camust on the _targets, so we will read them from the // test directory test_cavity printf("reading targets from %s%d\n", run->fb->target_file_base[cam], step); @@ -184,35 +199,29 @@ int main(int argc, const char *argv[]) for (i=0; icpar->num_cams; j++) { - if (corresp_buf[i].p[j] >= 0) - p[j] = corrected[j][corresp_buf[i].p[j]].pnr; - else - p[j] = -1; - } - - for (j=0; jcpar->num_cams; j++) { - if (p[j] > -1) { - x[j] = run->fb->buf[step - run->seq_par->first]->targets[j][p[j]].x; // crd is pix likely - y[j] = run->fb->buf[step - run->seq_par->first]->targets[j][p[j]].y; - // n++; - } - else { - x[j] = -1e10; - y[j] = -1e10; - // if (p[j] == -2) n = -100; - } + for (cam=0; cam < run->cpar->num_cams; cam++) { + if (corresp_buf[i].p[cam] >= 0) + p[cam] = corrected[cam][corresp_buf[i].p[cam]].pnr; + else + p[cam] = -1; } - vec2d targ; - targ[0] = corrected[j][i].x; - targ[1] = corrected[j][i].y; + + // printf("corrected %d %f %f \n ",corrected[cam][corresp_buf[i].p[cam]].pnr, corrected[cam][corresp_buf[i].p[cam]].x,corrected[cam][corresp_buf[i].p[cam]].y); + if (p[cam] > -1){ + pixel_to_metric(&targ[0], &targ[1], \ + run->fb->buf[step - run->seq_par->first]->targets[cam][p[cam]].x, \ + run->fb->buf[step - run->seq_par->first]->targets[cam][p[cam]].y, \ + run->cpar); + } else { + targ[0] = 1e-10; + targ[1] = 1e-10; + } skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); t_corres.nr = i; for (cam=0; cam < cpar->num_cams; cam++){ - t_corres.p[cam] = run->fb->buf[step - run->seq_par->first]->targets[cam][p[j]].pnr; + t_corres.p[cam] = run->fb->buf[step - run->seq_par->first]->targets[cam][p[cam]].pnr; } run->fb->buf[step - run->seq_par->first]->correspond[i] = t_corres; @@ -241,7 +250,7 @@ int main(int argc, const char *argv[]) // and we will store it to binary files. Later if someone wants to do // tracking, our simmple solution is not good enough. we kind of doing 3D-PIV here // of 4 frames and show the vectors. The quasi-vectors are not really connected. if we - // will create nice animation - then the user will build trajectories him/herself. + // will create nice animation - then the user will build tracamectories him/herself. for (cam -= 1; cam >= 0; cam--) free(corrected[cam]); From 0471c72f42212b61c33b886df9c0a3896a09b149 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 22 Sep 2019 00:29:51 +0300 Subject: [PATCH 23/35] does not segfaults, but tries to read rt_is --- liboptv/src/main | Bin 120592 -> 135136 bytes liboptv/src/main.c | 2 +- liboptv/src/main.dSYM/Contents/Info.plist | 20 ++++++++++++++++++ .../main.dSYM/Contents/Resources/DWARF/main | Bin 0 -> 134505 bytes 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 liboptv/src/main.dSYM/Contents/Info.plist create mode 100644 liboptv/src/main.dSYM/Contents/Resources/DWARF/main diff --git a/liboptv/src/main b/liboptv/src/main index 8739565950b747f8071931ef7fdb5055adac9642..9cad0fead5976631c29c2a5261773a9b186abfe1 100755 GIT binary patch delta 52208 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, run->cpar->mm, calib, res); t_corres.nr = i; - for (cam=0; cam < cpar->num_cams; cam++){ + for (cam=0; cam < run->cpar->num_cams; cam++){ t_corres.p[cam] = run->fb->buf[step - run->seq_par->first]->targets[cam][p[cam]].pnr; } run->fb->buf[step - run->seq_par->first]->correspond[i] = t_corres; diff --git a/liboptv/src/main.dSYM/Contents/Info.plist b/liboptv/src/main.dSYM/Contents/Info.plist new file mode 100644 index 00000000..fe7fecda --- /dev/null +++ b/liboptv/src/main.dSYM/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.main + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/liboptv/src/main.dSYM/Contents/Resources/DWARF/main b/liboptv/src/main.dSYM/Contents/Resources/DWARF/main new file mode 100644 index 0000000000000000000000000000000000000000..a390ff76ec1c040bcac259eb3e4bf42ceb8bc770 GIT binary patch literal 134505 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

-w=xB> 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 literal 0 HcmV?d00001 From 378f386fc34f26233c2e3ffde5559cb88426d093 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 22 Sep 2019 10:19:19 +0300 Subject: [PATCH 24/35] maybe without track_forward_start? --- liboptv/src/main.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index b471bc5f..d366c6f3 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -81,7 +81,8 @@ int main() n_tupel *corresp_buf; tracking_run *run; vec3d res; - vec2d targ; + vec2d targ; + framebuf *frm; corres t_corres = { 3, {96, 66, 26, 26} }; P t_path = { @@ -136,6 +137,9 @@ int main() "parameters/track.par", "parameters/criteria.par", "parameters/ptv.par", calib); + + frm = *(run->fb); + // if (argc == 4) // { // run->seq_par->first = atoi(argv[2]); @@ -160,6 +164,7 @@ int main() { // we decided to focus camust on the _targets, so we will read them from the // test directory test_cavity + printf("reading targets from %s%d\n", run->fb->target_file_base[cam], step); run->fb->buf[step - run->seq_par->first]->num_targets[cam] = read_targets( @@ -235,7 +240,8 @@ int main() } // external loop is through frames run->tpar->add = 0; - track_forward_start(run); + // we do not need to read frames - it's all in memory now + // track_forward_start(run); for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) { From aba7e2ec37e6b6b8b6a394854f53d9f9eb015bda Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 22 Sep 2019 10:19:35 +0300 Subject: [PATCH 25/35] Revert "Merge branch 'master' into refactor_fb" This reverts commit 9eb37fc3a69670f7de842500d9d966899d6a582c, reversing changes made to 0471c72f42212b61c33b886df9c0a3896a09b149. --- liboptv/include/tracking_frame_buf.h | 70 ++-------------- liboptv/include/tracking_run.h | 2 +- liboptv/src/track.c | 4 +- liboptv/src/tracking_frame_buf.c | 116 +++++++++------------------ liboptv/src/tracking_run.c | 4 +- 5 files changed, 48 insertions(+), 148 deletions(-) diff --git a/liboptv/include/tracking_frame_buf.h b/liboptv/include/tracking_frame_buf.h index fa2a8f70..15de6ea3 100644 --- a/liboptv/include/tracking_frame_buf.h +++ b/liboptv/include/tracking_frame_buf.h @@ -82,72 +82,11 @@ int write_frame(frame *self, char *corres_file_base, char *linkage_file_base, char *prio_file_base, char **target_file_base, int frame_num); -/* - * Following is the frame buffer class, that holds a given number of frame structs, - * and treats them as a deque (doube-ended queue, a queue that can advance forward - * or backward). - * - * The memory locations are advanced with fb_next()/fb_prev(). Filling out the new - * frame that joined the queue and flushing out the frame that exited the queue - * are respectively done using fb_read_frame_at_end() and fb_write_frame_from_start(). - * - * To make it possible to read frames from different sources, we use a - * base-class/child-class structure. framebuf_base is the base class, and implements - * only the memory-advance methods. The filling-out of frames is done by - * "virtual" functions. That is to say, fb_read_frame_at_end, for example, - * only forwards the call to a function that really reads the data. - * - * The virtual functions are placed in the "vtable" by the constructor - the - * function that allocates and populates the child class. - * - * In tracking_framebuf.c and here there's an example child-class that reads - * frame information from *_target files. This is the original mode of - * liboptv. The struct framebuf *inherits* from framebuf_base (by incorporating - * the base as 1st member - the order is important). fb_init(), the constructor, - * then populates the vtable with fb_disk_* functions. These are the derived - * implementations of the base-class virtual functions. - * - * There is also a virtual destructor, fb_free(), which delegates to the free() - * virtual function, and implemented in the example by fb_disk_free(). - * - * Note: fb_disk_free does not release the strings it holds, as I don't remember if - * it owns them. - * - * Yes, in C++ it's easier :) - */ - -// Virtual function table definitions for frame buffer objects: -typedef struct framebuf_base* fbp; typedef struct { - void (*free)(fbp self); - int (*read_frame_at_end)(fbp self, int frame_num, int read_links); - int (*write_frame_from_start)(fbp self, int frame_num); -} fb_vtable; - -typedef struct framebuf_base { - fb_vtable *_vptr; - /* _ring_vec is the underlying double-size vector, buf is the pointer to the start of the ring. */ frame **buf, **_ring_vec; int buf_len, num_cams; -} framebuf_base; - -// These just call the corresponding virtual function. -// Actual implementations are below each child class. -void fb_free(framebuf_base *self); -int fb_read_frame_at_end(framebuf_base *self, int frame_num, int read_links); -int fb_write_frame_from_start(framebuf_base *self, int frame_num); - -// Non-virtual methods of the base class. -void fb_base_init(framebuf_base *new_buf, int buf_len, int num_cams, int max_targets); -void fb_next(framebuf_base *self); -void fb_prev(framebuf_base *self); - -// child class that reads from _target files. -typedef struct { - framebuf_base base; // must be 1st member. - char *corres_file_base, *linkage_file_base, *prio_file_base; char **target_file_base; } framebuf; @@ -155,9 +94,10 @@ typedef struct { void fb_init(framebuf *new_buf, int buf_len, int num_cams, int max_targets,\ char *corres_file_base, char* linkage_file_base, char *prio_file_base, char **target_file_base); - -void fb_disk_free(framebuf_base *self); -int fb_disk_read_frame_at_end(framebuf_base *self, int frame_num, int read_links); -int fb_disk_write_frame_from_start(framebuf_base *self, int frame_num); +void fb_free(framebuf *self); +void fb_next(framebuf *self); +void fb_prev(framebuf *self); +int fb_read_frame_at_end(framebuf *self, int frame_num, int read_links); +int fb_write_frame_from_start(framebuf *self, int frame_num); #endif diff --git a/liboptv/include/tracking_run.h b/liboptv/include/tracking_run.h index 6cc6e146..8e935afd 100644 --- a/liboptv/include/tracking_run.h +++ b/liboptv/include/tracking_run.h @@ -12,7 +12,7 @@ #include "tracking_frame_buf.h" typedef struct { - framebuf_base *fb; + framebuf *fb; sequence_par *seq_par; track_par *tpar; volume_par *vpar; diff --git a/liboptv/src/track.c b/liboptv/src/track.c index 55b2df75..a720c918 100644 --- a/liboptv/src/track.c +++ b/liboptv/src/track.c @@ -681,7 +681,7 @@ void trackcorr_c_loop (tracking_run *run_info, int step) { /* Shortcuts into the tracking_run struct */ Calibration **cal; - framebuf_base *fb; + framebuf *fb; track_par *tpar; volume_par *vpar; control_par *cpar; @@ -1002,7 +1002,7 @@ double trackback_c (tracking_run *run_info) track_par *tpar; volume_par *vpar; control_par *cpar; - framebuf_base *fb; + framebuf *fb; Calibration **cal; /* Shortcuts to inside current frame */ diff --git a/liboptv/src/tracking_frame_buf.c b/liboptv/src/tracking_frame_buf.c index 5c195a1f..e5c5939f 100644 --- a/liboptv/src/tracking_frame_buf.c +++ b/liboptv/src/tracking_frame_buf.c @@ -556,26 +556,33 @@ int write_frame(frame *self, char *corres_file_base, char *linkage_file_base, return 1; } -// ----- Virtual functions redirection - -void fb_free(framebuf_base *self) { - self->_vptr->free(self); -} - -int fb_read_frame_at_end(framebuf_base *self, int frame_num, int read_links) { - return self->_vptr->read_frame_at_end(self, frame_num, read_links); -} - -int fb_write_frame_from_start(framebuf_base *self, int frame_num) { - return self->_vptr->write_frame_from_start(self, frame_num); -} +/* fb_init() allocates a frame buffer object and creates the frames + * it buffers. The buffer is a ring-buffer based on a double-size vector. + * + * Arguments: + * int buf_len - number of frames in the buffer. + * int num_cams - number of cameras per frame. + * int max_targets - number of elements to allocate for the different buffers + * held by a frame. + * char *rt_file_base + * + * Returns: + * a pointer to the new dynamically allocated frame-buffer structure. + */ -void fb_base_init(framebuf_base *new_buf, int buf_len, int num_cams, int max_targets) { +void fb_init(framebuf *new_buf, int buf_len, int num_cams, int max_targets,\ + char *corres_file_base, char *linkage_file_base, char *prio_file_base, + char **target_file_base) +{ frame *alloc_frame; - + new_buf->buf_len = buf_len; new_buf->num_cams = num_cams; - + new_buf->corres_file_base = corres_file_base; + new_buf->linkage_file_base = linkage_file_base; + new_buf->prio_file_base = prio_file_base; + new_buf->target_file_base = target_file_base; + new_buf->_ring_vec = (frame **) calloc(buf_len*2, sizeof(frame *)); new_buf->buf = new_buf->_ring_vec + buf_len; @@ -593,11 +600,15 @@ void fb_base_init(framebuf_base *new_buf, int buf_len, int num_cams, int max_tar } /* Leaves new_buf->buf pointing to the beginning of _ring_vec, which is what we want. */ - - new_buf->_vptr = (fb_vtable*) malloc(sizeof(fb_vtable)); } -void fb_base_free(framebuf_base *self) { +/* fb_free() frees all memory allocated for the frames and ring vector in a + * framebuf object. + * + * Arguments: + * framebuf *self - the framebuf holding the memory to free. + */ +void fb_free(framebuf *self) { self->buf = self->_ring_vec; while (self->buf != self->_ring_vec + self->buf_len) { @@ -609,53 +620,6 @@ void fb_base_free(framebuf_base *self) { free(self->_ring_vec); self->_ring_vec = NULL; - - free(self->_vptr); - self->_vptr = NULL; -} - -// -------- Specific Implementations of virtual functions. - -/* fb_init() allocates a frame buffer object and creates the frames - * it buffers. The buffer is a ring-buffer based on a double-size vector. - * - * Arguments: - * int buf_len - number of frames in the buffer. - * int num_cams - number of cameras per frame. - * int max_targets - number of elements to allocate for the different buffers - * held by a frame. - * char *rt_file_base - * - * Returns: - * a pointer to the new dynamically allocated frame-buffer structure. - */ - -void fb_init(framebuf *new_buf, int buf_len, int num_cams, int max_targets,\ - char *corres_file_base, char *linkage_file_base, char *prio_file_base, - char **target_file_base) -{ - fb_base_init(&new_buf->base, buf_len, num_cams, max_targets); - - // Subclass-specific parameters: - new_buf->corres_file_base = corres_file_base; - new_buf->linkage_file_base = linkage_file_base; - new_buf->prio_file_base = prio_file_base; - new_buf->target_file_base = target_file_base; - - // Set up the virtual functions table: - new_buf->base._vptr->free = fb_disk_free; - new_buf->base._vptr->read_frame_at_end = fb_disk_read_frame_at_end; - new_buf->base._vptr->write_frame_from_start = fb_disk_write_frame_from_start; -} - -/* fb_free() frees all memory allocated for the frames and ring vector in a - * framebuf object. - * - * Arguments: - * framebuf *self - the framebuf holding the memory to free. - */ -void fb_disk_free(framebuf_base *self_base) { - fb_base_free(self_base); } /* fb_next() advances the start pointer of the frame buffer, resetting it to the @@ -664,7 +628,7 @@ void fb_disk_free(framebuf_base *self_base) { * Arguments: * framebuf *self - the framebuf to advance. */ -void fb_next(framebuf_base *self) { +void fb_next(framebuf *self) { self->buf++; if (self->buf - self->_ring_vec >= self->buf_len) self->buf = self->_ring_vec; @@ -676,7 +640,7 @@ void fb_next(framebuf_base *self) { * Arguments: * framebuf *self - the framebuf to advance. */ -void fb_prev(framebuf_base *self) { +void fb_prev(framebuf *self) { self->buf--; if (self->buf < self->_ring_vec) self->buf = self->_ring_vec + self->buf_len - 1; @@ -692,15 +656,13 @@ void fb_prev(framebuf_base *self) { * Returns: * True on success, false on failure. */ -int fb_disk_read_frame_at_end(framebuf_base *self_base, int frame_num, int read_links) { - framebuf* self = (framebuf*)self_base; - +int fb_read_frame_at_end(framebuf *self, int frame_num, int read_links) { if (read_links) { - return read_frame(self->base.buf[self->base.buf_len - 1], self->corres_file_base, + return read_frame(self->buf[self->buf_len - 1], self->corres_file_base, self->linkage_file_base, self->prio_file_base, self->target_file_base, frame_num); } else { - return read_frame(self->base.buf[self->base.buf_len - 1], self->corres_file_base, + return read_frame(self->buf[self->buf_len - 1], self->corres_file_base, NULL, NULL, self->target_file_base, frame_num); } } @@ -708,16 +670,14 @@ int fb_disk_read_frame_at_end(framebuf_base *self_base, int frame_num, int read_ /* fb_write_frame_from_start() writes the frame to the first position in the ring. * * Arguments: - * *self - the framebuf object doing the reading. + * framebuf *self - the framebuf object doing the reading. * int frame_num - number of the frame to write in the sequence of frames. * * Returns: * True on success, false on failure. */ -int fb_disk_write_frame_from_start(framebuf_base *self_base, int frame_num) { - framebuf* self = (framebuf*)self_base; - - return write_frame(self->base.buf[0], self->corres_file_base, +int fb_write_frame_from_start(framebuf *self, int frame_num) { + return write_frame(self->buf[0], self->corres_file_base, self->linkage_file_base, self->prio_file_base, self->target_file_base, frame_num); } diff --git a/liboptv/src/tracking_run.c b/liboptv/src/tracking_run.c index 8c983ae2..cb19bed2 100644 --- a/liboptv/src/tracking_run.c +++ b/liboptv/src/tracking_run.c @@ -60,8 +60,8 @@ tracking_run *tr_new(sequence_par *seq_par, track_par *tpar, tr->cal = cal; tr->flatten_tol = flatten_tol; - tr->fb = (framebuf_base*) malloc(sizeof(framebuf)); - fb_init((framebuf*)tr->fb, buf_len, cpar->num_cams, max_targets, + tr->fb = (framebuf *) malloc(sizeof(framebuf)); + fb_init(tr->fb, buf_len, cpar->num_cams, max_targets, corres_file_base, linkage_file_base, prio_file_base, seq_par->img_base_name); tr->lmax = norm((tpar->dvxmin - tpar->dvxmax), \ From 037be89a256aa5ab483910d98a049e5417030fa4 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 22 Sep 2019 10:44:23 +0300 Subject: [PATCH 26/35] that was an obvious bug - the loop wasn't closed --- liboptv/src/main.c | 106 ++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 54 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index d366c6f3..1136e583 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -75,7 +75,7 @@ int main() { // initialize variables - int i, cam, ntargets, step, geo_id; + int i, cam, ntargets, step, lstep, geo_id; coord_2d **corrected; int match_counts[4]; n_tupel *corresp_buf; @@ -84,6 +84,7 @@ int main() vec2d targ; framebuf *frm; + // temporary variables will be replaced per particle corres t_corres = { 3, {96, 66, 26, 26} }; P t_path = { .x = {45.219, -20.269, 25.946}, @@ -138,8 +139,6 @@ int main() "parameters/ptv.par", calib); - frm = *(run->fb); - // if (argc == 4) // { // run->seq_par->first = atoi(argv[2]); @@ -150,16 +149,11 @@ int main() printf("from frame %d to frame %d \n", run->seq_par->first, run->seq_par->last); - // target_par *targ_read = read_target_par("parameters/targ_rec.par"); - - // initialize memory buffers - - // for (step = 0; step < N_FRAMES_IN_DIRECTORY-BUFFER_LENGTH-1; step+BUFFER_LENGTH){ - // MAIN LOOP - see below we will camust give inputs of 10000 10004 as a very simple approach - // for each camera and for each time step the images are processed for (step = run->seq_par->first; step < run->seq_par->last + 1; step++) { + lstep = step - run->seq_par->first; // local step + for (cam = 0; cam < run->cpar->num_cams; cam++) { // we decided to focus camust on the _targets, so we will read them from the @@ -167,25 +161,25 @@ int main() printf("reading targets from %s%d\n", run->fb->target_file_base[cam], step); - run->fb->buf[step - run->seq_par->first]->num_targets[cam] = read_targets( - run->fb->buf[step - run->seq_par->first]->targets[cam], run->fb->target_file_base[cam], step); + run->fb->buf[lstep]->num_targets[cam] = read_targets( + run->fb->buf[lstep]->targets[cam], run->fb->target_file_base[cam], step); - quicksort_target_y(run->fb->buf[step - run->seq_par->first]->targets[cam], run->fb->buf[step - run->seq_par->first]->num_targets[cam]); + quicksort_target_y(run->fb->buf[lstep]->targets[cam], run->fb->buf[lstep]->num_targets[cam]); - for (i = 0; i < run->fb->buf[step - run->seq_par->first]->num_targets[cam]; i++) - run->fb->buf[step - run->seq_par->first]->targets[cam][i].pnr = i; + for (i = 0; i < run->fb->buf[lstep]->num_targets[cam]; i++) + run->fb->buf[lstep]->targets[cam][i].pnr = i; // debugging purposes print the status of targets - see below another print. printf("%d targets and the first is %f,%f \n ", - run->fb->buf[step - run->seq_par->first]->num_targets[cam], - run->fb->buf[step - run->seq_par->first]->targets[cam][0].x, - run->fb->buf[step - run->seq_par->first]->targets[cam][0].y); + run->fb->buf[lstep]->num_targets[cam], + run->fb->buf[lstep]->targets[cam][0].x, + run->fb->buf[lstep]->targets[cam][0].y); } // inner loop is per camera - corrected = correct_frame(run->fb->buf[step - run->seq_par->first], calib, cpar, 0.0001); - corresp_buf = correspondences(run->fb->buf[step - run->seq_par->first], corrected, run->vpar, run->cpar, calib, match_counts); - run->fb->buf[step - run->seq_par->first]->num_parts = match_counts[run->cpar->num_cams - 1]; - printf("number of matched points is %d \n ", run->fb->buf[step - run->seq_par->first]->num_parts); + corrected = correct_frame(run->fb->buf[lstep], calib, cpar, 0.0001); + corresp_buf = correspondences(run->fb->buf[lstep], corrected, run->vpar, run->cpar, calib, match_counts); + run->fb->buf[lstep]->num_parts = match_counts[run->cpar->num_cams - 1]; + printf("number of matched points is %d \n ", run->fb->buf[lstep]->num_parts); // first we need to create 3d points after correspondences and fill it into the buffer // use point_position and loop through the num_parts @@ -198,43 +192,46 @@ int main() // shortcut - int num_parts = run->fb->buf[step - run->seq_par->first]->num_parts; int p[4]; float x[4],y[4],skew_dist; - - for (i=0; icpar->num_cams; cam++) { - if (corresp_buf[i].p[cam] >= 0) + for (i=0; ifb->buf[lstep]->num_parts; i++) { + for (cam = 0; cam < run->cpar->num_cams; cam++) { + printf("cam = %d\n",cam); + if (corresp_buf[i].p[cam] > -1){ p[cam] = corrected[cam][corresp_buf[i].p[cam]].pnr; - else + printf("p[%d] = %d,%d\n",cam,corresp_buf[i].p[cam],corrected[cam][corresp_buf[i].p[cam]].pnr); + }else{ p[cam] = -1; + printf("p[%d] = -1\n",cam); + } + + + + // printf("corrected %d %f %f \n ",corrected[cam][corresp_buf[i].p[cam]].pnr, corrected[cam][corresp_buf[i].p[cam]].x,corrected[cam][corresp_buf[i].p[cam]].y); + if (p[cam] > -1){ + pixel_to_metric(&targ[0], &targ[1], \ + run->fb->buf[lstep]->targets[cam][p[cam]].x, \ + run->fb->buf[lstep]->targets[cam][p[cam]].y, \ + run->cpar); + } else { + targ[0] = 1e-10; + targ[1] = 1e-10; + } + skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); + + t_corres.nr = i; + for (cam=0; cam < run->cpar->num_cams; cam++){ + t_corres.p[cam] = run->fb->buf[lstep]->targets[cam][p[cam]].pnr; + } + run->fb->buf[lstep]->correspond[i] = t_corres; + + t_path.x[0] = res[0]; + t_path.x[1] = res[1]; + t_path.x[2] = res[2]; + + run->fb->buf[lstep]->path_info[i] = t_path; } - - - // printf("corrected %d %f %f \n ",corrected[cam][corresp_buf[i].p[cam]].pnr, corrected[cam][corresp_buf[i].p[cam]].x,corrected[cam][corresp_buf[i].p[cam]].y); - if (p[cam] > -1){ - pixel_to_metric(&targ[0], &targ[1], \ - run->fb->buf[step - run->seq_par->first]->targets[cam][p[cam]].x, \ - run->fb->buf[step - run->seq_par->first]->targets[cam][p[cam]].y, \ - run->cpar); - } else { - targ[0] = 1e-10; - targ[1] = 1e-10; - } - skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); - - t_corres.nr = i; - for (cam=0; cam < run->cpar->num_cams; cam++){ - t_corres.p[cam] = run->fb->buf[step - run->seq_par->first]->targets[cam][p[cam]].pnr; - } - run->fb->buf[step - run->seq_par->first]->correspond[i] = t_corres; - - t_path.x[0] = res[0]; - t_path.x[1] = res[1]; - t_path.x[2] = res[2]; - - run->fb->buf[step - run->seq_par->first]->path_info[i] = t_path; } } // external loop is through frames @@ -243,7 +240,8 @@ int main() // we do not need to read frames - it's all in memory now // track_forward_start(run); - for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) + for (step = run->seq_par->first; step < run->seq_par->last; step++) + // for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) { trackcorr_c_loop(run, step); } From e8c45c81ee4dcba336e217e5d0f6cb7d6b5b7cea Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 22 Sep 2019 22:58:02 +0300 Subject: [PATCH 27/35] another loop bug --- liboptv/src/main.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 1136e583..ab8a7564 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -197,13 +197,12 @@ int main() for (i=0; ifb->buf[lstep]->num_parts; i++) { for (cam = 0; cam < run->cpar->num_cams; cam++) { - printf("cam = %d\n",cam); if (corresp_buf[i].p[cam] > -1){ p[cam] = corrected[cam][corresp_buf[i].p[cam]].pnr; - printf("p[%d] = %d,%d\n",cam,corresp_buf[i].p[cam],corrected[cam][corresp_buf[i].p[cam]].pnr); + // printf("p[%d] = %d,%d\n",cam,corresp_buf[i].p[cam],corrected[cam][corresp_buf[i].p[cam]].pnr); }else{ p[cam] = -1; - printf("p[%d] = -1\n",cam); + // printf("p[%d] = -1\n",cam); } @@ -214,16 +213,19 @@ int main() run->fb->buf[lstep]->targets[cam][p[cam]].x, \ run->fb->buf[lstep]->targets[cam][p[cam]].y, \ run->cpar); + printf("%f %f %d\n",targ[0],targ[1],p[cam]); } else { targ[0] = 1e-10; targ[1] = 1e-10; } skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); + printf("skew_dist = %f\n",skew_dist); + + // for (cam=0; cam < run->cpar->num_cams; cam++){ + t_corres.p[cam] = run->fb->buf[lstep]->targets[cam][p[cam]].pnr; + } t_corres.nr = i; - for (cam=0; cam < run->cpar->num_cams; cam++){ - t_corres.p[cam] = run->fb->buf[lstep]->targets[cam][p[cam]].pnr; - } run->fb->buf[lstep]->correspond[i] = t_corres; t_path.x[0] = res[0]; @@ -231,7 +233,7 @@ int main() t_path.x[2] = res[2]; run->fb->buf[lstep]->path_info[i] = t_path; - } + //} } } // external loop is through frames @@ -240,12 +242,14 @@ int main() // we do not need to read frames - it's all in memory now // track_forward_start(run); - for (step = run->seq_par->first; step < run->seq_par->last; step++) - // for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) - { - trackcorr_c_loop(run, step); - } - trackcorr_c_finish(run, run->seq_par->last); + // for (step = run->seq_par->first + 1 ; step < run->seq_par->last; step++) + // // for (step = run->seq_par->first + 1; step < run->seq_par->last; step++) + // { + // trackcorr_c_loop(run, step); + // } + // trackcorr_c_finish(run, run->seq_par->last); + + trackcorr_c_loop(run, run->seq_par->first); // probably here we need to send something to plot it // or store in some memory for the next chunk? From 491bd5cdd33c0dcd26efd73599c60a719745c3f8 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 22 Sep 2019 23:09:01 +0300 Subject: [PATCH 28/35] removed annoying print multimed file main.c runs but does not track anything --- liboptv/src/main.c | 14 +++++++------- liboptv/src/multimed.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index ab8a7564..37ba75ca 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -170,16 +170,16 @@ int main() run->fb->buf[lstep]->targets[cam][i].pnr = i; // debugging purposes print the status of targets - see below another print. - printf("%d targets and the first is %f,%f \n ", - run->fb->buf[lstep]->num_targets[cam], - run->fb->buf[lstep]->targets[cam][0].x, - run->fb->buf[lstep]->targets[cam][0].y); + // printf("%d targets and the first is %f,%f \n ", + // run->fb->buf[lstep]->num_targets[cam], + // run->fb->buf[lstep]->targets[cam][0].x, + // run->fb->buf[lstep]->targets[cam][0].y); } // inner loop is per camera corrected = correct_frame(run->fb->buf[lstep], calib, cpar, 0.0001); corresp_buf = correspondences(run->fb->buf[lstep], corrected, run->vpar, run->cpar, calib, match_counts); run->fb->buf[lstep]->num_parts = match_counts[run->cpar->num_cams - 1]; - printf("number of matched points is %d \n ", run->fb->buf[lstep]->num_parts); + // printf("number of matched points is %d \n ", run->fb->buf[lstep]->num_parts); // first we need to create 3d points after correspondences and fill it into the buffer // use point_position and loop through the num_parts @@ -213,13 +213,13 @@ int main() run->fb->buf[lstep]->targets[cam][p[cam]].x, \ run->fb->buf[lstep]->targets[cam][p[cam]].y, \ run->cpar); - printf("%f %f %d\n",targ[0],targ[1],p[cam]); + // printf("%f %f %d\n",targ[0],targ[1],p[cam]); } else { targ[0] = 1e-10; targ[1] = 1e-10; } skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); - printf("skew_dist = %f\n",skew_dist); + // printf("skew_dist = %f\n",skew_dist); // for (cam=0; cam < run->cpar->num_cams; cam++){ diff --git a/liboptv/src/multimed.c b/liboptv/src/multimed.c index 2abe4388..84706211 100644 --- a/liboptv/src/multimed.c +++ b/liboptv/src/multimed.c @@ -104,7 +104,7 @@ double multimed_r_nlay (Calibration *cal, mm_np *mm, vec3d pos) { if (it >= n_iter) { - printf ("multimed_r_nlay stopped after %d iterations\n", n_iter); + //printf ("multimed_r_nlay stopped after %d iterations\n", n_iter); return (1.0); } From d9ccb0aca82d01e56ef27d0ddb2b79353bfb58aa Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Mon, 23 Sep 2019 06:51:10 +0300 Subject: [PATCH 29/35] "working" means not failing. but not tracking as 3d positions are wrong. cannot find what's wrong now in the projection from 2D to 3D - results are aweful. --- liboptv/src/main.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 37ba75ca..44dc1622 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -209,17 +209,26 @@ int main() // printf("corrected %d %f %f \n ",corrected[cam][corresp_buf[i].p[cam]].pnr, corrected[cam][corresp_buf[i].p[cam]].x,corrected[cam][corresp_buf[i].p[cam]].y); if (p[cam] > -1){ - pixel_to_metric(&targ[0], &targ[1], \ - run->fb->buf[lstep]->targets[cam][p[cam]].x, \ - run->fb->buf[lstep]->targets[cam][p[cam]].y, \ - run->cpar); + // Here I'm kind of lost that should be sent to point_position()? + // apparently it says: "the 2D metric, flat, centred coordinates + // of the identified point projection" + // so it's corrected? + // the skew_distance is then huge and positions are wrong as printed + targ[0] = corrected[cam][p[cam]].x; + targ[1] = corrected[cam][p[cam]].y; + // pixel_to_metric(&targ[0], &targ[1], \ + // run->fb->buf[lstep]->targets[cam][p[cam]].x, \ + // run->fb->buf[lstep]->targets[cam][p[cam]].y, \ + // run->cpar); // printf("%f %f %d\n",targ[0],targ[1],p[cam]); + printf("2D is %f %f %d\n",targ[0],targ[1],p[cam]); } else { targ[0] = 1e-10; targ[1] = 1e-10; } skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); - // printf("skew_dist = %f\n",skew_dist); + printf("skew_dist = %f\n",skew_dist); + printf("3d pos = %f, %f, %f\n",res[0],res[1],res[2]); // for (cam=0; cam < run->cpar->num_cams; cam++){ From bcf466df1a352e758a2805477383c6421ec49875 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Wed, 25 Sep 2019 22:43:34 +0300 Subject: [PATCH 30/35] small adjustments. smaller tolerance. looking for a bug --- liboptv/src/main.c | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 44dc1622..131807f6 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -132,7 +132,6 @@ int main() control_par *cpar = read_control_par("parameters/ptv.par"); read_all_calibration(calib, cpar); free_control_par(cpar); - printf("read calibrations\n"); run = tr_new_legacy("parameters/sequence.par", "parameters/track.par", "parameters/criteria.par", @@ -176,9 +175,12 @@ int main() // run->fb->buf[lstep]->targets[cam][0].y); } // inner loop is per camera - corrected = correct_frame(run->fb->buf[lstep], calib, cpar, 0.0001); - corresp_buf = correspondences(run->fb->buf[lstep], corrected, run->vpar, run->cpar, calib, match_counts); - run->fb->buf[lstep]->num_parts = match_counts[run->cpar->num_cams - 1]; + corrected = correct_frame(run->fb->buf[lstep], run->cal, run->cpar, 0.00001); + corresp_buf = correspondences(run->fb->buf[lstep], corrected, run->vpar, run->cpar, run->cal, match_counts); + + // run->fb->buf[lstep]->num_parts = match_counts[run->cpar->num_cams - 1]; + // let's try to take only quadruplets + run->fb->buf[lstep]->num_parts = match_counts[0]; // printf("number of matched points is %d \n ", run->fb->buf[lstep]->num_parts); // first we need to create 3d points after correspondences and fill it into the buffer @@ -199,36 +201,19 @@ int main() for (cam = 0; cam < run->cpar->num_cams; cam++) { if (corresp_buf[i].p[cam] > -1){ p[cam] = corrected[cam][corresp_buf[i].p[cam]].pnr; + targ[0] = corrected[cam][p[cam]].x; + targ[1] = corrected[cam][p[cam]].y; + // printf("2D is %f %f %d\n",targ[0],targ[1],p[cam]); // printf("p[%d] = %d,%d\n",cam,corresp_buf[i].p[cam],corrected[cam][corresp_buf[i].p[cam]].pnr); }else{ - p[cam] = -1; - // printf("p[%d] = -1\n",cam); - } - - - - // printf("corrected %d %f %f \n ",corrected[cam][corresp_buf[i].p[cam]].pnr, corrected[cam][corresp_buf[i].p[cam]].x,corrected[cam][corresp_buf[i].p[cam]].y); - if (p[cam] > -1){ - // Here I'm kind of lost that should be sent to point_position()? - // apparently it says: "the 2D metric, flat, centred coordinates - // of the identified point projection" - // so it's corrected? - // the skew_distance is then huge and positions are wrong as printed - targ[0] = corrected[cam][p[cam]].x; - targ[1] = corrected[cam][p[cam]].y; - // pixel_to_metric(&targ[0], &targ[1], \ - // run->fb->buf[lstep]->targets[cam][p[cam]].x, \ - // run->fb->buf[lstep]->targets[cam][p[cam]].y, \ - // run->cpar); - // printf("%f %f %d\n",targ[0],targ[1],p[cam]); - printf("2D is %f %f %d\n",targ[0],targ[1],p[cam]); - } else { targ[0] = 1e-10; targ[1] = 1e-10; + // printf("p[%d] = -1\n",cam); } + skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); - printf("skew_dist = %f\n",skew_dist); - printf("3d pos = %f, %f, %f\n",res[0],res[1],res[2]); + // printf("skew_dist = %f\n",skew_dist); + // printf("3d pos = %f, %f, %f\n",res[0],res[1],res[2]); // for (cam=0; cam < run->cpar->num_cams; cam++){ From 9641eeb207d6a81837a8565f7046bb8fd4c6dfce Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 29 Sep 2019 17:13:08 +0300 Subject: [PATCH 31/35] now the only missing part is tracking buffer. found all bugs in positions, maybe only correspondences and path info. --- liboptv/src/main.c | 67 ++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 131807f6..9f1b0878 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -34,14 +34,16 @@ void read_all_calibration(Calibration *calib[4], control_par *cpar) coord_2d **correct_frame(frame *frm, Calibration *calib[], control_par *cpar, double tol) { - coord_2d **corrected; + coord_2d **corrected, **tmp; int cam, part; corrected = (coord_2d **)malloc(cpar->num_cams * sizeof(coord_2d *)); + tmp = (coord_2d **)malloc(cpar->num_cams * sizeof(coord_2d *)); for (cam = 0; cam < cpar->num_cams; cam++) { corrected[cam] = (coord_2d *)malloc( frm->num_targets[cam] * sizeof(coord_2d)); + tmp[cam] = (coord_2d *)malloc(frm->num_targets[cam] * sizeof(coord_2d)); if (corrected[cam] == NULL) { /* roll back allocations and fail */ @@ -53,14 +55,13 @@ coord_2d **correct_frame(frame *frm, Calibration *calib[], control_par *cpar, for (part = 0; part < frm->num_targets[cam]; part++) { - pixel_to_metric(&corrected[cam][part].x, &corrected[cam][part].y, + pixel_to_metric(&tmp[cam][part].x, &tmp[cam][part].y, frm->targets[cam][part].x, frm->targets[cam][part].y, cpar); - dist_to_flat(corrected[cam][part].x, corrected[cam][part].y, + dist_to_flat(tmp[cam][part].x, tmp[cam][part].y, calib[cam], &corrected[cam][part].x, &corrected[cam][part].y, tol); - corrected[cam][part].pnr = frm->targets[cam][part].pnr; } @@ -81,7 +82,7 @@ int main() n_tupel *corresp_buf; tracking_run *run; vec3d res; - vec2d targ; + vec2d targ[4],tmp; framebuf *frm; // temporary variables will be replaced per particle @@ -122,7 +123,9 @@ int main() // change directory to the user-supplied working folder // chdir(argv[1]); - chdir("../tests/testing_fodder/test_cavity/"); + // chdir("../tests/testing_fodder/test_cavity/"); + chdir("/Users/alex/Documents/OpenPTV/test_cavity"); + // chdir("/Users/alex/Documents/OpenPTV/one-dot-example/working_folder"); // printf("changed directory to %s\n", argv[1]); @@ -143,7 +146,7 @@ int main() // run->seq_par->first = atoi(argv[2]); // run->seq_par->last = atoi(argv[3]); // } - run->seq_par->first = 10001; + run->seq_par->first = 10000; run->seq_par->last = 10004; printf("from frame %d to frame %d \n", run->seq_par->first, run->seq_par->last); @@ -158,30 +161,20 @@ int main() // we decided to focus camust on the _targets, so we will read them from the // test directory test_cavity - printf("reading targets from %s%d\n", run->fb->target_file_base[cam], step); - run->fb->buf[lstep]->num_targets[cam] = read_targets( run->fb->buf[lstep]->targets[cam], run->fb->target_file_base[cam], step); quicksort_target_y(run->fb->buf[lstep]->targets[cam], run->fb->buf[lstep]->num_targets[cam]); for (i = 0; i < run->fb->buf[lstep]->num_targets[cam]; i++) - run->fb->buf[lstep]->targets[cam][i].pnr = i; + run->fb->buf[lstep]->targets[cam][i].pnr = i; - // debugging purposes print the status of targets - see below another print. - // printf("%d targets and the first is %f,%f \n ", - // run->fb->buf[lstep]->num_targets[cam], - // run->fb->buf[lstep]->targets[cam][0].x, - // run->fb->buf[lstep]->targets[cam][0].y); } // inner loop is per camera corrected = correct_frame(run->fb->buf[lstep], run->cal, run->cpar, 0.00001); corresp_buf = correspondences(run->fb->buf[lstep], corrected, run->vpar, run->cpar, run->cal, match_counts); - - // run->fb->buf[lstep]->num_parts = match_counts[run->cpar->num_cams - 1]; - // let's try to take only quadruplets + run->fb->buf[lstep]->num_parts = match_counts[0]; - // printf("number of matched points is %d \n ", run->fb->buf[lstep]->num_parts); // first we need to create 3d points after correspondences and fill it into the buffer // use point_position and loop through the num_parts @@ -195,33 +188,37 @@ int main() // shortcut int p[4]; - float x[4],y[4],skew_dist; + double x,y; + float skew_dist; for (i=0; ifb->buf[lstep]->num_parts; i++) { for (cam = 0; cam < run->cpar->num_cams; cam++) { if (corresp_buf[i].p[cam] > -1){ p[cam] = corrected[cam][corresp_buf[i].p[cam]].pnr; - targ[0] = corrected[cam][p[cam]].x; - targ[1] = corrected[cam][p[cam]].y; - // printf("2D is %f %f %d\n",targ[0],targ[1],p[cam]); - // printf("p[%d] = %d,%d\n",cam,corresp_buf[i].p[cam],corrected[cam][corresp_buf[i].p[cam]].pnr); + x = run->fb->buf[lstep]->targets[cam][p[cam]].x; + y = run->fb->buf[lstep]->targets[cam][p[cam]].y; + + pixel_to_metric(&x, &y, x, y, run->cpar); + dist_to_flat(x, y,run->cal[cam], &x, &y,0.00001); + + targ[cam][0] = x; + targ[cam][1] = y; }else{ - targ[0] = 1e-10; - targ[1] = 1e-10; - // printf("p[%d] = -1\n",cam); + targ[cam][0] = 1e-10; + targ[cam][1] = 1e-10; } - - skew_dist = point_position(&targ, run->cpar->num_cams, run->cpar->mm, calib, res); - // printf("skew_dist = %f\n",skew_dist); - // printf("3d pos = %f, %f, %f\n",res[0],res[1],res[2]); - - // for (cam=0; cam < run->cpar->num_cams; cam++){ - t_corres.p[cam] = run->fb->buf[lstep]->targets[cam][p[cam]].pnr; + t_corres.p[cam] = p[cam]; } + t_corres.nr = i; run->fb->buf[lstep]->correspond[i] = t_corres; + skew_dist = point_position(targ, run->cpar->num_cams, run->cpar->mm, run->cal, res); + // printf("skew_dist = %f\n",skew_dist); + // printf("3d pos = %f, %f, %f\n",res[0],res[1],res[2]); + + t_path.x[0] = res[0]; t_path.x[1] = res[1]; t_path.x[2] = res[2]; @@ -232,7 +229,7 @@ int main() } // external loop is through frames - run->tpar->add = 0; + run->tpar->add = 1; // we do not need to read frames - it's all in memory now // track_forward_start(run); From bb637252223250b0da2ade6be35c32e9e3001cad Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 29 Sep 2019 17:30:52 +0300 Subject: [PATCH 32/35] got rt_is. quality inside the buffer, hopefully --- liboptv/src/main.c | 17 ++++++++++++++--- .../main.dSYM/Contents/Resources/DWARF/main | Bin 134505 -> 134340 bytes 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 9f1b0878..8dc25d2b 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -191,6 +191,8 @@ int main() double x,y; float skew_dist; + printf("looks like rt_is.%d\n",step); + for (i=0; ifb->buf[lstep]->num_parts; i++) { for (cam = 0; cam < run->cpar->num_cams; cam++) { if (corresp_buf[i].p[cam] > -1){ @@ -211,12 +213,21 @@ int main() t_corres.p[cam] = p[cam]; } - t_corres.nr = i; + t_corres.nr = i+1; // identical to what I see in rt_is.10004 file run->fb->buf[lstep]->correspond[i] = t_corres; + + + + skew_dist = point_position(targ, run->cpar->num_cams, run->cpar->mm, run->cal, res); - // printf("skew_dist = %f\n",skew_dist); - // printf("3d pos = %f, %f, %f\n",res[0],res[1],res[2]); + + printf("%d \t ",run->fb->buf[lstep]->correspond[i].nr); + printf("%f,\t %f,\t %f\t ",res[0],res[1],res[2]); + for (cam=0;camcpar->num_cams; cam++) { + printf("%d\t ",run->fb->buf[lstep]->correspond[i].p[cam]); + } + printf("\n"); t_path.x[0] = res[0]; diff --git a/liboptv/src/main.dSYM/Contents/Resources/DWARF/main b/liboptv/src/main.dSYM/Contents/Resources/DWARF/main index a390ff76ec1c040bcac259eb3e4bf42ceb8bc770..4ddca76c2bf63d3ac8c05855ad8f649a3e8dff58 100644 GIT binary patch delta 26887 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 delta 27521 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 Pi`L$J$jjUO#bW;#5K8TT From 6feef9a5611831f663d4709f5f08cd86cc4beb25 Mon Sep 17 00:00:00 2001 From: Alex Liberzon <747110+alexlib@users.noreply.github.com> Date: Sun, 29 Sep 2019 17:46:44 +0300 Subject: [PATCH 33/35] it works !!! --- liboptv/src/main.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/liboptv/src/main.c b/liboptv/src/main.c index 8dc25d2b..b66889a3 100644 --- a/liboptv/src/main.c +++ b/liboptv/src/main.c @@ -149,7 +149,7 @@ int main() run->seq_par->first = 10000; run->seq_par->last = 10004; - printf("from frame %d to frame %d \n", run->seq_par->first, run->seq_par->last); + // printf("from frame %d to frame %d \n", run->seq_par->first, run->seq_par->last); // for each camera and for each time step the images are processed for (step = run->seq_par->first; step < run->seq_par->last + 1; step++) @@ -191,7 +191,7 @@ int main() double x,y; float skew_dist; - printf("looks like rt_is.%d\n",step); + //printf("looks like rt_is.%d\n",step); for (i=0; ifb->buf[lstep]->num_parts; i++) { for (cam = 0; cam < run->cpar->num_cams; cam++) { @@ -222,12 +222,12 @@ int main() skew_dist = point_position(targ, run->cpar->num_cams, run->cpar->mm, run->cal, res); - printf("%d \t ",run->fb->buf[lstep]->correspond[i].nr); - printf("%f,\t %f,\t %f\t ",res[0],res[1],res[2]); - for (cam=0;camcpar->num_cams; cam++) { - printf("%d\t ",run->fb->buf[lstep]->correspond[i].p[cam]); - } - printf("\n"); + // printf("%d \t ",run->fb->buf[lstep]->correspond[i].nr); + // printf("%f,\t %f,\t %f\t ",res[0],res[1],res[2]); + // for (cam=0;camcpar->num_cams; cam++) { + // printf("%d\t ",run->fb->buf[lstep]->correspond[i].p[cam]); + // } + // printf("\n"); t_path.x[0] = res[0]; @@ -240,7 +240,7 @@ int main() } // external loop is through frames - run->tpar->add = 1; + run->tpar->add = 0; // we do not need to read frames - it's all in memory now // track_forward_start(run); From e0aeab22c3a2a36c0c112b6885bce1f264ab4e91 Mon Sep 17 00:00:00 2001 From: Alex Liberzon Date: Sun, 29 Sep 2019 18:15:51 +0300 Subject: [PATCH 34/35] Delete Info.plist --- liboptv/src/main.dSYM/Contents/Info.plist | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 liboptv/src/main.dSYM/Contents/Info.plist diff --git a/liboptv/src/main.dSYM/Contents/Info.plist b/liboptv/src/main.dSYM/Contents/Info.plist deleted file mode 100644 index fe7fecda..00000000 --- a/liboptv/src/main.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.main - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - From fff72cfea68acee503464a03dd3275744514d7bb Mon Sep 17 00:00:00 2001 From: Alex Liberzon Date: Sun, 29 Sep 2019 18:16:10 +0300 Subject: [PATCH 35/35] Delete main --- .../main.dSYM/Contents/Resources/DWARF/main | Bin 134340 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 liboptv/src/main.dSYM/Contents/Resources/DWARF/main diff --git a/liboptv/src/main.dSYM/Contents/Resources/DWARF/main b/liboptv/src/main.dSYM/Contents/Resources/DWARF/main deleted file mode 100644 index 4ddca76c2bf63d3ac8c05855ad8f649a3e8dff58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134340 zcmeFa34EQ^dFOw1kI(C?t9_T{MY1f(@+Qm1HrSSp*+C|R1`^~Y$g(Zj3f>}J*_Z$Z z*^q^h$l02uV<1h^HWlC`ok=4@l1ZD1$x1S^<%}c*a!I8G$j^G<;G(C#IEJ9v-8HwuDNRc zRj+$3iE;nAw#Ma+PpX|}I_d1Z`Kpea$CkSHAD*}sOI7^^;VYe;sqWiTnfJ%H_Z-tv zOBdarX>U@ddMq|6c29P)v$H=nu(>~-HNL&_!#S?Kzev~c?MKN(*j{FQYOiy9_l`Z? zeN-CX-tn-#w#@Jx?4$NhAK#YUyZSQ|9^YQ^d;R#13K7Ep#>_X$41YU2xAdp_dUtJ0 zr^l|x7eCk~qS|7Eu)JjwpAvvXkAzTRD1J9~Ha?51G+_?A56+xzRRm&Uh|RpjvP z5@6HWdF5p{UzSw@emIbUpA-G3=|_Jm@9f;QqqBei&ds}bbnZ#@ow2>FX}b5LwzZx! zqJ(R2+wRONoIbupI6k+B!uPV4#Nlu4nD%yboo#$|VS6XD-pOuHTfIK3EVECqzwU;$ zS6zAC&0*ou5N>s0I)vZfl=`$_>fjm{tDV23BjA6_Wv{zB%;o3lu$||^+O59muYcgv z8jr@8=d*c#Yxm}XZJj%McXcc4Ozo}wa`-~nUYI)VCu(ocz~)_DJG=YGx3}{BaW{{y zeE;gomrrYAOh#6Fsr`FSZ|{#D@$I#j_}Bg@CmTv*nsSM#y{^8lUE8|*Pn+)xpZ4uV z0D7VH{Mrk*)#>d$>D#;XaX*$9rk`JXU7I)eb?-fWJsNi!2fqVhGmYOkzxE&|;rz$q z%g1*4_AZ^~$M>;so~ymCJ$rU^ce=&pmGSHQ5AX2ptts;D{lhSQaPU6*{S0V5! z1YU)}s}Oh<04$6l`_h=z{*A>xeNULar_9$M3e!X7KK)RbF8-lU|3#QS z+2h}reyH|NG9`XuC&F|rZ14FneGl@L%6}E6*ZjRt2W0B~p>4jsDPg+!8@_yDnBMeb zpS~hY@9FgQZw}L~Py2G3@$LPMProH9U*Oa4kIJk4`=1Qc#p`|fXT$Ut5Bc)1hv^&d z^XZ?4>60kpJjQ+%rk`Hs(+L(>^Vw79(+y#|4kc3cuL#q{5BT=}AWR<}^y!{3y=IlK zzbi~{y40ulNA+Lp({GE)@9^&*j^5wz(;p7g#Q;M6|8Z15Ob>_Yqhb0>QTd&|{tv@+ zYrF67Ct>>OH9q~TFnw~PPv@dcYW|zv;oq+c(?{!l`GPQg&wwvq9;WMl;LF!W@9*{H zw?y^7?#tg4)xX21?+()^H~IA2!}QR-KK=eM{oHGO`r$Br^i4kfi7*{&_36)q>AEdG zeJo6`K^qqQ{whj`>-9HbIu`af8l_Xd{)=IHC`?b9~FMnN_UURR1e_NP-4h2x}-x;P)e#qB96s9-*(x=}Qrk}pY*MBH_|2@9^@i6_x zIllZ0(fc!f`spxT9Hze;ria4)^V2XbgOJ8^GEBEl_vwF&-pA0X@;vL|@kIJ^ zU)~g^_iXazOTzSXAw9e@djH$L{_Df^CJ3kCw>zr8-KXCc)vxmDBVl??IKDp*({+`; zy(hwSY^G2DFihVQ(yts0MjHRqb-ukBVY;=!r{{<1*kS+v%BX&eFTX6RKi8+%hw0}Q z`t-gqU034M_eSYke0y&T)Aw}v^asN9jq7~+<57C4Pag}@M}OwiUk=kJXZ!RI!t|bS z|2!Y1@ACcsbC^CF(!<|H;cw)dye`|tAgKNXdS{ODMi z-V~O9IZW>f-~Zb%T^#oJcVYTynEq*$e!$P~*I~Nu13q1eZ$j|;VwF$N3DY;;?#Ht% zOh^8J%fj@@-M;*$F#YsD`1iY`@-4nx7MY#fJG*c1-ZGHt#-87`6?=YX*Ve6_d%F5k zy<2v4liIZnlU3K2Ej;%3clY;q?&{vxxo3BOZ>o3qE;3VH`e#S1b92|0+d5O&2Kzg2 z+}*n?73Fx_w?RQ*7k1I+C8vkJBi&p>4?_1Zsj+V-qN+BcXL*9 z_pVf*Y}{k&?C$H64Kiv2k4bl5@9wNtw(VfRnF@?(T!o!GJ9q8LRM^v%(l{~kryK3> ze)B;0t}WeTyH0iWZR<`=l$X^VfMB9yhP-$8j)9%&ws!UR_NTgcsh!@w&YfMUE!*X? zpzl5VJ9~By?Ai*zI=lM%y7q^ey*s;{*>#Jiz9rSUxo`KrU7cM$J-w{M1ex6|ZPym9 zL-;~ZA7|jf`GIs9;JUe#p+SchXhgzxLo!wjU6$z2j$-XdS7yGlD)!5bDyKVbs z&D`x%ZSpY_RL0mj?Hbq#=JfUM1;DjyRR4Ik9F?p?z)W? z(vv2TU1g7`NEWH_>C99iLKn#?2PUyw01lY4wO0twgCi_%kz<{2?$=zxUlx4v)=o$f zxgkaamp2deZn>>rxa(_XB{MIiGc)h?b?r+}1$c}8ZE@S!AuHPoM1q+0v1}TF%Oz(s z+wHbYa(sns%*tSWSbt~NE_Dgen1m}Om3i_cgD~LH-_9M~+q$-Z@SZ>Q?C#sw z)weaGnJ&}uaW$+(7VGHTA`;r$568~V+p&8$+>;y_{uNz2Bc?wfTDBMdBwoy~xO@1p zXHOqAf6Go@Q$gkdmKSFA?H12g>DJz!p3Ysn``{cdiEG+DcnYknOkqD;s*9BqMN|ps z6g~i1o*d)d3K@jyY8&nou}iT)TL*S--rUVDg<@>!4GSGZ8MAG(cnmMQa<}LFWA+~N zIoaDMJ4Y6!SO0qz0N z1F7B}{XUspzD0vVJ>J^8n?fA8oh~|(XPlMkXB>60SZ+Kr#7{D2N{-D>#^;pVqP;c| zwA&ytY;%LPc5={R7Y5sSZVwV=Hh+Un9JEDLsO+%QJM3&qJFE$AvANIM!r+KC?RI7l zEgZC#N)?F~TiR~x6K%G(-Bt&`uw_A_)S4liAFQ_*1%q~ZyS>m&E+u1iyS>I` zz}YY4YODIX1~m5~pk);LxiJGT^A(Xvr+mOxx|W zc3TJF$j}Sr%-3Z!v;&xH=_-CjDFeBbi2%JGntGCglpt13i+O7uSo3ISSnbf-f>FDO zf7^NMAE=r*VM~M6yvGYYOy`&_yP2OMTN!lPdE_o_x0e9Uc6&KpGC5u-4pxQz(VOZ} zVP(6$s@+~YK^+GE1TAX7tTVqsqRvgboM~6}*vTDsQIDP5ZktDF^?EYHkylf9M!Rin zxAWTV;%FH3BA5w0Q`&_9#lWF3h;J&j1;9ZFVuDAlU1!@8>+IDe7Y*7K?Y0S|YPVB6 zETAjy(7U!n6B4Wo-Aj+#{3o-P(b7uJUK=w7$8BNqNm~V2Z9CA~W~cI)+s+ua*$Q4Q zVUQr>95>ebQCrd>tX}dtI|~d3l+~bR?d$1j$o%MTIt|Rna@3GpOxCzAWqxq?h;4A$ z&F!|OLo;4B=yF%MToCxm4trTU?Hvrv_o-cAK29TaT>}*9dC=v~ak;GS5}@j81C^0< zHS@i@PuX1aiJUe@^9Gx9Y211wjiPNp(of~&Fy9x)j_(_8e4nAmtnt|uBidPRVCEaN zyv%$?EqBBTSr_U@F+H^U`K(r_x`{WX%ok~OuK6OZwzS)eJM0p$Y!G}o=2oPt1AI4M zpxw&@Drv~+mZRt+TK;-g%WMu0&riGYesk=2jdE8QlI+qQ~%!Mq0g+6zg%LS<}>rhMWnK4&%K$^@^#@wzJ8S^a>Frok{hWveoTnC6- z>8^mmjM{0SQXQ%J?Y5O=Yqu*BJ$4G2)5)CIBh<}J*_CA0kU2v&dt6O2gFg?E9~C|+;NA-s>-Mw(&YEpxl~nv~mD#pF#(*(Tx6y+PtQ zxZca7w%I!OTNu1YztFgxL-Axt;=)(}y838b*z*O4JxS=K(0$$SAyv*Es)9DKX`%fU zv?=mY4M2QOIXU2m3iYU}Gdk?d4(aX<5}&Uvyr+E+c-h6u3aox4>;U|70nU@xsJKSKa*1$&jrBW!I3hb^*^v?4l#0-IIfjfq5M`Wgr+8qoRFvgSMf^Hny494cW=2rOmb+x08p0b%FT< z)nnt7v7tvZ_5MKh7SgWjf%EI3kZm@vE!b`+#hc1VjoL{;ywN|wt+qjth8WpVT<6 zyem`vh^zi%s?Qwz^d<b?~0SW!$DF!GcsRC_wnA z`GZ1Mi%?)^vY^nJX5U?O<5q zE>0VuiT5~((zY?(oP!aAiGpJp+S3fJAo&yU%}uSY%~mkM7KXD8nbjc{duc|S%>|p> zfZ!4HnYAP_%dBVL?E20L-WW|h3SFc17ihgInOJBG_MTS{nw*o=S>oA%w>9V|-C=9l z3>7fiS=tpK)>P_M4A?0ffJ(|XK-+)~LnnJ4w5F7&0Y<5(mBCh;7y_ajZOJ-Ys}^#B z+I+J|u+k(9V4ZDtrGbdZA|O`uAVWOCIFM=`{01EVfHp_Lw9N1iVL-Xb#Mf;8KDtTS zGKU`d45TK2TPIuScvVzVN)EKFh*F^vkS-?&$a>M&tw1F?d2BTxfI4xUhgIVqO310; zbuclkti>v!G6m&+&8GD@zCDF%Q2wd3S>VBgZl`KmT87Gws01@4fY-tos0OQ$oK)qj z)liLY>U*eyz!0BRM$d^MiVvUjp_)1u^hWRiyzP#5TV)^wwX8aVMpZk5nYRIOp%9F+ zxC=9ntIqh?p}I91@nIU$6li6}GYnh6f6Oj6o0zFX3WH43YBmBNl6iqa0GVq#SOSu{ zftf>7;*enyRbsXnA$SuQl?owu9=r6ERJaxJUS6oDFR%vwG1qlk#~Y2* zgU`%XBMhvbtUA|71C7k1u%*YYIwi(%In0Mf=8(rY=jjC+YvhG_wA&n?Qz{+wiXLh} zJ>rYYC{yNa@Wnqh^E6RG@GjeQjcx2iyJwYvzL2AN1Id&{0%4BoWu#~AA zX435?ws;n}da4Vk# zg)T9-c2F|JHZ-$3>{7E1DT!o3V46|H%*`Ibz^DZnCxlTU=>dsm3yDO(!5WZg9M-gk z2PeRqKQW>;@dmJF|7ln=5y4iT^lT_NOauyWPJF2d-pE2|&A^`pq7LgJB=P3bGh)|b zhXt*ArE(AutOH1hK0pI)NC@a@G>Drf(5%ILN7#q#T#8GC7Ua!k9irzs?itvOIux!r zOsm30CN%9CdI9@clZ9FnZCv2Wn#?zw({Qa7T-oIzTv?(BuF?UdOos;!#HE01K{9@A z6+k^=v7sR0HNj`H7-5e_KNW_6EQ7Ja^T#S`!@bF1?^LG%uzAm&*sKEcb2G@kOn^`h z4$DSBmGw-J9M*p|KLS*pOgHoRTLdqV5vI>J#TQip1bA9}Q7LP;3Y1iBAQbGg7wd(# zlvJDw%qcb01IqId=LhY@gLakRe=wb$7_`Xm7qK-lDv(eY(JLeo<(IH;Ff@f_;sP_7 zOOTjG&xsLe{w`iRBHg$;c$gJ9Vv&_fde|S^umdLOy@d^aNh#LHwHh2)19tn2!(^OD zr{@F@GObZ|(;N9kYSr{w1JkXAl*p^~TkO|wl%+DP-vYmWqvm~gc0fnXgOdQ?gdfq@-lP=CWjxt+Z9A2L}DyiDf;!wPB)mDjm{_DAfnpg`i?{Z`RAqxspj@ zRYMD!Yi<*}aJwC40<4VWrsxP0lX;%WOi!BJ_!Ufw8Gw+B*u9uI;fjbhbIHT3(8`u* zm&I>>u-7go55y#uM-42o=E1kf6l-3Zlp@&%d3lE4RP-y$*W2H6ip4a)rN%{+tZK2B zQ@7o|R&t8D&%gh>@cl;KSI4bX8KjkUVQcP}RPr}0E!O2Dlt~^rVv(TAu<}XZk~E3A zx`};ngHhlI1s~8&{P>=dr z5*`!5o7~c(0FQcJP0#Kzpy!b7BfYg?Q*SrV(BZ#V$fMqMfs@g+W5+)!)#bnJLwuLwjSXglwbiAS?z((s1*GOp>HA7e8bl0ps zG?`U4PCschd!;Upns2bW4VWUCoY2Yu8?dN}$N4UmOG>_lB+|NmF?9sy*d6i49P?$~ ziSaz-2*Jag@tG9ce@=^z>@m(@lkJR|$XPSqK$AA)oXOH7gH3c|P;Q#iWPDRK_~{rS zG}WferufykZ;%c~Y~mPDLI8!zV}>8mdcmLMl&C`I0rYE~#j2f|UuX00zp(n{_k&P_ ztn=ZlJp;JP<*FH90-2P~ns`)n^~RBitVV|&%~zb6AilDS*D((wmg5d+H=j8WzeFw< z^R3t^3(0k}X?L?3lKnG18@5z?dNv7WliYY=^{Y05fb3Cc!p92}jrC6t_@xK#(Md>i z56b4$Wc=20TfU$9W1^G{b{|-bV`ET4r*s@=a)n6y#@vjJZBTSdHBuK>Di znhx_%Sj`iGd4JB}M_m@a7N%7Q<7k&}ufD?~Zelpa2{4&`;@^TGYy;Oi7??6ds*`jo z8_HQLH{-7RdV2z9vA_R{al=EtNk8Q&at;VoYd>)#Bu@9%8GYg@vV3lN< z@+d50$AdAL87lyX0K1KGQ5$l@K=f!B;JlmoIRW->vdP1=ish__5$|QB&ftU@5Ym(f zt&(jFk0wUAa@U|}k1RX+!Tn=9!(W37?2=Kts>7~xxeU$iRBJ6jDyGq^fRb_*1LXC{quu00e+8oADadD1tPeZ z?opSKhv_BEcs$JbHW@{#@tDgfFyA2~4-77*X_!B&j-Uy1z}mq`Satjx3sK$%9{4~)q)j(a-p2#p7G|RnE-v-30vb_OP37Ui%v*Zft{>EcpI|qC+xMjvM{W| zRHO&{x;V$0+U@VN`nAkLlisJ<1c@h@FnW-7IMhLmL0XYZ)xU>LMXJRXkD_9lfffNG zkgX>tZCHy=iJR}kcq)_sG8W8v$m!MK)Y-x0j3j_b;4cEy*e<7x%8J#DEHo-B!QvLV z?dP@GwiYSN*V4AXnUXP>(e{njso6d43GX!^fW8|JZ8r~0J?uRSk zq58o1scd%y4#f_GU=qbalnl1i04m8~Q+`CQP;l!SnNyCDH>f<8m%OV*A)f@SUc`3F zj%=S(z#*L1W$gf}iUA^oA-TyyGndvORZw-jK;^;Z%oz22*n9ETI!4uyQVMq|R3447 z4PR>T5NHjb!L>H57>5$Yo2;VE=A&VJ)_#r1x3JFhxTBr!)eOT(ybT?9hQV0)~UD82IkvPadd~z z;a!kAI2-i=w!n5fPUCA`9&Z5+>}kwIrV{5I9u{L>I&4c$xPgT8pXajO{FmG69TUu7 zdUt023}(9A10!~x#`B!DGR@DF9Z1_BLnHK2OT>!6KT3kvfU8LL$PR7+E+U&z%7Jd7 z;U&EQl<oSd=&|fLGZ{%d}UNw#BmAV$81sXsZuhYy_CJ*Y-!91)w zm#xg%8MO*qo4 z47!T_F`mFYiBrxL6cT$O4a-Ka%o>yFf)=~j34vzM*dlo>?i~tQ^2GDX;C6QS8MP!8fh6d`o@QlAXhaxvp})o+1=)wG8i| zN;!-gpHHMryJ5?SDt-Yc0-Z6&vUB}vSzuZq+^S$m(?@K*HpaVc&ZcN=(X|TZ$#ad3 znX+x5-RuH5#~L@bLdGVW6|SC%hvYY~g`%8w7}4!K=7bx@%VQx_41~0e3Z3y~b~Fkg zw8p`{lu^j5heQlJD$wR+x}sA#X?_{qUt<1+9?FyPg_Y1#$c!VYli>ukF@se|9>KVk zfEl8HphhR^A$_h6tOCWO1hmjD$0pl^eszRu8yxJ}jR;W0fzg)CQyMRMs4E~x9+ePQ z&5L&?TFir{M-Od!V6al-WU6(DgaCzwzJlsn@%#}GP8LOpd*+`p{Zq2=J7mm=t`jm-6?+oDv6_J%!NzTFO$?fPP>2tnq4u zdGwF0Gj?F!y9M`lR`6LzB<^ApMRon4)z7)EuzU~ZF0Y?IU=&8kZH-9=z2_}{)oL6MmKkzEx3gSSr}eq3`aDz+~B(e zx9*osRnXl;0*k5=I3HPuOy`P}aRwTk=d5BLrX5;=MM1}A91(@Ii1-aRhcC-b5smwT zUTuN{E9#nNG1su?2n&KA)dgl-dabdZ#0;9kf26p){MSp#UyAr`? zI8M;x4oAfBO69q|`C{TlTbTGB;Bnqh2$pRzyA&&LP*5x5bIW+dMkgQ0HLSs?B5T;} zRo;8o3uI6=8!>4(JWHNc$$%&f zgBTL7ryJBeq%qh5Z?iRJR+EmvuXaN(h=?biO~iVYz#ZlU_fi8j70Lwd6Se!A6Y&&X z;V3U+8hX_Xw$FlqVPn!=!_RbDt*0|em*TI!geU;4Ded+~60+?STx)BN(mGY4Lq58A z9YY);cD_fl(ChiBp^<_&*yhJ++EJ=CybV4zQMMv5`$UqRyOFUk;8ker0!D+1jJH&> zyYn21LGpS|ur`Y6iZ0Y+oxTPw%TJnu_*?=VV)tq zEv$tq+X1X|sKeE$RZ52BC1kOBNDUKHr5&!F8k(dXv|+5Q!*)5Ix;DkI-#m=-tDBW# zX&JTKef7gyP<-2Um^#AP6eu)$J2-H~u&iI#x7jP&Y{#&@0;!VB`mF>xiWw^I7tjtO(}+e4j{{&=IlGTY(?%jY`s5HEbw>|oVXDPM+YD?_!;mE} z8J2hPa;!GaGha5u>MIbHk3~Rkt@^8vsfelP?EeFq9z5uncmF4HqXR5e8t60(Yl4w4XNHU${J11YtYk#; zYS(@jN}$0W9P?X3w_}G3uA&_*3(PG#y(Eo*-M65_US~deKzkd@=(9262N^5sZzYVK z?Lq?07FB`Whs^|DU#%DAbymD5%RCd(CIgd?N7ZJQn(u$bJdvs^$x=(U-TdON1W0x` z-XdxB=XZG}qmM5^oR5+b-TL&(Sd~~yEWDG`%*qizc$_`pOpi<$AD5J}&{hIgAt*y> z5hAD(@@Q8`n9q@MqH){@en&+)Bv9cA?lx zl%L=!o4Wz|MW)k({K_2YfAjIN$StP>ZjmXMWf4J?tpZnK9gYL7ro07s1-nb#dP@7P z!sj)WU(~O8U@OtDkk<|f*gnYoEO1taYL3<@9i4xHJ5hwYN?^*UXLZHwes8e@J zVsk_22Pt7XW%O4x$V>S=z-sPvqeBeM&VE!pK_%#|LV3NV>z?gc-9W+A+juSFOqdA8H^T2`l>>TqlsTj{` z7jj*AnXNN#R3+mJ%5CyK0Etgm!P%>63oK#V^|%F)+)2a)R7=}S%aMm2N17yiP~jEv zSz4*}j1M#pD=OSvNbM^oq3B`zGX95;xiB+X7jqTomj4v%?0eX(2MKGFb%i-K4ap0MWP%ex0`r(`PC+5XWo6e7St4nhSP(B>hqcLW zVpk0!ClDgMuwv*>F&fBz@KvNz zmsLnS#Y}-LMV=H2$wyAHK#H0{lk^7bR`_fa>r5ks!HceuLcBL>3{z4)n0-R$aqTEG zO*|vA``x?KR)S3jyr^x4nP5#aep#iP3bG^<{MOyhZSZOQ8M(};Hh3Y^ksobgIO;r| zf1pa8+q@&h;ot_qiys!}I;mIt#QfFW3ivf&g0IeiK+UEi>sHECB~nr0Nfh7(o(MLHy=2)CEW( zfJJ0MQdh)W{Kj&+lu<(Ag!AYeuhuf)O}YAr-(Ep2ryZf}W2$E>sHQfE9g_vVZVXo5H9s+aWOl; z1~3wqpfGqD6lJum5vQNwdk)?XOfv_=ygal%Map6ETRmtmAG8pYG9YZ=7(id9qcM+e zO?0qIBms0#1n4a4A{QXGBOVhIQHz&bHcUt>xL3&jmkJDhp6vbI3La+r6rDhDyv0qa z7DjirH?+7@F{?VdnDw5Hc4yl5=K)+;9?b5^yQD*!zmChkg6hcJu14PAX&L*rjq#yT z7mP?%B8ZZh4nz?M{|wG2i`R4H&rXvyj^kDYT~4MxK`HK6QoqtwDf6H2Qn;P@M%?fF z&)k)!QAfjjh0ODxfTyhD9=!GmQ z0Zr~OUKw3QDRvd9*_6#4w97_qkxse9Z!UKN6PUD+&;YPYZN#rEck(RiaiA#{lGB5DV+|>@DDC|Vm~~WmF$A! zgZ7TSh9ld==jlG z^mRSqZjy;H5&gB3il4|x#m|MGBw(OAGRw)6mU5dvAUkYx;t5FPu+2yPf)2_%mVbo( zcsrO00g;8){1MVS$6ubOS%QYKaVbgxxtvoFEf~jS3pz$4I8)JE5sqrDjW4UPO*b)@ zA==uM)zbdb%NUvk^bVQOLqKS@pO3g}W;iAGQYbY{?;ieW!I zEGt1Bl@c@Qo+oU@_c9nAaw*`L!$sx}>1y7z-ed+4U`XIOhh=LGM9TC_^Q&n9tqR2e zk}J{&i!Du=g9qYhwATEqgXqBwM59aCf#~}XX1L5{NjY2>8qL}$ItsfEs{M2*SRM0% zNLHNSX}}o*FK)9}doij+5#KtD@Q9Q4vAS~dU2)_$Nq*eqyq%A;z!d z0ubWSF)ptuv82A)+y+gOoGih&~6x%Kr{<%u2@J zP-ZWC7_WQLu(MQ)<)J+?4VJqo@vuXFs6Jqtie<2zC7q1HXey=d85bLmq8kZLw(UbiqXy~T8Yt&?y( z$|@5+`dk@Q!V3T1M=rvN8ap__V;<60;X{G>1klEW_fw39`o_LF!z(8K*FbN z;R`G^u3wPKNwfLEZQvi$brrS(?5!fH>)k@-wwRA#G&Il0d-Twz2gE&REJa#&f#3*r z#3Cy+c$y^WbL2H3kYcUI@W-)9e(BOpgm&ySy&>ToTyp|i zQzcVCns#acgp+-PKq`@60yz7)guOL|H)X7^;B=PL$nyQ`$7y#xbEJw8TMAuRl4z$u zEr2NVKvG8%)RfNeRr?NU9I-RqlpGDScmwoY%p265uXeF%@*|&1tzP4K3hYVtkm%j= z;}g8;s+{+m^Dxg1x)62OId=H4-)dG_A*9)3EkDi-)-xnxVFzuiD^yQa)RksZ=P2F` z^2ZDkYO&r?63W?HC`JTvpnP7Am6W$vF{?RJ%3gGpI6g3w+&Xgext$E^^&%Z$Z(s*< z=*$gv1r|kjfRV5&0tYUIL#$>{HxAmH(A^*h@{4F>TBXe5l!F2~R_Rt0LXE!+nUWc* z>Qn$dmsKE0oihUq5jVz7eHuP%ac?k)*>iw$In7*mzSmmKcQDpSS?ER zp9uXp*(ROGL5yC?XhiFr$w@CU!Kc$G30uS-AbTGWqUk1n(L;Ej*rju4l*6gVZUT0p zEKz7Ru9d1p3RKRpt@IdJ_9C{0`bB|U9xV_s2g+|&4ULJOr<@c5Bw58Pyv)w!F=AXWd4j; zGuY>|ST(dCIFbv6tYJU%AkSuKe<;U}pog%S*pC>SNR`jsq#Kw<)6+{<-NYjKcA(_dwiAud6p`NeU+b|rOJ@6a`G%y z-tDXW;w)9(<*S?;U!?%l&VSw(J_=us3}n59DJiq!^n|r*O+&(p2*{alOXP_=VB+-)FM%qQH)bbbWa5f zv7AySGgEw4IlF=cXJv~MT>GfA58)`yuQ&XO~L z5t=$|3FEUa1oAsC%yaZ%sv8K%o6mfwQgE+EhQTg|tfg64J?o$C0uDtl> zFG3V>2etjZDhfQ#OT1+Bbwt`7e?|q8MHr!z@CcL}hgPD`aM%`GLsSB1Hyk2P4^BF5 zXF97bj*T^)1t%_2aY{Jru!BJ4GtE}h>_R*YbEV8QJ8`UX*pVIYrQb+v8IwX}S{VP! zeMQvLrAG)LSWSwFwvZ@-lX#KK;`YGDh^css&PG4YjAJ~fRq^Okjp&{)aIXM2U0hM& z1cUtGtq#Y-0D{nGA>9p8*eh>fwl*z&)dZi_%+2Aqpa#CoMv$dkmwNhNnN^iO{ny#D z$ae~AsF3{I9Zn%R1js^#|FVGy?2uiGDZOteo3nlVndX=2k21nG8 zI9AoDkfv4$aRGm|teI59=>SPmdo$K;XD5HJ^JvXu$78%esD!AaYOX=QMyamEmnJ)F z0Yaoix5F-lLj+Bc*NK-b!lgFb+y+lp=+CcFd5Ok)#7YnDQRvG;-E^mCcZXYiVYw}S z$jtyB+IKm_5AFCrREr43MnFtBgB?pS_ajh%- zU9A(e7qyNvo1l8RR6_e9B;8*vfcBxjbUFy70Sg(CIARa8036rM)##>!W4fzjx=ax= z+{v+_tDcCe zc7S^z1Gwl@qX6!=0B%b12}VtWBkV^Hvn#_{am@B*8i$KuA6Mic@yH8>H1hbnV@_yj zq)Wq{@z^y<1PDHY3B+!UjzPgPo+(p)jB5?Z>nZeP-C2K7}?mIEdR7$g6d3MH<0Xg zRF+#cY>!#zym!zgAv(f~lhAq1B>fu^Bz(UI2zf$ z>3bNXFPYQP51kw1W%m|N3SdeEB>bCr70#X!v!I|F7X*rNsYNE?++YFs@M(i*4NYcd znT&ZKSq66vr&r+}S3&=@HuecS?`Dk5x^+;i)mm`e+pA9DQgWILfgQU9CM0X^*guLGva2 z8S}Xx+a1zd!A%Vum-e~1aK1pcP==@!M74%N^Ixgm?6O%yPPK4&?sA_?ZQZ0jrnWBF zZg$z(wUtZl{~FeYi?AuUg!~KSH@NI(C%AxLs|Q^!wZ9bB4$-j3d>;QzlgkDhTR9|x zDb(ju`>(>C&ayO(3CU)iWR=s|dGZahHxqK#_OyFFAKU!kHMvX^jx7O!E`Ab9#}?+!5~2^{usz z@A^#n89W@jhvxfsPz}fCix)H6CFAqw`F!wPYOJu-lTt#&$6;-L7S=*oamplhIVUFkkmfJ~06rTd64|6IQ@pND2tk;P&68=$KH>p1cq4zRU$Wi76t*{!@ z3CC)5xtwggq_7Sb!g$6| z42j!XlH9sC6}l`BTNz3qssr3-u48T~$Ww7*1I&TLk6Hl+1^S-6;>uPw{$*=g;Sg0S+Pbm=B_>!uo#}KVi$`v&(%U4g1pf`_g}+bY6UR z0aI{hK|~9=84x8-+en%GWgcsh4us{I{3Sjgf-yFKEcR#WkImQG%yIoL^6g*>Q9EbK z&$Kgk!-w@Db*D{XOp!w6*^?{B^m5L(GIP|2Opt~cVUm$Uo#o|}c(fuCk90Sl#3O$u z<~TKT9_51SJ0%|7&oxakp3?$S-4D_T{2)5Tj^L-fdtJq#6>U2gJaun7MMcf^9AEs8=a!Ol>vGUD{wN$;fGI{yx39Ut@76v$)mJ4rXP*3dQeNyVPXNkp==W`3X?pc}fun4We+s z=0|At1JXMI?~vgM>SVm>CQ)JI$JD3w*H{)mm+te2^f|@J!eD7eqg?CgOFLLPPNVb+ zq_)*q1(G?^=f5+b7P8dUCMc=9UVwubl&sF`^OY4bMnC-4tftbL5`Ix3_qA~*hH%&m zQXx59vgyZZnBIfctC;VDNJnVIOf12Y7=(Yts9S6fP9oDCK_?VGFu!w|hsI|9)@9x| zHuE3>KA@O=QVI>|?+M7#2YmDjT# z+{x#$k|q=7YX=4nDxO&#NFUU%PH|@c>c;Nu^!Re0Mp)=4F2NM(_ES-5U8-NiPWiFB z{$SI&3GQU!$~Jc{q#+(i#q>4L(6WTHRsSQlLW!PdH=b9Cupo(m{KJTEO<5dkoS74I(K9> zxDO;$EVDufY4Nbt*HfzKx)dp=gg^R=YPnD-tw1g@*OO%n$H2>sOB0Gnih7(3F{Us1 zW}tEOtgu)OsKf==AU64)rJSdGh87dy;aAsRKl#ZpPVRV_%s;oCbCvtMxAE<5{{?q{ zTzO26GwEcRcwBJjnPN8;mwEJOX?$;SOMXK+fHm2pcPF*J7N7y(|KhS|g|IBrIu zA7Z=0Q6!#|%>uBl_!ThkO%HA-B1FM?m@;`w=ZiTj#JTPki%AFVcsYl?b+^sJ^C}0< z1lrV!0QnclpdFk9s32%3mtf^;vuoTUV9R)gwXjEUB>d7Idl`))Z#uikX>Cndi#SdY zWu{>#DoT=%=iwX1H~>=MA?9K_9sYNRk3kxM;vS>l3(Z={i#qT?<7*MDhjhJkZE!!t zgY%~jBcUA}j-LUQZXgfPY16vA+Tf+-ZPj3z9oI*h6}jUoQdo!AGVISJSzOvTBG*`pb(^k-8u zb36gmW?_!2<4S*a-1=`-f;2oy*9iDj-v}lwkn`cR`}nJ&GLDCr;#gXUjoV zxH&+W;qDSRcL{qK!c`tD56s_U6Klo`O0=)KY{FZo&j{#w_PFPHVg4NQXYec_*QB`5 zKwigLuw=)bqC|7>60H!6NbP3!OZ2Q5K(6PnLwQpuF1@?v7TTH@fT7M%X#rKRe7;F)U7a#;@p8ChZUN%laa|qVFEnfWrWmje7|ZPI#R~Be=pW zQO~PGqPZ6h=@h_p4m-%7tK$Y@0g@>oG;JcuTsO4PuBo3zAM8{=F zvY_}{uFHo=QDaQT6i!gjU{IV#n?_$X@TBN>I$J}01}4mSVL#vzcZjh2;Z54x)Ss$w zQ^%@dSsLtYUI4BbA~i-bX80IgFbBIrZSW>2v}b>Mj~g7A8BIgR@TAZ#tP4(aMUU=L zZSRr2yoNkQL%{|ajXUl!pqH-yztJMOoXfj2z_ z-{XX}6mQSXGh$P+9Wz*F1$*ElY={wy(93kjmeHm8%1nrV*$Z}-&R^+DZen6;VHf(C z#|$S;o||1X!!CFgb|J_wI3n4DxWt>Wq#B~O`8MpuW*CY#(^Is+fq+eS8KP*Y@ZTfj zY|`sks-Zh$^qCS+7+Vdrp(?}?hzfQeMNSC25Vx>T*MRTBpC+y~P|&fkp9Lg@LzvC( zs-=2(kQ185VLlK?aTDY7%GeB5U;rGGOR9kVoFQ$3GWOrUJG&eopM*5%=)p3e8Z_I9aaGSrj`3Nm`nVk4E=}vgmDeZFeYu zWInje;T9MO2c-1l%#rBGiVB&qKqsiZF94+n&M4JKUwm`%W2H1fT&*HjI2A@LAeaWy zmIAdRcq#CrdxZ#8c?&k@;Xqb=q&?A>>mAjQ>M-Va|nSu>k042)`oqRZp(uE86S7`Lqs_B!Psh<2N&oy za%~%0y#!C~8jj=Q_8-(I0I>XWkOPwucF?mHYJ2L?k!YyXD%htuK9L!SIxb^>PJ#MQ z=b9!*Y-ce}#VgANg=qy-bqiKz^b2?tw@PwO5VGq6i9n0BVh4)KbggSe=PBZ+n24+& z07YV~{@e%!Jn1ibUXp0d^N#XV1Ed<*65kI51&9rGX;FbpT7gwuSVB4cfO8*$fKREm zXcXTLvHJ;Q4FKx zOpaJ`EW@!p#BvlEW&^(yw9Zn*P9Y)__;LXn$2Xj10r8x7SNV6(TA>i~!bN&=P3Z1E zbYq@bR7kBZH<2-82JKJdZ+?qiLa@LE6fESj_S36pa-;sBf&{p#zp*)7DYL(gd%*9M zJZhe1pShu;n@IYduVHf)cMDf&vGUMpMEF?%Yg_?*gMvE9h8Wolo~P4Ogf1$R8qp#! z&gYMd<$>L_GiU1_822e19o(^x6Cyi*sU_NOe`;&v7Fplivet*z}51_SYgpq)3VS$t(mz#niy2g}KbxK-JbF3DU*B=XB-!%5 zcP?Ar1)u6ZlO1pG*wfzqyZchx`g*sX!3sRyI(XVy@birbt1AfsZ}f?XdXDu@K~w@~ zI4mj8?)5AjI*_~361F{`Gf6%AsI9)Yk|`+%!qeF0AR?q1vndg;tLz%yyt2byOFLpu z-=hkL>$rWV-5fiB#BRPEgKP7RL1a`_&^7jWhH1kQR;&n~r1~%2ti^ETK6ayzVmH1C zNuF-V=+Gy>khnPGT!OR?5q0!#R5b7zl8}F0L$z8gxKbB7dekuG1Oq>I0L9Uo@5I_c z$Hy|KomS#Ha@RnT9I#3@v+^O{cF4lxDnK(4^!LPb7e!UTomgDv+?K`v;--OoUI_@PQt{ z%LNVuJP_+Ms=k2B8uz6bxD>pRm!wOT@sh5<@=fUYb1h?)an^yL!hgfceK8bv!rjs7 z2%GZsq~A(}OP0u3&SK+ZaDe7UaZ=t}jT#m_&R&wB zp}7NSdbP ziG0pK)VoU~SK67q4vptyBb7B9zGWti8-?1 zeF6T_IRVBIg)`BPbbk6i)baG;w5uRaBN*}{?5PTuByR8{l;F!1mGr8N*pohSDJcpf z>aM&;!?D4Fz}x^|2@EDS1quUiTn)NdSTCdP6$Y=j_FcB1(?QJY!#eAtP|A~;9>2s! z%TGQ_C3F`W_U?oVR!eRL{gyzTWt2fvrU!X05Lw~*?wF-6J>bZgKhv#?k~<^39;!~y z>V)e9YeJ?InTc!F3C0gDc44Mx0g;v~!Nc(g;*Ind#=1wG z4xo8}bWIeq8W)d9u%9L=tCg=b?ic4BGWQ>FH((8hH(>o+=1Bj;HR-`U&(`C5j8zr3 zXu#&{?jCM#L?1?gc7$UY-{you;}9IQuXBUeDUk${FbY9}a4|{a-~^}u{Xrs;CZRjh zkW#RmNh!I2%7*~CoBMQ(ChlC2)$IhjUmOCDLs5{X6ObL#HHJHdMMq7mxr4I)4k*|5qZ-JW=+dCz)_UdLdWEhSL zGd;|NRKa8@r-Lr;(9J_v+{}-@Lv<@F$%l$yT+lhjr(3f@QqYEFQK*W{3$!AGj~*fD zob$%~p;O&q1_x;Ii7g$q$i;jRbqbV9-V3OH6Q_gGg0O6j>huU_K&F5!4cqZyGg-$z zaM-Tm${&4{aP36d*YSeB_5n+s&MukBi((1@iV@Y5nnA99nJxI_y#($iTnH#qFYc06 z1TkS%XGher;;2>t3*`(IjRVkdJzc>xOGagk&29|<8F-EI21B2y!PA?Xpb& zBR+zd;1qfXTZZ%3$dMf8p%KYQPVc9K>`$fErT5;0?7ec`sIRMJ*zkqa*Ve(VOp4EZ zz(=5;Wl7GSD|`Vj7Xcs?!P{lsae1sHd5+&hS9ybLbaM&X6nCn@A;J;ul=<&>gGuI5 zI1{5>>LMrGd@iwjkC7eK=BAaD`Hrit>;>3dquR=)_T%GfTf8VyHNISgGC~#ch1W;) zcTIhI#$RN{TpP5g0*GoRe6UWJa&SwZVC?3WAAA+o3lVDP+7xYF%<07tT~N1{`>(Mv zAPtd5T3<4vNCn8#3esF~`d@rB^VjgA=qeQpi1c|!ZUshgYUF!HT+_fItP#mhT%VfM zaWq$Nfa^SvCK?eccvm0)UCLdDSmGLyMC#Z(Gl*Nj#8TYOC-Jm0eBO>zW?U=ySca&! zHl(NdWdbp|?(fDLb_E(gHw|G)pmW7km`~r8kXg%o3wxKa2O0z3pvYkbWgQFHi8{_^ z<s|%y?M^Ga0j-y{&L4;nD`? zt)ZIt(;`s)Ct6%2b#*xb2deNGWC)@R7em5gk0ag^i!Yhstoc-d7M@mpY_>*OCmtw4 z57%I>OofE2LN>9|>C;$>^%<9e;jBd{MwB|Ra2!D2D{>j6%JiB9nse3i-XUtyD-cW1 z$eqj#Gf?8sSl$$b8Z?XHxc9x`Wn=#a~ zlzjRX#ygn@HH+n60o_*A@^t!N#YMmkx434tbDD1s8eDT0Wc)hFn49FN z{q2%S%V`WiDH_&6$)Bt|F83Y+7A0h3^p#+xKrqQux^lA`el5cec+9H=b8(%uZa>J% zLsFC7T1pKB0`@~aS6fD9DLUDC`heIpvmYVSqZ-ysgyfv(BNq4E!u0s>brGBKrPXfV zAOh=~1q!WWZ!%==nv>&4UOsL`#er&N+~cD=x!zfgjS9~&EFFKIKA%_UzgB^;O+|@O z@?+IYuzi&Gob1tnGm8RrAt?%k#Z?1|hU0dD&SX6W9YAQtCxvv%x5O0?ceQQucU#SI z(^y0WOlw7=lkO-0t@!W2U{(dbZ0lM^qA$7TVyEZk6))xM41of(b$9^%ms8x|cc-{N zK1o66-_M-lzGrb7I-dnPGm`P8RV))Sywf!#_JqOR$etML!S64<1zOFaC!#-faBmJj zY(1h7om4-KX)VxRz??J+=Xnh&WH3%)4eDU@N`c2~3F5uZK!YeM3NDfX^eQ-3q1$Y$ zxJ_Dd-kLZE$4i;qDkzN;!7he=!6Dg<@@}7&sc!=<(iau9`EY|EP=sfI+12TJe2RG> z-#pEsbByc|#CDFi(+_#y_IXkzuCukoRWD&|3}T@SS1nv9g&9Q?xz5%+CYx>xVat3M z!hIr5VT#REUr8<#E+C-0>M@<(TO{jFnjCO_)>{%>@n*g^sf{K1L}p2zUYcH#=UI}H zWa4tiLr~*{>*9Qn{L&K))Sv2ud5D?G5+avec!sbTmm?Lb$%T=tZdQ~&8y2wYqOp8b zG|{enxsyUjE51b{wQg>fV6JCrAGD!Ilqo5*^TPSKF9s+AHzzn8*$!eCr|0l~4l{H4 zc~iN~eVD~X2t6WauVNJQ4FMLCoRWw_A}0Vb59|3hTG;Gl`*(uZ6HU6G@-FF5-!a&NuRUm;>Sw%>IFpX?` z&{8tiUNA-S-XnAihhdB3^HP9B0TS*V&eHNVghNpf98hpx^fSE0T=g)G_GEaR!$Pg# z_j=wLX3p}qxvz(y1*4Gaf?#5QkQ0XOGE8{H+ksyCu8g?L23x7iBM^AB(vOaPRl4kK z$}nci8sa<+e2HWQtzeM{c@a{bw?+L$PWa@Pc)W z?}R?@LR;m;T%9jm%{!Q3OJIJ>!d=3s2+F&p%_2i^l$6+K;h3)X(}xGjpSRVB@LC`E zQ4=|H8C?@PICn>oL4N&lraeF%K8gYoK!O{zCQLtg9`2GtTjsSnuxRcPBI$!!zw{F>=7vWSE2BWor&}?iUkNz z{NVT2$A(;G$C=>t`0lV$;IAhl@7i|ri~SC3hoUx9vcf=xr$gHo^*VhE^?o79wv>^< zCs%Q$O^IzIYVkTd>kvQ~RQwfY^7Q?kGr^|WWH+Vk)eygB!YzES5N_I>c^`r&N6+~J z1_PYVCvYmbcL%O+x>-jv9mD@9`T-dC$AEAJe=PV4cSkAkER(2ko0zM4mVtBk>Yvfr zoQD}8kwPsBID`mai%iVkl9+uTBjNHKPK&ykw{cC!h+XT$Jrv*p1IjMEn!Yfn`SQ8= zt(vi-AYCFI0p<}Jyw=vfDKOvMFHyn#XNX=MU;*RmfDnjmzRIvJH~)o#W=0{-BJr3b zcKF4lQzjmxs)G$A3c(di3}!rV4l~}B?dB`IPQxQq39Df-qo%A%1VIYJkv|sDS@^iz zEyoHBQZTAR4p}foa8V+7q0k+^LxVIts8G<$Wz-b6#NGhxAy6H(Dl6t9cA;|!jo5Zd zrs%s<>w{tQc}6prW5QHv0a(y8gd)7`P2gF@3o_6^QOX{+r5^+B+!q_Mgk1@Ngp>M- zd^-c7g~1CV?BhWKv3Lx`C62&}R^IUlXI;DP=&`pDG9ZW?90w6yRf)Bz)ccPVw~=cO9T3jmlhXl?NqZO% zgby-wOz=Mw7V~#Gr#IScI{-#-mVmq6aXJM)ghT>4WTsv4up?`;cD|+3Xo50#*;4w{1_PJJ}v;A!0dXFa49QtB`xqB zXn5{>l9OG>DbQPV6-DI+*4^0+AoM8O#Ko>T0c|^I*Y@+ne1kVZ zaooJ2_!!qAy?oAUE{x5^Ba3en0nMk9L6EQCF1^Kkb~5sUj}}EbA&kqy@D`Zu5_z4i zhpQCI7z3^VJV@+cs7XsiQ*a(jE0B7M5CmI9)yJ4%gFagozo^PV5oJ1$&zDND9T+crd~!MBM3{8u}a_7dS7Qj;Mv7oO&)Zgzqzi(q!U!oBIfT zI)Pf!bn!=7RxVFx9d(f%p=(?R9E#GC)3l;2&AFs%&?XecOOU69C@3CioA^&!p~=X@ z&iWK#9Y*jHI@gzBR&xl|FZM=$g(M!)5JPCfNA%BORb({sAMj(%nx%?#+v1lQDwl;5 zvf_kpR81i2!z^J8_&c09GZoRilwmc|JUQ4exKtGk$9^HzN4f-3B}}yuu7IPgU=(jR0GZE?(C>NiDvY_+>yo|6wOuA}k`^BK08hOc|!)eMpDH za<1TtU4eYUJ#8cQCb1xiW`NOsa0I30w} z0ouokrvTDosLT0wBc3P7u;J<sQb?ore+s7EDLU|W)dG!i{ldRatYk7wED z0hQ4i+W&wqYl=<~uV!Q(Lwp?&sw~VeBlD4~KNVtx)(Zo$8 zESgLV?`G7a0B-}JjZ_aOXX}n|_!0^QY6T1yy^6{;RzTm*d3yoFEe1qnKuCUwF8H!29e<1!P%#K*jTI8mm z(P6e@O*EXRfTE$OG(!Og&Gr#u@5zJS;Q1xgkXyCL;|?H@S#KjOvY0hJW*gi~naHfj z3?N*q%Uhy6NFACLw&kl`9&dxUdK*J2z5=8dqz^h|q2{-no*|r&HCpbpAAHZI^vLHq z|8Q#+$dfX!3j8^%>Nk^lx72^!;VAnshlBheL4_d zj2ATEEb7SqCe}9dRu%om6&3pLl~p+hi?mjtA9$P zjvR3N7PAPCO+J_-@VuCbFF4tg2G0jw7{!b9g-H`}2kh(Mn>S#f`EU+M>+f;saarK$ zN63@P<*?K|@9HTps>e?7pCm48H>2FWwnDFfy0=8`t)Xq{uK$Ft^9e6e;Do$#>=lfX zm~hx>?jAyHlxi+(V>q$A8GX%}6s}gJ`!QFJL6`U0H41};{({EAJ-xQ*31~0aA|*zr zl}|{@0kd>rQvt6wKsF_IBZf$QJ7yb+FXYO?jak8^&uveS`16c-CReCfv>~_z&DP4Q ztGG=!elj>js>p8z!Q=#Kr{0?0bQ@o#4V&Z}Db!HS>|fpe8M-m|WZqC*U3oHoeHnZ~ ze&WZ#2X{)v2A>GbyYG%SxvhOFN6U_gpA0wmgTj`V9kx_$pdVapAeA7>Hn5yU(HCz; z1rDj=zvf`3R>Uh9SqDt_0-!;2kBSE4!nmm$oT8;uKDydT-T|Pldu6MAGrzoxx(~$p zqP&^`aWl=FQqj;knkiUstB~BlVd+uD{tz3S7Vce*$Ws}_>!nS}HXxmUyOUQ+P{yV_ zYfHFC1XI^~sFQZCs1#E~^HOv2AC&FINT`OcRYR-PQ14k9lHVd_zJ8ap6?`r(W0oEt zLLfo_fK@A;2a!o=B`=1)Q8tg?rNJkuCMV6Uwnks9!dAgG=};@N<(UXF?qBR-NWA>3 zcw?0y4wPft;`>`WB=foL&Kvf|&D%6I<$tv0qPX1Cw54bjv*km(8R>E6-DP3`) zwxhlZ^GM3uhVY5ySl^z3rX=N~K=IVqrxSl^OTMQ%I+z33o{i$Rk`n41166pT6}^UL zv79Cj*lF=5eYxv|ZIl54W1LPRQwcR>AwSp|sH*Tgnpn!;6=dduY;IY7bH$3F>C+?8TcQb)I_Y9=h>Qh8H%t>;=tsVXL(d)1eDCic5?V8jEidnWQyTVLRTEc)6K_QX}_W&mmAf7A9Q zfK^r3+Gom1f(Q`_hDn1{sRN*OKmAZQ>Ff`BCVMn%OrDB4)jrqyb! zL(|q;>Hv8ilxnTm+Ll^tqoT#BjYBPM{oDWh)>`}Ab1Cn=f4s`c`u4onUS|($uf5MU z7s^o(nk8E(uQ0Yu$Gws97ZFG7D#1}~{ZjEKcRq-=rg4$DzIQnf zAcl9M@wT4=ZPuxqhM1S(HROQi$43XHdQ)IsN5Z4~QJxCux5d6rPUs-VQp6^+xc1W3 zmbwk+4XE1A2LxQY;xoQT(f`MY9r=f+2Jz3IGG*$#1r05W8=E}ue|IVRzkY0{;G~VL zTjl;OSG71CS%nGG9?a%4zn zbW%leSFpzzXv zp|{;jIx%eMtFs@U>UxlkUCPVwd2n)7LwdpjR~VVS(RG4~N}2;yI` z1BCJ8daUKakiU5!i6~+wggzQ&g`mNLA5&BK$C#RWJSo6tecIKu>PjoyDlE4C4{KVQ z)U@BF)`!$~99Hr(WQXlUjH*~S;t;zC6;C5`R#5yfPDx-r3hQNF+B6z-t1)OO9H5c? zHk?A*TTUwA$R{+d;0AbdNDb{_poPaF9_Xe}KPqE(L~2+PAQM<}AfI6;7X>oJV#@$# z@#CluI;m***N}%?RQ>-p516JTd6a1$Fqy>HH1~!T%soX|Htv8)1`JecxXZu4)P}NV z8-@cbtOdBpu7m;J&LXx@yFzT`9Slz2*#)k?+5&GxV4OMIdvwt-9`;1@V^ao~)1s=- zf<6KHzYwB;+RE7ta0Waf1S-1KvYPOI9N54s^Lu>#cLzASldlue5YS{}U9b}l z8q;`;w`ZVA=yY*X!nF%Zh=aSkp zcn6d{lfri)q6mh|4&rb%6g=pKKJeLdgKy|$uz>|Rco=G!@U|?!W%PkhisruIhlpB? za8zq^iizXf_!8tO-W2i#Z)oD)w^>lb&~Kvf6cVIImeHd7V_^f;jj#%~Hn8D3OkNC# z6<%h3sfV%Aq!k-@J{oDD8t~ae&ibH@@Iu8h0b%IVEPAbV`r@X@P6T#kX)}bQ)fR#=M|L&M~#-rG`t~sWti`CYK^%AkRLxO@7K7Hqud_b z9pzHs&l<&HS4 zYpIasdHKp86iqx2_3FlyFn=ldv~DZjH*_d1cMPTN(nQ3^<~kI*_%b$9!T#uW6X|z} zd=H6?#-;Fb9RPa+eo+U1+rwvY;183fCwInG;P zjyvOi5EpW8OZ}on-bpE!`o>12;pI|Jas=P|9$X~1)QNnrxCoA|dLMA@{QCBV^Okzo z!c7aA4#_I4#&Rc+iu@d(oB9)6E?qpY;S$~$QrpnFz{3Gk@6ts=_K-|G+v^w3ZECMw z<~^q&5_}w3kPp_-+Pbjuz{c98-eS5lCFk$~92%SITUuHh>cKusVDX~*xlJhd!b=u; z`-4}D>gP1IEUW#mg5?k_l~8@-#q|wM3mTTyw#-}9zQ}uFJE?3NhU}ixx_Du2L;d`w zh4tiHL-V`^bG>hZbM4Iwo0|U3=bu;#fJ2Lr2d-bPZL6QRFdr=_@jOXG+!uMDFGVu- zmo(MRZdwG!)-PzB*N93l@?L>QL+iqYO^e!E7c`>OaO3ZA{0qECDmtkr(OyACm0T9>pz z$bjxZ8_cOkk!H6pt)1Pnc%kJXy4OHdm?bwe#lB^>za<5{LQqi!Sk= zhD$?h+cJ2g)fRb2f+uYYn?&NpiG`8U2i__Bdfv~F_&zL6OFffhON%^s0ZN4|3^CF{ z_!oG)O!d4cP)0_oZ?E_Iwb33ZkxOo2T*-hXO+OA=q zB>QuedcorPwTyU2O z9qLQ6kmdCnk$d2Uvpnzj2=Qy=C7~8IUAmaB0A8Af-YjIb0JSJ^yc>>l_%;@}z6e*> zeHM7IUzL<8#Ft32=fTN^&AZ;@0xEkYH;wk~dH zmbhP%xW8z{ONYkCC$&6x(UjMRgcdYm;6vB4fMPbAoogFJq9bW+yOc^8IN)6Ij?Tt_ zz-#Y4?|u=J(Mvt=mt#Dy8!p;nb6OWJsbAQLYpLoNwtGK>J2JwXhaP-EBQmM2U&yy- zS45ZIX&d*Ia9`LommN1c{Fc^5`BE{0;rQTGuH~qYC8G&~=Kc+BSEu?oH+65hb6Z(3JZ1VQ! z(AJn$koE2J8d{pXiRdeZx9k&Z8){oxTid+V!wVfT(9B!Z?0xE-r3Y(ZLwVTKhZz0w zX3yIRzI&2~Ht|u3T;!eaTG%K_cTflVCeD%HWDZK#GKks)+LrgC7d^7;U$`ka0T(Ahd2v)7<)oW!`jTqb}Y*l$4S%>Te`!#eJT)4AD5LXl(&w zC~tVJYv(s%ve@AL1n%3qO+x!JtOj9VmD2CQeOtGk(6Ehoxj2QKy|8u3g4+5y5FKy1 zNCl=k7;@9@zuCS!=ggRSc-KJ$WWIn*nXLC797wPf^gwYvZv*}X-l~T@?@@Sjxewh;5J1~{D$r^OuM;SP?WM4pEWl~5P{ zxWJf(zsIF!E}g(9xYfk#0FAASXX6##0`hp9?-wD3+S+5zI_sEOwP&An{t30`%&I=2 zw$>XC_mkYBqY7Y#EH>If)wk6ie4w`pl+HEy4x>z8X!O1aij$U?@zyjnW4IXvapFm* zp5VO)qPBLC(C^>{S&S*k+yzaIl@e?SE{mGkP5l)V!p&Yh$Gea(3i_eic5g1o+SIgW``UE)Ct6?P^COr1pZD!5%Vh+P7~=KvP zfLu`9zPJsY?JMm5WSI5Nzx)329wGeaRSx%yg%b#ewo47#<=qu*#%<1FYTh)#-ezXnWNXC&mq zT5Sc$e9fLFO0jn?`axkYtNf`{*{zLObBQ5`MgNXX8aup zZN|?b>m+@B8>YZXsl!3Z%X0z<_aYsI5x`!SdpQ{B%krqW7Q8G!5GNE>UX~vN6}~Jx zL8xunr*F>Jq~>lN1_Mb~KbZX#G%}Y|Nh4R{^>>YYBghL1`l|0!2o1`L4`D`MgO|NVo2L2q{=2dhf25^*fMz@~+eW>nx6NZ(UNv(I`Wj zMfJc5i+%#&So8+ygcV~jekdzW2BoZc6qK@}Y@6Za31Zgs7a&YR?#K8cea*K)xW49F z7$lMsON__iqMg&zpsXL-9pi@eL;Hi=X3(B4PN=W+L&pIX_CsKzhbwTwY`5T_2A2XE zY=Z+Cb_M=QF>V5p7s|sB+nVGAkSY0m0dRXQ^jo;6U%o8502Ptbl9xu>>?1&7%l`o3 z*ur^pAzQFvV{9n}Wo%gh(%7<0TnoDA72@RBatqMEv*l~3W`2E68MJD`0I5Jqo&`>% zWM5RqNy$vm+hf2Pa8IP?Dgc$9?}Jk58INvErDrZE75ywIHpA88$KjX12k?F$gB~cl@;)?T8v|ub}Ut&r=bV_E?H$NH^T>XbO=Cj+)wnH-Ivs zE&*3bVljf8P-A2gcuph1qFTVOf@Fd2$6qVZcR^~kp98hMq8$%5q+iulz)2(g1;91J zD0KA+vrhz2W?v3Unf)3lW%fZF1yWO!*W9S^ZZawy0*+{}aTX{M&M$#*!g&EWRM-Hs z;i3&N50nY#&q11S{#INIgmbevfg|$H{u$`sg;Uq`PWwV;Iz5Wl06=zL_MdR>N(PoW z@O7Y!;bTUkIjDzA#w9r9$0hU|Iu_mos@i*yPa6xz?Bts2Fi`nX@mwGq3$F!fZS9XT zkr@S|pqn`l4*6cC1Rq#TbtSh0rd#Il(N5sHL8ay3_rQr998;c`gNr~Xa&Rkv%E2?B zR1WqT(nRH;8N}JwQ>yT1Ff>U9+dI(8Iao(+ZW)@#u>!lJg?p( zk|qg}nQ`qHkjAwEkjnpS@lwevcN+*1zk5J9@mrG~(7F;=->Awb&rRVQq2}BBG27ZGOP)LJ!C|ZucO3aUlzl1{a*M$y(c)1`v z&?lsEm*J6g#E(4#$sY;wygIz;#7`Qo#9L1M6$?MGi{j7Bf7?G35KeU)THXQd|1s); zF5pVyz!gLEJi)a{HqUE4C`X~Z9GIVb+Oy~oeD=)S15m~j@0lI zEd9Ep6?5p~Z)26>bJ2lq@3#hyx=*Uh`-wPSyZ}2q5oPP1we}>`(5Jmnf&r_T+ z|E?OvKUHt98arI{`i|kU^A%rixZ7}@hif8Plc~q@e{B_HJ=*Nm% zU45Qa+-^8uGNnF~@^KlZcF)Jtk-p>?+P4eq9e2d|-7u4U$=b+)^EWc?R)t?F= z{)S#s+>DWczq(&5-k{K%h8+b4ec${mUsXKO_*3-<#i*wI$_5pm>gxN3;ug!#eQTW? z*4z8-2S;5mY5m>D$-i&;ZyQJDpSznH-hJEpTf;SE-KU!WTj*E$b6*bniNb$-UI-Um zUub&ngE!m@;Lm;PK6eaywR(H*Z1N0OA3OPrZe4!v6fZht`MEQ?9mZdGfYS9}?vNh0 z$@r^UqWpLB2Y0sXef9R-iKk!?p<-ei(msN~!6&a}0kpe|Ma~#dik+{$>8o2;ccT zGkTag%FmgI-)P~T6?losYn|EC_L;x4i(O}U+dt^8P+m?VwY<)d^(YtLY)6kZ?2J!m z7j6Y`!>H2qP*68@9q4H1e zL+Gno;xmcivYSYM*3iv{U)>R02)XKvxadUhk@vN7jXhlUi$|WPxJSWj|Aj~tv|(!j|a^yTYqXrJR_lDOrFq{@oAusWteG` zy@+e#v)~YnP4Uhvsew~b6uypJhC4~&y2;O62%m5)^Vl(1Rfd}+fG8w8hO1WkRI7($ zDJOuv{v`q_Du8SK`2r~|h`O|mXxxijt6Y$=tF0nI-thGL*w2io&#Nxh=LK;jW#jLcAa8hj z742szp5aF>oHW!&))>vwG!E5OG33Ye1K(;+C;E$w)FadDa6fYvefIFnAb}zwd-&x1 zPAJ7}`t0SujzR%8HxY=366L)3tDu=p)KwCH z-O*PJkG}z$<{8nIWidBtg}!Q3%so~bYeXw5;>TV1t0%|nLGOd|MJuPp&w{Q1zoP4= z$FvfiO#1q&_+`+?lD=VP{0eAp$wxO<$FGByG;gWFbtvez=-%BNzYki|h~n>B z)Hl)}BjXSQ`4t%M;V$&pNX8_tA^mYB6*t5E>!im|4l8bRU_x`LSIXeS?!se(8+1!K z{+pAH)gj0J=qGqkAL{RnfptXO3-S#(`DI?r3}o7{Q&}p>$Q$b_L~WR#`8t9HlhAi8 z?HB5Ma0P0AOc0CWjm3Y`=dy3~Gi&LyR}y0{7h}D+GX{I2A14UCNDDjkU~l>XH9to` zhw5m}9(;~Ph2KmXAqSILId5!QFXv}orq4;t_m4vTYFMhICuvF3nma#36SrVi5@VK& zAtjwvP*OojNzX4RsY7*tWqKD#NjWS@Q7@#?6Bsm6Su_Q}&-|SMmonoK5UgP7$vdQq zx>SprRwDWt?tKLvNsJB`LyFo_P*g!lQ9BEY>X0%uTfo#DZL++vX=SCK*^T+$%Y2U% zitjN{`|*M-?Y7g1?vrv4Pb)Y53@vtp{(@Nj1+l(usHL4D9jcSuzQcIl*tSaL-IV}- zhTDC?ODqwW$H7Zi8SkV-FS)ci>;=DYX>-_9gn@aIrbgwepP_A4@D{@%#WqRtElaUQ zQgnWGPcr1&e8Iun3nl$6mVS+-@6b6vWk`prrCx%(QE5f4pZPh%jlrB>N2E6uGIxwf zEn5nF>;6u-i_aE=Z%vHu43O^@;5j1{GAWFxT(4oCDJcVP2SdJ6LJnqk(&4MQW4=c|T+$Zzh zV7`lgUrrh{!M!j+@m~rSa~oqy`$o1TFHaA{IYOW&-ucDx0C_ls_yfbtKVwA#aO7Fe>L&j z{+)`u&c9CaN5jQ`>#Um<=b#)w_@P<1DZXZeh|>GBM0B>eVsDuxqLbjwv*cAz@Zc;F zjRe0s>rSSZ;7zmcF2EaS-AnwAR1>1RVOC!O9+>q=0bV=nI|aD+{O=RL>o3O~$s3j4 zXu{%)UV8-Azb)kkE1-2*ZNDmj+S%^u0yqDbz6sRfV9!8aF!a8X>E03;{acL;KM6eN zO~y@N^_Bv7Dve&v*Bh1I3G*}mq*tSsFkCg5m9}dPtnD^srEMDnYuk-kY0IX-+Hyly z+OjFIwj9VxTQ&u3OSJ9U>kd!JmV+0 zH@iD=vy>O<^<-s+mf)eR$mYD@Nwf|8yR)BT_=|;$UdVY#^cEib!ZoZYo)+#D9|)4o z6+(AJ`xuTk;pmc>yU9wIB@@=Lydpl_g)g5F^H8G1Ew7BL5_-@01V@jV?1h|SMCao{ zgX3soaYY18j0K3s#hakL%n!kIPWSLatD2DntIu!)<#>FG^4I7H=hF&xeo>UkY zLt$L33S&vc6vj%c!dPf3jPFJqDvXPvFfLYwvG|$7SZP%lD~&iWAx#!9QgSZP%lE3FD+rBTs?!Br}Zi=i+sR)sNphhkG0Q*w$;VXU+&jFnb} z@nvinD2ziUTFSE|wy=+G1x>X^GzR_V&iQ_Gv=>v`!|+jgNwTny%CWG|cbV34dY3?N zf$k4Kw^{KpBEO6!Jhd6l)Z;Cb+B6Acog25m{R|aIeg&1#xgQA0K^d?s_f#5g&8`>t z7P?^g4rPB#IM(2n>`w)Lj1d>UgEEx*V~__m=L`M}t7LbMw$T1eRuU`9Iw{-9QZ{JArD%%CX{psI zR;#X@)JmW?JZ*gAXMD7-pXIS4tY>SeUGTFU5rC?x7V)#gkSoxsRNy2btI8NJXVqGp z+c^#Ub3E&i`1a+-rr~`u)An|G^*e{&hN@;i7JIXUBaGV z)nrbl{I0d?H;vj`zl)4T%k{_t$iI?V0YK1#qx8D>Cn3PxfG@d=29!ddGK>dPL)CjuQdLi9p8*o-D(RQ??m-Xe_XC zf@j788z*>bEUpP+G?crOV<0_zP|0gwi@rD6Qj! zC}B8G+>bmsP6Q)M=|7C8-9mjjRcG`Z+&EkW7%l=GE+j1*E|k{cLTC;b|3n-P7XgNg zK!*$Qv*AK%9WIncoC8sD4i^E2i$I49@w4GVX&o+<*5N{F9WIpC;X-L0E|f-n??4`X ztP6&VK!*!<0D%n`6zIT)3#E0qP+Erzb{_%v7vBKESz-Z-fvLHz6T}$|P;+A% z)p5q-Pb~r0;8!E#%Ct%#jJnlr^gEF8fM&L*QPr|M;>e#(!~Wb=Y1o%rnTEZ&o6@i+ zcPrr+BpWQmb6-xwmAN%(xFYv8!h={d3~pPq-yl5rIE9~PA0#}4Lk)a~M2FxXYJuMu z6+!~HWFKMR>GZ{J$!VZLJc|c*Y3Oqy7_wAYccHPaO<3npvoPyIV^*Co>r2M08ex`0 z)xs=?W(uzysuETyA|r)W4)!an9PCq8U1Y54RaQCJqpWgpwX&+#YJY1^cvHtSOyJFp zqVn_W&39!^m@!+JF+6Qz>}P&RW?W4lGGt>KwNY*5Uv2DZentEY)d_p9G4|B_fqpBE zJ=L4jXy!XR3ayVKT$!u(c%uNWZgvQjZE8T`hs^{tJtEJ$Ba+h9sgD&_OLwI6)zTeVSh}MNOP4?`T>`aqRfVNH z#!8pAr1vxPScZ(0PTq=)%fC%tiv()RW?XUVM80cWacV@q6R1r&%lT?kp0D|jN?Y#x znZ?Y1iFiSu+M5&cTB3#Es^BX17ann0aD74e?%XQkr7r%;++B)kmV)%Ua`HMa)nbRM zK2wpuT*5S%nuZ65^#H?qpu;-fgTRLMpU}&Ob)juomoPT03vI)?&^D|KZNs|IHmtKK zfeq_I+psQSY*_y_^F0>BI$0FHh=gGDqW_9yCX|uYKG|lSf&vZAd8%f`+ZvIAh zv$`pQID}?(BXP~@M#7ub4X>mKVRfS>Hldo>NX5;>Mgr5srV$}W6P2?LuvjU;By0M7-+abdXpS)X=3Q+z6L^Ugd8ATG~9S zKZf!VegaBOY&cgmS=Z@0<=*$A38??$2o;y6UIz>4ZD58hZZch5kDyN@E!N&0%()Oj z#yapXMDa7vA(%f7Dw-|X-wAmUURF^piRxh7#R@lNskQaTU5-fb-IzTDQ-6QF1>TV5 zPKQE_%mdlYOll(U@Br-Zc!zM;R)u{XY;Aux^X={UI1e#G{Z$Z8eKTtAUuoE#D+Uw% zO5V}|-=VB1e*~glb?`!Ec?!bM?8tyKI4zMdGo+-L@Jg*_NUboGN~LB^3N(uGpy42_lxP1!lrBnoxmZ=Do zRuzHJR1sW-INPWQ#LrX&N~?-MX~f|%|4LRcuObjXQxPbwDgvcdMWD2*2$WV8fzqlX zP#X2+1pfax38oT*w4zR~q~Y@;M# zQcg+0XiiDM)SQw)XzS7?47zlWrj3Q~@-7hOC-&2K*&UMmGNzeh9VkNjex{N#KZY{D zr%?AJA)q#OH`F5Y(=oKAgkLkwRD6dT_m+6{qiR*=U*im2$X!<7p&FV_D1y>=HfZqr z+xX{arZA0zS&9RNa;1qD&U1f7fO8{Dyw6>D=cJ%)J0Ij zr>m?k=SbT*R4u%BXr}afE37V6%}jFz%YqJeZSImZ?9VMoAUq>2xyinrqgBO;Uo_3qAnjc{a{!q2i| zDN)8^!BT!MaslxalJzsZR3O-WA7Hd{n^->VJ^|5ynkD<)C41z@S#q#DbBA9|ABNLl z4^{}dSBr(jUQ7jO=31ud(D7=e!Ms_{r|7r0lw^GRJgcAi5Bi)U;m~qwByonp$Fv3x z_Gh1AUX32S*BSP#%?ej$KOj7N zrxGpvheYS_5-No4%Ke4#-0$KEIFyxYpUXR)=&M#Fna3Fwvy;xhGw`efG~u;NLs%~a z=ksDJ_-<5_k*lB6xcy6o*VmHQ6LxOV=K7lk9mvv{H&|x{?psRn57tXVU~RONqkaO{ zEFH#d1~>zQ%)W^h54YeEeT)Z(|ByQbq3#gy-Y(cM%MJmrxkB3^ z;H_LCcL=HwfWv=?9Re7W@E{V4Lt_%!>ng3oztTGV3vI){(mMPrt;0XB4+}Z`-v@%j ze>k#~{=;~eSg6lr_~#sw!+(e!f>3t|BrO~MmDb^3Xb%6MAr6OsSVvTZx3tq3#ffpAG*?>+r9%4*yE)@UOHE|4QrduQckr8hP}wE*Snp-65dZ zg|b<3C-weKNKQ1qoXF$W^}}Y#b$J*v>F`=eUcg-{ej_6Mn>!u zB3@QUqoddv9mQ&NL@9_-#XI09vCZg6X*D_$+Ki3@rfNnk58FcRDLVAwov4@PO-gOM<{2cxv^!6;oRW@t+59*of3gCP;V!<;|CqX+MPF%C!+ zj}S{JmbKUpNHDiz9FPdP10GGnV>CL_l5xc~B_rZVAla>#j6}6TPs0+gqzo@SXsW78 zb}Eaxr_BjX$*78$ojJSmlASB#YtZp>KrI7Bp*6GPXLNnb7BWA#Wgzp234=cJYP9)8lhvs>Jt2Vd5J64`-!e4rdYLS!xc) z1mjtwcv@Ul+i?9odF9^{}?g2Oz*)FKkx(lkb?t)5zZ5LE&-33)zcR`ibT~MWU z7gTBNf|8Ke5HBp}8$w53#EizFq@{b5a;!IJkDQ16;pg_^DiLV+Lv>o~wd(}qFB9PZ zO9YBabo)*B;>J4vo8aYV_C-v8cdiI1%Kq;Egs{rY5r6&Ni%|g197SibJ2xwU>JDR^ zJq*{t?tb|$oL6flY6)T_vCouIq$zZ zH=_V|=Xmnj`J=IU`3GPl_=oIP=DtHbONs~Fm7}q19&gQlzW@(qg-I43>jkmAIp61X zq~6%{1vP%=3C6r00#^2%P}L$X*i_zMiLm>i5x;A3*N%xXC^V=Ln!%HE$Tz|T9rwqAF@hs@^}E-f5<95 zr1j9SQJvV$@pdFgLbs(hn$4BDnBm?8Q&y@$ z;hT%$4A>>6`Tm;$IzX~aJCQf}YM`Q@Xg9IhI)b52(K0yrey0e&gIhX9?j0QL6uExO zn6#-=EcG1R*twV`a&SYZ815;AD99W6b|MOUvJMV*=PqYd2ZyrRG#uy@ZO0!i+qIpd zv&xf$z1bcH{`04(7n17E-jzUaWd9BDLiu<{l%KhWKDYBk&B~mZzTGbU zl*WTr(wQ4}Exty2F(luglO|8_ zTHTGf+ePo!?T7^T=7gd5_~aE>@}RipOZVM@V}2VSNs~{5NVshmw>}z@=R9z zZ^Df${*=OB^8T-E0(U_rwo&*?99!`#y^T%aDTq@E2}mjYC7iAJmHxl93H%oF=wn^- z3V-$xPT|i^$|?Mn))l|fy5i@1FA9IYmuZ_oIo1WtVhA};d(5c<_D7D)jrFPq+)NXr}+HH^i8zVZ&*Yq5ma)=S#!ze(=ThyJN zg9DX!XBoWlH$Qt{ht8?zIGeq%LdOKZm!~7{R1neOc(C#Pv85-19CjKWp_|$7@CHyx zaY&zFxMz`h0iU1w8Ilb?M<0xpo3gJ6JV)Wi>|h#h$Zko)f$X2saBWr;rIQ&KbNsqb z>A4RJM-8wyB0-!ol%!!-Zg?6F%0$SbqTkGx(RW`K5x3@~ZVU7?W9W096@G1wr@n&o z?gnR3m&bB)=J!1ARs;6s_L9IqP~YC%7YJ*pDur)PP6}Tmg{L)%=&#RbTn=Wr=?v`P zjkzNUFEHP(+^K{YvKXxRnM7ZbigUtt0b%Vv^rXJHk+4o6*wR8&&#<_4=MHVuSEXGR z(&x6qs@?W?OedvkH;b=TtzT<;TVYLC7uIyO)pSj+hjCY1;O^Yl1xn#*M)xq`9fei< zviWY!ev7^i4rOnHGQ}V&BP{IUR1r1Zl6{h4dstJ<1ADY?Z%N&rrO%V7$XZ#q1W%6C zR_GU_oZ!hFAUe`yuSh^+LT~O5Y1kucoZv~5)$ZJ8`aWfFW$wKMqBJXV9}%vzdTrIc zgY{Ogq3mDi>)@8`)-)W<{v!=HW&f3jsC76JQ3w75MaC}6omx%aP3dQ#D)NGVSb@5l zMhdj5Zfz88|39p%pEU9&@8BQSDq9-I3ncTvh{47`lF^^NpnTcXxEp;x`;d~2NzPt^ zOmtsvjX{8^)%@OQo&8mBU@gFkLOI1L9Hk4nR*8jnvP<|Dm19`p)4 z|5&gCcw_TficeSEKR2VePI32~^9yi);{a-h_-q8k?`y23zwdBwhFXi#p2Cm}sc&MSNApI>3vd5C7H`vfz;QwmFeB#h2XIbBd#l%If zyc-&p7T|$~NhxBc9jymX?8%tO7O?w`%+dobMR8wLNq z*&8WOBVBv+&VGU66?>!7*TnjnU(jn#z^25qqes+Qz)T9bTesroU_(~$jZ5Y2Ou~09 zmDh8Q9Ii(AtxM$noD=W`MNzstr0C7TrCRiX<-*G5z+RQ!W%8;t2Un^8&{BC-nuFUd z{8D*U68y;$d8g+|d6E9m5_zc;{QeSos}sCsiM-Yc-n>NK>jZCFBCNVNuvc&65@A(> zH!P7?@e=1hutZ+P1g~8puUdlpm&mJ@;9fCb3R;4xXc64g@nh{3Td6zD{GP1epsdFt z=}!vT(_u+A^J9hIBjeGz7GW9`{4@~AyEbH4{;A^w&Z^P>`QU5Hw}*4%h=1n%`*J*M z;V_0~F75%l5ejTnt(fy>k5icTSr9=X$1oRNb>$EnYq5XAWf0&jR+z zD0myM;R9sBVZq$Yi_?PtA-*(sK9+(1DaCeX0U9bLJfSMmrzaTM|+JkcX~Q12Y>k)Lv6(!Gv;KgDC4^#NJ47TY)zLX(%Vxryf;BvNz8`wp#>;O~Za2=kKMAEsTOh(ex%7kH%OOiv3*aab>CBI-S<>l_dSKi zzGq(IhNbA8rARxcUA&Mpv{Y~_b>1cZcNZ_bACV${_=;BB#b&i#tXA9KL@!=!R@*F3 zu~}^kZC2ZlGmKen3vE{0oJACy)wYB;tL<6fPqA5Tzs4|Twao#f`1&fjE3t&#lUZ$_ zOxmorB~7#1UO;!V+LrXqYI`Z&&1#!{WU*OoOI)+smhfh^jcaMWV&0X=4}NX$uEb(B zJ_9cKyviE^E$w+A$53X&MWED>o3)YV#-$?(?R%xnQ{17I_$}x{ z<-`++fA0mVoNyQD7mvpv7fwSZ#N_I0zk4eq{e7B3-fo5kX8o5f0xPKL-1 zGUN(8oT}s|&=HoFvWe_t6WP~IWZvuR+a|Kox{0i`ZXzqKo5(`jCbH7HiLA74A}g(% z$Wk!dL{?fik(Jg>WTkZzS?Ox0j|ope`J!q(s3r5Um+b3a@_(@0wwJ85YRQyVEt!y=0|zFIj2bOIBL9mvM?kqac2BF1ij6PA+`d0QqVI zB!SHaND?s{pywFTY=DHe$%TZW4G;-oL?%trINprp`ao*TIdQGB=#ajJ)CL zk4^ZQKQrJ=DMGNSL$aJHsbC{s(mcsfo1}5Fq%k)AfeJt4?SwSip(a?`1YQK~3m7b3N3V(g z%Nnxd7KKa)vwm%|T_ssSZL{4Zus16G)ek?jni0>`bQ0k^(`P-fZZUB?%cr~nZ&7(W z+h@&yH><#%qd8F?MRd+}c$11;MzbF2J}@$b)cwpinDxza?2k7$gJf+`UX_?zBoS{^ z+3%HM`wP<_XQW5OiyV^sG9S_6qrv6EOod2CrRGsfC;c@Ooa(mhwQ_4lCMY%Mfr(z^3xT)9{RH@YoyC z{j-V>@=uNr0LlFQQ@r>v(7%GWe`*vTQZcXJZ~R{v5DT{q-~;i4r!a{-9g$WdXlD1^q!!*P4pyvo9OYV zn>(Jjk+eLB)m=Z_(@V8&kOkp)9p?4?8Kh%!X|nWpA)^Qh&-A|uDbTZqYH33 zrJ|hPUO0^Q_`eO>r^c>h z%Qz~w3l45k+l*ZoBVTH=#hhi=t5E`k9aLMXUH8$bn>xi5WH&+#vKu>ZW*(E6FyMyH zRcScTc@Y+7iSOFZ)oI`UPB~EH;`Vh?^J{_8Kitc(yYrM2hO4Sa@`x%Tv4l}i^u)O* z)4qe*b!j+|{ZShBW;di^SC+T>Yd+XF1qUK(`KaGWU*YpC+}w6OkGi?-dLChO+x0w} z=Cr@iR4t(yHcATGbp%tC~Y;RdXn0x5+tn_fPc2;_X+%YO~$CQZ?x6-5Kw#~mYon0#ACLg6M%>zIUJyI#zgf+-gNvGqAxb|<)heU8@MhSAN**58yxa6_k8 zF^p+zT-YSZPQsLH&^eEYRz194Z!(_7l!5!!>ut~u-?v_Ge|ETcz21a;fQ4VPJ~xV~ zJKVEAH#Ut|ug_JXPKkf_`rID$KhWaexIVWJ@fQrQT%Vhk#w*t6%23kaAoK59FPF(B z__K9#n_Pmou9NHJ45O<(gsC0G7DQKDeOMkvt3FwmJ3_FfJ+v-&bQ-_EPA;EI(%!O8 zZl6o=;JTcgk~)}j1Kw>~my=x>hc~Xv9n16%kpU%I_2RnR4C3j0ZxH_H>vAWj@y7MJ zYU0B=Si*n9x*YEl4UYU+!~b|)ZhnHj;dSWqP%V$2!Sge-81oH=Ov%?9+sM}&+sKy- z@8rv2Ctq(`dQQF+JNbIEK)#%x%GaBD`I0(pwmLw*qz(>4zGk!JZ<#;jOXTTo!DzpW z>HA05e)IDvS_RoV5DW;mSX{`S$kIE8A$uZA4ny{2x8^rVMTa48 zJm?xY{OYAULiFHQbFGWq+3$)Ce7t;>Ct<@wnBA;0&gG34<9 z;!jN82iE1jnZ|3^zv&3|NEgSBsXg|?WYq=vSb5_elnDXohsp=~jxv@WKE zw#Agvx|kB$7E?lFF%>RFR}fu=2eoM-v}vJg(J0tm^Mvl)20b+ z+BBg}nNTNl>LFncfO?ID47?$hYfStOJoaTnVG|_M3;39LWSbxiAK3+bO6w+w zgt1K!rF9cT>B?l@5S8mDh`4hTgqL7Vs7gQ$E@)v77QUc=VZv? z-X{pO;0m1|x$lwAK&fTLBer&|gO57k8+`1wzKUp=BgmZPe$rM4rL_(c#_FK7)8!i<5cxZ530;Ti&~v8QspL)JWLxm7Y6aH@qZj=nE^rqo;r=d(hjZ*IG8PXe`{sgX{sb(7YNwc927YRB7B96L?GAg{!QmmpT zHvER9$Oaxqc)wJaRpMx75L^>sc!07eElRa**vCw~@OUmj&cK6f*NA)bk?zf}qKECx z^P5JI?aiM^+VHg&1QHFc?kH+AXHnLgE}7l7EFy43c?g%@Aa zZwN|!s!MrQ?r5TNR?7>&T7b*hsO9wb!XMCwc}d7}p~NTpEgWrMoHu&dzWAR(7VeAx z11|Zz%DIrWw97$`q3ndbTwK+qtc~>!r3sC12uhwWjzOEVSjh}x9=hG{U9B?+_r>wg zW+26>2qZIzOA*4~1N-5-#g~I@fV+?>DPqX31ce8kaoF1Wg1h&MP&GtFFGRcZi#Up!yU&MKM=}| zt4|AJ4EVLlw$gD#NKHTMcf6ry*&7sub9)t<_KTACPngEJO#2mZH#pbQmb+II)FL^Z zYdJMbP8myEEu3o%)k#i*aBOm{=ERS+`uHLUtu9&t$Y$`emcYhae=!t#JYoQA!*(lqSJ4JTYAmF0;7(E%;$#?%bs z>5VzwYY{AVRVriH#cX z@wWL@OEnytDYbB@N-Cj<44|Ssc>Ay9BN-r-c-t!Ru&#%$Ssn1QD|Z+h&B3j5*?t0tob{f5=G<6}Q1d zE{$u&?<~{|_kiuLxzY^8&)iI(0W|d5T#t|vh3$S%8uqF14w!Fm?%uR-Pwv44qL-+9 zgy@H3AVEM?vb8SA8#!%H&HP%t3Vx=a;ZEQo(G8t)O6CNg82}G-KCOO+*LHF&Kv={5 zodX5_eVsodKGFI2cJj^+VAdHb2UW+O=u?aVE5xk)ME@E{5jNA;$a&#lhEMJR_jJk$ znFO!ye1@qT#)SJh!kIp6h~W4zXaVlc{fhV`e>o}x|L)wY1$blUo5Uyk*TCN!Ie@R5 zQ;e|t2A;f2uXjajB8+=is{}z34kfTzs_?FV1FC=;=_Ow8N(EtQu#YCm&tLkPzcI;f zsT@Ks-3hq@vX=sEmu^>mp>Amt{nskx1UmfZLIh4=vuL*x*f@qsB~U-*daKXj4}0fR zv<#ds`eIw?AZO5#%h!>bRZOWdd{V>u8^@N88_u>x% zSIMn#hq_v>&B>)`hq_umrl$CZxnlL_q!y7}Dv$f+rr71bUpLEEC><-7%p$>V&dK`Yg;}eEY@Rknlm*?^3j!z5x2Rr^& zfH7e~34%L=J~)HPuXdCYf5oN0siUj_zud7)0p8fLYXSaQ$7JHWT>S3b6yi03^?hA( zKpyxB&2OMXMuxjxBd_g{p&`Nj9fvZ0g8Mp-D!{!RGH*%zdpeGz|2;0f?v9fS@Ia^Z zl3xv;(fqqQ#dIsdD?83$_+A&ktK%%<`?OKfKFg(%6FjuMj{e`!R)*cx@)qLzrJ2Fc z&C5kb9&r2^T)vF{eGYG0F8%UDfekGim-AAo;NgJg&xpTaxeQE?1RR)v2bS~tg5c30 z#K;7^cDc;Az7=q!0`6bFg6V%-dm7BRmS2;{7*9`Ev3meA=x45@*YhD?3X!_!LyBPT0l9B-k7l3SWZzRrua=`So=?O8zCdx8u77 zxTix};%yhcyF;2H!7DpN82%`?IDy|?9lWJ1cqiOZg=wn_*Snz!*N_U=d!Y%}78S1d zLldq+70wSr6HXJ}KZS|#%FFU$C_NyBS6&vyUPw)HGzkwL+$q8pYDIR18k~yk3N@Cj z$gWUhsfz3hHI}Hzu25rXitGwC=3Hb~s8Jq^>{1AY?Qt`$^TuN4&9t`*#$;q6+%!$`Yp z1&=3i*9uAu`IhM&}dXv7H&Eb!SHDO4(gf zT6boI=GB5ELLV*bl#Fcga1@(*A|5>Q5aY;0tVbRgI^NNfPnc31VmtC6?snusY21%@ z9ut|32M?3QINA{F(FT?~wxbP7>(K_K^=O0AdbB}kJKCVM9&J!sk2WZ+M;oL7cC?S&I#en!vVSg*FwngfSJh(59jm+Emm+ zn~GX!Q&CG{Z2MJcQ&CG8Q&As`ZcM%+dpL;b1U#sbPJJ|10-Hu!5;2W5Unlp`SfNcL zEnyC*!VW9a3cH!=U3hRerr@Koa4WXmn2WINOFkM)+IC~OmMym3n0+v7(vQX>B6nj_ zAB|;}#kL!xwC=_zT^0|(UufHnQMyugW0cn2m}8h9cVkWk!QB{qG?xC_Rp=8RjfLl@ z^u%tAeKb}QvE3M@bvH(6?#A4WI9y()J{l{2wi~0g?#3vMI4>biCF5W>#y%P=ezqH< zwC=_zt-CQw>u!wFx*Mak?#3vMiXIHE_OUM5jj@l$vKw|Ejb+=rkH#vkyD>^v#;2ip zm$6~E8^c5+zDGQUTe3$f6B3?5lg@=zo|U|S6@l}8Y$V}e>7B%hy;8<8cW*}|S*X%p zi}}cmZ<J;-6t;1Rl$R(A7^ZK0PAx&YN)^d4xAJVA2LEz^|f z=*>c;7>&S#0}#F>IXch*Nb zN!n%?Sf6@<%`PN4n_VcavkReZcJXb7$LwNwn~A~SkeHu&0Rj?^VL)msIeiJokR8-? z^1zNF#Hv%_;kPDm9{^+RC$VVN{jNZXM%CYk0;Q3c}ee=~dm zAL|@WIE6_8_IGk3l)#5O%hJAsonr~7c4BnJCOkf4fr5IUiaw~4K69)@TeL)TtVEkN zRp+}&3pmFL__7vot`%WJ=M*M2&kFcsE#SrGi);Pp>)=zJ*P;js9O|s1?Tb4;>=liTJ@Zd73?RzK~-lB7uM^FEWrRWM65)JPyda|uIz zlq4@9Ka!Bhyjd9hkun(S58-bDYlOWYJKt(vl^uTU-+@1fd#Z5z6RkZ|gi_K^wWOn} zmueZ_my%w_GK>#g6{QU017m=eVSFHs?8=ZpEyD!ot7VuF6qI3tq)auXlwnr~kEhvw zsL&f(wM>gNO4xEGi*%$YQLk6>F0EGkY}WF~q_9*+=V6O9PvToA{5#5(u15Hmz%t=q z0xN`nM@!jJ*y>xE?=iv#G%ZfZu=Va0hTTK21}U8|t07?Nypd(gHPq=6>VAe=k`J}S zLe*KQGbGfb40TmL)Kwa4RKJCKP(nSkZ9@_Y3jtc`T2ZcoG|RrGR>59 zeoe0jTsqo~KH$=6mvqz@OIo~^Zee*F=;$6iXjKx~Z3~g!w(#X)aI!;q6rsp&TM*i; zO73MCvnmnVtV;MLn8*&{N%+(uyvVFdo@W@dD)}90vnt_1$H=To4h8!ovnr7^&8p-A zy4xW(Rwa?%wjjJPs}hM%tCEd~ zGn&W_;SCnxa=uvQ^!7r2uVpmz(nEMciBB{Rjh^B$0RY_5D+rklW z$>&vmCZMIA0Xc?k8rFeQs}k16W~`+NjoTI&Y~nL4k^u?yFX%cLzZdbNhwz}@DuCW9 zP`%aTctHZwTPdx2E7l+|y_M3cw_;*}>8+Gjy_M2-^*^(K-fBCih=w4_!4Gsn&~HM% z2bht!aiQ`rgz_&`<==}a2d>ML?ABK6Jr~-h=M+;; z&%^ICqaWgNBgV{a*JV?gs;$c;wyn#Q)^(ZCwl2GX;cZKLQRA0t6B}34}lh27aN01pmL^nR(9=|Ig?DfA+jLvt@R6 zcXoDm_1>Ot5-P5ngo4{9q2jtpsJLztDz2M^B7kiYDz2M^it8q!;<`zwIF{AZF{1m; z!tGnf1OJNQ*qZqmimJG75-P5ngd%`#5-P5ngo^7Xq2jtpsJLztDvnJ;BBD#!Bz&EP z?!=9og#GZ1MnC;VL!`A$Lg@nABoy2>2_=nf5(;jcgo4{9q2RVjD7bABiZHfGD7bAB zN*dcF?0~tGbEPgMayf3_`WjRc+a{qfu}wk_yWne3!EKXJ(r}aTMH*86qI18uaVx?A z_B>AQP;@|WoZ214?Un6UiQ6XOUTCi1IJH*d<9A^H9tpTf*z-6wh|=FS30ZvqA$FXa z;JQgD;lXig3=fV|6I?e5m$7Va5?%|0n}j@04e@GH^zQm?M&##=>~WkLnb;6vR#d=P?( zyL7*!fpaCk?{`VjC~@t6P*1AmNK%6>uCb~oB_EQM4(7a!Jp=iWq;x1}Y*5qqx5v_9 zoa3>&zgYd>-DtFuIj53`eEWgYS|nXH(}8N_pTA41=?#Et;2*zBYv>PvQvNmM4{8S2 zAf+{|FQ{o;bA(hmmmH;f!W1cg(!%UIcKs8@&c=*kr!BXH!rBj4|q$RngiZaZtz)8qqIfBcx!zZ^{Q`culgn}rPeoPl-4(`^{vCtyhAVb z_3JqwQzm&&Q)IffmrN^q$#k7@Q<+v8rS-jD>$}Bx_kl`b(2@5h)|a0nm29#cSve3R zpvqGmB%7A0O1AKW&XP@5ZX-Y6R0>0^L4K2HGr70}w_U2WxJFub$U#W=WLVOZy-Erw zE$PW#B|X`zB%$zYy?AefEwndeDw#8yyk8D^zub#=Kq>E+d-2}hi+4cDFN&6ICl?wK zsnaV)O_Lu|3aGj>Sh7+ao|Ai$4=?6{wc*i}vio zUZlJYe7{&S9|1h2rJ3iXxOz^CtLG%Rc}|K~l)eBqimT^z8_TBWv;oLl zEMriQcC*&&_e(_5bL#OEs=~xPC&l&8tAf*W`Vx8QIraDnRf#jtNpba@6h|KZPA11> zkDoW?X#>H}n^F^kpEp%py&A>UtKn#rpEspSaCM1Q&Sv-v2*wpmyg$HzJmeXjc(>b7 zJrfxY42TIxTr%e>j@yH2%T@`t5sYAk3b&9t1RleHH;a}9Q<^pWHfVt z%8ErFy;`XjvFHKSc(>$X96nDmZc~NZI>yw5+-d@Dbk0kJf;35yrdFldV)+{+{{zf_ z8uLFUSdf2fPfETDC^^mQ787n0tZvt8-IUul=90PoIl%&Mzv)RSx2e6jO;c`J<95Et z_6l=dK-qQ*7I1r4sGz0z#Y4#jy|~R1ZUeR(w-v(eAIuf8Tt$&D5^xmxgu+)3E3`&u zNv?l0*PM>~*b994=OTtR_D>-7|kp6uKmJdH@;KOGexF1duf~Cjw&8@-daB=$Wk4N8uCzqW9 zU%CH~lCu7a;?=3X1E&umF&;5{A*M`Y_8x_p31wvn-KV64JiapmJh&%a#;CHg2|x#o zMcIQ(>kd%fqYs=u=$Mca`3maXgNcM zlu#0tc<3;QIU1~n^_M#Df22Hy4}r9&BKUwFb*16z#j;GL_^vRt#yO~W3N7;BGO00) zp)>~=IX5wzP5KqlWF*~O(c$OviA=hps%mWI*vg7A5_()!RVApgH8o?$ALXKvWTGh- zDInR{s2evsk1XRNNxwL5QYPA-^3#RDX~vgf(!>3~m*>uPb)sGG_% zU56j_igNFgd$)^Zz2mE0Yn5xoy~bs$T(;WfqeYi*@m(gDXilVEI_J{eF4yT|kwS#| zYGSO5>&ztzzK2AR+f8>uPN@lWK%q!=mrtZWLgt^CNp_FD4+B4 zzTb*`Y<}mpH#xRYE&>$X+MC*uKP~qpqMDMe$|)0%=OKQ3I-h7x`>_g>S-(4G*N z7Q)36`GQM(h4!qU#L1s+?TKh>9%7)bOaXmsPr0_dkV!v|7Ed&{6xY1Yu z$u;{0ughgI5RfILyTG9b-%Ku69fRgab1~%{1jKywZzdXn9$Vh_e5Bb&-{xBLt{?>E zflj2Lkdc(jN8*06%lm(2^K&^2;U26bu|<(68l=lhqV9R8_iuChb}ADnnrVm8aek~B zV=2>~qbPnZLiLNbB+|{o&9Uo(Do73&!HCPUQFA#ADVVfqOYqb#ZgokQav7J!u&>1( zL%)_#?S!=-bA^_i@Bd%rC2H79dDH~f5XLK!+artQlrRoo=t8srKJi@2b#UNCk>;plu6#o=IX(k_n{2OGdif{1nEjA`pj26s>@& zL{XQhRL0NdS?OF3Nm=Cd=y`(vlTB<)Hd!MpB9w60i%jUM`U; z0%Rm&pkX{>R7P9k2|pQgsTBTu>8wjrqI8u@SG$-?Lyv-fbp;r7KbwHTz}-WJV$yZN zXhxDylSmReiGg3F$X&b@(b~XpV~ueG28-o7T!S(2swcS&rc|^lExPFslntr|MT45T zMU^hL$ThjPH2%YWpo!YFztJL1$l`S-Vucn|izXqP%Ww+Ah=Y)@)R=U<8pN^c&0bQb zKJ;fHN5D8L%v-A>bFau!# zG-Zmg*)hYQtePrhdN14xMo=xH3UQw^c=;Jz(|4Wg$^Yp_6n(NlKu`%m5ein>3~yn>8X7| zGT0b&7x}q#U_xMXvo0z3WElf<@3)BoD9}2ynPJ#H4#*^jRa(S=8A@YD6yd~I$dLhjK`O2XpU(slA4bdw z=B0Eidy5^cAvAV9NUcVD% zL(BmmLUmL2SVy-|GOA-pgkc`TFh~2-kA*cyFT(cwF?3mgdSay-+T6T0my5&_P^^4Q z0)9xCAg4(%hSDBUdI4yhhah1w4O%FPwxGptf zV2-wjQ`6;T;ZI?_%%r$R^Lv~cQ0r!pNrTpsv*UJe$#Ihkql z=A#931xN+%FdidWhUFc*wsydxHA)OKK`R8K+sgL)NISgFV({nY8xUB&Q@wWpez ze3$^3L(K0iDDVc5r-_5684?21EHL2?VIJH^j6QY~eBgHYQ0RPSjA512v1c)aW&j%u z1y^KL-gW6C8*@bvc~=D11?XUlTmWFh@1|2+pKH*>q#m+RKsW2QdBs;l+q$px!Q&=t1h+36uS;r>$^sQo8 z#I){7VvEyw7V}Yi3hoLUmO1$phftYn0cMAwFg<7}gtSdGDvx4|Ji7GJS|wC#wLWU( zk=4Mg24Zn7p;%zc6XVv;#RUy#L5_FmA{*zqJXZcv&K`3cq}>w&uf1T&dN`j!x*kCt7?af^Pfs5cgW5I$dWObj znbE@)4fyp;6ojcKDfcRMD+95`f0sTB(%KAzW|BD(vLj8kEzrLe36sopm?2rJYwqCc z2M&CiGYIaS3T39jow&?1xC7_(;xSn?=fQHrMAD*0)m7|4xfl!X=qKdF$)NtC= zwAUGtnM><0OB61jwYpM$SFCkiwXO(fJ58sl60L#%IX~{0S5_n}9=gXVkSNT}c-J+a zd$`@qxB00{nxD(8^f^Yq;_?+L&6*#s7xHA-rkLe3K0-Gw2E*DF} zYQokzcs$6$#T&GM%VxQw>QSy^wNbb(hBp(daj{yco5b0WCOZ@cM*vza>sN8TIX?*k zuO^F`A5&c{!3Az6UlSu=v?mL*hd6Frmr!xx+%maSZ;pW-l~!t7djwOOE9P7m<}e74 z%P3#gcf9Hz+b}_DqI3zCRQe+&x@6g z>@C6Rf#+?S5-uC_tctdTmCEJdBAxLu3uijht{vN$dGth{t0cCG`W945Z7MD(u^7c7 z6-xrHNnr{-D2mDpmy`+yj{?&TMj8m+VGu(0QfN7`3n$~t6prCu)JtYES$hBAj~$5? z*NTN%C@?mUlX0{eI@h*bu)jj8M)X(KB5cHDLfS=yl|HHD9ujW!wy|Rx#TF@)QoB45 zPAHR3@IXAwn5Z`@ly{vD%_F*R;$lsn$hW{wrm^Od2=PLrZXO5SJepJq#be7YF zFd04epy;5gwly7eQikfok!*vKYabbBvTFscMi1B?4ia&=>v~Gei7?S+AK1%EPJ+13 zvPBdm<>CpCxOg;@kJD2G+W}0&NhJ!aVioGm5((8!Fm6hOt1(oLySARP4%0|Mnn+M> zPrCUst*gK?bt@_|DXOh%DVm^_mWMTxol{%o#+x`Ov9H;LL4(~eJYf<#_}s(I!@8fl zBoadDundLIEPs5EBESR7sKA`=S=&NmFk^5uChdF|hI9o;(d-abTw;%~`#~ofmN~$5ugn6GNaMTU z$LIVM{w|Zs#NgpEbB}@`oq2^KhnC8CE#=!ZT@6?`uL;{2X)hAT$kX1&_Rjw&jDL5* zE|4p>xvn?#N(@p*zE6ARa~`AtSLwihAvZM3OEnaZv=l>7Swa7YVF- z5ykx@LAd>dc{77$2>!IeC|j*_kr%DjG?;;NyT|3NP$3eN^%_dy zzK}#kVdjN-7M8r|k%UuH;8KIzVa$oSY1#!7r}1Sl{(=2Q06r3zi(w@Wf5^qfzlZZr zjri-h`woC<_~%{xrIhD4IefzF@GhLgU*{eER_qQ1i~x)R903>u;5#G70*(WW15^QO z04D-Y0_?_h3ZAC}CITh_rU3Y21!X%Ma2|l^X5u*uFvn=V?l2E9AMia3Ys51G;2*ku zKnoxNXaytzZGar09nb~n2Jp}9ivcWS37$&8|Gkkn4NvU%_57O}ZciTX zJ} zr?39`u=39)EIy~~gExM1?jr-o-haj7F9v^eZ}VN7hcElX_pd1XWU^QOw?}3ldQJ0t zXFbvJr*aqg^qsKpUFW~KCNk-X zr;9Tl8M|ol>Wlu;c>4K=e>m^U9k2g>!LLsp^_SE89aZwqEg#h0yYt<)xpy3}_&tZg=F*nIIv zr6o@_wl>{;)rY$unz;C}r8m?+acK9ef4lG3(~tT4&u=(l;O6HC4_J2J=)vzl`qDv7 zmmHgHzH{0*|Ax&=OJ>yFx$d}a%QwB&cg>bhE3SS0q?J zT1Iy+zj^Pf-Q~yp{o{ArTK+U?MCDD(o~fPp!mi8z_}m?d>)t)Sb@8eB7Zxly>XtX( zyy5UOADywYcCP=of41J5uFowyYU|HO@AJl~AC)d?pLy}BIrw1b>IFwkJ@MwpcBePK zIrRPeV}C#WpMxq-UfNb(wYC3YAHVbE*F$D}dd&;T1O7Vu(#L=M>U)3Mc)|^*?%#OW z#`kYI@tc-S5BSBm;)xA!|KmS@@H6Y@E?oNj;O#>uzCHS@jZeQgJU#Zkwhs>Iw<0=X z?#HK`{LX(~zxUbH*9U&p6uo=X2TdQo+xF?}OK*Is;hWW+pI(2&u=YdJOFr7Y`q6dk z9~kh9XMT0FyZ4~4zJK%gc5%>Q2$lmX0F{6`Ks}%lkOeFOtOTqDYyoToYzOQB>;gEv zk5vw+08|3%0QG=IKo+nBuoAEqum!LUupO`iunWLJ&x4dJ06Z+Z4p0wh1Y`kA04o7& z0b2mu0NVjO0J{JVU!;`-Dgc#$IzT<35s(Ee0jvb91#AIq18fKE0PF(L;FJR@0F{6` zKs}%lkOeFOtOTqDYyoToYzOQB>;gEvCsGcm0Px$sIzT<35s(Ee0jvb91#AIq18fKE z0PF(L*p&k+0F{6`Ks}%lkOeFOtOTqDYyoToYzOQB>;kxbksnY2s07pj>H&>_EMN&> zC15RJ3t$^yJ75Q37r+ffen17F5>N-I2Q&h*fF*#HfVF@vfNg;7fE|Ec02=CYKn0)@ zus5It!3WL24c8Npk#v@Z7Z=ZoCjC0!hQxJ~#dq=zJ6!b^|3ey2T=GIWp6}cvr2Bk7 z&Hs|8G(Soszen_iJ~st*B7N*ci?{Uq({SUOWAsX+`D#AXe|EP-yJ?tYNZ+|ZX`Wv| z`ky~kT3*2eddhuDpO11GKY)FS>ja#LLi!gp^tfI$dA3bc8gFe${GTB=ues16rhgS5 zO!AUfvGH8BUP#9;FBt#uT}rQ>FRQ&_vR#q>mBQls`Hh8)au{g z+V9_(e3^eFbr}~={Ug2cQXw6GV3qVamcGK|oj6Y8hnYOPM=AZG@!Q0)g^R!9!2Gj} zKR;Y2J^3ca;*Cq|?{lrcd9*9z&$RZF7vn$=dw{9&-mCS`h1UKL!G|_J>ZA zzIeKj?ljmq(pOT~an+jq=U995*CZJKed|AdZB4rJ7N*AV3eq2|^wUP4PUiv_&&Xi< z&88pxAzsq6`KBPQ$6=#LuNx_(8)5q3*D3w1$yFbV6|5W&QIT+D=?AS^6;plzz|TzufwpU&OP#+iuo) z{$MfbeXV}-0R-sZtkZZN&cgVK*DEbA6#~80`j3a1GQMh=#`6qF(%-pE>7vzVYPHhx z(Ff3zjK8z;*Dlm}ejUX8l{S9ma|6&H+xX#cQ#1Y*OV3lHNjK0L!zCZl;5q#sAsv51 zn(_0^KD=h_)oJ=%V*PUw%H@@_{%bf(=}(cF`G=rgdGYgf(vMhu_&ZjlPe?Hq`fTm{ zjJ0pZ^mQl3Ew6SPU-L#Q&EwpeKSPHS*Fq4ar<;zzx?QEd4vE z7cU-p!T2>d3hCt4R-nJQUupgh9pjH&q%;o}C+%OPG!G0Weftunx0?KWqaAt8gj|f@ z3*o$Ycn0aGt-Kk~JJRQ!##p4c`kr#6(mZaO@lTojo2I3O7q}yreA0B z@i%`+ceiPLjq$(z2&H+R3gai-p!8M{q_4L2kxw;1_uZ)Ranq02Og~Dke*8|A7f;$@ z{({+qIo2NUKu>r*WBT*Z;YxpI_Uje23om&M8qeX@{`{F}^4qHsH(cKszn@zBF0=Uk zqZ%(C4FNsM^#2vJ|Bs%h@oOL_`Q2ysj_2!;9&7eQUV#R^#>(drO^h$Q9yeV4wQthf zZT$0;3)1hK{vKrQvDn(9!uY>x`FXHC(;s2|^Eld>^lr09^1?jmkM6|{*RQPqs=Jit zsV_`F&GhG4)Au(QXuQ1m4b(UJueJR56gB=wrY|*TDlIQg1D$R5iAUIz{~t^~o*P2C z!|GSC`YktoPMAKuY5Ka%(!X(&@|RBrfd0(t!`}@hzh5_Nyu2a}^g}EE7#k1oo~rS| z`k8rnnVA+ITt9P-7^Fc{J5FnS@?sY-O<&g^|H^=sN;s+@`Ox$T7Z)C}${Wo?6Dw

9t}7Ka2#MPfZ@e2n@3Ii-MssL`;WIL-P=8>uxk5zpWk-w zfrDlZ`ee|*9_i!OJ#^_szgczaLm!>i=i}FR{-FEjD<7X#x#Ws6mw2nPd_c#;Yd8GQ zSJz+sRo^$~U043+%x%k~6*peAAb-u<7wpRZ<3E?p+2`Qj?;4c+@5)0a)#M)kSGzJEGzVqyCyg+UbyPW!6<>CgZBZ}59) z#=POHJ2o8okk?eZW@p==Su6HCcI%h3{(D^cbuS-!>j$-$*WPx~05s0wfS&+%0LG$` z+5jbJ%*|8w=!KA#}5K_0~(;q?*l5J8)pFC2i${s;8VcSXlVNX zr=uh108)U}fX@IE(fCooXMjs!FWv?mhVlCe;B@HuTYyghwdkO;0V@E%1$+iL26}Y{ zU@GFND+_1B7lPT}f2j-?6`u6+~ zJvtqtrR^cQ>FN-D>5dS+Y-5N*3^yH3M)ezu=>_uq>c6RTE`f>}+P^wPnV4VuBE8F@ z5=e2_<}X(K4!URPj~YUBc~gi!+8Lq)R);9L@f-+hJy#-Nv3%&N1XlDCb z+?J(TA=G(c#*}4E^zKVJKPf z)FSrz4)B4*wH~asE!crz9mG-?S2~-|G}sj1?S_Np)WDG2w*=} z0#HcgyQg20!PC&24-U~Mjt$YD)`sZ4lR~unf)Je_3(@`aA$rd>A^QB<5be7;L?ME^ z!79y92GMk9-Sfo-5megH;i$Bs+DpuMC-M7L?MD}fOf({xl>Tf zQ5b(?P9891?-0Ej@>uB15h3~{6xKqYuL{wVU>_{>kEe!cy>>47=I4c>-;amry540SYg21dN0T^L@5R{uCeStB`#1<%q`q$U3M)rV%(pky>M(Ic-4(X)RP zqRiJ|2JK=PG;qH3cMHzm0fT1friKvxVN-}c4TEM0hQpv4N^bjs8yLC2W4s`EXxoD; zr)Ucj9j4rfeiI23?9^6a=yA%J=q0y?3CQ?!02OEeIu3QZY{gXrP8%MgNi}l}y-pQ~ z=n7RJqDv-+X{V`~W9T?P4E?Jr5JPin=7`>WXPDr(sz3~-JUq0vAD%1G=aA=|k7xAT zTQyVAjxh8(HBt;^z8|4=pmQ#MfTWmn$9Z>ERfH&0@Q|Q^c=Cq_(S&nvBA=nn+He95%+-8z7X`sfb}Jzk|`=oRQ13tf(`F|-R^W9Uy*cBb8qsog@ypqC7N zN=FS7+@_<3=vBoq!TmaF7&=);4bfF9J5kDhgsJ=&P|_iAQ)+k4oez~a^l&Jtp#z}u zhMoe=H1v9CrlI5}rx)RQwhp}PBm0b6sRNH_E7}#kC!sph>p4-M3-XeVF~blPk`<~ms{vobh)ADs-a|Q`L$u_ zDQGK8Kq-0F)INCr6xI^KjT1|*+^WtI(Ylku(D8FZ^t4QfmY|m`+nOswbj->S-G*MW z1T1bTx&|8M_|t_59)JGTM=_Ycd(7Y`l=JvCM?p%M7dWrT;Qpp!xTBl@_vq!4k?80( zA4c!ON`bJ6d%%_iUyFC@6Oz{?gHt2l- zc;q$=nq4tGM5n1KWN53JLZXY*6cSyC@n+eMQB%m!G7K^ceKsGWv(*$bLHC_u=);>s z6e7r%^pvL#Jp>jtQ@(L+Di6`MDi6_Ls60fUQF(|ytnv`ONaZ0KRe6XWPzd?1S9uuv zKPnH={_61&<;8Q6&=v0Wp_1>_)ckip*MUX!KRQf_j+`1Mmy($uTbqL+NRo1bggPX(a$lK*p@)a zji(~)i{~f|0R*QpYw|as4ZT#mk)a#ZC=y+NLYUx|DIt0zTEenTjfd!EYLA%h=qtm} z>riJ)J6i1#6I`ZhMU-zyX8+sGOF!UAeGA3B0T}G5F zcoZQucB!`Eb3gy(ls|z5#3y==wgAy*wFQWJ+5$w$f~WM+9^JaP