From f973f99a9f1c60b9d872d25744cf5888dd106744 Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Tue, 28 Jun 2022 16:20:41 -0600 Subject: [PATCH 01/17] Create Deploy_Morpholgy.yml --- .github/workflows/Deploy_Morpholgy.yml | 41 ++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/Deploy_Morpholgy.yml diff --git a/.github/workflows/Deploy_Morpholgy.yml b/.github/workflows/Deploy_Morpholgy.yml new file mode 100644 index 0000000..2735986 --- /dev/null +++ b/.github/workflows/Deploy_Morpholgy.yml @@ -0,0 +1,41 @@ +name: Create and publish a Docker image + +on: + release: + types: [published] + +env: + REGISTRY: ghcr.io + PROJECT_NAME: ${{ github.repository }} + IMAGE_NAME: MORPHOLOGY + +jobs: + build-and-push-image: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Log in to the Container registry + uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.PROJECT_NAME }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} From a60e08148c348798f50f6af388b027a4220b7bc5 Mon Sep 17 00:00:00 2001 From: Thibault Tabarin Date: Tue, 28 Jun 2022 18:29:21 -0400 Subject: [PATCH 02/17] update Dockerfile --- Scripts/Dockerfile => Dockerfile | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) rename Scripts/Dockerfile => Dockerfile (61%) diff --git a/Scripts/Dockerfile b/Dockerfile similarity index 61% rename from Scripts/Dockerfile rename to Dockerfile index 6c7dc71..700c63d 100644 --- a/Scripts/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ FROM ubuntu:20.04 # Label -LABEL org.opencontainers.image.title="fish cropping and trait morphology" +LABEL org.opencontainers.image.title="fish morphological trait extraction" LABEL org.opencontainers.image.authors=" T. Tabarin" -LABEL org.opencontainers.image.source="https://github.com/hdr-bgnn/BGNN_Snakemake" +LABEL org.opencontainers.image.source="https://github.com/hdr-bgnn/Morphology-analysis" # Install some basic utilities RUN apt-get update && apt-get install -y \ @@ -33,7 +33,7 @@ RUN chmod 777 /home/user # Set up the Conda environment ENV CONDA_AUTO_UPDATE_CONDA=false \ PATH=/home/user/miniconda/bin:$PATH -COPY morphology_env.yml /app/environment.yml +COPY Scripts/morphology_env.yml /app/environment.yml RUN curl -sLo ~/miniconda.sh https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-x86_64.sh \ && chmod +x ~/miniconda.sh \ && ~/miniconda.sh -b -p ~/miniconda \ @@ -46,14 +46,10 @@ WORKDIR /pipeline # Setup pipeline specific scripts ENV PATH="/pipeline/Morphology:${PATH}" -ENV PATH="/pipeline/Crop:${PATH}" -ENV PATH="/pipeline/Merge_files:${PATH}" -ADD Crop_image/Crop_image_main.py /pipeline/Crop/Crop_image_main.py -ADD Morphology/Traits_class.py /pipeline/Morphology/Traits_class.py -ADD Morphology/Morphology_main.py /pipeline/Morphology/Morphology_main.py -ADD Merge_files/Merge_files_main.py /pipeline/Merge_files/Merge_files_main.py + +ADD Scripts/Traits_class.py /pipeline/Morphology/Traits_class.py +ADD Scripts/Morphology_main.py /pipeline/Morphology/Morphology_main.py # Set the default command to a usage statement -CMD echo "Usage crop: Crop_image_main.py \n"\ -"Usage Morphology: Morphology_main.py \n"\ -"Usage Merge_file: Merge_files_main.py " +CMD echo "Usage Morphology: Morphology_main.py \n"\ + From 0c18bb25884b3ea3380d168ab5d89f0a6068b05d Mon Sep 17 00:00:00 2001 From: Thibault Tabarin Date: Tue, 28 Jun 2022 19:10:35 -0400 Subject: [PATCH 03/17] update Dockerfiel and Usage.txt --- Dockerfile | 2 +- Scripts/Usage.txt | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 700c63d..9ac8911 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,5 +51,5 @@ ADD Scripts/Traits_class.py /pipeline/Morphology/Traits_class.py ADD Scripts/Morphology_main.py /pipeline/Morphology/Morphology_main.py # Set the default command to a usage statement -CMD echo "Usage Morphology: Morphology_main.py \n"\ +CMD echo "Usage Morphology: Morphology_main.py \n"\ diff --git a/Scripts/Usage.txt b/Scripts/Usage.txt index 2307534..c4524e5 100644 --- a/Scripts/Usage.txt +++ b/Scripts/Usage.txt @@ -1,10 +1,11 @@ #!/usr/bin/bash -# Usage : python Morphology_main.py -# : segmented_ image in png : INHS_122505_segmented.png +# Usage : python Morphology_main.py +# : segmented_ image in png : INHS_122505_segmented.png +# : metadata file in jason format : INHS_122505.json # : ouput file name for measure {'A':x,'B':y...} # : ouput file name for landmark dictionary {'1':[x,y],'2':[x,y]....} # : presence dictionary {"dorsal_fin":{number:2 , percent:0.96 },'trunk':{}...} # : image with landmark -python Morphology_main.py INHS_122505_segmented.png measure.json landmark.json presence.json image_lm.png +python Morphology_main.py INHS_122505_segmented.png metadata.json measure.json landmark.json presence.json image_lm.png From cb92bdb6a04c94a136797937a26f8a0488b04fd1 Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Tue, 28 Jun 2022 17:53:16 -0600 Subject: [PATCH 04/17] Update README.md --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 532ffb9..3cb9bda 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ # Morphology-analysis Extract morphological characteristics from trait segmented fish + +The goals of the tool is to extract measurments and landmarks of fish from the segmented fish iamge porduce by [Maruf code](). +It provides a framework with various tools such as class and notebook to help further development. +Another goal is to release working version to in container for easy integration into workflow such as [BGNN_Snakemake] +This tool is a part of a bigger project, find the overview [here] + +## 1- Segmented image .png description + +The segmented image input looks like this. It is produced using Maruf segementation (semantic) code based on CNN (unet) deeplearning algorithm, more description on the repo. The output is 12 classes (12 trait : + + +## 2- Criteria for filtering + +## 3- Class description + +## 4- Notebook to play + +## 5-Container, usage and release From 434a8c26e813dff997192fed529403c423f773f4 Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:06:51 -0600 Subject: [PATCH 05/17] Update README.md --- README.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3cb9bda..3b3060f 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,36 @@ This tool is a part of a bigger project, find the overview [here] ## 1- Segmented image .png description -The segmented image input looks like this. It is produced using Maruf segementation (semantic) code based on CNN (unet) deeplearning algorithm, more description on the repo. The output is 12 classes (12 trait : +The segmented image input looks like this. It is produced using Maruf segementation (semantic) code based on CNN (unet) deeplearning algorithm, more description on the repo. The output is 11 classes (11 trait : 'dorsal_fin', 'adipos_fin', 'caudal_fin, 'anal_fin', 'pelvic_fin', 'pectoral_fin', 'head', 'eye', 'caudal_fin_ray, 'alt_fin_ray', 'trunk') that are color coded. +![segmented fish image](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/test_images/INHS_FISH_000742_segmented.png) -## 2- Criteria for filtering +Need the color legend. +When you export this image in python using pillow library (PIL.Image.open(file_name)), the corresponding color coding in RGB is +{'background': [0, 0, 0], +'dorsal_fin': [254, 0, 0], +'adipos_fin': [0, 254, 0], +'caudal_fin': [0, 0, 254], +'anal_fin': [254, 254, 0], +'pelvic_fin': [0, 254, 254], +'pectoral_fin': [254, 0, 254], +'head': [254, 254, 254], +'eye': [0, 254, 102], +'caudal_fin_ray': [254, 102, 102], +'alt_fin_ray': [254, 102, 204], +'trunk': [0, 124, 124]} + +The approach we take is the following : + + 1. We isolate each indivual traits + 2. We remove small blob and fill holes + 3. We identify landmarks (defined in section 2-) + 4. We use landmarks and morphological tools (centroid, area...) to assess the measurement (**external characters**) + + +## 2- Landmarks and measurement + ## 3- Class description ## 4- Notebook to play From 917967bd1c4dbbe0036e6af591a2b39fc0c37763 Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Wed, 29 Jun 2022 09:09:54 -0600 Subject: [PATCH 06/17] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 3b3060f..c5ac39d 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,10 @@ The approach we take is the following : ## 2- Landmarks and measurement + +We use the following landmarks and measurement labels and description. If you had more features in the class and codes to extract landmarks or measurement, please update the image description and table + + ## 3- Class description From ff035e76115c7a622604e9ca4a54558735789720 Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Wed, 29 Jun 2022 09:35:07 -0600 Subject: [PATCH 07/17] Update README.md --- README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c5ac39d..63c0ef4 100644 --- a/README.md +++ b/README.md @@ -38,9 +38,27 @@ The approach we take is the following : ## 2- Landmarks and measurement -We use the following landmarks and measurement labels and description. If you had more features in the class and codes to extract landmarks or measurement, please update the image description and table +We use the following landmarks and measurement labels and description. If you had more features in the class and codes to extract landmarks or measurement, please update the image description and table. +![Fish landmarks](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/test_images/INHS_FISH_000742_segmented.png) +type | landmarkNumber | terminology | position | anatomicalDefinition | codeDefinition +----------|------------------|----------------------------------------------|----------------------------------------------------------------|------------------------|---------------- +landmark | 1 | Tip of snout | anterior-most (left-most) part of head | | +landmark | 2 | Beginning of the scales at the dorsal side | dorsal (top) of head that meets the trunk | | +landmark | 3 | Anterior insertion of the dorsal fin | anterior-most (left-most) insertion point of dorsal fin | | +landmark | 4 | Posterior insertion of dorsal fin | posterior-most (right-most) insertion point of dorsal fin | | +landmark | 5 | Dorsal insertion of the caudal fin | anterior/dorsal (upper left) insertion point of caudal fin | | +landmark | 6 | End of vertebral column | midline of caudal fin | | +landmark | 7 | Ventral insertion of the caudal fin | anterior/ventral (lower left) insertion point of caudal fin | | +landmark | 8 | Posterior insertion of the anal fin | posterior-most (right-most) insertion point of anal fin | | +landmark | 9 | Anterior insertion of the anal fin | anterior-most (left-most) insertion point of anal fin | | +landmark | 10 | Anterior insertion of the pelvic fin | anterior-most (left-most) insertion point of pelvic fin | | +landmark | 11 | Superior insertions of the pectoral fin | anterior-most (left most) insertion point of pectoral fin | | +landmark | 12 | Most dorsal point of operculum | posterior-most (right-most) part of head | | +landmark | 13 | Most ventral point of operculum | dorsal (lower) part of head that meets the trunk | | +landmark | 14 | anterior-most (left-most) part of eye | anterior-most (left-most) part of eye | | +landmark | 15 | posterior-most (right-most) part of eye | posterior-most (right-most) part of eye | | ## 3- Class description From 6f2f6da045dd3f822525aa4116c6db59f5336156 Mon Sep 17 00:00:00 2001 From: Thibault Tabarin Date: Wed, 29 Jun 2022 11:51:19 -0400 Subject: [PATCH 08/17] add the landmarks and Measure description --- Traits_description/Minnows_Landmarks_v1.csv | 16 ++++++++++++++++ Traits_description/Minnows_Landmarks_v1.png | Bin 0 -> 239125 bytes Traits_description/Minnows_Measurments_v1.csv | 11 +++++++++++ Traits_description/Minnows_Measurments_v1.png | Bin 0 -> 103821 bytes 4 files changed, 27 insertions(+) create mode 100644 Traits_description/Minnows_Landmarks_v1.csv create mode 100644 Traits_description/Minnows_Landmarks_v1.png create mode 100644 Traits_description/Minnows_Measurments_v1.csv create mode 100644 Traits_description/Minnows_Measurments_v1.png diff --git a/Traits_description/Minnows_Landmarks_v1.csv b/Traits_description/Minnows_Landmarks_v1.csv new file mode 100644 index 0000000..25d7dc5 --- /dev/null +++ b/Traits_description/Minnows_Landmarks_v1.csv @@ -0,0 +1,16 @@ +type,landmarkNumber,terminology,position,anatomicalDefinition,codeDefinition +landmark,1,Tip of snout,anterior-most (left-most) part of head,, +landmark,2,Beginning of the scales at the dorsal side,dorsal (top) of head that meets the trunk,, +landmark,3,Anterior insertion of the dorsal fin,anterior-most (left-most) insertion point of dorsal fin,, +landmark,4,Posterior insertion of dorsal fin,posterior-most (right-most) insertion point of dorsal fin,, +landmark,5,Dorsal insertion of the caudal fin,anterior/dorsal (upper left) insertion point of caudal fin,, +landmark,6,End of vertebral column,midline of caudal fin,, +landmark,7,Ventral insertion of the caudal fin,anterior/ventral (lower left) insertion point of caudal fin ,, +landmark,8,Posterior insertion of the anal fin,posterior-most (right-most) insertion point of anal fin,, +landmark,9,Anterior insertion of the anal fin,anterior-most (left-most) insertion point of anal fin,, +landmark,10,Anterior insertion of the pelvic fin,anterior-most (left-most) insertion point of pelvic fin,, +landmark,11,Superior insertions of the pectoral fin,anterior-most (left most) insertion point of pectoral fin,, +landmark,12,Most dorsal point of operculum,posterior-most (right-most) part of head,, +landmark,13,Most ventral point of operculum,dorsal (lower) part of head that meets the trunk,, +landmark,14,anterior-most (left-most) part of eye,anterior-most (left-most) part of eye,, +landmark,15,posterior-most (right-most) part of eye,posterior-most (right-most) part of eye,, \ No newline at end of file diff --git a/Traits_description/Minnows_Landmarks_v1.png b/Traits_description/Minnows_Landmarks_v1.png new file mode 100644 index 0000000000000000000000000000000000000000..e0feeeb4dc40ac516748a13f652e46fc68f51597 GIT binary patch literal 239125 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

@K!ry;lJ%TN34DwDO;45O~46 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%0AQxC`H+>;71 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

(e$u~ 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

J!^&zN69E8s(2H;8Kh}|F@nTpi#Xh_E_EQ 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�nmG^SPY#(eL`XTg?z51X!Fd0s}EE)K|d0>wIu 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 R@sI%sJYD@<);T3K0RTmA$MXOH literal 0 HcmV?d00001 diff --git a/Traits_description/Minnows_Measurments_v1.csv b/Traits_description/Minnows_Measurments_v1.csv new file mode 100644 index 0000000..6190256 --- /dev/null +++ b/Traits_description/Minnows_Measurments_v1.csv @@ -0,0 +1,11 @@ +trait,abbreviation,type,anatomicalDefinition,codeDefinition +standard length, SL,distance,length from the tip of the snout to the posterior-most part of trunk that meets the caudal fin, +eye area, EA,area,area of the eye, +"head area, triangle", HAt,area,"area of head as outlined by three points: tip of snout (landmark #1), back of head (landmark #2), and ventral portion of head (landmark #13)", +"head area, pixels", HAp,area,area of head based on number of pixels, +eye area to head area, EHA,area,ratio of eye area to head area, +head-to-caudal length, HCL,distance,length along the dorsal side (top) from the back of the head (landmark #2) to the end of the peduncle (landmark #5), +eye diameter,ED,distance,length across the eye along the anterior-posterior (left-right) axis (landmarks #14 & #15), +head length,HL,distance,length from the anterior-most (left-most) part of the head (landmark #1) to the posterior-most (right-most) part of the head (landmark #12), +head depth,HD,distance,length from the dorsal-most (top) part of the head (landmark #2) to the ventral-most (bottom) part of the head (landmark #13), +snout length or preorbital depth,pOD,distance,length from the anterior-most (left-most) part of the eye (landmark #14) to the anterior-most (left-most)part of the head (landmark #1), \ No newline at end of file diff --git a/Traits_description/Minnows_Measurments_v1.png b/Traits_description/Minnows_Measurments_v1.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd40e0f80e3d8e5343a6038fc8fd6ac4875d91a GIT binary patch literal 103821 zcmdRWWmjBV(`^z$2n2$=1$TE35}Ve;%)hI*H&`DlKp(67V52WS6as#^ z;SL8uO!S7jnc3O4?rz|{m$xl9{zOAXL`2Y5|NY(E59;Q-#3YZs|9mKWQBhG8i>VA) z|6rqf6NY^WOzgshM+e0+$p4ZS~6w9cpm@ zeoQRP|J#p=MJ^(>EOsc1wN{Fskx;{R2A1=U{@*($M+9pG=Gj%(-!9 zo9bX*^d-bZjGg&#S#~z`^{~L7n;3}Z4^oYK>xXrx+gYj zJ#Cmckzp9M;--i@&{>IP&76# zYf?;bhshqN6za>f$nkHE|42Wj^1i(G3sgcXRw4t3%KdgvupD73;&n%O9&w%Vj}#Qr zCiFBs5htU~b7uJSE#NtSg$8So^NlzqRQo~|L5>;jIGprs>%>IcTg_PBHed7mEFJqr z5%3{nA$2xEKW(xAB-V=-{hf>JFy%bTWEd0$8SEY$pyF9q3o8%s0l}% zu-iEL_*U;iz|1{&a_lqX-8fG*>}G2e(TWY9N7v(q`x(P-_419Y-bm8Lk~^e-!Y8b; zwzj!A6Kyk}l*^ORcAhRFA!RReA`}6k;HEKh!jc$+Aye@BMH6FR^7K0b5(T{YTW;1q zwEar=3~BMWZ}07;a%m=)P7ZP;CMGVkUgUOvy50V|P*?u7va(XRCj!6RZd2m)MmmL^ zh@So<0RaJ(PG}9paeqp!!U%L`QLNL9v)JJ1+uZDN=6dmbwAg5PI9F|e?^?`c*qtFB zOE0x=m`p$i&Ew@N@3i@MZ1DUJEMyEvfD8qQ3TXG z_|KCC%JRh;Y^0>5LB^-2r@i}*J0pUBHVc#s89g7Ir4kum$5Sh#V3ymick9pBSP6;r zgXw7ACQjY&WJj*7t;IaxLBV`P8N6Fs4|Qy_2XLAGhm9yIrgM4BkpGo$JW*1le6o)nEd|$`ie6h{GG& zzYK9;+h;81lOm=C!F@mDmOlhM3P)QV#(%MBWNh)_zUelKBbT(vVoJznd+7b)B#)U^ z5iF?+tYk542Ub3Wy{{l9j(Xl?_$Qr+!c$5Pc%#yE_$SpA33BdcI1Zac`9e<*jApGh zy1Lq3N{#9L)nQP0xO6!I{#P26A|!P^7i{B@z>oOJ2F=XIeR|zt*zZ4nlqpZuPn^i4 zuaoCGL{j~YJ`U%y(({Rd$WwyLL%T%mcD*v|C)WOEL^O1`X;amcQ&)2tLmkppym)Z= zV*0ob^RSpOoMC(`Y3;2x5>+!|y_z+4w}^b#q}MA%!9yqd!PQrFV;g z#yeb;nl#T=hK3~c&UgD8@gHmaKVYtPAPPw7i25|zu8R`&-JWl&@-cKU<_i-`&d$06 z#gWBHhW2VOa9qEI*f$?dK=JeJQs|hy;#R^F8%B&w9}8gHXI8>puc)jpn@QH+!8rL&@2-DEAK`m-aYvP zSOZnmHK#_%A8u!|5R+W?Cv8RLnX{^}LJEU!3tD74i)qB4-}JgITF}8%)#|Ny_F@W> ziz)Zl#|(a|1T2!Ynl-eyT%c65qT+=bhh2qHzIvP0_LmJw4oe-O^eGU*0Pk>=B>h9T zi`z=*X9l8_T>^#_1fqJYy}h?$ENC?bSOGv1eWb1a_I}Js=3}qp!NP)khCB4ll*KE7 zzCShQ;bl4=NL+eRvn&<)Z7J>~i)_;m>mg4TbY7z8x-bF-?pk zq(eI!sM-(_S<_YoWLl2_&|=81W{zF_TOma{y2a2k=Qt5>Xy_ygue(%V7yzV1v)LKd zec z+c#@?hMfSbE?!&a39$j}!Z=QHG9|ux>!Z{$x89ck{`jY0%pw-(q*m$)I#1`pwswch zXK6Y`Cxwq@jG)j~lfxV4fIDM5FJoo-kr(|yj3EB}J4QN^SqBFPwEbN2>Wc?fey~W~ zRt+TIHBXZXJt%7%T!@ZIqasx#Y(Jq=qJByDF+YTcQNhBmSp!ezZ%y>t7u ziNV-~LOPi=7a_~VF8;oaan?IErcUL%-Dkdp)V$-hL?5uVOyY4YX8+@vVN&N3iht)q z#aSHhKw&*ed7nV*jsB1AVq>gxAQ=F7p0o73Xf`l5g}E+cM6(#jSbco=iJG2ZG&nas zpeL?uBAGEPS|iJ-HzsS25kv|ifu*J+Ny@QqyYSM8-1-S=)z;Ql9u|y`G;7gR_XC+w z$fV{adj=YTL->35N8D?b(DsUJmr#cBv9KtovQMkhxE&=t`D66w==Xez+^qt7`{XdD zI=bQbYuNKr`d?d+o!-%xefo}ZEz$Pu(D;n zGm{l6MlW^oy(c#dT1SOi1_!fHgvvbZbYy~m`5lJH2URfuHHAHKE#&Evw~LIi#{Xe4 zb48)y*(9m%9;=F_{2^6ey$!5lD=J4}=Y|HTU;YNLjxcuHIHQ`NVua)dP6PQ>-WmK2 zx&{>cXo_oj7s&*{ zk;Y>pJH4Vm1ELlgF{k^#fr0^08LY$4i`w?$XahvOMTI2f&h>_-dI|{!80!6k(A6c9 zc$D&3jXq6Ged7o^HS7!cN%~ShFmh^~PuH?$Aa*V$YwPPI0UA^Z`|E3KK4oQ$x6R|E ztT_Y2!?M*{p^3ugyY=u0ZH7`mE*1f95ZdmzN1P)zOq&qT_7(s>UkF&A8B^V;1J6=^ zcJ_6(-DW2z$fPyi=<1qL7p#s@Rw_btT5t2kD4>^9BT9o>0pw2>-_H_DBpeVl`zfyf zGLxHJNjS%0cdVdhAVV%ws9={MKX1Fvc3o-T99a=$)#83T0+f>t9ELkb!yOjI64_(i z$sne;_zA4VWRE{G-4{~AiYr;PLNGDEWDvjmIJR-YTMG5x$`HkNw}xl}!}Bzn{!lQ~ zymej+HGsC|Ux@s*Jc^`B{K(ioj^L6rEOCnskV~N6AjG0Wz5~#!R%fFhV*D+60!%6Y zW`DX=7OXDZ+0)a}z16x8V_XrxPnmgL{=&_s-B8PGY6G3ZHQw*e@kye4Grt2c=N&-D z)jsz1DU1>&)8{5O)8RC7>u1%%T)o9?hXmzFbSV{yQz=Vr2`)w<2BLMVfy~bDK_Z*i~WNA2a{8=HspHodS>DhB%Wp`Dl?k3&667 z>cb-xxmDvz??s6`bmfcoxo(EI!2s7S#53j6!}q25q1AwA=6sx_AClTRa_q~zq} z-<$x7xq5I=q%o{T`2svD@2Ldm1r^1>G^#T1e`OAri$xOjzM0DuhEe9>q_#S30E=5$0m4M5|tbw+2Aa z-csRX7CMqlkLSm0|Aq1U&!xii84FJK8F3mhGV0`@J!7Ky;LuP>orDO(IWG;FSq&6} z&2!Ya@_0gqRwpwMUHC7^b^2WORQB(fkt#k<1e{>F9trFL`WL_e@VvVz3Vt+>QL< zM6-^;TBLlyJl;NLz!O;wDfp*#UNX(E9cwAykpU#PX7)s;eaKQ#~K4xS*&p0i)i1C6evhVr_y9#quo-)1tv@u-Qny;5o z_s6y=7_te;-Q_3Ok>lcTQPS6v9PZnZsn`g&uMwIBbojS zihG@gW@a5}mEnhmbu?AxDOOD42a$vm?t1*yQ)ZTa=6=RpF(4STVw-k*x8G1| z5CtCOstG^@#$x%n43E-^b#c_n5^V7w4hvfb;TF$o0-j0GKzKwXRa_c@(ojk=NY7Y7n7x@dG-8gu&HGy86nz`;y z-ExlIxYo@6j5;6UkujVER>T1F6KcpDQ#GrenSyqnoiqG?3hP8RxQ#Od)TUx@LZ&CF zg0AuNHjJaiuad>LX|k-jiJk|ac3={y4|zTTe7Ga=1+>mrXkqD;*?!9Zf$9<{ouS7DccQd!NEc%+zRpx$sRxq7Q-@hBLp)PLL7(Xwz7@1$J*XCoO9ixE)+O!{w z(jQRB9T~3GJB?-yi9bC zpQ!n^%-_{;QQv1px^{=Hw%1qeZjF7H3EcYO%AEQQVamh?h{;|Cz3?FqV`!N%zx0eP7n$i|=FS3zZm{5)Sx&75RTAbu>H;ULV?g)2TgH^%C&`ufEjAzXPPL1Rud1`b6K!r1o* zTa~&4i(p`eo8~90dz9p}?*JrrxaS9lnwkTTA3<3_MS@OHamrzTO4_KyxR<2u^7K@mZwaqS!u+yF1yyNB z!a6iK82K38Sbq1L>$mt}I$^`S&7RRj)4w55jyF5fFxFJ@8*(eaknSPzIJ)RSOd|yS90L^5FHjLSxWr`rZ2c6l&NL5&XE^>_nJ6oD{l4)S)Dli2twD6ZQrLmrq>d zFo(f_#|e>*fZz{__QF{L1B1L^RIL)#jHK>dymp!`@qj9seAxFoTG&G|&szY$2(Df=_HC1mkCyX zlyVL@qp#>LZ=0+3uFM7hioN6CY4Ku(few^U;hoWSA3m^5Z{9 zRhv&zce!2=#M+G3$*EU_$7{rt6>HXJ0nIPfRBR*nzU1M>?zr->8Ibkojbj!x)7d@> z0XcIoX_9|m%1e-xF&qURcO!|chR{!(-CgiUCGHCdII4pi)y8k+ZXJPWI>^ePXKr4d zoY+i$HznKQ%P|b#SB;qgr0JE?)~ELK?cvzU3JFgDhc+H5rk=iG_C;X#EA*f40mY+& zN2R8w%+`i62OdMuyL_?nakBSlA}0&=N!wOzKny{fa*trcYj z$&pAz(h`rm3y@B3Iv2z+=}Or;``V{lVf>@nUf7jOQY-gZ>`d&TnBv4NY$ppf)^vJ)Kmj||KL-SrEfLc z0VFib*FkXT76oSa%_afPyJ3lV`Lc>+q3Zn%k?EuNyQ7jwbA^amsDY#&vm-YM-glCJ z)QBNHs`~=3*xat$eoPIPS6Q8~xb!v8EJy&{R^Ph?^Zd07Om$q7z)#jX#f%IoXX2g$&?>lApL)+2fe2*Lxx{ zzu0Wt)6RMI4UNX}oHfLq=GYbiJKIM@WeBZ*gnvX$`B5snTtPCbXy5e1ZgYWlW6h0# zbR$WrSdxJ&od&(CGrNj8=+h>b*JW)=#qtFK72&s+{eDs3drvNWoLjShb?MjCOMcq#j zoSAtIot|+HDQh0b|2X;xXkdmRd$*()`Ll(dkDQc7aN_z`-b+;fz|+mq~T(Dc&hko z#AZNEq%Szo^36Y_eUzAe%s<>uxm%{;)kbiT$Wz6p+zQ#nbGzfRsLijT_eW#OS-4qj zPag>4a}Z6Gy}$aPV*W4Uqg@b!w0@oDQI%7sRMz@A*8ej2e;_Y53agE>Sh2 zg&X`Mkbt|X1L-WawK~Z4|y`2d#+=4PUzcRuLY&p_YKadclwhm>WEMT zQP9`cMjJFS;hk&wz*B`0bk#IKq(5oVq6b+py^h(qTW62#nq=K>_h9Oshw}W+rDwIm ztCz@u4%Rpn&SC}_CDTzt2;N`{2jb=4WaW&Ss${fIKEyy@>AeJjKw;`t57x$R`ul>Q zRAuOdB^DeOnI0HrHcw#eX3w^>7Lkq0{7djY%h{#Ez`_PrGf% zUQ|qG8S{a2lU5BW0)@Wo&8l|xI|+w!l1@zr`jed6BgQsj8>O9^t|n z$Tv=#Cq(0mwujORV`y=B3f+gQMiMkUDtuP@1kC09t*G%t&pDSHofsC^O%MbZL*tKw zV`3>}*YZh+XgqI_$;848@;Ak?ff+}BbR*g}y$U?NcULTFjf&L`hZXsI%V~mWUjucc zaKE<+a3p@6-6U#j_#m5Qi)9Sdl!=ZxoXxUat+x?h(7PZzue5?mlMF^D;Sz`+e0Gok10X2OQ?TVp@7MM&?^=pVe1|BWJk91k@|}sISl9=bwmA?z z=lY`9dQnceVJD(U6QOds#GA{w<5Y4Ng;R?g3r5JphRLUUtzyLlLzUz)TJ1M_=0~m- z+B6ET9Q%OW2hfL~6bZdUFOMTrDv8;Ee)-RzKO4qp&gzf11}wNJTAMYRZ@5+SsU3k{ zz019wH4Qb~su>srHstPt7~-NKkGZ=);;cIDK{>Lztq~>tVAEUcKmRlXPImt*omiRmbv5{!N|~=l8geZ3%7ur;0(O^`si|U!bR*rAlTqsgl3LxEPucAx;dZp>EU1je&>_lMzgaMoSqML&eB{g7D1-N>4u9-9(kPB zOlZrHyDWigPkhiv(T zhYKsYXYJ(}56E6b>4T1&FStYyL%w`&ymJ1ftyyI~hZWur78yPxD=%_&DJqbEovu{+ zBRtxh6GI#R7g^pu^Ki5U!Pk!q=c}GK#J^GZAJ2dFit)Rgwgj>y*K=q2i{v%aX%!cX zyi;}2VU|+ydr|R~c7iu{AFr1&y?_e1wXb^{`7h|vFhvbz8~~eqiXd`GI_slAHfgfv1@%v>c#k*!hpUg#NXhsn`KVI%g6Tx z?9lE9J5ymCDj@<(O$>2gCF)_1qJ!5;j!Yj5eb z8%X`Gy2Ej)^I0)3TrZxqnq8GAa}kZh7#8Y%qtm}(fa3p%SiyhW=W%M8dCCk;$ea5+ zMF2+6XmZyExVRfOL(tpp{KO=hH;1*W%SBx6_lQ!|Cn6N9QTlH-dwaiP^=*)|pvlJ^ zfC)L@Z<1<=V_y8EOELW3tTCeiA*}(!cc0n_q(+`}I1&?sF~}p%h5gFY6qPcoGQke^{TE5Bc#F6p#-YES0+bzU6|YGPIB5hV|#`v1x7U}@&DE9C;kSBTL* z$^q{KlQLjHfHVd4DURPU42}4RiMz07f7cu$E!5Lwp~8fQrJsoyRlpEu^KjfM1MOI#=X7h68blQkOBTASPf5;zk?qTP zY^2Iek%&+UOJeql`l6BQm#TU7yR=9LdQmYkLtr`&bf0lMCYDFGm8EObx?bq%{Q&AI zTLolT@p;`cw{U&O3*R0R4g(U}4PSE1YRa0Ak0T;mSOd?60+h$On)V>_ zOR_!v-g&mNMgvlMU|22c$52;Mu?bi;A`zSTK{!dFni(?vkdU)Ka|{ZVQ=|HLoXufrTcb)dn^8~ zbW4luHp8~CujT-L@w~C2Aq(jB6S*A=@|Yh)P=p|)CKzYD)m~4xzY6H+o?<$ihI4v@ zu&`3huB(ov)2V8_)JJ{%IJKd`r=79<3l&c|KfSPQxGsENnRO{#@)hLQ8;YgK^l*e|L3# znFQ;69h&8JIm-aWlB)q)E>@|z)OT=aOzxBmew(}Y({<}}@bKnRvs(eXq4V7ZmFMlF zQ&X)oY!-8-jZzBLIB*}&MvwyO7wd*Eg#BJ{GSo_2`^)tj@8~GyTtWPwK5ALg04DSa zw)#4e-Wg8TgC&H;<-;Gh$4Wh>)zmA_vnZUntAQ!RfD#lZ4K0oAz`lUk7~&RsYjwYE zFKDky5m#3GMG$0jSm(x^E&sAn?)cE2IW(u>y-=Ma-tL`o>@%dd1x zE|-v*Cv_Ut{QnARCGteE$Q@o99A<#(C5{38Y#F}?GJbjXp?bTFg)Pe$XerzWH4QRk(-}~l){=Myrk3tx`{)<&An4q_( zOus|PN<;7IA?H@c!^1<_%1m$@dvQK?B!YksN7wU~3>adNS5)p&y^F_IXtdv!IZX!S zRHbT2V4xDG`Sa_zqd5e5TiAkobo)`uHKX!Jd(~3;|0sZohhYfty^@2iEpj-0z@!7WJ)G79JftzQO6DY@>SfRSVrS`O4e?p9j`i~`1vetL&xuYm zavGzWN2$R(9N9$D8n4wk$Nz2Sq7UH-)%H%9&>3g(bfG@Vg+zJwm`vUBE@O;RCPD&b zQ7bA5^wiZ2-#bRg5l+m)&t^2q-`-2YtP4poMcXO`veE?zSp5!{=UgLZF^r^;Mdr`YOM%2sHD0|9m;YNh?Vo<@?s_OF`J3X} zF6Y@3PpFtJFq=&~W0*=%u7sbGm75%1vg1+M>%o*yHD)A5Me4|{aUVMT^Rk4j^ZQB_ zCa~5sua6u5g{R$np-cRB#-#Tz{GVDW@6*P*FCxDjkooa6sv(EjMTHg8gccSSXjBSs z!*Mwp%(U zRV9a4Ltk!I-#JNpT75lQQ8^m2sW1WJ3pi1;(ffe8;)dZ`XK(>K-HVH_++%2HsDRz) zXfeOgHig})^Jf0>{yKC`q8kGk@=8k51=BVYguhm)G4>Oa{kd|l_-iz#^ZSm?q(?AS zK8s1}Odxu?$N!LYkb7okp2YO&fl{gQqmbLxTE0u7CDb69Dm^{H@x?*#s`TEfuamhx zXjkrl8r6pc;%iGbhB!^^Zc7qFHm&y6-O2*+mWsOlWoy8+T!+vW z``K9z%xg76fj|HTt(&-wtF;PrEN_!neK`d3{>96M`5ak+iHV@x`~tSlU?Ch-hY z*nj_;>{~f6AhXS|d`~YzVNB!#e^f}6Z^Zzzq6gOb*M337&8_jLr^;*`s2dr;_|d?f zHjU+i*ol*Q%D=ml&BHqHA6ieiA9Sosr8vZiaC!j-W%aFOJGKFCqPuJ{>yo*|Mz z_%W#xi7dGIOs5k~37<>jpkq!tz3_iU@74Ila5^T#w3~JDf^B_12TpPk8v)#TRLYv~D$K1q`O= zHzw;n9D}fkR$Kd&I~EvNY+@ah;Q4=mydjIuhNtf@9>`}Td~qK24Slq!Ef1*nKE@0v zXMHJZ?-3Bt&zMYy@RU<9qFAbcQP$`2T*Bo_gLZf4pr)KjC#4@5JbN$aJhO0MsK-o&Rmy+pt)e+IHy6Ud zM9tC)Of75`E>f749Z>+M=v!ENd9#&IN`L?@?RMD?Gl**d@}0ZU-K4~$#tbQB`l8%^ zO)j`@Q453C>CE8Nw0{(qnEKtOy2dBm`}k7;6UW~O!@;3ks{>Md?fyW$k7MKf?HvjorCW8)9)-*2ZQM%j(|75i%kjJ6T5h zsSK7ks6gXEh!x48Z29g6(H1PCpX$(719g2qtO_qTecj*k``n0U^rLWH zA?T>r>XHfc%GK&P+zgcE(H!4&Ub-HsQGnGEFm)?Y8O$aLJU=M9lLOx?3kJ1#6FRSI z_oq)cS3ACPee+H{qsTUpygsTTgp5&&cKz)J2JtoopOtc(zaP$JwJ!n|oz5n$J0Z!i zL?)n76f}*92ITRj;?2wefjqzN{n#FJA==8px4$CpVH8F5QOUeB;Yv51V#1(zU@u;}>Od9h}fXPmU5 zjMm?Npx8LGs3T#c`cwdt!U;6R8xZS<RgBz%0CB_l$?p*YOg=R&aUBIz;1bEoFLfX%CL)1jfL8S9yfF9%}&`XowLcmE6y=%5^_GLO0drXmFR zTt)!{iEWwJ{b8*EJ-tWtV!gfT*>nD3q}S1UGnpipWzj?Pv&Q56ruW9K`F{LAMU2)XOGg@SzP>?GRT4EhsMUv3ADUQ2Dk zq8PA;Oqy7Wf6dOy8fkWO3L_NI2_u4VnQjWnoy{mDhpJHNfIG(&Bo)y|_vQ6zjZ+{u z_p8E1kH!p3Ke?p`c!l^{|h3C#28B}*fJWjcXGlz#8 z+f;5xIGB%k;zX65quFAyG_A;IyxOR>UfxK5pUkcpffp_YZeSmuYeuev;%KX~J#C31 zdSidUs)2(%)4TYFJ!&#W9-;e&RuLkp)2q+e6mIfFNulCQTYq42#@$=0lcejCAKIGa*=NM453)m&k zwjb|rb{f;Zvbxgt!T++fxa<6W*)44#Fjf%!&k&c5!H#1+lK<|#*W+cv%~;kca$M$Q zf_mSOLc#~`Xaaus#HI&88OQ8@x}HA{!e)_iWCn^AQ&u3nFxsFuZu*ag=KBoUP!l!H zY`m5NwD4G9*E3bTFTq7>J9sDkY!7rAgtwbwFixguRn@C5R+Y3#+#9U7iy$Icl@Hh<}@^DPG{XPLS@a7cX^ZoXF+rde6JcO5ijE z>N>?n?9S8UeXo_k(@nP870}8%Jl>$jVWAar6JZ4~A=q7R1S~dY4&EOdXf)5M=~NPX zQelQDl7&jXT@wP75To<@Z`W@zg|>O?NXSx;C+r__&n)q%n%#0H!<+@(p{cR1E<+?3MaU#S;>D+~ zxNwavM4&10B|FZF*{jw0hk(vQczXJA59V-7>YLjYTSV&(ey#2U8R?C`_x5DZn1b8sTGxh~p|PgP2{7ZqYqWV?$zd&0sa`419NsR= zOv8UKbs)CLilXq31~@LHt3z7Fy5a?BZ@tRGSB%;)efMxatZaqt&s?b_ z>mP9r9El0BWL*5f?{X&MxNQ2~#gd9lIL?YR%d536uz2|UO6;$FQrk3dWZCZK4X925 z>;OSo6a~hIUaV1>=OLGd_k?`f;m>@}*a&*3l9Gompqt%GnN-e9^L|=!%jY^b zRjJ!?gDbqz4w_;rFMh4({Fz86en15Huc+XN8v&%<#)eU&+MKLlQeM^2u(I;*PuJ`B zkG;Rl+`AH$3z6eR$=Cw)rF?m>*nM(gV&2C;JplN=&GMIf#>w({a zv;3j#9X^82{VMGle-P-@lBc}11K*$rbgD(La$XJ@CCNx z1R-v8dvHaTZrVFH06P-Z)63W?<^WCur1E=kPr9{Ch+A1w!S0lAQq<&~;nhizc?u(52ENAsW z5x<@7DMVI*QcxRgsn<0;Bk!!jcm+5GBJy;B$J65x-wa zo=7wd9EgqLLL+A7PRE!2*>%UxG2tp3YmB7kg_LC&+5o3#);uL&8r!;DHz5>_WmB%W8WaN2Mqt8t>_!O%Df5N>LzxE{(w%3>4<7KR-!4-K?ldP zPrb#%-$v>`#&%9&f&iD&aWu}$ZXIE&+uU@|a*+LH$$`PeqgkTGb+I!ljK<}9vf{n> zbmT}h+H|)@{#{@>(ky1=V~mJWQkn;Te*ClS?2^80x50QNgGj9jWJUvpi^Y9w09!dl zRf{OUSrXpO*E5agbQ@+t1JU`obqol#MjMsJwvHcY36nPQe^~DgAF>T?ig4%E?7xaqxIOJ#3V8#-%~v9PgO#HxqP2 zypOt#OfTyJFYlRsj>@HV!UaU#>rP4pn^O=gpqE!fHAk>KXiwmkHg{FWgKPDPN0+!3 zFd5h%{i1x9rwknL%bJdkKBS zg)m@f`$2Mu>Z$aZ!xn@x+d83;I7!6ilujDl66t-dg76}Q>|o{e^*FSC>B*_!W81;1 zsjU?g7k|GskmPIJ4-Ov4@{H+F;(fm6`p7Tf-6kvg3rQXlWuj!h`#gbv+wrT=_O{EB zX}Z`>llJwcdCu^9yZ?s*_F~)pW4FWxM_dU6!u-7e-ow~<1A#f|w2}tdk$;IG-Uaj) zAj3&ijHgyAJ%ElhgzU|YS$PU0wN4`#l`bQkX@k$Ed|~7b+ewcC1{gK`s406WvV@jB zzb?1ngD3NS=#(YbzXH=+F&~T1q}A<*JH$8aWuJuXavAKS*)r%mN>B(GGRuoIN4O>e z=(l;ESApg$(tl)gp0pgf;mv#|jr%+9*7=yuMbF#PR5OTeZnwc_xJvFPC$ctO+Fq{= z?`zHf;&VW~_)Y#=-?$OQCE!Eyat&~{Q>{$TTikl22)&fWdJ1c(wa&*yHi0C+F4hGC z4sv6D!}HTCQtX*u#VVAH)Ab_nhW9IPMTNA59Qq#A_HcGv6?TE;;RZTk=;MyKRo^`n z-#_YBzOb&&MGHW}u{=FJodGXgxy`B&fVTo`37pApQ%bYy9vdM}eieIZ{D|qiZ8yd9 zNG2KcKnFATqkFNN6kfFYXR}Z;(%isk+tg>Zz1dIDL!>^E89|9(rQ+4 zYy)Us*i;*d8@F|$JluOIpTuFvLuX7eW*U0L<>`Iebj$MzKWXqjU0%U6vw0p(wLNao zt(|gu_PZgWPgz^}+MA-WOA&CM-aG#tmEPgH_CY9yJPrEnu~TY%`P_XKS%A58(0 zm<#x(!4=i9=|gRom>ev|mWQhyfnD2z9k+2-8XG@1-gK~AiquDED`?&KFg%MN^tdTe z&Hiro{>OsP?zr=z1Q5UyIc6F?`@T((|NoBPFbv-XS|K9kS;ukSxVPHrTDeu z!~1>KuAETYWKd-hap#|oLs>Z1SW$I-s#r60U|-kkk&L__Tv-Vqq@uB@nVy?yMde)- zWB;)9B4ga)9dAO-?mQ~RsPmPUNN0E9-31GLwlv_{%djq8`g&?D7G|kM*l(fq+X*rv7dF_R%b&O95Y~F2C$~+o{=pz|#p97j6+oj@K76}~S_6m@q|D+~ zQrd5+*<_k%6RS=J#?XihpS{jOR&PxBwf*K9o~mwmtIrOIlypUBbCvUO&i;g_$XQS9 zY*;+xAtnSr?l8GU?A?|Ai#P&1Lcrlp{x~{K6{Yg*w!OPWiLWJ$#^0|1yBOMeA2s4h z*ymCb0Rb!D3T;^F^UA|N$P@V7@bP8^gisU+z|QgY^b5gahTk+?m#h9J;BYuXz_OI@ zPuL%5s5^_4N~??qoEx$w0Z#Kvmh$9g@HAOj=^3xwj~xWLXnBx5WL8Fc(@!^!)L;10 zbBy9P@P=ldFCl8LDl#;}#u}ApXrQ?+FLskD`>1$&mi|33=m1Zz`!h~H+qUA)${{so zgx!2XT&nbIL8pH?9-pU_<#bqOrSiW?l0#N4(jKdSb9>95dUqK21p+pC%$Sb-P;LTE z+2*jer|h6r_Z|}P5p()_RT3QXxWi}qb8qgy(6my22m0Tj$Vg07TSZY73=Qh{Wa&oC z02EamZtZy5Jw4oROlQKERV*T17&l%vrX`kH@$`jZ_h4%V^a_pKO2iLHl7AH36tvx$ zD?zxcGLJAr*fUU!kGX*Wv&gQuE9P;jZIfbjIk`V7s(}+mLZ}=R8#PQNnr7YQ-ihav z^dczJM4Pn)G~Lq8M7g^nuvL~V3^tQMH2elvoZz& zoe5t5IJ2wImGFIsZ~~M*O|7rNd}3b6^K6d~wDHc={z|hyF}lU+!i%*}9H=55zISFR zND6!!*-tXyOeZ5M*FGP&R>J3z(VB)~(4f7_K5n`#uxNRqyI~x_Kd6ul&3N?MFRo=Y z8NixMd@VdX`}}z9MLs;VXMc4tyD?2{t5VY%!gKx9b`p+@%*?3bxW)*d?ICU>40PR$0QP(xZ|hhuK5k*!p&|j~xq0(Kg_QV0_N-E#A8y zcMu=8iY08o&v*_0IbkOG%s{t^RdPa(q>&Z3a2*?aLScO;f&tr1HT|mPV7aE$g=> zEi|L7dXr74@i72f@;=2sB$u9(*==?sDD82)LOu;Hhz-# zVLx?Wi5%p~l%}Sg93P7V<(7os13s0Lo}Z%uLx$cb>Zn=p?Gm^T=ja!m%eE>(2$`@? zMD%32)aoB9>~`m0?DDk~qWD-lTFfiY5i~aVUIn( zpL-T@)RjLhAkA2B*QDp8$EF0+?psC|bRZ?roO5^rfN8cG^b3cSfCQ}{qnWN_s!|Bo;XL*{w4>5Sk@d7+I6{+^Ia|E>J4kpH zTW?jlsZ(};n=UKF>5!0+@bL0d@bC};g&)3txb=3)$JbCdjop4$@TrXDD}5E@FUD#~ zzrGyD*PecdUc(yRdiyl7J96#23VOUkmi)UUe|E=%0uG~BjA!JZXj?puO{y=G#tK-3 z%Js3mm;#pHHVjku1ut1mKc{HoP%5K%Cw)yXV^76xxe`}~tuZ;dAxUSZ^_`KA z&+8&&nR(Q91dY-%t7dN1G+v!Umls=))kSJPYr-TOR_gYSyV&SqoXN$h92CUV>pQl#O1JMfJSclO+ zm$+hc>BX5q=mH`FZui$$h{JmAOZ=#!UqG!W`y<=O?ezNMC^;oX^rIHIEPqxg|%F0d zNo1zGO5_s#EJz94cjfTN3$iUJU}VqQ8}9uCbaz2N_nv~YqA(-m34){AH^%bAuS$b3 zNK6J(I8%N+ClmG{bu`52ZpKApyB=a=JWxX|1fh96rL zjjMZ}LGWP}V5OlI3OWCcu<`cK`=0A|BmUewsz$!oW5eg}@?^`TNOAQj$zOPHQED$* zBXeqwy6|PgvDgGc`~Fc#x&bN}{}#{+19e#_YuUYsr?R?gc;O4Ckl3^~-##Q6Jd?bG z*t)<*QKs3kjvcQ%qwi~9v1dw~HpNYd{to&DQ3lXrN=mbfJ*Vk?mq;e4k|U@2S?x>6 z`uLM}@imrbvfODZ1&a3dumVioj3*U`O(g_Wv|CGFz>uSNbeIj0n$#TIPI~DweuEpX z=!#xW>?}PT#w2kG-@(LWVcu9OX(U|OKposQyh+XZdmTbR$8!-Y^U^}hGSigYU^swlbHIi-JS6DyF0I+>LED_%r z&tX4<7mP_Jt5TVid)n-`&5WTuw9U$igntpdCAu&BI z=yjUQQ^3G4Cy`vUALzCsJ(_BSpm<+axaG+|=|cSMgT%$NubH;soh){#o3 zqIazVqZKo)?fxhPx9(X-pf<+zeScy~TP)i1`}|t+)4_(|3iQHiNME{`0_9X>t8 zTE>tq{@=w6Jz2(ORs1vE2HR?&U%cC7?JpQ-+=DapN^JF=-KhmjUZlSG(>YPRe&&=u z6UwAfP!{^n45TU?`0&J;adB|qfnVMURFI!==@fH`NJPHNnyMvEYo`P=1K*uXQa%@Y zkJ&O=x}d5X*UZXxTtXJScu`fy7ppQ|z~M?G2wn31Q1W|*HgaD7vW}wlMH>~9s%Kc4 zOfGnQ`I9pEr5JkghW`)))`>{@-Ad{giTPZt!pOXndy~g3l^spgk6ZYEWY+xO^5fuk zaF^#|NJhZd_(dUno7tNnp>)FVolPMP5ZA`dz1y_g`79Ov`h73-U`|!|R@_@~{N7F@ zb^;FT9^m8Qd6s-HWK7BqMpD19CFw2wINU!hlau;W3XPQK{VNZWja;?bHWuIcreNz) zLeYy#@>et8Lhp~F2 A-}8Y#&Q1v{u=rU+cl4KqM?sI$XG2tiiU3Ov^-P{tvS9t{H0P%G|fBm)SG-5ya*j&(U z)-8ct?1k=b*ud)ua|T|sXOt#V9mRiWR~Vg%xcurSMmwzt@7gktu8A8{F*2*2H1xkl z{xi6DLBE$t&pD_Aj|_lR;Gc!V;_Amg9PeWj_|_Atx+zF)-?ablevF8nY4yeWUXro) z`}-;ywkYTlkH^#qF2vmYB{)fi`#>U1U z&gR`!2c+Q9scDIA&&}NS79znrE}WbqzN9N}@OjZh)q)iYysy})Btr{@66jt4$F>Fr znPoe#0m<|t;dY8+cDt|}^S8M~JNwTYuQNm}39}j{^O65;|B{lD=t1~>qo1(QZt--@ zv$R3s4gaj0y_es5>jA0k!z`yf8I!5YGV;7|?zxL4LTM+)@<$i<4A zDuH=oEZprPKjTIH!oNSf7%E372#gv=CX&qV>!GLSFlh)sC^A*OB4AmD1uHid0Wrc~ z7IO4~>SU*IOvPv1O5EuoLy$3hAjPvC{ueCxm>rCt@~=l2HOf9`RsYOsd`E)zFABL0 z%qQv>LDou~#zpBCeF4>8@;N_1KAr*X^v~nYPgi$?y0+kY&9cAMx2+)=duaJHO=j2M zUZxOE%zLauU3uC6h7kd-JA4y4z54eQ5+WLmq_&uv=O^bVAVoU-GWxA^Mt(o_C zeGz2+^RX|$2*hfJd@t{-5xE<-hQw}RKv=IG+1oWCY(5f)iIZ8ae|uS@p>#oz7DI9A z)XpT60|n;M73{@&BV89uq>f}thnKdvi1wA@ex*QdtOwrJeQp_Xv-47M)xK+;jf2W{ zscaw;RJYC4Y*as^Lg9ajUP!=Z)JeFD%AEg6i#5~;E-tS9qa(47AdE`mj;E>o?wDW@ z0ewl2c!GVwPihxw@1`;^Ami@XyZx{Qn*C^ z`+laeb=^9@kn~oHe(2=>J{#s$>)whgHoqS(zxUic@CqZVy&}V&^f+Dj} zp~V?c>PHj}Ua>a0Zo#xHp2b->p{EdPUg+hS-1VxO7*4*socrdwD}0ZJCPNS|j#SC; zooCOUed`Rxbv#^=Ibcep;DwvJn3&gr=@ifo%P*9V=Psn`-E6U>dQ@)`e_8VEf!a3ykS~Onb>FkKTwFL(xE-Qs zrHk92qOJcOrycZ$pjqe$#nHkT#nge9ZY=ijA zg1K_ynY&A&%NtI58RZOO3WQSp`kg!T4N)4gbf0Mlra37gK5ZVjf-s0wGT=ESykk$Kqr6WdA&McvmWYQx zR9uAJMJ7o(5JML0+c|1eZl?DvSP*(@CrKc8DC0#IE9@Akp$*4yFw*il%}FOB-!NakB{KhQokaaSPvubOA2{Dj~g~ps_p( zC*_h&Gc!PMz!Fn#R((YJxh>%5m;Cb)0#I^Rgo4KAaG32Ja0xY{eZXivXP zlXC0Y=5(%bo7d56{J@|ZPbXWz&gM{>JyQ=cOa(g^gcXw~M0CMZb zBMS$IXy7iFt=Hg`M2mu>&h9l4D$XwDeGW=$&s5Ou0#N#3eX*zhe2Gy}SU7soplV|p zli90Q!z9h9t6Ir%>EgwR+vNrC+{GE|hNDuzZ$?A@>XAiDzy-=8#{_MvKSq;#&YzIj z0*)XiDo_Ny5N&k#cRpws#&1ochB7vous^wL8eY{$PqWY5^mIV~chXw{3aKTZVzFS% zAMtcpfW;!wPPuv$GnqN_<_a(wSz8l#3EjN|Z=$1?ejhE{7^Hstse0FOnl@Xx^VR-W zodY?U(1-Irul)i4Aly+)5rivv-I1T$?xITLhDUD`d?XyCU^-(GWX`e>{d%i8X8mSH z%`#@%dLf@B9zfP9xZFR<>itsqJsG_HTTklh;EasUbjv%-J%MjI1&yx-WTZtyj~Cj9 zALkBJJok(@$d%q}p^lMU*GIB`ls$_59Q>itGqz=hjEV#ddtpHyUf=S%C%e9>mf`B9 zPFDEooqmS0on~MChW~8ddAC7o|DZoH2_N`(ejI?IM5R8s`|q?1F2{XC4tIN3eX=iu=z5HUcgql#^*)mgf^29%9 zeff0(TC7(Bd`)Tp(kg4elcfsT3a7|hXI`DseRsCGs9Aq|Nif+w_sLpi&$K4wJ8elS z?+yG4xfj}ew(6tz(ff(YU7j6ZP}OfPkv6=dtH^I@!O_o;FP@Gky$UyuCUZ#u_)~rJzEi{fk*MfRpacZ7%xB9Tt1C#c#26%{|*4b-Ccm~ z8&04sqgb$j-a@P6t3Ll_j(Uv`Vfiy@(v5R8r5)wZ#?hJ;w|lx)4s1bbJ~W>5zw;PC zi^VOER{MiNeHDt@3Mz%skHa?fd~(Q@e0*|fRJuON%EtM0cS2o>Q&W{otDY1&c&_S5 zoD@LJs}zk(#7p)j=kM}yvGa!uhdy|!a!Pp>mX$TRYnw{F;~tr0xqfgT>3um7x=$p4 zmpotGk@XEzx{KUeB3#BZY(7ZsoI2MI_Z6Ip#c=N>=hWT#cW6Hmz`17;wshTk;A7`p zRP3QQCx*smBov^RluTU$_1Zu0DnX}6NMQ)SEajb*gMh~=`p)0Mo;AaFxO@5SxeO^= zUxDU73IcFWIw3*HTDxgw;8>KcHAF8jJ2+XUsQV;l6}iAz^@v< zrOVx{TD9?rMCsp2^u6jI2-A55{W>v}p*Q@|)ZB2`N9~Lx^r-Hg@o?WnDrijQ<9_46 zCh)MG5Npgf>~%U(X3~=%6&3wznPYuhqUuAW zVjx~Uy=S^JS-Nz?k|~GG>zkaqNIId&7#gG~L#F^(61@5q-jqh;4A;RU}gBlaHG-uE#pH zqy`#_YC*t2HHGAOMN0il}THgUez;gQA#=0Yx-xRB9yu-y0L0Y(ZaXifTWURR%=#> zHy1{oo*urUH*cxLe7nm(p3d=vsm>02FMoP`1H8uzz8+|?p8jW=7ZktcYkl{N*h8`F+1rI9c+d*l$w7xaQPz8hB zIOS~_}B6eE{ov@PC48q`sX@9E00yA*BCfQ?z&lsWv}B9$xkfe3-#i4ycq^-WFT zyw8A4T&zA4C>18YD2lqeXq0@x@5d3wgWnuXh-mY4WXlxmNT0;%_^)`J^ecQg-E$t? zlCiNOt6KdM(YP3*=ez%49>y#NSKjIE19VblEgRKGMNS{_p|zngsi-#H4?O|=bN___ zsReVlUX4&`qag)wj#-~9B>{tDI_T$k9lHr|DqL+)mrgU*1aKCrXNGVJj zf3OJ>;`c$%rqS|Q3?;{S$-haF;rcc^#(xmDw-^}JTO63;1xX>L6uPy&9RUn?vq0ib z;&vcg52$v)Gm+ujqu9EbI+>M<-$2%#!_r#AO^a=yXwbFr;~f16Q^ohF7NK zgw%L2oo@PJHtCHnj=!iVC?m&!?<9vX1?r)` z5>okZW#;J$mF5h$HR z@bX3*%lT_PnXZmjs3X5j$yLZXPY~eBT1UZ{%tSGU^`Oruo40S%C&vkps%oy^x1O8J zdVdH0_tej{ZTe5i1L~SGvRcvqYmZ_-tbaSZN`x5ahg7C`R{`S4n%~eWq@jH zdpR*&shcg1!mLvx9Wga-O3|WRjv;3~L=CKWIYeSjPj0N!G*8@60<-f$QdEGs+Q_tS z@WwAU9RFP{);!-DrHRmKAxK=5@71lpbw2P}NE4Lu^7aD8no$szLintpfIx+LKfzb3 zYNVGjo9oP_O~e_!i_{6i&3vC?V@UDV2{|#cv?wk#`^-4>-DZE+2Is?} z$rzZ8CKXAuW>X5XBnk>;6>6vWp-zJy)n!#WldpqqdYtncTl$4AZQ;FTZiGsv=`e63 zjcA|+9ZoORSY)|9-3x!Ga`^Ag6mr6VoSCrp?!g?LaJvZFK}inA`JoV^m-B1q$$83wi9Isnul=WS1Bd3iaJvqCbv#FzsHpO1`POLKFD z^%yO7SB-`d14AWk-KM<>Wgahrfu;(k3;||4Ky^8O`~v?l@rc{OWR&o$iYkFle|8~x zi8j-MQXSS`>oR-bYR<=H3z8)BU=~EZ2ye37(4l%5T%`yYF*c#vtIajdHWNFu0&PAS z@d>&tP78f6L#l#KScW_t5vsqqExI3H!2@@5T9MZ-i)ZN)#~2(_HlTukEVzpNnX$(D zgN}0u7zs<#`HLxM_i&gMyq6_lWn%AM7d!BJ|6>k0PE2y}mBD`pGy+gsSCTDoS4p}3 z^{NuUsf_pa4QxT?T_ugx$I_6}Qd4`mLQel5I-=^S8?MuhL1ozW40}y4bnCJvJMSoK zP^&e{3HI{W=CC-u|93J`-8}ghDyxG8S#WzR(FPqBnZ705G{lO;INHZsv-pO$2|6}} zsfGbqEIw9=6+O6|{(L8s=!09j`$O4UaM(K%vW;lx@*!ITL#PM?b>G$%ARchuNUj}> zECO7}s+nUdSlg7kY@vSrN;aK~x@@CUBMRzM)=P&RyRIxa50q{UE`g z4+}iF?6Mwce}yETj4BSS={Zb9IVd7!bT^`LV7S9YEa zkm<=1;7Zcm0~}dxE;o>o_@+Y(3JSEYOs_;lr@LYP`UezH9|bh`UD1Zj=f!k99k1m- zG6?6g&dCl1s+~XLdBPh???aBM-6QJM2Z??{%K7+%AW#qA7Yac2NnpxSWK*(R_k=GU zI772p4ZphA|KY{RZhF*m_~fXIgEZO_DJUw3I^rc`^_IDz;qIL6(PW9(s^fBLlt+Hq z>xQ0hPtg8*!*YcHuEP%ZyBjt7Kyq3e3c*%gEXk8L-b9pK3 zMv5Wi;9sdi5el36oxfahG@G{MLtRInrf=huYRzrg{lRecv{&U#yuATLVM)_~M7>e< zY>d@eR`_NnZ?`VuxLYkD+$Ti2HmfG_mk{}-N#5$$rK9kLcGY}kA)fI~l%KEBaSi*h zHhQ36S3oDSFD#wB5V(@0KvwcKTUq9z9K;lFo#^=Vlwg@crwlspz~mx7rj>$}%t$rn z(ws}6OPoJ;DA0C&7*5n*cxCDzraN-}nk50x2>5MW;aSPs$UPX)pr@D22uzPoRvTWs z+8Hq|;J5dTSe^$cJnh2J@4)c?B16K4VU-8aOHC9XmL?Y6?lV^sqydAh@(}i-It(l< zLf*pz-nSb_d~Vl7#16JmY;4jyMO4LsnMD`t1JKCSpG_6tKDL38F~#->^~aW;;6peeslxvbuJ2wvufKFcb zAgR)vm^hF>n%uNA1yR7|ue&KL=X&P|C<*RYp9@i{d=e}>9Pimv`;H{SyxGY+8y)^WwbwQu zOQ8HzHi}g;J6+*~gL{Fk)Z;gyi8_~#?d3vsc6uAPr6b)*kPzhV@fA05J5M7z&RPb+YFL7mi<7n=e zg|N|vD=GJA(4UL7=LQT2A`*0D&)}~TITPL{!pGxW7;j|N)J3BCUdxU!*_uMBMC8t| z-yh-;5BZP_RYtge7B*m67%HHV`|n%f%c`~*WR#5`^DDdkjVJ9UYu2M@{kbp_@{Q0LzubD1-M6IL^-TYUZ)}bm@@~;m0{?NW1v|DY`oN?%r6?Inb zaGQb6Dd5>sRDRe9T!(WuluE{ff`h+aL3}eadk}L`e*?56T{ez#LdqZ+i){~ReJZsF z*pxGx?=Q?QI(no)Vora#gO@R3f;E(;5k5ambXNqZ>kMQFO2Nf>e_hnL&_p`JSoDiF zl<527glpu1_A1zgP!~s0$3erp38E!i3UPH{hQnakRogjNO!(m_s6hpL4on=axjmWR z!W)OI#09*fLUn61oqh!nsYZu>Gbax}I*W!*n_CIs0l6ZO7l7ZeH6u z>qFo$sPOm(G1KIm@ifrE9)iNQlaK-d zk+EsBC{!Rw7iIiN5U1;Y4^6dun*5hIc6WD8QjexBGpsLh(OzzGwC;kTP|}^v7Dw~1 zOh=+nLs6P(FfWlWED16WUH$NyrI04!k|`7$y6Ry?TD`Lum2w($o!bCFCY< zU{Df5n?m)`NExF0NYrPsahS$2i3O#NeIgtHKuND@;$!z0ikWf^`yShVJS{Qe{j2 zb{wGvCX@+VF+N3j4ZRBxVw0(WSK#QLI^fSLw->~O9E{YyI5A_kAWaDjK3i5C8b(Wz zDsGm#6osDY%0h1TGg-luojcWW9p`(*XxJH`=1ERrsty|O38-M4UqMZwD zx47)5{S{!pE4$uX|WNqY#Yp=i%%fH*mJIPs|pTBW}0l(ipAu3nNK zGy-iB8f+%Pe-a7C;Q11o&Pri!bx3RTm8bIl()5R_26gj-MFmsGTPQEjIDTTHq2Y4c zNiU6?(&=WENTHg<{J=?AbqCt%N@`2J*x$L*!g(fIeO!)$zVh_W&b?UU-jaSrWaT%G z!bMRT5B7d54*RB z(z%l8gZ0@D84C2w7)}}g`aB}~)>6+`Sm(0ha0;iG4rTqnVeuNcqkymgU6MlE0)62R@G*7O z+RvJ#g?&+5*QXCt-fZZE5xgWk)>&tx?%tiN zh0x~zd+`8-!ddNM;1;47(Qd>_V|ID3s;+M?VsYYzBw@lJA?n>kgEw+>wZvO9KOyqQ zQsbh|si{$zg}F|1aq3RudC;{GY1`dJ(_moi@pmVdYEMPx*yn|a5_zdu_Y+npB=1n= zHuHA+{c8^$ei8`7$`e39`b?~^PXyvrZ33lJb!XR$S-d*w~+eVc%#nuZ8Izke2xcg~^3lGZYo`fo6jl4hkAMODF9=v7Ju+*Zf zcvJ~H+wlTFutkiqs9C< zT@7Uqp#(FkhaUv2I%w50UduRpQ(C3kMxF^J(JhS4A+|WYEwpS-Y{SN(Cv^bAOu^EV zFe{NjGxev<9lMdXWAIKklWmE-c;%s5FYVn#99MvEtC=~J@%S~PNeOeB3>`w$iWN)h zi^u%?(+Ic7Un`#&Cm604bsWpi!Hw9Mn;TewCZa8RrF~%ntyTRiq)Ubid`MERx{>Y| z`*|w+>?_yfvoOhx(@J-N=aJ6sY+oqq^v5}7ff&7)4cSgX0{Gb6mrm1F=D5owVJYBA z5KBo(jhE^3cNcof_(1}*pY?6$>_FgLv{rNEQ%-4)SrHDVOw?afn`3&q>c|AYM_Ue2 z9)}MWusK%!oe}?l{3J)`8`3yxQg&8P#FHgKh+dP(*co}ew#|u+i>Rv49T;zS`IY5n z>4?^;=zO|-To>Sjpzz3Us8I`y%&x6W%j7V8Q^t!x3Z0m+)nt3u^}%Is0$;2w63?U< z8;T}_coI3@7tMPeB)l0_9{nxz+XsollK_HojngIs@8EG`LV~faifX^lCHIc->Ybx{ zZqAV0v_`C9oC%IOj@hN1X`G2IfNIfmkjWk+Q>uEkQcI=KAprC(qpzlMv-=RQi&Comn1LTNdUxcA|6SW^j z1f>r&lHy}u=3<6#ug`dyr<<^L2wB-sN)v5*7TPKHci-SWUbrEmNUJl^TeBbe;5+Vi zkS=s*_a#q>qNJY-rqe<^m_G>2ra0QE{j#jmE+6DQp3@0K>cvEXgqAve<@{3>py&^* z&j)uVU&T_Y?9S{6j;BKjJKo)V2`dR7j~iY%?D=*gR%x{Gs2F>A<$D$LCBVHoZ%+S- zhtMuM9=yP>po-3Nj6uCC#b=~lW$*-8?->Q02}Aeq)O{r(601X_8XKi>!qw|nUHwL< z){bFwCWd}gjRQwQb}iCYAWbKe!5zk)235`)`wTQ_dzMUp_&HDE3@uW~*};oQ9}RC< zQ;%CBRS|oV%R?-GmIQaM&Mg%(zHiL9-vN zhvpcunlfXVbQ!UyJ)KhO+rdkOvZb3KdfRe2_Dq2E&N`hRk()DzXUSHi!86c?iGmjhFUDP-@7dQu@+Lu!!{WJ&aQ|?o13C zxQDbQY^>4cms#TEz(Jn~x`X{=;^Vb|^`lkyE=|iK#Q$Z&j9i=?ww}3XlIMW=9=)6r zv|Y{B&u~(2iVA7vZaYrCvV~gQdS=qhr)m1;Ptk=|Kp#;PqNropKxhZ>aU}xj4H1D z{`uh-<`7!B#rBY^htEEc;W-q-ug-*`E?|zff?w z47l;z*2*X*Jc8oAX9P>@WWTUP0&cYF;Yx3I48A&Ho+oEQi}bQHD$Wbz?IL8^_R&r? zWkvcGA-pU>mhh7T*DV!DkiRla?HNj-Z*?G#?i%g82@i|J@R#yk<)`J>+GF|e<3Rx= zN#{ISqOAg##jljKk@q;@$e*0~sGIWm`P4^Uxpk!6AMZY*VloViNHH`3%NFqtx5)jU zn_TO@ZWST5Q9cAjIpd={)RnhNt2>mBM$V339SaIQcg>rSI#J}T^x5(3_{gBOYg!}( zQWV`kQGhPw*G~Vdf>#gq=O;DlxiD$ApzL#RY2GiQPN#3}tbt)}go<*m8z7LH%t^@U z7S+kftm|b>C4fS3yigSxm|RF^2zmeB+hc_p<(5bhHwk+lOGhlC#Ob?!>Lbg1`@;Ka zC4TY*3GtQGkE^Z84yp6iJ?Cc&6)5WFSqSqv9a?Il+1YEqVpnooarHk?-T3j_iobLU zV@(`XT~Sh$)q58m~HnzbfGC89lZ)o1r@U!@ko>|uzE-940$8R5tMZjQcN-yuq- zLu3tIT{bTpnvf?y_7u4FNvy7bja&B%l)3Ee zf@-QOKEq2?NA6`FVX|Qw4X2`V{CoZ6nx^{05y8N816q6W|G4^(Qw^OID=FXQwwi<=qr`uE+AL*>i{l2oq0n?f*>84sZxBZuN4)~%(U-m_qB2MIf$ z4K=fBlfBFu7o(cUyH)qa98t>F*F-@wUlX>3pE)G1qXa*?qQLjHl1L%y5ZhStaQ{x> z{aD-X&3EX(p)3u7?~c|p0i&!G`)&MwD;A0Oh5HHl`E!4^U(WO zzRe^^`oGh3AR#Qj-U=q|5|-Tpm}e}c9|1_Gy0CGG$k368d<;Tdg0R)cX;X>pUaS@yfI zV>|P<=_9NMN-ION4x?s+UmgGmd?4Wa8>2^u+^BxlS4sfV8t%g}6~^;LVmKp^WAn6(HabUoUV}0`)ZOa-v?fbl z{0EvHTlJgy3SzAzuSA=_IJkW*-Y_jx@V8K~K_Mh0{0B5@Ad|4$c$@z?<8X8WInlp# zYnFX7OV+JVDBNC{nrGAc0Bk4ErsywGQYM=7@(D}DIHl6xAc+YpUJa=8LRaYbmcAi#w83*l)dJQH$|qc? zeJNFI@8-K}seDZiYj+CRylIQ%Qz*+AJf+N*Y4PwM(`IjEKG9k{eD?h&JA5a7-mBBA zal=wjA{nmHLl8gCsBHNDeTB5#tA=~fkpo%F?ib%8j7?-Kis6c$w^cgskxls7uEazI ziiV;OAbkcZs}b?yb~TlXN@l#NdT?+(J>H`#{UrKr->;`}VxC72K=;J@!%nK(Px@ZtcH%|91j%;7JTA{_? zj_mElrdg@$Hif(>HYb?Q%MCuuW*KWJegr>Slwd~XO-#$J4^LtPYH!+9mV!5!llTxq zZ^;3OK`U2kZ2-BSlHe7l3H!DZd8u?6op4#>r?|_>JyGfYTcTavd07c|9CU!S!kwe3 zo=*+N8GdYLPBC3Hq&I)?+vj($v|Gdiu6061L6N~&@H?9_2m>;l4{NuDjBaz0QX7Bt za)*ohO_$|^2cI6uh>NJjj~h4~Yf;sJF(|h#P(HkEa9aHiOko3(Xpg6e(;Z0oIV`80 zG77GC0^7-FF(eRL8}h2fMa^bZ*0#g__NjHbr6DI>oia4ARqtZ=LMv(d;L! zOu=IM?q~E+z(v+$J7v^wtg-l76A=fKzbdewtzDlgCzp&MqBzBWQhY40r18iQR@ig= zODRLJ<6^e%VCMjrsO?0KBZ&=dL8FX8^3&g6mr?0{`UE30dt6^_R`qNTrT_1*&J6pp z+Lzb?NH>nZzxj!y&=1ui6v3un4?|@U7S}exw}li}z&tbg+bez9yf^6ap3fOf4&6Vy z|JF(%dyVBVas3#RhG&&$LgkzzH?{bc`TC>YSk%4xPhXCWBSI(QCE*!3-+#;1;Cbno>W)`!FGu+RziNr=Y;g+%W&GW^I_O#3c((dtev@NMww ztnz3rgH0PY9fd~F&d)KhZ`wbaB|@}#BX>RVyHRV?axc$2kNjbZuHg_2d<_=GSX#A)zIfKtsDUY$e@go@zKz`YTTc@r@Yqh#N|{nk$#PxrSJ}j#YW0s#i~u=iX(0JcD1om3+H6WDuA#?Xjqo@aG5;CM*Q!_}QTy`< z2xzm11BHpHle5^Dae|bro-sxcVMe!q{>}FOmB3SU@rHULo@Wm3+aY=r#Z*moSWf5X zze{mwVtx){VE$B$8NC9%(i5nUPV^~(cwdoD3=#h_L$0V4h56>QUWy!x>&$;hK@v9k zz=E^epr$6$lZ4iSK0F@w0Fevk*6ZVixL_&3BVS+N?YRb3GxF}P1+m}?%RQk0yURx% zU@65}h)TgLw9>k?A0;#iL3*kLvw<(q{#?1zwl$3ZEt9m;wsC!TkT?V6s;HH4lof!S z5On3xe=i_NJ^y}We~0gkn{d|Rd*`Fj7Mq1~&2)P6sc+e8sr3{IY}noip{+Q4m1$!2 zx-YoJSnqjJSqX;IVCX*!B2~pCT@fsKo5>=pTHsoBnNd zG9x;|{~|awCbbwq?8MNK{+O__nHuK0({N_QlhY0g?^5oJ%1dW%AR4|ep&0t4P0M8y z8LexL?WDA?H2hBO!Fc`8#>NXKgG8pB(@%cu0uDlqKc*_#4_yZqdgAcK#FV*>Xx&P# zBuRDu?Cesq~EOdjL zvBuz6P=+sd;`%rpXUFTy?5OXftlteNL<)EeEKFV(p>IWM8ym{FRBS$uOr*Ti*k9hcw8Q&L z54NpIe!KFc%{(r5`R$6Vhwc#MW`9JbDoHnppfGL@oxzFn`15-cIrw<+mHC}AL9SQ~ zYFdoMSxI3^S(0zRzpY++7&#SbmD1-G@h90OQvb|WGo|gdw33LtCJI!m-%5|rE?<>Yv8z2o??FDx0i`TwkGr;gjRopJI$kOIO zhTht`bq5SZa(bHp*-pUwmUOJnPU1;QwdJar1re>I@(4xaAI zhgvnYytgP0p&|M9ft{^UHu;Ie)V~+M>>O-3IW*t6Nop(BOd)$`j<3}H{+*;t%Sye* z7*jR)DdFhNSW3P`c`{{#MK3}eq9cDu8E)U|An%-K8Z!AWvNQAif*;mx0CuXU*e98Z z-WvQcXcYj<&(7?1iLX4wT` zW=u5Eh}!@PFkR6r-M>HMfBhZGAitN?_Qun>;?LHwFHSlgYyhRO`j~_GPlJ}QzGXTa zMUx=orRb1u)KH8-ccTZ_dHwRl5AOm?_gCKulM3r#VPls*$Deqr5^Eo5R0Mz1>oNau z?I)KcFkFabh&LFSsek|J^YxUU8Mi*eJrkhs7dA9~FmKf~?D{6?sA_#7(SsS+__9Cy z>or~zO7H*`1+PWjp*A>lw@B>Fw{LIRP7jZc#z3%AflMYhS@L6hH)?L8sH4S{E@5|G zN^MlrkaZ{U$<}1JY4O;V^Y0ftWTls^9otch%Uc$f@ADP}^~#R|;2Pzy=Y=#v=f58p zt1qoPuFLsNehnMCRI81dS(^pl?9_ESD44)kO3d+P()VVq0FOA2H}pkNC^B_5FdBd3 zLe$8z9{tDm=_?mwDpG+9%-egkmkzre_ z1qrSBdlyGP=UTfDTRU|sRkqws__H3iQ=z8CTd568cQqU;2$iwnyv3fRv0dcrU+aMM zU;xR2&Nh2EM}Sp=&io=Yt=7{S_uk4=A*G@=X%59DBNErQS9>WwIgUKnl$%4TgU;43 zXde!HEaMXe=-~EbZ|;*NHD^)5?B7L<-Enk$4w?LLUC(KtBFi=yJYlO?q8Ou>!8h{E z)n+ZAx>`dAis=b)f#lR^z6iF9VXyI9;nIT5H^iXcJSkjH)88F|&0_o+$!66O7&h+DGHD$Ln<2VvNOB+R0$?9)zT6J|#PRZZ-H@WNnfiqW1 zhIV&%#Y>eQ{FytXHxQsoO$FOgV8dIK?XI!Nk{+*kr(y~*82YKDJ=**d?kuIBV0P3f z?#6R7^fNbH?&D$d5{k%b${#h{vxq^=VpBnk(a;OGbr^rDNq`Rxb{>Vl2zkF8+BFf6O z2K@mR7?dlASNJOoCiIPOy83*%lrR@QP)%z+VplpOx)wL<&R4U;IG-6)byR-9yA;`7jdjiM9ct^=;-Rz7Nd?d>gF@&9_mrn zo0kM!PLku+==nb;5*#(YfORd1*wNE``0_cOUUAawhc}TmtURrw6!4pvmLB_iC$$X^ zr{yXQCbQVXRGe_eGUw75r@~SUqlo&;@KFk5#1-7cyb-cXSNqt&EPcvl)5HBLN&sSV zpYX41H^vytd}TIYU1Ed_BV;gLtg25?@X7-A{d*=5Ra%uXSbVlzvjGYNuC$l6>bknfiPWNp+DWV*IUK4hXB z-f_A0$`88uyu8GM+&H4bJ|AwgiF^|>Z$Lug6p)Po$RT;}M9(*WjM(v3rQSL9KLLaX zSwN4am#F$z(?HEj_v02i%Gt8#MSQYxYcB~%;8A`%O@Rq07xD1z&g@CB-D&I~%>M3% z3Wrkjqa%CjhK(f$N8LxzbNDFfq&PvS*(nF6AQTzARnKQfjRg0(JmkY*cP`ZK{5Tp$ zCQiedYArqqXm}un5kUb4Gi-nm1Aqx;eWqeO4dmvh={@!Nr9rcM>f`l+{`tqsarn=S zFTa3F;i>($?n5A<-dTlV!r7^vewPwZup(YnBFgkfz!+QT*0PC$nPzc! zGKl?dOv$X+=%^mEJC2GG5dNd{BQapmitD!2#SckmZPAD-;{HtR%@m7S0v#?PxAMCU z5@0YU5HQxigQF^Vf_8x<_M{b#@ONRagE~MUKX_fBS_#?uA)oP^CRW}Xko^_Ti9#bD zs>$6})C!c#xdMhUe!D#31-C3CrmMuAoT9)>G4FL7U=s`28~2AG{cVWm(m&mEt97b0 z+{-tyK&+T}@~md?FyE9Uwl}>DxJvXWap)n}mM|>uAHkI0vW=*a{260jLJ@UeUBO%0 zBz^>9-_Ss!z%K#eK4QOg1Nk-N&4XB4rI6);X?mqotrroKU1F!B1&TW{uh@B@18lkk zhmN7N+GLZWBpf|8R5tQ&OZyXDfBY!eZz(Oh&R8Ftp`aEjFZUU=@l$QRUSJ2<5 zeT6rJaLG#`sP*mYXEdbYkq-bm^3w?;f5^uZBqYAUk&h-!^$cFzBOheas#;sjP9+B4 z7g)B*7vWZ+QmoNDI}RZB)`2M$IgY0z5Ykz4DO)V9a*`sXDdD$G^_Xt2yN~9sz)^s<$+d7SQ2e+G3 z*F)^3&6Ng7kjJ_x7LX99hHe`alnlxzzZ-eV;Zt-|wXy$Ucj*`7ND17pFBr%*DvUil zzEmyE-0ENI6aot5FT9TJ>7voueV|Y^9OHBJ1pso%j4aI|BH5lFW902S*Q|FC8&B6*@IHIDUgHIS zY^z(ImV#ba!fJxV>h2xB4<)u~7&;d`K~nZ0T#+xif988Gd&KshuJ^mmjnlUZ3O~`^ zlrq`kdXrnkDzr-}C7Y@0Jb}%Lu^AXDT&LUqLO*ir=$|2jx~ zKo)%&z!vfb0+a+X>Q&brFSVpNwYa&Pm6e_MBGVT(lIdFSt(;_JHcqaDPn{0s3XQE} zjwaR7Q_m2vsov1XTD-4+u{l6L?W6MM4=Agt$KRi?x1PpwC4xDs#N8MNLlvv3YXy76k%I1^UlVkNg)VrBtUt#XU4+S4e!Yh6j*cy{)6wZZ6)H zK_Tc}<6SRG&1a@P@|D#(>z!*pGSMhJe^p~ZAtjD}+q8cDCXh0{qb3dRM5^=cO?98{ z!4+4KGq+n?jRNjO(G=mJJGJnv)uTZ#{?~86I=ERmj1y`z2yOcMx?h{7lQ)d)x6bhn>_>y{Y6T$M^3lsl(~if z06NEfDsaU0p04wYkRNBLIO^V6HX=b_HU0Sp2&4z{>0{0bQDvSP)|8pYu_Po-mg%Bd zPjRr`w5UE|m)By1rI`7Uh0p&PK?8h2V+)GeWZze9w%Rv#X95&`73h$2pBN5od7tNA zJ9kA)F-m%&NOfXC>&U%*bFkmtNPvIbrT94LhX$~6M zqQ!%5GV&L%vxMHF)^zs^i6#em0#FQr#HqE7kAtW?vw1Tx$T56~>iez$OV(U>3;+f& z+QdfHHyJMSQADu#(5&h|prOM<3j4p!Rms}BxYUxDI;^(AEC3=E#Fjx{>$c|A5H0|# z$nq%mI@c+1xi(1qnKy9Nd@9Rs=G|ZhFR6I1{C!K@^9n@!Ox)6=R(2m{%H5)Ud#Rzk zU^e}x3PAjCf)ItwS)y7rAZ_|P7Klr1>nuh@lzn#Ud|lBbY*IvpxPbv*49;IYIMgE& zr8$YJcV<|ube=n5b8c7~^tMs-P{0XUGbL>;8STMRT)P3?u_OdZj0STd=IG=+n;s}q zRAs|0%YXLiaV?mxV?uxhuRsc$2)w`XPULnb%VCq6L;~y!ay6e23>wmut#?P|1A?a) z_|H^MT!v%b!{g(ioVqXgha7V?ARaPWJs3xW3ycYpeT(}Qe|9DjOG)x8TKau|l|hqi zR;_|P`XhHcuf;fE9&0>)WN z*CZe3*%$wId`29aYVlJ|Z4rs*H6N)PHmkyEL_gxoB&Pt&n_j<-=A@wUUdm=e>dKu@ zJ(&ZKFdTlo_065aZls_UI=4;*{}3lbWz^i~>nr~t-`o@d)^Y>sfVY-`f?mPbf=3lE zspnAKm)7qB;r#wDA+5KX6IW84@tCz2s}DO^a(13*u00qP91!HcxLsS+y8&@_Or zd#LZtHGdoj5rc1X%(*2nr)c5T2;i3hZ2#Nd1HV922J23QfhRj$?tA1Pi5VYUzUh@x zh#d~o4B=>*eQJ~XEMC-1VP7#y<1w}R#pq(ef6QlH=w19Kt0Rcg22Z#I-zS)@Atx1T z{OOh0VMHr6w5yHZrr>Xk{%g@hH@-eJ;56Wf3JoR8#|S0a*@@BuNu!2}nW`D`tCxZq zi>Rd}d87skXd3oUk4gQBID_@R=tc3LQnE$ zXn4K|0)dE$li4jKpm#ieG2d1+U3Pl23o8EZ@*(~Ct|;R$@Z9h!e> zQ<<{4M+`YF#+A4+<`6o)me7lyL_Y8`(&9^6C zrM2t8X+_f+{dwt`8YbA{f%5)(QM8ADHR(im3PTh8t&`KcZtJhVZk4Jl|Q4XbV6pMqYsEVHY_-m7ry& zuLme|C3Wi+197RcM8AAdhJq5UY{n}DELv(x_HjH7D0i0-04MUp?O}btef2G8E5m z=cBPN^?B)qAfyU(z7;4x+V*le`<2VeJ2KbQ9@rFmFk7pmu*WZ^Tusiqxq|jx@Ph3w z9RH=F2SCA*UM_NI?i6QClBB(Lkz!E*pkM!+qe8|YQUTG(qQklQ5NN&`ERjOCvp6c3 zQ`vo_CB6$^!hd3UdmhupM2Aygeje=`08r*xkr0Mcc;wCz z#kaP1W+Ku&VPpzl-JVgK^EEh%9u|8?)kvNGZ4t3wy}*AZEC)vXl~v*5$D&MKGdBC< z^?@;GBA%J4_oXF(EdfXe?9<%{ju3%ZZK*Ce7Vas~=y=#i87yq5-$nHeohFdFW7Li9 z*Fu3m9nGmolljh+Jw{`f79(YuQHQtj?SZLijhVWl=I zW~A8nRB!FGR|wF4hn9GEJGPMFj7pf}S=hh?t3UeAz1_|pQ&|_98t2Z0wB)*93Wx0} zt`f?B#G+$v-;Y0J9_#8DS`RE?aMd&27~C(sMKQ#d_&?k8AQuOFc5?Ff_eWyEU$MVp zW*VI70Ld$GPmd^{f`S5bU8rSqN$v?R`1fDBKvezZpid?&Mo1oclAjbq4l^rgh0K#f z6N0UA)1<~td){FT*6(5Ye8!qRLy_Y%{ccsHKck=h(S9UyTG;#5_^upSd%@F}!+l_0&-Kz>PSf8V1o~!O{i0!WbA6R$mJDV&4G%m$Fxd$S|7V3kA_YknsyrM3m&co=;Q4w- z^CBQ4hXq)fJAqh&MPA)-EeE~SD8;2O@K?s;i4gn34x`o76j&=M`^w(J`VyD>(a$x^ zQk*DVnPh1{AOr>>!B7cV2xr-i3jgk!4on=l-(N8mkX_AsQZ}%xKKYD3NP=_T!m@3H>5d#t9J!EA@~GdA}20%cy0f9$7ezg7`?Hh)zVJlo-M>3cKk zIwOx~?x7jSNtG2JP^-58(MahL8v_nG(Anm%Az z&?mWhNon%cH26y6*zVr-(33R|5zFIBnN1lMjq^1eZaN?G8eZ2DiF`S;>Ke%*z3jB&_$^~lB?Of90@T8?8{ z`3HaT3`;3rOXA_e)6|qI=sJy1WvO~93=Sr?+jbIahpj93(!^M(n~d625`a6H(R!OJ z(ULn0C>#8lumcG2aoHAeB}&RO5Q-BweB9EKpt8l5TrT18znpae-8s^Wo2T>A8a^9Dt{Mj2n|D@OLq62#b*R?lJc5@y;uBvjuclPftTL z;>rfDvAVie3QxD_d``|JK^EHL6mxk0u_y{CtNoV4&Qi$-;c&Zd!j|do_WP2P4O?7Q zyZP5;lfY4nSiau{g#xHpUV{M>&mqR>YTbYDe?2e^yUzF4QRMdAW+)0K5sWERYBssS z_k>;YbB038XMI#>!~-dA^Xfie+qRRAKTf^m!yMPQs^BK2>}F#!g#(sXOFmubYL$(B zWo36&pHI|lu^q9z4Z5sXiK=Gmk$J-KMan>V+4g7Xu*=PUkuvG}6P2}}pLQ7T9z3Pb z*;yb`BE3gE5e>ppjfz?CfO3?d`lw!yLeBd!!@h6w0lO(5(9Abe#3;z^l6jkm8ygw3 zwHEPA=2;1yj*ET1Kj#OYoJ)O76y9EGc3Hw?GL8{y_1*0Zf3^46m1C)5R%Z*m$mAoy zFaGVp^1|uhs;&LqLnBm19tDX*a~BY_0HV^p8L@mO16m05iQpb5MMhELc_IJt9bvo* z^6=c@3WLs{55kvTq5x4!_v>6XWdb$=#V(mYK0ziGMl@;`vtZ2RnymiTW%`pn7Nlm| z^Y5k09e?go8TN#}35zsUfuH-8Sw9_mSwErF+F>*erwH+=W-W3#3EnNZu0#yowulzr zEzn~FPJ7Zz%mxw5PN-b(^GKEu!NC3Bx64Nb6k{>OhNBWx7%>G1XF>YNa>I0FSRs1M z|9eC|BWU%74X!VI-M4A;+4W*fhf3634nCx_+0ADzGagvm@D*8wX?CpcrzpQw(QfJb;(zgzA&o1_PnOQ}&|#H8WCN=weTyF(7&3gmf`_aLFDqusy;K`Na8}RaCglV zoW7Q=cTQLMScma0RN$I7ea+jEZq~3PPVma@@I79s9c+<=w@)9;!^+Z;rb}p$b?&+> zNcY?AGIV=Lpk0PnsC`%|qxDQ?RQDKl$Nh-=E)_LAwt1UQXT~oO`;i+hTU)Rb9vE1T zN{k8#3u&`at!Q|(eW$qb7|CF*)$n^t&F@`&R&8l%7`g0U45(*irdJbQ0&fYD(_wL# z_mfqW+4SFBlf&r-^DGNhTI^0iK*kU-XbZKwODblENN^%@U%E-uS!*#Ue0`;oGTQ!p z1mJoG*OO76zHK9A*OYjr?t`>M)#8ywh|nV)<4(^6kOza?#(tpPl9X(grwFLNHuk!J zF9$IhfkBSbW<9oOqr_5M!wpeF;6BpsJ0kFegO~EZKX!-f5X!U(AB$?MnpQdub3%Jkt&!R}>@DrXd&bV>LY2oC~)3n?L zw-=h9^-^0;-nTzp!C9nSa%J>8bB-=3xTJAg~vsHim>7c;w!)qv3hH$%&3B3g=B{HgSy!V$zUthyS zsI4~0ft494lvn+0@B#eCNc=}4v?uBcwT(xHojXSbJnna;s+GAo<%%{A%(-O7{aZ+= z;R7b8(ptsZ>Yv%ln)KBOdcf3kpOk4?y8piJ?6?QDIFkak`u-P>x8Pt+4J~+=D_;>3 zT~wsfJJVos*4zkckI_19M&GK0Gvgu7?nGB-Q z<#=XwcQU>KoWo}D;GtJD4MxYEkqnJOaYAA?Gz1W0`p>xqF`WJNnYzyD>$S$9A*Cd9 zN5Ts^69|B>L&JzcRuh^f18^vB$+DJuV0IShk-oFt<9bhUlXaX)r(&tCO2RtDJfg60 zBKu9xWVi$uzft7BQvdV*kxr{Cf19rAtgEBPMAZULqu!SY88?W~lDXTR(sv`ggO#}! z-Rrr8z-rONCqD8D7aHm^0sEA_7|E0uyw${L3dpU#9L#lyJAmlNm3_yS%Kh7BCx91;pFnb#i@FInM+DUQr!cfr&18k&$VB)k zDBnX%+Su}M;!wq_k5g70tm?H>QL!?Hzi%^u3sKZRvXMIFXH_mYy7nZHg>PZYSdOHq zv(-5Cr1oPBCT+Ejg*V!qyCF7cApEBMdc36gX=zDSkXh|fE3pa?O!&_Qg79s;_7|0l zvmK0lo4B|b*&8vmAEX zwy{;}YrV5s3w<``#LO4hrgbceS}Ob8skeAVcCWd(n?-UT93$r25jWvbrAAO+eXD9F z91ti28PkhnGC_+Os?XF0_=eQ$5b(x(oH2zgH8t=exoW6zCWifKl8aU!mZd(N)F5D_r?e!hCHDPIFwr|>LdM>@&U+_pYWnJiKg z0s}<S9P}Ai@Y8qIF@SLepC{cN&o9Z5@)`ce&~c4v^r90;muMi{0J&N z&fIWcL`wlD$NUy8g;4}0jkVd7XJRzW ztMY+Q<tQkMkcL<&J>1qk#k8qTgtyT=vedF%HUgLqqe+_27LM5@*e+f9r+NBy}XT zkaQ)eeEP(4rS*X?@%cI}(f;_L&UsdI)_?P?dHCGjY0G0fg@eiY^Hoz`Nz-BV=oAY} zq~kTu=$}AuEMyEb0(b7Dn_c74-sK^Q8(L07p9CnO7d7Npruu56G0Wbjw_q}X-EXy( zfd|cRRK53&pb6+cL6&X@hXf{o&JSb_>@RH^G~6LKHCXZBN+NFfOG+ z&F|xP2eCy+r{TG`x~=pq7q<=8McMJ%oYeKFcg>>&4Q2R_`_*7<7W4&;TXiM z*UDN2>^JrMS##dcWH`^GWTQ9X-z__GZn3K+?bTPh^Pl`svr{$c_9~w4PV--%Ux#mu zwnwoo)k;j{$xL(KA5}^_T&d0rgUaS|J2hNyhekm%1n8b8T80<5c~0;tJI`qx>`6}J zrK5_jANmvBPFbl<^(J}scP89%yEF|4sptm4(dJcx8@i1yHm4D zaj%sGbZoV2TcoMVG{#I;!`YGDDwVM+Tin74z*h3zN@3Xmz51-}#m-Jb-qVLr*UiZu z&;6FsoMWuwm8P20ruD?)hDVgsN>=Y>Q869LaR&eoq2_+5m`%W=WX_O)+VJePFU%rh ziHFbS5v>=tC`j{evcVZE);p9%Y0E}m9xX`?oJC$ZC7kC2YVhP06Z!AaI)1 zc`I~XQXN*EUl>-6$4Na`FlC;s_*=c_D!W@yoj{RznwN6UZboj@t>Fl>WVABgY&?|nV(rd9M~Nm~i34q{0L`9KnK=t9ss6Em^EFO%6t z0S8X|5S2=qbQ8a)M}HpNN|9%i2D$8PFEW`hr&I^=qFKX-U-{c!_ZXA&CD){V^t=0I zjcVKc$NOWfaxR#5mOqzPSXdY6)mpS$@~um74>@)9LKZ~)2?Y~tmV>&yPjs1|vcqG0 zd7#Bx8&COLUycF#a=CEJnoz7jvtYVU@4xoH`|s9qGMeFjy$FkY)s%<*bRWGlNu`$C zk0az*EjDb<a)|DUWkStyJKE>IqYHBOFXc_K2@dJMxorxI*I4hqOONvI-O6=0$2_3wr zF5TKxjC4--9KcXklZ<`E!nVXdw~^s9dPJ6rhn&X2ROo)aXyTh7K=1nWW-_{nf;9>s zhM_9mli<*KRmd!p21kv*@9lq|Mbx!Ie0#{O^lVPu;^QUn$zPLkA2<{{sIZLcX!Dq3(3#mFt>|x51w{{C(Wwvf;=I0PU))M4B`odiJ7(h zlr5f5{0Jix@_+%gq)k%e7sW{sqh^QEhp)G8g3eK43B-KCN&kGY&r`E>akoxky(FpmQ_kOdde5l9&t(ZfZs~d2+5&OZeH#`Q+dW+Lo)*i6Dd$JAXZKFA-P#PJOqkI?fyp!$?h?a{WfD z3uP;5S0XDUnx_rw>z%Z#W+!7^>(t(Ao7u6V?# zz4WhN^<%ad`Uui7(6!K2>s%n9-8x1QQ;#UvF?>K|NLd>GjQkFiO(w z;DChOChd8r)ccp$jS!QnbJ5YGB}er5c^DqDUP~iIvsYNq>nNQU6jVxMXqG3LSW$s} z$g6)aYo5qJlTbbCXOEk(t5!?k#cF6Kr?gFxTh3DFI2z`l_86f-ck8$VAXQ8DrPVDT zA`Z58nL+gVju^89MsCz~R)(cDiQtEu5b;Dc?&HoyVxidN0W7wEP924;6WaQDOv1E? z2y)62Nh%5x$IzAgS}h3#Q^1|UVpekc?7*gC;uLz~M^D()`U!4WlSe=oQ!r>8KU1Sy^yDsVi%u{7J{(EiOz zT3%DNo11SJce_UV&r62slkSaJFY7q*Aid%5DjKkg9vWu^;S!K_oxWqjFD&Y@qS(Zm z`ncB1@l`t*YZpy$W#eJ&6y5+iB2(RxRk|PB=bEDNu8T0_0K46 z5eK#c#+F2;%fENI33<}xx25f#!lvax=7I4=53#!6Q>HnQ1AA||A0>6oY-MWMGzbM+ zMvWNq$coOS>4}=*o<$cxXNG^@B&c;H?-gJW@DDS(hrQvrEkKXZE$VsFm1!-d(3B~JkY+F?S8J+rdlicY4~b;hj13!jw5!@pAJ%}>+`Vv^s=`RZwyH;)`EInArnOWy(!~D3D zO+p&SXSKb1X~}tHQ94HG>B87^L2M$GpMV?+Pi&}E$#dZl>Su^kn2kE;5$6*-@EmE2 z^gqI|jEYZ`Oo#u>?b*zC^sq5P=}YRl-P{;Fl+y)HM-I27O1LhDLS+d{ed_u`MYmp4 zfz16;St*xiCY~hHS_?wg;=K8Q1vlL>0I2k=p8vDdTeN_Y5Z$Bvj-~d~sHC|LLEZ>0 zA?$Nql0#QVJk&?eh7X8a!9m<&>G~h3#O{CKHf~9ln8SSUUXxY%A=bT~SwA;%H{Eke z#R(Z(OWPn+Ttb5=CE9Y`;J`M>3e$X>EH01=TW-}@?XrDFK)Ua;wTCF3EfV0)$U4(`iq( zlx5cyVJqwR&_9puiad597y-D`1c-W{Hl443)6d+dvk=?x-)zQaqec6=od&l^ zI&)1fPv^$<*X#^+=l%_{WWbIS_5XLrDayu{u>@=<^#o55>YR57zKbG1vkVrSnw3XH zVWi0AL(9#IDjM1*vb+YQFzjPTd1|oNiZSibK;XL4a-VbKuXLF5QPqlXiob+B^r7Q4 zrJ1p;Oq^&Gr-UpG-ng|^adQ3HylG>{acpab+75W*L6kl_*AW(*g-nJ{+B(*jl%mQH zfBhVQXZ>-5Fsy#ub*$}j-=d|AS6Lv^_PcHJkrlTw8@IIN<2O$f*SPO;A&0{k97ke_ zdLBMMCnHi%ly_a5Z_wJ>*W{(?38++v3DZi#^iOFlqbLef{`2BqgVjjeY%B&4rSmB4 zQwAg;pH_F;g^K}vnhl^tDYBjFtOb19tow0Ob|8TpIS#$f4>=3fKV3NHf&f^> zGRCPJ-&s&u%hga$>*XRlya#g7d=$VrFMeZ&N(>2MX`)M|^ES!hNYMbta}1c@1ZQ#9 z4q!P)k4(^V#A|zT{PT?p4?Z9&bF_JRoKc9=Aj@=!nVDG@Fb!LjE;U%W=rnJc&7j|v z?*XtAcvN*_s-thd2H+InFrF)w*s`oF{y{&fmr;MBJ`fp<&OdRvHO084bw({k;gRa+K$K;nQJ7KW*rl5#wh=(n!LlXnH&Q?V(VB z$6}Ox8BjjS257GYTW$xf&u&W_j_OSS44Ny*{qJkI{CY|%s^B>XU@ytDO(5ptiF5c) zGhfY2Ok}4MI33L#9xtbhxUq3kSi5V#cUaf1!a9b(C>kBLJU>NQ`fvzyy6KkH?@=mV zcVcN5kA?BxnZ#~yC0i@)qH>@7WULUucZ?D5J_Yu?G;LSYc`^40ewwejYIe!&b$(Xn<_4^gOfs z9GE5v0ebB5GJXX@vjEgqljh_Xb8#QiI{rI8UP3pWNYtjJHg<#Dxo*ace zH~mZfm-Rkn1W;FQCs6-#Z9(d~uuW1RL#Mx{=(Y-j( za@)-f?bA)L<|GUt&Q@mQ$-@jl1s`*{uY({5Bc%!c6wO= zk9j)^DA?Sry`*(Sdm=MXAUkj3`Y~&1OaPUqsuP0AQ)P6ENY^O)S>4lX-m<2k(Y&n5 zi5HpFv*ECsii0`%#W+~<&la#irl1dRI|iO23exH_A3Q{cWTd;vCO4*J-Sd_F)pN(C z>YQZ1rW~ub7L>-$OXj&du}?tT7ROz?QG2bzc+@UA&iYxT`CKQWht$Or3o}sX3QCOw zqq|k>XdH^C5UwvMA3bxQ+L@$XoSIVSadxu{A!X6F9(2tC-fbPN_R4e<3rP! z_j&HIx-AYVS^0)kFII&fN^fYyxfRmZsB6ODM#%tRYhoybZeIm#ZP{@+hNLZ2aY*`U z4OJB^+V#^YYF$XK;Z3*NXd-=P?T0W(S$cXladva7O~eXc4_MXjLMZ8mbd?4<0R>n^ zUQ1ft3Ekg=9y^nk1qGd0uZ?b*hS&v=`KGq>;VyOGGr3g;BI82b90u)PqF_@{pL7WW z6x)uv>!fCH2A=j4(@i0FoHVD__ixh@$m&jQ=@{Y|-@HGSQlH-cy3S22Vp58TT`x0F z4QT%mzn(mj=J1&zY}!@n=1W-TFO)d$^KX`{rN^AD-Ww044!C1yKmrsrjCBGzZ-qGnuwgkW_Wr#i;gFX- zH48Ifyx1a1?I(fJg~R&iEUTY%2$<9AFBw_{N!9^+GTSp1gOPQj!GTTfkg|5PI%uqU z%CvOTnr>UJ>kM_&)y&MUD8m@t)lp4N&q<{HLl`cn`KMG;*fWg;5cZO!q7z*Z-55_( zDVHS+$1}DOXz%Et6-oUGrryFL>#^*^w5e&(DiVoP9j^%fXRaGj$vrVjg5rSs&_p$Gq%9pTED+cwH>dgUFCj=Cc; z=5rtI$35j+K)B6(4#1mbdC*5g3LNo7HoL*yJDZ(r@=_&k#SBs<&7^K}gN>v#3{duN z*?sw8!}CElYkN>p>mPlj`6+Fr7{B77z6t6O1lr3Xgemk05zhl4?kqL1f zA?IM3geSh#+Sd0odYWlfpPh#FFSlrJy5L(L8GQ9j;;su2(lf?-Lrovqp?G|Jm9f7% zj&?!0-uXQJk3Dv|GcQudG#`fqwYsP0U60zZ4y^Y8FI2#HiI9D5M3&O3v75cm`m{ir%s4d1C8%*rR9SBHL<-%WQ2)`ZN|b&%7_6BG6Jx90dUH>&K&rkl zM3VKi9l$1Yz@9g!}oYUhtM-*B4z|P6l8% zRrlnT=~us|BG+di>nQgw`OF5S1#V8GATa0Eg1t;^z-=9UoymFKc3LvsygVqFqjSa# zZaB|+x!EkU2vAVi3Vfd@bqIr{k&%XVq@270?8(pAh*Lv8w{#7QTR$iLus^D4|3C8! z)C}xpV}pv2P^9wo(+YBiKMjfHv5`z)z3t^9OJ%hi8L)y*u2y4j1=}BZQ@LVJ0ZG`I zJ+GTUWGSX2T6<9A?iqGrh}O6RP7IRrlO)n{Xf~|$an?A=p{9idI-&lJEw>1};?{i# zK0)627bKZ99XQ!4+N5UpdfL&-6+b*UD=zmXR@+$x?gh49NQte^+@G>S zRu`Q93Izget^`(WIwUMsW&AFFk(q3aOC4MCjqVY{fmEREqMH?YJ*93<1CDKDhQ31N zYn3F%S3mztzJ`4r;QEJCTSAKFXJq$NxhNcVREU42O>v;%+XL&O^Ax8!Q_7NDh*L04 zb&vMjrpg<}SKT|0EbhZE3C@^NOsblm*}71suQUBIl-vl;8R5CpLyg54N{Rhm-)zf| zyZ<{Tq*LI+c6?O$0mO)m?~p# zA!VhBD$ET9LYy1S5QeSOLi_d!{!^%*G1Rp4L8nS!;Buf=@b{HQZ^J8Q7YV zm#xvErE((~Z3lbGjpEjI6S&7{?7(MCUuO8B$U{&d@~HbPe4abD#f63PTOTfU(`ZW# zw-$B$kil->vETxzv#*((kWv0#aRB}|c`p-&>$uTgPPMpJqma!dJCs%4agWE4#e}Ud z0}FHh^I_GvbYY1Io~>ZEM{P|z3Kz9Dn^#tfD}KVUrqgV$9FAL3`7m9YsgRIRwwC%! zI9`Qlm}d~HZ7*t@X5f>5J%&h|8#`bgx_9u`%IZ?z^;fC}RpV^CjSiX1M6fc!6RhEQ zoko8dKhF#;S!!B2?p6Fnxc_uCOltEl_{pY5$i-eCzu&~=`>o-=)AY@4{NM46(4E-J zi9c&Aej7N)dYAeO$&~uHSov4_7{*kM+Fs2>mxHnC-jdS-fES9sT{{}Vvman6WOH70 zoTdTOP|;&yxlbl-Xg1*j|jJ8R^(nD`l&3;=K=YvW%34ifuCGQtZ zw%KgCFckhVx>#9&HEL|;T;P*jKVO`JYhbwO3+J`b2Pg4uL*sx95!qnWW3dQ?XSm$I0 zAoqy_3I)!he`-I4tV5@@iUQD+PYvNE_fJ;aC%M&lv@y?v$fS}w>Pi8h&~t`58P=!r zL{F#Xd1K$y2_#?&=0HBk^^HCd-~yr+KQ_^MR4eFKfg3V;ea6EKh?Xm!}LwnRuv}vvy>B93w2P8 zRiFS5S%Q}NEmtB#K1(on?`8PK!3q&jfMpr#v-G)Ym`W)%DkereOk;OB+B2$;n_HfS zA7&b#m-x)ph+v;F=m1um`p5*2 z03{N0z;?eOdCq=`Cm5IsgUUZ^|Go{Bcwo^@i*av*+9kV6TZ!OJ&w4F8@Tm1oaJDXM zQr*e}EpN@W;@Zh*7o?eX6Xvbkl~9oY_e7?BrcSBW zT}sLd1L-l=u56_)(K10HTK#RiWAx3mUCVRK-Eh2iku;|a2s}^78_0_2Z9~=0mllm5 zRqkv4|4{Z`QBh^v_i)>ah#<6*B`G-yMb0P)NEV751tg1rNKUOt&KZf43JN3%B^e}3 zEJ6`1ax9|coW5P&d%b=C58oKSr+%QVan3$_uRYgXbFP(_VKU#i^drsm5M`ORad+sF zCGO1E#QhJ6#$eM4M(;-m)mGEpJ??vFPe-_pvU|pex(;G1>*jYar526lXB*$r0Ccli zCbugUb*3YgKFdmzQ;^5@n}CQ<7f;qtrks#!emc~okg89?2hqt4^ElHp9BsN8sM%>6 z|KbY|zX+6+pe;?SihWYCuc?@@YUE@{kzkpA?sb+Qp!SzAN#%3I=1VtH3++PnS`DYd zr^=cPkF-RZXm^wWvrdhS8*fi`*4IgxlIg!bUvC z@1EQwpqv>nNm&u6w2SAaYLw6`v*fPRl*yD`WnU&6ht_9`4F=slhV&SdZ_$Ok$GndT ziYb~KmVWHVWU>^BD)s6K24Iq%you}&sb>@kR&|Loqi8P4I)*B!Zhl9y@f5H^O=x~T z*a-lWofAU9)S>3kxbRD130Q$ZfnKbEt89OcVZul1g87$!*jX2UNJblx1; zxM{A5xq%B?JHu;@@^^TV>~i1JmT6PcQ>FJog`@B6YhATM_gdzazn9*zHnXK0c0&0dCQHQ8D!=@4 zEAce;)6mRVa1+;&C?tI}zIU!O1b(58u5Ij(6GW`x|G|=+YaUI}ANS&^(`OYfvZSG% zMLpRZl<=WBiUX#vFlkEHd6E z^4x`T{Y_+iaViNm2zdMR$+syKS@4y2Z4gi0k!>9gclszA@$1e3HRa!PJcH9`pLV(B zYu}y2GfOh6;T58wG7_^TLxwNA^~3=yXf;C)RJ#OZD>4gR?nTx_bgSr)q>4jiWjmYMY5@12cpguf~=z`KzL=wl@FZfmuLx zMUYnG{yD4VPvb?T`B{|G>ACVj@0~c_VnM{Rw7Ly6EYp~{HD`opvb!u3*PP2zyRXN^ zo5RMR7cq3nC*F!;KGGOMnU$2ZWrW-@a3}T5k4p$*kcbD|H^k`X1o{CXgZ0-)et_F+N)6o= zQYlVR<7}cj)@ZKx69?n?ND%xW)%g!k90zJ7_^mH-x0=7@?lFe3`w;CV$G^)ucN0a< zqw3)Y`5h890dwuPB}K%Sw_Bqii=@t$_<5$HBkxsa=7fzo*>t06Ve6)uQ_RZtjbmE9 zUsRQr^W~DgLY;?EEd#BnEaP<8uHGdMYff(!Z~G+=4Rp^@3uz-PVgzGTn7%B?$%AQU zbaC$Y3x*b1k=BPT0A`sN*X{1|({*>=jk@osc?xHzCF7D&kB0(=4Q+|fNk*psam94m zy@R)JYfw;7DDx39p8ULbnZ8IhXZr4e7{&GLqhA8DQv?wQuCMJ-L882*bNvcYOJSZR zmS1dllXzZs@w_yoE82SW{+gPnaXI~#xo*Tb0Nb(#rv0F@S4nIEhzY^9*1xQ3lCI(^ z1I&g38KP`#<0@Bm|Gw?4IY=D7o55Rq=QjC9J@*MxMsdJP?7N_ByFC|ki0!>8;k(*Eii%5~-Yt3EG3*NZ6tCp(o zJso=~5%`V;-$KjFcFFpR(@08|i|ZfdoLtYXSYvHy2I(}n+&V=A7g2BWM_i3ohdANz z&&jDXcn4$fobRoyWE5}WC4&ZrobnX|| zpZGY6kC@Z=CC1Xibc9q(qT0(Hqe@fp-9dTryn8Ggt@v%NsCIbO41_kuQpV7x)sT2xJob+_CkD z_<-^r%@1O!J9w^T<&#Gcjmzl7WHjV(1JO1v(#@(J=szGyvzIm*NwLPk>?edI42rxj z+<-r1%F3sDcq<-WanTrnHhY*ESyT(k<9*^PHfftjZHZ#;8E@$1v%F75J_V5>_0Tn; zIv=NCqq{_kM6w-wI~#%5PAi`DBB%(pk1#j9*1e-`Y@O19W?>TL^DpA|_w`mRfH0f% z<(^D#%e?zqv9tY;zIz$*`)&bs0ab%J_|RbY^z;c;%4a>Lib=!o;iTrrHI=Jd<5XI^ zjm+LU>-^NPy=ql=<{?I8t3pOpgQDMz_vCF~Hk&=(uUEH9xH`jf`-@yAE6&ZCHoZvW z))|imbKwCY3CBq-6$Qhs&gB<62NEGQ_yc4LCVzXrIDWAaBi}zmLiRoY zBA$P>^GE`{;=H)I&<6JoU48fLb0fL6THT@P7HPE=5xEmA{YQfoZe~MC}CsZTx-Si&F4rS@8?8UvPi_@2|+`u zQ#wy=vrnyRe4N#O%n6e;R8iTU@o27tO+A0{hm=2`vuZKLNyxFGCec?4Z4a2*dO$hj zRMPsT>=DTVU+Z3cCEvVzGpgm*!t}gdOB$}1(m5SZhiF80BH|w!kllFrohx=Zj5l#e zpWRE_cJW&6Z8aasLfcbOTF*Z=%T)85buB(WC_*k&&Qim-99An~@yTe1AsLJI4V9Qm zsiJBc<2%H8foIGh>+t1qL}*vD>{`d&84jEqFtg=;VtD5Wac=rXe1=-`Gr$M z@P%<2PmEl~f`PlBXBH=@De^lgmRV zp7;l4%y!s6UwPPV_O+wuq$lIP>*v5HSL(qpl;g(hR!<@FBs(x=u0X+}X)~9tOC5k` z1K|xh(NaIT4(BlzU-xJi;UJ@EFTZa~llqh(?lRW}Cg}YrJ+P*;`cdEm@>G5Cy1;9N zMxd6I9*C0{`_+uK^2exD$I@*WSrcwo62X;9w-2i!ip&64UDKfJzqMs7iqj77i=hpq zHSi@3B*K)p;_(PkkfklACMYaVF0Yrr=i_k`04Q1ig{?!3op?rMXCV7eh-Mh`k7gpC zGz#0#L!SqpP>l>&iBUi5oDp2ZiwwG%#E-Cj$0~OGr%ZhLC(X1%PYKNW!=bJ;^f{lh zr)bW;xXG=+=XB=JDpH6)la(u?U!Pt5{e&~#THjOEUX&|`tnfBH=X;A3eFFbLyu0WhAl3Bn-QIxiY+oy9uU!!ai{?%VqbEn7oJ>K!uuicb(An zire%6?^qcL&X zj@vT+aVLlfPctV!9(SICu7TODGTr#dI#>4;-oKfE-s4DCIo0*M^B0-<$`=IvDp0C? z9EaRtv%TPeoO3&@OiRUx`=bdyQ;`BU$s?_$I81JkMCy>UEo5ImKcu`~d&u}(xsC0h zS0v^>GO7KqpR>j1-UjD{!8Rjuf~yg-NGBO;wL4NB=M%YAdYA)EZU@sy-v52YTmlt7 zn5*|e_<{Jo@-jJ-Ehi+H+&$R84H|LkbOx$EiFBCnBru z+XObe8)VKZONPZH-jUtVA(SBX2HbS$GEVp9ZJElYbFTet`bWscsyCO$uUanbVg>6z z2SIXhbr4;I>_Z2(OfXm4wde(^7otnYVIZl*-Khi$55I3@3Qn(7#}+-;!fp}hBrd3l zBWj)96VA{1BxNYsb({WP8Z%rj{&$ppEWlt7*q}leX$SVh(suHjmIOnvQRRHr!sGvl0-yH< z!@k;oXiqlen4D4`1Bj&n_L~5@R!C_|%dFilFbw}n>gm{LIz}Sf{yVb$Uvb?y`Dlf7 zr*e=uhj43Jl?e898L?2z{b;stnHnD>nYhf|d-?fAF6M@O-mpHyE4~k#AA0u>`W?r$vGBNLpab@Yg- zXo38qk5Spm|2XW79s6vMPs4q0pP6NvUO{~#FBF(I1?GI_Jm=`=h+3pSccii(iLsHd z?Tsp~ohG0lod6m(f9Mft;vXJvArn)Yc*PB0%=p=@J6CM!$!0oZ)I~RfTGWP^N4GWh z1BMb1fj4B;{`#mq&u5zhDwyWydLdKvV;(IPEoT7r1fS~yS|iFrDw+DLn)S4CJYTT9le*yee+UbiY(d7X5Az9uo`v68i+A-|Eed* z)du-&kmR(v&2LYywUxW17JugP9PxwjXRGs=#ZpZKQn$Il+kzv@sF`GpkbS?#N{Ap@ zaH{BM4<54z1$_oD!u_zNH}|qL_dMWKDReYN--Qd(r(om;3t~1OuRux2ZRW4vAYy5l zBz7@eDsP#}Gn6r$&MfrpT=bw1oFS@|b$?dkQ7MRcf zjowpho3)5LsUkM5e#>pkt9)tz@fuS&X*HFW5O|5seCIxde|$e&J)LH}g!G*Hq@g_- zoy&4$HwP1C5q^GPDAqizabyyZ#baEk3IRjqAuOc#a)fkt&uJ_cF_58-tF8mT5DGL$ z;GWb@+TuoZ+xSI6UpDS_HaSV7%rvP|%%3?%Z!RSyISvflNEQr1ru*=nGbAmE<2sd8 z6>?y>WX(1Jt|HlbV#dxLIM^mJdxUdFQdF<%__0k&bJ<8zhMTtV(!7H(N{0Gm@tkUs zNK)qj=L1b|9A?k2(3fIfVd7a?`lyM|HDtKsq$^_jw0l65xaV-~_o; z^!QtGheU3sQcCDV8VE=k$wmDE{1ngp*dqZUBqAt&8zO~tL zWw+fK%l9430Z==;P`h}AK@ibN_kB6#>h$|DIh{J4>zk9Kv4{RZjmjR+{_Nm+Sh@e| zs146ZZN8z8(}NC;PB72p%a_H>pn#hB<9U^0-d@l(xf7dB-Mey|MuiRr;EgyvBiKi1 zEGtk~b)Y&r#06X7$JG0OvN$E9qlP8Mc&d*#VucCLWJJk22RZ0c(Xc?eeDa2F;YOAw ztIRd$(4pV)>tD!hp>4mxa+!@OIgUvXQP^4W0P?yi#uId!qN!)C&km2dIrdb|n3r1X zBmKyAinNrr8Pc3HH7#;a$Mo63w-;~x+0X0yLP3B~%=2pN5BlwXJ#(HFxZrCLzh|2Q>xtcl2oMB`|57y7u@UMv-8)rh}|0zP|p#@cUr!C8}GB}t03s1zg9drxoKE5m^>`-82 zJ&8BM!}g6`7zC|y%-T;r$t<_~RHR8gRUhT=QM7s*msQt|vgAq9LAFO=HVRFV#@#4p z<}0FA(FZoIGvEwUicwD&5Kc(Z?pX~oSA>%-2YcF%Bi5W6{%nZN;ElzB+C4gDwBaUG zwm%k;%zsOL(>N()3vzC_c8Tk$oG0O;aoInbg2wWJF=}fcO(p$$7qmRgp=ZhJ(_>9` zZ_XVq>hhNKFT46u&?sv3;t4QY$o|hq%!0RPs~U@|9T@Uu+6hsACV2LxAZF|mcK9&s zA&m~c%#SRp(jjX8?-CLX8n*6l4D+uFMZdOoIYrrc9)FSQw`<;BIDh`4r?gXq%x%aC z;TSK@;0$5mqL2>p6M{2W$w?N2YFVyCVlO0O;Hh?G?}N%_q4s@ zJo2%4Nb5(2MirVvdgZ7a5PsU7T>OZxvK8)aizlLypz)O0KpNbo#mh-5V&Rh0-ge}@ zK0gAb7XO>2=~gwySF!h|RXs$t$TnNJxV{#HQ2U^=<;*^tRgk1UO=j88O~F@dPJWO9 zzvVXCP+0r3GKCM(UsfX0u+)uKCa>M4&OJYTOjmcO z$%||3y%X)y%Cw$@sX_>cBHGn%Lx*IJ1Ml486|Ha`X>A$DnWCcahde#fB?9>z^DPHF z;4!TQ+Jw)!GV=1tT6foD$OE;DH3-Zx$FxKB?&WzzK;tr|Og3=(P%2+L1NY|>WRFU} z9||V;^BQ5s6ERI6ii~3Iw}i&eF<>!v%GcnRk26}Y33vWwFLFhYSriIxt%Za*^5Aj_ z*|l+6DJO0;YTiwupWG~&Uy?gTzfjr(=uiX*g1dcEdDUoRxRfBjts%O$BFBz-$%}0pQE)|-}GeV|KN;@pf&oR_x>Z{ z8Rcgn3=7OoDbHi8%!1RJ>=#60D}S*3fPkQ(BF-z4W>%q*Kv-^f{J1%3LqT;uES%{E zaeeiAv#ub*=$_`*jZ{Gap<0B7M90wd@*zebAfU3B`;XX+pLN4FBnQynF!>trMLq^K zPo|rPM!jquj+-x8_k}$BK{^rgUred4Np-7rq`hsL(L08~#Fw}Tl6u0rmj7SA|Np6? z{zvHgZx_mQ@Mjvs-+1WLzjdy^y&*vMxcV|HC0a4kr!o75>4{>#d};t9+$~c8&yuA4=_? zwO}3upkqgr)s#~8#|Z6uljEC|&Gy!U7Ck?fw|9Z>VYGhZ%%afhwRJ~|4vGzW_veOI z;00E$m8=f^?thNmoI)!0Y!Rgy<+NyRP&j+hQP}}>ervCqxY6&OQR|}3(+jVf@;|y^ zL9DF7;7z{Kcz7{3mruHlb-_%9KLHv-g5*^aS<=EO5JP$~MKM zgomGJp(0m**bI#>92_hiJ1Tgo9Y5doWt1`*L&`)10${7x`Gs zx(?|YzVTfc9=3v&Nu|Q4{6dFy2-YG@Vo7J#xZltuCiI;*JXZNiB+WnuEBlDv85{Pp6kx9ZCo(oYi=7Ut+ zu^W(bMv0O`ImV7NDOM$xs-=d2m6G!}#~z=Kg;W%97Uec^tp{o#U@@ywH7zrqWF(xA z~gb@1ecDChK9DURk(`j_QAF%)Y>J%mQ z@mQwPs8e1`#YBF{cc0x~Mk@n&rU18F*w9fne|-OP)rl5@(BAIB>PkEQ5sPgUg6K+f zJ!Sln13fl!ifoiH1GBuP2i-@i=w`aM$Ht^|XKLA2B%PEj;uD-XcXN*R_FXjfINmaT zy(N(wF|;|`gMH3VOSEcn>lemDQY4MqGJ(Ypo{B>dCb{dOULRZI_G`Ksjtb0N9n*iP zMxex)`%SPXkiufQXW@g;gQ)yKx}dm&1J+RXeecKHStYd1Wg#?D8ZGT(pyONqt}c?460&16O|fEQQGBwT2N(-~IcYF6_|MCR*SN z_@5Dah2hMQ=5UE zt?54B*Q;Q1sTsa#wa6Hb&Kv3C+QLNN#=I^Ns0y7qv=x;OFi8 zhv$g}VqiW9MU&`4bPsgNI{S+&u21mCVT+b+N}FSa0kmD?l{juS+V0N4t7*Ob1ex2` z^rX~Y)aVXfN9ecmRr_z$<1zl0u1Xlll1L*{$J@lkOlD>$q28tugE_!CyzJge6v&I5fA5e#M*5|Z563)8_}Peg)NtQCi=Z9UfTMw zfb{{+qc8E|0PIgb(Wiga=fAs5Cb3xz&O?NKVDDR2Xu?#{sEu$hwlW6zjls@w+gk>I zcrY%*Ud*~N$B zk$e8~SEzkrATc2&X&zA3-C$%45LkAv@Wd9I6vu}qg$Was92soXrG;;S))0kJI{^Ch zl~dNxQ=4C#05gJY+`IsJ6t!5!uOKQ zv6r%T%EfInZpE`nmZG^T#oHNn0YW`Ur2sWY`*it8z4r|BpMuqKoGYDdunVbyf zzhG6gPG_x2nrC?tw8~91{3L7muZbliRlMB&shh%hLuww`*lPKTxf3kw{9NL$&cs%* zj96sVi+@3=&$F*8`UE}pJb|83Rwj@jcpOm-eyc^c8N-;JYj#mBpA04uo5z|vm^5*RSEqkWc>OdKD*_1 z3|2Z+{mZAwGB2F8aMkjBc|p6nuGSJ?xp*y$lsFUX&xq`_nZsZez8XA;C(K&YBbz}^ z2@A3atsh4CORadU{<>*R?#Ja6t1L@8Ma2Ds_?#ZT$})o43Litm1}cam5L=gYn$ zIR1cc9Sn#8ZBsG}tdJRNy7|MXd(z#>U*g6Boq-`&17Fs|we=5+`=IpOz7dhMu!Wk` z@DHaUl=p>rlNXA+Zl?fiWHXPk7A;J>_lusNcf@uLSqfStgZEqeSm#$c@Pr@;_9m4A zRmlCXt2?Lxn=85i^dM9`zlgnp0_6TAOdgWCfL3M#x>n{7pJ(50O-t0Sm(<-Ut#F3`yVXu@Lj$owSeMU-JF??zBPB}+kn zC%bdQLgmI?R+dhDQ%C%~997!oS+II$8K0@I*l6U_b*pc0+Kqz3Amq(CS0MYkJ2nLX z-6!-<|8>GP>-YL&w$38Li*Ir~1hX`o)P1q78z`Z!w#D#bM2ke9X*U*f(|D9UC!UY6 z3mHj+7Xt@4TPIyng8!6F5uCStFoH)}k4UQoB#nPTIqr0ZL1aN?u~3qwp4?fpbG!mr z7ZRl)kwOl(5N@5_N3pz}9fJi>X5)a91?*j9*NEqa@A0ttzyoghANTBZBV++%3U+bT6uHNw(Z?)~v-u`gz-P1ZM>ADR|%X}xkBAd8p zRbCx;?rr2gZ8w*OUiAJ#PUIl>!wu3j0?PVwpGBZlNkpgkr4Lk&<$6~I*2cRwDLO~$ zP1}4QM?C@^A`nr(ZUT~b4}svST@ryF&+s|?aUu+iin-xzV$HW|6Pp@85}L}+hxl8$ zbVA6SdA+RrGW0ikLP@=;#_rku%5#j*Q8uhWl?kyUeh>GD%(xBq(-I5ui|`p>I&8EO z!d2IvVVVm&R|W%qqyh1L4u+p*O!{J6Mle0_OtzG#J3r`NlC9Ld)7b*f=Y4t&YpTQg zk=Cf;vFBc+`j>~b_MT$&T;ekO1o^`NfTv?0_$3Y|&AC4Wrj|)-^rnkRwp=w`6y!QQ zWx$9Bl}!H?fu3tBFi8xC?LS|sW)ZahHeG3H3{qnq>=*g+p3kD2#Ns&^^*v!73>kN9 zy_55!!m8+)RL3wzE&taBCK&JJp7C05wyNg{+BKrd}VI{JlQ_VFJgzl;- znnM3o2WzOl=)blyjoYMCVZJt%Zk#hxLP+0ZDPivf0XL#PI5?0U!wRqez%~Z@m&iHT z49MrhRK<7Ntk+QRLGVxS8u?uu3{qO9-39(cUs(_Na0+!4pIu9azV!DuxBvgu(iZvQ zq=rRD9s)~xa~B!J)H#tHt-iK?<$EPd|T-XL2k4mo`XB zmS;y}ChWv{BJ*LdA|{Kq(Ec~&@k`@u54?4v>79t>w+Z{e$UVFo21TO)yEfA6t}h@^ z({HJ-KTb5Ntn_Qgwj&c$^wa&EU|(wl6KeCrH#4W>;amxs*#()v&fB2;<7J#mHXbqa zQvm@1SqRo$5N+}JhmC>?SG>~~`2t;_{OJdEFK&!O%1Px5P_#LZFg#L^Ctj{|b(~U! zXEkbch8Wk+*fH84qY$mbZwcgvE6(wGUANUWF6AM?QDdO1h$vB@iqff9u+o%Y+^OZG zew3oO1KZvaWiVC)H(<&r!_|!bHKNns#!n_h@VmlXBlnhru&3eX|wl2{KOkQJ3NDXc6wTb zPHA}~x3ca4v_|e?$$3R?=6Mw&@yZTRF^n+5*fS|g4mvfbiNvAVaTPF=E z#7V3C$=fGYR63b9>60C(TUkRD#2IOjx=*yn*kDJ2?lJlAbI%WqiDB9V>lFJp^Su;^ z7d|W77nA<{NHMVKLcLljG>X?zbl!~;d|iP$^Rn3+*>MV)>r~C6dPe`pAAkR$@bro1 z_S=V5g$tCER=;j~kX%%WP1U(Y1rpKG;yii&(h`e7K2!?$;}S&zuP*s!St}vfd-~uE zeMB?S_!@p(k4UDd&a(U*ADe+*r^*X44cG~b8sV8z`%tCf&Dq<7ar+`Oz{g<|#Z-RM za@~p3ou9VfFnY36w-gT=hEuBS&*rif=oQ*m-=yRVNo4Zo$&JrIz(Ps$(@rS2@gh-(T)gP2p$roPCEIs{FZYDaoXy zyXpfNKKnF?##Ohj0$7xb&TQ0NC!IR6U}aMk#Mm%NKIvO*I@^8$msdC@1w*s3+8VCA z=x?Z6RUT=xupwuC0Ah;hs9=X;ug?6r9EaQioM~IADQX_$`I~2mVu&Mfcg)z#)|7F{ zUBA{>q39rm2LU>LoEwVX*|TtJvOTUK4Ub<4D4B9}R8Iv!oYCb|{@1|)Q-!)dXF%2) z0#cx3trIlJ8xaI2!v4>2=1X^BFs^rmX90|nz+ie}N&P|mmj_{3zK+jjP4j^1nb-T1 z={Od(*KXTe?dL^%2Z)c1WEdgzX)gl5!V zfSG>$)wxXZ>7WS-^PY{#U0TI_Zq>dNeHM59wYm!R$z2w+9cJpH8n~PXr1(l_h4c>W zftu%%*`#?KY;=b!#3!hxSd_~=h`17-;5CESiPn_SE!Q3T*^j(V2IY`DwxrPs)BDkE zXZ!`1hpe{cy_TpdNVPXvfMJ-K+H0eHjVLgNL4J97TmJf`domcukR!!T>%HBaEye$W zu~({tJP6|s9q~1RhRu%Bru-seNP;&eGq%T)$%O^UJrtGtISp29x+! zH{|X2RlpsSdPT%ZSlQ#f%=r`5z$cIwOeumR@nD&Mqt9E=S)&c1SKy?*fGGCa~J>SEMOw#tp z(3?8`QmnnaFHf#F7+NBA4E(1>D{xCC9&hFRVE8fmiG1YTyuSE}Lz&HA=H)&fa6d+rgby0pMG~f@$16#|C$UOx*Z#ZA+IpK)xA|CG9y0ADe~aPG{A}sK2DUNqe1zn#yd5cpPTVTVTb_r`MOs1vjt3 zYLZRR{5Xv_ASy+8mqaaBvia$*DWXzq1v#OTEMHor)tPXh_!X~VP!hyGs7gy9yj(V zycj3DWCf#qv(lQerLd;Tl)g){doco`WgH9iJ=R3o$763@`I)vm^MQTvpZdrYGsrHB zq;A{V+5P+1maq=tE5ADwJfB#>|EO&}qHW>UE?JyGLx`0t@GLA8S$$4|-@a*ER#kky z;lJtFTi;Vx7BH~VTyv*)KkwnItPdD$GS6qu@gC@VXqt3@Bh6cI!hC{}uYu{8xLbUJ z?Ruu}NO;1%Lx^^!tjcS9zEQF_LDMzrfb%kkLBp_~c;Yf!#!J>&Nk8oU&(be>_Uhnj z3`}M>Az|R)u%3~Z%2+&Kkpscc`E51NG8=Vy$V zdAbhkkHW|p{&-HOvKjj;c6h38e!wHnE-|XZf{GrTBx6tb>6IOzu{c6wmi!+X)skEo zefbcdKEMz%txdp|xBwZ}UE7}vcE{(oPaoD8gTxtIDVS`z zwb@?wcB)4LRBp(ISU^R4sDB5mwLv~Kl1qp~s%KcF8y<;^dwCy<20q*{wiqYM^hY_F zoqy~EJv+u&{gDqZ>UYkc6K3KyCI>hDwXOEhs2I`(p_dQsH1ow3(@Zd*L|aG+kMFb3A3T z)?IGR%}CPEh)zp?Ijl})polIL^u$pIbISk%i(Y!qQBo~^afR4wJR@uWzI!da_{6R2 zo`!3zR5GTEt{<>&QlVMZa=yOwe!(*tp-s4a36J6u<1e_r?SNX>Wwg9Ph7y(UI6abCEuv+FHW=S;b48Yo^MhfZlggI4gB@n>?JwrBU+~r29)U-Yeyy-0WSE zOS#U$o0T}ufA5V|oaeZB#n&WZ{>J>t0Ncx50%p5clJEWSxo=gu@BFoCh0u#xP>QoU zFPYRKgbIg+wNBUOJc;rImi2oE3fv}T~C z<2^iHd@sO@hhN9nm*Yr8t5c$K1}`HqlTPV^E`ir27=HFQJls!5GJ2uxuOy1KviEA& zl!ba(OPE~xNr$~S);h?kYYCQf6wj65TTb4~Z_Xtpxi12)uO(GVb$U2n1YX-Y82Rg1 zC}84)+Xt)4yJM|UruUdGXt{m0-R8pn@@DSZ>hEzM-F1#EyTwduk;;cSo^Ng4%BJZh zlkq97Jkwen18mj4D(z)on|-6~Zo@mTo*AM*>51l4E7aF{{w;V`!ml|(Nd0f9&K zSSX+;rg+STerh?Ecp7bPGf^BdmL{WTy{5#%tct@EfbR^W5H(GOzF}TY-*x3VjS_^M z3)@#O(Duywor-gfT<4G@kmwSz^E5yuWnJ;#ND6 zdizce<8q{?Prny+c`)E|dkAm)-sz>ta1`WIE6nl~Ly#>s{$0BGDkCTI%lzn#i=Ukg za^a6N#64b^o44{1wDMRYKkHRIJ=4mP#?hiQpC145CXo`!?2} z9VIre*Q58}or@B`U6Qti%KNpWOg)hkEUrpk_STGE=F;5-%<*ERVMn|?tInq>xruVJ zcX|R)_k(!@x^KK`R5DUQ?iRtT*{dokYWRFqBbXm_`w zRzG%um%pcpID-YQeQSeV-~qZpJzJHqNs&gibpz6>LDZD&K7zu=s~INFZ}wEp$lz~fZIZdAs z@g2F^jebc%-W976H@-ZLtBhh<9SNy2yeyhq$*eB+nUCJj9d*oM ztrgt0SHrHb9G<_1-0<*ZNnEiOo5}FAO?;u<*dB-I0`}JvPw&CcL^t2s*GkT#SxfMr z91Sbc8?|0#sC!3d+q5M$GQ&rj{S5zM1uK`0yep+qZzX;1s6ikclDUo!rE#ei$8?>i*N`;g6xv1e`_fQ=A zTWM|s! zekCD&Pt0~0WAi5$LCSPIl5SUVK_138&->%u6(-2<(Dz8rSPqnoLhm7xH%0o5BSo zo-iW5@T^(zS=25Fy-)JDw(-!CRoiJ8gVUnh=G;Ocs!n14YTA-U#|k4Qkh z8}oBWj(17Ag6YYROFC71Pnhhxcxous4Rz1VWMLGzlJeAjdr9@TL@WDl(s`zPek31a zl^Y&2pOk;;v}_NTJ^Ic`K^JJiev<8 zO;YK>JF=(|`_D`;Ht5Qp!tmtkN!x|V1H``kwVDljm71{`<|dt-mCI8B#1k{0jgAX= zr=bhl@b40?3w4&fwA@3%i`B~T`RXiN; zP{)x(b1Qqws=cJ`s)6<%*A#NBI6zbGX!2^)H;rD7Tm$wsBWFutK;!3`G+gC}u&q|~ zYn>@Rf9r0y7eiLNO*6UECM=Rw)^}dXML!{cs;45$)USnqLerGDi*coN`1-n ztg48ofu;N^AwNMs^!3p~o7fY!SnjK{q+Z$pis3z9rJVIAwQS832TNe-LEO3UCEcRB zc=9;hcTMi_PM-GpyC*un{(`YX#p$Y^>~YFRIhb2RMo|Wg*&sSAcGLM>;tg$9Ur4GL zBwqOxj9(NMr5dhb3c2;C|iDc?57pl zOq8rtI+X67g3}@VI9=%G^P0K!yYFREZ?W~8jRgHHqEpEUw)swTZz3#n%-0;ZbrsFe zE;Ji)N9$k)YQ6Z}ulRr=l0Q^oEc}Mmi?dw4Q$#mOIbO`U*NRC|_1BwL6+`;!OP)Fw zZ*zWzI1JnIQ@6vS4cYVYIEZs6SPOA!B4m(R;#A2n7pjRt{WO2&QX}8+^08+*AI*Gt z8_0Lpc{pwBwNwGA!&Ddd``hch2; zdLpvo^QmueWu06lE?XO-ki)edv05 zIl}fj_eq6nsm^)%VzJB5K+MXePQTSiBWri40WtckJ%=dH!-o(56V5?f_Uwx{PEP9o zJ`fM#OnA`g{;t~Z*&Pm_`Zd_AF!k>kRlokol{{?^vCjQp|B;_y<#?@PJq(Kg z(Tzqd@!!#nk(oL4u;}r-KmQZmI1xYS?sw%egj%P-btj5aADuP6c`H)as&Tev3hzt# z^&?ZYh!v6#fq`J8Gq`0$0=W#n1|Rlxbt!0dBnxpOU_pW^*=+IM6C!$4DUHfjD>rdo zdn<_)j~Pl2CmlfZM7YUQ)hrEsjC9Tlo0qa0`k+(>DYYRSx8vN&f!+ zh2anfU0V@q!p=82*vMeflL)pZEp7k5x2EgXG}xN=7%hJ7%s0Z+kxOzQg#QU<3Goob z5&x)i$h2;%-t6`O17iO3N9iy!uBZ7A=;_~!-6UvzNx|_^T>IX};%O^|Als3;WTdGv z4(Mt)=*q;xQq)bc2L}7J&N*@lVZTO-ki#RtkHu9RMAMVEddJfu%hML(d$Ase2*-uKZxxml6^Q2F8+LpOgE8 zoS}jxzOF%5N)A^bSzlCuq-=R&97Cgw1EynD1=^9V}DhyJRyKTlk*Fcz5M`t=5;xeK9-jUsiD)t zCL`oYMJIDnf5*z5)F|RTts$4bOJz5*$J^T@E&bGf45pH*X%T(`W--k<3MW!wA(~1G z|6LmYl@;qm{Xo;9Xq^(``d!@|V`H%!q+LNbxXCxTHY0OL!xqx~@C=3M%N187_g-E* zj1SN~IWN5(K}|&ud)l*WqyvMp1qElSvL64e*gT? zV2)9?`Cr7u;4yf@|9*-zNNiNa*)=P)GJVCRMPQ<{-Jz%V(uAM=OnmgDChLoT@fs%i z&jvE|EB2^s{0TpFe0?I)HwIB6T#PeHFGGx%)=#Ci<5@$?U*imD`bO>^dbBz325O50 z(aVMgf3@30BmUn{Bo}c%B(nKl z#PO${+cf0X@3B#!4ykI zRHO|vAXjJXXbhmu&W(Ik*&M?i)_39}`LvmDeaJ<{^Yjw)8UL&rWi1g|ZBu!y%Ifwu z^-L*HvVwmEACJZO6&H++jSUcdJpr5pef8O1BAZm-W5{!>JI!%yB`w_`8&~z{3^X~s z_k(aO;*zAD;xR*yg~Pktl>PgZ>rD)E)laO<4K}W>uE2qhWWN9Rz;DiXgTvYYGzOkr z?tbA=@l1(kjpeByC zQg04HH${t)pl~U46t6UX&|=v5{B@jaWuBlf0{9ZAUG6_$%Ft|f1$%Ni(f_?C5~?Ai zaiN}H!+tWX27%;U*tYG^L+xTT+Z1eSnS@@k=snrK6XV@(4c}Q&%L-VHXp~B6XG%>* zbN{`cor#h+TrkJS$KZaVpoihtA)P$9r>0lxw4mQmgqgDtHZGiY`uy(OAA zw|C_xkha*rFK@m7MDwbk0`+Y_x`aCNQsi{VJGomO6`87^hj2+TyQS{*IH&1Ap9+!) zX!`#)sHWqE8`$Ui1AJziBcz7v>`4Jaw*i$1;3 zxN8E2uB>l30(YDSG>l*WM)Jtm^wZ}h^`0!0XWW;fA|i$V zsDkN4F*O&=Xr7EwfkA?~p9qx6%$t2>$=8^xnsANc_5Dn{r1}!n+L9aZNEgoheJUTw zk1XC>k=@j17};r0(vU?vl~OfFKWG~RAw|Jeb<@wE7O=O=A_SPkuG`M2g2)zf17>B=diHxHE}QFeK1z$J|3rS_P+w`dcFf*=j$aSBMTVn|H^81b$Wt6oL^j>jh}cvphxOB z9ePX^a@pq`P*BRU9_zRS5yy=77(+!awHVzs+VJz_MGRw^ zy7c+6fisP^)lAq}_x}D&`lx0QO6|@0ZJ$1|Rm*j5zW>eTVcEa8EYY_&U8!P9moTa6 zhMdH1C5@>l1cK~P-L9a(TNO1mJs=+|7oDBL$IU18301=}dNbO_Vk37~O-jKuABUoWD+!HS@IJ8T&9M1d^xUss5jaa4X00V6L9F8Ve!ivd(Ie z@0fF{+6-G)Pp^v+7d#*;iK*5>?Ri%H;E1=a#HS_Q-q!Y1Q&V&0QJ~UraJb&i2$al( zibwI84MXa%?EOwp!4&kuI^vNsE&k&v#S+!P>K#5lK5Lt(t{)RHQ0gav$mz<)gVo>#6+Y=>8`97`}djEGG=*Yi#z6~~ zbq;Fk5AHCErRwnP?6qS|JLZyKS$>BjA5Ifa*8B6s_w!}56!?4Q(igMrw|}i%rpu;) zFojmN3Qn!Y`~&mr6csY7#jyMS_?4rx-YcDf7s&_HXxOUFe!JrmMV&#tL}JF5F*ZF( z&r>4OjEL9Z7Cdh)jvtHME)V{7Pkpg(g2SGMk8N14tgLhz?-fFde$6d__ZAhdna&f4 zZjy&%^j(nxNgSkOE_>f1U{HOUsWuCiO-@L_DORhMCQsaGe^}FZZ?NSIlMLzZ6==3; zu@F)(Ys*X;SC8|JW82$N_yPaiT-n$T!Q6Dds750Cf!0_4o|rR1KTp1Rm$KYoZ6Yqe^UhjE79 zyE(2_8U!DE*i%Wj-eZ-vXuc=c32_{@Kf3I9%@ox!!qCkal-=4b4I||K*Ys^EW9{G! zr17Wau)*qCS%v?Okw!k;=SuqxQx$6_dwYA!0k9+MW)=~XCfjxH^i|>*f7rz0j#X`C zrH~H{GK1wDM>(GpAh8wpv>=?>nfN3CUX(T~p=C{u=E{f$&^~yqhuI!} z7TB7~L!CL_`s_!@wZxi8;c=U}KAb_LicIL2YGbp-?E&LAlo-5pjmThgZ9AaR46}>Q zu3dI_*O!(k%coL_u-GlKve}|xT_F2Od>|oylif>e;KcEBT1x0thU&G8-T*dW51Puk@UiH{WK9F&=EWofQF9#+EGmr zA&oks?yY7M&d6#HqKU;!1$m!h;g@zx%Ws2e#MctBB9VBk&r7R!zf*pL>bp1~9aXwh zYk7Qf6;9-{vmA-=8k+TW=0{Rnb-Y5+AM2zdnTdC&?KfwgQBJNpLqAA3FbKowHwHTW z@f~&(wEScyO1qs#GB`%7c}vINmZ7tD+jpwY{5rrOEL!=00y$hh=q&CsqGn3Jb9f)o-~zK z5f(yh*^|o~=xRmOy}Kx8NEMbw-z1= zJ6p$z8u2E(YpdU^NH&Xe%$Gk83nvKZIFxSl|Im;X#nkSpGKET);Ioj;sDhe%`Sn|~q|;7uFbD#kX< zjd#j59fPpxQ*%QcA9Eb?Zcdgv{DWr;^fHK_l9K?_lfUD#&33=KwS{-T4?x3$+Qa!q zY~WaoM>2h1n6KMq!w%x4J2dpi(<=qe22WMFFt6lFzrSqrk!^NRb7nUSi%Q|jQrLW3 z5VJdq3K4}ReZ`_KrOZ)?k83g>wG+uzpMy5v-PX3n^o?J{=`h51Urk%@bn-~YXNN;R z3+e3-TZiN7K92cjsFrXfEHksq{z=F+cWVGDJH?8adJIlivu07U_!7>lI_hvq8LwIn zG~e4zUt~{9F?V=F*T(cR2|gBk$4`i5BZCV0Z!?E@2)lA<{|-~qrF`=B-iwGQ>Ve;4wXn0FVqUti5 zvB0F|*2lBMN!VyEhwlUIYI?P_^_07c?eq?Pt8$@ob&8F&p8IoHJ%XYu!UM<%($eH-SL(16yyU5vgp|LJ&OwQ&*wG!2(219veId5c<4Co($`VWIP-8x z`u@( z$gMUdtG}5wQLU77W=1F(Bp=CTwuvn}bfHymhUr+J95FPfDtsP}IqGu`{lyPgW7PB@ zVoovoIPZ}3wXDno?@oWKRy>IhL#7hDu+t;)M75RQ5dLImA{XY7D65uA@}0F*+&uF< z*HUAGwR@AaQ*jja-eRqc*m0oFy-mRfsn`g{839{~td?6~&dqeNW(Qusel6%;vpZS# z|HdKv6$bsvrgl%4mzPcS{Twg$0f%r0MrOS~UWP7f5Dc-lb8zrj9@9df2YGV7XDapD zP@0w)6Cr+%yQbcrw6sY3S5}+^2K-Px%KR@3?1E7e5o?Osv+blKhHGMH_*WhLUZcQ@A0MCoaQd8>@PLOP5#<5V>w+ zs1&cp+7Q@hh#YOHyNZK>VPRNl>kSUO|GFgcSQ?N(&{o$&?JR9~k#le;L!=Lncg7pg z__)yhMNG~OSbj<1vy9xBs**O!$C0U0N^rl~&7(;|m~VAV;liPG;t37KdoxWPyf?;b zHexhkJ{C+=7R4taL|^xSCY#U9hCyf0MmSZA{koy)^A~nC(s~mOcdasnw-dBbcx~i? z4HRDYW}A*2=r6-iUrO;;UPeRukD=f#M^$MU^)y3IAs&n)qtCC4>n+E>PE9EvUzb3N z;{J)LfwN%|?~zM7Ew8SY;%#*p{K_h_C_fYNfu03)!N|w9BG`*qwmK~c=*r!QPV7Z? zUC%r04!bEn+X)Gl4J6DWbttq|hNcNc?%2%|$r^n!ZzzvA!`d_BSA8Tfcyd+kO06DK zuR4gzu0PT|b>qN@cRT&-eWBSS51(2KG^Gg4F@`~Cy2+2qU~FFrq6HRlGYYA%WPFuR zpFaIJ3W_3^2nu^@L7^}CDIpn<@U!H}eH}3s<8H67bK*uDSPWeJBKVnW9372^tEh7& z(^6f}hEAv6#1G9!1U$go9pQ!lXu+t8w#8HxzPl|!bu4AMg1edXT!EScaJwvuL9W)y2TODW8i zj+=>7Rqx>wClzyxlC_`iTvIMMu7GFs)&z zxgv>(O$Vv0ha}ui2wo@`6wH#B2DhGld>GDHG0BSQwVs)V*WNL`FVuRoP5UDDCca`v zV7ev;3;okusVS*MNA+Bd7_aSdv`MpANFe^H`&NE>TG5rZ*$4IznyeMt{!P(HPi2pLFB`lT>U-x~mpRyADle8v9%te$P9~ta{t_Kf#PyRq3 z?wZvfUqI8jqD1U>#%_}GW`%JXg7eBe1;#ybe+y5`gcVsFD{NcA!}g!Xu|rQ&UCfuh zpWES~qoa2kMTO{+c&k@oi?g%ve zklIchb`>(S^m}uqw)lroPOXJYzGZKm z^^B;UzF@uyXpp}6w#vm7TW_}+G(@tGnDLKa9G2KWWy939r68-IQ?2?G9UWb`=R16+ zYi2g}gAkcgM&@d~#2?MZX6oxt8%FM^XhzR2@v0P__vDa}#21*MJ4{cXrR+_h;0C+4 z>5Z6P!JQq9;;%kj!c0_|2c(qXt#m~C94{AQ7GBQafDQMyd059zE}C{DbJY|ySXLIi zjP>~TJ&($Ct=c~{HuA9+3oa!|DvkHv#z69?_a7)W2wnh+4RC3Lf@woSgne5kd0oL(2rr z1iqP?8YABBo(93&2Z$_7I#*D$Cb0pxgUI8Rb1{J9$tnEI=bP~}B;rm`y0O0Cw8a)+ zq4^dvm4zd}uWb`Zn8o8;qS$^$-^Z%f-56p^X`q4BxN zy2iRZhn)Fr+SbA0-$dTo**PHWsf5Kr_soK3NVhACskfX)W5%xto&1+PSZ$}9h$;~A z0Ft6w%dS_cx&y*H(6xmFyBRvh{H7RwEu;9Au1+0(`5*VRilRfXZL~L~2@-Ka7r9s< z@c4RoWHm_=SVDQ;()oMZh_yTuD?ffW5+_ zqGCumKlhRB)e{5Pv)`dQOK=huo5M`>PuFQqeDo2A?nat&9UMj}PPtkX_E)q7WvE0U z2fU4XeLpg$nDh`9X3K@nUF1%VcVamhoA^t|E|q{q)CB-_m*_fAd1oG#w+3Q5gilnV zsupuJYTu-io%CG5Qg5|8bj2=)-^=qKiF#Hdni=*q#jH;*i93Bh_>_Y?>)ke!bqNHK z{26z;?(nOsBnEiqiIR>5Y)NeLk(4G=))~nlr9h+(9#p)x5;DY6FJghqjUh_H>DWMuH9Qe|7 zh^C*$6evf;WJkdZ)f`Uy1myG&Q?W^t(;`KqiCIInlgg6n)8d8VeAemk)4u+Kvp3)L z;k;h{WVu_I0FlT~BJ`O8dJm3hvIYKls}p@oGAFW81I)=* zNrA#7{K2}Z=M@BN&cV|X&U&D^z1C=m=vbw^y!>}%^H1~&gHAODY)8<{@Pj@gr0|RG z`EEz0iM+zWJZ#72Kvy>iA2YS#dM#VOaOPuTmY}2gjU)$9DdgE%`v?u2|M&>~9Qpgr z7TlgztK#{z!iml=7y@Eu=y?3!`mNBAEs`%Hpwk@Yn^eJrC0(X^~_l;u(!@#;&Yy~N;y-<>X# z9!Zy_;_$muv5^gQx-~i#@Rj-P#q-blFQ#}`YRoL75;aT3%R}5>9B9HlwdYNBIrtnG`$FvnMBR`bqr!2r+b&Y@b}2Engd!s?m$k#-OMBv-y2( zaU`7Sk&*oX)1i+K0#{rjYGWQ#7MP1ee@wKDsaDsV9p>V-tj==|KGPSaEcv-noFYA} ziI^>xM-_t}qjn~QbRH9dq$5STK5tEu*F4n}mxXBT+vJyxzZ2rjI& z`cb;3-&w5u+3+Prp|7{j0Njjv&{|CaZSB3=W#?JCr&uy0=3$PVUxnr7n)BUEL8$l+ zEupGbV;{YfI9*^w%e-71BPY}!@V9j&c_0@oDE=B1u<8}Bqr7XLuwdXLA(=llU_YGk z9SO$D@{}wVC&KAY&e-l{1qss|79?aCCr>4-^giV^8{#nCw% zT@Z{BVP{1>_vVmsX&H;Xcv8Y-Sfcw_}7;0?;=|_ZrflB~I-&?@YUQX3@%~gVCIJn}u8lu2Gi< zT_M%G!!|qiu^0@JmY>$*aw(O_+d=~bv+|8YB*eZ?NZ~^siDLkch${_q-d;Vk4*6vS zuU`B=?!!&TD5kR3w1Xr-<;*6MAbzCLy)W8Ru zUSM?!o(5h!VGikoC2JxL)92_FMzd?%Jt-schg)u^B{4~kw>6#`#J5D@Ns`Xk%{$jv6GgBYTcl~w7) zCne#7qLVK`H#0#5*3AKqz;dyLPDD2r-7Mr% zI{7=k-9|=XWEfWm18&yOIvk{AZq$BuD_QuGsBopS@4X}*Hr1BzV_$4w88`0(YCz{P zzlVDAvYr{Kh()YJV*S$LA^k#9fqY(JU&3GRWh*C+3vOa!qR@6@oa$rx6VTf985Ek~ z6FshuGQ9QI=fg3+Xujm zUvSB8Q71#5U9LF%z!`x52}3sub{qDx!E47WH-Ju4)Mrb1=KuUA%MO98oUQBC^kiHC zDWdrsvF9DH>Lue7VG6d;#WY1<#n#>Fy8jfkT`Y17`S4>%%b15OPr8C5K28hq99Q!o zoam2Z)uyVhsbL}f;6Y5`A*K(E1Fhq_`)*0?H_d|=;E~YzHP*^pYcTm@@8Lw^j$VhY zQ1pEf*9uaHu|(DsM~F%l4!+ZY0uU~lc-rp;P7TYhB^5LR1A%i9E@j2Anoc!J<4)63 z_c!NVta*CFF$SEdDhMS6uT-!jZCFu4o4A_c-)tUmot#IJJ0{a+yJ@etphj&PRb*>^ zRyZjg;HQ2xgmw*~{&9KUNR4O=C-FE8?DX3Vg4YC0hQxj~LhKY=fj6$YU|Fv*o#khK&oLAEjpS3B~xG^|o%plev z1$#8I!{`Y2x7pURaZ_d$`U^e^J1qxVvH6Bfo?gASw}jd4@@tce;tw9la-Qt#hh_wS zgc1xfs$4=4m7hGs=&Gows7T;tX?1?Q#PKx7q8Qnd^v#Ej0Tm?8YP@P)T^BsCXU4%5 zir4PFa^}<3YUEYod}=i~c`z59)m*^88XrWA9k9z6SWFZr*0q4S46?BXbZlIl)im08 zRR`k}T9oC|y!s@PpVn&Nqk8-!+#e&}AJ^E3FUU&d)W0ihoRStpkxHL+7Iz5^`IA;P zmcA#MsM;fE#%14P)f+|bJ50puiV;r4D+h0Ecr1psnX*VEaGO~9F;>(JmqIO{_bp7b z(O`E|XZ9H3T3XN3`Y>K58v;+atVD65K}@an9JQmM@u-LFRA}i&3J(@QOsY=U}W|J=(Jz()9 zlLxW@4`r|_fdM{JB3?(LuQ(o5KxW1{7@6SW@c{~-&3RnZN^j_j{W-7X+Tzs|C^gy8 z`J)gP(ztONpOW9k$SU<5Ex94e~nI!gtqN z$+Xm$r}pJcosHn(k1sT#lpC zn^Goi<*F+fCpzH^*XrsE?d+^U2FVG*tlDNna_v%hGpozP`QQ$CX6ptc(aJgX9Y8<9 z*-(9=D6-SO=l75=HpxImB?gJ(V=++1QZ!>HR4lD%iuwLdFhd&6hP1FDkP!-CrPzu`%wrUn``T`sob#z^tw^ zxIYLM&on^DE4#1s&k^ok@F2Camt{r$9M}l)f|op_4QXeaDCA<=&0sD2*)Z>8&~Uj$ zUph4Fq3h5HhmC{SYk^93iAv%^EHlk|_45=htCY6%>yn*F%R^hk`H#ZO{p&w7E>?^*ELHYghFM}_DGlKP!GNWeBW{#uCYpBN%iPR+Zg zr^%*qn1JNkHa?CC-rW?|)qM>L+6fj(@0yWVg4|c)N0skKM7PTIaZOKfYmlNzL4F>3 zaQL&cs@hEIYpSGs9V6QB61`;YcS&BTO9f0~$zxjqTsJjHN+RcQKrt<6P0lM$C;zpm zC%q2U2ee9uq!q&R=x2oYK6NN5F!xAtQ|8&7&&7Oo*DvW-d!GL7wg9uG%DBJ*5PX_l z&jDvR3=ncC)WWt#f*MhYbZ;X`jrs326p)dX9MW<97`1lZhxdHqv|}_9dL1Q&F?Zh! zKtgR4PaIyH*5_>94y3j>H10~}951==d8)z$)Zju#i9PR!spuSQ%G_T z0ue!Pz1M04oXn+na-~Fs#SK3uSZ1?*Tf~LnM*BJw`>su4;ZDC2{}Y4x=p#64QQ-5j z&RPfJV(IHSxiOfe2c}c#+F$%k;ilmnC>XBV?hp;rK5DvNnUmz}h|{rUt7=ntoVH`o zn|IxllvWJf3!Z8yZJ z7x1{A!KJ101b%*_n5ig98%)=+h7O8r0+YChx=nXpZWetu=C}rr7Zx0K)YE!q-$=I0 z_kY+1?~F05NN%dWleuU2sVyxnzwoNTYQ<;rK;8d#aTfR_HaV6@pC zG}%HFCcw~7%C&jPX#G=NQmYX~&2e85-rP@2y1OOx!&IX^+Qm<)@2R-*-*k5Lh5h|? z%q5Z9_4LqqU6>5%)dL182qeya2B2BL)g*99Mr`kE;mLkh&Xob_lZAl~yVvCL8nxV1 zFp$J*|Igqi#|QlGoHYG7QKm)D1y?U?YO-G(9sTkvi-|WN`z%Gv@U;ylvD>Y06*E4# z9KCSU|LkS=OJ9MIuz2SMGg5S;F)uZd(8eHkR8o~*o;XWoR2%cc`vS}PCDmHalQO-et!e%|;2&Q*iUr1N3@f{xk6JDRh)2mOeG3>v*p944O|Lmbejgkw_K0CC6Cr?oH zY*;~W1}}l%d7#wLW==wtSMRPpUw| zMaxEdf%{l;%m8x@= z!()UF5b=Ae6O8In%ZF-pf)?oV!`1K+CxDmX68Gx@(mnzgW$k+BhbT?AIg-R2pwANVBDI$D3|Ny3oD$g1~VDNTgAeF=B87dLaQl!eu zddlGai^EpYyyu9rK4CYEzqa*3$D(ARsBl)_mI>8@%Nv5CWN_CFQ$N*@e8H+Ld6kyq z>yi|5D@=YRhsK=57=LetaJgJlJncK7x|0M{}L6z_EN2Io8{%ngr+ zz_FeT)^4#_@jc7TMEhs>!=3B`TY_WI_KcUM-rcmY}%_xA- z&FWzbu7)C#ZdRM+k5jlEVK zoP*w~b7!1Rf_aAPm9qj)#S@}^{!ey;quW9IcLr&}Z2e_ztiXpQ{*c?X!;enR@wDVd0c{PxX2X~9G*7=;Y`W!?NL;^OicDF{ zVRwxDN8VzI#~du0M98j#oLce3X;*x&a8rw4tcOQaUxVu3nYEUd7Q{tSP;hs7`7?;6 z0}8sq%kLea&~iYh2tK7I8r`+H_&4Y)-M{OlST>5w|A=a{U zUTyZ0AKgMRa>olmVzl2kd9uA3Z5u7}Onan!|A24v1u~d5D>zi~ZR zX9wHQ_kcr~D=B0VHACgl6Rm?oAs-MRJgrG$U08=6b-2$WSZ&dBn>lD(9C6`DQIwwL zAuZI$|8cw~3E>a338J_pMp@X;KR-j_%-}-@el@5>O~WAL{m$C7yzW_vc%0MG3qwv6 z;wE|?`97>qv^rT|PdnT_?5Wb!J~ju7Qm@NAc=Sb?J)5+gd-n@G;%7Xf%MySa{^^^w z!{+Z@z07A~BCwR&6guH4dRc%`FjK8YS?#z!wri0{+rEh{c70Pc<0AhzumAvP5GWY* z#mL5*`IeN>Az;4^!DBTA4SLUDQ3$>xt0ZVT=*K~yKeVFyeou9E#p36?e@>Z}+I=g- z*Y%Y$seJDkhBjX1m;;TN_a40`?IGkP(`K4R_rB5NkEmPakQJJ=`0MZ~ zp#bSHzK(dgD1rb2gRGZ%d+NvK;=w{gYacDO2^v~0G!^us@sed5rKWVm%Y?l;?p18M zbtcN?k^Zibm>?R>a3M?PP3)V4eoLkKHqG~{hq-*G7lx#TGWFpLf9gEOP>#Fj2LIN5 z14XM<5(=?MxNopC6t$lY6Jg3&SZvP4i!(Vh$WEzo*~R{>m2gdhWY1v@=pfGQ2iRX% zKhf@=K!Tr~TIpO7VXh?{tMYS1EMd^((}l(hd{{fE>9bCcB#0UYHzT-@{kdpsgIWGVvb)bhPNtW156=NyPIVWK{1r z>rZ8wX;jDILFeX3&|~(6-Bu2pOd@w?^Gx&RC)K)yfv!tbu~h%xj(ly3i2hC04d4H< zUWUJ$v_ASU8T}*}1cN4wObTt*`(l5$6_8OS*13+x3q+ZUBY zLqb`ZDe;Ml>xJd*zaHt~3EegIIi0!Q#s_KJ3e>@@ex{@UqPP2 zz@?EGmm*P;j<3(%7eGQWGKt@Rtx4YNhBvB5wJ(6Q7q1< zkwL{v%<&8SnN*_L%q0>|6iUeLxCD9-%9`L~NWvdILJrd&0wCe+BsU}aD#oLI+eP9f zmSb$sRt;1hR<_v%(__m%e+cF{*^HJM@!X(I4H{qw*-$_Yez#p}MQT+b8{uvV*GseX zSZiE{&hC+p#UP?4X3X3ADaMO~jN7YeXR8?WDF1JX2OQh)K`E3Opl6}*1Y1W>&j%df zawz-4_oL;GE|*Fct|B0de#80O<3{Y?){gO1__9I}3b5oPv_`iMzxLqUJWLHM-ipP(DyKH~e@CG(z@tA9eQCq@Tn!=Qjen*l+Q5VoLB+EnA&1N#1WLw5KWdbhFv zBAu9~mVoU6Y;T|J_(SVIhQ10#QNE*PDxt zS4X|r30KChcxZ!21?26-T{=C{_qzL~C)Erl8I_(g>U9AEZxl(si~0ZF2xRz!g?%A- z{<(>Irf7VZUojXbi;&NV1QX{CVo7u%YWnlP4+aDqQcHTt8$!Jea>;dht0D*GGkxw@W_Ydenj%MTV`1* z3uqli&Y0`i$cOzC*0lWhAtNwa*Q(gF@Vza$g~aKYe=iMY2*2Tie|V@e6!9ST7BLFO zd_$qn_Vz7`KPoXGQaCXg=ubpYKJs;8%e1y<_l(Lp(fl+o7-vN3l|fmVsN^o3?99Jj z8BjUXtO)ttKQ2{(!Ghsy)-8Ba|Mp9N;{tJJvue|ce02z88H&Y^^#`=eyP;h5z)8N5B)qwEJDnSGv%M ziNhDY9(hMa4UsdDGsF1r;YW!nvxye^LS+>$5?VTP~;= z-VicGp!@r9B$L>r?9rb+d-f}4+t;!E3w#|FqJ$y>-SJTC<+tNrHj;SpV+DkQ3Laj` zNLBQ0-|+b5Nu$NK^aw`4Vqt-RjsMifWJz`f19KnrBD3jeIPodedNJPR@|GkmLE zFdoMZaDTtGDaCP_AAgb(KwJVK<{;^3Da=K!DHFr4E-oZ&Y*^TD)qmJ#fMy~`yh>vF zi0905F~AbMu|w1wrh;ef=d6ModKw6Y4efMNJA^uJ{k%xDI71N0WHu;FD4T4s2htikg& zy1~6Xl=+b2noKCiy)&Y`=UIVWn>w%9EFv=KE~EOJuS# z#3L(@4^>LX@c!ev-Az2ya&J_yA?Gid{^XnhZ$8m4N0|Xy@&%3O=jJ+dKej&HnAO11 z9bcw-=^bD8zi_7;$giUDRZvMK$^`;)-qa&;v|D+q8(Mbaz+~cbaz@Q}v&_LoF(42N zkh)D^5-7415Q(0b#kEDu@rj%}auuX-oSIc9FqVBM6eEJwF%ZprwI+LxSp_D{{O@dm ze1SwBmx?X2u|f!9X=y1Aqb@Y)z9koti2W4>QEzd^CF#|{Ioj3ES}DMgGjMTDpsDVx z>v?H?HjN6#PuU*yL6B7HgZ@*>d@LT-xS1Cu)zynvKm%6uy!3VtfDiaBl-L6@WGlHtX)S|}8XDPN(-!UvLJ?wwt|fjEoLI%2 z2%7#;Qc^kmTW2OuXGiax3E|XUb3S(*i##dNi~DZK94-uPl68RD`0=AHPPuw~pCFriemSgHIpGJOpTv3BCx9zaGilmC0+g9N#_zhG`h5HtH#0FW6LewfJjPfZz&Nvf z3!9x;^lI9<;O5`o9CoQ1`>+MN!~n<@44@0cSy?{UQmw`?l0y`sOBpx4f&0g>b4Cnl zq5n)tfgHZQ4bH_~3$_#Sw=u&n{uN`=^VRs(|Cy2}&0{r(Ingt1%e2*rh$SWWn(V4( zt0=vFM5>kqU4Q)OSb7LCzotDp9-Dapupv6Yr(SKQ?WI_{JuY|*XfY8(Ef9x9)(R>7 z|7!HQnryV3U#hbfJ8UVE)}(Lp2M;kxHP7$46CztV7omKV!fvb#XLV?3dMsUsah7;Y zgr}>+%5iEk^^4jiJEBcUf0-|FNy(5cG8W_E-`vWrMXx76Q+bQfV~aO#vldAYMnB*< zSQLx%{HH~z^4X4S#3afNy2zz-O_{D11HmK(Qd5nn=O8($qyo+Zw|VTLtX10dHk30X zj)CH39hjxC2rRdc0t3x^^KGPACH!iGzvMYHD@$I~6p*YKwLiIt(Ut7quf)@%-OdV! zwBUcuk>kFRrh4ra((R-a{FN2(*;|w6q~|LplxWfUA=pspk`vb#kHOaUYC(*ds-T#m}7Q!eY2^Difh5KOa zzumU5hzLSKXh6VsV7`uzmW5)|^(oVcZwMlZ-|KB1X1#Eyryb3X`{KA28@W|oPG93$ zg$$;kD>h?w+y5uy-llqjOXJzd+3wByi47TXv=sPtdAF07cx02I5hpS4MJA^Iu5f|2 zEkV=Yb&R=IFD-J)=|KR&L^xZM!kFWIX<0<>%x`sQBr&6@t{4t$Lh}wYOD*9mMyTEvnKl~FsGBT!| z+s&CtY(fH}y`!aIyLlCgrT+o(W%t(X<9@(hpPYoC8#8nVAAzq)f8J_Qht~3e24DOI zL5yZaB{ouQGg8~QsbSxT*+YEjdXLsmcl8;zwqhzsvt%S?%SR664+7q61zO_~j zSOw@<-jjZ8?=FX2g9(GQAf`QY$Q?(!dJIcT+QrURm~S=e2O0^@pnng(DHA_G5{ucJ zLawo#f8|2>ey2*QyXolmrChm3#2&to(^_~#s}9^Bp&w4z7yv$A$fWYf_6F9!Yj1Yg zRb(+4$8hj(4O>_|n+%=e8%P-Q#F_m)3?rfJ5xo%LmEgS z5S%WrHL5!H9T@ytCx^|Pim|WsE$k%qrGBwevJfpH_`laI)oLZerq^U?49!H!FloEJ zJnUJL^%=30gSCIm$M)02B^R;qF;HQpsIgZ&y0;E_pv1`1hbMA2%vVmD_3TPAW-7*| z82TEr`14r0M-`;~3$Imakp03IG5 zP44z5_u(rF3K;(TvzGwPFOI^nTWP;WOyD6U+J}YB9Nn?py4`*UtrhrgEGv+vn>RH; z7F%%S@Z$?t!ae_sW2g3C$Y2NBOh9fFx=PMyeu%31cKRo1WZ86J`=01WkmmgN3xT zm-~DZ>P^|uhYr4{_7Lj~y@X2j{Gy*&P06Nr;a8tfZVWR)UfNNwHMG3!<8OG+z44ze zxu`r7?D&|w`D*Pl4Z8Oh$vK7%mZb9nQ7p`2-P5nSa8clI$otXiQ1ZK810KISWuzDx zIy6b#R4rMB3Tcr>gfRN;MeU(}EHZ>{{S9%UeOXSUB6eZPFHhrbaS7Q%1vQC1Ghy_b z+eJId$U1g7!hyAig-sV?4`DsSsO0)Gy93U^z(DaaKY#y@zCHv{>2bbZkB`l=AIlIl z`M~RZMkUgEhR}pl9rMfWBQ3WjmpcoME2?+KjHwuMscA>x*IEaecZGMfNE73->QhYM zSqI_Pd|1n9s)diB@)wi8zo2nfRCs&|61dVmKl6kBhyoWH!|&|gs^m0Cjd83ry5hp7FM{@I?*E&h~*bkkU zxJ=jrP?2I5nQ@Q+dsI+d93hN=v;9_To7atw5?03Jh(s03uI;}sJMHM@^Dn`3IG27} z^L(c6XxD(yDl)zDk3&E2OeA8YO}sS zp7FGq)wnl5=l^T(tKXt(qjpskgA(ZmC8WDcq?D9y5Rjp}ySt@3hVBj-N*D%)MnXcm zyL;el-gB<+_5I=e2OmFhUHh70@6CFiXRUkHz2fJ^+v5pLxU4Ws92XwBw=a-Sw4x$g z($<`l;uE{|PvK5-SF--+=D_#{)m$z%HpLU$qn>yB^@!tsW`c&gZm()^rD- zhoY3JuTZFb?ow6K;@A>BK4E&Gviws^R(&zXDLxpvisqxfMUVdaXa5Kz^#2OOXe{ru z)VPGWxTz3RU3ImHg9Aq!;D1nAxJEO!#x+k>uAp7H=g-c$MrcZHS)R#eKD%hM?wZ_T zK}8$(t*y-;l#bcX2vpuN{xn3;n6A}dL>2HFkxSYno9iN)!eg8JrXGkbk9j~o@bmMd z60ki5sv^39ikH}=q{2`FsX&^c4A?2>0rBEdfb&{qG0pY> zIC&eyNjQ`j!ZdC@z3&2-hTC5Z$14v8GUO{;gR;d_74GXCE@fqXtrg!0&H_=bCv)%!678d$deBuUXM^g8^#tZX|CLQ!!EE6Zmc ziw1m^M|+6RjtgL}rAb!o1SD9t%!>8eqwiqVf!*S+5X}O(6--a0W=DM$KkFyh*Xyc@4qnq)FqPWS+v5tQHSo3H#~39o}-JMjj$+N>_>*p3)xuB zpc<7b`*!vaBG1mm5KD-b)VxyM(_6#;k&Q-arVkP+aVP%X|MrtAQ>uAz?tipHPZUY1 z7%-a7px<*ZOMyNYpxAu{(DZc!A)s)eE0%(rTMdg>Ss0|#5;W|*_tS?;Iw9QTOq?tK zw9{3(J4|Ej6uZs?GUCKukbQ9*n+$Pdpl-D%YZF9XN$SoWwz1~GD2s-lndfSsnN?Lf zJug*LdonpA#~?V-7X7}~8JX9lj7XGD7*lbO3>X6&zoKe^pC3hKMgUjP+IW%os+a|v zonK2?f{`L%6Ys3U@=dseWtNa92U&aETMK_bKNk0Mi{07AX#G+pd%Ke=#{(f$opWMi z6I#!Xuq;+6$5Cmr@8F022<5tzlmI7rS@FY&(BvwU*Yndts0W_h+O~*uAs(A-{)!Fg z9lgBKdG`#)Y_4~EYE^x+eOvG9oCM>+@2>>_pNwCl1o<`9tyPu8Mma_o_bBfCkHJYJRfV0{5mVxQKP`* z&21RPJ&iGDcaQoI*|w58M$~FzR;(i8gCA_=_i*vy$RAsIl@$p7){$VzXw}>Xpa3~F zI!O$(5$N%=o!^x{4iVJa!v-P6>kZ+DZ@_ zf9jt=k2;A)&WjqfT7#{aFtyf;c&V5HzUog9U&Kvd{}HWyAsUmev|5>!T(0768Tp@m z3^;N5VwONif|HE7_^m}odirZZ!muelZynzLM18Gm#LWN!CFC60BfOcVFn&G_j^1Uu zWx~oxQa%=k$w!YaxDM0r{@JNsUGUE9mK8OH=4WgYUL<7BM0+@LRBWT`a4zK&gT^iz zcVi88dUupcFJaW{59L3nj^N?cL5bkNeAM_N65yr&QiL+NglhYMZjbC4dk?2k6%iO*d zR*U!6c1wy`yM@pag4fVt@Z?0n_4=E<04EGdPR@vQ*~0QO_JwU&44vVe&U6pa_mvmC zRo}^*D|}a(V2L;SymrI*(U^)LJA!6vHAq{9wFsS3WpX9vKgTZO|C-8tAU5?tO=EXn zb`8AiZ-VKC1+rnm3u1Iqfsox@3t4Q1ewBeSuj`ZH&3YS5h|(`kyq)+lexgHl!XLwg zzBH;1u&EaJ#l@w4xMwx@aouCnsCAI!N@+PoNJJ5`J3l=;%51J?{|ww$i}bsr60e;< z`SgXavMWxW847Bo`(5z)N_*XtJHsN;qd=MW!f+cirF_HAfywmF-0q$`!tOilTPNp+Mt47*Lo$L=$if|wETo7FD#lU+Dx%^|DRLA{BSCS zHj8k=hP41LH-K+;xx*K!x4-|F*qeG{=-3K(qopJdcS!DO1sy+OVL`U#jF=cRzVAjO zDzuv2GbRpz5hl@xt78$#|2Zw= z+AOjqa6YSNQCFFO^!)Ywh==FzEid~4;AbUT`0nd(%_{Fqp~yOCRWRqn!y5>PQwM!6 zR$T%L(K^3RVE%5UA)Y#MOM{~K6x29Kl+XCt+tZ8I90jk&BNzW92IFjeEICHbn`sxd zyYIqpp3|Q$dQ(rv`Y?BG&hKHvV$hofE}yih+Cu?G`zoNjRlC_v97|^W7U6X7b?Oaz znOc}<%Ct&5(ef7L$zG7-s!69=0MqYC_qzP*X}or)G`CqE`ce8~ck6`!rzC?gZof2A`6HIGAQf9?epLsw^FKCe;^bDEP_$%mwp`~SHN5_XXkGZlk23Y}x6ZV}MPLD&x zMTlnA>o!y1Jh)1om1JGICMQOn+bglGv>yFFfqnR99B$MDut20oB}A3mFcWMyt~v^l z_-j9e0TKzY{PN{>*W?pykrpQydN+d?vKLf)T&YA2D)B|=^Gp06F4zsbBq8BRhEk3L zxGr}VPuGR_sDeKeAX|nGczbj9Vj8Pp1l5p4us2T#1uC!X+~&iVBj!%>Y3z20gI8<5 z+}+tsLP-C5YDp2}2r%kEBMf4@BJs`G*xVpYh|jurUAH|7MMFcq<%H%`qvo_hWG9RI zzJv#%m)x#oq3PB}0GHt3ZVy*HVL_VjQyQf;e46P&OT4hR>j#+|BddKD=5A^{eC|_T zPP(7(`8q5`+g7*Y9V*ajm5}wMkM@}&v@n97VM-9BU18BjBsVeh(%+NjFdZ;i6ygs+ z_DDgp{0pQxFgVx{K(O$Ly+|T%4qtJyink`iy3KwE7$iRjfUeZ7t!E~@mJ+OZ=f4)? z;v+_mqTjilvTq8mH{UoAe3TsYfrV6?2zb;P#Kjsek|cdYomb|yQi{wey}P0H{C%CD z2bR?o$SpX7)|T=uj`w9Y#TI5|;}C);;}p!_pm1fsk$k}m9BS?p%-Y#14A#K&hGhrGQSg^d5jjDr+rfm~c%n-isYx~^+D#6T1$iAm?9oE$n}y@q-{ zd&9B?X`b(eYc;$zIC@i;di2}USjJOnY=p__$$En;+Uyf_L&=e&n`6moHBX@r+Ww~a zTEZH(+F%ZutwVw3>oSSLA`Xt-(dUD182$$VVwW_9Ker ze@CI>rGY+INj@P+<&KVPYw-o}ui(*vHKKLfy#L}K6D9@vy83$YhrTx=qVR|aRF5Ml z-tTsA;V3fUs8Y2`I^$V38?v&uCQ!STscv)_%ANV#qrzkq_qAo+hO<@Wfo;gE_Bug7 zC5q|$pQSvc9xuJ0Wx(`&ufp!p+d{fTHmW8sq!~Jap9zlOGEe?AVa1u&lEd16wG8mrkzxu@KELw6_O59Ya-(X9>k5O@si8@)&IUN3P z*ug$bGsgvWd2ncYngHM}gi9y_PIr%%b!*^5DFcu-hre0NjqM-djC^at9Qw|^?S@nV z1&?;Lq^*d#M9&TR=S{&9B8HKNR&vY#6m%N|GW70HusB-?W%g);;xT%4_hbtu&)d=d z;3NsK@&doc;l=3mFX%GwetJoj*XeD>=TTVjQ&?pVT#n&{E@{}6bUai-X<2)Y%{K-vA!6qWtZ7!nV^gQv#$&_c zRDyD0lFT)n_6z5c zXT(;{guzJiD_;%?AX_cy#pQ`_g>D@K9JBoR{{oL*Zhr)Fd!3#%gkc*csmcByEXmyup@QohF28nZRyKbu%ARQuZC` znER7sR39s?lRQ^k6Hb4ADLi`c$0TEP#$QVrJ@W)5>d_lOJcf?8wj#i>WHA{b2Z&vz zr@xs2p3?7HV+?dMp|ZKS{xx``TDN!RZbBIYF|XH?1=35j`zsg09|P_`x@%M3nr)yX zo(A)0P6TX#8^~Rvk#)L3?POImH&_s|Ym)ixbEKd;Y4NzpjKyF4j~QXi%FVqdbJ~}M z0>}$>TVV!M8{gZQ>Kxv;&ClD7oO|oD3EkSVL}l#xdxyQ`7jzfo#x)l<3zmo^<}l>) zR1dqbB;qC9>9w7G{vBurZM2Lr+mC;D;k?4zB(;i*m5u>r_*Cx|l%w6KMauoJOPKhk z-VBAb^s*kPaXA)Oc?WPt5@%*+hD1g60Kh*0AZw>!XIIjwU;yxK(>*y2H=bIBF0=x1 zQ*F8-2SKzC;QVr~CD$)+ed+ZglS*clOx5q6^f{Gl;qoFc5V6w4$ldWl!?4$#{&y%_h!4XwdCoe(HysBmY&NH{W+8W6V6> z!S*!3a3=Wnp-0TRWVztOKO2JiV9Oaf%?|QhYO#k4fi`7eC?e|E*x2EyB-s*>y=}5t z^0OnY$V{ZA-xv&AgC5)K)h^i&cp=cl20Vym3%bF@#MMF<%{kvgW@v&cpq+AsoD`;8 zVUL&&Ki#1GeqBvAjDAVxChtP3Tl_1b%4jZ8w^gx_!c5@}*R6mIdgFX*GFSoyJgLBr z{!7yG4z;3_;JYOd;4Y4#8%jiSX3zUU1B_)s8R}##;gh;Af3Un1jStZ<1Jj6^C*ecu zKU!MAz;bMkZ#ba?r$kk+8qTV^O4%b#BL4hWHMf6%@R9`F{&L! z;|LKDeDW}Sb;rm1sHyYD*m@&!PTk^4@5M(^?XQ+PKjwv{lCJcKs{7)Tq4hXvGJzs? zax6?r6=!j8G8Omyd)DA*GR@j44@YWM^&!B?FbF{3D@M^#|}nHbm`Q(ZA15-rm^Cvc%C#vOjE=Pmdpv=Qg8R zxaOe;RInMK8&Iz{c!o~Q<8!hxOkdl$ZNnjnl8Br2!v(XQR4}L+C`%S%Zj11lmd{bp z9Jt#V z;q?;I%p3A?cKdOhTBJu~MsQsyE7}74Rpru!|IOHb+V=B6D{kbV9x~W47#^V+-uP8w z3jMn*`=_DLb}{?D$~Qg=7s58yX>xs-3`3*kcLbaJ#yA(T25%l;gmwuBZ~!OUgm9Mpo$~ zP&fLY088KCC(K_x3q4&R!)`K!m$(Kn!SG4i=%Y+6lsXMK2dWnZddoe&k2jCB7MpeV z^6Dzv*?+mYrI<0(v<(|#)z3&b7SLRfHqtoAg;UItsN#GYWIxirwPyRd28Z* zeIlP%=7m8~yJ5lvC#zp>`=bv|GL)X`>Url77TPgZ5i-|Bfmg+_P4AFV=c8{rZpM!+F^?-y@$9ZDt@ZA6A86++`5jYNim|}Yg>aE-RUE)MZujr7YVYr^?p1A~B+gADSF%>HVKn##`|D z0xif2YECoM#`tAmnVN>?q4`k#hr`xjZ)+(Y^YUrF^yOt?R+SBcCM1~`WpMe;BH~f> zs_U09qh4RT-%PtFfoxjEQG$YQ9H(saAy=eJO1MAMV0QwVYgxr0AP1iBYOg*$^Yg2U z3z)l{kTg`~(+P%QS?6YqEp^W^n%(EXt<#Be@}%i7Hru+EL}5juHpG;n(Rt8}V1SFzWK;YY7WA%8~xJB}CRIv!R$Ng@Wu!<-e zo80)}name$ehWx!)m3LwPjLkDs~$bVVfid3qTC%Ja+3FS(A>ZYSIi6(deG=*L9Ho# z*Iho89(X?7>XSUoowJ}eyKi>D%nd#%?N7L`+}tqbwM6!aEBGlnPyuhh?z^UzR{?1f zofAEp@_D2TwBF(f2z*`HMeUoJ*?dP>D^{kVMYOoL7hr3+v$&RYYkMpvuib{P;zB%v zX1TisWiNC$7|mU`v8OL}-FuJouLIj##HqAa8JMh7Q?5-gG?+?T+xW~@f9pC=R&?ib zI)vnoE;ITP*L^07DM9+X_(+9$Jpsa#I@?vu+bB^1p_v>g{#LacbeL}45h({>22}iZq0GJ4sj!C%f2Q%jCj9v)VKVZ(V z*_X*9ZoE!|w#E{Lmur1|jk})P-G1!|j{n!oktl!mUT-9+a^X=VGKNB;wOMZWlQX>b z0$It@fN6Z8OEk!+C5;yvfB8#MX_cpYh4Wgk_qZQNBBLsTNG2*fJ?Rq<<_9CTOn4Ej zb*Z+_U5QMh-OtJ19(UDm*1DodAZ(vv4QJAy4)Dqdc`Klg5mV~6=Wrfex0YTL$1&^v zOm4rE*bN$9A|k`UBO_CvP6hQHc8$3ll#5K0_tlr6rMf4;Rzn?+CW#p1I|hfsdK^hI z+}+oepRNy{iMdMd`^nV*y-@Y2XvfcdME7QjrlC!g)81w!TuuyMFdOeoe~suL|5AU` z`m8-r^E#zr+HM4-A9ujLsbkEu9por_(&RFD!W4VuOSdnA(~!!F^;mvTbmSMxzR4n_ zaMW>PXY=BW3-x+Q5*6a_?=|N;YS-Okq@$9{xs*y=(d=sH5~j{*#;R{-w$>!u+XuZ| zp?QtiGB)9|cnY5=GKG*eBxk*}S9@B~bU!&bh^xb=Cb2z^tbU_UM10puA4RrjrCp#M zW^8L;3qFDtkOu@bndlNp{jCW!V~&ABO#gSpJ5!S7R)0oJdcU~HHxGYhV+Uqpk2sD! zf#6?pdSURY$uOigrr7m{O;3AT-v4}_NyJih{%IUz`$^^JIL_hvJmi6taCBx!2oumI zesYWxqIts_w1>bkyccqkgxz{#V-2S#AaUZ&@GuSm2@p*BWv997l^5PCvg4>|{s|tB z%dT9jUZXh4K8+-zPD_S^2TIuS!w zu#S-~grekJyRUnrdF{pwAUH?w?p`(Lz5Hx{^rc1Vvii*W_xwJ2;w2=oS9N6xlONv^ z86yC8`SMVnajSKhzyxv0U?kCSFj>j6+~|+*e%kb=db{ISsS=Z(NOa?Zh>G{UyO7~z zI^zp%nnE^{iIOK0(RMKS+8vKW75z~9cBpq)sF?JLgf2sa1-i)B7Ad&BN;|T0``^N6 zdiMk(?uoW4g(_rb$={OL@IGiP#McEAN>4gTC@D zhU-09K8;_+;w;w?yKFpiP+G~lv`V{z zD1(ZTv_|n@Hdwbt(h0SJTCk4Ws~7KPwxr9+m57!%GDvJ0>F-_0QO@D{?;&R( za~BT!$^gi9vyvzLFU-^spCar|pZGp0w!L8p;5e^slD)HTg6^j8(o0&xR$W8L5Y$}f zw>aL<^*W9g`%^nSHj$0>r7w{1*;WZ$Fr2Tw`;1KQ<6vD6$CqHkbUF$nI3N zQ2U49;gqg_c#>LiYBi%-Cpx^L0olmO9`VDeN%z%$BVy$Xw@j+K9y&oA>mfi8{lr{YvzcbU>Ne@R6zs z5Id0;`qkR{{KU^7hEolg1g{-Zs1^mCn_O3S;Rp7q%y@BI~p)*Noa?$e+JL^>ve z@OeXR*2e?pyWl=NCR2mR#JM9Hx!l3Jt*Th&kcow|HzbhJ{Ps&=26(x{ELjIU|>_X6-=|1jo@5- zKYxDxBAl?@he|eSrH`wBRLF&ruF))XW=U`nppOQEyC$UapRq-VYW3eyXYf~sa=2NC zq177*-Jn{Dh~#^{tkJ}5Y-mumLyZ?P2|>X{OkojmKVAOW{OLBX5bd))8$Uf^W!spa zf;7(G#znCn&QK8<`KEcztOcCgh*8pj_5tkc50n=bS@0M^$kd3eqot@Eey!@Q^;*UX zNRJAe;=Yv-4rWED8fq_G>~CJSnX?pKgqsj>qVEI5twa+K7Vs+1w zu7e7{a`0H9iV(PLp&r>p@Lu<3nXo#R)T}gK->5NbY7re9Ta&QpdyrUMasVk1u@uX> zu#EJi_L(O*`1Q&L53Wk)L!u{ELHgiZCz}zymR5YZ;I_Cb@&WpC_Gn!v<25tGrd$ei^7@vM8x&ed>8^kh8s>T2%nG0uCv z(uVUJ#BI?{_G{Z zP!skl5&nDC#@tmsvO+rQYZRkUY7*O>cLDb5&RQ zCmJuC^(uiUKL2}TASw%w-z3Mg%NBYNBv$6j9k)a z9_&M7{LbtTEacinFjp9X+U5Nxx`|%nN>}`6y*BTp75UK*xPf1kF6=iLHsaJ{SY=;a zcBPva2zwlgmY>RD+Y#{6vFf~w>(ar~XSrY)soGo5*yyCd+|DIY46_J`BiOwTCrL64 zSLv>~WM3X8MF7+i3s#{(r$|?4rxdzoTl>hz|48_`!JVQ}by^J%-ju{0Y3WEALCJHV z^pW_-+q>>jk!RP`vYahCiJW0KmT`sfXzru+6)QeFY_niz$+MW(P4J^_^~Q=C0j+>m zm%C+SsR7U|AAeVynF{pSaXUAbxb3mL00nG6?nOF3UNsT7zQ;PP43F!N5v4-bt1%{YNysvsIh_^N^;Wtf| zNf1sy!glkkTDl+!#q0_0a7JiHCz8%#&kp0N@GLf1VnPIQz4q1GI$x~e+E&5y?+{O- z5H?B_n&N(+qmSrds*Tm}FQcCuG+RD!5OO>vHSFmGtX%E1kCXuV@DWx5Y{F%eMHvNE zk<_}=(78wh#fX?BVS@^reKK_;^ZwRaqruWVoXzg?mH46R(V6%kQbC1E$!=Mq?(S^F zcVkwEDXWOfJ!csK_srTxSMJrRWpao_q~hJ^hZDYEvvfaeI{d)C-TQr1z`C1{S6D{N zk(83NanPO3LN|Mk@JG4u?72rUUW`1yL<{Oi5gX??1zIOKE$!apU2|_e_kch{#?SaF2eKt0wwm04%vN2>Z ziw!htBO_I+!=hQgnSTDa&JxgCgFSvJGS%PI7<6!9FPfV=nr#i6TyEyf?5&%EFMKut zC>SN*WZb&SQu3#jU)#e90WmPG3Nb%&Mk$B?#tzy6UtaZk3&!gdu4Sn_=dJp~?-;ak zhSY`Nr9}bM-%)^+o-{Fy{%Hica&W^wPxovbta{uPL~Dq(P8u4l&R+hFYazh3UT&!SEsVyr0+}x zOV@&mCQCRq3yrggmYesN!!DzcumwQCF&b26O3k4rvensZ2zMra4kDg zw-H5m+KDAOy>?cZH^;*c8pg)TCcj^!85&@ojw|6`4ss{ETu0<4pJ7+O2iYeO{4w}A zrk!rbi-LJjt^hI-A2844&mVvLcjQXibW6EeZF&;dDSAdcF`a`cJS-VCke(&-<_ zGerA5^$n*4!t2G$DLW34t0J5ulIC@!@fWYwQ5o~|W&VaG@riaQAiEQ8FdYDo;lQw= z-Q``%`!%`|c%DR$qq0zJLVr zEs3b}z28t}#fLv3pNxJnne)5vtrW&J9AU9v&y?&B|B1`e;% zZXV4Oig`jv6?R@l-mS8u0yC&=)hfvMw^hnDH1MnMeU3MBCo7Z^`NRLDz(|J0gsx7VR(NU^Yi|z()a4v^==d4% z>J@(#m==*VClsD%T*9IvSPo+98iyQH9v(!=H0N1!+= znRnYa?crAOxKb}Dx(5JU^3R>?z5uy8P?XzZ!9SOQKNK-Pc^|M%DbM+V8M_s?HGi>GfQH8Fk!{CpOd6RY_6)$jiR D9}?k~ literal 0 HcmV?d00001 From 4872df363ae5c32ab815fab001f58f4cf1e34e26 Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Wed, 29 Jun 2022 10:01:43 -0600 Subject: [PATCH 09/17] Update README.md --- README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 63c0ef4..8e947ec 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,11 @@ The approach we take is the following : We use the following landmarks and measurement labels and description. If you had more features in the class and codes to extract landmarks or measurement, please update the image description and table. -![Fish landmarks](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/test_images/INHS_FISH_000742_segmented.png) +![Fish landmarks](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Traits_description/Minnows_Landmarks_v1.png) + +![Fish measurment](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Traits_description/Minnows_Measurments_v1.png) + +**Landmarks Table** type | landmarkNumber | terminology | position | anatomicalDefinition | codeDefinition ----------|------------------|----------------------------------------------|----------------------------------------------------------------|------------------------|---------------- @@ -60,8 +64,24 @@ landmark | 13 | Most ventral point of operculum | d landmark | 14 | anterior-most (left-most) part of eye | anterior-most (left-most) part of eye | | landmark | 15 | posterior-most (right-most) part of eye | posterior-most (right-most) part of eye | | +**Measurement Table** +trait | abbreviation | type | anatomicalDefinition | codeDefinition +----------------------------------|----------------|------------|------------------------------------------------------------------------------------------------------------------------------------------------|---------------- +standard length | SL | distance | length from the tip of the snout to the posterior-most part of trunk that meets the caudal fin | +eye area | EA | area | area of the eye | +head area, triangle | HAt | area | area of head as outlined by three points: tip of snout (landmark #1), back of head (landmark #2), and ventral portion of head (landmark #13) | +head area, pixels | HAp | area | area of head based on number of pixels | +eye area to head area | EHA | area | ratio of eye area to head area | +head-to-caudal length | HCL | distance | length along the dorsal side (top) from the back of the head (landmark #2) to the end of the peduncle (landmark #5) | +eye diameter | ED | distance | length across the eye along the anterior-posterior (left-right) axis (landmarks #14 & #15) | +head length | HL | distance | length from the anterior-most (left-most) part of the head (landmark #1) to the posterior-most (right-most) part of the head (landmark #12) | +head depth | HD | distance | length from the dorsal-most (top) part of the head (landmark #2) to the ventral-most (bottom) part of the head (landmark #13) | +snout length or preorbital depth | pOD | distance | length from the anterior-most (left-most) part of the eye (landmark #14) to the anterior-most (left-most)part of the head (landmark #1) | + ## 3- Class description +We create a class to add more fexibility and give a frame work for further developement. Here is a short description of the class "Trait_class" and couple functionality. The best way understand it is to play with the class using the Notebook. + ## 4- Notebook to play ## 5-Container, usage and release From a9023b4870774b617156c86c246972a883838d4d Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Wed, 29 Jun 2022 10:47:39 -0600 Subject: [PATCH 10/17] Update README.md --- README.md | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8e947ec..4d023e9 100644 --- a/README.md +++ b/README.md @@ -80,8 +80,38 @@ snout length or preorbital depth | pOD | distance | length from t ## 3- Class description -We create a class to add more fexibility and give a frame work for further developement. Here is a short description of the class "Trait_class" and couple functionality. The best way understand it is to play with the class using the Notebook. +We create a class to add more fexibility and give a frame work for further developement. Here is a short description of the class "Trait_class", couples functionality and usage. The best way understand it is to play with the class using the Notebook. -## 4- Notebook to play +Class Name : Trait_class +Location : Trait_class.py +Description : This class create an object "segmented_image" from [segmented_image.png](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/test_images/INHS_FISH_000742_segmented.png). Upon the initialization (creation of the object), the image.png is imported converted and is split in several channel corresponding to the traits (trunk, dorsal fin...) in the form of dictionnary with key = trait and value a mask. Then multiple function will extract information on individual channel. -## 5-Container, usage and release +Create a segmented image object +import Trait_class as tc +img_seg = tc.segmented_image("image_segmented.png") +Main functions: +img_seg.get_channels_mask() : Create a dictionnary key = trait, value = mask for the trait +img_seg.get_presence_matrix() : Create presence matrix +img_seg.all_landmark() : found the landmarks +img_seg.all_measure() : calculate the measurment + +## 4- Output +The main script is Morphology_main.py The usage is python Morphology_main.py + +input_file : .png generated by [Maruf code](), [example here]() + : .json, generated by [drexel]() + + +## 5- Notebook to play +In development, you can check [this notebook](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/Morphology_dev.ipynb) +You will need to use [Morphology_env.yml](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/morphology_env.yml) to set up your environment before working (required dependencies). I recommend conda, miniconda as environment manager. + + +## 6-Container, usage and release + +We use github action to create a container what run the main script [Morphology_main.py](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/Morphology_main.py). + 1. The workflow to build the container is defined [here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/.github/workflows/Deploy_Morpholgy.yml). + 2. The Dockerfile definition is [here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Dockerfile) + 3. Pull command : docker pull ghcr.io/thibaulttabarin/morphology-analysis/morphology:0.0.2 or singularity pull My_morphology_name.sif + 4. To access the instruction Run : "singularity run My_morphology_name.sif" or + 5. Usage : singularity exec My_morphology_name.sif Morphology_main.py From aa2cb61d85fa65223d157a4723fbcce9f7850b44 Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Wed, 29 Jun 2022 11:02:43 -0600 Subject: [PATCH 11/17] Update README.md --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4d023e9..39e35ef 100644 --- a/README.md +++ b/README.md @@ -95,12 +95,15 @@ img_seg.get_presence_matrix() : Create presence matrix img_seg.all_landmark() : found the landmarks img_seg.all_measure() : calculate the measurment -## 4- Output +## 4- Input and Output The main script is Morphology_main.py The usage is python Morphology_main.py -input_file : .png generated by [Maruf code](), [example here]() - : .json, generated by [drexel]() - + + input_file : .png segmented fish image generated by [Maruf code](), [example here]() + + : generated by [drexel]() [example here]() + + : dictionnary, key = measure label, value = calculated value [example]() + + Landmark.json : dictionnary, key = landmark label, value = calculated value [example]() + + presence.json : nested dictionnaries, {key_1 = trait_name { key_2 = "number", value_2 = number of blob, key_3 = "percent", value percentage of the biggest blob}} [example]() + + image_lm.png : original segmented fish image superimposed with landmark position and label ## 5- Notebook to play In development, you can check [this notebook](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/Morphology_dev.ipynb) From fbe7c6f95401e41d032d1bdc10a663de7ce9f71f Mon Sep 17 00:00:00 2001 From: Thibault Tabarin Date: Wed, 29 Jun 2022 13:30:36 -0400 Subject: [PATCH 12/17] add Test_Data contianing example --- .../test_images => Test_Data}/INHS_FISH_000742.json | 0 Test_Data/INHS_FISH_000742_image_lm.png | 0 Test_Data/INHS_FISH_000742_landmark.json | 1 + Test_Data/INHS_FISH_000742_measure.json | 1 + Test_Data/INHS_FISH_000742_presence.json | 1 + .../INHS_FISH_000742_segmented.png | Bin 6 files changed, 3 insertions(+) rename {Scripts/test_images => Test_Data}/INHS_FISH_000742.json (100%) create mode 100644 Test_Data/INHS_FISH_000742_image_lm.png create mode 100644 Test_Data/INHS_FISH_000742_landmark.json create mode 100644 Test_Data/INHS_FISH_000742_measure.json create mode 100644 Test_Data/INHS_FISH_000742_presence.json rename {Scripts/test_images => Test_Data}/INHS_FISH_000742_segmented.png (100%) diff --git a/Scripts/test_images/INHS_FISH_000742.json b/Test_Data/INHS_FISH_000742.json similarity index 100% rename from Scripts/test_images/INHS_FISH_000742.json rename to Test_Data/INHS_FISH_000742.json diff --git a/Test_Data/INHS_FISH_000742_image_lm.png b/Test_Data/INHS_FISH_000742_image_lm.png new file mode 100644 index 0000000..e69de29 diff --git a/Test_Data/INHS_FISH_000742_landmark.json b/Test_Data/INHS_FISH_000742_landmark.json new file mode 100644 index 0000000..9c4aa62 --- /dev/null +++ b/Test_Data/INHS_FISH_000742_landmark.json @@ -0,0 +1 @@ +{"1": [148, 36], "2": [66, 148], "3": [21, 301], "4": [106, 566], "5": [112, 606], "6": [150, 622], "7": [203, 592], "8": [200, 562], "9": [242, 478], "10": [279, 305], "11": [217, 169], "12": [162, 187], "13": [224, 138], "14": [136, 66], "15": [134, 96], "16": [115, 81], "17": [153, 81], "18": [135, 81]} \ No newline at end of file diff --git a/Test_Data/INHS_FISH_000742_measure.json b/Test_Data/INHS_FISH_000742_measure.json new file mode 100644 index 0000000..7c2ddc4 --- /dev/null +++ b/Test_Data/INHS_FISH_000742_measure.json @@ -0,0 +1 @@ +{"A": 586.0034129593445, "B": 0.057502806536110763, "C": 17.131308037083887, "D": 145, "E": 85.60373823613078, "F": 32.31098884280702, "G": 586.0034129593445, "scale": 284.082, "unit": "cm"} \ No newline at end of file diff --git a/Test_Data/INHS_FISH_000742_presence.json b/Test_Data/INHS_FISH_000742_presence.json new file mode 100644 index 0000000..7aec16d --- /dev/null +++ b/Test_Data/INHS_FISH_000742_presence.json @@ -0,0 +1 @@ +{"dorsal_fin": {"number": 1, "percentage": 1.0}, "adipos_fin": {"number": 0, "percentage": 0}, "caudal_fin": {"number": 1, "percentage": 1.0}, "anal_fin": {"number": 1, "percentage": 1.0}, "pelvic_fin": {"number": 1, "percentage": 1.0}, "pectoral_fin": {"number": 1, "percentage": 1.0}, "head": {"number": 1, "percentage": 1.0}, "eye": {"number": 1, "percentage": 1.0}, "caudal_fin_ray": {"number": 0, "percentage": 0}, "alt_fin_ray": {"number": 0, "percentage": 0}, "trunk": {"number": 2, "percentage": 0.992120507069956}} \ No newline at end of file diff --git a/Scripts/test_images/INHS_FISH_000742_segmented.png b/Test_Data/INHS_FISH_000742_segmented.png similarity index 100% rename from Scripts/test_images/INHS_FISH_000742_segmented.png rename to Test_Data/INHS_FISH_000742_segmented.png From 288b4aae5d4f4a971aaf864ea046e1ebdbee12ef Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Wed, 29 Jun 2022 11:37:32 -0600 Subject: [PATCH 13/17] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 39e35ef..a370106 100644 --- a/README.md +++ b/README.md @@ -96,14 +96,14 @@ img_seg.all_landmark() : found the landmarks img_seg.all_measure() : calculate the measurment ## 4- Input and Output -The main script is Morphology_main.py The usage is python Morphology_main.py - - + input_file : .png segmented fish image generated by [Maruf code](), [example here]() - + : generated by [drexel]() [example here]() - + : dictionnary, key = measure label, value = calculated value [example]() - + Landmark.json : dictionnary, key = landmark label, value = calculated value [example]() - + presence.json : nested dictionnaries, {key_1 = trait_name { key_2 = "number", value_2 = number of blob, key_3 = "percent", value percentage of the biggest blob}} [example]() - + image_lm.png : original segmented fish image superimposed with landmark position and label +The main script is Morphology_main.py The usage is python Morphology_main.py input_file.png metadata.json measure.json landmark.json presence.json image_lm.png + + + input_file.png : segmented fish image generated by [Maruf code](), [example here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742_segmented.png) + + metadata.json : generated by [drexel]() [example here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742.json) + + measure.json : dictionnary, key = measure label, value = calculated value [example](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742_measure.json) + + landmark.json : dictionnary, key = landmark label, value = calculated value [example](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742_landmark.json) + + presence.json : nested dictionnaries, {key_1 = trait_name { key_2 = "number", value_2 = number of blob, key_3 = "percent", value percentage of the biggest blob}} [example](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742_presence.json) + + image_lm.png : original segmented fish image superimposed with landmark position and label [example here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742_image_lm.png) ## 5- Notebook to play In development, you can check [this notebook](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/Morphology_dev.ipynb) From c6922a00b33c384f1e2c45af5c6a73e59ef0bfe1 Mon Sep 17 00:00:00 2001 From: Thibault Tabarin Date: Wed, 29 Jun 2022 13:39:37 -0400 Subject: [PATCH 14/17] update image_lm.png --- Test_Data/INHS_FISH_000742_image_lm.png | Bin 0 -> 6620 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Test_Data/INHS_FISH_000742_image_lm.png b/Test_Data/INHS_FISH_000742_image_lm.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2d219e7eb6c262ed458a0357c3d5d5e5555057a8 100644 GIT binary patch literal 6620 zcmbVR`9DHro`2u_YM^2~YMcVeHXjpMx1oiz2%c zS!a-BPfXUblkYq~eExy&`Q_ZN`*of7xvz6y_xrlu*NL+wKHHYjgt+{ZW90Ukc3QcBGd`ywL)#W}Tkz_u%8s()~w zmk#G8OolpUmY19SdQ@EbU|zlRG8Y@;f0uFFhg*^$%Y^x9quhif@FX7?dU?R#@WLQg z?;;nBHleAGGIil_6T~**W9EmDi4f6Ai(j0e)Ic*^4$%%SsAnd@;N&fiw<1`}CtUW6 zVu=t}GlKpNpD~5^JH?OvJu^DM>vA-yq^OMGvo-$7(IKgR_F zXbR86P~JctW@rCYgORrzdpZg!)Y7J}PEIARt_aSl%dt9X_pI1%kxKq3pyg-^B}*-R&1M)8cc}# z3S6+WeRlg@_szBjuqlv;cKxej@8T+!Tw${2gf$7rb}LtApfWU7jy7V7zZ2bgn%{{h z+nIzkPHVcQNoq%R*P_#K?2T-P4aA>IXKE-z2c&6OBm5I^QC(zrq$m$E>~w{3$^gEQ zE~OFC?llnq=X}MmE9|N)EvwIN_7iE^*$VHc9ntPwA20I}z`>ykXJ{#CQDb6HD$eg@ zgq=3ous@v{+Y#x-1H_vkJYUpaONZrMC)ksO9fF?DGUe#kyRdcHb3jn*%#2ZBA3*d8tf=fSq;ZcHZTVp}BCj_eea2=Ur3 zNKI5IkN&_J=b@vMPwF>0wHD7D0bk{-noA zw`OnzMT87FStebRuMBlsMYeeVAc8Ga&r3&?yCRc#(FU*q&q2Y@ z+kDD)BRUtd4ST-*O&_sC>BgH1VYVqoA%8il2qO~4aYvq<;Frrx8 zh8opfKkh62=tp1(D=WNE)Cvzz;Nt}@e|Hc(<;Glcw^W{clYh1r@C@8pR}PQH5gXH$-r^n~abr9d<2!&+ASQZ{udlI@Rqb;;r0o-lUh zx>`kWG*-`v?WSMdfSlyy6bmAGt3sKDm*_u6jI6^2I=WE= zw=)=VlPG4ka=rAakHR<0tEto^I|IVGOe=IBw)6A4)i2BAJw}G#cCFW8zHtz((p+SQt+2n#++uK<l_^0*u#FtSL3>EZi&BnFgD8r1VrZS)*_b$CFTOFq*vV-+CO zVe+u@F!i`4#!FiQ%^RT-FbIgVqVIezdurOype1ZqQOlcA`?X6D`lf?A0#B;?`k^KM zjk;PpOlNFUarVi%^LGNTP*j>z(V+9W%YAS;3^2;*O0|EV#VysrmrbYusCx%Gp}&bi zA_hur;1`~Up$Db97qXzQZu;!Xra@Wde+)yEoi{~*2P9NzNjKP7zd#X@$urY$x393$ zgtx)ekWdZb-Qdz5?@t$QcX-+hz)r^9S15PL&|rPn1t-TPvxwonCtAD${pxPD?m4=+$*h+RspJxT%BfS^o_}=R zcVm*IVS1vu(b$O@YQ+%-YJ9z}p8n0gSn)5EF{|4A_0qfGjoS3U$??;iQqa3I3d!I+ z>9FYv`ivZ8Z;fGKV5VD3>V<)faJuPVbsK{>cp+#~sz>h7S?v7Mo9ll`O_-4HE9~zZ zTkns@BDAzB8g+jsJUH!oF0P(0j+rYu_vYUjb zc+AqlgjXdBeowpgp@3H5uaP*2(#+I+Z(*T5Mmnmgo)}n{f~!IcqtL&ufQ)-*gd&$( z&KuWP8r+Q7U@d+>SCesx#0#(kG)498cijCMXcdQ6Knpe?N8`lIbecDl<-h_9* zM_3AqYOaW`;?xdC{hZ2$L!Sl0_!Ludj!}YY??28(R6gu!wz^<;sI>Q^YK8lmZ=y7F zXPrt-8P^x+#Q2PvzjNRHGP?C>n6rE|Bj>>(q^9<2(Auf+`}v*^>bnh!GUx6ny7uit zZy&^0>F9#UpVyzH*USaf{5*RN;f|?7-k=c`0V+r;I#1qBcIJxY*C9Q7POtfkVn5bm zA8>(eg z6gt0tYg)6%wwDCga8l{dq_U+<1fYEOvsYog zmuBt`D*$RoeOkdMJP-G?Y-)Xql8+gkE3a(1A5lk28!UDj6~(f0%Nh=TAIuM9%Gh}V z&CAguTM-s&O!PtH9ivWhA^=~2(xdu*Bzf!beSGaA5AvBml(aE(OWCUe%#zO&#pdSE z4Uaxigl5-OXFE9pTl|OP!M5!pSiK%JlQA5HVy<)nRKLYDTQwF@eW=mxSuAV7bNdSh zV}$|v72jfGTx{Om=q{)_Refam(c$A{_dN+f(7@yG>lN?Pc9mvuIU~7>Sy1s+kX4t; zk{3N3w#Q)xP0Oj6{7-rD{8I5|iXNY#QS(OUR&ED@&9eJfOUG zGmA23I)@C2J`99LwLTwe5jZuG_I>Ze*qH7jU$}ENVaeJMPd4ADCOO&cblFcSr8+%W z*qI^yy~n)BVJR3b6JEDXBP6tLh8*(qV7EG18Cu%u7hAWuj!LQ;Vr14h{d)V_ zQpLT5(KY-?q8h7SyYNpbJsi#h7%nc3Eto#4GS{B7T>!bd9|%&b>r>G#B^ET8LmxJm zsMLYE(t3NmG}XC*CsP_`nH<$!ex~9oBQ7bSwAp@U1CoZPqbV2cRQjX0(R76QscPd&li@?zo zxg8<)$^bY;gr}GvPvSzmsI;bWe*vaQuV>1<6sG79G-Xz}BK+HCaq= zgP)$!HZiLsN3*8Qs8$5N;iQz`N!v^5&UrF@seR!ekd!2I_X&*-Ta z!wyc7Abt0}!@iOsp0@#hFv0_9Q~ff`rzA`JVK_#2x<4wm}Y&>(`G3r98i` zf++E1k7PS{C*>I^H1X35I!MZbjLLAj`H$u|j>ePDJ~mb^bH}mKZ1W2ID_6IZ2sjkv zj}CL0!^^{=;U58k#-i1ZuFE#6FwiV8J72N>D*i%>6Mf}qxvKX%8pYKoynNz8_6{SXS<;Ck%Ny+#u z+@ib~P7R$c0yw>PI9CH2s7*n)La%;Ak|`<3d2EygEg0^Fm_bZ>e_%3_p&$COxyL27 z-IWZpQRpcVAm0%O63g*<<6L}eG5++Ba`WORfO3NtZnLp4_-g5=fMQj(TWp=bmfGLE zMR}6?QM$hd^NOn3jMgzw+|L)D+j|!a0ym~-lG(?9Xzovy&1d1MSg|YNv1&_=a3>Zp zzWl1z{dDfp6~+ajVqza z#X7s9JGc2R_mxtM*=1P0?Ba4^F3}P{<>now;_lLx5$wVXNXk#_S5}6ArWU2=X|YA5#oXgyj zAYFqN#Y$|gGE7xzS_!KcC|aGg-=W`7u%Xjc^}%kNwpi+M!9Am8`Q_Of%Fl&sW^8%m z?{c&gGq{&C8X|cGS?W+sCa>GP7;Gpw+uWhttZ{AkC9q)Ot@*{*I~LOZS+zprY(a3q zcG+OV>nc0{yGRk>UvUQZrK8R3u`fWj_UYCt5r7a2vFoa@)ELemwjdUrdHx^H$lgm} z^ytF4<~?_21V8wanGx7Z}I3)`r;)keX_id=ZA8 zi92pOJ@K83rSbAl_9nB1Q1<$VN{nBB!dRAzeq&c9b@kqJrNr(WiAS>URD0{JU+L76e14YR|gxcdA^= za(%yZ^r#?o-P#`S7{ZJe_hx9A>`S8uUTd~YY&0ur_TU{cOY`$xrpqUs?^{dHzIavN z6?0Ys_K^!gvM>1d`cIjT?iC)WSJVo?pW~w66<~KJ&w_d`-|)mli_D~-%U-t;rnjgA zv!9Lg8PiGL?gi*lr~&!H>fQ&E*&9h84_CnmUQMFyJCg8igPAv<50A?gPZtiihKCUsIdk4jcmQu}y*cpqsnlQ9uG);g*r>!w$ zOFT4n`_;(5loZNcz@`J!>C?J6nhY7X!91NNVm?#{Uruk+{m^v%ivjV$!=J0a6Y>SI z`Yz2;g?6QMDlx7?)|VTMuzJ}I#|)o5>o<%|317q6GR=UyRfwAbkvS@exUsaRE+%gx zd0_KAyPJZ{;|`LpSvNyik>fm75Py4233JG_sFr7RLVs7Li=-R6k;E9pV#<_irYBxa zOLFXKOHAGQsqOtMGbx&neQ^5aprus7mYSB%gUg;FT{ndv4$2;je0?eh*Q0)kciuPr zrPfNa@?!jnJQJ2i1`pJ~Z-3$aiE2xp(+8HGQ+7s1zOS7XQpBNAbjl^;8`EbfZTfzX z|NViTcS})+buY5nRMWwjH?QS&9WrL6OCzTv^84;M=E_z`$gi7vIMbN2eKBkGV@ZDk zU7prwl+X!nzv9zf#qD{;?;6CkJozr+_Oy1a;U%3==wlyY7_8g_$ZmItU6^7gH%LPc ztLxa-so7K5Uq&z%EhJo$Dp{ym?3W5F87Re2gdd12=^2If%3GT2>+}N3#I*Sp0m17 z{XV|B$Mqju!KZZ zP*WdvbwKDeH7YC>ogyC5-c(x~rsM5_-1h$}Gg(?xDCT;dKyRi*FrMHF+keOt*d|AY zxzR>Mq3lYqnlRQ|gi4R>o(`_(8!;u&&Dxq4KO)UbsNt`9k!lIwvHHY2M;sxij0kii zzC?x<{=F%N@K@Sh&f^~i@rI+&n{b9wVBL{HF^O=L} zPD$)l!ksJ!IJLG(gN(6R=7I@+Dj4C`Q_ty}9l(x?*nvnQ*i$Ah4KELV&m6k!?Wo_C zCP7j-Bifr)na5t%!W(~Uvg<=MlRM(SH+UI{tdFLO4SVCw6#Kq+eZ3UOL55tN(}}H7 z^>zHPQ&-ujND8g99t=GI$98cgh~N}v1Mqytse`J1^+RyPlR;Jf|CHY5hu*(aEHh}7 zxD`aU_dv9y2L0xl&)6Nqqqn^NJcnWe=bsKYzFbC@5N8?brW_Z4H zvD#RNHXA6bC@p-K2dThFu1-f!T@|yubT6{4UlHthNbXd8)SZi5;|gpgthBB?aXoV8CwtPNiA*65+!y~W|$#+8sKD{%wVx8?`w z_rBa-x+bQFMhY2(LJwpsK>o5cDX|*G>pcJaP4fS`&(0hgM;K_&G~9ah-}5Gh=2t5X H2$BB>EaabX literal 0 HcmV?d00001 From e7d51f540959f242de282c2ad465bc626312971a Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Wed, 29 Jun 2022 11:45:17 -0600 Subject: [PATCH 15/17] Update README.md --- README.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a370106..d9b68ed 100644 --- a/README.md +++ b/README.md @@ -82,18 +82,23 @@ snout length or preorbital depth | pOD | distance | length from t We create a class to add more fexibility and give a frame work for further developement. Here is a short description of the class "Trait_class", couples functionality and usage. The best way understand it is to play with the class using the Notebook. -Class Name : Trait_class -Location : Trait_class.py -Description : This class create an object "segmented_image" from [segmented_image.png](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/test_images/INHS_FISH_000742_segmented.png). Upon the initialization (creation of the object), the image.png is imported converted and is split in several channel corresponding to the traits (trunk, dorsal fin...) in the form of dictionnary with key = trait and value a mask. Then multiple function will extract information on individual channel. +1. Class Overview ++ Class Name : Trait_class ++ Location : Trait_class.py ++ Description : This class create an object "segmented_image" from [segmented_image.png](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/test_images/INHS_FISH_000742_segmented.png). Upon the initialization (creation of the object), the image.png is imported converted and is split in several channel corresponding to the traits (trunk, dorsal fin...) in the form of dictionnary with key = trait and value a mask. Then multiple function will extract information on individual channel. +### Usage and main fucntion: +2. Quick start Create a segmented image object +``` import Trait_class as tc img_seg = tc.segmented_image("image_segmented.png") -Main functions: -img_seg.get_channels_mask() : Create a dictionnary key = trait, value = mask for the trait -img_seg.get_presence_matrix() : Create presence matrix -img_seg.all_landmark() : found the landmarks -img_seg.all_measure() : calculate the measurment +``` +3. Main functions: + + img_seg.get_channels_mask() : Create a dictionnary key = trait, value = mask for the trait + + img_seg.get_presence_matrix() : Create presence matrix + + img_seg.all_landmark() : found the landmarks + + img_seg.all_measure() : calculate the measurment ## 4- Input and Output The main script is Morphology_main.py The usage is python Morphology_main.py input_file.png metadata.json measure.json landmark.json presence.json image_lm.png From d4b0e1d7fd49194fb34831422d0908b3c93346e6 Mon Sep 17 00:00:00 2001 From: thibaulttabarin <50921014+thibaulttabarin@users.noreply.github.com> Date: Wed, 29 Jun 2022 12:00:19 -0600 Subject: [PATCH 16/17] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d9b68ed..bbcde99 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ This tool is a part of a bigger project, find the overview [here] The segmented image input looks like this. It is produced using Maruf segementation (semantic) code based on CNN (unet) deeplearning algorithm, more description on the repo. The output is 11 classes (11 trait : 'dorsal_fin', 'adipos_fin', 'caudal_fin, 'anal_fin', 'pelvic_fin', 'pectoral_fin', 'head', 'eye', 'caudal_fin_ray, 'alt_fin_ray', 'trunk') that are color coded. -![segmented fish image](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/test_images/INHS_FISH_000742_segmented.png) +![segmented fish image](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742_segmented.png) Need the color legend. From 8d60573207eca287a6801aed5b97a63533eebebc Mon Sep 17 00:00:00 2001 From: Thibault Tabarin Date: Wed, 29 Jun 2022 21:15:29 -0400 Subject: [PATCH 17/17] update name for the measurment notebook update + new test_Data Update README.md fix error .json serialization... in Moprhology_main.py Update README.md remove cpython-38.pyc remove __pycache --- README.md | 31 +- .../Morphology_dev-checkpoint.ipynb | 1063 +++++++++++++++++ Scripts/Morphology_dev.ipynb | 754 +++++++++++- Scripts/Morphology_main.py | 16 +- Scripts/Traits_class.py | 66 +- .../__pycache__/Traits_class.cpython-37.pyc | Bin 12214 -> 0 bytes .../__pycache__/Traits_class.cpython-38.pyc | Bin 13135 -> 0 bytes Test_Data/INHS_FISH_18609.json | 1 + Test_Data/INHS_FISH_18609_image_lm.png | Bin 0 -> 5499 bytes Test_Data/INHS_FISH_18609_landmark.json | 1 + Test_Data/INHS_FISH_18609_measure.json | 1 + Test_Data/INHS_FISH_18609_presence.json | 1 + Test_Data/INHS_FISH_18609_segmented.png | Bin 0 -> 4083 bytes 13 files changed, 1865 insertions(+), 69 deletions(-) create mode 100644 Scripts/.ipynb_checkpoints/Morphology_dev-checkpoint.ipynb delete mode 100644 Scripts/__pycache__/Traits_class.cpython-37.pyc delete mode 100644 Scripts/__pycache__/Traits_class.cpython-38.pyc create mode 100755 Test_Data/INHS_FISH_18609.json create mode 100644 Test_Data/INHS_FISH_18609_image_lm.png create mode 100644 Test_Data/INHS_FISH_18609_landmark.json create mode 100644 Test_Data/INHS_FISH_18609_measure.json create mode 100644 Test_Data/INHS_FISH_18609_presence.json create mode 100755 Test_Data/INHS_FISH_18609_segmented.png diff --git a/README.md b/README.md index bbcde99..e65f4f0 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,11 @@ img_seg = tc.segmented_image("image_segmented.png") ## 4- Input and Output The main script is Morphology_main.py The usage is python Morphology_main.py input_file.png metadata.json measure.json landmark.json presence.json image_lm.png +Code to test using the data provided in [/Test_Data/]() +``` +Morphology_main.py Test_Data/INHS_FISH_18609_segmented.png Test_Data/INHS_FISH_18609.js +on Test_Data/INHS_FISH_18609_measure.json Test_Data/INHS_FISH_18609_landmark.json Test_Data/INHS_FISH_18609_presence.json Test_Data/INHS_FISH_18609_image_lm.png +``` + input_file.png : segmented fish image generated by [Maruf code](), [example here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742_segmented.png) + metadata.json : generated by [drexel]() [example here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Test_Data/INHS_FISH_000742.json) @@ -120,6 +125,26 @@ You will need to use [Morphology_env.yml](https://github.com/thibaulttabarin/Mor We use github action to create a container what run the main script [Morphology_main.py](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Scripts/Morphology_main.py). 1. The workflow to build the container is defined [here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/.github/workflows/Deploy_Morpholgy.yml). 2. The Dockerfile definition is [here](https://github.com/thibaulttabarin/Morphology-analysis/blob/main/Dockerfile) - 3. Pull command : docker pull ghcr.io/thibaulttabarin/morphology-analysis/morphology:0.0.2 or singularity pull My_morphology_name.sif - 4. To access the instruction Run : "singularity run My_morphology_name.sif" or - 5. Usage : singularity exec My_morphology_name.sif Morphology_main.py + 3. Pull command : + ``` + docker pull ghcr.io/thibaulttabarin/morphology-analysis/morphology:latest + #or + singularity pull My_morphology_name.sif docker://ghcr.io/thibaulttabarin/morphology-analysis/morphology:latest + ``` + 4. To access the instruction Run : " + ``` + singularity run My_morphology_name.sif + ``` + 5. Usage : + ``` + singularity exec My_morphology_name.sif Morphology_main.py + # test with + singularity exec My_morphology_name.sif Morphology_main.py Test_Data/INHS_FISH_18609_segmented.png Test_Data/INHS_FISH_18609.json Test_Data/INHS_FISH_18609_measure.json Test_Data/INHS_FISH_18609_landmark.json Test_Data/INHS_FISH_18609_presence.json Test_Data/INHS_FISH_18609_image_lm.png + ``` +## 7- Development tricks + +If you want to test neww version of Morphology_main.py (upudated version on your local computer) you can use the container by bind the local folder (here, Scripts/) containing the updated version of Morphology_main.py and /pipeline/Morphology is where Morphology_main.py is expected to be in the container. +``` +singularity exec --bind Scripts/:/pipeline/Morphology morpho.sif Morphology_main.py Test_Data/INHS_FISH_18609_segmented.png Test_Data/INHS_FISH_18609.json Test_Data/INHS_FISH_18609_measure.json Test_Data/INHS_FISH_18609_landmark.json Test_Data/INHS_FISH_18609_presence.json Test_Data/INHS_FISH_18609_image_lm.png + +``` diff --git a/Scripts/.ipynb_checkpoints/Morphology_dev-checkpoint.ipynb b/Scripts/.ipynb_checkpoints/Morphology_dev-checkpoint.ipynb new file mode 100644 index 0000000..87e6a5a --- /dev/null +++ b/Scripts/.ipynb_checkpoints/Morphology_dev-checkpoint.ipynb @@ -0,0 +1,1063 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "98a152cd", + "metadata": {}, + "source": [ + "# Development for morphology trait extraction\n", + "\n", + "This notebook gives examples and a platform to develop and visualize extraction on morphological traits\n", + "The functions used are define in a class \"Traits_class\" that you can find in the same folder (Morphology-analysis/Scripts/Traits_class.py).\n", + "If you want modify the \"Traits_class.py\" reload the module by running the first cell to see the modification appear in the notebook.\n", + "\n", + "**Study case:**\n", + "To illustrate the morphology workflow and functionality, we are using the 2 images :\n", + "\n", + " + Morphology-analysis/Test_Data/INHS_FISH_000742_segmented.png\n", + " + Morphology-analysis/Test_Data/INHS_FISH_18609_segmented.png\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "602dc370", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# load what you need\n", + "import Traits_class as tc\n", + "import json, sys\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from PIL import Image, ImageDraw, ImageFont\n", + "from IPython.display import Image\n", + "import importlib\n", + "import skimage as ski\n", + "importlib.reload(tc)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e620246b", + "metadata": {}, + "outputs": [], + "source": [ + "# load the test image, you can add more test image if you have bug related to specific images.\n", + "segmented_file = '../Test_Data/INHS_FISH_000742_segmented.png'\n", + "metadata_file = '../Test_Data/INHS_FISH_000742.json'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2289de98", + "metadata": {}, + "outputs": [], + "source": [ + "# Create the object segmented image create by the class during initialisation\n", + "img_seg = tc.segmented_image(segmented_file)\n", + "\n", + "# oupput the variables create at initialization time\n", + "measurement = img_seg.measurement\n", + "landmark = img_seg.landmark\n", + "presence_matrix = img_seg.presence_matrix\n", + "img_landmark = img_seg.visualize_landmark()" + ] + }, + { + "cell_type": "markdown", + "id": "070251e3", + "metadata": {}, + "source": [ + "## 2 - Explore the output\n", + "\n", + " 1- Presence Matrix\n", + " 2- Landmark\n", + " 3- Visualize landmark\n", + " 4- measurement" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ae9eb407", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'dorsal_fin': {'number': 1, 'percentage': 1.0},\n", + " 'adipos_fin': {'number': 0, 'percentage': 0},\n", + " 'caudal_fin': {'number': 1, 'percentage': 1.0},\n", + " 'anal_fin': {'number': 1, 'percentage': 1.0},\n", + " 'pelvic_fin': {'number': 1, 'percentage': 1.0},\n", + " 'pectoral_fin': {'number': 1, 'percentage': 1.0},\n", + " 'head': {'number': 1, 'percentage': 1.0},\n", + " 'eye': {'number': 1, 'percentage': 1.0},\n", + " 'caudal_fin_ray': {'number': 0, 'percentage': 0},\n", + " 'alt_fin_ray': {'number': 0, 'percentage': 0},\n", + " 'trunk': {'number': 2, 'percentage': 0.992120507069956}}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# presence dictionnary\n", + "presence_matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "b24d03d1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'SL': 586.0034129593445,\n", + " 'EA': 922,\n", + " 'HAt': 8437.999999999995,\n", + " 'HAp': 16034,\n", + " 'HCL': 'WIP',\n", + " 'ED': 34.262616074167774,\n", + " 'HL': 151.64761785138597,\n", + " 'HD': 158.3161394173064,\n", + " 'pOD': 32.31098884280702}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# measurement dictionnary\n", + "measurement" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ffda5440", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'1': (148, 36),\n", + " '2': (66, 148),\n", + " '3': (21, 301),\n", + " '4': (106, 566),\n", + " '5': (112, 606),\n", + " '6': (150, 622),\n", + " '7': (203, 592),\n", + " '8': (200, 562),\n", + " '9': (242, 478),\n", + " '10': (279, 305),\n", + " '11': (217, 169),\n", + " '12': (162, 187),\n", + " '13': (224, 138),\n", + " '14': (136, 66),\n", + " '15': (134, 96)}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# landmark dictionnary\n", + "landmark" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8b7d1b1a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Visualize landmarks \n", + "img_landmark" + ] + }, + { + "cell_type": "markdown", + "id": "100fd501", + "metadata": {}, + "source": [ + "## 3- Explore the class works\n", + "\n", + " 1. Create the object Masks extraction : \n", + " During the creattion of the object everything will happened automatically. We will detail the different step that has happened under the hood. The image is imported from the input file, the image is then convert in to 11 masks corresponding to each traits then, we clean the masks and extract morphological info such as area, centroid, landmarks... then we calculate the different measurements we want.\n", + " 2. Import the image and Masks extraction\n", + " 3. Clean the mask\n", + " 4.\n", + " 5. " + ] + }, + { + "cell_type": "markdown", + "id": "493c71c2", + "metadata": {}, + "source": [ + "### 1- Masks extraction \n", + "\n", + " + Import the image : \n", + " + Function to convert the image.png in to a disctionnary with key = trait ('trunk', 'dorsal_fin'...)\n", + " masks = img_seg.mask\n", + " + Visualize the mask\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "f9ce0bf1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is the list of the trait ['dorsal_fin', 'adipos_fin', 'caudal_fin', 'anal_fin', 'pelvic_fin', 'pectoral_fin', 'head', 'eye', 'caudal_fin_ray', 'alt_fin_ray', 'trunk']\n" + ] + } + ], + "source": [ + "# Convert the image.png the dictionnary of mask\n", + "# 1- use the variable \"mask\" which is created by the function \"img_seg.get_channels_mask()\"\n", + "masks_dict = img_seg.mask\n", + "\n", + "print(\"This is the list of the trait :\",list(masks_dict.keys()))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "fccc32b4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAACnCAYAAADqiRxlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAUFklEQVR4nO3dfXRU9Z3H8fd3ZkICieFBBQMJAp6IAhVE5EF3WytSkW2F1q3iI1q7VMWqtbsW2q2ntmuP1dbSs2qVaguWVhYfWtBaRWk9bUVUVFQeDM+V8KjIMxJI8t0/cjlNJZBJMpN75+bzOidn7vzmztxPePjk5jd37jV3R0RE4iURdgAREck8lbuISAyp3EVEYkjlLiISQyp3EZEYUrmLiMRQ1srdzEabWYWZrTKzydnajoiIHM6ycZy7mSWBFcAooBJ4HbjU3ZdlfGMiInKYbO25DwVWufsadz8AzALGZmlbIiLyCdkq9x7A+nr3K4MxERFpBaksva41MPZP8z9mNhGYCJAkeUYHirMURUQknnaz/UN3P76hx7JV7pVAWb37pcDG+iu4+zRgGkCxdfFhNjJLUURE4ulFf+LvR3osW9MyrwPlZtbbzNoB44G5WdqWiIh8Qlb23N292sxuBJ4HksAv3X1pNrYlIiKHy9a0DO7+LPBstl5fRESOTJ9QFRGJIZW7iEgMqdxFRGJI5S4iEkMqdxGRGFK5i4jEkMpdRCSGVO4iIjGkchcRiSGVu4hIDKncRURiSOUuIhJDKncRkRhSuYuIxJDKXUQkhlTuIiIxpHIXEYkhlbuISAyp3EVEYkjlLiISQyp3EZEYUrmLiMRQKuwAbU2ioABr356DA3qxbUABJU+/T3XlhrBjiUjMqNxbSaqslO1nldLpuveZWPoXyvOepX+79pza7QZ6fk/lLiKZpXLPpkSSg+cOYuPEA3z7tD8ytmg9HRPtgwfrbv/zkqd46pEhVK+vDC+niMSOyj1LUr16svrujswb/jN6poqC0faHrXdV8Qbu+Y8vcuLtKncRyRy9oZphqRPL+Pv3R3DJcwtYevaMesXesDxL8sgV91Pz2cGtlFBE2gLtuWdI6sQyVk0s5fZ/n834og9IWoJ0f3aeXZBgy0376f6SgXt2g4pIm6A99xZKHHMM6/5nBJfNW0DFNT/n8mO2BcXeNH84Yxo155yehYQi0hZpz72ZLJViz7gz6HTj+ywpv488S7bo9Xqmithy0356/K0dfvBAhlKKSFulPfemMiMx4BQq7hvMH6ZO5ZmT/9jiYj9k7uBpHPjMpzLyWiLStmnPvQmqxpzJ+kureeSsGZzTvpaGjn5pid55Raw/rx19Xszoy4pIG6Ryb4wZif59qbiuI9PHPMSnC7K7ue+Oe5z/u3+4jnsXkRZpdFrGzH5pZlvNbEm9sS5m9oKZrQxuO9d7bIqZrTKzCjM7P1vBW0Oyf19W3jeUKXNnseZL2S92gKuKP2T1V3tmf0MiEmvpzLlPB0Z/YmwyMN/dy4H5wX3MrB8wHugfPOcBswxNSLcGM3zEQKpHnsHK/x3GbXMfZ80XW6fU6/v2JbOxMzX3LiLN1+i0jLv/xcx6fWJ4LHBOsDwDeAn4VjA+y92rgLVmtgoYCrySobxZkyorZdXEMp676h5KU+0z9iZpc1xV/CE//k41PS4vpHbv3tByiEjuau7RMt3cfRNAcNs1GO8BrK+3XmUwFlmJggJ2XTacL7/wGsu+cj+984pCLfZDXj/zUSruHhB2DBHJUZk+FNIaGGvwI5dmNtHMFpnZooNUZThGGhJJ9l40DPtjF5790b1cXby1WR8+ypZ8y2PWmPtInHZK2FFEJAc192iZLWZW4u6bzKwE2BqMVwJl9dYrBTY29ALuPg2YBlBsXVrvM/dmJPudzPJJHXnzCz+lc7ID0KHVNt8UZ7RLsvGzXTjhnbCTiEiuae6u6lxgQrA8AZhTb3y8meWbWW+gHHitZREzJ1lczNbrR/DNuU+wdty0oNijK2kJRl+9gOSxXcKOIiI5Jp1DIR+j7g3RvmZWaWbXAncBo8xsJTAquI+7LwVmA8uA54BJ7l6TrfDpslQKP2sgGx7twcLv/IyR7UOPlLZJx/6NqkG9w44hIjkmnaNlLj3CQyOPsP6dwJ0tCZVJlp/Pqh+ezlMXTeW0dgVAXtiRmqRnqogtk/bT489JqM2dH0oiEq7ovIOYaWZUXXAmO35XxuJLDhX7kdV4LQfD/yWjQXcMeJpUj5KwY4hIDonl6QcShYVs+NpAnr3lbkpTRcCRi73KDzL1o37M/PUoOmxy9ozbxa8GT2dofnT28C8q2sV/X9uTnt/TKQlEJD2xK/fUCd3YMb2QP/W/h+OSR78K0rx9edz68A2cOH013TcvAKDTTOP2wVdzyrQKppYsao3IaTl91HK231VA7f79YUcRkRwQq2mZ1And2D8zn5dPe4rjkoVHXXfevjzuvOUaety1gOrNW/7xgDv+xlJWXNaLmzaemeXE6bu/5x/Y/W8Dw44hIjkiNuWeOOYYdk4vZH6/uY2uO29fHnd+4xoKnjnyUZo1FatYdWUvfvhh30zGbLbOyQ4U3rCBREErn+hGRHJSbMr9o3EDeLr/zLTWveH311LwdOOH39csX8msGQ0eFBSK6eWz2DNGe+8i0rhYlHuioIDy65en9aGkyuo99H46/dMddH9pJ4urQjg9QgNKUkV8asrbpEojfboeEYmAWJT79osG8WDP59Jat8ohb9OutF/b33qP2TuiM/f+QI+FrPnKiWHHEJGIi0W51162jaJEenPRBzwB3oRT2dTWMOuvI5qZLDtuHj+HVMkJYccQkQiLRbnnJdP/8NH1Ky6jdl3TjhcvfD/8UwDXN6qwgtqunRtfUUTarFiUe1OYOSQaOjPxEZ+An7Uze4GaoVeqA+vGqdxF5MjaXLk/dPJvSfRswhuSluDC3u9mL1AzJC3BWRe8g+Xnhx1FRCIq58s9dUI3LuyRfvkmcbD099wThR3onBe9S919vdt8/PRoHIMvItGT8+W+d3BPJnZ6O+318w2qyjqlvf4HFw/gps7vNSNZdg3Kz2dH+dE/hSsibVdOl7vl57Nv0o4mXXSjNFXEkB+/QbJz43PWqR7dGX7dm+RbdE4iVt/2/mEnEJGoyulyT+Tnc1HPxU1+3ve7vs7yn5xEosORfyhYfj7bftGBn3V/pQUJs+uUEWvDjiAiEZXT5V6zaxe/njmKPbVNO1NivuWx4vyHWDGtL4lB/SDxz4c6JgoL2TjpDOZ+akakLpotIpKunD/lb+m9ixh1zuW8MvDJJj0vz5KsPvdXLDyrhktf+hqprXVTL7UFzqTz5nFFx3l0beTMkiIiUZXz5e4HD2Azjod7m/f84QVJ1o5+uIFHVOwikrtiMefQaf5qzlkyjhqvDTuKiEgkxKLcaz74gMIJ+xm59EthRxERiYRYlDtA9abNdLhyH/1+fgPTd3UNO46ISKhiU+4ANVu2UvaDBTxw10W8X70n7DgiIqGJVbkf0vnR1xj90G1hxxARCU0sy53aGnpNW8lnl47Vm6wi0ibFs9ype5O1w1VVepNVRNqk2JY71L3JWnjVx4xcdmHYUbKiujbWf30i0gKxb4fqzVtI3HEsL++P3/TMhjm9wo4gIhEV+3IHSPz1LW6bfAML96d/Ob5cULCtCdeCFZE2pU2UO0DR7IVc8btJHPR4FPyTe4o57uVNYccQkYhqM+UOUH77uwz42zVhx2ixGq9l8lOXU73272FHEZGIalPlXrt3L73vqeXBHU24hmoEXb7uPMp/vAJc0zIi0rA2Ve4AvmgJc8cOo88LX8nJKZqF+2vY8v0+1Hy4LewoIhJhjZa7mZWZ2Z/NbLmZLTWzm4PxLmb2gpmtDG4713vOFDNbZWYVZnZ+Nr+B5qhZuYa+N65k4INfZ9rO7mHHaZJL519Hu+cXhR1DRCIunT33auCb7n4qMByYZGb9gMnAfHcvB+YH9wkeGw/0B0YDD5hZssFXDlHt7t2U/WABc84bxKjlX6DKD4YdqVGLq6ro+8C+sGOISA5otNzdfZO7vxks7waWAz2AscCMYLUZwLhgeSwwy92r3H0tsAoYmuHcGVO9YSN5F+9l+A9v5o4P+oUd56i21hSRWL857BgikgOaNOduZr2A04FXgW7uvgnqfgAAh86z2wNYX+9plcFYZNVs+4iu9y9g4eWncfGakU2+JmtrqPFabnj1Cmp362yXItK4tMvdzIqAJ4Fb3H3X0VZtYOywwzrMbKKZLTKzRQepSjdGVtUueY/d5+1l1H/dwsVrRkbqpGPTd3Wn73e341XR+LMSkWhLq9zNLI+6Yv+Nuz8VDG8xs5Lg8RJgazBeCZTVe3opsPGTr+nu09x9iLsPySO/ufkzrnb/foofW8ieL9Ryyq8n8eCOHmyvCXeee2ftxzz8g3FUr1kXag4RyR3pHC1jwCPAcnevfxnqucCEYHkCMKfe+Hgzyzez3kA58FrmIreOmu3b6TNlIXOG9WHMt25l6vZeoezJ76s9wJCZt9Lx8TdbfdsikrvS2XM/G7gSONfMFgdfY4C7gFFmthIYFdzH3ZcCs4FlwHPAJPccPKAcwJ3a3bsp/u1CXvj8QE59dBKz93Rs1ZKfVDmS8nsq8IMHWm2bIpL7zCPwKcdi6+LDbGTYMdKS6tOLynvb89zgX1CSKsradnbWfsyg577OqXdvp2bF6qxtR0Ry14v+xBvuPqShx9rcJ1RbqnrNOk740grG3HUbU7f3yso2dtZ+zJCZt9L3+ndU7CLSLCr35qitoesDC5j35aGUv3R1Rg+d/M3uY/nXn36Tk777hqZiRKTZVO4tULNsBSdNWMY5d3yDGzcMa9G5at45sJ+T5l/Do1eOoeQnC1TsItIimnPPkGRxMVsv6c+uc/fR/didPHbKzEbn5Cur9zB+2VVseP9YTn54P7z2biulFZE4ONqcu8o9Cyw/n49HDWTLmSlOG1nBZ7qsYFThe7xbVcLm6o5U1eZx/4ufo2xeDQXz39EHk0SkWVTuIbK8dlgyQfWZp9JuzRZqt32Eu6vQRaTFjlbuqdYO09b4wQP4wbrruFaHHUZE2gy9oSoiEkMqdxGRGFK5i4jEkMpdRCSGVO4iIjGkchcRiSGVu4hIDKncRURiSOUuIhJDKncRkRhSuYuIxJDKXUQkhlTuIiIxpHIXEYkhlbuISAyp3EVEYkjlLiISQyp3EZEYUrmLiMSQyl1EJIZU7iIiMaRyFxGJIZW7iEgMqdxFRGJI5S4iEkMqdxGRGGq03M2swMxeM7O3zWypmd0RjHcxsxfMbGVw27nec6aY2SozqzCz87P5DYiIyOHS2XOvAs5194HAIGC0mQ0HJgPz3b0cmB/cx8z6AeOB/sBo4AEzS2Yhu4iIHEGj5e519gR384IvB8YCM4LxGcC4YHksMMvdq9x9LbAKGJrJ0CIicnRpzbmbWdLMFgNbgRfc/VWgm7tvAghuuwar9wDW13t6ZTAmIiKtJK1yd/cadx8ElAJDzWzAUVa3hl7isJXMJprZIjNbdJCqtMKKiEh6mnS0jLvvAF6ibi59i5mVAAS3W4PVKoGyek8rBTY28FrT3H2Iuw/JI7/pyUVE5IjSOVrmeDPrFCy3B84D3gPmAhOC1SYAc4LlucB4M8s3s95AOfBahnOLiMhRpNJYpwSYERzxkgBmu/szZvYKMNvMrgXeB74M4O5LzWw2sAyoBia5e0124ouISEPM/bDp8FZXbF18mI0MO4aISE550Z94w92HNPSYPqEqIhJDkdhzN7MPgL3Ah2FnacRxRD8jKGemKWdm5ULOXMgIcKK7H9/QA5EodwAzW3SkXy+iIhcygnJmmnJmVi7kzIWMjdG0jIhIDKncRURiKErlPi3sAGnIhYygnJmmnJmVCzlzIeNRRWbOXUREMidKe+4iIpIhoZe7mY0OLuqxyswmh5zll2a21cyW1BuL1EVJzKzMzP5sZsuDi6fcHNGcOXWRl+DMp2+Z2TNRzWlm68zsXTNbbGaLIpyzk5k9YWbvBf9OR0Qtp5n1Df4cD33tMrNbopazRdw9tC8gCawG+gDtgLeBfiHm+TQwGFhSb+xuYHKwPBn4UbDcL8ibD/QOvo9kK2QsAQYHy8cAK4IsUctpQFGwnAe8CgyPWs56eW8Ffgs8E8W/92Db64DjPjEWxZwzgK8Gy+2ATlHMWS9vEtgMnBjlnE3+vkLdOIwAnq93fwowJeRMvfjncq8ASoLlEqCioazA88CIEPLOAUZFOSfQAXgTGBbFnNSduXQ+cG69co9izobKPVI5gWJgLcH7eVHN+YlsnwNejnrOpn6FPS2TCxf2iOxFScysF3A6dXvFkcuZQxd5mQrcBtTWG4tiTgfmmdkbZjYxojn7AB8AvwqmuR42s8II5qxvPPBYsBzlnE0SdrmndWGPiAo1u5kVAU8Ct7j7rqOt2sBYq+T0LFzkJdPM7PPAVnd/I92nNDDWWn/vZ7v7YOACYJKZffoo64aVM0Xd1ObP3f106k4rcrT30sL+f9QOuBB4vLFVGxiLdFeFXe5pXdgjZC26KEk2mFkedcX+G3d/Kqo5D/EMXuQlC84GLjSzdcAs4FwzmxnBnLj7xuB2K/A76q5NHLWclUBl8FsawBPUlX3Uch5yAfCmu28J7kc1Z5OFXe6vA+Vm1jv4CTqeuot9REmkLkpiZgY8Aix393sjnDMnLvLi7lPcvdTde1H37+9P7n5F1HKaWaGZHXNombp54iVRy+num4H1ZtY3GBpJ3bUdIpWznkv5x5TMoTxRzNl0YU/6A2OoO+JjNfCdkLM8BmwCDlL3k/pa4Fjq3mxbGdx2qbf+d4LcFcAFrZTxX6j7dfAdYHHwNSaCOU8D3gpyLgFuD8YjlfMTmc/hH2+oRiondXPZbwdfSw/9X4lazmC7g4BFwd/974HOEc3ZAdgGdKw3Frmczf3SJ1RFRGIo7GkZERHJApW7iEgMqdxFRGJI5S4iEkMqdxGRGFK5i4jEkMpdRCSGVO4iIjH0/1xedi1qt9iKAAAAAElFTkSuQmCC\n", + "text/plain": [ + "

" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize the mask for a specific trait\n", + "trait_name = 'head'\n", + "plt.imshow(masks_dict[trait_name])" + ] + }, + { + "cell_type": "markdown", + "id": "486170f3", + "metadata": {}, + "source": [ + "### 2- Clean the mask and presence matrix\n", + "\n", + "Clean the mask involve:\n", + " + Assessing the number of blob and decide what we keep and what we discard\n", + " + Filling up hole in the blob\n", + " + Create the presence matrix with Number of blob and the percentage of the biggest\n", + " \n", + "We will use the module skimage.measure.regionprops to manipulate the mask, find the individual blobs and access properties of the \"region\" (blob) such as centroid, area, bbox... (reference : https://scikit-image.org/docs/dev/api/skimage.measure.html)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b65c0131", + "metadata": {}, + "outputs": [], + "source": [ + "# Example of problem, the head trait mask as hole inisde correspond to the eye.\n", + "# we want the whole head especially if we want to calculate area\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b92fee15", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a regionprop that has been cleaned\n", + "# Remove hole \n", + "# Keep only the big blob\n", + "# regionprop_object has mutiple properties\n", + "regionprop_head = img_seg.clean_trait_region(masks_dict['head'])" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "be28ead1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "area : 16034\n", + "centroid : (148.13259323936634, 119.70369215417239)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Explore Regionprop_object properties\n", + "# full list of properties is here https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops\n", + "print(\"area :\", regionprop_head.area)\n", + "print(\"centroid :\", regionprop_head.centroid)\n", + "# display the image of the new mask correponding to the clean trait mask\n", + "plt.imshow(regionprop_head.image)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "f5eea310", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Example with other image with 2 pevilc fins\n", + "# load the test image, you can add more test image if you have bug related to specific images.\n", + "segmented_file = '../Test_Data/INHS_FISH_18609_segmented.png'\n", + "img_seg_2 = tc.segmented_image(segmented_file)\n", + "masks_dict_2 = img_seg_2.mask\n", + "plt.imshow(masks_dict_2['pelvic_fin'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "6bb2a90a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# During the clean step we remove the small blod and keep only the big one\n", + "regionprop_pelvic = img_seg.clean_trait_region(masks_dict_2['pelvic_fin'])\n", + "plt.imshow(regionprop_pelvic.image)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "03bf6f15", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'dorsal_fin': {'number': 1, 'percentage': 1.0}, 'adipos_fin': {'number': 0, 'percentage': 0}, 'caudal_fin': {'number': 1, 'percentage': 1.0}, 'anal_fin': {'number': 1, 'percentage': 1.0}, 'pelvic_fin': {'number': 2, 'percentage': 0.9156065777226187}, 'pectoral_fin': {'number': 1, 'percentage': 1.0}, 'head': {'number': 1, 'percentage': 1.0}, 'eye': {'number': 1, 'percentage': 1.0}, 'caudal_fin_ray': {'number': 0, 'percentage': 0}, 'alt_fin_ray': {'number': 0, 'percentage': 0}, 'trunk': {'number': 2, 'percentage': 0.9499680160833409}}\n" + ] + } + ], + "source": [ + "# The presence matrix is created using the following function\n", + "presence = img_seg_2.get_presence_matrix()\n", + "# or directly access the variable\n", + "presence = img_seg_2.presence_matrix\n", + "print(presence)" + ] + }, + { + "cell_type": "markdown", + "id": "4f2d1e48", + "metadata": {}, + "source": [ + "### 3- Collect properties and landmark\n", + "\n", + "In this section there are multiple small functions to calculate and extract what we want from the mask, using either direct calculation on the mask or using the regionprop_object. You can explore the class on the repo, there are plenty of small functions with some redundancy (with different way calculate the same value) and some that are not necessarly used and function in jupyter notebook (particular visualisation functions)\n", + "\n", + "List of funtion: \n", + "\n", + " + img_seg.landmark_generic(trait_name) : return the most front_point , back_point, top_point, bottom_point, centroid, new_mask\n", + " + img_seg.landmark_5_7 : calculate specifically the landmark 5 7\n", + " + img_seg.all_landmark() : combine all the landmark in a dictionnary\n", + " + img_seg.visualize_landmark() : plot landmark on the original segmentation\n", + " \n", + "Now play" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "b64417f6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "most front point: (148, 36)\n", + "most back point: (162, 187)\n" + ] + } + ], + "source": [ + "front_lm, back_lm, top_lm, bottom_lm, centroid, new_mask = img_seg.landmark_generic('head')\n", + "print(\"most front point:\", front_lm)\n", + "print(\"most back point:\", back_lm)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "8208aa2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'1': (148, 36),\n", + " '2': (66, 148),\n", + " '3': (21, 301),\n", + " '4': (106, 566),\n", + " '5': (112, 606),\n", + " '6': (150, 622),\n", + " '7': (203, 592),\n", + " '8': (200, 562),\n", + " '9': (242, 478),\n", + " '10': (279, 305),\n", + " '11': (217, 169),\n", + " '12': (162, 187),\n", + " '13': (224, 138),\n", + " '14': (136, 66),\n", + " '15': (134, 96)}" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# landmark dictionnary\n", + "img_seg.all_landmark()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "99b54f95", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Visualize the landmark\n", + "img_seg.visualize_landmark()" + ] + }, + { + "cell_type": "markdown", + "id": "bd018bc8", + "metadata": {}, + "source": [ + "### 3- Measurement part\n", + "\n", + "Functions to calculate what we need to measure what we want!!!\n", + "\n", + " + img_seg.get_distance(a,b) : measure distance between two point\n", + " + img_seg.measure_eye_area()\n", + " + img_seg.measure_head_area()\n", + " + img_seg.measure_eye_head_ratio()\n", + " + img_seg.calculate_triangle_area(point_1, Poit_2, point_3)\n", + " + img_seg.measure_eye_diameter()\n", + " + img_seg.all_measure() create the following dictionnary using the previous fucntions:\n", + " + measure['SL'] = self.get_distance(landmark['1'],landmark['6'])\n", + " + measure['EA'] = self.measure_eye_area()\n", + " + measure['HAt'] = self.calculate_triangle_area(landmark['1'],landmark['2'],landmark['13'])\n", + " + measure['HAp'] = self.measure_head_area()\n", + " + measure['HCL'] = \"WIP\"\n", + " + measure['ED'] = self.measure_eye_diameter()\n", + " + measure['HL'] = self.get_distance(landmark['1'],landmark['12'])\n", + " + measure['HD'] = self.get_distance(landmark['2'],landmark['13'])\n", + " + measure['pOD'] = self.get_distance(landmark['1'],landmark['14'])\n", + "\n", + "Now play!" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "f4bf0c4f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'SL': 586.0034129593445,\n", + " 'EA': 922,\n", + " 'HAt': 8437.999999999995,\n", + " 'HAp': 16034,\n", + " 'HCL': 'WIP',\n", + " 'ED': 34.262616074167774,\n", + " 'HL': 151.64761785138597,\n", + " 'HD': 158.3161394173064,\n", + " 'pOD': 32.31098884280702}" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_seg.all_measure()" + ] + }, + { + "cell_type": "markdown", + "id": "e033c2f9", + "metadata": {}, + "source": [ + "## Development Section\n", + "\n", + "This is where we make a mess!!!" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "add5f243", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "82724" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "trunk_pro = img_seg.clean_trait_region(masks['trunk'])\n", + "trunk_mask = trunk_pro.image\n", + "pad_mask =np.pad(trunk_mask, ((1, 1), (1,1)), 'constant', constant_values=((0, 0),(0,0)))\n", + "list_contour = ski.measure.find_contours(trunk_mask)\n", + "erosion_trunk = ski.morphology.erosion(pad_mask)\n", + "plt.imshow(pad_mask)\n", + "np.all(pad_mask == erosion_trunk)\n", + "sum(sum(pad_mask))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "982c2856", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "d452f502", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(264, 474)\n", + "(262, 472)\n", + "1277.9453095790602\n", + "1277.9453095790602\n" + ] + } + ], + "source": [ + "print(pad_mask.shape)\n", + "print( trunk_mask.shape)\n", + "print(ski.measure.perimeter(trunk_mask))\n", + "print(ski.measure.perimeter(pad_mask))" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "5d3ae5d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "1427\n", + "(1495, 2)\n", + "1128\n", + "125136\n" + ] + } + ], + "source": [ + "contour_1 = ski.measure.find_contours(trunk_mask)\n", + "print(len(contour_1))\n", + "print(sum([a.shape[0] for a in contour_1]))\n", + "\n", + "contour_2 = ski.measure.find_contours(pad_mask)[0]\n", + "print(contour_2.shape)\n", + "\n", + "contour_ = np.logical_and(pad_mask, np.logical_not(erosion_trunk))\n", + "print(sum(sum(contour_)))\n", + "contour_3 = ski.measure.find_contours(contour_)[0]\n", + "print(sum([a.shape[0] for a in contour_]))" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "ee1e920f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[262.5, 145. ],\n", + " [262.5, 144. ],\n", + " [262.5, 143. ],\n", + " ...,\n", + " [261.5, 146. ],\n", + " [262. , 145.5],\n", + " [262.5, 145. ]])]" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "contour_ = np.logical_and(pad_mask, np.logical_not(erosion_trunk))\n", + "plt.imshow(contour_)\n", + "list_contour = ski.measure.find_contours(contour_)\n", + "list_contour_2 = ski.measure.find_contours(pad_mask)\n", + "list_contour_2\n" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "f5abdcdd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1495, 2)" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a =list_contour_2[0]\n", + "a.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "a7e0885b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1280.7737367037953" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "distance = lambda a,b: ((a[0] - b[0])**2 + (a[1] - b[1])**2)**0.5\n", + "distance(list_contour_2[0][0,:],list_contour_2[0][1,:])\n", + "a =list_contour_2[0]\n", + "list_segment = [distance(a[i,:],a[i+1,:]) for i in range(a.shape[0]-1)]\n", + "sum(list_segment)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "84e350d9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(trunk_pro.image)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6ee0446b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "caudal_fin = img_seg.mask['trunk']\n", + "\n", + "plt.imshow(caudal_fin)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cf78ee7e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(img_seg.mask['caudal_fin'])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cb94b95f", + "metadata": {}, + "outputs": [], + "source": [ + "_,_,_,_,center_caudal,new_mask_caudal= img_seg.landmark_generic('caudal_fin')\n", + "\n", + "row_caudal = round(center_caudal[0])\n", + "head_horil_line = new_mask_caudal[row_caudal, :]\n", + "#head_length = np.count_nonzero( cleaned_mask[:,col_eye]== 1)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "ed0dc8c6", + "metadata": {}, + "outputs": [], + "source": [ + "def landmark_5_7(img_seg):\n", + " '''\n", + " locate the landmark 5 and 7 of the caudal fin. \n", + " We split the caudal fin upper and lower part (horizontal line through the middle).\n", + " Then, in each case get the mot left point in the half of the caudal fin\n", + " '''\n", + " _,_,_,_,center_caudal,new_mask_caudal= img_seg.landmark_generic('caudal_fin')\n", + " mask_caudal_5 = new_mask_caudal.copy()\n", + " mask_caudal_7 = new_mask_caudal.copy()\n", + " row_caudal = round(center_caudal[0])\n", + "\n", + " mask_caudal_5[row_caudal:,:] = 0\n", + " mask_caudal_7[:row_caudal,:] = 0\n", + " \n", + " lm_5_7=[]\n", + " for temp_mask in [mask_caudal_5,mask_caudal_7]: \n", + " x,y = np.where(temp_mask)\n", + " y_front = y.min()\n", + " x_front = round(np.mean(np.where(temp_mask[:, y_front,])))\n", + " lm_5_7.append((int(x_front),int(y_front)))\n", + " return lm_5_7[0], lm_5_7[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "04909223", + "metadata": {}, + "outputs": [], + "source": [ + "lm_5, lm_7 = landmark_5_7(img_seg)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "f519df18", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_arr = img_seg.img_arr\n", + "def visualize_landmark(img_arr,coord):\n", + " text = '5' \n", + " \n", + " img = Image.fromarray(img_arr)\n", + " img1 = ImageDraw.Draw(img)\n", + " \n", + " #\n", + " #fnt = ImageFont.truetype(\"Pillow/Tests/fonts/FreeMono.ttf\", 15)\n", + " fnt = ImageFont.load_default()\n", + "\n", + " x,y = coord\n", + " xy = [(y-9,x-9),(y+9,x+9)]\n", + " img1.ellipse(xy, fill='gray', outline=None, width=1)\n", + " \n", + " img1.text((y-6, x-6), text, font=fnt, fill='black')\n", + " # Display the image created\n", + " \n", + " return img\n", + " \n", + "visualize_landmark(img_arr,lm_7)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (Morphology_env)", + "language": "python", + "name": "snakemake" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Scripts/Morphology_dev.ipynb b/Scripts/Morphology_dev.ipynb index bf342e3..87e6a5a 100644 --- a/Scripts/Morphology_dev.ipynb +++ b/Scripts/Morphology_dev.ipynb @@ -7,28 +7,31 @@ "source": [ "# Development for morphology trait extraction\n", "\n", - "This notebook gives example and a platform to develop and visualize extraction on morphological traits\n", - "The function framework is based on a class \"Traits_class\" define in the same folder.\n", - "if you modify the \"Traits_class\" reload the module by running the first cell to see the modification appear in the notebook.\n", + "This notebook gives examples and a platform to develop and visualize extraction on morphological traits\n", + "The functions used are define in a class \"Traits_class\" that you can find in the same folder (Morphology-analysis/Scripts/Traits_class.py).\n", + "If you want modify the \"Traits_class.py\" reload the module by running the first cell to see the modification appear in the notebook.\n", "\n", "**Study case:**\n", + "To illustrate the morphology workflow and functionality, we are using the 2 images :\n", "\n", - "\n" + " + Morphology-analysis/Test_Data/INHS_FISH_000742_segmented.png\n", + " + Morphology-analysis/Test_Data/INHS_FISH_18609_segmented.png\n", + " " ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 35, "id": "602dc370", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 43, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -40,25 +43,27 @@ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from PIL import Image, ImageDraw, ImageFont\n", + "from IPython.display import Image\n", "import importlib\n", + "import skimage as ski\n", "importlib.reload(tc)" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 2, "id": "e620246b", "metadata": {}, "outputs": [], "source": [ "# load the test image, you can add more test image if you have bug related to specific images.\n", - "segmented_file = 'test_images/INHS_FISH_000742_segmented.png'\n", - "metadata_file = 'test_images/INHS_FISH_000742.json'" + "segmented_file = '../Test_Data/INHS_FISH_000742_segmented.png'\n", + "metadata_file = '../Test_Data/INHS_FISH_000742.json'" ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 3, "id": "2289de98", "metadata": {}, "outputs": [], @@ -66,7 +71,7 @@ "# Create the object segmented image create by the class during initialisation\n", "img_seg = tc.segmented_image(segmented_file)\n", "\n", - "# variable create at initialization time\n", + "# oupput the variables create at initialization time\n", "measurement = img_seg.measurement\n", "landmark = img_seg.landmark\n", "presence_matrix = img_seg.presence_matrix\n", @@ -88,7 +93,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 4, "id": "ae9eb407", "metadata": {}, "outputs": [ @@ -108,7 +113,7 @@ " 'trunk': {'number': 2, 'percentage': 0.992120507069956}}" ] }, - "execution_count": 21, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -120,7 +125,37 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 5, + "id": "b24d03d1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'SL': 586.0034129593445,\n", + " 'EA': 922,\n", + " 'HAt': 8437.999999999995,\n", + " 'HAp': 16034,\n", + " 'HCL': 'WIP',\n", + " 'ED': 34.262616074167774,\n", + " 'HL': 151.64761785138597,\n", + " 'HD': 158.3161394173064,\n", + " 'pOD': 32.31098884280702}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# measurement dictionnary\n", + "measurement" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "id": "ffda5440", "metadata": {}, "outputs": [ @@ -141,13 +176,10 @@ " '12': (162, 187),\n", " '13': (224, 138),\n", " '14': (136, 66),\n", - " '15': (134, 96),\n", - " '16': (115, 81),\n", - " '17': (153, 81),\n", - " '18': (135, 81)}" + " '15': (134, 96)}" ] }, - "execution_count": 45, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -159,73 +191,707 @@ }, { "cell_type": "code", - "execution_count": 29, - "id": "60024ce2", + "execution_count": 7, + "id": "8b7d1b1a", "metadata": {}, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (1558273965.py, line 1)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m Input \u001b[0;32mIn [29]\u001b[0;36m\u001b[0m\n\u001b[0;31m list_order = [1:19]\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Visualize landmarks \n", + "img_landmark" + ] + }, + { + "cell_type": "markdown", + "id": "100fd501", + "metadata": {}, + "source": [ + "## 3- Explore the class works\n", + "\n", + " 1. Create the object Masks extraction : \n", + " During the creattion of the object everything will happened automatically. We will detail the different step that has happened under the hood. The image is imported from the input file, the image is then convert in to 11 masks corresponding to each traits then, we clean the masks and extract morphological info such as area, centroid, landmarks... then we calculate the different measurements we want.\n", + " 2. Import the image and Masks extraction\n", + " 3. Clean the mask\n", + " 4.\n", + " 5. " + ] + }, + { + "cell_type": "markdown", + "id": "493c71c2", + "metadata": {}, + "source": [ + "### 1- Masks extraction \n", + "\n", + " + Import the image : \n", + " + Function to convert the image.png in to a disctionnary with key = trait ('trunk', 'dorsal_fin'...)\n", + " masks = img_seg.mask\n", + " + Visualize the mask\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "f9ce0bf1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is the list of the trait ['dorsal_fin', 'adipos_fin', 'caudal_fin', 'anal_fin', 'pelvic_fin', 'pectoral_fin', 'head', 'eye', 'caudal_fin_ray', 'alt_fin_ray', 'trunk']\n" ] } ], "source": [ - "list_order = [1:19]" + "# Convert the image.png the dictionnary of mask\n", + "# 1- use the variable \"mask\" which is created by the function \"img_seg.get_channels_mask()\"\n", + "masks_dict = img_seg.mask\n", + "\n", + "print(\"This is the list of the trait :\",list(masks_dict.keys()))" ] }, { "cell_type": "code", - "execution_count": 46, - "id": "8b7d1b1a", + "execution_count": 17, + "id": "fccc32b4", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", "text/plain": [ - "" + "" ] }, - "execution_count": 46, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" } ], "source": [ - "# Visualize landmarks \n", - "img_landmark" + "# Visualize the mask for a specific trait\n", + "trait_name = 'head'\n", + "plt.imshow(masks_dict[trait_name])" + ] + }, + { + "cell_type": "markdown", + "id": "486170f3", + "metadata": {}, + "source": [ + "### 2- Clean the mask and presence matrix\n", + "\n", + "Clean the mask involve:\n", + " + Assessing the number of blob and decide what we keep and what we discard\n", + " + Filling up hole in the blob\n", + " + Create the presence matrix with Number of blob and the percentage of the biggest\n", + " \n", + "We will use the module skimage.measure.regionprops to manipulate the mask, find the individual blobs and access properties of the \"region\" (blob) such as centroid, area, bbox... (reference : https://scikit-image.org/docs/dev/api/skimage.measure.html)" ] }, { "cell_type": "code", "execution_count": null, + "id": "b65c0131", + "metadata": {}, + "outputs": [], + "source": [ + "# Example of problem, the head trait mask as hole inisde correspond to the eye.\n", + "# we want the whole head especially if we want to calculate area\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b92fee15", + "metadata": {}, + "outputs": [], + "source": [ + "# Create a regionprop that has been cleaned\n", + "# Remove hole \n", + "# Keep only the big blob\n", + "# regionprop_object has mutiple properties\n", + "regionprop_head = img_seg.clean_trait_region(masks_dict['head'])" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "be28ead1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "area : 16034\n", + "centroid : (148.13259323936634, 119.70369215417239)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Explore Regionprop_object properties\n", + "# full list of properties is here https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops\n", + "print(\"area :\", regionprop_head.area)\n", + "print(\"centroid :\", regionprop_head.centroid)\n", + "# display the image of the new mask correponding to the clean trait mask\n", + "plt.imshow(regionprop_head.image)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, "id": "f5eea310", "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Example with other image with 2 pevilc fins\n", + "# load the test image, you can add more test image if you have bug related to specific images.\n", + "segmented_file = '../Test_Data/INHS_FISH_18609_segmented.png'\n", + "img_seg_2 = tc.segmented_image(segmented_file)\n", + "masks_dict_2 = img_seg_2.mask\n", + "plt.imshow(masks_dict_2['pelvic_fin'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "6bb2a90a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# During the clean step we remove the small blod and keep only the big one\n", + "regionprop_pelvic = img_seg.clean_trait_region(masks_dict_2['pelvic_fin'])\n", + "plt.imshow(regionprop_pelvic.image)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "03bf6f15", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'dorsal_fin': {'number': 1, 'percentage': 1.0}, 'adipos_fin': {'number': 0, 'percentage': 0}, 'caudal_fin': {'number': 1, 'percentage': 1.0}, 'anal_fin': {'number': 1, 'percentage': 1.0}, 'pelvic_fin': {'number': 2, 'percentage': 0.9156065777226187}, 'pectoral_fin': {'number': 1, 'percentage': 1.0}, 'head': {'number': 1, 'percentage': 1.0}, 'eye': {'number': 1, 'percentage': 1.0}, 'caudal_fin_ray': {'number': 0, 'percentage': 0}, 'alt_fin_ray': {'number': 0, 'percentage': 0}, 'trunk': {'number': 2, 'percentage': 0.9499680160833409}}\n" + ] + } + ], + "source": [ + "# The presence matrix is created using the following function\n", + "presence = img_seg_2.get_presence_matrix()\n", + "# or directly access the variable\n", + "presence = img_seg_2.presence_matrix\n", + "print(presence)" + ] + }, + { + "cell_type": "markdown", + "id": "4f2d1e48", + "metadata": {}, + "source": [ + "### 3- Collect properties and landmark\n", + "\n", + "In this section there are multiple small functions to calculate and extract what we want from the mask, using either direct calculation on the mask or using the regionprop_object. You can explore the class on the repo, there are plenty of small functions with some redundancy (with different way calculate the same value) and some that are not necessarly used and function in jupyter notebook (particular visualisation functions)\n", + "\n", + "List of funtion: \n", + "\n", + " + img_seg.landmark_generic(trait_name) : return the most front_point , back_point, top_point, bottom_point, centroid, new_mask\n", + " + img_seg.landmark_5_7 : calculate specifically the landmark 5 7\n", + " + img_seg.all_landmark() : combine all the landmark in a dictionnary\n", + " + img_seg.visualize_landmark() : plot landmark on the original segmentation\n", + " \n", + "Now play" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "b64417f6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "most front point: (148, 36)\n", + "most back point: (162, 187)\n" + ] + } + ], + "source": [ + "front_lm, back_lm, top_lm, bottom_lm, centroid, new_mask = img_seg.landmark_generic('head')\n", + "print(\"most front point:\", front_lm)\n", + "print(\"most back point:\", back_lm)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "8208aa2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'1': (148, 36),\n", + " '2': (66, 148),\n", + " '3': (21, 301),\n", + " '4': (106, 566),\n", + " '5': (112, 606),\n", + " '6': (150, 622),\n", + " '7': (203, 592),\n", + " '8': (200, 562),\n", + " '9': (242, 478),\n", + " '10': (279, 305),\n", + " '11': (217, 169),\n", + " '12': (162, 187),\n", + " '13': (224, 138),\n", + " '14': (136, 66),\n", + " '15': (134, 96)}" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# landmark dictionnary\n", + "img_seg.all_landmark()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "99b54f95", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAE7CAIAAACqnHJOAAAY90lEQVR4nO3dbW6jyrqA0Tooo7gjPIOILGR5EFt7gGcUkXV/4KYJxhgwUF9rqdXqdBzHSbvtJ28VOAQAAAAAAAAAAAAAAEjEf2LfAKAW99n3NifdCoAzCCxgT/MVNU9jAcUQWMB2n+TUJI0FlEFgAUvtnlOTNBZQgK/YNwBI2jlRBVAYEyyoXYIJZYgF5E5gQUUSbKlXNBaQNYEFMbVtO/PmhzLKqUkaC8iXwII4Zlrqk8zKPaq2kWJAagQWnG1hPy3PrDqjaiHtBUQhsOBUq6ZTkxeWUzuSX8BBnKYBMiCqDjL6xuotYC8mWHCefiL1/IdXLrtue2chpQV8yMMInK2LquHvpOb+5xfANiZYcJLnllrYWIZYSfFTKbCEPVgQwfIlQlIzHGuJLeAVjw8QQdu2lggLYBkReMUEC84mrQrTN5YfWIGePVjwse/vJZdqv/7+PLNqibD9+bnfbltuGPGILaicwIIFliXUW8PGWvohPz+jvxFb2RFbUCFLhPBkp5w6SDN78+RXgqwhQoVMsODUolo1xHoeX22juhIktqBsJlhUI+251KEmh16qKy5jLSibCRYlSrulFg6x9hpfLXW7OeNALBoLyiOwKEXaUfVsJrPOTqsp5lsn01hQGIFFhnJrqRmjzEohrSbprXPILCiGwCJtBbVUSfTWcTQWlEFgkQYhlTnJtTulBVkTWMQjqkqktPYlsyBTAotziapqKK0dySzIjsDieKKqemLrcxoL8iKwOJK04jel9SGZBbkQWBxAV/GW85pupbEgCwKLnYgqNhNb68ksSJzA4jO6ir3IrPVkFiRLYLGVtOIIt1sYvBAyb2ksSJPAYj1pxTnMtBaTWZAagcUa0ooolNYyMgvSIbBYRlqRAqW1gMyCFAgs3pFWJEhpzdJYEJ3A4jVpRfqU1msyCyISWDzRVeTJaeJfUVpwPoHFH7qKIsisSRoLTiawkFYUSGZNkllwGoFVPXVF0ZTWiMaCcwisikkraqK0RpQWHEpgVUlaUSuZNaSx4DgCqzLSCkIISmtAZsERBFZN1BU8cyYtjQUHEFh1kFYw73YLIVReWjILdiSwSietYBUDLaUFexBYRVNXsI3MklnwGYGVpbZtZ958UFfwIeuGMgu2EliZmW6p0bukFeyu4pmWxoINBFY2ZtLq18V+fg6+IVAxmQUsI7DysLCuHhfWWHCoWjNLY8FyX7FvAEBuvr8fqVFZad01FixmgpWBfnz1/IeXH2KIBSeq6rzwGguW8D8lG11UDX8HEtF8fzfVHFxS1dAONjPBSt1zSy1sLEMsiKWSgZYf0GGG/yCZMcGC9FUy0DLKghkCKyfqCjJSQ2bdZRa84CjCbPR1JbMgI31jFbxu6OhCeCawMqOrIFOP0ir0zA7dFyWzoGeTe7ru98fj8PV6XfuxdrhD6gotLY0FHROs5PRdBZSsP1tpKCq2jLKgY4KVkJm0WjXEMr6CTBW2T0tmUTP3/yTc73eDK6AZjrXy50GNmplgxbcwrRYOsYyvoAQFLRqWlIywnMCKacPUaiazLpdLCKG5XD66TUBSiigtjUWFBFYcHy4IjjLr8juqNBaUJv/M0lisNLrL53cPElhnO2GvVdM0ofTzR0ONMs+s/J4hOdWqe3cG9yaBdZ4zt7EbYkGxZBaF2OuOnOh9SmCd4fwjBA2xoAb5ntYh0adEjnLyk2AS9y+BdayIJ18wxIJKZJpZSTwHsr+kBqwx72UC6yjRz2tliAVVkVnEllRaDcW5lwmsQ0Svq47GgtrILGJI4ilvVoS7mMDaWSJp1RFYUKccM0tjZSWhZ7rFzr6LCazdJJVWPY0F1ZJZ7CfFJ7j1Tr1/Cax9pFlXoQusEDQWVCu7zNJYKUn0qe0D592/BNankk2rniEWkFdmaawEpP7UttV5d66v0z5TedJPK4BO8/0d8sms7rFVZp3LM9rOTLBWy66rrBICf2V1IniNdaSM7gg7skSYquzqqmOVEBjKZZQVNNb+snwW29VJ9ymBtVSmadUxxAKe5ZJZGmsPGT+F7U1gJSPrtOoZYgGTssgsjbVVCc9fu7JEmIYy0qpjiAXMSD+zNNZi5TxzHUBgxVZSWvU0FjBPZuWvwCevXQmseIpMq84jsILGAuaknFkC67Vin7x2JbBiKDiteoZYwHJplpbGGij/aWtvAusUNRTVM40FrJVaaVXZWDU+Ye3NaxGeos66ChYKga3SyazKAqvSZ6u9nX2vqTGwqk2rniEW8IkTSuvatsM3L7/fDOU3Vu3PUwcQWEeSVj2NBXzooMy6PrVUb5hZJQaWZ6hDCazDqKsRpx4FPrdjZs2k1VCfWQU1lqenEwisA0irSQIL2NGHpbWwrjqXti2irjw3nSbC/aWIu+hr9/tdXb3iOwPsqPn+bvzM9t598IuSFTvBUg9LNJdL7JsAlGnVQGs0vmrbtv/9lfn3JsbzUXQRxklf53/KE6irpW43q4TAEbpp1oZ1w7jl1E6l3laeiapW2gRLWq1liAWc41VsDcdX7R9hQdzsm2Iz17b+E3kmSkqc3VDlTLCkFUDKnndojZIr1uxqYcnNXswTEGOFbHJXV5vdr9fYNwGo1OS++L5jzumt5Z9l6pK2q6cvWudkP8GSVgBlGKVVwtvYPe/wXt6Bpa4A2Gyy5OY3Y7WtfasZiblMl2tgSasd3a9XW92BWNqfn/br15PRktlV+/PzOAh6p1PJJzwwI0v5HUUorY4gsICIRoG16EN+ft5c4l14TW72WtR2hlh5iLzLPLMJlro6iCEWENHzEOvt5d9faPIkf6+rqx1YfktIVfxj+HIKLHUFwEemqktRcYT4ibeElxQEKNuiodTKSy69QoFVmiTaJvUJlq46jVVCIK6unGbWCndPq7/XfO7JtzhSEnUVEt/kfkRdNeG/jysP/+x+5bkTWEAixscVHpNWWzbX2+GetFTqKqQ8wdq9rvq0Gr2ptHqGWEAijhtWUa6E6iqkdms6u++4asJ/R3W1/L0AlGptxhlfsVxygXVmWo0uuePnBQBOlFzPpHWDdq+rQy9fJK/9DFRlxdGLxlfpSitmOgntwYpbV/1H2ZIFUJWIRy+yhxTrKqRzFGEKddXTWLa6A3V6c/TizYw/NYnWVUhkgpVUXQVzLIBaGVZlJd26CilMsFKrq17ljWWIBTDhdgvBGbBTkHRdhfRv3yp2qQNwrMnXkOZsGdRL5AlWsuOrEEJ7/b/hm5f6JjqGWADTbMaKKYO6CgJr0iithqrKrKZp/KwGMMFCYTR51FWIG1i71NX193mb2sv/Prm2mbQaqiezDLEAphliRZBNXYWsA2uUVkPbMmthXXU0FkDVDLHOllNdhYinafikrmbSqtOl0ofTLAB46fs73BqNxSvRJlibA+ttXQ0tb6zh+Kpt29Hvo3d1DLEAameh8CSZja9CrAnWvnvbdzTKqbd/D0DdDLFOkF9dhexu9HB81bbtc/eM/nLhtqr+YpPX+ervV83SsuYVoAGmOdT6cJmFSi/L2z2TQcd9xkOvH4BsZflMytFyulv0E6Mls6u/f7/m2MCJD39xtQDAwXKqlJGMb/rQ0bMrwu0W+xYAUJW8EyXaaRqO0MfQ5rHTr/1bg2t7fm9t7ve7YwkBJjhfA1MKCaxRA60tofbyv8eps9Z8YD2naXi43WznBOB4ec+uOlkG1vOcqebZEgAUpIS6CqedaHQUQJtnPxvOjLDtXKNvVTe+CiE44yjApMcuVauEnyukrsIJE6zJ2VLXSXU2St6sEgJwlHLqKhw6wVq4bLc2sw56qZzH5ZcNsapNw6ZpBBZAr/36Nado20qfHfZQVF2F4wLruN3ihwbW46NeZ1a1adWzSggQntLq17tk1mql1VXIMbDC4sbaVld/P/x3ZkmrjsACKjeTVr8uJrOWKrCuwkGBteEovw35MpNZH6ZV7x7+2eV6SiKwgJotrKvHhTXWe2XWVTh0k/vRp07ommyUWXulVVBXAHCsYusqHDHBGnXV8vNU7bIG14T/fn4lIYTQ/Hu/O+B2ggkWUK1+fLX8FT4MsV4rua5C8V/eZurqlfv6U5EBlGQ4OHCa663Kz4/SvsJd1vUsDgIw8rz7asnr3ratH0qfldYekwr8Ij/MI3UFwFtL6oonTZHhMenAr3N45zv5jrg9kpp/d70hAJTJEuEaTVVp1dn/KMK+pQ49FdZb9/DPhg3vtl4BwK7q6qpeyV/2PfyzYpTV/GtxEIC3bHJfo+TMmJflmdw3mJlm6aqFxqcc+/mJdUsAolh1ltHHh9R7moZ606pz4IlGk6KiPjF50vzugUZmAfBb7WnVOWqCFRYPsbzGX8qWvuyjzALq4KVy3lFXDwcGVmcms6RV4hbWVUdjATUQWLPU1V+HB1bn+fVzHK+XPoEF8GxhY1VWV9Jq7KTAmqSxUjasq9HBMq9ehEtjAfWYyaxq0kpUzYn53Wka/zapez5DrOOTAUII7c/P80+VbXtRV3QiH0XYNI05VoL68dVzSM1EVfv1ZYgFVOXxoHe7heC5jF/iF6g5Vo5MsABgRhJxo7Hyoq4Aqmdi90YqZdM0jczKQl9XXkkeAF5J60zuXWPZlZWOV7uvpBVA9e7pjGkSFPM0Da8IrBSsOglWxw53oFK1b3KXWRNS/KZYKwSAfNQcly8lmjIaK7q1L2RkfAVQMY01lm7HaCwAyIfG+kXE8NLyIZbxFQAh3GVWL8VN7kM2vKdgZsO7tAKofpP7M+Ob5AMraKxkjDJLWgE83FYfdl2B2hsrg8AKGisxzcr97wCFE1jTqm6sPL54G94BIDdVb8nKJlw0FgBkqNLMyqlaNBYAybE+uEh1jZVZsmgsAMhTXY2lV1jHDneAv4yv1qmosfILLEMsAMhWLVuysowVjQUAOSu/sXItFY0FQGTWBz9SeGNlnCkaCwByVvJyoUZhBTvcAR6Mr3ZTZmblHViGWABQhNIaK/tA0VinMb4CeDC+OkRRjVVCnWgsAM6jrg5UTmN9xb4B5MH4CiDcbiUVQKruhUx/Yt+AfRhiHUpdAairE5XwfS6nSzQWAEdRV6z0n9g3YH/3u/8DezK+Amp3u4UQBNbp8p6b5H3rJxll7UhdAbVTV9Hk/T0vc5N70zTmWAB5ab9+PSW1Pz+xbslf6iqyjDe8F7hEOCSzPmF8BZxjlFa/3hUxs9RVKrJsrDInWL1uuVBmAaRpJq2GF4iQWeoqIVnOsQqfYPU01lrGV8DR3tbVrwt/0FirFx8dM5iizBqr8AlWz64sgApNNtybqZi6Yg+1TLB6MmshEyzgUH36tG07+sPLD1kzxFo4Hhtfp7pKWk5DrJxu6y6apnEeB4BEdFE1/H2fq128+PjrkuoqdTn969SyRDhixRAgolW7r4YfddRud1vas5HNhvfqlgiHNNYr1geBQw0Da/kSYVi2SvjYYvX72uavvG096OUlg8bK4CYex3LhJN8T4DQHLRGOrh/OV+kS4ZBzZQEc7X69Dd+8XtuNV3T7cz3f35Pvf947v0TbXg2xspLBQqHAepBZHeMrYEejrnrW/hGWJVH3IN00g9IKL2MrHDkbI7bUG0tg/VL55nd1BexlPq0ul/Z6bbs/L6+fy+Vxyb+Z1RnGlpaqSNKNJbDGjLJCCOF2m/mJEGDG26nVaYyviEhgTetnOfWUlvEV8Im1XTUcYi28/Pgz3oPHLZIlsN6oZKClroBt4s6rnhur39EV1syu7HBnd55WFym7P8r+6oCD3K+3D+vqeSj1+SUhEVWfaHSDMkZZ1+t1+ObLH/JswwKm7D61ul7bV+9aklbPPySuPEdDd+ESHt7rk+6AQGBtkW9mjdJqaPrxSGMBfxy9Gni9tsM3V02tnhcKl3/s7wvn+vBesUQbS2Btl1dmzaTVkMwCnqVzYOArm4dYLy6W08N79QRWiXJprIV11bm82OzZfNsECnVJv6uGJneTzmTWggLL4xG+eokGlqMIP1LJMYad++2qsaAeedXVK5Onwlq8gNg/c1fxIJ+tRE83aoK1j5Qbazi+en6smXz0McSCymVaVwcfEp3u4zwJNpYJ1j7SH2U9/8S24ezGhlhQvEzTqnPwqUeHV53uo32tkptjmWDtbK/GGu2aulw2Zs3kGRneTrCCIRZUKeu66px7Xj+ZlZqEGssEa2efj7ImN6R3f7k5s3ZkiAWlKqCuwtmvn9N9JpnFBIF1iKZpNjTW22P90sksoDBl1FUklg6ZkNAwrTBN06x6CZrlZ1JYfsmDXgPnfltx0gcgcZ+/4k1qou6Gbf78IoqEAtcE61ixNr8/p9Xzvqvn9y7f9m6hEMpQWFqlxOph7WxyP89MZs2cSeHVy8K/WiicT6uFXu1wH38ujQU5K7uuUnoVe5l1siT+7U2wzjNKn+femhks9ZZccwgnvbiNORbkq+y6Cn8WCtPIrOcbIbkOlcQpGwRWNP3qYT++enUOhUnX6/VyufxKqxdR1f78tF8r/qEXjq+AfBVfV8lzjvjyCazImqaZX8J7tUTYfWz0l2E2xIK81JZW5561YQNbtQ4Sf4iV9P2O8Gd9MExOsxbXVfvzs/CSG8ZXDiqEXNRWV/lw4GGBTLCStvbgvrmr+vkJIcysFX6yMmiOBSnTVZlwPq2iOIowvplFwOHG9on3Lp5LjT/wd2a1bXvf4z+zxoLUSKuQyj73bWTWJyL/wwusJGyYUW2uqwm32y6BFTQWpERdhbzrqiezton8b2+JEKBA6qogDjncIH5Zx78FhPUTrD3HV7uy4R1SoK46RYyvhprBL1LnH4mdaSyIS13VQWnNSOLbYg9WQhbOsQ4ZX+23DatnPxacT111iptdvWX1cCiJf36BlZyZzPr7rt3PL3pAYAWNBSeSVqHGrpoktpK4HwisRI0ya1xdR5zAXWNBAsZnUVk2sc69roTRAWrOrCTuTwIrWwc01kHbpzQWLDFzHuCZzMo3rUTVKarNrPh3L4GVs0wWCoPGglkLX459lFn5plVPY52lwsyKf9+KfwvY7nYLt10fYWO/dDRUaGFdjS5ZQF2FEO4VPu/HUdshh0l8pUncCD6ya2Y1x9wlnLsB9nK/3sqoK2JwJq3zWCIsyE7zp+NiyEIhjPRDqZlXHR25XN5cIDsWCmMrb5CYxF0qiRvBPnaaYx2XQeZYMKmLquHvcCIlcAjf1rLsvitrbxoLest3Xw1dr+2+NwPKWjpM5UtI5Xawp48b69C1PI0FI2ZXpCTr2EroNid0U9jTx6Osg3a7dzQWjLRtK7BIT6aZlQTfuKIlvFyosaBXc13Z4Z6DXDIrrRvpKMI6bDvA8LDzjvYcV0iN/vzkM4yq5UcRhoIOJFRXOUvq2MMU70kCqxobGuv4wAoai3pMTZQ3DK6qnXWRiTPDK8Wu6m05hoUsdQ/u6Z2r/X67aixKlvBKPRxgGD3HxVbSadUxwarP8sa63UIIJwyxOjKLoizuqlUTKeMrMrTvk0gGadXJ5oaym+UHGH5/h4MPJxyy7Z1CJH86OjhX8/Rrw4fkd+YIE6zqzQ+0/jxPnDbHCkZZ5GtrVy2cSxlfQUYEFrONNXjC0Fjw0h4jq5l+klaQHYHFwHNp/X7a0FjwcNgi4KilpBVkSmCxwpmB1ZFZpMXmKmAZgcUK5wdWR2YRma4CVhJYrBOrsYLM4ny6CthKYLFOxMDqyCwOp6uAjwksVoveWEFmcQRdBexHYLFFCo3VUVp8SlcBBxBYbJFOYHVkFltIK+AwAouNUmusjtLiDVEFnEJgsVGagdVTWoxJK+BEAovtEm+sILMQVUAkAovt0g+sjswqkHIC0iaw+EgujRVkVvo0E1AQgcWnNBYrXK8HXnnTHHjlAGsILD6VUWAFjXWC2y3cE7hLiC0gKoHFDjRWpRJpqVc0FhCPwGIfGTVWFYE12s/0nEFv4yPlclpOYwGRCCx2k0tjlRZYh+5qyp3AAiL5in0DKEcTmlwaK3uiCiBtAos9aaxPtF+//j+2Pz8TF5JWADkQWOxMY20wSqvhX/7NLGm1lvVBIB6Bxf6a0IR8tmTFNZlWzxdoL2XtGzuBugKi8hjEURr3rnfe1tXfSxpfLdQ0j18AUZlgcSDLhRxOSwFJcpoGDpdaYyVymobh+Kpt2/73yT883rRQ2BFVQPI8TnE4a4Uz2rYdV9QgtkbvqlG/5Df8BZA8D1WcQWON9OOr58Ca+6hidmJNZpOWAgpiDxYncWhhvXQSUB+Bxan6UZbSKpyoAurmQZA4+kWg8z/v+IWQ+ZClPYAnjiIkISeMtf4m3ff30Z9rxnAP1vhdg11ZE+897kBCVQSwH4FFig4qrYmBWbzMWn6W0b8f0vfWffb7I5UAYrMHixSdtyP+ebnwnOS63cInp2CQUABpM8EiJ2uTK/HTQ6w6zZVzYgFkxASLnCQeTADQ8XQF0aw4xajxFUBWLBFCfDP9JK0AciSwIBWTL0oIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOTj/wGZVIJ92gsmjAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Visualize the landmark\n", + "img_seg.visualize_landmark()" + ] + }, + { + "cell_type": "markdown", + "id": "bd018bc8", + "metadata": {}, + "source": [ + "### 3- Measurement part\n", + "\n", + "Functions to calculate what we need to measure what we want!!!\n", + "\n", + " + img_seg.get_distance(a,b) : measure distance between two point\n", + " + img_seg.measure_eye_area()\n", + " + img_seg.measure_head_area()\n", + " + img_seg.measure_eye_head_ratio()\n", + " + img_seg.calculate_triangle_area(point_1, Poit_2, point_3)\n", + " + img_seg.measure_eye_diameter()\n", + " + img_seg.all_measure() create the following dictionnary using the previous fucntions:\n", + " + measure['SL'] = self.get_distance(landmark['1'],landmark['6'])\n", + " + measure['EA'] = self.measure_eye_area()\n", + " + measure['HAt'] = self.calculate_triangle_area(landmark['1'],landmark['2'],landmark['13'])\n", + " + measure['HAp'] = self.measure_head_area()\n", + " + measure['HCL'] = \"WIP\"\n", + " + measure['ED'] = self.measure_eye_diameter()\n", + " + measure['HL'] = self.get_distance(landmark['1'],landmark['12'])\n", + " + measure['HD'] = self.get_distance(landmark['2'],landmark['13'])\n", + " + measure['pOD'] = self.get_distance(landmark['1'],landmark['14'])\n", + "\n", + "Now play!" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "f4bf0c4f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'SL': 586.0034129593445,\n", + " 'EA': 922,\n", + " 'HAt': 8437.999999999995,\n", + " 'HAp': 16034,\n", + " 'HCL': 'WIP',\n", + " 'ED': 34.262616074167774,\n", + " 'HL': 151.64761785138597,\n", + " 'HD': 158.3161394173064,\n", + " 'pOD': 32.31098884280702}" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_seg.all_measure()" + ] + }, + { + "cell_type": "markdown", + "id": "e033c2f9", + "metadata": {}, + "source": [ + "## Development Section\n", + "\n", + "This is where we make a mess!!!" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "add5f243", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "82724" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "trunk_pro = img_seg.clean_trait_region(masks['trunk'])\n", + "trunk_mask = trunk_pro.image\n", + "pad_mask =np.pad(trunk_mask, ((1, 1), (1,1)), 'constant', constant_values=((0, 0),(0,0)))\n", + "list_contour = ski.measure.find_contours(trunk_mask)\n", + "erosion_trunk = ski.morphology.erosion(pad_mask)\n", + "plt.imshow(pad_mask)\n", + "np.all(pad_mask == erosion_trunk)\n", + "sum(sum(pad_mask))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "982c2856", + "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 30, + "id": "d452f502", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(264, 474)\n", + "(262, 472)\n", + "1277.9453095790602\n", + "1277.9453095790602\n" + ] + } + ], + "source": [ + "print(pad_mask.shape)\n", + "print( trunk_mask.shape)\n", + "print(ski.measure.perimeter(trunk_mask))\n", + "print(ski.measure.perimeter(pad_mask))" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "5d3ae5d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "1427\n", + "(1495, 2)\n", + "1128\n", + "125136\n" + ] + } + ], + "source": [ + "contour_1 = ski.measure.find_contours(trunk_mask)\n", + "print(len(contour_1))\n", + "print(sum([a.shape[0] for a in contour_1]))\n", + "\n", + "contour_2 = ski.measure.find_contours(pad_mask)[0]\n", + "print(contour_2.shape)\n", + "\n", + "contour_ = np.logical_and(pad_mask, np.logical_not(erosion_trunk))\n", + "print(sum(sum(contour_)))\n", + "contour_3 = ski.measure.find_contours(contour_)[0]\n", + "print(sum([a.shape[0] for a in contour_]))" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "ee1e920f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([[262.5, 145. ],\n", + " [262.5, 144. ],\n", + " [262.5, 143. ],\n", + " ...,\n", + " [261.5, 146. ],\n", + " [262. , 145.5],\n", + " [262.5, 145. ]])]" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "contour_ = np.logical_and(pad_mask, np.logical_not(erosion_trunk))\n", + "plt.imshow(contour_)\n", + "list_contour = ski.measure.find_contours(contour_)\n", + "list_contour_2 = ski.measure.find_contours(pad_mask)\n", + "list_contour_2\n" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "f5abdcdd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1495, 2)" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a =list_contour_2[0]\n", + "a.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "a7e0885b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1280.7737367037953" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "distance = lambda a,b: ((a[0] - b[0])**2 + (a[1] - b[1])**2)**0.5\n", + "distance(list_contour_2[0][0,:],list_contour_2[0][1,:])\n", + "a =list_contour_2[0]\n", + "list_segment = [distance(a[i,:],a[i+1,:]) for i in range(a.shape[0]-1)]\n", + "sum(list_segment)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "84e350d9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(trunk_pro.image)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "id": "6ee0446b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 18, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAACnCAYAAADqiRxlAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAU0UlEQVR4nO3deXhU9b3H8fd3JhshBBI2MSBgDCBwRZQCiqVc0IrWq17qVmtr+2BxgdbtaYsPelvb5/ZRW21t3YpLS90oole81qtV1Pq0bKJIFREEsRLZAiJhkZBMvvePnLQBAklgJufk+Hk9zzw585szcz5h+eTkN2fOMXdHRETiJRF2ABERST+Vu4hIDKncRURiSOUuIhJDKncRkRhSuYuIxFDGyt3MxpvZCjNbZWZTM7UdERHZn2XiOHczSwIrgdOAcuB14Gvu/m7aNyYiIvvJ1J77cGCVu3/g7nuAmcA5GdqWiIjsI1PlXgKsbXC/PBgTEZFWkJWh17VGxvaa/zGzScAkgCTJE/MpzFAUEZF42s7Wze7etbHHMlXu5UCvBvd7AusaruDu04HpAIVW7CNsXIaiiIjE00s++x8HeixT0zKvA2Vm1tfMcoCLgGcytC0REdlHRvbc3b3GzKYALwBJ4CF3X5aJbYmIyP4yNS2Duz8HPJep1xcRkQPTJ1RFRGJI5S4iEkMqdxGRGFK5i4jEkMpdRCSGVO4iIjGkchcRiSGVu4hIDKncRURiSOUuIhJDKncRkRhSuYuIxJDKXUQkhlTuIiIxpHIXEYkhlbuISAyp3EVEYkjlLiISQyp3EZEYUrmLiMSQyl1EJIZU7iIiMaRyFxGJIZW7iEgMqdxFRGJI5S4iEkNZYQcQEWnrkl06U9O/FzuPzGX9WdWwLZvSJ/aQ3F0DS5bjNTWtnknlLiLSlESSRPv8uuW+JVR8oQiATwc6w0euYHCHcq4p/j+SZuRaNgC7JuxhW+0eblw3nldXlVH0Sh5WC91eLif18fqMF765e0Y30ByFVuwjbFzYMURE9maGDRvMyinZ/HTkHAD6ZFcwKu/QZ7T/tCuPqW9P4Mhbs2DB3w8r3ks++w13H9bYY9pzFxEJJDt1ZNdJ/ajukOST83fSIX839w58kBNzcxqsdXhvVX4lfzdfGfEY9z1UwlOXnYrNW3p4oQ9A5S4in1uWm0uyqBO1R3TmvSvbc/UpLzK508skMJJWX+I5B32NQ3VFp4/56O4lLBndkdrt29P++ip3EflcSZYdzabR3dkyooauJZ9y24An6ZT4jONzc+vXaLUsYzosZ2nnM1TuIiItZbm5JLt2oWLcUfj5W/jpgDmMzttOfqLhHnnuAZ+fSf+Ws5XtQ46g3Ycfpf21myx3M3sIOAvY5O6Dg7Fi4I9AH+BD4AJ33xo8dgMwEUgB33P3F9KeWkSkCZaVxZ4xQzju1qWMKfwL57bf0eDRzEy1tNS83UdS8JcVpDLw2s3Zc/89cBfwhwZjU4G57n6LmU0N7v/QzAYCFwGDgCOBl8ysn7tnIruIyD/ZiYOo7pSHG6yZkKRr7608PvhOSrMLwo52QG/s7IOnajPy2k2Wu7u/ZmZ99hk+BxgTLM8AXgV+GIzPdPcqYI2ZrQKGA/PTlFdEBKg7soWSI1g/pjPbT/6Mp0bdy7HZdceYZ1v9vHl0i31zaifzpw4nZ/vijLz+oc65d3f39QDuvt7MugXjJcCCBuuVB2MiIofNsrKwAcfw4XnFTLngfzkx72VG5tUXeV6o2Vrqg5oc2q3ZmpEpGUj/G6rWyFijn5Iys0nAJIA88tMcQ0RiIZEkWdqbyiFd+fjLtfQ/Zh13lj5I36y8YO+89Y5sSbdrV1xIwfsfZOz1D7XcN5pZj2CvvQewKRgvB3o1WK8nsK6xF3D36cB0qPuE6iHmEJGYSRYVYYUF7DiuB3uu2sKPyp5lfH5VgzXah5YtnTa+3Z0Cj165PwNcCtwSfJ3TYPwxM7uDujdUy4BFhxtSROLNcnOpHXYsq8/L44xTlvDtLi/QPbmHnlnRnTM/HH/alUe/+zdlbEoGmnco5OPUvXnaxczKgR9RV+qzzGwi8BFwPoC7LzOzWcC7QA0wWUfKiMiBJDp0oHL8QIomf8TDpfdQlKyfos0hKocrZsLVc75F6coFTa94GHTiMBFpdcljy3jvqmKuHfs8Fxa+S7dkPKZammPiR6ew4byO1JR/fNivpROHiUik7OhXxPsT7g3O3/L5Kfa3qqp47/ZBFJQvzPi2dCUmEWl1BX9dxTHPXc7K6p1hR2k1q6t3cOW0qyl4IvPFDip3EQlBassn9Ju0mAtv+z5rqnc0/YQ2rtpTfPm179LxiTdbbZsqdxEJhzvd7pnPhNt+QHlNfAu+2lMc+5eJ9J+8Gq/e02rbVbmLSHjc6T59MaOfvp5ttZ+FnSbt6ou97PLVpCorW3XbKncRCZVX72HAjcs5bek3w46SVvXF3u+KDzJyvvamqNxFJHSpykqKb8xh7mdt93QC+xr812+HssdeT+UuIpHgS5Zx7d2XU+XVYUc5bI9u70zfW1Kh7LHXU7mLSGT0/MMKbtk8JOwYh2VN9Q4euHoCvmRZqDlU7iISGanNW5jx6uiwYxyylNdy2qzvkzt3adhRVO4iEi2ls6va5JEzO2p3c8xzl9P/12tb9ZDHA1G5i0ikZL21imnrx4Qdo0W21X7G0Eeupf9VS6lZWx52HEDlLiIRU7t9O6u2dwk7RrPtqN3NsEevo/SmNyKxx15P5S4icoi21X7G0MeupfTGaBU7qNxFRA7JttrPGPbIdZROi16xg075KyLSIiurd3JXxRhem/EFSu9bHMliB5W7iEizLdid4pqbrqfTrDfpXj2P8C91dGAqdxGRJmxK7WTE89cw4O6ddHxrQaRLvZ7KXUQiJ2HRqM9qT/GnXR258cGr6HfbQmpr284loVXuIhIpyYH9+HGfR4HsUHOM+vsEcn5ZTLvVWyhZNS/ULIdC5S4ikVKbn0NZVjVhl/sn84/gqBfm0Xb21femQyFFRBpx+QXPkdWrZ9gxDpnKXUSkEdcUfciEPy+m8uKRYUc5JCp3EZEDmNhxA3f+92/Y8p2TSHToEHacFlG5i0ikfNq/gFyLztuBw3Oz+duPf8379x1DsrAw7DjNpnIXkUjZODpFfiIn7Bh7ybVslo95gE9mdmPP6cOw7Gjla4zKXUQiI1lUxHlfWBx2jEZlW5IFx8/m4ft/xQc/ORHLis5vF41RuYtIZGyaMICbuy0MO8ZB9cwq4PVv3MGKe4aS7FcadpwDUrmLSDSYseP0HZGbkmlMx0Q71px1PyUPb8BHHQ9mYUfaj8pdRCKhdtQQnhlxX9gxWuT+Xn/jrsfu5oNHh5Ds2jXsOHtRuYtI6LL69qbolrX0y24fdpQW65fdnve+9BAbHyqKVMGr3EUkVFm9e9Hhke3MOnpu2FEOWdISLDphJqt+0yMyUzQqdxEJTyLJiu+WMLPvy2EnOWxJS/DSyfdQcfnISBR8k+VuZr3M7BUzW25my8zs6mC82MxeNLP3g69FDZ5zg5mtMrMVZnZ6Jr8BEWmbLCuLtdNGsODC28OOkjZHZRUw84ZfUHFF+AXfnD33GuB6dz8WGAlMNrOBwFRgrruXAXOD+wSPXQQMAsYD95hZMhPhRaRtyurdi01PlfLapJ/TJdn25tkPpl92e56Y+nP2nD4s1BxNlru7r3f3N4Pl7cByoAQ4B5gRrDYDODdYPgeY6e5V7r4GWAUMT3NuEWmjsvr2psNjO3lz2B9jV+z1SrML6PeTd0I9Dr5Fc+5m1gcYCiwEurv7eqj7AQB0C1YrAdY2eFp5MCYin2PJTh2puOIkBsxeG4s59qb8tud8Cn+3NbTz0TS73M2sAHgSuMbdKw+2aiNj+10zy8wmmdliM1tcTVVzY4hIW2JGYvAA1n3/ZI6du52FN93F7T3eDDtVq3mg93OsmjoolFMVNKvczSybumJ/1N2fCoY3mlmP4PEewKZgvBzo1eDpPYF1+76mu09392HuPiyb3EPNLyIRliwuonx8Medd8iq3HPE62Z+zt98KEnks/MbtVI8e0urbbs7RMgY8CCx39zsaPPQMcGmwfCkwp8H4RWaWa2Z9gTJgUfoii0hbkdryCUf+Yh4Lx/Xg2FcvY0ft7rAjtbrCRB6p3NY/6rw5WxwFfAMYa2ZvBbczgVuA08zsfeC04D7uvgyYBbwLPA9Mdve2ehlCEUmD1OYtlE1ayX9+/Ur6Pn8Zb1TtCTtSq0lags1DWv96sOa+33R4qyu0Yh9h48KOISKtIZHEThzIyinZTB3+PBMLy0lavD9Pedry/yB55ia8Kr3vL77ks99w90aPuYz3n6iIRE9tCn/9bcq+tYSnv3gsQ2+fwklLv8rvK7tRHdNf8uf0f5KVPz8ey2299xdV7iISDndSm7fQ4455FJ6xmidOH8Hg303hvk9LWLA7XiWfn8jhnQm/ofLcoa22TZW7iERCzT/W0ufG+TwzspSbz/46x91+FdesHxabvfn8RA6bzm69w7415y4ikZUsLGTDxYPY8aVdWML52dCnGdtuA0XJ/LCjHZKV1Tv55rTr6fjIgrS83sHm3FXuItJmZJUcyeaxvSm7cjn3HfU8BYm8sCO12HfWjuLj05KkKg/2WdDm0RuqIhILNR+vo9PD89ly6h7OnPw9jvvFVdxcMZAqrw47WrNN7Poa1qEg49uJ9uW7RUQaUbtrF+3mLKIdsPDhEoZfPIbE2E+4ddCTHJ/7Kd0ifEKy324ag2/fkfHtqNxFpE1LVVRwxJ0V2D05/KrTGLZ/8Wg+Hgf3j3+AMXnVkTqGvsqreWf6YIor52d8Wyp3EYkFr95DqqKC/KcqKHsKbh/4VX7apyPll1Qz5+R7GZTTLuyIpNzp+EHrHDETnR9pIiJplHp3JbnPvU7pJW9z7cVXUPbqt3hyRyEprw0tU65l8dHprfNBJu25i0i81aaweUspXZTFQ11P5rZT+7LlOBg/5k1+eeS8Vj1TZZXX0Pu51jl5mspdRD4XvKaGmvUb6PTwBjoBq/PzGTxtCl66k7uGPU5p9lZKszN7FMuD28rIKf+EmoxupY7KXUQ+l2p37aLPtPmQSHJn93HsHljCxsm7mXPibzNS8ltTu3j0Z2fQcU16PsDUFJW7iHy+1aaoWb+BrPUbKHklyRUnT6GqSw7l/56gyzFbAOhXVMEtPZ+lOJFDfiKn2S+d8lpe3Z3NdW9fQIeHC+k0Z/H+l6XLEH1CVUSkCYn27bE+PVn/pc6MnbiAkzusomtWJaP3+YDsoqpq1lZ3BmC3Z3PTn89jwL1bSb27MiO5dPoBEZE0SbRvj2VnQY9ubPxil72uGt11USWJNeX/vJ/aVgkZ7NiDlbumZUREWqB25866hU+30WX5+3s95kBUzmGp49xFRGJI5S4iEkMqdxGRGFK5i4jEkMpdRCSGVO4iIjGkchcRiSGVu4hIDKncRURiSOUuIhJDKncRkRhSuYuIxJDKXUQkhlTuIiIxpHIXEYkhlbuISAw1We5mlmdmi8xsqZktM7Obg/FiM3vRzN4PvhY1eM4NZrbKzFaY2emZ/AZERGR/zdlzrwLGuvsQ4HhgvJmNBKYCc929DJgb3MfMBgIXAYOA8cA9ZpbMQHYRETmAJsvd6+wI7mYHNwfOAWYE4zOAc4Plc4CZ7l7l7muAVcDwdIYWEZGDa9acu5klzewtYBPworsvBLq7+3qA4Gu3YPUSYG2Dp5cHYyIi0kqaVe7unnL344GewHAzG3yQ1a2Rsf0u/21mk8xssZktrqaqWWFFRKR5WnS0jLt/CrxK3Vz6RjPrARB83RSsVg70avC0nsC6Rl5rursPc/dh2eS2PLmIiBxQc46W6WpmnYLldsCpwHvAM8ClwWqXAnOC5WeAi8ws18z6AmXAojTnFhGRg8hqxjo9gBnBES8JYJa7P2tm84FZZjYR+Ag4H8Ddl5nZLOBdoAaY7O6pzMQXEZHGmPt+0+GtrtCKfYSNCzuGiEib8pLPfsPdhzX2mD6hKiISQ5HYczezCmAnsDnsLE3oQvQzgnKmm3KmV1vI2RYyAvR2966NPRCJcgcws8UH+vUiKtpCRlDOdFPO9GoLOdtCxqZoWkZEJIZU7iIiMRSlcp8edoBmaAsZQTnTTTnTqy3kbAsZDyoyc+4iIpI+UdpzFxGRNAm93M1sfHBRj1VmNjXkLA+Z2SYze6fBWKQuSmJmvczsFTNbHlw85eqI5mxTF3kJzny6xMyejWpOM/vQzN42s7fMbHGEc3Yys9lm9l7w7/SkqOU0s/7Bn2P9rdLMrolazsPi7qHdgCSwGjgayAGWAgNDzDMaOAF4p8HYbcDUYHkqcGuwPDDImwv0Db6PZCtk7AGcECx3AFYGWaKW04CCYDkbWAiMjFrOBnmvAx4Dno3i33uw7Q+BLvuMRTHnDOCyYDkH6BTFnA3yJoENQO8o52zx9xXqxuEk4IUG928Abgg5Ux/2LvcVQI9guQeworGswAvASSHknQOcFuWcQD7wJjAiijmpO3PpXGBsg3KPYs7Gyj1SOYFCYA3B+3lRzblPti8Df4t6zpbewp6WaQsX9ojsRUnMrA8wlLq94sjlbEMXefkV8AOgtsFYFHM68Gcze8PMJkU059FABfC7YJrrATNrH8GcDV0EPB4sRzlni4Rd7s26sEdEhZrdzAqAJ4Fr3L3yYKs2MtYqOT0DF3lJNzM7C9jk7m809ymNjLXW3/sodz8BOAOYbGajD7JuWDmzqJvavNfdh1J3WpGDvZcW9v+jHOBs4ImmVm1kLNJdFXa5N+vCHiE7rIuSZIKZZVNX7I+6+1NRzVnP03iRlwwYBZxtZh8CM4GxZvZIBHPi7uuCr5uA/6Hu2sRRy1kOlAe/pQHMpq7so5az3hnAm+6+Mbgf1ZwtFna5vw6UmVnf4CfoRdRd7CNKInVREjMz4EFgubvfEeGcbeIiL+5+g7v3dPc+1P37e9ndL4laTjNrb2Yd6pepmyd+J2o53X0DsNbM+gdD46i7tkOkcjbwNf41JVOfJ4o5Wy7sSX/gTOqO+FgNTAs5y+PAeqCaup/UE4HO1L3Z9n7wtbjB+tOC3CuAM1op4ynU/Tr4d+Ct4HZmBHMeBywJcr4D/FcwHqmc+2Qew7/eUI1UTurmspcGt2X1/1eiljPY7vHA4uDv/mmgKKI584EtQMcGY5HLeag3fUJVRCSGwp6WERGRDFC5i4jEkMpdRCSGVO4iIjGkchcRiSGVu4hIDKncRURiSOUuIhJD/w9U4+5xjrcEOgAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -237,7 +903,7 @@ } ], "source": [ - "caudal_fin = img_seg.mask['caudal_fin']\n", + "caudal_fin = img_seg.mask['trunk']\n", "\n", "plt.imshow(caudal_fin)" ] @@ -371,14 +1037,6 @@ " \n", "visualize_landmark(img_arr,lm_7)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fadc18fa", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/Scripts/Morphology_main.py b/Scripts/Morphology_main.py index 5bd9f1b..0fe0a8d 100755 --- a/Scripts/Morphology_main.py +++ b/Scripts/Morphology_main.py @@ -7,6 +7,7 @@ """ import Traits_class as tc import json, sys +import numpy as np def get_scale(metadata_file): @@ -27,6 +28,18 @@ def get_scale(metadata_file): unit =[None] return scale , unit +# this class is used by json.dump to control that every value as the right format +# particular problem encounter with np.int64 value type +class NpEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, np.integer): + return int(obj) + if isinstance(obj, np.floating): + print(obj) + return float(obj) + if isinstance(obj, np.ndarray): + return obj.tolist() + return json.JSONEncoder.default(self, obj) def main(input_file, metadata_file, output_measure, output_landmark, output_presence, output_lm_image=None): @@ -43,8 +56,9 @@ def main(input_file, metadata_file, output_measure, output_landmark, output_pres measurement['unit'] = unit # Save the dictionnaries in json file + # use NpEncoder to convert the value to correct type (np.int64 -> int) with open(output_measure, 'w') as f: - json.dump(measurement, f) + json.dump(measurement, f, cls=NpEncoder) with open(output_landmark, 'w') as f: json.dump(landmark, f) diff --git a/Scripts/Traits_class.py b/Scripts/Traits_class.py index d5814b5..7423840 100644 --- a/Scripts/Traits_class.py +++ b/Scripts/Traits_class.py @@ -362,13 +362,33 @@ def all_landmark(self): # reorder the key new_landmark={} - list_order = [str(i) for i in range(1,19)] + list_order = [str(i) for i in range(1,16)] for key in list_order: new_landmark[key] = landmark[key] return new_landmark + def measure_eye_area(self): + ''' + Calculate eye area after cleaning and filing hole + + ''' + mask = self.mask + eye_region = self.clean_trait_region(mask['eye']) + + return eye_region.area + + def measure_head_area(self): + ''' + Calculate head area after cleaning and filing hole + + ''' + mask = self.mask + head_region = self.clean_trait_region(mask['head']) + + return head_region.area + def measure_eye_head_ratio(self): ''' Create eye head area ratio @@ -376,13 +396,13 @@ def measure_eye_head_ratio(self): 2- Area eye after cleaning and filing hole 3- ratio ''' - mask = self.mask - head_region = self.clean_trait_region(mask['head']) - eye_region = self.clean_trait_region(mask['eye']) + eye_areaa = measure_eye_area() + head_area = measure_head_area() - eye_head_ratio = eye_region.area/head_region.area + eye_head_ratio = eye_area/head_area - return eye_head_ratio + return eye_head_ratio + def measure_eye_diameter(self): ''' @@ -392,7 +412,7 @@ def measure_eye_diameter(self): mask = self.mask eye_region = self.clean_trait_region(mask['eye']) - eq_diameter = (eye_region.area/math.pi)**0.5 + eq_diameter = eye_region.equivalent_diameter_area return eq_diameter @@ -407,6 +427,19 @@ def measure_head_length(self): return head_length + def calculate_triangle_area(self, point_1, point_2, point_3): + + # calculate the semi-perimeter + a = self.get_distance(point_1, point_2) + b = self.get_distance(point_2, point_3) + c = self.get_distance(point_3, point_1) + + s = (a + b + c) / 2 + + # calculate the area + area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 + return area + def measure_head_depth(self): ''' Measure vertical length of the head passing by the center of the eye @@ -433,16 +466,15 @@ def all_measure(self): landmark = self.landmark measure={} # Standard length body length - measure['A'] = self.get_distance(landmark['1'],landmark['6']) - measure['B'] = self.measure_eye_head_ratio() - measure['C'] = self.measure_eye_diameter() - measure['D'] = self.measure_head_depth() - # Head length landmark 2 to 15 - measure['E'] = self.get_distance(landmark['2'],landmark['15']) - # - measure['F'] = self.get_distance(landmark['1'],landmark['14']) - # - measure['G'] = self.get_distance(landmark['1'],landmark['6']) + measure['SL'] = self.get_distance(landmark['1'],landmark['6']) + measure['EA'] = int(self.measure_eye_area()) + measure['HAt'] = self.calculate_triangle_area(landmark['1'],landmark['2'],landmark['13']) + measure['HAp'] = self.measure_head_area() + measure['HCL'] = "WIP" + measure['ED'] = self.measure_eye_diameter() + measure['HL'] = self.get_distance(landmark['1'],landmark['12']) + measure['HD'] = self.get_distance(landmark['2'],landmark['13']) + measure['pOD'] = self.get_distance(landmark['1'],landmark['14']) return measure def visualize_landmark(self): diff --git a/Scripts/__pycache__/Traits_class.cpython-37.pyc b/Scripts/__pycache__/Traits_class.cpython-37.pyc deleted file mode 100644 index fe0aae71fcfb6f44acca4c8ba6c31c39d4bd52a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12214 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 Bc69&% literal 0 HcmV?d00001