From ffebd1112efda34d686ef798ed70c8ad9bc33af6 Mon Sep 17 00:00:00 2001 From: Simon Waldherr Date: Fri, 19 Oct 2018 21:51:55 +0200 Subject: [PATCH 1/6] more test coverage --- .gitignore | 2 +- README.md | 1 + test.png | Bin 0 -> 18129 bytes zplgfa_test.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 test.png diff --git a/.gitignore b/.gitignore index dba14d9..99e2e24 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ *.zpl -*.png +cmd/zplgfa/*.png cmd/zplgfa/zplgfa diff --git a/README.md b/README.md index 3b81789..601c1ef 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/SimonWaldherr/zplgfa)](https://goreportcard.com/report/github.com/SimonWaldherr/zplgfa) [![codebeat badge](https://codebeat.co/badges/28d795af-6f9b-453a-94c2-4fafb8b5b0d5)](https://codebeat.co/projects/github-com-simonwaldherr-zplgfa-master) [![BCH compliance](https://bettercodehub.com/edge/badge/SimonWaldherr/zplgfa?branch=master)](https://bettercodehub.com/results/SimonWaldherr/zplgfa) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FSimonWaldherr%2Fzplgfa.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2FSimonWaldherr%2Fzplgfa?ref=badge_shield) [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/SimonWaldherr/zplgfa/master/LICENSE) The ZPLGFA Golang package implements some functions to convert PNG, JPEG and GIF files to ZPL compatible ^GF-elements ([Graphic Fields](https://www.zebra.com/us/en/support-downloads/knowledge-articles/gf-graphic-field-zpl-command.html)). diff --git a/test.png b/test.png new file mode 100644 index 0000000000000000000000000000000000000000..455f41476bac36f3b6cd9d1d87529925bdf8bbc2 GIT binary patch literal 18129 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 E0dyDT>;M1& literal 0 HcmV?d00001 diff --git a/zplgfa_test.go b/zplgfa_test.go index bde8965..3ee3ea9 100644 --- a/zplgfa_test.go +++ b/zplgfa_test.go @@ -1,7 +1,14 @@ package zplgfa import ( + "image" + _ "image/gif" + _ "image/jpeg" + _ "image/png" + "log" + "os" "testing" + "strings" ) func Test_CompressASCII(t *testing.T) { @@ -9,3 +16,44 @@ func Test_CompressASCII(t *testing.T) { t.Fatalf("CompressASCII failed") } } + +func Test_ConvertToZPL(t *testing.T) { + // open file + file, err := os.Open("./test.png") + if err != nil { + log.Printf("Warning: could not open the file: %s\n", err) + return + } + + defer file.Close() + + // load image head information + config, format, err := image.DecodeConfig(file) + if err != nil { + log.Printf("Warning: image not compatible, format: %s, config: %v, error: %s\n", format, config, err) + } + + // reset file pointer to the beginning of the file + file.Seek(0, 0) + + // load and decode image + img, _, err := image.Decode(file) + if err != nil { + log.Printf("Warning: could not decode the file, %s\n", err) + return + } + + // flatten image + flat := FlattenImage(img) + + // convert image to zpl compatible type + gfimg := ConvertToZPL(flat, CompressedASCII) + + // remove whitespace - only for the test + gfimg = strings.Replace(gfimg, " ", "", -1) + gfimg = strings.Replace(gfimg, "\n", "", -1) + + if gfimg != "^XA,^FS^FO0,0^GFA,32,51,3,,::01C000::,001C00::,1DDC00::,::^FS,^XZ" { + t.Fatalf("ConvertToZPL failed") + } +} From 5ab86c6800c193f68b88944a0095d70ed43c56f0 Mon Sep 17 00:00:00 2001 From: Simon Waldherr Date: Fri, 19 Oct 2018 22:45:56 +0200 Subject: [PATCH 2/6] travis --- .travis.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..945b320 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +language: go +go: +- 1.11 +env: + global: + - PATH=$HOME/gopath/bin:$PATH + - secure: BXdNmYUBPDjK2Mh+fbfc/UGPF/jLE8NXzKD3BK6Qm+Na6b6xrKbDnSpheScxFeJJW4LL7ZG2aIyg/4eFTnWFF0DYhrRRol83WLba40HvbEO37sYutnSsPBVJ8DZ6G5DcwdIFg8cG8oLtx4GqEtcsbLi+YXSC6Tat3tt718SBtCQu0VIVSG3RIRIKfgtKkNmj4b5NOxDPaZ1M6UUIF/bqOrafh/v2B+VulWrqh3uSEI1jMurLLUaW4u9Qh83OgspAwZ5Lr+pQFd+YcJqTzCD63YLfk1rMb5WbbdIuBhO4BTSo21ou6t109w7504vTVANBAgnMQqQrWX0M3HRtpOt3ZUSlh4x4WUn9OHtZEzPrVsOOXGo2CfS+PmdMlhijuGycdMBah2Vz/9mCp93CSX2en+lKCpKOs3vb5w9WoGadW/KAWCflHpEQFQyM+F1LD9Jk+88yhA+dgwEIWbcf4cXQhyGTd/ZA2tyszgAo7UqWTOkbu+JQwoHabo3yN6z/PlXG27cNCfYyJ/j+q5Xfy5MP6XepWi4GM+JurP6ssRRmT2T4VNVXXOfmn94+HudElEDrjkSFSRj7tahX1kmERpgF4Jq8XDwWw9XLR902iZ66Yqz+0P3qPmQsOx9gnnYELhdhYRIRGVmCfkWXQgUlFijRqUAwNGhGHGd6OESQUzRQZ0g= +install: +- go get github.com/mattn/goveralls +- go get github.com/modocache/gover +- go get -u -t simonwaldherr.de/go/zplgfa/... +- go get -u -t github.com/simonwaldherr/zplgfa/... +script: +- go test -coverprofile=.coverprofile github.com/simonwaldherr/zplgfa/... +- goveralls -coverprofile=.coverprofile -service=travis-ci -repotoken $COVERALLS_TOKEN \ No newline at end of file From 9ab539bc8e72f1ba59669d7a9218cdc89caf6428 Mon Sep 17 00:00:00 2001 From: Simon Waldherr Date: Fri, 19 Oct 2018 23:07:53 +0200 Subject: [PATCH 3/6] more tests, more badges --- README.md | 2 + test2.png | Bin 0 -> 37714 bytes zplgfa_test.go | 100 +++++++++++++++++++++++++++++++------------------ 3 files changed, 65 insertions(+), 37 deletions(-) create mode 100644 test2.png diff --git a/README.md b/README.md index 601c1ef..b630c1b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # ZPLGFA Golang Package [![GoDoc](https://godoc.org/github.com/SimonWaldherr/zplgfa?status.svg)](https://godoc.org/github.com/SimonWaldherr/zplgfa) +[![Build Status](https://travis-ci.org/SimonWaldherr/zplgfa.svg?branch=master)](https://travis-ci.org/SimonWaldherr/zplgfa) +[![Coverage Status](https://coveralls.io/repos/github/SimonWaldherr/zplgfa/badge.svg?branch=master)](https://coveralls.io/github/SimonWaldherr/zplgfa?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/SimonWaldherr/zplgfa)](https://goreportcard.com/report/github.com/SimonWaldherr/zplgfa) [![codebeat badge](https://codebeat.co/badges/28d795af-6f9b-453a-94c2-4fafb8b5b0d5)](https://codebeat.co/projects/github-com-simonwaldherr-zplgfa-master) [![BCH compliance](https://bettercodehub.com/edge/badge/SimonWaldherr/zplgfa?branch=master)](https://bettercodehub.com/results/SimonWaldherr/zplgfa) diff --git a/test2.png b/test2.png new file mode 100644 index 0000000000000000000000000000000000000000..ae77cac083106def93e018fc6b07f07bb95f37a6 GIT binary patch literal 37714 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 literal 0 HcmV?d00001 diff --git a/zplgfa_test.go b/zplgfa_test.go index 3ee3ea9..c2f1248 100644 --- a/zplgfa_test.go +++ b/zplgfa_test.go @@ -11,49 +11,75 @@ import ( "strings" ) +type zplTest struct { + file string + zpl string +} + +var zplTests []zplTest + +func init() { + zplTests = []zplTest{ + { + file: "./test.png", + zpl: "^XA,^FS^FO0,0^GFA,32,51,3,,::01C000::,001C00::,1DDC00::,::^FS,^XZ", + }, + { + file: "./test2.png", + zpl: "^XA,^FS^FO0,0^GFA,389,630,63,,038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038038000::1C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C71C7100::E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00:lJF00^FS,^XZ", + }, + } +} + func Test_CompressASCII(t *testing.T) { if str := CompressASCII("FFFFFFFF000000"); str != "NFL0" { t.Fatalf("CompressASCII failed") } } + + func Test_ConvertToZPL(t *testing.T) { - // open file - file, err := os.Open("./test.png") - if err != nil { - log.Printf("Warning: could not open the file: %s\n", err) - return - } - - defer file.Close() - - // load image head information - config, format, err := image.DecodeConfig(file) - if err != nil { - log.Printf("Warning: image not compatible, format: %s, config: %v, error: %s\n", format, config, err) - } - - // reset file pointer to the beginning of the file - file.Seek(0, 0) - - // load and decode image - img, _, err := image.Decode(file) - if err != nil { - log.Printf("Warning: could not decode the file, %s\n", err) - return - } - - // flatten image - flat := FlattenImage(img) - - // convert image to zpl compatible type - gfimg := ConvertToZPL(flat, CompressedASCII) - - // remove whitespace - only for the test - gfimg = strings.Replace(gfimg, " ", "", -1) - gfimg = strings.Replace(gfimg, "\n", "", -1) - - if gfimg != "^XA,^FS^FO0,0^GFA,32,51,3,,::01C000::,001C00::,1DDC00::,::^FS,^XZ" { - t.Fatalf("ConvertToZPL failed") + for i, testcase := range zplTests { + + filename, zplstring := testcase.file, testcase.zpl + // open file + file, err := os.Open(filename) + if err != nil { + log.Printf("Warning: could not open the file: %s\n", err) + return + } + + defer file.Close() + + // load image head information + config, format, err := image.DecodeConfig(file) + if err != nil { + log.Printf("Warning: image not compatible, format: %s, config: %v, error: %s\n", format, config, err) + } + + // reset file pointer to the beginning of the file + file.Seek(0, 0) + + // load and decode image + img, _, err := image.Decode(file) + if err != nil { + log.Printf("Warning: could not decode the file, %s\n", err) + return + } + + // flatten image + flat := FlattenImage(img) + + // convert image to zpl compatible type + gfimg := ConvertToZPL(flat, CompressedASCII) + + // remove whitespace - only for the test + gfimg = strings.Replace(gfimg, " ", "", -1) + gfimg = strings.Replace(gfimg, "\n", "", -1) + + if gfimg != zplstring { + t.Fatalf("Testcase %d ConvertToZPL failed", i) + } } } From d95b30df9b8ad23d091e4a8133f6ef7b94673e7a Mon Sep 17 00:00:00 2001 From: Simon Waldherr Date: Sat, 20 Oct 2018 01:18:00 +0200 Subject: [PATCH 4/6] more tests --- test.png => tests/test.png | Bin test2.png => tests/test2.png | Bin tests/test3.png | Bin 0 -> 20803 bytes tests/tests.json | 22 ++++++++++++++ zplgfa_test.go | 57 ++++++++++++++++++----------------- 5 files changed, 52 insertions(+), 27 deletions(-) rename test.png => tests/test.png (100%) rename test2.png => tests/test2.png (100%) create mode 100644 tests/test3.png create mode 100644 tests/tests.json diff --git a/test.png b/tests/test.png similarity index 100% rename from test.png rename to tests/test.png diff --git a/test2.png b/tests/test2.png similarity index 100% rename from test2.png rename to tests/test2.png diff --git a/tests/test3.png b/tests/test3.png new file mode 100644 index 0000000000000000000000000000000000000000..66ac80f9d48031d359b4328b8feae959d2d30b51 GIT binary patch literal 20803 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 Date: Sat, 20 Oct 2018 18:31:30 +0200 Subject: [PATCH 5/6] more tests --- README.md | 2 ++ tests/README.md | 7 +++++++ tests/test4.jpg | Bin 0 -> 27325 bytes tests/test5.png | Bin 0 -> 6224 bytes tests/tests.json | 10 ++++++++++ zplgfa.go | 3 --- zplgfa_test.go | 7 +++++++ 7 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/README.md create mode 100644 tests/test4.jpg create mode 100644 tests/test5.png diff --git a/README.md b/README.md index b630c1b..92d541d 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ The ZPLGFA Golang package implements some functions to convert PNG, JPEG and GIF files to ZPL compatible ^GF-elements ([Graphic Fields](https://www.zebra.com/us/en/support-downloads/knowledge-articles/gf-graphic-field-zpl-command.html)). +If you need a ready to use application and don't want to hassle around with source code, take a look at the [ZPLGFA CLI Tool](https://github.com/SimonWaldherr/zplgfa/tree/master/cmd/zplgfa) which is based on this package. + ## install 1. [install Golang](https://golang.org/doc/install) diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..01fa340 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,7 @@ +# ZPLGFA Tests + +This folder contains some test cases for the ZPLGFA package. +The test coverage can be seen at the [coveralls](https://coveralls.io/github/SimonWaldherr/zplgfa?branch=master) project page. + +[![Coverage Status](https://coveralls.io/repos/github/SimonWaldherr/zplgfa/badge.svg?branch=master)](https://coveralls.io/github/SimonWaldherr/zplgfa?branch=master) + diff --git a/tests/test4.jpg b/tests/test4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb1d788955bca2d9abaf2593e9ed7e844eaa4cd8 GIT binary patch literal 27325 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 literal 0 HcmV?d00001 diff --git a/tests/test5.png b/tests/test5.png new file mode 100644 index 0000000000000000000000000000000000000000..f068a21910eff57b1583d9fed0c6ec0f871f8425 GIT binary patch literal 6224 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 Date: Sat, 20 Oct 2018 18:53:25 +0200 Subject: [PATCH 6/6] more tests --- tests/test6.png | Bin 0 -> 2780 bytes tests/test7.png | Bin 0 -> 2799 bytes tests/tests.json | 12 +++++++++++- zplgfa.go | 5 +++-- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 tests/test6.png create mode 100644 tests/test7.png diff --git a/tests/test6.png b/tests/test6.png new file mode 100644 index 0000000000000000000000000000000000000000..cab30b7a3e236d9ed28217866f83c96365426de9 GIT binary patch literal 2780 zcmV<23M2K2P)EX>4Tx0C?J+Q+HUC_ZB|i_hk=OLfG)Jmu!ImA|tE_$Pihg5Rw34gb)%y#f69p zRumNxoJdu~g4GI0orvO~D7a@qiilc^Ra`jkAKa(4eR}Wh?fcjJyyu+f{LXpL4}cL8 zCXwc%Y5+M>g*-agACFH+#L2yY0u@N$1RxOR%fe>`#Q*^C19^CUbg)1C0k3ZW0swH; zE+i7i;s1lWP$pLZAdvvzA`<5d0gzGv$SzdK6adH=0I*ZDWC{S3003-xd_p1ssto|_ z^hrJi0NAOM+!p}Yq8zCR0F40vnJ7mj0zkU}U{!%qECRs70HCZuA}$2Lt^t5qwlYTo zfV~9(c8*w(4?ti5fSE!p%m5%b0suoE6U_r4Oaq`W(!b!TUvP!ENC5!A%azTSOVTqG zxRuZvck=My;vwR~Y_URN7by^C3FIQ2mzyIKNaq7g&I|wm8u`(|{y0C7=jP<$=4R(? z@ASo@{%i1WB0eGU-~POe0t5gMPS5Y!U*+Z218~Oyuywy{sapWrRsd+<`CT*H37}dE z(0cicc{uz)9-g64$UGe!3JVMEC1RnyFyo6p|1;rl;ER6t{6HT5+j{T-ahgDxt-zy$ z{c&M#cCJ#6=gR~_F>d$gBmT#QfBlXr(c(0*Tr3re@mPttP$EsodAU-NL?OwQ;u7h9 zGVvdl{RxwI4FIf$Pry#L2er#=z<%xl0*ek<(slqqe)BDi8VivC5N9+pdG`PSlfU_o zKq~;2Moa!tiTSO!5zH77Xo1hL_iEAz&sE_ z2IPPo3ZWR5K^auQI@koYumc*P5t`u;w81er4d>tzT!HIw7Y1M$p28Tsh6w~g$Osc* zAv%Z=Vvg7%&IlKojszlMNHmgwq#)^t6j36@$a16tsX}UzT}UJHEpik&ja)$bklV;0 zGK&0)yhkyVfwEBp)B<%txu_o+ipHRG(R4HqU4WLNYtb6C9zB4zqNmYI=yh}eeTt4_ zfYC7yW{lZkT#ScBV2M~7CdU?I?5=ix(HVZgM=}{CnA%mPqZa^68Xe5gFH?u96Et<2 zCC!@_L(8Nsqt(!wX=iEoXfNq>x(VHb9z~bXm(pwK2kGbOgYq4YG!XMxcgB zqf}$J#u<$v7REAV@mNCEa#jQDENhreVq3EL>`ZnA`x|yIdrVV9bE;;nW|3x{=5fsd z4#u(I@HyF>O3oq94bFQl11&!-vDRv>X03j$H`;pIzS?5#a_tuF>)P*iaGgM%ES>c_ zZ94aL3A#4AQM!e?+jYlFJ5+DSzi0S9#6BJCZ5(XZOGfi zTj0IRdtf>~J!SgN=>tB-J_4V5pNGDtz9Qc}z9W9tewls;{GR(e`pf-~_`l(K@)q$< z1z-We0p$U`ff|9c18V~x1epY-2Q>wa1-k|>3_cY?3<(WcA99m#z!&lx`C~KOXDpi0 z70L*m6G6C?@k ziR8rC#65}Qa{}jVnlqf_npBo_W3J`gqPZ95>CVfZcRX1&S&)1jiOPpx423?lIEROmG(H@JAFg?XogQlb;dIZPf{y+kr|S? zBlAsGMAqJ{&)IR=Ejg5&l$@hd4QZCNE7vf$D7Q~$D=U)?Nn}(WA6du22pZOfRS_cv~1-c(_QtNLti0-)8>m`6CO07JR*suu!$(^sg%jf zZm#rNxnmV!m1I@#YM0epR(~oNm0zrItf;Q|utvD%;#W>z)qM4NZQ9!2O1H}G>qzUQ z>u#*~S--DJy=p<#(1!30tsC);y-IHSJr>wyfLop*ExT zdYyk=%U1oZtGB+{Cfe4&-FJKQ4uc&PJKpb5^_C@dOYIJXG+^@gCvI%WcHjN%gI&kHifN$EH?V5MBa9S!3!a?Q1 zC*P)gd*e{(q0YnH!_D8Bf4B7r>qvPk(mKC&tSzH$pgp0z@92!9ogH2sN4~fJe(y2k zV|B+hk5`_cohUu=`Q(C=R&z?UQbnZ;IU-!xL z-sg{9@Vs#JBKKn3CAUkhJ+3`ResKNaNUvLO>t*-L?N>ambo5Q@JJIjcfBI^`)pOVQ z*DhV3dA;w(>>IakCfyvkCA#(acJ}QTcM9%I++BK)c(44v+WqPW`VZ=VwEnSWz-{38 zV8CF{!&wjS4he^z{*?dIhvCvk%tzHDMk9@nogW_?4H~`jWX_Y}r?RIL&&qyQ|9R_k ztLNYS;`>X_Sp3-V3;B!Bzpi)P)EX>4Tx0C?J+Q+HUC_ZB|i_hk=OLfG)Jmu!ImA|tE_$Pihg5Rw34gb)%y#f69p zRumNxoJdu~g4GI0orvO~D7a@qiilc^Ra`jkAKa(4eR}Wh?fcjJyyu+f{LXpL4}cL8 zCXwc%Y5+M>g*-agACFH+#L2yY0u@N$1RxOR%fe>`#Q*^C19^CUbg)1C0k3ZW0swH; zE+i7i;s1lWP$pLZAdvvzA`<5d0gzGv$SzdK6adH=0I*ZDWC{S3003-xd_p1ssto|_ z^hrJi0NAOM+!p}Yq8zCR0F40vnJ7mj0zkU}U{!%qECRs70HCZuA}$2Lt^t5qwlYTo zfV~9(c8*w(4?ti5fSE!p%m5%b0suoE6U_r4Oaq`W(!b!TUvP!ENC5!A%azTSOVTqG zxRuZvck=My;vwR~Y_URN7by^C3FIQ2mzyIKNaq7g&I|wm8u`(|{y0C7=jP<$=4R(? z@ASo@{%i1WB0eGU-~POe0t5gMPS5Y!U*+Z218~Oyuywy{sapWrRsd+<`CT*H37}dE z(0cicc{uz)9-g64$UGe!3JVMEC1RnyFyo6p|1;rl;ER6t{6HT5+j{T-ahgDxt-zy$ z{c&M#cCJ#6=gR~_F>d$gBmT#QfBlXr(c(0*Tr3re@mPttP$EsodAU-NL?OwQ;u7h9 zGVvdl{RxwI4FIf$Pry#L2er#=z<%xl0*ek<(slqqe)BDi8VivC5N9+pdG`PSlfU_o zKq~;2Moa!tiTSO!5zH77Xo1hL_iEAz&sE_ z2IPPo3ZWR5K^auQI@koYumc*P5t`u;w81er4d>tzT!HIw7Y1M$p28Tsh6w~g$Osc* zAv%Z=Vvg7%&IlKojszlMNHmgwq#)^t6j36@$a16tsX}UzT}UJHEpik&ja)$bklV;0 zGK&0)yhkyVfwEBp)B<%txu_o+ipHRG(R4HqU4WLNYtb6C9zB4zqNmYI=yh}eeTt4_ zfYC7yW{lZkT#ScBV2M~7CdU?I?5=ix(HVZgM=}{CnA%mPqZa^68Xe5gFH?u96Et<2 zCC!@_L(8Nsqt(!wX=iEoXfNq>x(VHb9z~bXm(pwK2kGbOgYq4YG!XMxcgB zqf}$J#u<$v7REAV@mNCEa#jQDENhreVq3EL>`ZnA`x|yIdrVV9bE;;nW|3x{=5fsd z4#u(I@HyF>O3oq94bFQl11&!-vDRv>X03j$H`;pIzS?5#a_tuF>)P*iaGgM%ES>c_ zZ94aL3A#4AQM!e?+jYlFJ5+DSzi0S9#6BJCZ5(XZOGfi zTj0IRdtf>~J!SgN=>tB-J_4V5pNGDtz9Qc}z9W9tewls;{GR(e`pf-~_`l(K@)q$< z1z-We0p$U`ff|9c18V~x1epY-2Q>wa1-k|>3_cY?3<(WcA99m#z!&lx`C~KOXDpi0 z70L*m6G6C?@k ziR8rC#65}Qa{}jVnlqf_npBo_W3J`gqPZ95>CVfZcRX1&S&)1jiOPpx423?lIEROmG(H@JAFg?XogQlb;dIZPf{y+kr|S? zBlAsGMAqJ{&)IR=Ejg5&l$@hd4QZCNE7vf$D7Q~$D=U)?Nn}(WA6du22pZOfRS_cv~1-c(_QtNLti0-)8>m`6CO07JR*suu!$(^sg%jf zZm#rNxnmV!m1I@#YM0epR(~oNm0zrItf;Q|utvD%;#W>z)qM4NZQ9!2O1H}G>qzUQ z>u#*~S--DJy=p<#(1!30tsC);y-IHSJr>wyfLop*ExT zdYyk=%U1oZtGB+{Cfe4&-FJKQ4uc&PJKpb5^_C@dOYIJXG+^@gCvI%WcHjN%gI&kHifN$EH?V5MBa9S!3!a?Q1 zC*P)gd*e{(q0YnH!_D8Bf4B7r>qvPk(mKC&tSzH$pgp0z@92!9ogH2sN4~fJe(y2k zV|B+hk5`_cohUu=`Q(C=R&z?UQbnZ;IU-!xL z-sg{9@Vs#JBKKn3CAUkhJ+3`ResKNaNUvLO>t*-L?N>ambo5Q@JJIjcfBI^`)pOVQ z*DhV3dA;w(>>IakCfyvkCA#(acJ}QTcM9%I++BK)c(44v+WqPW`VZ=VwEnSWz-{38 zV8CF{!&wjS4he^z{*?dIhvCvk%tzHDMk9@nogW_?4H~`jWX_Y}r?RIL&&qyQ|9R_k ztLNYS;`>X_Sp3-V3;B!Bzpi