From 24089151604fa1e65891c4678e0136741eaa3ead Mon Sep 17 00:00:00 2001 From: John Kerl Date: Sun, 20 Mar 2022 17:29:40 -0400 Subject: [PATCH] DSL functions and verbs for UTF-8 <-> Latin-1 (#997) * latin1_to_utf8 and utf8_to_latin1 DSL functions * doc-build artifacts for previous commit * Test cases for latin1_to_utf8 and utf8_to_latin1 * extend on-line help * latin1_to_utf8 and utf8_to_latin1 verbs * unit-test cases for verbs * Keep with kebab-case naming convention for verbs * webdocs --- docs/src/manpage.md | 61 ++++++--- docs/src/manpage.txt | 61 ++++++--- docs/src/pix/latin1-to-utf8.png | Bin 0 -> 59513 bytes docs/src/pix/utf8-to-latin1.png | Bin 0 -> 71183 bytes docs/src/reference-dsl-builtin-functions.md | 20 ++- docs/src/reference-verbs.md | 33 +++++ docs/src/reference-verbs.md.in | 19 +++ docs/src/special-symbols-and-formatting.md | 20 +++ docs/src/special-symbols-and-formatting.md.in | 20 +++ internal/pkg/bifs/base.go | 30 ++++- internal/pkg/bifs/strings.go | 38 +++++- .../pkg/dsl/cst/builtin_function_manager.go | 24 ++++ internal/pkg/dsl/cst/builtin_functions.go | 2 +- internal/pkg/dsl/cst/evaluable.go | 4 +- internal/pkg/lib/latin1.go | 38 ++++++ internal/pkg/lib/latin1_test.go | 100 ++++++++++++++ internal/pkg/mlrval/mlrval_get.go | 2 +- .../pkg/transformers/aaa_transformer_table.go | 2 + internal/pkg/transformers/latin1_to_utf8.go | 122 ++++++++++++++++++ internal/pkg/transformers/utf8_to_latin1.go | 122 ++++++++++++++++++ man/manpage.txt | 61 ++++++--- man/mlr.1 | 87 ++++++++++--- test/cases/cli-help/0001/expout | 16 +++ test/cases/dsl-latin1/0001/cmd | 1 + test/cases/dsl-latin1/0001/experr | 0 test/cases/dsl-latin1/0001/expout | 15 +++ test/cases/dsl-latin1/0001/input | 7 + test/cases/dsl-latin1/0001/mlr | 2 + test/cases/dsl-latin1/0002/cmd | 1 + test/cases/dsl-latin1/0002/experr | 0 test/cases/dsl-latin1/0002/expout | 7 + test/cases/dsl-latin1/0002/input | 7 + test/cases/dsl-latin1/0002/mlr | 2 + test/cases/verb-latin1-to-utf8/0001/cmd | 1 + test/cases/verb-latin1-to-utf8/0001/experr | 0 test/cases/verb-latin1-to-utf8/0001/expout | 5 + test/cases/verb-utf8-to-latin1/0001/cmd | 1 + test/cases/verb-utf8-to-latin1/0001/experr | 0 test/cases/verb-utf8-to-latin1/0001/expout | 7 + test/input/latin1.xtab | 5 + test/input/utf8.xtab | 7 + 41 files changed, 871 insertions(+), 79 deletions(-) create mode 100644 docs/src/pix/latin1-to-utf8.png create mode 100644 docs/src/pix/utf8-to-latin1.png create mode 100644 internal/pkg/lib/latin1.go create mode 100644 internal/pkg/lib/latin1_test.go create mode 100644 internal/pkg/transformers/latin1_to_utf8.go create mode 100644 internal/pkg/transformers/utf8_to_latin1.go create mode 100644 test/cases/dsl-latin1/0001/cmd create mode 100644 test/cases/dsl-latin1/0001/experr create mode 100644 test/cases/dsl-latin1/0001/expout create mode 100644 test/cases/dsl-latin1/0001/input create mode 100644 test/cases/dsl-latin1/0001/mlr create mode 100644 test/cases/dsl-latin1/0002/cmd create mode 100644 test/cases/dsl-latin1/0002/experr create mode 100644 test/cases/dsl-latin1/0002/expout create mode 100644 test/cases/dsl-latin1/0002/input create mode 100644 test/cases/dsl-latin1/0002/mlr create mode 100644 test/cases/verb-latin1-to-utf8/0001/cmd create mode 100644 test/cases/verb-latin1-to-utf8/0001/experr create mode 100644 test/cases/verb-latin1-to-utf8/0001/expout create mode 100644 test/cases/verb-utf8-to-latin1/0001/cmd create mode 100644 test/cases/verb-utf8-to-latin1/0001/experr create mode 100644 test/cases/verb-utf8-to-latin1/0001/expout create mode 100644 test/input/latin1.xtab create mode 100644 test/input/utf8.xtab diff --git a/docs/src/manpage.md b/docs/src/manpage.md index 1d8e0185f..3b48c8ef5 100644 --- a/docs/src/manpage.md +++ b/docs/src/manpage.md @@ -50,7 +50,7 @@ DESCRIPTION insertion-ordered hash map. This encompasses a variety of data formats, including but not limited to the familiar CSV, TSV, and JSON. (Miller can handle positionally-indexed data as a special case.) This - manpage documents mlr 6.2.0. + manpage documents mlr 6.2.0-dev. EXAMPLES mlr --icsv --opprint cat example.csv @@ -192,11 +192,11 @@ VERB LIST altkv bar bootstrap cat check clean-whitespace count-distinct count count-similar cut decimate fill-down fill-empty filter flatten format-values fraction gap grep group-by group-like having-fields head histogram json-parse - json-stringify join label least-frequent merge-fields most-frequent nest - nothing put regularize remove-empty-columns rename reorder repeat reshape - sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records sort - sort-within-records split stats1 stats2 step tac tail tee template top - unflatten uniq unsparsify + json-stringify join label latin1-to-utf8 utf8-to-latin1 least-frequent + merge-fields most-frequent nest nothing put regularize remove-empty-columns + rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle + skip-trivial-records sort sort-within-records split stats1 stats2 step tac + tail tee template top unflatten uniq unsparsify FUNCTION LIST abs acos acosh any append apply arrayify asin asinh asserting_absent @@ -212,16 +212,17 @@ FUNCTION LIST is_absent is_array is_bool is_boolean is_empty is_empty_map is_error is_float is_int is_map is_nan is_nonempty_map is_not_array is_not_empty is_not_map is_not_null is_null is_numeric is_present is_string joink joinkv joinv - json_parse json_stringify leafcount length localtime2gmt localtime2sec log - log10 log1p logifit lstrip madd mapdiff mapexcept mapselect mapsum max md5 - mexp min mmul msub os pow qnorm reduce regextract regextract_or_else round - roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms sec2localdate sec2localtime - select sgn sha1 sha256 sha512 sin sinh sort splita splitax splitkv splitkvx - splitnv splitnvx sqrt ssub strftime strftime_local string strip strlen - strptime strptime_local sub substr substr0 substr1 system systime systimeint - tan tanh tolower toupper truncate typeof unflatten unformat unformatx uptime - urand urand32 urandelement urandint urandrange version ! != !=~ % & && * ** + - - . .* .+ .- ./ / // < << <= <=> == =~ > >= >> >>> ?: ?? ??? ^ ^^ | || ~ + json_parse json_stringify latin1_to_utf8 leafcount length localtime2gmt + localtime2sec log log10 log1p logifit lstrip madd mapdiff mapexcept mapselect + mapsum max md5 mexp min mmul msub os pow qnorm reduce regextract + regextract_or_else round roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms + sec2localdate sec2localtime select sgn sha1 sha256 sha512 sin sinh sort splita + splitax splitkv splitkvx splitnv splitnvx sqrt ssub strftime strftime_local + string strip strlen strptime strptime_local sub substr substr0 substr1 system + systime systimeint tan tanh tolower toupper truncate typeof unflatten unformat + unformatx uptime urand urand32 urandelement urandint urandrange utf8_to_latin1 + version ! != !=~ % & && * ** + - . .* .+ .- ./ / // < << <= <=> == =~ > >= >> + >>> ?: ?? ??? ^ ^^ | || ~ COMMENTS-IN-DATA FLAGS Miller lets you put comments in your data, such as @@ -1319,6 +1320,20 @@ VERBS Options: -h|--help Show this message. + latin1-to-utf8 + Usage: mlr latin1-to-utf8, with no options. + Recursively converts record strings from Latin-1 to UTF-8. + For field-level control, please see the latin1_to_utf8 DSL function. + Options: + -h|--help Show this message. + + utf8-to-latin1 + Usage: mlr utf8-to-latin1, with no options. + Recursively converts record strings from Latin-1 to UTF-8. + For field-level control, please see the utf8_to_latin1 DSL function. + Options: + -h|--help Show this message. + least-frequent Usage: mlr least-frequent [options] Shows the least frequently occurring distinct values for specified field names. @@ -2363,6 +2378,12 @@ FUNCTIONS FOR FILTER/PUT json_stringify (class=collections #args=1,2) Converts value to JSON-formatted string. Default output is single-line. With optional second boolean argument set to true, produces multiline output. + latin1_to_utf8 + (class=string #args=1) Tries to convert Latin-1-encoded string to UTF-8-encoded string. If argument is array or map, recurses into it. + Examples: + $y = latin1_to_utf8($x) + $* = latin1_to_utf8($*) + leafcount (class=collections #args=1) Counts total number of terminal values in map/array. For single-level map/array, same as length. @@ -2694,6 +2715,12 @@ FUNCTIONS FOR FILTER/PUT urandrange (class=math #args=2) Floating-point numbers uniformly distributed on the interval [a, b). + utf8_to_latin1 + (class=string #args=1) Tries to convert UTF-8-encoded string to Latin-1-encoded string. If argument is array or map, recurses into it. + Examples: + $y = utf8_to_latin1($x) + $* = utf8_to_latin1($*) + version (class=system #args=0) Returns the Miller version as a string. @@ -3195,5 +3222,5 @@ SEE ALSO - 2022-03-19 MILLER(1) + 2022-03-20 MILLER(1) diff --git a/docs/src/manpage.txt b/docs/src/manpage.txt index ae13d1f77..90f7c91ba 100644 --- a/docs/src/manpage.txt +++ b/docs/src/manpage.txt @@ -29,7 +29,7 @@ DESCRIPTION insertion-ordered hash map. This encompasses a variety of data formats, including but not limited to the familiar CSV, TSV, and JSON. (Miller can handle positionally-indexed data as a special case.) This - manpage documents mlr 6.2.0. + manpage documents mlr 6.2.0-dev. EXAMPLES mlr --icsv --opprint cat example.csv @@ -171,11 +171,11 @@ VERB LIST altkv bar bootstrap cat check clean-whitespace count-distinct count count-similar cut decimate fill-down fill-empty filter flatten format-values fraction gap grep group-by group-like having-fields head histogram json-parse - json-stringify join label least-frequent merge-fields most-frequent nest - nothing put regularize remove-empty-columns rename reorder repeat reshape - sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records sort - sort-within-records split stats1 stats2 step tac tail tee template top - unflatten uniq unsparsify + json-stringify join label latin1-to-utf8 utf8-to-latin1 least-frequent + merge-fields most-frequent nest nothing put regularize remove-empty-columns + rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle + skip-trivial-records sort sort-within-records split stats1 stats2 step tac + tail tee template top unflatten uniq unsparsify FUNCTION LIST abs acos acosh any append apply arrayify asin asinh asserting_absent @@ -191,16 +191,17 @@ FUNCTION LIST is_absent is_array is_bool is_boolean is_empty is_empty_map is_error is_float is_int is_map is_nan is_nonempty_map is_not_array is_not_empty is_not_map is_not_null is_null is_numeric is_present is_string joink joinkv joinv - json_parse json_stringify leafcount length localtime2gmt localtime2sec log - log10 log1p logifit lstrip madd mapdiff mapexcept mapselect mapsum max md5 - mexp min mmul msub os pow qnorm reduce regextract regextract_or_else round - roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms sec2localdate sec2localtime - select sgn sha1 sha256 sha512 sin sinh sort splita splitax splitkv splitkvx - splitnv splitnvx sqrt ssub strftime strftime_local string strip strlen - strptime strptime_local sub substr substr0 substr1 system systime systimeint - tan tanh tolower toupper truncate typeof unflatten unformat unformatx uptime - urand urand32 urandelement urandint urandrange version ! != !=~ % & && * ** + - - . .* .+ .- ./ / // < << <= <=> == =~ > >= >> >>> ?: ?? ??? ^ ^^ | || ~ + json_parse json_stringify latin1_to_utf8 leafcount length localtime2gmt + localtime2sec log log10 log1p logifit lstrip madd mapdiff mapexcept mapselect + mapsum max md5 mexp min mmul msub os pow qnorm reduce regextract + regextract_or_else round roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms + sec2localdate sec2localtime select sgn sha1 sha256 sha512 sin sinh sort splita + splitax splitkv splitkvx splitnv splitnvx sqrt ssub strftime strftime_local + string strip strlen strptime strptime_local sub substr substr0 substr1 system + systime systimeint tan tanh tolower toupper truncate typeof unflatten unformat + unformatx uptime urand urand32 urandelement urandint urandrange utf8_to_latin1 + version ! != !=~ % & && * ** + - . .* .+ .- ./ / // < << <= <=> == =~ > >= >> + >>> ?: ?? ??? ^ ^^ | || ~ COMMENTS-IN-DATA FLAGS Miller lets you put comments in your data, such as @@ -1298,6 +1299,20 @@ VERBS Options: -h|--help Show this message. + latin1-to-utf8 + Usage: mlr latin1-to-utf8, with no options. + Recursively converts record strings from Latin-1 to UTF-8. + For field-level control, please see the latin1_to_utf8 DSL function. + Options: + -h|--help Show this message. + + utf8-to-latin1 + Usage: mlr utf8-to-latin1, with no options. + Recursively converts record strings from Latin-1 to UTF-8. + For field-level control, please see the utf8_to_latin1 DSL function. + Options: + -h|--help Show this message. + least-frequent Usage: mlr least-frequent [options] Shows the least frequently occurring distinct values for specified field names. @@ -2342,6 +2357,12 @@ FUNCTIONS FOR FILTER/PUT json_stringify (class=collections #args=1,2) Converts value to JSON-formatted string. Default output is single-line. With optional second boolean argument set to true, produces multiline output. + latin1_to_utf8 + (class=string #args=1) Tries to convert Latin-1-encoded string to UTF-8-encoded string. If argument is array or map, recurses into it. + Examples: + $y = latin1_to_utf8($x) + $* = latin1_to_utf8($*) + leafcount (class=collections #args=1) Counts total number of terminal values in map/array. For single-level map/array, same as length. @@ -2673,6 +2694,12 @@ FUNCTIONS FOR FILTER/PUT urandrange (class=math #args=2) Floating-point numbers uniformly distributed on the interval [a, b). + utf8_to_latin1 + (class=string #args=1) Tries to convert UTF-8-encoded string to Latin-1-encoded string. If argument is array or map, recurses into it. + Examples: + $y = utf8_to_latin1($x) + $* = utf8_to_latin1($*) + version (class=system #args=0) Returns the Miller version as a string. @@ -3174,4 +3201,4 @@ SEE ALSO - 2022-03-19 MILLER(1) + 2022-03-20 MILLER(1) diff --git a/docs/src/pix/latin1-to-utf8.png b/docs/src/pix/latin1-to-utf8.png new file mode 100644 index 0000000000000000000000000000000000000000..6917dfdfc8b6b51fa4246c3b94c24efabab8e92b GIT binary patch literal 59513 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
oOVfoiQrD#dxIIzu6Ja znz-qqT-T=vyg)drZk3VOGX(ep&>-6`DCnDROG%b4?)Fb(!UgE3jo-#8c*BfxmY18? z_8phVO^(Iq)nmj^F9olYmob{&PHLz21Aj^$rhA`OYiwg~Z#BLJ-}Nk2_eRy|jIrNB zFSf3gh-^zcJG9}Z?0@6*BdNcuuT$+alqcc*jJobi zO+Fl0s9eP!g~YDn(CMnuBK0R%Rf&lJ~p3wS~X>iuoX^dYoV(ACbkdYukX7i^t`SK zf_|#XQhrfNEl{iqg7TtZHlq0U#zd3=d>x0Io}IuK%3T{ln_4sgM_zLZMhjbK6e9^Q zOAd6{>(wAmh%)drL$)7xFeznE2#68t`)v&E=DnGCeEz187F0K8D=H>IYGn2~4_;)H zgWiD{_YCtlv^Od+}FBo*aE%n`3H0~X5(;3y?00tJgM{XBA z0oP0R&~L8^)JyqF$;rtHLUldtYn@AS5LNm9l~XQZXCaR#uCt_AXPA~tL#n?O1Zj=!|st`u3$(-5a9 z9$TaBMb%Dn-}suDnL4*Y{{0onZTB6AUOVhj{~4{o)X@01)5ppi=S^4B_rUzM@ItQ{ zpT?Ban|B)$b5SESd9!w8UDg%U`tTKn4~fHm{srDp7nMyr*0iv~zAnJ5zmF0Yb&AJl zx8Skb^qoX^k)O$B>C<9M^!~;xg`55WDN4%((i`uQ#2rarhtJYve@d3!*6XBP48D;T zE*CTaKFB5`SSj`99BIvCy1dT={=(}CN0-Z-v`{`f;A7Kr2aATuPOA~nX&-DLNmlpN zR>o6Yp}U}(%oFlOOCqYe{CY(+uhZEaFc};+MB8dQ!wU4d?@pA^T=acpdMC zmxN9yn{uABb?3!bD`2Ltue;2e;ny(4*?t~&46y=y!xnQo5UEs3iI^Y6*$!x?gkxKK z+J}hdQc>fZFBcl@oL%xyZE2yi!co&M*07}p-lk#}Vu0?HGmQ>6&44`#&P^|cj_5ba zr4JYhzPgM=c$>*&ndi=oX_&|qw%Y)wWR+8d&- zFQY9q+xb3!CQ)yRuRu$&W?5w{IcmAU=mj8uagfEyJRkbihCi-ZY|z_>wZ0ejxV&Iy zfh6R`a;;(Tisp>jnCBd$3KIskvnS*;ooA+^t@>45CnhqQ4JR)3L)&>4S68toa77_t z)@-#6nn}M&K^SJX%sDzW@EzPDdyAD5dYL#B+zy06ciB|)3z@Hn%#(AZA8XBa&j3T< zMsY81QLyj@N(*E2sdR^#WQAmd&`3HTNQ05iLwrRTL~1_)tbNx)C|Lz^(9>l;1hD~= z-oFp-Ad0^A;3~t!5}uwy|gkI4O6t7=g@}lSOJ? z{wf(@?-5;X_4e_mje{oDi;e?Z)*NKK0xy#Cp&vWzPDb{tKP^3{Hnz7;;gEOThPd0f-HzOrBaOW8rYpC^6`wcg1V(| zE*6Sz&TGXlaD8G?=u0CQGW$g(&fgGwx|o9=s~{sq=ZCgHmHrKO^Jq=dLUz48eov4q zk{B?2Bp%fA{#>MmCwZ#sWpeQ}y+WId7G9v-nsSRR5p=dO$bIP=sNz)00b$V6rJr3@`sgeLmt{YV~QfwxJ{DkyUWp9Fb?FrL^5CcrZ!wSx%2@TVmgKhcE zYU;%o&8gpi-_@wd^J%4gX{qG#;u4=qdOi!7G`hK@MIZl?fp3W^^!WQj8&}H%pH<9m zzt75?Mc6|68U}u-qon*a%3T=s$`EuJCgtfsCnZ|Ju|V%fL#P9#*(FfVY5aEi`EM{P z1Ys$zV^fNIbpAqx@wV0=dj4~kh+D;jazcXJ*7UVT#`on<3?HxO31B&vh1oxD21Xlt z?c{z}ht1t2rVr@-Yjs2Uexv&|oaNJj%MwgMS!(HQQLF^V3*d|0nObjcEHgrIq`~1% z1|!vOO0jb!D1Gpz8bI}^f+B?4lX8aAtkRpctJWGdMv^M>TXA z<+RwHABh*+B&&*5^%m`{$YjuUf9#9 zdrIIX3Ec_rF5&lS+Id;F-oz#N+BQ;>+{8@?*E-4TCsnC@lF2Uh}xSAWpNlxf6f z*etw}BQ%u13Z}iP8z1Mhij#*SSjkLSOo}Us8znoPC~D-7Qb#MZ6K!ODn%QaI4JOUh zk5INB#e+%(#N-%MINOuc(RX=v`!=Ol{3>t(@m-C9nl5e}L-)Buhi^6Vgxnq2zcJwU zUu1qp!k-EdrpAhCyJFTJ5KHfhSZ%^(%S<3|ocN(_dhUUC6Vh)pm3X)nd=n|gn7xfB z;Q5y<_$#8i$R5Wpiz*nTqp|Vy@G=ZagPrH?|l+=w%abqab_I zVVQkC_xci{@A-T&_WP47S(}Hx7?f7=m4Q`Y2iAtiGG8jUITMH7N_dhBBTQ1#Z{A7# z`a-XAU`({7LV_aBR0nS7m>6c)d0}MSmd|FniI&)JW$tst=8yDnICQvK!muBOw z6w5hcbMtDM7@;0XOou(E8Vqt>Em~MC}(lh(p)tLDatafv-<2WP7k6tjTcA;g!cu!1rZS6cPv-eF{C1V$cuq)apQD0+%rl_W}vHphnzJ&y0teREx-IqDRO zt(?SfvDgFUWD%R+(@n_s56sb0H9P$;wmm99?|ICcr=%xZZOnG|^rg(=H0v}ZZZ^BW zkK2~MiG-;NI_Rp18*i?YRy;>wZA;{$=DZHh0OY~~I`=1@%Z$l4XdWR@+68BWk~?^M z=UUR7eOG61^a3sgz|5btazWIH{0LdR?I zXiA>5UR4n`#%z=F&{I4$3!}+FwCMN-B%EuGNz1bfWUl42iO-|eF3&u7WJEdVx{KGU z)~4+~ELO?glMpX}7`4*HZ5r`M>o>Q0H4Y-}}et1UzG=ZNS48GcOXT1rr zsqCDxMK9NCL^e7gv_%dM@BrmJpZ;>7@GgKZ2sIa-sNgrfaDkL|UheVvW@YQKB3USB zuZ6JSfMtjwWZn>UuYT=t{hr9r25wgr68}Po8z5`Vy+SgaH&AV|Dvt$N3O;57%S1#R zy}-q#9^5-#_jq5$?I;BV zP_nVg$j5xv0Mc^nqgU_aSCo-zK^bEYGi}0U!($;k(-S0|NMTsE)TfPxz@HG0!0&KP zut^FKY#CloqwqOy+Ft~+8m4rCYQhk6$zy+gVi=x|2A7W(zJGD<$T{|R7J%gPAGMNJ zs;v$0wKmpdqW_cS0%_eTq`gS2EvaJ#alYDuiNCC+DLv5XrGrrUJS<9{rYpjdM=~@O z&dTceMxSB?zpnDgf6vgOq!PJg5H6;IOB%|+ZFTQdV0IxVp=nEp(S+M%w5#4*70(Hf z*l5sOBj9E-@TZD>8Yib)4*DuCqmp=9riFNo!}+)>0lmE{RohJB@oBOXZF1eCk0MBY z5p~TXfj*&)qTe!lS=aQ~qYWoAl8NjqByZ!z*6rKhrCLOlgMsTPE1@8~Hrk%s(#dZ|5CNfi!#@J>OcT4_L>HSZ+i@IpS$(r& zu2SJz!uhU2uV$$-jkYecngOQ;AwsBmFB6G+E95)E7aLN1b8XR|E7+z` zZ7?~us9L&Jq-L>sXRi=JQCvN~W(71Q4e%h4(S;MPFI%TFIYEtHbAR1ozT~pP1_?LH5ysc!D;5K?dKPok@@6(8Ha_x<7i03cK`P6eQEluwj=cE_1iN79kFZm*k#Gyq}%N^iV-vzuaJCLx`b}R;QNBsIXin2 z+N4*dbk{-;R@UVD8PaYEEXm{F@TSN4#Rm9oKP=sUg^+WiUU5v%T`Tgf1U|8xO+%E_ zWqepdnK}?geYZ6YKX5V;%rO`ght80cqMs=d^CE63jkNh>WEzh^jr~X3cq*jV@5o)G zr-lq(SO|@`X}CQGJeoDf@~zL(-&*IQuHJ>@Z(YHq%)5S;*i89nn(`-1QDMfs3^Si$ z2t>K}`3F;|6@%J=KQCWYm?u~JTYVb=O>L zXWJ8;Mrv9f{Y%>%`5FH4Th9_-Y6Xw=AkSmcNP9aD{TIW>13fr%y)0DLAiHl>71EgR zP$4hm%!Byd*4a)MPn^QHKhDc$ys!0|<1n15L$k!}OWb!#mBsk4-HtyJBjG~Qy3pZS33e*v+`0W`eS3&;xQa>Hw z5!N$)b{<-hdCqs+Rd2b(g@ViCp66C7t~qw)-fT-bC5GRvi<(z3PuMwven0wH2Ru+n zi2=Q)U(d*uSS8v>6=25^;bB@Y1Wl+Csde7y##YQl3lFL7oy2=_$nF|f`3J$;==R^K zo1$kQF;xg^zj0^MCMiyQtV<>&tIpYr;ZF)X{j4Ma&idWoz%3#!RxBX)VvJ>$b{rHC z9qTbL1+BFn$?cX;zOfUBz6$l5bE@iM zP{|DN$&1it`|DFL?Y>1QZ6rl*;BeTey&45ql-JwH`&@p|hWspLq|I^DOiICpOOxi! z8LETaksF-~y-gDXg-@3)`e??!VZQNV0WP6jgDOeQ6+UFIPS@zId)5ufq-BJ>Wg*CH!rAxIgC-WQv}QSJ;86dr*QW zUlX>n!-_2i(b8x_e3OD>z)df(e&X0Yf0*kr>OS^r=f}-56(_4ItJgD2sBU2}z_P!o z%Tmpp5+&AnK_rJJj>4%SczEqM*Jt_^q(Z48QVvrzUkoznIYcSyn8C~cqzSv%PdAs` z{8?&uKjxir&o`8$*ENVU0Jej6r@?_NO6$_PQkAPF98to4vg}fI@~zAK>+3CVsU74W zZomMt?=&O`1IZYP=0)F?mW`w@=w26G+SJR4hfGxEv#nt=h3CppG&;OKzOjQ_35=F( z@yn;q;3yfZTyg0(-Tnm}XWfY}6#vS%D2{49NRvkepRU$6a>l{Z@Yhob5B#Jvz_JK> zndU<@KlM)Uo>Y3!arF%%8P7)HMf|osGFJYO{2Zi(nFs!Jo?@p{_qRID(Xqp{Ta_4> z-b>*2Zu;wnsu-6>9z>Eg0w%;9G}LqE=*ohOL%{dJmK{*iLC{sxYzBi8Q|RBY_hKwd zdJ^tT81F&G`_nx+^XTW!!1a%pArp6>V#jhfE7FZEMe=*)de=h%PFzpVL7_sA6|Qbi+%?GlM<6KH#zLpWEwj~K(-5|vDv z4ay+;YUvc&bWadqShgklHZ2b6ze$DpF z|6z;&P>Dby7~AcK$_!<%AO8ayKThEv$L)VeNP`f+UFoJYRrDo5@j|))aS^hy5q}GJ>%iaPVv?O$`?%`oFQ!8z46N`X zFt5Y0nMIz=CMJ{D4B-0&V=xeobt{=Qt*F$9$`+^rn#ff5*TT4U?Lw zt|7Qg#}~A{J#13IrGWeNyk`B7@o0fzD=3>59SiFhb%F&sW9KJ+`IG3m_13sr3lhxm z7qto1^M!Y=hMYIt21a+z*%Blg>Hs&=ZR29rSG71pFyP<8FWC!gAe= z_D{>G+6h5q4P7^~_uHX!uFD-(rh^-2C3S5WlAEB^4P@0$OQR|sLV`VI)m(Aj%Tcuk>VLtn7t~$wf292 z9Jx%+nAkvwE0dJ3`eS>#vO;|C(K6F{8dM0kHx&MxUqasg=V2dB2)UtVFfWkY*h#YP zvp=wZH11Pfv$Hd@fNnrjbdQaG5W_B`zEx_4=(xY!%M`n?($6Vio!)lguX3Emi*~m? z`YU$E-ydvp$@^)SrlMXjN$-B6)NZ)lt*h|yOAGUQ-6wc>DM@!m_}DheK&T;^&r+nw z7;vd*p0(5*c#trhy8GW&Yv#RDe%8mo0yod}J-*5`nCc9?ZxU72wRl~Qr2!@~IV=wH zdUu6njVYxO!mmof9!N=F3nasTrgJ2+|dc-rm`#Pl6i_o7R;h(~`3 zZoOavoRk%Hwj;vS!0Whk&7Um+YM}c*3wBDFT^lYM1n1* zpN*_KDc*rvjKDSMRsRGR6jY0cy?8Zu)=;Ibu#FsTW?bBoqEbw>dZX0IQV|hN4`~Rd zvWVZ^Zyp|AwBgC=S1Lex0)lcueKo#~v~^?;lJVO-(z?$uR9ydQa<PR`-lppOn>TBFL_$^UUW|Pd+_abk)qymsLBK{`eQa5QSmW#lhZ{I7pN`ax*bH!>f-v4;CnyF!14J% z5fc3)<**@ytWVKX$Yzva>cqYmTSG6<>#_+!Yx!7Hx<9!e&6KK^3{^EUep}A2j6y&F z$829M6}(o8$8XMMt_;C;)oQnjps1)D4WBUBg?|t@xGzjsIhp1xaKix@H0ksvET?Cf zO~eu*74fy#An1~+ zUF-FDn`GL_`;%ZAFga29t?s0g0cE$R7qW8stwoh)s`0D zRTkB--siMaurd>MOr?=FUQChsR2Ni=`FeLWJH4(>P{X3dZ6)y*eA*ByZ#OAD^JN5I z2rKFI8E&>rmB-(YaM!W1kwcMDSu$q5RxyldYJf{{|A{*SKl>3mt9xi@GcH$*1Ww`1 z@ATz;^Qzxt_?`i>${eI3@$YFd>)N@A$tmPw6lRuuIQCo7yB68BJFc?ssBXW~rV2`n z)8MJHp7MTYYW$);zIMO!8;p%di?*`JGG-y-zw=iw*A1aoRVK@~!0Gj!W>z|A_Sfq_ z;C@rop%EW`7HE7q0ec^AEr7*@f~>rFqWsN`i|*@}xS-A3zXINHXqKyeW-hnBY=>D8 zhY;Oq>R4ObL0dprfE)hT;~$!>Vv_lC9B49Iech=RDmNny-d^F?eu8xSB!agC%uZto z35=B2-d0ske8gl3%w-9~jCxtFZ&qcx_PjmK{xF$J!ek$A(rDu;t zub}ho6|&f&sWO?MshoMcj*Rf#pN4UzfDV;+hsp$~L>U2qbsx;|(D9bG&wZ&;#~YLc zfWfnzfBP1sm|>;UpWk*S!3HZwMwW&@cS|Qb?b^z|6t2)N=R2J;6z+H_AYB7QiyZqL zW}RqRzsii1PA7K~FyF!Iq$w&3PbvThZ~er5I|FR&vUDRx@R*?(g2@*vR&5s^M@DF> zy>@?^bE{L3Q4^E#O`CqaHt*bX3iRY>y422-{yKHqeCj@ba=M4{zAOUv<=1h!T%`k< z@zeQ;zMAc!)z!SS+o%bO#G7FUXm|3h5qYe};o}BllhBKZDwCg_e7Qc(Q;7R9rmx-h z*{^+y1Z^tp+r{dtnsQh<+qcYfU5P}H6)pk9Kj9}LOlqi_SbM5V=K;9z#6`f{Cm3zF zd}&QT6}pM4d2)kI5cNcqfnj+)s@T+E>}<%1`6i&9p!$m~<}`$cVwqV&6t0n0l)1aW?PWd$!94ccvW-0q z>wky%uI(ScGn`a{Zf5+m$oObyz7m-|K84NqfPW8PkC{Nj)GrR>=l^=RnUB z&a1!H1yC~C{E{f~-6`l8BAqgKnclXtyQeYqU8wIkT0H({9uf4Z@&Auz6jd=!Dp6h( zCha~ejdIS58#<5e-EIXWjd#yw9aGsHwanhJiCxwDVBhZA&boiP+mm46k41q-d!J+p zF;vP>{O|#v(}#VH$B<VjKNRuHQi^3yH&IWjb6G(p4B z_wuWEtN$IdUcphnFtA(0Q5Y)%*#H-c>*R8iz8btjhjwz6v3u={#O~eZMroYIOsb>rIZ$$ruYN<=Y zO4<0rZ#@e*9dxFuQp<4Jjr}L&v2_}~ zIqgOUjk9C8ycSfCeiVNqjvq7O8hd;|{cqQSAn^Nx?N?zdMU*qIdfKyuzw7WkCdJpC zQyIQ(exZ2bar@N9etE6)fUYEQYPjOE{NHQsj(((UuWY)lgpzo+6z0sxN0e}%r_kZR z#!7)7A^1wjL%8JSAA+3q-x=~(RM&LWkH*@s*vV&GrN#~QE?b48lRaa*-?qbYz&K)2 zL_=HfZ#-*FjlBuy?2UiCV(m`;b4A`O$v*CZ;#*~Xp0v&|sw=OjMtxk&e!7u|1NDmG z`;HBBT28VL!`%Ol1b?9Yd=fL@5^7k6DegX$v6Lwd@OKppZR=G@8Mv^ZqJL-XX}=$h zwo<_OhpRdaVijYo4Dh|L&%sL;iVn&Fcao5Nht?Jz-HqXVh!CSd*_hXvrR>r^94YCT z$Ip}Mu^dP-s~@kgK(rjcon_Zfeqifwt`&hhhIVelg;9xBJ)h3}y2Xj9+1b^qkFTpL zjSwh5GYSlVlKu2A1rZpf(dur+iZ2%AMf+~PmY&TTCh})_R$G5he{OJY_w$A_=^~pp zTI&5X`EW{u3d0fm}_>Yf#Ubi73{TUyfgTFlu&Li|qX-q~jn z(695}%T4OraKLy?ZS)n4d-dUCM4AK2?u>MCTupS~yv!k#EO=-SLH4uHXi_WvmO;0| z@5Q5}wC?|uuZd8Iaw~3ytPbcGq{BzULUOZ1EX?8{q9Wo%m!fw3%dp?@Ie8=JqI^K8 zMVttG3`y}82SAgo4{uCz4|8>tNNI{PDQ@T3{8+vnl0i8wOlB|Xg*9(k(?dvh&bk-kzyx6kVaNFn)Q-<>xpV6it6~V&S<#)gAgF|% zn&TFBZ2LW6MOY}Nvl=b zTnb$Ez4|Vo-2~O_h_qWTjgBOY4~GJ>dH-}TDK)3gZqyT|!sKznrK+Jy<{z!&+>VIP zz1(yiEW;cx(W=&b)P5gO^dJ%bY)^V8d$7cM`xw{R9w~tg{OJHJN)ZIH89u0VzO1ax zZCv_FRr^Q#65IzBAmH{fAx1y~yR?1(K*n(sa531nTG^dL@(e*ku!8rNduHnMliLZ- zg_`qrguv7MX59Yy0C_5(en~BIB-}c`;Oig1MK2mi4^IsF=un5<7?yLEj+oWYJY2P>KNuQ zNwi*Xj_AfBIioZt|4*-dl^}8a*N7$^D}iDc&7#a*otNJFNJ^ zo``Mp6&0mNyxV__rwgyl4M}!OK`qlNdI2$<7hQXI?v&y^0`8XkeVY6@TJu`Lo zhd8HWKom1~|W)mG3&OY>#PfT#q?AlJtJ; z1oV6IAg5>i(^g*-EgcB(#J`Nk%IWGN>Az3%ruwd#zFuw`bX#^@e4F>&kD7dm{Sj+i zT58YYKbEs+`i@S}Q%|eyldOJ=NuoJA^;?ay&;{tiXHeXGH9_X#mM>)kQv#%Pl`!=r zSI1RLn>^2=U+Vs;TPI69N;78cVJk!H|91|HT=|DIamG<@g3%G$8;^>!iclJSz5Jf| z!%qRABwLMuig#L^y?we{V+r=m!klT~(icJReCvcK#<-rQSbwGD+=}KWfK&PctBumo ziB+IAJsmI%Ai6Iis`LKXQ=;RAjy9 zD%8GBv0j#EYuewSBB8MOOtp*PzpOUc6?w?oD4WT$l~33+5No*V57ZXoWR&#SoVMaMom3a6;am@B3`%feiTvAF`?kuF>ZZQQG@&Q z>0vR4#KlKi{Im6u-TBU;eN!CJv^z!F;l9Y=&vKpUuZKwg{}Qz@m@yRR0-b(p8ZpuY2ri({C|5fSn1iB({ylN{d> zUr%SV0&c;IZY{=Fnx1xliax!1ARsXu4kmhfegyPP5C#3EtL)Q5g81fKez-F_(H%xL z-qi}A9|*o*b(}0uF*!@!zT*n0@~Z@S+*LB-_Y-s44&>$0YL%&tx@5OtgOg6J}nqP z&vznS=XWWt<30R2&Tj8GTXf>r-rJ_*8P-rB%5@R!4^*b4PQg7#t4TgEhxpSpjo5F+ zZFmc!7(f)L@ZKLbB=G+qWA7AP+1E#FH`3vb?T*bI+qRvKvBQqt z!H&^U$F^G68aFjn$6@J&>Lw!7D8HyXS+6oG3&l~ z=OS)VaTuMy#oSpJDd4dAYdOC28B+CH=I5=hu2nzvqTgx5{&qVknLOZW@Uq6Fq@&|c zA_{~&hrCDb*i==lcu{vOG`@N{pdQ1^%4kc~>`(9dZO0Z}&PW=5|AT(oDfmi|WavWV zsy6Qi4ir;irYbDY4b$tx`I8o<(Yeg#Bn3S>T1x%P0P!6=}MIzJV=K!0+vAhr7>)U2#?C zxc-WUkKNO2qerGujUGJP#!^yQnAE?2c)!0Ecz^A+;7Sa*D|J#}4kry>H1sfI?|R0l zGglmF(#|UPq@!PqSM&3H%B@Rxro~qsT^2uBP{890CYl{&nYPw7yEX96&v&!gikhQD zsxc+fH;-TKlxR6nv?sv(w#O-U~{JZAdgG2 z@_@4@`uqa3b*k5$ge#p_l}W*99JfglJkAc#0Ci^t^4U?lN~ONaIB9-%78 z`#G1&SBe$;@v$1--{^9|TTMzU(<_fyFkJ%du>q!vC&rV{dUcGq$Qpf)NU`@^ z^_R78g~vZ`QJ9!u-YjfKhB!_cgU3WoOsaD)%l0fpmy|2IM{vN3|^{IuXD0p;wTIG{oBBP zh?qfysn#sP_*vQ++M6+WQUaUd?t&Cdlmrz4wJ3YN)qg}>(I4ZX|L11&)IQt9mgwJO zmf+5c;473SGs)p;(uR4^b}O>x_QC+&<*uP$^gXtB(9*+8eu7q>+dJ2_TSDP~Il@Lngc}Ltij@$<{RU#eTvhOtTMe!Ws-kW+ z{wID&v|}7Z^}IAQc#g=X_mR69t@$uT472gFk;Wv-%)j($*K3o)qEGs((Q>t%>Qvy59vhYVosX>rRpRcMVH0Ai6)8moAI7`e57RLAqv^Y;kkDFjO9{v-6OL zo~gH>Z))=!e=RK8*x9j|I;MP;tuCqzk9^PN@~aJLb-v!E5`H%K6}w8Mxa*HVypbZq zX-sqz%n0s@-M0|^?nmJAfP!6-rJcjSgAq>%bUAjX7aB z!UORiBu#cN6A+hq8q?f?Kpy%84TqL%$XXApG!E>$p1jE^D7I@oK2~x5pId~@VcY=2 z_qV>}L8Zd7p0-ZA&U!xp?SJHL zS8WpwGlWFN`P(7@Dd39iptR9#L1-IUj@@GiHV+?HfB15E&N5 zxOL(nr>;4B zx_sf+j)A?cLB9?+?t%yqyHMSp8&Y!15lCtNU{+V9A*~?I7H+@>=N2f48MnDVt?s>7 z)CI1<&?8ui;o(Lag>G<|zF%D`uD%YA(v=_98WB?m9MI-Jd{r37MgPf?vNMiv*G^DV zGvod`;1=6=@p3wov&I;_g%Kc4Zs3WXz4$)PLxD(~$Pv8SuQ=xFj+w=NIH!_ZQ`-KS zC`+@%i;zIHte-jj`$c_8G{|OMQcabzE5^R|habZmM#XE+kSHF3nw$&UaKbWKY9k8h ztg>62%Izqm$oHL$%g1@R9#YlS(J(>ob@{XF$*jWf-=>Zw01MX-lMOKT;0-^dw8JXS znIK}&*tQ&LPqX9|gP-c%|Df$d0wnNxaA0soT$+A~c%UbtgUbLXZVZaw*E@6$JJp5* z5GX=R%9lx;9PMZH?HGId2Zruqs&GED1~-?8%y#QmnLBZz_v_#c)XLb}^4~v=dRxq- zM(Ri7{P(}?p=04jUg?Vu=ic&V><|_7S~$wffh=h=bjVK3LcPnz5_^U-=$Ry&_%S(UzhKZq~;Stp)vUXmgY{ z>-nbI61(-bg(vlrHQi~aE?N`J#qz(_23)jUFxqUU$6yn^!VsmrDU@^y=S+6!8MRP7q7FZf_AS3n?<=qo$$OY9m>bw;BrBpa9edFbmz03UQ^acSDc-C|77sehSe z&`h@l_g7SYxL>H;uLSuFo#|CaLfzI+{%n_#36rAf3TtuA)zf3j1kL;I*?Zd_>&-x=8q zYRQ7AT@|H4FP2SpjONF7y!@VEpPJBJQ2ikr^MpzIcCK2rExDB(q4y7A&994Ka9Wjr zX^Um(h9S^ps^buZGgbZfbe$(JG25|jaJ%h(J=l-$mJ|z3Fl@l<-}55sfyG2$9%5Ef z=+wLSg@he29N11_A_p31JKn)YC3|<=682s6ys7hB=QXTfY`fejXh$E{$QW{QuBs`0 z%$1rfi|Fij*$;fXTySMXr}y3C=j*4JdVegFTB_TBPXSWy#31`jiRn-(;(^_yirQOU zX_eXtxS{Scm3oCW3e(a~5vPFTXvC=S+GBp64{-F4rVJ7eB#ZBfoT;CXGH*Uv{8m;1 zW7r&EsC|3|IR4+=aZ zb5XMF%@s85g>VFiZPYIL9{H``t4%)!)<11UMl?BlJBRaHF&N$LuLms>OhspV)Z=jU zPvh5AK62)~5-@H!ouFaVEud!MC$YxAOOinzgEm*-;$@}`?ZFkTZLQgGf;3`P=M|%Y zhdu63++bE|rVi?8yPLC+Nq$0rA2R{x&ll>tL3JXfgYEx$0gOT+fSnO=-^xnLg(jPo z`z^3}ydU=CiGuGTkI%$pX;Wfi;JtHB>^-yKM>d6zRlO!6pfUYa;oG=EImlZ4b?{uz ziyTtk*F~K|vFL88+v=b-8HDMk&EENP<^<#j!}#vuu?AULBmTZx2g6>8WolZGLcc1m z=jVMQctH}+B{rwEQtfEZU)HG=cutY{@D!DlodVrGMocei{sky!#aAD%`7`BBK|WGG z%}q%hI=iqC3I9)(Fv7jaKhg~(&KL%G#~(q(;tnKETH$4Wk1p>%xumr{E%5Sh=2KKu4K(vD*Sqk}woDc!T^$}A z>}@RQPWQVk>Q$1BJsXZaEwTo!w|AhN*m&^^;=koIHNC`RS~8XO6p!Q~FEdTVZ?GXP z+HZhIOq^N@aij}c&@0sH5!v!N{93|tR+XAVb=f<%CQdo8^RpxXX{_+J`L|Nn*E6A0 zp)@A)!HsF4GTU^NwJ^hpNfq)CXk&gz?P0@1OVmrdHOtYM)`ho6$o0X>f7QQyDbtv7 z7G2BsTlZ?wz3zDbMf#6qN?fbwgEEci=UNKG?2OZjJj$qZ4nJ8-n~L2BtV7!#B|Ki1 zb-|WUqnjc_?I6cEe4Wu_al3~p#pmlC(d=j4&&M4!e7I)-VRUpUHELB<$%!KUyhBgMn4^PcAL5T@^MWGRF8XwIGrlv_Bb&L{{WdIH!zw_M1G{_^V%)`<`s zO_SVs3D-wPiR*hMJf75I_?*WjASDk}8veR_Waehl`p})dXHLsHN47(;%2}e^OkJc= z{SS0b;TV&yhKBs$Q{vkGi`E?w7o^`R`S~_0S+ZUyaR*2r)JI8-?07Kge(HEu)remY zG&Q{~Q}is}9!Oi|*v%oS9vI5{tE<4YMmOuuuk2pyO99lrMQC!^E##Num!0xWwAK&d zG^>5f++pYEHMns?Iz}YWOxC2j!h3O z8Qw`pX|i~I3C@#-hZy^hkmkQ1yFQHfxw_SPvCSVV#D<7R_egj=X?^%@Sq|2%mM%dqG+EAy9z%%uz?T|52Y>(ze!GToGr z%v7yPzC-E9mvGVnw|T$ZaaqxnsZrDb9HMRw?NsOaZ|dqUQ50R;S) zv5q^iF+bcRZmI=)RoVU;!MW1l^H+&G-gYVK_;B6!3-1+8%u76ut{K0QDiC$BDvOsv z1+zCkDR|GSBj2A$8%g~JsRL)JwQw0;0+)H3vl+iprXvcXC>oWXsR9k!E2An`+c;0t zwJH0~M+{#vX}C`!soBnf!FXg*NyjE39ZwYSsFRXV1bS(joU6*JU^Eo^t0z zbq1K(oeju(?ne5|p9Gnh*&|-2a5$5d%+8O@^{#jSlCO_;8Od4aGFTQ^# z%JPTe!SmG9?xLtt_Asy#^yO*8y3%d-hrQLAm{!7_cd{(MJ;Z>ZKTEjh#*+N_zNmiL ze~|~Q_1K!?u<7?noBZ2yonhcI*jJq)HD#(#PL%S6r9WxdIp$akj}qoswu|<@O&a8m zw)o2a<%NiFSrU!$ThXh*6;Yz&hgooo&I5cd4lxk1e2~oderFqW(tuAy&fRE^$*pd+X6x^_Qpn&(5G2 z5!$Eqo++bPe;giC47*A?tFS&TUw$IOGr=;@V=0luV!E162RxL)Kk^DuN$__z(%&Fi zLIBhGxs&1(d3Acu=jWTUBOl2pdylw^1}_vs?9e#{(_9!oO)MZ^dsZhPL4syfW*2w8 zvRZo!2eE$B-~zj@S{Pj?*VyC@F&F(yY(`(ymWyGm><1d{#RLzcF@g+#yq55`)kfgQ z?LV`RF*z%1x`P+b%&M4Z z{A4L=qNK49ooY?%N6QTnr+oBfd?crP-hMD7S;oQ(C;Qp!*qgwm=WB;&o`n)IF+o(h zL`ZVEvSsr5T_AX%^Tm(gGjttNrPMO#j4lo*H-L(ec*^YNsPReDfHgI0*2+~d|$FD7=a7Ge12$*VfTo4iqU&4ug}C9$`z zwG~#=V${6*;#|I=78BC==f}^;Iro#mO%M{soCJ=m8R@5?;mbMY{r0e}RBK+xTQh0P z{G6N3UL7Z*qV{H#tFT2Or>|rEMhEpc$NN;(D`zun`HaK zsXGQL(G{QL%k%f?vY!Y!-D)_a6Z{G}7}TlhwrYU4#a1+|-rO%rYWss-nR^g96Y7`a z5{Acecw#2o?wga?LZpd46nIJxF`^{S8R5-LOjgwmLL13VVMB3{>*8yxWPQUmF5Ddw z{O6h6sa!>P`UE0V;F5)bR}+TI?K#e_DHh2^(svbp369H^XlU~wSSsf(S7X|KGicjuyr>x zqPd@KFfxU0`ULAIa2nHqUFeUW&j?2c>j_*ZH2HGVe z@i7NpGtS+uNw(Zk&L@H}vW`8N-cQLf%v?R67wWn?AYGN>Vlbq^l0hluI%V&jcj_Te zHu{S=;pR~h1K6z#+lu82ObEKSy7yW*k1i#rd4KNdgro^tQX7i zdgz7t3^p~rxw6~%RiknNU>!=`m{R9KWevZuLUBuw%BipImT`zB{R_+Oq!A5gEZ~ZH zf{pa-3a78@e3KkLufsxbE=e&N^J4FRkq!Lar?%z*FQcjYag(}MJz6~dqcD(8JICv_ zR1{qzGx_~hCSfUfRo{guUqv+-=pjNvf?ec+$Nz`NmodMit8o_W+}Taxk5x^nO_jE; zRMzPsOZz@2iLj@Rr1d^dv<+tK->cNSzPBB$5=8k#Op8h^g}X~ z0zlAgXfDlmIndkuMcd4#{wsqV#{lYxj#xSwu82vs&z>M7r^u~tG+cQG3^!<%Ht z@&2;=x3wo7&Uz}3PA`&Hq4OvD_J_GxN|3(3ySc3GEAiIaR8`rMcb3@1}zR|D|QBs3nDH?D*og zC-(F}{7K&yykTTM*D+d^%p5r}>ko?%>(%a!Fg|v%z!|TahkU9Jyu?_Z_hen(Gk6Ha z0v@zc7ZJ%9=LeDpeSQ9s7`rb@fq6?Xq&1s`+85%5F@cHg(Us6)n|I|jHfr=f>i+#$ z%F~WE>Lp$A4Vf0PpZPYaz0{)hHtC$lYsZiOLS61@UlTS5!%5qPmv-FWcGC!7v~$+I zf{Iu<>gqESBI-*vhO)S5msgVoiU} zGbHnRL-Ci&(@J?ftfRn3M3F}%t41^H z|5FpCVz9BLywt!<>2YGD$>?5A=l*>88vw{3F!r3Fcs;}b z#>?GjIE(Nx@^Pm0mY`qwsevav7y)CByTQOYRP0kBcJLDK1w^V~*EMr`TiropL&b&x z;8Tc%ICyIT@tswc{k+nxSwOF^5h2ScZTwJ&YF}>MD}U5~E%xgN-=oU6!*tvbX_Gu$ z()0eKGV7WXS)yrKra5WQ^-xlc;K(}6pl{^_sQcx<46%anFW(ray__h+x5u<9^|S_2 zn)OWaSDw>)ay@4Q_>=qX3O8CM-Nop(O8LE=UNu^Vb17N4gOfK~_oovT0P#tGyXxE{ zeDaUX(VdHLo1sNlclf*k0HDah@U~->!N!JW#PwT zQIuRM?B7gy#deBpdy38!s~kQvG8E+TF$rZWx=qg}tUXDv@g~itEBJa1fmYdY)t`7h z!C!x%;sM67>l#E8Y7y%AR%a$L^MJqucY#G4xML#9Y_HJ@hfujS|Lb0$crUf|>sBil zB7WF=TK~KGF7YI~i0he6&w}3d-16vjSR|~7V+w+-K2jD;fY|HAO05ReG{tg0kW0>*z~EsSwkh z*n;Z5cPrBgX+<}|k?67(0c^fz!}shr!AxE6^|{e0x31MqacQVE>|eI(vKF_l_;lTwPdzLKjc1#2>d3$28G040kM}%tce3;^_r)8sWwPg+ows`Gu`^(0 z`6@>+aWw6Q*X;t{JDx-+2-JjpIYL;d(?ECMK|xY3o82J zp{Ma(qoP6*8vHs^xBJK{hkU4?VMaOLJAi54^OQ0(SmCxJ3#uSs*4sKf&pb% zUdi5N@zbAQpvRwP&*ZnTxX?SQiG-MP^0nEY^a2;eb8qoz{JfuJEaX6di}Tv(iPc00 zDbEs&%95)B2vUz8d>vAhTcBZ7s#COgFRhdSo+Gv(h+AW!F2OXwArA;d`CqM zsyeteEkANhd7MQXo9;XP32%@vN@WLYd^pLcEG21*eqM*6rn=wVZ*r8c=oVtz&rA7N z9d@j!uC$wp+y z`5?C=@Y@B4C+-BmFjIgRb*nW&8h#F4X#$csM3Zx3$d(`splPuxxuCZeRuO?6jEd&S zlySCUE>s8=hfXZ*@iWC3gc!PNB*V>kB(HGN^QIqpHk#}v_LzgvXUQ$BhwmwQnTsVk%U~~IuIg~9q?rhZ-|LI zn%AxA@|USEnb6JD{g_BuVz{g~$*PXd0gz_B6v#F3F03W~1XSsD7(IhxdN-Ww*Z}#Q zKV5e2)d7iZ2h!=N zg8D%Y_LZ*%_eLi7cI`!M?Qj)+BbN`W~;M^6@Ti+|4t+bOeaeDYTu=4_gA~2G5Yjl z0!+f9|DJp{f_X7lJZwBy=$>K$~%Y=vc#i#hwS0CzbUkwRPkwha11F%^uf*TmK^8Kh{aR|{HgeB z*x8Eoo?FlrxQC+PA17g!JAGilvR@!KdW7pqV%D$u>K=5?*H(--lz}6v$Qa7xf7|fv zipy_ERhf(#C}~JNhy;J;q$of57tzK2Y670tD#LEp$JBV4wF5ZXJt%Nqs?fyuO9_Kj2#X}xQpIXB^Zjqo~yrJ!Ln8rCt(-IYn;1&c^xab zS>&};^SEqFlDV82LiFYp{f)XGfm88t^lb2koWrv4;kMM44=jRt_tJ&Dt&>HbKzl5m z;Na%?e6k^VS5&Xbi61 z7t1B4U(Zmf50k#*2lgyw|F!y&?0%Nu0A#dhxY_OEsM?H#G|$8aXB~ANACz%!(f~8x zp(<<2)YRKN4o%8fYTMgUyYHD>al&A`Z=_k+9(1brUwQf^>-6u00SrvaxLq9{2LiPp zVeVhPN(klVmK_iGTXzUW0M28xBzn=<+>2K2+X#CNjd4F`q1k-PCr8pBEk{CyeM|Hij@pr@!!UnPF0 zw%xxm-&`x&yHdm?=jLMh$Y4#UW`$G0&MklSVCKPQ<+;1jVb1wTTp=o^^#|`}tf&Ylg=7!a0j#5-(U$ z)Xu7t4r3n*KVfk7`nE((8BkX+4;O*mz z3T_86jPnGv9_BBNz)I|TsIi+!WelkHzSjotuGlv{@19~KQWF!K>^4O`+2~_#ZSLLn z)hpK9h5k2-0YA?eceJwz1ka_@dMpPO-#|E}IMU4*Oy9gKFqXQGM|`WZS4~;7oV`iI zM|EmU<V zRraH!H`!nkE>=5qVQU+w z`1x_ST1XM=nyYNC?fkX zV&r}h0ZsO6YVXy}@ZW%T4s%4-{Gadyzn^+2o~IYl8+^|0c@aBx5^Ac`G3LoSpx}=b zi&o5u{XUIQ9QNoG^Qlxc<#HAl#An~o%%4|!6o?7sH_R_r z(K!#OOYH$Gnzw7Ynxn$rhg0twZ8Xx)S6!vpn<}5$hVxY3L|JU2uE2NLHca%9-8o4U&=)69ZSfa4 z0KkR`ebed}9B`&ys(!;R1qNT)hzhj3SO9_C9?ZaRKiCyx4O=6NnqXYNXP!b` z{irwB&>a1$+9#HVpM_Q5D;^`0DZ`F^-0)}bVxl-JBfn&3!)`IoI60~aWncEaQVbr5 ztg4cc?_Wi4^iY{$?!^rjV!(d8=3pZYAWB$dYIG$0cW^|Tyg50VKE9tf&=J?$M3$W5 z&zq{O-6O{dQ%C1k->oifpK@=>Q00)c3Ee$d(Hnyn&BH(rq{BD>z+hrDq;|?2pEEk| zj3pxSwJ)#P39R}2kEmO+e6=ubtsG}J$Kpi|?f5DtAqIJ^_ zQK6{gcud8MwoiEQ57!t$Hmn2*2~hxXX{1C`;Hw~usaxjJNB_PgK|)_nFtS1?*~xSo0)B=fQqOn#`^Ufli=A()1${ zXunL%u4!azF#v1u%B(*UA2rNM)wtSK{Hyh2D;b4Xm_mhU*Q)}B$TF3O_lK@CSiQNn zA(;va{5yaM=Z1XhZA~Iu5Z0MjS4AX1dv1AieGudM2ayhbWV=kka+3*$p}J`1dBbsQ zd962Xq@IqO%<0mTk^ohrN=$|vy2fhlzBw&b!oP_*@|(mRK4}B5InxqXx)P-U~9v`$9bQlJej z3VnV_*JwiTR$3z`FlNN{+Cp{Kn-!cQ#MpuTK>F4QOM~<(iMTweTr>m;k~y7CXTo;B zzV4WxN52+aVla446#dg2t`10MyVODYwgGMKZ~aOZj9c=QE-Q^IJf$w8ezM7pVQo|D zwX+3(s#SGz=_~zh;C+xKog9y|ma%MuMXp!**aH1T4bRuqc-!}xZoQ9-kxWuN8D+QN zDBls??JJRQCzNXOu>N{(PODl_U?aAevSp&uZc!Z*m>^9rIEs_A&9P@5XT2K=T$HsH z1y-ZwlOz^hvG)+wSvwm<&X+&cRuM8-mqVwdbAv*Jr-`lnJgq4p5KB7!2VD7P?e+Ea z_tDC*&FGg|lPJ0owwcfGPm;fp3CFjui^N?Hewrj5E5CMNLc&}BO<^1s9U~uO3kYVx7sIOlOMxT? z##XM8vs>L8bHvFv9XftoAM-PB+Pq4op9vumUAtS69Qp>B5kN9Ei64|W@-2B z9ZAx4fu;=zVi5`pL*^5&e*?j3F8WiD_hU({dc-DnqI4}pH6 z3O-ASiu(6aN&imEiWw0QqSE4M62Qeg3~x(yPitB4ZBM6pB~woWqGy3L?Mw50EK1GF zY-K)k7PEh|Ua5r+q-~jO``8U-`>81v_;063flcheSXdnmYv{xqWG@w`xe`+mN$Y^M zOj$68e;6;%rSM9R46WzwfQ;D8uLOT1mzpDQY&-KZ7>@zwUwE|i<(OyuWvqu15oY*-l{(LNp_ zA?2`n1CB0aiT5)eTPRObhjAKC7a^?gM{)YmP+y>QGV|y`9&lImAMQN#c-k>;S$L9D ztUDDKXIqkh&mMj-{J}8Uv+jQgbobO}WjWUTkEQ=R{g(*|m0=I*&ERbb!!4Us7D;~Y zNs!klZJtEoJMNYAk~iQwhChcvhV~c5>-)-PxlrLy+dH~gA_(I?{iq^{bXP1juYU?AZ zdYAlX7xL=U3dD}lrSLKUxF@Trq`Y&p`%Qs!-Hrq>&3@M>cO>;h+cs9c2BnwM7QR3krf>N?%WmP5+tUi zOa!%wm$fe!k~6h2-UN(?E_;~U0@wT^{(-C11+8_j>EUJna9puGf{Wx%-Omdhc3&X? zI{S!c`JMb%NY;rsZlm=P_I)vZNmiY6(L-r-J({(Xx~akp*?71}Vwjkge_ymCQJ=M} zrgd&OMQM>it`&23Mwo{+7Ayn6?>Q z7yIr6g6v3hR0DY6+8^>{vkwwxx6-}eNhn}Bx01sg$w)tp>-!HYV=>3;r3yc1KFZvs? zzK@k-bXc`$GP-BrDBt*XQG#v3nKZd~PH>fV+7o%`wYM-zYxvjmQ##u?H!tqdRJi0% zV`hyiEA#$<7hmeuWOwUM&g!lO2Et@EZi1Yfge8my5|VMhTqQoG#|2L3?fUpV&kVQ0 z2O@fp0uPzM#kuLQ=Kb&Un$AB|>tG=DzXHgsf`o~$hw1D^qa-(%Bia*<7UV2U9*UL5 zDY_ChT9wqMgQtaeoBDdNVRVOtLtX7ZGL8L3+-K_@6cWVR8>$KLn_3-uBc;-L=sw$b z>PFk9Z449bcHbtMw3~fl@R0hL}UrA(bd{Iz^2SDY4}RaSSsoLg@HC$5lIrY zBg*t|O?;n2A7+YHTghkS*D|PhvJ46Cn<7LyIc6e#>9b&&t@Fntb#kUVU}^D2#vpx|MKe(IVoLnWyH zg+3SP_;J{l2y3{09%K9@pluMSn8bl*zc|Kedr_t3By&wi&o=xLuZF?VF(c?=PEK3K zPd)5J5=3O?2UhiaZV=RoX}s|4vsiUhrl!rgvw%ZDkYGl{BkMw}JNKhUD)cLDjM_VJ zV0M-li2K%c#5_^sbBtOC$VR}s-q=6zI4UwxQy>@6)sJY#ftgIt2pSx8ZSQJEqET~R zlvTdBy7+{>U$da8S|X1;giA$1l8j2(LFnu1h+y!d$=$nqLiohTH4(Vn{GHyt4DX^| zb1y`2llOw&fEd8NEvQ)4Nso|`;nn>x}M3V6*Bw1pdBxyzXLgC$% zf(EcOs!r~Lv5}Bv^x)DAs1Z{yxwYgv~7}LY52BpqrK85*W0wLbO zzQ}J`H0M!oB{j>7n+m7Q)7!-y>G?A^S?ajn59Q2@Zg}<$6{TLMNqmws7XLnm%18t& z80s5QRqpw6GUHa*b=LHE;VAPSxnAE$OTk-#hmq(gD>L$}97S)~F>?Z9R}QkkPsg|6 zlyeHqp^iXCZqUC~7r!lznW3bvg6xUkMo`*u@^$oq{;`|v;WI(b1OkLGpTl#Z%xzo* z-(A3qVOf=BjQX5h*SKYdPYUm=BXuc&l6*?Av8E%P@3ja^DQFcCLrE2q9ZrDS`&N8jXc!g1XQ{>jDtU^ci^~IV{@Vx#kICG>p$v< zp|A(VN^?#bZhAVJ2(ARX%U^3Y<9H})mvz3stKC7?=U3R(BlR7>j7vHG5a)h1iC%ut z^3;Qx9=bQr?%VqU8EDkdGdPvdkVx*KAejuivgW+PTl;Qt>(b1X4*6Al!bN z(`fT_uE3nE9HazH_v*RrYHSOzFo#3=Y*<8jZ=4FUj+Smh4B8GYsVkOe1M(>M1*pimz8Y< zGHv>=6t8Jqn(UfvZ?tHZDzt`w9(P8L!!Z^VqIt;{FE4!)jrt9*XWThIV&wSD9GY=l zF0+`p+XdrfOwf-?+QmVcwXTuTO@odX?L-rf^LP#@3>=)I5Wx;^eC`!gch5Jwv-QJX zYCH$J@Mc&uckrHo5Kn_^1xpkxg2;z-fOa_QRHJblfsJetH&2Zt=CuMYEf zxVSop%nBcHUjw$$t-s?Xoe=ha1NuvaoRuJoFMO%VR zthik-v&xlUBdE;n>ncPPa%bR>yyIV2>ML;DuJxO(4QO|bGpNfh@0LWz6QH&YZ;~nv z{X9u$tyY4kpPs5ftjgnI&jWE1LH+JjVeh~vg6VQ(u1dweXnh9vojtsDZ#%R&oHy^6M>HTe&xG7^VA^4!0|C$F6}~#x zd4i=J5w^)O4Wo{8wG*pY+1|^d7=yML^ViRnodAlCqj2pUKjuly)33+>Uj30 zC>>jM6pissbg&W7(Tho#|G~#hHCN7{@%yf6t3=Gl4CY@e?LuTC-|{OY5F_}3BsJh( zAlLzIWJ{ghj*a=|_A#7i-PHiTai7x&Zpnj@n;(gVt=+&c53fY7+kJa9&?YHxL3ocU za%b0RDrTsVL0(JqcyK^Zlu*z=XT&%Om9{7&;g{2tOz^`?1}B|7wf<>I$f}{)D@8u^ zPG^}awleYtcIZ=04!0wxO%l=S z7KssTq^`$VtAzQXEcLycIkNEw4wicJ!Gc!ADSp-9dirQGGW4s-g)Pnzds{YBc3aF? zDOn_OvZ0?ntI(#ZjrsYgFpQ3t^4fa>C_Dp&;aCZp4SVsJ>|D1&Vtmd=%ysEk2MU~p ztW4Xpjx$eH!iGRgP0VYVJUD%clymhwGLa&&0~hiQfv%>ko$x3fD-bR(Z-(CE*^IE! z_LAY7l7x4NQ(s&Y-Qs*s1DFdv9^Jej*B3-GdEu)B4oCY)B7AWy#}+wa_*=X_$B@2l zT&b(5(5E=5P{5i!ZR~2m{jEAaKxa!^JTsg==;d7AyjM<;1ztfC<=w8(0wYL+7M7*x z6EO!l!R-ysD2{K6mp&dP%T2Q3bfjk^wqli1N`elI(o8n=bzR^nW!zVfy#{T{J4SGV zJca9Nh4!F{>aeOy3=Wo6kUcm5LCd$3Od~3h9SYwxxWKk z&j+C+aZ$l^RSLrF=jo@1rr#6bO$aelEddn#Z4r8U_&FMy83H^7Y5=C=06!AMR&w*Q zQqbO)h7dSnWdLVTGF&NC?2O*m7ijSCbPh=}3k?#S%~AB)haaWZD`6^baFriFg6-A# z%ju!Tt8H@DIgAuuwNy%Q&;!<{*KaZ%w#g@cUp2NvZ-yumnW7w~6t1Z}<9WOg@U^Xt zTfFWcmrs+t{NI`~(<0|AD0&Y5W#1PP%{}c+WvwUJCYZwUJCm5uo6wT(aQmOHJLuE0 z&Wf z-PLEGvrnzwt4_IsnXJio*ToW@o^P_N4vKKnpfH7NDYOA}YCxdQ>X0I@83iLVO8OO1 z+~6AB*mkoyXqp-WWe_Rv%Nj83UHZll^OfYudzqq+ab)>By<{((>0F&hNJiU@vIV|@ ztT>CsN9$uVqn$IGKAFqw-}42|tFG&so8DC~8ZCY6xp_Qi%?c3OkQC3t8&&f`>$a0I z!O;8JvvrSr&K#PF^_&NCub!B_j3l#G0!~^&58PQ+bUqH2cNNWnh+#&CpctU0WKzl!jiS5; zN>A_KH1_<_pav&Nf&EVcji1R+@*U!cc341VHzArooOZ&fCkbOjPpwZ2%*SZY%& zjjN4JESk1fE(PI#E*1Jqg(xR8j|Cut_#q<4mOEIyjXqa(LR>%DCz@ujP;k6`2#fh?AmE(skuh{i|ddr5kc}XF}340!&yWqrV$v^J}jRlZ^_oTm?)Mb&LbH{MYP&{(jG>N&l08qg}^W8=eV<- zcu99Y)q=&PN#nzJMj5%7D_^_wXYZ$v%TMLBcAu<>7KO5h5f3k<|5m;mEV+D}OeR z^jf|)6(FLz`g)V9D)gX9(;XwW z{iR~u7Z65gz-l=MA(|vc|5VeeV!aed(f!qV6Tn1#+V&N@BP_CHRkHeu87Jui#ki=^ z*O>n*^!*q#b9#xyhX=bY%&37d4n$f{by%$Cn{E8^pG8u=(LWH})oAXLFurIml@lWJ5#Ean>zV80ZgXMgrze3 z1iL08M<^gYoV}jpCB5K6CgpFaB7SHgW zg3abM=6?ZB3{QZr)Nc1DL2U&C+6IBPTeuzid2YKFtJ+VdczmC zYCrE|Oc{(NnLxfF!cyG2OY+oqrE_26(Z3uK|N442MaX1{uLu`)T5Q7C5nXpeOb*V~ z`eCOsf{^K{nqW`jh`ySat1%pJA-#Fyua&~@)fXn)SESS2iurkakM?BRJh|MnA!ON- zm@8@8djM!XCL2{aw1LlROySuXKpmY$I{(QNi_CSaJBG25=Q!t-w!`7|kbf{uz~A#| zi}&-8jg=?vC_ha~v4`Vc5L1aEz=|la9zt9Z>8kdC`Mi-Xu!?3yx#t}BG+K!+jWz%4 z)Xz__FJF3n?aHYNcv`M%+49MRB44dfERl}tW6sYd{J=fC!=9DeO~=vS*9d$$I3dsP z;v99omF&Uu>F))Peos?eD}K%b6*2UjEVOImY!gTo<{In?9xocH zjVI4$dQJvuR;E@zr1qpXpS1F+m`9D@YY!TF&qEVyxn}xX8S1o|m)F(M zEQ6RIJ`3{1e8WP@H&P?5hetrHT!(|9MVUw_kSGkck_Ztmj2~18wc@nG7sOeD9f(aZ z`*0=G8GdDxC%{!Xm_P{@%Eiik?A@sYVw&attG z><_JbmD&|DFzjDGCMd#m-FM!j3j-pxi;+QEGNgZ-zmYZy8XW_}69@ z2bW+3U1;I9U>s(0z_!y;m9lrk-!M7H!4BEEsF%4n{FkhExTdsO)=Mv$=)RT-EbOvC z)a&oI7}qe4@7i-45p{P%SI_q1WqI;RUXzEBG2Uhf42%~A@Xm#AvY5sCT_Xzog!=Q{zc^@= z4*PJF$bO7-DOsisXK2Z(q4mWpCKV&*?g-k7|1{Z`3_Tm%NgL_q>*HPhyq;;2M=Ojr z0$~05(ax$LHsMA%-lygzJ_3fF|HB7-WLZfu_0P^IEzt7Gq_1{iT@UHsX38 z)nN-N5y&#We?n8)4Yq(iNmSCbt-{uMIrZLm|B0O8WHaTVLH)FL_w`(8^w#P|&0tY^ z?j2zLlW56IO7ZT-j6NG+((ZNBWfAT#sLT`(xHF{x39FJ z`n!Kh^P=>f!-HXO7!hBQAt#CtcsgZDI+~ld>p_tXiO3)A*TdDc;jsGWkqH%o{dY_>n0o?ab$xTsz zgKK{*_49dT;Uf%Xx<6&p2DhQr)0G4Wm+vRzx;*-nwS1R?*(=Mer7nRmFuthjFSGK0 zO9owVO^O*ymzw<L7qa6Z8S^20#2IKx*9G z1t;5^lOO|6mCCZK(zL*@%0h;a7V;$0*@OdL&|L>LY~Y_C`nmYbaFW<~9R-3=;I)_d z4FzXdsU~jJN=i%c6Xr<$amL+HkY=-&Q9==y43CIj3cxd)i{vwLe*xVMC_IgtG9HlS z$j6r*)+K5ZaH$P}dNun_E>h*~FGB_+s;h0mQEK`RgE!OR!qd@7OkaNAc6Oz3PBSbJ z?smn6j>KaT&2o5etXzL?omN$`6kGVE2sR?o;cUIJ##od1EkJ8n7|*f{Ypdt#Ft=HQ z?o~dQJ9copilT9fK_nG7RBd=*$ed-1voY9Y51k4n$A+O%@0Ct*p~6=?hW|_YkHO z0p$yg8cQRa8XCo@$+g-oW@*+G|0e$9K^)>s+DV2ISwi^0uf@W@Rm+aV9uJ8;p6<#G z9+RZZ&z1?w3M`G0`3=6XJafX=tfAF;YDee0r`S$7$a{j5a1||PnQ_+cuVosS*?tgP zz90C$#4q5H^p|M9na+!0?ts^2eql7WEDa66Vk^FGH}Pl*pB(Cqd;HFYho$tBOSHbx zhY9)#9^2pkBKTK8xvcBDkbIl34Ajo)lNKo1B#x~o*B^JlUwi=}Q~;B%3*6One0$v( z$0KYp5|kl~4B!;|MedajZ=dlTl@zZ8Vm5Embj)t4FDGS4YRpk^$`2Z1G-U5`oOPkFn#$xkM=H zf2^ld3quT{mFpDHA+|2^$GE->RE4f^nK&A20ghf^6|e8TTIUEb`M#7D&JP#b8B z)gA@VSwhd;n=M$7k<@c11+$Xp^H}{X8uw0^i-Wy1GrSaPRH_ld>I^_fnR6hT^XaG@H%Xc z!frq__5oL(INmExkmbNiVV~7fbVG%wt$jj&YHRk@{EFFT=0vr(o<3WVE?f$7O$0x~)BBZ)LJj!ZV zPihOZ`miODWW5;^aV!G+hp*ItE#_oJM;lX;i82scSlUU{mNZflFSkVb;J4sG^!_=S zH)LZ4xjr*wg-i*hKrddh(W$r16r!tvko54>FKt)kb;eM<5PEf=4~aq=MyZQ@^vzP& zM{y|$>fhbNUGfGvkJ>PuFDN>8#3i7IIz!CDI(?)L=xzzNzS+>K@VNQe??k4Tg5rAN zl0w1BhdKuko5&@6%xMF$JL0Z8e&0g9j@ku7H~gzk7N|(ZZIt$ zn|Mrp;U#yP#W`kyP&tkag?B}bIMo3qk$GFcG zKVGBM1+3!cxRO-{?YH?1vD(_$*FU{Vi!O;;Ze7A^8XLUzS|$?BnlCy#RYT^#;ronV zbZ+c=`%SUS_U7)eDoX8+Wjk2bx)yTA9 zdbJOtEg>jA(NYbb{bg(hb?NsktqiY#LG@eoP1Lkq)_}Upil`KJR2&>p59bN72Nuz- zF=Lfae4lQQr6G?g<>pnJ>-ZU4}iRd~gVEXTwfLp-8)mi35aHob&O=)k5`!-1m4aoTxGo%oe$3Gt3JR0JRP z6rwn|AkJF)5%s1opWy4lR9AbDHf$1WiAzZ7&9$*cdORMVMljaRjGLSJYH$CH8o-tNX#s9vAurBP_P~YILgP zz9w)S7y5Rw-sSAuGfZ7|4W!IQpojJsN627z=IjrSWamM?_b}RnXe2taD-+5Z1jahN<%q#;O zgX*Ix5br5wmDF}&2M?+K11B7ynrOh*qt!>!?$a}pM4Dl}8rNm$hdJ<9r?)jG(7Tu< z;ba+!MsS#gzzWSV&{Jig2AV(=VT8>)Q?Y)n8o*-+W{rX|mT@r6=nEfUB#jF@U$`4l zXkju0vFufjf&>tW3O*6dHaG0=1-!OpcYM4iD##wk36-F&zGLUnQK1-WBP!uuHSNUZEWHI^OjB0+q!_l4R6WSc%S6jDU1I4CoVK zD7qJzo4qvt8NeHX+RW~=kqp{GqZ9=pzvIpse$FsNX*rJZi|mr1_+{Uz(xQK(GSa2$ zwnLP%fp4hbAwPcdU_5cs@-6&#CFB>1^} zmKRn01yKQ*1NYBDwK1aN>C5fdVveSr1}DFVLv8U>*}qqgxgikfa2c@`nsMwC#T}Xk zIbnJzv2j6L@KXC1-3=FbqUD`jKZNAde)wztqoz#ew`phS5|*kWC)`_%|1>RW^{|hO zHiU$fFfk}LGlldfa9EA<0+m8ojL^8-!{k_d5(RicuIyrzis(y+Z;N3q$+6Jk?|?ZI zF6QYZ9g#rwW>!*7f%&4h-7#RA9AK{=ou@#-c5u#iCBo1?X3PndeTb_mbZ~}FRFIjz z^`V_ktF*76^e#N$KOV~|K|Zwd-EcGIH~?}n6ZQ2{HeNY%b(z`U+bWak0y5C?+N{Vy zQQRx5U`A`?&}1a3WGTtv91wuq5ig1%9$WUNTA=4=RdEj&vQxh1D(B3p?w@QnP`^XK z!NK9iM6%FKu@zr&O<|v;181)Mj^ZMu17QZvy}WuStvu@|<>tT-a1N z{@#oB&B6D1vhT0`rj&q_@qe4Sz689-|+pMmM{%+_Rb0BZ8Sq7-u zc%?e5=e@YqXXyWYh734pmEY9;+9hO+UfrOB`e7I?+#z?Ci-FtW?3ti}84h9|hM_Pk z2fg~&5y9u|74cb80)1nku7E(0szDM3QN{Uy3a}heiB4V2;KPmn0Z82{6e(VbOxK<{ zA@||4swc#-l{C5Rql6&TUV_SmPAvnB^PqHjsgbgg(?mH`1)rE0g zAsL?=mUmAa5;16yG2ow|xocaXKB8#*NLzGJAQz8DO}st0Zt&(C`nG%*Z#dZ$h5)6$~6y7re<`I%gN%@^yjchT*Dk2J~u(JCGS+<=XPqftSJ$OzQ- zg!Ej0WEeFouDBeo6yA?3Y}cjrZLbol&qK7C;k;|<-#IkF zkpZ}~i72hS)_koy;WapH?0t9dWwXi|%nfRU9?qgJ$GpKt4m^!x1d1T1LaBXpCFu@2CYFW2bDsLDX=kw-GE`(db&_MGhzIbL z5AI!v1sF-(ofi1G&hrHLacuZ3V6(XZJE+UHv7-c+gv7{czVv_`qF+GPi;4f?)OUnB z>>@~}62aS*AfuaB`Cp9X*EnR#llm5mvCxktSlY41z34kck(s(w4}#)UPzQlaA6<#9 zB&m6y;Y_!j;W+r|Ryl9`I!2O+D#r16TM@OoZ*OfE3NzM`mhBj0Yx1pX{Qa|xE7TQ1 zDsj3X+2D1DKO(gfVL60vWcgX-#DYAgiYrmPQv1o>w>%`impD`T63A~BlKuqy_LqcV zSM+kL$i=oBJ`F-Xx^XMM-oS+oTWdEOC~PWymLRrB)LiRWc}geS%L#Y6ZQ2FG^rtFn zlM#8YcC$zMf4LJaf+U`!+9rOdkuKWcrhLTIc5fTqcA-PQa@XOpPZ9P}%%eF5jDPOW z{=s!Ly~xoHD%XY3Jm(%6iG)ULYxsP0gCO;B@IIQHgzJZjO9!+;7n$LU0F|EwqNs}t z$H^4GLL+b+%`bA*t$xn${IGYM=veg-1@$Z94Pwn8o>j76BKN|d70WlD=LoilE z8aD#GEhjYmMqGtl-fc(XJ*pZ|RW{-h<)>sE96o@Zlr4r9Nn0Zupc#eDcjC(h~>H=Ye zvaX0~d8tmk8_^{ad9nK}CiARWlY~>{&p9FE&uU<+p(rQqlCQg9^Ar{g^b&?*uN_#4 zp#QK-cxNg_Y;03hOl8<9E!}sMC}}XU@$uki$<#|--<?BeDE==sGtwgtO3xfUNDyEWfB)TcmOM3Oa&XdH(D6X3 z?Jm|-XGDiaq<6*rA8-91r>!Lc(mUsY%M06-SvrdJa9Q-oMf^|arzR(9-p+fJw_{rF zhBilV8e6u4tx^9`ad;<_^g9_#ReK3?@+zXeTx8eP*AMgBEeGlgPbuEE=qibpbUSkD zP2`LH7j>eTDLV)~iz|(R3(;+4Yl}DVpP5}oSXm5WnDZa=t7~LcIadJcqhRW- zprw_~iwVPj58K0i=KzZusKH1jn$i2}yCCJAi5xW)QsY!iWNmlPDcj$akpMk>IA%%E8Nzk$vPcJnq#A*A%} zgBuOvdb+(xoyO2`^59!roxFkPgDr7gDn+-1m{X&yn5|tr`6T@Rt_B0hw=4BKkL1T+ zXnmMK#nXHb?YLImzmz{(7qJM5gPWM4EG2dmo500e8%GXU!Oq>NnO+@oS7xzg*6OADu(WpmF78Z?SC5>E7 zl7L)c`k^(afg+))DU5~LkRj3VG!z{Ci|PCa4V|MX*zarl9ljkd&rjdu$-wcv_9rBe zY=6Bd3j8H75~*DJI7E08MR`TzgB{D)=$r@6&_)RB6|2C1r%H~-*~XgrGJ^KKen}#@W~f(MXV~MW0z;gP#^aXRUD2i zP`0z)jdR}x%U`$QnDal&qQI__;IIS{w6L=fnt`dO$bF(n2gkbuO~P0hxZ z^r5nL4hMnVLW_fu;OAqrbJKx%D}Q-wRdwWzU(sG)whb@ zV%Ug(-A;$aK_5(oE3kgvJczB=;bAR`SF-;hO^}}=l{0~1&BReepj_VzZxgzXk?OZ4 zv14k(z7|Lw(e&*Hh~n?D?m-phIay}^RDRV@JrLnLMAld$yV}s%T~1seMDG6};WHb? zZ6kFW+$to-A_5WU5M$KEZ2dtudDHfl-p8dRW-jGHReXqgDE#Z{3BYm5u^FL_(frvW zIIgu2elbNv^s+7VmU9j?Ccf*UY=Phl%^OlQI%%M)CSqwg&;s{><*V!+sJb}YJ;(cl z#fPJWb%^>gurr&Yp{{zYcd&W%F2j>fKRTmf$N%Uy#!x{cmN{Y8R~Pbq3>BCw$*P~L zuLq*+XPa7A*BaaB2-DwotD$)c|DD+0$f)qFiV3XS6`3$(8?+Wrc-UEDh(f}P?Qi90k@Yj{LzKeyT}S<5zb>` zfP)`1tXl6TA3Zf7ThCUFRyBmT=h_|KY`V1yog2B}Omz*T>BOD?9e9iT%0b9Oja8A-mjuwUR191-hddSR# z%9+y{*BRg})R46*=_h(gnIsKG0i8@tn>|Q*lpHOCFYPNcBBLooSR%;b&Y{ME-K^Y< z!O@^oq?5Hy)NE>_xs+e^kkUN*&5YQEJxeKH!a!tO#(~0+$}{neb{zvhnwT;_Sw>r$ zwtP`lQSDl7yRxb(r^>fVNg2C>S(#Z=s4zhBBk2{o5@{)ayiBodykerFqhe~2Z?Tmf zZz>y0TCV75K7FCmn%WxK+8@siks2``%Fwi1GE6dWSR+m|+f0F8A^li=3T%pPN-R5r zqoa9LXIaONv38li2Cjx&r?tta`E1>^skqs-DZ~0^POxsPLTtWa8Fp^(0^{s*mZt(3 z8b8N)YR8+<9od}{kiA_bx7a*)bZT*)etx}RzjQUXFz31;w>YsO=$vxr9C`<{4AU1`N^T>iM|futSQ1d!E!-m>*z<|_kpLwhf)c_Iq5<^)g^b`V z<~slz4nS+Qzs^FXVq;NDF8x0}9!7Gw{lx&b}jPtCv1{A9OqNWfI-EPwvFY3TY~DkvC5)L^04B1^GX*RpE%q#28m}yBEIy7ok719) zj^Cz;wUik;8Ri+6b(*y9wX${MTXRjdO}$s5?T*YTn{*uAm(RPJ z;}wDw;->s{v+ciMA#BKQTzH7{F?TR@OnGQts`z^P7Ws#Lm_sl24Tv1puNB#27^gnb z-2EI^X(gzLXBgoh!5fiML@1Xo7cKWG*DPj~Dvvebc)dJjp1z)5o94^AiJQX(ILPm1 z4zoJyUFv%=VKS}gTh|uV0`>9r3_Ez*U^iRZwmix^5;iYJr?gDG*vXt>i+DJ$KrKS0Vt;E0P^D%*g;rUbUG^j7(#SD z>PI^Q0SBGU{5H=!kvsbR8_HFxQFI+N4s>ejZ`9pNaEdy4i-OMggYD?dRQOae$@r?$ zv{AGjsy@_V@;Y1X-6!}tRr4?kiQeLC*r)mx# z%be#qOCN4mJ0ChT-i1GP0y27)>UD1Ux0wCieJsNbhqGgujK9~*uQHm%a7G(ghFdyJ z`4wR1HS^h$@X`7P#_K5BOrti$bIbYJ{2sf1KeI=JmT4&Q51)y32l$kr&g-*@b4n~H zR>23JGmqIH35^mTy_{$qK1|8ydea#48RiCBr+-wJHs)i8V!gBD7fj`Bv5nYG_wyti z|2lRkh?tbiSz+5T37C72hct$-#8SnwV0^EcZFh3tGmJ^b;=sbiW~A}?BesgnF@!fX zzpoqPkL{=*%#6xtt$+U8ZD5|6@;w>8bh^~Mv>^R1UH{p6GT}%Fi9yM5`**+TPE za9rCzVJcU9#;g|R6>hkIT!vd{ZKWPncgyoN#H~>+TiZk}UA6PSf7wAhOKrzn@}Ya? ze~ev}pX-Nr$a?y3Gj4AgVCuS8t~dVnNtnyW_(9m-a z!c8J{yMMA+;7An9z3MW0p?t;st;dd6UPw` z=h}hIwvxNj(`|@#yy1r__y~Ob6Q^8uhmu*Y*F0Oz(e_vrbzMQWQ{{u(;F+tX=u9sE z1h4OV?oN9dQ1B!{@AkKH;M{@97Uh#%M4;=}l~a|J?Uwn>1fphV9eYchJ)Z~1?s=4L z-^#S!iC&Kv`MKoARA^4CqeAymKu%x>Q1LNu#S?h_xTEV-;M8*%v>fs)LK2xiu=UM9 zutVx?PO2|~Ng&?W?*{f}Y@+;Ec>!;9{#<^V0GGeP*4g~pBIdgL(NGCCAu}cOTSv^- z?5F7h{f1`GJMQyIX?~OdVO?n*^frU9?XAa?p+jKv{qVh@Uk0%D%U`BI#Bd3^4%t$O z%HMBW2#9{B_F~yF6K6=)y-7TZi<9V7y4hz4ionS(K=_@j1GJD5TsYzjB~@m;akr3U z9C$$j_618n6BDuzD$IC^(Q|ic0fN+PQOsWnGQ{lXM(I%S6Wyi~0%$ zwT%ZZYy+{|=w?(H2<+`W$zxgN17V+0&KJQH4Ydrn&xdofKRJfnKVIxBcdU5 z0^fQ10^@E<&|jZbV*7jgNH^D#u~1L|q5Dh2fIxzxfq?&|K>z+gK=D8z|3!m<$b#bk zH?0av^KTt65ReFK5Qu;4==`n!c@qDYzvzG0;K|`2(0||1{+7@}u>V^dG^-H&ziGt3 zG7u3pF&UY^wVJ7mxw(U@m7`ndt116q2CS2`wkrq-7Ue$$R7REJ76b%r#admE6gy&c?)y%-%_$^Wa7|GOP=b5~OrYbQ5rM+cIB+BG(DbaxXV zBm2kDe?R}#PjfHp|FPuY`fs=XI>`Kwgqf9zh57#kbF;Si|A74?`7hYN{Q56*{Qoq@ zt8DFMZl@(~ZU1+u|8`A~o0XgYUuOPalK<)Ge<3wo&0WMC?f(MZ1pjBQ{tf<5;r|By z%cS=InB)NbKTQ6ItOEJ}j6Q_%CO~Ui94+D4nZ`xgtr(+Rb0>{^8TrW2LJ*vANE4!w3Ftfv6i6tR1 z=wG$_%E{;TOA-;K6V1t|rSD0gpVuRgcC=BrU;oQ#GWieq;m? zD)d*%jUm1O;=D z)nUg#rRwPw#yG|{dg@~*pklqfd*X^M`?-75 zLNn?UiKP+(;M4D;CFZ4u!F3Co#hN$!*{w_n!ZtAtFxS`x8`$&81a?nQikrOB=c%kBK1Us^z zQZvGGXDhy5m>+%(dDuDZj-lNjKG`?jX>@6hTV43B0emPmmH zkX_CPHJU|Y<;z}YFK;a0dyw036|@1VgF15~8BM?2a7%&{kQE#q`X|5W5|u4doVT79 zx2(2{0m&(iU+G@I&n*u=%jN1EUl}FnRSPiX?sa|m&dKw$Wj&`GWt*+4U(8v56pJP1 zXhhcEvNTyOCt8$Ao4NeKw0>nRBbt^FH~jF8KBngON*F;xR~rcydl^yVVXNm(5fbGy z!JAiDZ+48@a`wGjtt!}UEjTt3suKXNN+a;!*s&jX5_tz8oO9I5xPHr)Qv=GEoyPdb z>ll6r?*DFE$!k^+3&T*pSFQN@HpO)^74#iED3A|=A4Amxn0u(sUPTxOgnH-;N8D)e zUht65;f3Z&J^g@Yb>!1$+R!-hIdi0iP3({)9o49oAn&k>~{9>Q&CD2QMNatFFq> zTIlyRHqN1OKJNxwnE3M0_fZf5Cz>5Eu(3=2!EU{)w$V0Z4(6HySz`+#CcakcZ1#!- zRxW{9)Tf@_2C9SeoVvkdu$5c|iHkS{35$i`PCrxC#!NW_$@G^R8}|$ExB}A!9jyz8 zCM-|ibdcok8f$rL>Na!D z-w;!7<|K`yoQ58xR)?D zxJxLc67fpBHhI{lsJ0Budvg;JvEfwZHbh-WV;6&z3@wJQt6R?*y)#Svg-w>GQy5+H z<+ePfG$G6x%}ex#G8K zh%{ra-Z@ni*2zr61|}E*A16}-mUSc;U*z(^D@~3dODJ?=wcI78%YLzpNAF3Yy-zCm^fdKrY$+74v4=``uu)1UkKBDGTt`+vcM_Nak@TFVqGD={0w!GLpPbyV_C?5x4K>2R99_ zOH`Zhvo)vdUEnUGS{^s+A%+&8@pTr={Xpb6;g#B}L~*Jcxw!LwTd5*_cbl}ewS9J| zPZN(Ylgcxm=Nb6oyOH41=feo^=i4RL%&!qNGuO`$rc)&^thld>nKGlkKXG1G_i;Z} zy5Rh1t0`RVuf6Zx5qjE)!}SAUJ%+C(g}?W}mlYd^JBm}9@&YZKEKsI%z(JwGzPw;C z(8+;pfVs@U<1Oa$gNwR=GR~AZSLs#B9U+1Xq_X)#%)_kuO@E0{FFkpnj$`#sJz^{W zZL%?o3^ck*!b)IH7f9oCHjl3$-h#O6&23D**D(KNJ_m7B)R>lt+9Cp5N$McRGxSU5 zV>J>*oYcHztN#X*e8F8#MNjU7<wNix$rAJ`9ma@uYXmX43xQ8ffDj0-tPd!O2xID-v-xI$WSK&2$DI&a z<031f%NWCePfXVnX0aMxj?*Meuru<$cO?YJsceO|^G9lu^wk3Bi-5(=AH~JDTZdTZfY?dqIg+@b%Vj-cYs;ci8$U8S*LinV66i)Bug$P;?$2VA!FU&O7-$~KfE4T^ zb&jlG>WAiS`RIB|R}Qzk-Cl2DZxvfa!zHw?4S|7Rd)iG*wRhC`TxaciDOuN==(TTz zEBQ*G6!6}Q!hz2LSl1+*WMl&@xswh8Gl%ci*>2JQnnpz!3{y5TmSbF~X$`QeX~Mf_ zyLmHq2fdZa?a{XCV%0vc$kHOylk~)~qm8J7BKtU+Nvb=&b{l}(V&FC8htpLv_7A0k z>oUcw-y9939Vi7~?|f0ZoGp%9QI3`$QK?&Rao!4LlvSr$7=bo$Z=8-J84JfbuMN7M zMt>&5BKLy)CcY`ezLZKdLU}z6y;(22v=d%@uDN3U(1?+IK8%x6F36VKeC(3m>_9e@ ze;ZhcU#gQ(#^ zfg*o=p#;_yqWYS;lb&@EnA9#I8IC{2P;esIUSSd_Of}_{y#93eW-0XXt^2ON_Ij-N zv&{vzKS7a8nfd0CE-Y`%^G{U>(XyvlGy8yeJAG`G}}bnslpUn znE!K11;%V>b97mKZYslXN6R9q1zxX*kej5T3;o|sLyY_*)VlTjoBzd@;AH zRfMgMR>`VH-XcKMJi4b~=!O;6ni$yO%?%ki8;$oNSmTaN>NJOj%G-&ssBF<{aYMvP!r?l=RT8B1S8{$T+R5Rp3NVyixT^Pi(TOd0 z+v*mR+q^5tc_vUo3#NO)2W%qb8}Eq7yoRG{ikz^r1=;Vkpeu|Lx6a-lY)x;b<*?kx zGA*+FVm+AQIMphLgLUInwI=e5I-!p9YC-QCxZx7?OBd%1*U^ccqk;Q*_49DzEm}vD zbA&PYgQ1x^>l*Cmoge?5oN085w$owW0L%TpYn+)Q;r9i`LcIf83bpJ3z)w7{fvOLvR*Ey%XG2l6&ulF`K*6WNGP&l{^XV zB0!zuw2R_VYcK=NenD#NNwAj`@$+{xsuEz)TN7EdE6xRZgk6p<31QV91pVy>q5x;Cr7U~pwvF=bbq zSvo~xoT(`Pl()0lF(1q!eRyshOFn=x^93IXwPj92bm|q0?OX)XCNZMI8Y|iRTdgj< zNOfyI^eZZ9Hx-^}4HaU8`JE1g2BH|j%C=6%QqOcbr#LcaOCV7*u>f|X_Xn2Qt%&kL zmb6Hjbw_$61w(lt>r|$?SR2!DNBv+wANIfYnOwq!5Gkld$S{Z!iZ*l}=m$L{ZQ3dw)9Z7KhE&^#F41u z5W{r&9?zH@RpI1G+s-Rn?ug6E8(JMsn4)Vf&KguIN@OZ4#(~_1QGOCYOi{<51VrDU zZ$b2LmA4+)0r7`>kJ^^*eQD%GVl)>^<^lpj#R2a1T?GfJ?R1e(N0#&8jG;xo(vwGX zmVJ9S!vngo9V7(YqI|(hh|?n1BX{h!?XfQ;@?Ny!M}VlU zIG(4`o0s}baL{n=r$WQAM*N+Xpp;!ioKAL7P*)W;u$DE4q=4U4m5*}wxVDN18=o&Q zhhzT>i~sV=w=U-Vr$6RG`LW!p_ANt|p=${6_+Q}Lv5+q$ z8m533&Aw@V7m2fagXZ1l``5b!G8NQ5XEq3*&&5Hwbc1W}rb3ia?0mO$&_fR?e#H!BE7J8Wgu*34anozP_Lna|I_tdz}He_Flv}t;tJjR5K!G zCY3Uck(ldU?}zg?N8ExuwJu?&mR*a~yWPwY<$SX48+2#Z@eX??2bj+IG6|2 z+i>G>Z!iEjaVqn*qOXP{(ukV+{NIc2=}k6XwIISj1s0lS>Lzb;GfG^h1gIEeNIl?a z)n_q0qMu`NebF1!!qW>=>QINC;pIxvP@my4KnSsjo!+%*tBd~&7R9E-_>>lD|h$qUGGu2E$lcD z!o|zKRYBp5IsGB8C5Vh+x(xAkz=;OsFZelAzCUxlvEaoP1%oH*cYnZl&d1IqQ14ZO z@*#<4vBfXA>V4gAdG}KIn|p9uTv?9(tBUku0`82t!myruo6O5hnQkR3MU_aLMMuQo zcRnHSXUhbDQz9kaa!Ao_O0Yu-nFekBOD_}z4(l5oT-L)O$U-PG_>-|sh*p5mxAzR? zGAVdJYp|<{F7>edfHk+{*|n1jx-XdL0y-n^4+3-u+0vi98HupNrEeWku%+z2s6Q-$ zem!ueDb02Z2zz@)k;iM21OK%bT&H``x~0EnOT7Q>G(vKl$CHY}}4Kk)Cq&e`bi-bL+y z>MQlUE15Q|v-?*HY;fN%(ET?23_2E37KG-AK(4tiZ_VmipA}g4=gh>#`4jk|S?#zy z=lF2bb-nyMwM{X@9rMAw6mFNqmz>!*cnt=(Cy1fihimdk<6p zxVM}FCWoQbBg)>D0XTB)FUfyGs!Sy^%0&K-fgI>dFC!boLP}50f#}1d21@o-s~mjI z_RRV2ziN_#g4!GGw9XwR9-TDkk-pHJIGgoc-2;yZqCD?~)md3~%L$REh^IGth`@## zlBBIfI~JDI^UXymykWchYyKSr1r0MhxpSoPRmI%(zk^M1e`^ zP)1qMRBVZ|qjJgo*d~1y7##mS_Cae={`#WLBV8)a_+&HTDx(slfXWJJx0CMl(jt=A z)VV?V8_UsTU{V|p-CtQ|BYoZaI29vb##zdE^0Qxh&M=cN^csB~pxSTHtKsMtqu^f# z&%x`_3rh3p72+Q3)wt3H&U%XBKoCz4@uht?k8Vild!6Q+(iHG^47*RTQO?^lKDAKL z!hFD={5<^_QD9z`+vf}wy~x?~NguXZ_@u=?pmU2d7@QScVL1}n3}=KP^OIn>q(wk@ zk75qbe7=JXoK9;ni^V!b-(|z5g%nevgTT&}e=bzL?dwOc$%!U2`O-(-d_Rk}FQ^+f z*=&gNrK>D%TIdI@@^|D{CzPmVYKf0ly)tmUVYRYXuTF*jQ|0z_+)f!KqMH!6CF z9N2$!?5EXi9#JN#46G$b9FwgmRLA=kf!A{(0j7i#sbbYtow{)@b@0L$T-QC>O%M4w zPH=%}39eM@h_s?#A&^RBf=q14aEVCFp}N_?r0xS!b@NC?9}lOc>MF38Vxtq* z25KB&wjmYWXD{%^EN3@U?=_dRpu7WdZsf&}Nr(k&)_xbs*eWL=KU^O*N}JpcsgY7- zy}Sa0)P2XH_Coj{1{2)`Lg%pX>J1@R8LA=^vmOtwoD{{G#4umfUb$S4UPqg}q`jp1 z@2J5aueowoj!@6K;z|8hSMa|mG1AhbO}L5AbenZs%A&^b0QDqAy?4qPijpUf{Yd40Uv`^H@E`8+KsckJ~F<*^BWlLc-TVbTPG!@(2+9< zoWMNUM+mpX4Om%FZfc0hocZtz_griD$F@oAJx-MAx}62CrY6U{-L%2w;r0XiiYxK#KqL0Um9!$v8PFE^z|-w>UbuC!I9V< zzjCG0qQ8PhZvrj*+~CcNZg|U=Fq?%UfQeGA6r|04QO+y9qQh-&cP5&m-nXzSxgt zz{j!5?>z23F|$ORIG=VJw=d`eVzbE>jpzFdZ7X?TtUzAKv0tL=^@KEh^e~~gD92ey z9cu(n_%u*apcj~ZrR#}9wiS0m-G@L*zK?^2HTmpe%j$VqYBTW#}ozK_Hrh} z8o6dn`n7l9*)xa+_2PG!Z#&oG4k)20FBF`a+{ZC;ea=%Vg6C+S6o;gC!DP+U(A$y9 z+ApG=0n>M4>IE-07_Q+m47Q0);yOR`ls}5dA`(qPBJ%SfBRUpqqe=_m(-`zcr%GZi z-H(sB`TIc&bY|`Zo+(*r3v9MUR2BVFRiSYo+FlONhIgF`clk8u z>{zHj0oC?7EH_5;p`iFPdvIjuODo!5UfAn14E&ZKJlEmqnVR1@L+0yt9D1jSuvjcp z3K1dnXH@&s7P%+-CwrLg?M~wjO0A_CaO9=~G!Ad^ad)YtRcOGl;VpCBlv@YjWDjLZ z_^nDC^J2xG^Gtw<@{`L^b!XR>?O;iP!Ve=}CcD|cr=!DD@Y5XS){0FMuSC5DAqpQC zD-a~=jy_>)5BAEy5F%3ikF-RnQaB=^mMq!(RqGIr`$RDU5$-gF$(9op<;Ew%T%FSw z*XCO;sVvuyFS)=X+$50n+gtJ_+L+Pw#oV&EbN)2T$I1>6A<7N(9JS9K#V~{PqGt9f z`d&9n_4hdcuxg{|y(XNcnK2oA90hkl!_4xK9mhxZ?0p0pqFCzil4CC}j?WyAR*Q=O zR!U!}OE*>sYuq1&J=Kysn!5}Evk!$>=N2YPXn2|GD%Eohzed*0*o9G}a8^G#YPQ80 zp}gRnYhTdr&aYBua)s@z^+ghg(t*JRr5)2?E4s~Sd4sq%(i(Lz-iTAK`c@v{Z%|5A zR$UYd^l-fiEs39M<)6Wb^vi8;_6KL0Dv6HWmfV~TL5O;W^lm-tff)#8u&{CRrjI`! z;>~EXYRrg;{h#CJ;Qs#qj42+JsahM$iBR6ji^)`StWnK=L=}-F&a|9N>Bg4jDzQT% zLc%f1hV9P8=4uxDyRl4@US84ShqGSm@rAeZ04JF;`wPok6SZkB6aFlCVGq2^IMo#| z$ec_MoxEK(KAB8=3KhF=Sl|fP38&R=t+Nt71msFYqy;>xquTinesBT$pN!vS_Ih5bSW;7x^&5R0#+QB}@0Em^*il8T-K}MJppWucpuAw+FvW zXz5mO6uxMqzRE!BxL~p9$R>-_`%b1mi)l*1OfR?m7KW4$ug(xU?&sC&4oJY8&b6#Q z&Jn3z-D`N4SVQGoZS%&Vs8}z!auQWM__@jqt~-EP&}Xp#UQ;+V0M0W&uy8u_wb@=B ztl;k<6z={9)Ix(PJ^#mS434A-uoqMl!Zogyi`>{t)sdyvKswDTyCjQWiJM_6hWpZr zGkCG5(JM2yEJLd1hih@R*9ov7Nx@YGnrx~op*vg>w8>cR2e#_F!d%Zf6fX@@p=M%o zvO-qtBt(=vNiv;P$$rilq8jPzj`yA*`j4JM<#ao2Q#QkADzlxTndQ`y{U?H6DYXEO zz#1xaWpP6xS)1*m8~6G;v{rj1mB@hnpc1u(^HGL4!PM8D0HA4;>CfE17ingSm`QqQ z;B3{O_YkTqQ(S`CvS&S1T%a?wozaTWlbv3V>ilM1@fJbsHj1*6Es1yYKWrp%qZ;CT z-vPK@O|(}RfU+q7UP`dXxWiVF7(M$@kWa{KGYWCfj5x{a%>CduI#7w6Z=&pJ^PE3+ zn@B7os7t<-dYA{+2N}Gc_)^vtC~(CDT7ct&j&?}B{;Z+HzWy(|Wt|AT&Xc;0 zOC_`!mE3Aojhm^gR_uQrP#`79b0?{vBOkl7#&?Sn8CqbbVe4f-In!)*n%|X zA?&?&YPfnJ{Jj||j6l&MB_t*n9ryt8TIe7ecy)P%;;VRV@Kia(5 z(gZQGQ@It;?gNFgZ1(@iXx)}X8|CuB2PS9DPV0<})`OG~?q-pNf%AQ4WJL$Be<{XO zCjwXHIzJq)RS%4_5_{`K7Z-I|xhwp;gDy2$_thbUZhrKhydYdqkcvQm#ZC@FyT7!7 zv>uSyP<@ky%yLevl0JGf#5(AdgTg)jykEs`$Zspx$oU#!lazK$xNzt}l09GzxjU&` ztokOOi6%JI;1Giqr@-`snTI${VUjj=$hDg&))HsN-@ecLxM?R=Epq>f7UjBrqjref zCiPPf`^p>B_dE`2vAPxT%d>P;*>t_JJe}qFN|f2P0Qh+G{h!nbC6ks|h*uwrI)v)O z2zOhq19RD}4VP!TP$c=UvQrQp(xYaDK`Zr8t8bSK-nnD)WMFh>=hTuO0r!1(nF1;E ztBX8VgRipL7MR`>(#%ohdui%x!&_aP$#!E^D|WP~uiIp3zDwzRSS!=|&~Z}Je|na2 zYwSjEC%ljMWM!N~e1p^|eHCAZBC6J7Bcn&WQC(+0Hw@)JJ_# zDbwuo!$!B7Zk6F+<$v&iZ1>SDFI7rrd0FIG8{SBq@kihdOcs0zo7;HK+hGv4tCe%E zj?yfN=z;fD(4>7A{gv7PG-Go`r;=&^CLI`Oelq>M|B=76WTiy*J-X2Xd8;SuZZI~d z#^Iih?39;Ub(0g7jVnO}EX(k25nMw)+j4~$_#WaqD>tZuCruQVPE#iO^T44;Vq#dC z4g!{JzKow1KU3aeolEGTw~rz_xblbZN9A$658}DkGzvqML7HKYpI*C}7IH}^1N;d9Bt8M((CL7X(mm(UT7Ahgm^TXO#fP)c@{dL5R zMJ8}TPe9L>e%&+eg^$UBIW>MWxThK_2!nu2Rjg(>6>*)g|0I7=b+Fp=){`s@m6iJH zOXkKu3^_}s75(i&v5Pgff@}FyK9T!EhH>e@31c+l;W!{ds5-dlI1u&9ktqWuvrK=y@N7Z2Fj_fsnhE@3;P64)Ub$hl3|^ zaJ6n=d0fbi{DLcM!#f}|d%-uka^~Nv$4L|qg)G={`A_LNk5g|dMtxSJc?gi!v zGcJdHK$GW)DOoXZ;9x2=qIW*a-4-=X5kQLyc|*wbw>3~62{u9U9ax^?eSBvaNqSbO zaiY1r7D?fFpgQ3rp}1le+o>6GIp=P35CY33w#Eb*h(2Es>ee5jR=7BtA260F%4Dm7xwvWzYjeFp0pxfCbPp17pNKW51}FBkfVClcT@nM`@gad(ubYDiNl z(UA5Pkl425Rr4xX_Y^x8{xg~3^ci^~Rf8+=zCau}Ak3CY!}fr^{R)>y)7A4eW!JRt zt)$WenyJXxh&r?9(0;%>!+TBE7!Y%TGkP(su)59Dql+*jOIp;lJkCwWpLA@Fn|Z{r z-~T1_!s1A++w-Z+sTQS4%K5$mK`H$AG9Q1+gmH$8smqULTA+^WQT5j6dF_cM^{k^N z70%rXPFJQebNUIYU}wf^NR|(E&@2FW!aRgb{PmM64vVbpb0JvcRK1n%ms$xl7G@Uc z1qyPBh=+v^BK&7umO5#K zQn9ep42sTZ2xmTxt4cTyW>1-I-Rj#`)q8`9#yAECJsHO(8})%WPa%8Nk8!n0bkTx# zCA5}7)&@=N@Ka>gne$AP4`|#UflEGv=Ck}uEvz~VW)1ceNDL+Ig`fr0uvI#c+6XrV z!Zp;9mMG1-98wHXR^R!^8aasC2cVK+N8PNDwd+td%LbR*?B%i}*-#XbyWEa{t#w-Q z_|f>+7O$+9-q**FB)uJ7WQ8|`E+BHJww&25Pn6d5*o6G%ZgXvA{R##8nCS82IuP}H zL;ZM6q1Aq6v5b%CM`OZ^xLjlOK6OMsBOXEQ$as8IC~viO;UUm=rJQAznf(2!g0Hluz|QZN2gh(Wv1nnUvSEI1Ci z!jO{?$)sHpm9C-j@eCug_T=}a{9LIp&((FYQfb;MpYSz*FfZ6U*Q%^S&>qLxwhjGh zA$ZO8P$9j(eVcK{5Q&ec4WR6h&uX0;E2S-+y~g$`-M*D& zRFO88ytwG9ePrd?`N~3}F<~RkgJBJyi22?Br_HLyOG5Svw2$Ww*xNuv*{jM z9xqIcyK^&oTD{%qg%{kxm-w>6hIR%$-a6fZY*@*{=|n+HpxbOO*FI=GpvyRU-1Sc! zI7lIuU3FOua^LS7A0Rn!K3IvKTFy50C6dcfaIzWw4d<4AMkN27ph%teXt`^psDP2} zomY2hw|);EQlw~XGK(*CuK+8s<5YLKA1vbRK~hP(Kv`4 z;aT>3n0wuvtz~48;>`yD)0KqoX8N9!_Ct$q5SKk%Z^$4vHBZv zi^qHHAw~v8&oNwApF^o5i!d!WGW{F~#^lV^mIhz3_>}X~Z)M1y9rKlRD8^yW-{!uS z{U*_G&EQ_`1!AcdQmjKJ2VzsWbPih9Z~bfx>^3?(hwFH>hqlXWqZ&?$SWT=6O%E4t?-wpJn%KF?X6Wv8L-wQe6Ju&MW2Mnur zr)JjSBHU>`k2GjGH9I^sIqG8b@pEw9_*VPI`2Vt38V6@%4fzVKaj%0Ofx%9je`Q?G ze?s28lRO^2h{$xUbnMOx317ym?BBtd;bwfE zkO`8ri)b9C(7bT)V=CiAe+pxJ9TCZ2^Jn`MI7El~GrEYwZ+e1rCBba~_H~Jwd-G)l zlWNA68y_QYWl-u*&ts@o_0why?wbDSr|NMRnNjlO(_ODJo;bb@>5CgieWX(s7jGZ| zHbhDDkTTo1iZRWm5{LXctrPL%1oF#ZA7)zp$dzkCB`esP=RDm z@epvecLp}yuq~gZ&0fAoYo8w7`BW&+BP_Tz5zX2Zm`C%Umn@lTA*F0Nry|-%fFvkW zYx<*Weep=N)=Bp-;tG^;f$2bJi7Ubb$`PJ%3O{yHQSUyonvsGsc55xRAnSy5mb>&; z*7EHhD6lUYDqvmEZvg5)cgF-Uxl|}LylvbHRG0D#e-oGgrVAoLC=x;tP`REPUELr4 zy@&mq&AfmFhLpl{mA;u(|NjS#7ixxfz9|uq6t5Qmz(iX@W-T>o@epTEfV$(EHLN)* z)IYg{cL~V5=0rc&&8Ob2s+~z7NJ*Ew3LhO?9XWP>6UZU^OBMQ=MZY7B`D9SEFt;Yn zbtkQ{`76(+9A`%lHzD5im5dEDt9~*cLe6*)^Lzt?iX9FHNseylWkrXstEzejODN+8&n?@RgwBqie;!WsbyvU zeNo`iBrxAR_waomqL6OAH+@MY#)f3yj&ZBB@Be1fm9b2lzM5oUeCutR$fBLRAv(1L zNu9x{zDNO}rce3ZR}OSyZGT`kpN`{rsg}?)C4R4BA7QoD{yB+oCipoX4}j){appM zR~ZBSe=&EKU2%26x=jedo#5{7?(XgmK>{=#+&#ga;O-u1+}#}-cWc}wxL@9L#=XDc ze%)j5Z)=RTt7^`tQs;(N7lz1L>nX2rvIpaH&n*8Qzxo6_ok69>>mJpPCDBM{L{#8o|27bEToVlYeFfG|X zbp04|>vzUUCesy%!_pMM*<)g|PdSUa*B>oGF(lhc;%X!t;0dZo=j_?eCS6m*0n^Ak z?B?NaED;Xc5rTCw+EBSDB$Tk%oFIqj{F+aPy5}iIinf(Ps!YROLEUKRG1*du_P1(BK3Om2(K*4PA#-xlLou~AN|J@E7)x{KpDgw|e*npW zF%wE|l5(~`uraDQ<#mI{W0}R>$RlwTLj;g75o6av!u03kWGFfIvkT4+DWf$muL~BM z$j{NV<7#$)9GH#V36XNj7Np_LfpL7F?D zNEJPWVyoa(n*M|v`IwSKwLRmnNmIuwvr}XNe*pjSOj3}&=D|aft{$S%qTff4gLJkq9bKu|eNIy?c*&Ih& zeuZZtLZ%AMN8oNgO%m8wH!ZN_Ez5XXTv?m3ncWMkgG&m0R01ZpdNRGsm&LwHF z2WNh+=I4p^d0-T?@~+`wd1Sfy{itoaUB-&?x^0~pc&yRUfD=87CbVIHY*X>$+mG48 z-%&?_1>+v#Vb!~V#Jlmxx-1uFMm*eRlaI1HH=QP3TyD=}b5|h@{$q-y7GAd_ZI`=& zJO%n4=?|x8L(>6@FJ~-P-(N88$+B#!N$NCPqvJyO!rYpGn;307ciS~OB0ZTbB?YbH zq>2eYv3h98xNwvN8v3*rQKZ&k8m4PqIo3qnD7|ja0wjwYxQ|;F1`tv3+e#cVlPReN zX$GlEPxSS6s+L=8mWQ!MD3Jv_o>eni2iXvCG$oP7GIf#_c&ir|g=7Lz|5lkTNL_1n zop*vBTj;+TH64=xyZm|@Z;5<4{w|dL25)#0+ERRpQ@O6)D$5tz4hVPzY_vlPB8NCP z5h@$zTJ>J#vRFXAh}7v-Z!9V`7dW7%(aq@DoAQpKJ1*}ddkkZ4yS0!vob~XJM)n|8 z3X-J4sHoluowW01h`;9$-Df+Zh6KlNUM$THpP)QDm&sfku0t&o&_tqjZNtpLA=n+X|+!qy>f zZ~ab#33QhsMsT$QPDk`#LOuG91_#4ZZQ7H7L8^x~$4&g9@E67yzEjx*+ARe_FzF{6 zri2tO-g4*paxlq9cbtNf67EZD1GoQtr3U7eo}9^$-Fc)p1QCBYnY6vZ10EySe%`&u8{e&)P0&`Efdo?S)-Qd z$fkFuC8 zgr6ozuYCx>oP1U6*lL`a1c#3<9%;iJc@A-}8*Z<}5T)K$(9k6g2Z(+$mC&8vyWO9I zk^05SU4E&2Js*m17Q-o;TnaM}uwu5e(gC@21~hBS)w^%<-D$0PfH{_$-brCl&LeqW zWoDy^CP%@{9QvOp+=yW$br002nlQyi*9|eZ;dzSXe{~HS_N3l$`jJdZQ6zsSH>mzj z3YwwmE-FTxd?akU6eC#wg0rDvW^9q^WH$0=mgY(M%HtW(re2TdrSr=y>w*%=@a z80SF?PjT-5S!eAZEfjp0K~6g?TNxi*8KIF`hsztiSL1(H7=^C^pA~xk`pp8Xia^JF zckrs+H`x`}?h4T1-^!dr^{A1sTxjW_zEHTNab!k2-~Y&ohH`@I6e~@9bJNcsM$69q zyuqKIOb9Z;Jcl_V0#bJfvH^M#|Dz{#3@TV8OcnBb|5E;OyGcV|MPXbtMc7DHG@2?{ z-Gv!l(K67G{JV`h!rgTnZXoyS=!0a?d__p3l}oogxx8J3g6*88Q3p?WWL(VoYb#kH zy^4O6mwNs0rKl3kKYX#U+w&e$1S`Ml@=@JXvFxV{n9}3aMiq;Y%c8qJJT9$_d8ye- z5Utd=?^};nWZov~;g0ghHGPA#dC!p~;T0rgM3UR3Uls-Bm0Em8I1eev<$@+k0Bpgp zu77oqKWewHEJ6b4=nX(fEdj~k9Tq_zMXVvuZ`y@UZw)ne-=o>yY;0(jUN2-U(~1ADK@IIUX5+zPsFz?4?S*1`-iP z#F-D8ALEEzZdh}?t+N?)Pk$F#?4X`-KFW0OxKpaR7mYBbX8;g?+khw0b`+`$^A_$G z!g_9ZvPQU}kibAuZIlk($f}O9wVc%~f7%;>O<9ic7;p<9@0B~Y=|62BlpwWpf? z`0dRK?VZY6_JOz35B}k$g0X(T=Zz=`ykxaG&}rn2mJNw_SmpoKyulVABs;I`})z0X+>aydr$Ry9rzR zsrc@m{?f<)t+>*{+b)Jn_Y_0SbMs}8k#*IuBF*3e^^{cp!CNbumfWUhvVC+Q%TWr^ zJ5_3#<@emG$PMXl)2pCNoxg{+o0YVMeF+t$X04ufUeiZw*@G696sVAwaOP}mDVOM! zu{X&mLU$Z&CgbobE5>dD@Y+~k57&d`sPP<44^L<_{#SHR04?@d&lmVoCF!}0Ac-Hh z6(Vut;0$K`uoxnJvS>;B7YP=!U-+Xa$`7>)uv=@+la%?+>Ns~p?wb>myc0U8sK?Ri zKV|ka#SZTKcuW)r#*5fIZn90SSDJ|@3_P2^%Ze!a+>Nl_ zz6qQtY*(@v3p5vP#A+6#Abp;mj4EFXo2XWI+;mml%Wlu!P+9Y?0%PK65p2c*8jEPf)Dcs|&ZeD_F-Z$9+emr;;qHl6~n25Wjo;bw=!Piv2t&{5lX zs=!`$NnoE60XBA27p>T27C*seCo9bI+{#PXR*H!*9A>s3=Fu~%gK-mf#^UMGHS1$a z*X2}}PJwgDf~=C#P`5MqKmKF-nHH-_NYSU%)xzh`KBXnMEUPGz>l6et|*q}f-eT~N52L^dXFYgoJe z1=rOJJ-ejCtc|?R*Z3lW+c&nn=B?Mz3MvWYmn9`$5LR3{bHk9}6 z(z)q)2OUgS?-d%-wQB6n7y~I~{%;ll^^5XY&ytlLOQT8(qh9o)aCU^_y|IiBMRwc$ z?FZL#;$&^wHWPtJdx}t{m8=0b)#|?8TGF!kYCTBTBOb6rX0g*3ZUQMbsOoi3$R6NH zD1nsYAv(SWTkTA8v~35&8ux3f2g9qZ1vjsIU;caE%xi?^c1PFX7tM3olJaG%G^sLk z`Obbc&)93lIJCUSd#PcB_xn#ync(v`;Kp*j_Vr$D!7Xz>Y0oi&uby$7x*MgSg4@7u$fUxyWM2_P3 znErkX#*$GU;DXOjNC5Iqp3cFf?d4;MhQq8c3vRFLwGfY)#GUEOCP^Ch;Sv%r^uBYi^vpLj_#QIG)XqkgZeR|nd4b1re_TW zg>G=>qJm0COkie)OUN?GyKHy?26{b=U568Cw%-%6CPYt-_N+_-{1g1xICzkw*b|*u zRoDulsOm%6IFOMpGE39CDMNnSNn8%wtRoR{?}xzpZ8qJL29)lP34kid!s40yN@x?Fi9t`uyk8_(_+iJIEhFFc zV~bs?-hzSr=G3O6Iur=7Jk!%31~seQ0xrfspY0XFm6Z(cvRG?!j}H;8GeeL_Ckodp z^$OYDC^R(+YCQ8T!^&8rWU{9*+Q6|VjcBUNpCyolXYIP8ClvjDGb)vF`%8FAVMkXV ztej7{1?z#D^Vw{PK(VuJWy!MYjIB_%#t~tj-RsIF*_xKkwIO5tB%{%>*1)gNLmMo7 z?1dzN=#x2++yQn9wOXLK%)E_OGta-WkzGjWg%t$F&J7+)XI*()W#TT=d6KvCk$Bq& zOtUu0Tfk9V{c0fH5f#WeAS?NEP)CHH(7FrH14Ec1rxo^yayJ@(aVVWDgExj|y!D=7 ziJ+!}h2Inl0C|=j4w*7gLRwv6fxV;ozM1`H5UI^!njYL51rg4YhAHr63Nbwcnrsg; z-LD5=dB-F9MUqAN-zi~q|9!Z+PI2H{UF1EOigIJzne(_Vm0Ku94|nyi=>7wgR#S)= zQ2O@iqWw+WNAQ-Xj#sd6b7YEF~=D{wQ2gL zF0@~zdpgewW&-UD;PvmS?3ew<6ZDylq$z$w_B^nW9B|?1!*+(+dh&xJdHh3n{VGkA z^van%%M$$gWu@;lIuBTk{u2|4J3Fp^sWX2Rim zNryU4>2GQwh9>}dn{2DvRN|;*zOS_O_Au{itQMED=Iwv@5P7e+c9Gu%&MX&?rzM+$ zJ1@yQD$5NymMqLA1bBJ_--xE%dL~7_si~rI^q<1nyO^# z=`r4gA%)41w7h=+=9tcD*zfqti-GjHq?*pp(1#lSb*Je|P-bx-UuEl1`vo$t#J0Hr zA`Pr5?1+uwkJ4^}D8$ae(K(7_km%Ure8+^9M0RI*@Y?`nxjLJVC4N7TO+IkFgJUu^ zRD4;6F*uQ~i-|+x6?laZbe%r>AvFqKKONog=@O^>N}damjG~%qf8KtDL;4#8wVfyL z`m<2Zz{q6 z%n()Z2RfRdD|4&;#b=+VWtHN$w-5Dr{8|u80D}G*<)HuWG>WFD;S48z7=>7o^ERQ3 zZ)7FU7k|LYxbdIOi0^C0@?uCSrgSgpk-$A~b4sAzm+fEWNi@uCe0uc4tMw3F484X4 zJ>EI@-DaLLmS8_e+OmbdRrd07lygt--r=OL!}{5x+V{wz8!4b_q#|7kFDc0Id6ND0 zbQMFvi)&K?mKtm*D^_yZd^L*{WWO+p)xY;yH&|be`Ks3OdN9N;G331sV6-GLCQf`G z%5r4Oe`G5|{Q2Pzitp?GP{_ucJjj;rUXAriss2$wU(l`kRU#AvT|Qb1ybbVm?PRhw zS-`E^SornuKAmi)IG7__|8tetP$dRicO>@s-16@=MGaFZI8n9slKCGfwp0VlIk}?1 z1@o6QXG4Wv!?Yk0t$;s*{cypA3GAYP8xgzui#&T|KtLbwd&rpewUVSe@!u>Z1JmD= z>bjDW`Ow0W zIKce=yrYyJ6yhp)O+}{8*KK7|zaxIs&=lNN05E1lHN0xuFX(ei@;T|@I#V{N@dNbf z7SZv5PWKI(PFWqWpSk}-n9vrpUWERwT(^|H)_BdswBNq?F3AEyBchJ38y2bYt|x(- zZSN}>q32(~v?wYV^h9rU><7muo&Y3vm3_6;@cd%cA)#Dsri`f*q>@t=h~n^WKSL7$#bFA?V#NY&f{wb>+%z(Pk}z6)w`I%+mH_zk~br6YN>A4k_P zWWastbNFqGRW>Ur0A;8lyK|Pj@DgA7R*^%&XiKG@0=2}k9r*)(FHf8vjtXTiM)KbZ zxtC^}EGAA}oV&SuDxCxR37Zof)PJCK5{>T-g_u zzBDj+T6Hi=JLpg4xE;r`C()@_ju80O#Eo62ao#9gzYCdA61`+@+qFrKY3LoSeLWUE zWNRn8W0M~1XeVrp7q^*lrfDEwuvQvTC{owj)GCUP@IGN9O^?*au%_nsHJXw`9O}*` znzA9Dg0mAyo3oFmjYRCb_mDc{;CLUiaA87f#3UzTrV>Z*n#p^AiN=BH%n9mFX9ml_ z!+n=jhRw|ryS}KJj?*XAxNn$v=n=~nyl3#I7R0+kB6rxFHtHmhIMauVXBA9Y1Ge+M zSk_RC3DLhB6S7+YN3_*{F#5O0eP&}&o?z5EPG*XTk~Pu^-h1v7|D2d_x2dSMZA)ZJ zzMyVA1{l*$qDdX^x55+IsF!#qr9Is=pQE; zy#*_O1EK|a?~i?%i4}gpXA*xsBF_d6x*hEWI-Yx4nWNecCeSDiez@h5-hNCJWd3h= z=KJHjwl>&IxcPr#OQiEczGP0g(JQ z;lWE#K?}|}nzJKtT(@u8X{Fc>Z1+1xV>VGoI9urWlAZa`zT7-fs&rncQwUu!&)F5z z?u;8^>{DsFX6CY~K_CY8{?+Hg@eM@vv+1^DzDiwbQWIZ zk_)q!`V8nSShWP#fDSC|=DW&c-RC{QZ66Fg8?x|+FoDR0ANQ3Wio3$Eht~k>VP`Vb zY-bi9Sx~Fc6;lGQRxEYS6^V#_ss^-D)P*CssaWq`yYlL@jjaBC0ba?SH=NRnV|~4( zLszW#8NB&Qm6}lc$~Y9J-ggq3Zz_4RmFpr*x>7Wme_>2^Jd8Md8ZNxdS*~`KY{cj@ zni30j&H&tk+JbbADlI&lJD#PPq}pg!#y;1GecvW?bB*RYyVy4EEnR|Ah6SbUDLgiw z_d~(BwztzM)OfbGq~QDvE_+!o1Ng3SJ?lyPhEC?`?9oq-)xW$o&74rOYL2<8qBgAD z`%ne!)w3guWWu((%qX~a5EIIAtd++t9tme7G*40vE65j27 zq!KH2{-Vx_$m9a@2}x(C_St$-ID;4*J;{R#%=_+g&jPKCvMji7cr6pvg(&@I91j??q{Vj zQ)ra&hdO|dFq(FTh;*C>cBC7`?p;BBFqIc*2G4QGz!^#jKpb$k-bkTNr}!hBpqnkx zDi0VII<#69l-;mqpyOaKHAUF+L8bj9BOy_1{TX*q7*aB`_YN3^+kC)2&xaWJ80BX^Yq0;$pkYGxh%89)5q&w5Z zvqq-}UY)1#Eetq%B@S|=$1$<<>oDGX6GT2q<&65Qu^L$*5toJXAO(Z>Q9298Vu^$! z-mW%D(;gipC!JJhngfS~=*hG_P5?O$VS8RuSDB@1LyaLD)Cn8Md}%>}q16eK@*6jI z?&s6muH{Z7+Tyj)qP;@3%1joHELNE3{3(ou!Ff`(` zq93cWWU0S#zf}(DK;v-45@b!_`acQ1s9;tpi`Zv5AAYhyMb~W{S!gf5P7?HzA8fiyB?uj6~j!{Xgh z))9Q69^0XD)bfa-!fBzz!yhq5ZVAJ;D(Z5wDEZT!HU2Sn<$mg));wglY4$n&F@;E( zInIAcd=cMYE#kd~!?meOZqJNY-d=g?kc=$A@LTcE7~bGS)!nW(@bY)Ii`V`DOKMc8 zqQpsx6geTaDP|h7tGC0{pOa) zC(_nR9?ZRWchwyj*JfQ#Owk9X*J6$9L0QmR@H-DO&WT|>V70>?LNe%_d^itZK#jH zqX?#RK)Dw>XfW}xrA$-&qK$p-eK9+8C72N>DJuhY*pk{OL+6n*h(F9he%qRILdBo! zDw6K_4_kv1r^mT#GSah1*kt;)Tr7@mcVMMRfdHw+jdMj~ctoRJY9fh6$YyKVJu&~K z?~r`_m2@ddy6W^&Q2Rv@BAk?~lT-~?sh+0tGTU8sQ*6FDPt7I<*mj*5z4&*K(u?el4ZGlpH)Wp1B-*IekkjIqj7(D)XovHInMR-0XQN z8x>Fll|#W698^%zduu7w>8yd2JIU@+>h%{Dk_E6Qy2+}|`EHi4TGF#af zN~8R>ew4o2VI|`Q9lT9y3(AS|M}6ErO{Y0Y=2o5!Tg>pyd{Wq%8+#~>d~iBF-aNZ_r?p&VNb#7&l2x#OtvmxjUw6uNVu+%FlqdEY6}T{J(t#%|7bI*2+z zveA4xRu>&WTmqesD=X948eL{+Yi(3pBWyN|*hoSr#t6m$5-UfhwyT!Z^Evsm=b~R8 zWO*}YiW?{DP@9}OfjTY=rfvGb=$_s#311zN$AvCO7Q;> ze0D2aEupX0T|mJ*uBnTeL(y=@zbdQ3w;_QgB&#?YCO}HVy8v&%nZbiOm+6H>_1rtL zu2-MZdl~AT6;|Dw@vHtj(S(&8bzj>6s$o&R{er(#PO-Mye7;C~XHr4LA`#7bNm$T0 z6g}5tL~%WJfaP-91j#~%ci%;kTikb}9V^6EfgHF=JK(?iH~K;x#}x%y&N)4N+y0gM zlG?C`aJch=Wr+_6Fin=WM_=+*GiHxuby38pD~x-%zbiaS8aqyZuy%W^JG^&jHe>|u zyE=z2Abn=GPdbnfN-Uv%OT|@Jy;V~tEs-(&RFbJ1upSeJStOCR7uDB~zOeJbNRqS1 z-_;MI1oCmqz9-yAI&^!KI2{kVT(~*$a?A3%FOxawv*A7WXI=aU^YNlNkUIP$+hQ-w zdGX66{@({5VM?4qzxphc`=s29PyZL_)A;&1bR?5rR^au&PyYXY<2UA*MPk9PxSuMn z&377K8B22BN#JPZ>jE`?bZ2`jPsjSEjZcP-terlJjy8W#F5|Dn=ztb{Fen%*)338anX zohl(smv|OFUvWHn5dORSD)gy@a|av?}XFn*z}!2_ESZH<`|n|!&(@o`d^KtJ9*o2pF8b+*+s2YZ_kxREs?CwbU~K! zca1Jj^Zuc8aq8=S297;+$Nj?IL|z6-W<+}xo6XAkrhl7-aiW9&W~6-E^8H@*WmU$y zSvJR|;V`@Dym!=65`^v&*8TJ_-R>C}6xi_;59$Q|lW}n0-`tx`txX;z@r`7F)QJI%*%B2aVcY&bPAH5R)i;&G@fvl(T1@RZ1x_B*CODVik?Sy*AM zQ^Qj&|3ifr<9;sd_p8-VNB@Qw12!fMFUx!$=4d;1Tf1NKpU%_%k$^O|@p}-z`&npT ziv5I;O3Iwy@Ey%2I5SkMZ~-WMtg^#I%2>D!8x(@;As0D5F)aF-LxEn)=~J4YouxLs zM;TE8!14Ps9bK{gZHa}_G5EO8;+=9_sCe3d4NXQP=iuq? zH}lGxK{Ad0t0)ay1m;myy*4S0HIaR{c9AQEm$x1JurO_9ul+O{37uXJD%@Fp+UZ0Q z2wAiBntV9J$ATL4m}CDQncHCRUaF!uuJFUe>ImE8ra>an2cVD^V=AB{DB`b1w@Wv< zBFta~%gbEqOPKqU3Xt@{rbAPi)5ii|fh@3WwgSc2^AIH{7=|JZ$zydPD|O;6C{|BS z&Qis55Zs`Hu=8nKo~)~_F$ocsQ@W>rJkA`9xmF7o8s_k-W%dFSBW`D)CX!zDeXAF< z*lxdpaXb97*V_n*?cPRW0)Uhh)`e9R=Xd}w(lAtC^3@ws>L39KdgZgMbLaa;ve2|3 zOQ3S8^Bxe~u*qfTZ$U1=LD1ptE)g07Qcd%|JIFZ*;L|g*1)v#ARij7OUdrrXX3b<@ zO?RSoqLVnOm!Ugm7W<#WL$Ww&qP1>LU6_j4@ro#u>kFm!D_wd*A}@@ff3l^9p0~mT z!ru1OA6-|oSt7RH9?FWRMn;$Mi5`EhPY(JsaUls~D~cY9)s}R+pp}TCN6D33#XaYD zV-oq@q{0a(^H(dS%0bThN8uq>0ALzb^>#g!v;GHyR>Lg2;3oz?X)N^Ty+*(COZ|x% zbx=fZ^AMoQB;)q}l1i4dToe5y9<^nVz&4isUm7n?cash>gcn^>8V9i`d6L>2GQCWw_;$J$~~ zof4LW$hu_Mc$OXHv8I_en@L5ipH669?euCUzX-zxjIXfd#n*yFvF>dZ zW)YW-?55P>wQ2hwg+lYY>ECnJ$|`~jWlA4I$p&(_+7g|ijh+U9pvWqckJh6{HK$t@ z-n(hlmCla;^F)Qv{B%_P8qHJ=uXDGvTJ>K;ft5f+%a>Cb59$Y5jam+TNHUAk?nzkF z#*>D@b|H^&`KyC5m_~^<`E9L(MZ3S{uAD2kQLC>ekeB|@CRTPSfm9pcSpS}LZ`z?~ z)O6s^oAbS5%yYu9_x16R;ZUTRh1+f^;^Kf=DpHh$g9b;YRv$uxmwYGb>xYc>_UF;Y zpKIr8k-ylgDTTVQ*dR=RKI>Sk?_bulkUy|%S7VBf+XUS8e$Mh=hJBkP=S0G%q%(tG ztnmzd4qr*+f0p4_3avaaM6NewZ;;E$3So zW*_~I%LU-3PvjPd=L{dWnoDrc(~ka2OB&#JKY{eXKHym1IB~h5kl?V1=?*DJ?UH_v zgy{t@!gf+Vd?YdSz8oQZCo+Yj{|beSNOZ4{%)u&>pH^ z9a((C;8ivQ)91@cbDT5YW({8+t}m=fp;7gi(ISc3|GFmtF7r^QH6| z8?v{|HZ&Y#Zd}ZdZemk(Cpz0n({?1le~WIiO)kM}czb!S$>b#r>!TME;X59b_VWnd zBBV*ggCm`DKe=4AmyjS7C)*Rp?8tr7|I5J?T8m+1#7wR%BX!3sUx*<$+*nHGU@XVG zWK(0b!~AWE*?Gn0^g(9b)@%M#I+9Yu=cC??1>^T&%;B7#1Kyc!=+@9Vefn{w}SM9CgqH zL1TDb5Q))6d_!z32{5zI?dovP>9~J7JzJhGQHM^VRw`Wl6NE1=dm;3)$$Cw z+tHHzy#dnER$$3SKey8$B3J-V$-JQ2a?guUzz5B^^@ImUSi>j)B_1!!aS=_l3vlP#%}zk|B@ zh9sa(4QU;+6SI({9W5n9u-Cw;qy`znK&Hp-BWVpi`+lUp?m&%`SDLR`>pPOc#~aXO zMH**5J2gU-@WCS^eH8A(k&#DxhtqX+Kx1LoNd=^@Ar(#@Vj!!zt`*lpBl@@GX& z%Dq*QDdyCRMkmQijy+gAS6$#v8GHI!-zOIem2&ozts)td-eC@vfT}8ROt(3>lCVwv444dT+)MK4{W`n8wDU zc3-ud(Am%)T5Z+fWlTM^5f>*$m~t4D(bSh?=?l)zBF*@L8a^ySPIyB5o!IMK+2wc% zMr1NQ_O!y#&~LA$*jUHrUBBA*$&E|gC`?sy415-Kg_6;f%)y4I&Uf} zC!VM9d-pHmW|x00hoaI#9=kQTd`_%0!>lI$$J%$R_#%^;;O_ut=8hM_o0Dnm;JJ8< zhzxPwj>B_3na|h5*UG$lCW!kHBbbikxyHrotm(@i*Ek#N?dfzHzAdh?_ck^X;S{Eb zGZ{8c(pItnO#w%+7&=bOd}o+WvAc^VX|F_JP4;D_ZYN40?0wHpkP3e$?jg6$c|b!1 z5*gQzaz~uIqggDb=7&NCBbNc_%x*_4w90N#e}v*OQivaThbNEX!hqXb*bIO?s;P6e zZ&>PbK7(zQ&4%#0b2v!J!MNYxOcTWsxo5e-z{^clgx_Rk&yIvO%W~EA8;L1;+)t-f z;^b_(4w2v04tOkhGcIK5_{!}{{B(cu8yns+6uRV6GhRy+LJ$kAY)c)F*o3$Ginr)_ z5ZzZj9mp2u%z9S{(QWw&Lf=oQObcTUA`ehx&#HbEHPw{cclg+3k*}8v%Nf)BP&~H{ zV8cYsXMw-U4!P>t%4Na|-1u0rHTJgwm$#ZG=5;ZA>AYStBmn?BO{FD{?1hOp7(c*} zmbd#GXy5+r-}D%r`G-OclA% z2`mvf?;;L%Q3-zwT?p{cRjc)K@PTJaPxD+$%9eZJ$JbdkVp$KpJ2Nnw1S3L*-0WM- z*}Z?EBQZbZxK3W6I-|>-s6;K%3%g+by}|HR7t?F-VZw@Mm*8>2wXxN`CjaanxF39D z(t{iCh*KA{5M0~YSWYw%;LixkHW)YF-n%k%~HbKT08Gy169Eo69Par7=k z7!BHrT{C-ev7d*b%?m3?@TeRC6qQnhVvl56wGqt5a1bJRCF>ZA}A!lIZ@y z=(3P(;-W1>Ibf6U#@^xO#q%PS1?Py8HCN(~-L278YV+Y#GTotyByW;VVk0`*8Ts;P z7`r_2+oC{dm?@D-DJ?ZUTkOo#e8mDDTv-Dt^0++=;PIomoD;tC>FhMxAS%Z`{$~!? zQI~=rw8Vi1o`w(XCRCrI|MmgtxhgO>$niN+Z2P0| zu35dtS$6`7-JfWG=2v;`m&_txXRz5;qO)%LzI8aRD>d&D_GMy`sKv2}B-mAG#GVD8 zQ{JToX+Qy17DX<3Q0sx42rU-WF$XIKt+q?y5v&~75t5ny7>TkW+9aRfKW;QQj_I$UgY&tn2HYx<5%)rQRe8U|SSieGzosze!L&-P^^PTush zxv@pP&YBO^!s+DD*|$Oc?&akc>vjGfYoq(wf0;a1Y@^oEWwHtzo#r^i-e(-WxBS5u zq5G|7_DV~qiT5NWs)~JIbwtAO-_(0rcr|%D3d`!^&|SKcr=9riw?QGDc5R0!r)z1y z)k+9s#o0>+B6T1~O`W|1i^7uoCK2#+t@d79SnZDw475}eTYkAh=ESL;BGryT%{_93TiHWwj%0Ox57P*5g3)}~pD&Mdn63_?A6otrM&hi*<}W zP+9zMgeE&~?7UFh9pJxge=WpfgX`%^x)zALZVUBD{N)NxcWGW|fsvxAPtGPo@ynMg z_YD8Jx;8$>aNoX_nv#Q)>UkvOg4P&OVog-;V2E$@sq<#laONbC#V725*eAL^Gc?&2V=7^EK=B_GX!D{g^;q{JMMc!l zFHa9vUj}5*zzQ`rw76J}3Cw~ch8K+wzoJb{peY--+AJ!hvETmJD6`QGycZZOy2Vgj zLCB933|v?|I>-t!a$&RSsMzt5{mmWhGi#*hZusK;?mAh$pW34W16sglO%{*-z8gM- zUu>vUzMn-Wl2^`VOBCjo+b?#yhlMgblQ67NI%!Qg2c>Dz+E|G9JZS|^8_1M^X)!&c z#!$e5Q8hSStbzrek)iKS8SMiMNoHa#M#p{}K8=gx2i-NMifi#Olam5kUHj4TZ4**&$s-Dt1v)d%rX z6h6(eA1Ua>4<@ChNq`u88MSZs#Ka&|kULzRzzRBmF$VTiN9WyqC=HG;87LzG)^%tv z0nCB)=L_qD4K_~Sc)P1?R4i-H-c&W(Y-m77Kf;hfc->G=)JJ&9EY}>m*xZulhVO}n z;MM8+!$V)ym5>q9mm_TYTF@(D5vpO#d=XIn0PwcJb&C(;lUg0Lb5ZPKU}h`PR} zM9f*}y>TaOjZ(pppTl^QrPw)Yk{A)j_!2giEl*?>FvTq-?dN)J-wSa%Zr{B`=xpsn zeui}V&$7lSTaS2djI!VIaqz_~#@Z7xXMjq^PI7kdmQLcr)ql-9PZU|s^kR13Xv8T# zQ~WT;{ThmzCIQDJ%O;6Q!l^27xFBbz+x#7G@@WzGdaT>r%N+LW=}cA&^||YSk&YSM z^ChM2dnmIa7T|rXtfTy<7;z>ed5;CigSjEkp3)adLcUqS0V0Eku(NLvyWCe6aWPkk zTG`yz?ou0l1T)E8mZ1A#`O^ns@Y0{bxa{Fyi_+qmQ?1fd7ibFrmy}T!r7}=JNZ04m zDTNjPm?j^Q0Sk%Ap2aPToP{FF{hko56bob`LJv6kHyWji@Ban}i-_UGu34}^ z=|EQ5^yhk-@~w0Xm;M@>h%?c0nR(o=w_mA9ITdd=ImnR6`mxJc&W+sXJ!l()9lrv~ z#&@+J(h%F(r?AeCKjG8gJYv10Fd?Ow8rBqn4WPYHHfozDZ6unQsruMx(s5)nTG*vI zkjHn{pAg$=nF=Y=nI3T7Mk^3|+uXay=h4?#&^RMt5&H7wXlKr83VIAm-QMimXhfQ@ zElM#5;;t_Hz!j$QKyfsk$Hgq(q4j`#`ZSk^jMzKHG*yzaH$i|Q-?i=rn4|B^4 z@eVOM&@Jfj5IeW3KGP9~%>wWv>Ie^6PWa?n&m@f|+{bqB90c*q5GG$9WWNMHjFV zBc1M-ok#t_09Litx78iysN@4SA|*wBVH@oi6TxY2nS^7|PnKc!C27UC0}#)>FQqH; zrrzyFQB!^TsG3i%c-Vp!rJ@7_5h-Slk{#C0t-IlftqlAumIx9WxAGz{x(!6SVn5g~ zWR~{lhO1~2`pnuJO$({;-@D(mabK`4PuZ8nBOr8v)3FF@5oL17>CV`)5Kl&qrwxxR zZAg?S8d#LE?jb=>3|0NwZgs(ClwAFnvKlhABV%-Kd}Pa+0Vm>{$Dn}CJ0 z_pZ&}pK~#IL}lX@N~1G1gxDoXx%m?5r_#na-NvW7du*ctdKqXDO73ZGHV`!1 ztrNo1cBT)e!#%b6Y^$2jv3SgMfXPBb#6rCDv7(SsxrOhvB;KN*qnoe=gDe^js{sfL zL^yE~h_i0Df6qU8aow+E-`bbtTXMG+nJCauqCTN0=}YYO&vDS`W{txhf;o6diBJqQ zZeGYt1RS5l?n{uXUbEV7s0%9KcO7lWrFtAKFNxpRRFsX>|1^2Mlw0$7kEYGN1d5vk z3{v_P=06m5DmWnE=r{@OU$s3Yl`Eb3-%e}b_C3yfH7vv(FW@6z8Orsnrr(-)Ul|!X zEVm5KGcxGg?ccd*pcHO-hbQm)<1yF`c)h3ni?8w86HjOo#mK7RLQ>^ zXG8Cc+|U7kvW9`=qWux7X z-p$wSb2^_}riZtW7$y&TJ+|3ox|jd~hW(D&{Dn0Cju?_$^T;EMkvV28XV+;sUeaXj zSQiUMnpM8PP_LD-ef@K!;2nNYg;6|%t@Zx-pc&sL=M%?BZUAb4lsPZXmO4yK$)thw zm?NAMo=MtBFs>DQ2JVf!%??y9Ez=O3&EuAc*S$iqajpNhGtWBa%r~rWM6L_2mg7w# zK6R$u)a&W5X=WYQ3ZzO;ZN&bFhnRhsU~Ptc zg$`TyJ*cYQW$%X{u1da(&VGMTGZ)t6EvNm~fVNn8rP5 zIc`OsLi3{Im)t0xB>b6UNPq0N%HsNSzYOlp{;)|xfBN_l5Y<*eOGq+{(T}I3A3wHA zEMJ*(VAXyJM6d<9YSL>4S;40ex#Wzf^99Pwv)>M%Fbl8ObKKs7A!A&o6Bmq=7cH5a zWc7dQ(m*A+MUZ)Uiqt3@i-oqHp<5 zQeLyZ_;M@BRG^x%F;XdsO=P25)cK}|U+9{d35iMu6J9=HSAksr}A+gqC<6-+NGzZsHaa)xbw9-Zr0}p9H z)N54T;P<)IJWD5kqgsT`Y1H*3Ujx1W!_zeeMz(C-*qKbsNhX}wwr$(CjfrjBw(X?j zWMbPByW=nK-FLsg)u*cK)G6(?_gdS)b2>k)W1KPBt4a!vJLvgwU_ndPZ;aXd9!QPnr+c+2T*b_fiDH@rLrE z;kjxpFA_3lCR+bb?+-j3bK~nMLhoVr$C`4HIeqI&@swZHe57JsFLSTgX4zb| zT}Yn>E!#%UXXH$i+=YY3_z(VVUy6!6y{8A3IH2trjU z{pHQ<{FUJ!1|KY|3V_-b@3^`;iIE@fwH=_kNJn=DA`JF8wy=(d89~|KS0lo4xC}TC zNu;I(i(R=<9^3s8HO8&j(XLG!%XoJJc-0$Ns5PUnVM7~3`)Qcz-*v@ER>s`!*cHAR zG#AZe_Gn1`VnfV&`v9U7729#5KIOgnqQ+WXk>? zi5j&X znRI{%!p(Xx?WPLV(mp_|M&J8_dASQ{uPZ$?BawO@Gc`L*vBKW^D~fZeZ6SDqLhqg5 zAK#ohbalIDJWU2N$M2aBORS&#uq-1$^oAK-;{!*HLMObo`yRB$P%&(&HUeT0w~1R> z?9z1h_!|Eriiil*G|hm^{pJ{Y5$J(a7d5cs8$<9d@XLgO|Bqv3$1r;`k+9c z65lcTRA8q6K&0{WsRG&cs`r^f5LSr(*p?hsqUFz;PAey5z4jB}(C+7(*N4TPqybsK zxl~%%kpuG;Se=6kqaaw9w5np`Qus=j^ACb)$MdKC7&sbTnW2yZ$tcq(0ft~3VSN9?_A0Xgep^eNwQrX;P5K%%AKLc~l#DG` zB>gW6;9;x~ZHbrR!&;1!PB6EdmIEpfVkW*6dtNTW5(co2t=2-+xo9(`S50ZB$uyoW z^q@lNQ-4#P!yk-gJ5QKuUW1yN2zk^~240i2_!buI0-7h5<9<%WuheHFbDEHJfONFO zt%Nc$0xMf+jG`NqQuu&FF9aGheWblUi87hIi8+FWVmHu0%x9YcD+ZWxb zcQI?bjFkpa_s;cP_UQFft-ah{FU)CW;x2jt^a;0vynV(}`IKUy&Q#kX$0S+j zZpp+o?0kQ&ml>QVlh@4+CP81Qvg)nGuW{bjx6t4dw1a4xqJD>}+PrgRxbiP>42!`1 zr;dh56m-gM`%k%#l6s6gCu46WI3!-+IP<%Vch6Y@)wGE8Jo%vT47LkGO(Fb^e`l^J zio@QFbaz;g`xjwioLq#$d3jo|H+e?l#sg_?$g|@CfLJIZ%ek4=HLQMF-O<8eTR0d^ z5Xq|+&+9cWc*;_S)H46cmrc>uEe<{*0bYu96{=<1IS1)ise5s=eoHcBKQ<~;h?4vV zPsBNr;zt`n@S?G@k>eb5F?I>{o z=Viw&?S1J$bNYY>o=zu?7E39lJ=-*&Nm;(dlLtk<%c=YIGRJArEDzfEcp9yr2~9Nc zChwEM>NB~otuaE(9^nu})^p8CHU2u9QWbSNo}4Ge|m?6STaJJHsxCiyS3Rk_1yJ5Z)OIj2Rf7DcVBK@4%@p;gCC zE}4i?BlC?7p0kWa4wy+LQG{yb=>hc1acY=Tb-e0#ky^fyt%Q>XH$Qbdb>m)%h>@*G(7=V9o(brrt#B57#9Vu||qB zIEj0tFBhgIRVA`GnO6qrq)|wCC9^+mQ)aIq4g30u>#h3g+W8h zHwc_|c`cr+(XsIkVj1qmfJ$d?3W+Ho9GOt%RA zqmx9rf>e53=5XP-QQpDl9qK9Os9taGnEd9_dky#xZ{8g&w82fx0>Jbz;=qHz=mmUGQaTA7 zoePZaa~h2Ab=8{yx5AzUxYjrZLzju=p?C zq06LkTEihP$Wdu69Zp7!MBUP-`w8`WmE zMQ5scZ_=x@8L-#|Y)tYEl%_R_00&~Rdr?D|+?tI5r(Lt2k9oYseQ%;^Ru3ZXi>VR% zs(3PMgs}ZE6jtA?n$@6}HQxgUcS3r{R4g7G#O)iZ#|spN^L_$aL* z-TMRd4#c(1vjV0l1C}S*YPBxf0L{72E(EP;JXWQM6sqB9&Z0YCc_%J-XNnYB53tMR3<;IOxnZPtELAMg7?%XdX(%+81$Sh(;s_F{9@S>D|G zcZ=Y!H|K9kmrG!zH>r)+e0S-vNmzK0Y3g}YC! zbv%a)0jR2)FM(RB*qkt_Afknbebm3bff4+CA@@8owsZfpetb4ydnX2?=_}C?%JG(= zG9yXbu(3%zPVu2!I5Tb;aWtsbD4qqv`o$+NLY%`3Q%S)}JXQ}x>>ddE2KT(rXVvy{ z`1cq{U4}-B6-sf?O70Mc61*?vs zjt>K)mHb~V00efhAFq`LpQc8AfZx%exZtc%-;lvu;y8qdR$EuU9@qc+fqx&XE?9b> zy}{}~4g9C1kI?X|-Ow=hSJwYj`A^H{cwf~l@WfmZ|1Dt`MpzL%`i^Y2{r{~;8+}!a z-XE7q3PbIeyY z<{0A6kbg_?h@h+qox;Kz?Hd2v#oy8X00w*GAcPsEKN@gHc=pHGNYR0F;)s_$mDNMB z$_ndZT|UR{1Y(v5uATq90m-F{h+08`>isy!J0DbJt9& z7#=R*lHICIV52NXcI#kF657`_Z0*=%ExP3jEo_n7Sn?OaizBW_bouO@{OiL86&9t3 zcD?NJ{Vs*y(N5)y{hWEJE95^T^wvy&-P!Vjc}G1%B@*E@+3!tvAZ134zuk(eNdnj( zp)(_l6NAr8+{=1Em_MAI#PzVX(9)ep?roOUabB9wET2F{QSx9_f%kpdt#8ly;NEfL zlYYrtD|N{?$_Vt(wiK5}JF3}?it$CU>^YJ~W|P+@cv|j(mNR9B*5TM?a)FmZ#@R+A zoJCF>zT4BPC;cI(vt2(^BYTeYzwyA;?_(NYzWeAX{kT}%KYKmEYECobNH_C7R%JgO z>i7_Gm_W!sKdn#BX90V%T52S4)otMK2iOSM8E;>x_Jqyjv1lBQhf3 z6F)K&!_>p0Afhdu$%?DQn;WvSV%~JM09D>K0>khGxS09hSIac`UD2VHPhW0eZ5S(t z>dsW7s3a4;F&~*C#?S?BsfDA0jt+x})Hl8=b$uu&MejSQABE?FN87urFuzlDC+o

+z7!MuN$@ZQ%+80!bgc3Xu>-Qx*av$Eu*GkiE8UA zLYv2^?GJ(gljkF8d=E#p6H#g*XwH4)@#$6o6ngjO_JX6OG|FdWLnISAR7?bF~4GQjRG(vl<4wISZrt1XRYa+2M05)lGG{_9w zKxYliB@u#y?szqE9NzFQhSW*@)J}OEzcZ#m$j58#{kim*nwfz|_I`pbT#p=>oL@$o zpwQpzY!+xG@|KLm z@?u2#Y6P)36YF^IVzVC?FwOd@`%$N{LT}~wuLux2-?^YNL@dd(b*zgboCYULsTFiY zETLgPJS^*k$!4z;((+>PE+(sYQo{=5OOx9Nib;F1q(2Q~X8SwQaZWUS!W#)9Hurk2 z;v6(?+itEK&VA~H?aeV}*<0&rY9ET5fc^H1)2nWi^SPi)?*{2)FNrTDh{dhtAb_RG zEF?7&FJy12UZ1abxub2mT)=7F^u`7tLlYAEr?HvAy4r38@WTnZ0Y6!lO^}BE`S`L3 zZ5t+{`;T{nYXNZ9;%iayzwjeJ-o51e&ilEPd^HCh5My{)EN+E-EUk1Z4DFBD_vh4$CaOBPXyjI$_vtTgU z7a^?r*L8ktjYUGe+mqNkowD0YjSOrNng;SoQAIUG)?YX6VKa7=?IL!??iF;`fP9=< z*gzLl*ZuK_rV-(F!5``Ediak?!%8ZUzgF9kMhJIR!j^wolV;zG+ZODc7j1~X-8tQU zA5WXP%*Ix4vgZf@`=Xr>b5`YD%l_nD%+a=N$hdFs5r%rYS%{4X*H9yWK@}5RSo~Eo@}F_ z=mdzpXE=I`8RwDNuYH!m;tIsC=zLVvdkwTj&QvdHihZ(WbJR!(rSPKrloq}SUCFHL zq2=mq2F;r8TyiUFm5OcmeqPML=@!GA!3cB>nOP4|U4eD?9Oi)Eyct4AtS{XaE&*DM zt}Z22_Cv?JC%*yh6k&slWT_?ce=DK`s|-EyCjYzo_`(|e>C4U2ohhXqN=}CxqvE&~ z7L&n_A7Ajy{-BTp&QiU55mGMpE^$(cyC>sd)F(-p>rHW9Ps2)!;?Hx_w_*)#2vs^A zk=7Mr_lwom6T`FcaJ4u1N=EoJ(4$Zc@0udWT$9tj-yR^~&wz1zRQed*`_^z|jAUmY zjSI8$TAz-I`#+{iE$jXlZu^~TJYXgHkF7-}#F_L^q7-05>hX*_X#yp4U1DC!7%BWS z)6T}7n??cA_En|{fzW3vDM`f4H58X=-n4t^U^Qkj8QSyfejg}O3BiAdB}ao!ockM1j&v@ zynH`6bTZI|^Ku5kqwvle;WJknWKp+8Dm$L2hqFY7E2XQQ;ja*|n`G2DJ^8S%H^HJ3 zYZ0gBVy|ooh&N5Y{5}Oqdr<6;MC)FeSJjxuZC@Z zY%R}wO}mNF97Yt62gJ+6nSXI_%|HOU#ECel4yK(k@xAEd3A5AtZobGwJP zEE!(AH0~B~0xq$Gd#?!@2IhKjApI_`-(3Qs8s6gL(w5=r!^+3BcX6Yq_?^KAnM6J9 zu=v>6k+Ct>{B_luFa7#;{-FdSB)$+DRTrr$jTcFGlGp0bl(@UqIMr+rSbK<|?)n|G zdg~JZ1>OJ7U@Lw7+Bm|lag55MJOdbre&;LkJn`$K6jkE1`e3M5U*yK3Vg(gNNCE~G zjAEfqzuHkcqu=ZEZJUni}hlud7!5O&v-Wkq9uOt(tEH@y9 zr7rS>1qxv0ZcdIg=<+6a=JU~fT6+2jZL%v?M0Jf85CpUV|B@grz}H^;gc()W^8Ej~ zMUAzhHu{~B%AU^DuC4gB+4CpcgAUuGQoqM3NCmTZgxp|%O+isG z(V6io(;d!wBd!hCb(588Gd9LXxG9R%mb_;(|wDFlT>bD@A>h`j>gdTQF3+* zegyXFwc-320H0cASnJr5gX0y^B^ zCl~?Od;rD|6(8wbqEhs@y$nmhkoV$s1cUK)Z>Y!cUwid86`2w|b`s7SFCa@?<17^X zP0&ibl>5cJ6vS5LE|n@s&uq^9X62yJA?_>Ci=cYsr<3>n?8%k+w3yH3V&SUaX3sZh zZa<*+`}|4b{-WkRB3yvnj$T~u0_lL?ikq6N#-@W+r5_TV-98ytS~P=-8ixGsrJ%Y6 zShnDYuozStlcO}F>n34m&qM^(1cd-=?GO|8K#>c9KQU4hVL7JUmqg?Ho;w!B-gCqb zY`&O@Sul8CAUxsgYhA8u#`Sm3A41(?Tq5eB3-vv8$*~c8C{ET-zA^{z59@#Ipy6i( zn&$s_pRO{IIhwlw#x>vOmkD#A; z)4vtv`+B_Roy0v1FE_D%+D7d7-uPkpRz1*{tTAyh%)gXT*7D;hWdy!=BRaZ_8wqLV zb#_XRfT7Vl?3~{i*#pJ~|Fl|h6_MG9q8oAIqiOp&Bllm*nMWuj*>6<8Iu9`jc@m$t zA~ub>7u_SXw=3e@u+rwh17e4POrizhtb0yED-$l^)JPa|e}@<8>iGM2gA)x1Tg3*(sJVC;VO;e%;_9p(&n1_f`0RtxEHs z;ljU-yy$p{Q_+e+_)KxKY8!3qy&^^z^!RR`;ZwX+)ou@RY`v_x5vU2}@?^aoWWgFa zEKv;3*5W>oi9+)+lwPnp7v6dLyu*b;3x!tD^`wjy%6WIY?_K5oj%8sy=UbdhRtW2s0ox5F3W_6GhGCS?}Wh!2XoBR}SYgEaOI)(|OE$O_Lrqr%_P6+c9};B4s+ z+mB_)ZC=5t(9^?(c9c2#w1i8$InEAZ_=PB@V1P_iNF4p}tAMxQ5aimP|DEkmj6uy? zbweAR8@CVD+QWIo#sD1ZcI4jlR_wM9x~4){>L1M{Ro|6yfxbi~`CWUtrDYGE3ub1$ z2=$uv_~5%4oN%pLAm(Nc=qMr6?QLRZa}VIjsXE8^Y>AiXUPG=o)TQg8NzYCD^|dCM z(sysTnZt01Axt)mkKR{Nu2)kF9kQ5Ro>ST9A$zEq^C0L$IV~U>%%SbM{{!%;_F0X= zc30BNWTM79y|4P2s?CAl{o*{F7`qu3|JJkaQ6jww8ks*zQ-Br1OO=9(hZ?ZVm+k*0 zeTXPBToaf1_GMZr&@YF;oa);p% z1xmkFpJE`eT_PE6!s+%b)V^+1p%-&ti?7G=L2Sv|Hg z#rJ0t^w=?q#$t!G;4N>)ZpI9?I5@Xru#)p{j<_qI-u=9GRR>UIIbJ??UQ%Z?A2m*U zA#TPJ9{j5HW&9z>dkyz20o#Rr<#PP1V_38I=<)rYYD4Y%2s~eC3K5fU=`eLaJhWzT zs#Qktj+G`}?r<#IZ2@%kLlYXDmXH{=?o#zr0$1tgD@Uk;>{Rbo^~W$N2dvCVfFc5T zjxJ!aDExe99U>c86%7p;htY_uMPGv|=jX?ypy6DtlFC4|+XM0!#G_AdRTOcPanV^N zt*{UhH@qt$Kz3UN1tpW1nh`0Vmi^*eg&qabfRxZhnT_36=E&2Q zvZ8CT8Buty&uWWb8C}8`urUb`N_Md(<*;Oulc74|&W$L!jS1j#q61%{3NT2kBIds=OW`TZak zBve{1ObKIS9H;7AvANQt^So%cCwGY7jPQqQ%1wX1RO79o1@wfuhyFXj)5LS1a{IVOCx?khp692 zY8=$kq4lno*l%9>xhSRfg(tc-3u&6~iS#E;fN*SrPjxg2D!3w}cr^{$zLc6kDl>jF zLXVFT!Q8oiVTNXya3&?-wwV%`i~&->nj%-d=DTb zsiEjVLgrpAqoxpp#P%~a1>Ngt5k)?0Ez+0U&bAAx2)3JNci0mk&0{9EBj6@izxc6Z z2N2f+>kfJBx12VhSbsG1w)N0t{TH|~G^4dNuTC+!SdZy1P5XWNJ&d^OZ24EFU2<`; z=gJQ{i(DP*Xd zuV=0d?Lk9$tzu|>A{0b%OW^d z^9{AWzUcI`5LK2~yS?9o)Nobr08Z*k>JT)FUN7tO)jLgzYr5aD#bWU=OE+nu{rxp( z#>5My2?x95{7>QwV_3XWWu6T=dEYHDG{r&}BrR0!ozTy8{ccWAzO=~XrVs>4F%`t^ zf2P!G$G+zJVh)a7e_XvtUB6fn7!4Mvz!V&<1tI*c(5ex%_EtKGV}Pj3{)*t=iT*<0 zN=x#~4lZY!;b5slYiR1xJ+6i`j4Vh!Ac2ILwAg1IzL85Vv_M?^Zgi*P&xohq4{SR= zFRr60oq&cp#weach^C{Oxzp3m_*}IxIliobXN2=@k26wp3|vGy6f<1`z3<4q?{8GL9zf2a1OY9eMuRbFj^7pThSxi!xfqaY^u8i&q|?>|4)ZIhuEXu@ z_s`wjNcuE05E`wXZ%^De7@oso1qGx1;)h0ZrFzdr^J4T%%wN(`WF6Pnt0UX`fZ8+r z5f;=xu}fm04)W5iL!DWzENC5UdTjAr4y}v>#JQ8t@mx8>;idK2@z$kNTduqwpHkKu z=@1OtHE7~$+8m&Q{LsmMT0@}_bZ4WxY(>og- z{#yJhNM3(if}Sz@(h`yxvtSPiaK1m;$Fcj>`#rbo3B9FeC2ZodE8%W&VshDadb#S< z>3R$a{$?dxEzj>0f3)~^PsGH0)9FVyqM!m?pagR@R0izp5|bSkB*?ZHQ=P{hQevAbYyn*Y4MkN86xpJ`$mJU2mWX zFlM}<2Fe&Sz3=or&qrd?&qrUp3aw20^B4%;yUA52j7(xMGy)d+fF7tuJcq@Q82u~*YrU059*Z?AE6Sm#H7-U2yteBPLi z@JqP#E>2$BUfvQF1|F%(cm3WM5wv+uL4$%rcMKU5o6+1IwH9fh;f~Gw<@`&k((Oto z4@8TwLnLI=Z^5xmQf^pg-bH}nL$~N>_OFYdfG0G1RJk7^yl5Z_d;dfya7mW#PmgGoBtA>9;Ic-4o$?SHR`O+C1w47ix zdVwywuy-;N0NdL1y+si!W6$pu`{`w*n&+37v-B0&Ckf0B5Um#L7?X)5{hB0f{71Jj z>|bA=!(4~i1fWY*djwl@TQlB{La`hi+b&1iWj`^GE*+&2K=L^4(6#x*Mw7-fGgQWS zqu{v5r?dS;1DaIV@j_&!uPr+Vo2kZ<;am4#w25dM0W|5s<5Gg7CCy$oZAT~!?@v^V zc2=GPx>mrtxRn@mT+GusEgrx6b< zzy9FjJ2&zk|*VHf2WnqmX$oxE)S(Hl%!tUHzN;16J-pH zJ9I;kI96A#aHVb zUtgN@`wO)uG*ZJjEQW?O!)xyKwtPtknqD&c2X6c7L|;xjXn?6MBf-krt~SPlx$3@{ zX34=z0D-n!jQ2;g%S8Inz72@JM0-Sa3ADed%&X1K&QCY`nt0ylnMU7|l3OALB`3LO zc6uS!%NCysQc4PdNg72NbedqiO=zy9#fH-r##s(8b16G@UACbg^~<4bc1QK)5Ilo zO*K_JyVG^-E4u!<08FVJiay*Hc1E4c4H#k4Og!7Zk$F$O71o`j&%T<#qs^=3yq?919u*#%zL)m+9OZmM(TCd#fkC=O_{ z4sypVv*N=n75#aSG%=Ju zaOC0pg$%medHSv;9=qd*pJasiw4Pku-@0`)LUT&}KAEODpGf>CSb;y8AsdH{(B4vI z6^1XWNum(=cC*52B*)|dF}N0JRMmRz?OG%N18}+L&Fc%ixj}JE9&>zfL&5k4o=OGI z$?rerGFXGVMh%lJ^|~gn1xIQhw?*mocc&pdkW4H6sO&HDVe^*G+&LKIxU(H1ooOXy z#N_k%5}r?2j;7*zZQ!V;lA^uAAx~@64(y^O>##UpJcROr1ItjV!A4fmCVGMLt+rB|~Y0aNfj57_=rKW*J zA7k}idUhWoPyN3DOClilBw zKMR;>(!5S1sM`x5lw$_s)k+~X2Ji_FP8 z?O&HRM_Kq;8EjWukfUG^<@I4&Q9#gycaaTDpRRsXEvF08r=}bqp-VK`56oJu@EmjRr+j3s9DElRl;~P)7(nAs5dnrKwJVxgDj9>KX zOAK8=mn>oR-t)eZeeFQzA2(<9u>R%NFfOv?;pa?BLSyFNjmZvyK5>F2U>QB~a;jm1 zV zsN9EnzbK+l`QR+Y^wL+SrX7WGSim^wR}Op7WnH`bT_ZN|d@9s_WD)iHe1ag;i;c{t ze%A}6 zq1e)%h0x3F0Qq1OWaXbuk*4rQ^go*~BnCF~J?J{I2475Au`-A%CR%~$ZE|b~<$L9+ zcACOqqL6o(>R;`b-WE4qPXIr}I}K5{;{z+QJ?805YB?%_KnqZ4h*%V1(>W6-N+Y%C zmO=H21Q9BFuVdOS8Ay_NT2`wbUz4iycDEi;Bu(|)t{Xch(_yS_&kN!vQff$P)>HO6 zs*t(OHkZ3^ZyjXlf$J=M755Y!Fjg48#v`vUBc`Q~XX!_kNiL~oyYp9dF*mBo9nM6a zR_iszkvTqTMR%84xj4lKo&XXn5Av)F@l|yiU&luYtYM&{=Nj$C!>FG<&KLOhVlzvG zL8WFx?;{!RaOHNYSmQ=XA-Cy-uG2(=TP#Giy5D6*$4Us&@4N+RCST?t)Jc0(u6!sCFabNc z(wq40s~(3bW2HCLYBj~HIY-m${sS?eHHs1L@Pewe zd~86gPwX^I=_B96{*}z0z;|%pkUH(YHXr-I5p5H%k~SU8tZ_y~Ry8xI_lctJn~dv5 z9v9q()=U1>{&zf}fvE~Iw%6Ri_Kw7b4Ptduqv$t5bzyQ-AI{AoDa}L+Sld9q7LBaL zNPRf+-R+`SO?q|x+s-`!i^-~n>pH_1Zud}VeZ;^@GbU0t&6_;Z$~upI)f0~dJTmpH zzBF}^L>i2_;q?B=Zmc~4LF#Dwbl1^ywvQG#sx*XKd`KZO$d4(sn1+OLi*{9~tc%!F zD?>sLgt#+~bn6c3)*9^z=zWy_OTtvF|T0!)|BCdR!727fCcZ;HQ&3g>wHYA=2muj2jzc#-DFaDsn zYdK44PtdeSIMg}M!P)3Vxz=n)YxkNA51+H4>S`<1_;P%pD`#+bW#(=6@kY-Xn0qr7 z#+lfz`G1o(49^ou84)ht`J+Ebkl?EUH}lgk@nZDyqJaS6oY;7%56QjKk5P;P2^&kM z%Y;`|sgC~lOzEqS;HmV_#HAcrEeU-`W|zFp1MHnZ1gK9Ao}-KnK7+{>N7$Hmko6V0 z2Ge^ySd(0j-%=?Gq`Oo!hu{Spfzp#Y_5Rt$L5838<7oRlhHs9IW1O~Ascci;JmEF^ zUpQ%Jde>6&Q)LZSs0rfrZ9e+rua!ACDn$H+uxr$jR66jnQ*WSDiaxL2fLt3YAKcHY zBG<0W<&K2sGmnJ1bFeY;z1&r)LvKpXIG|Z4@9QANvHHwz+jUq`TD zGOcv%fMnr_h?b!GC_KFji%H!I)}F>4cB`hAmjgU9mo9asxg3kyUEWuze_asrT@m;U zEMHYABQgwzH@pWANs5E_TYS6AYAIixbA8iU=?bQ}Ksc+Y3tEHvUP2&=a&64&V_|xj zdw%vD)Tq6>THt}d!eMVY(QCcql1+IX@HVCeDSnGSlX`cGAKT1#BSkkioD?$Hlc#>U ztT=1CfBk4682+LXC`05%ME=aW4qG{7MJ6qeL7&8=o*Pis+o#{(=czce9Bcxmz>(oDkEzR$5+PY|6I3knH}Vg2$w8 z3m>*+n9`c{!#;ZX-Z+QN&Q$$JU&r^87k%GKC4r_RiTS1uMT90 z*>Yr1$tY3laR=bSzQdsoRQas?0~=bwz+^UnHdTJKgt8V>DRx}j(D@DWQw*B3GnJ1C z%C|L+Au=2xk9Jor>7t+Y@@8J}5}W`UmCxPv?p6NyLd+%XBDKUe7 zi4fl3hZTanR&5^L3@{8$d8pb5adH)S@3tjldLSU0l&BQQOwW_{E%KW|m%aU)`zOEs zIWJyqk`l$Y(4Sn7+dZ$f!WB(o?IV-2phdL}U;w`|o))~i2#8<%v5Y~EtNiAAiWa=s5pie2 zVK-SQ*XON5>>vJiDoe!4dn!};lwN3~kq~0e6tf-cgO+>$2l#J;?CeWn=5$d%@cjiD zhy7jo7>)sccG%7HSui_-&QEh1uIH;Ao&v^wP5^WhESyk>CoUJZ==1PhnjRa=e~ zR~STNb_^X2pg6>9zW5u88Us5R)8t5eG6eik9u9~1uenGk%Jejttb;+jhPf-~vNVFk zL+Hww-`l_`sSe$pM4rW3NKTjDVp&Po?B|*NTRIzP@yUM%H{%EUMsV``+*9lacxadM zS0b+#4CMV_CQ;EHy+UI8^S19&f zz)XjbzWVTIe;87?jUF6K^XA6>&c}^YdreZw93g#o8JWTKgKc3)sV1>d;Q(whk7JFp zpJ3!MR@gr6S0hYp9jOZpcqN&QaLog-S3T zH_4KfN9L5Qe&}xm14*l`c%%sOdTXubSEB9y!W)K+AuA8V)hC|lm~!Nsj8pq>&)UJi zG>4cP&D1Cwg(%}Y+JjzYIBe%oX(gSu_TOqu5fa%Dxn3NtI<{h)|5id}F0rI`O4^iP zcZa+KZ#`02X~1@eec{s%u%=7Hs<&NoE8saLG>q-WlJ*u@d z9N{}7?pqY$Wxdb`R)I%Crcy2h4|Y>ED-1&nRYrCoU)VWyl+WB`O)Nei%BUY=oV@CU!XUWXt`$F%T zXZA}>#^ZJ`6O=GnGu$&;gvF(oBC%3H@UQeHW`-w`3f!TjccBdZyAnt4`z==KPY1Tz zi~gCrhMSd8uCgfx8zqS8j#XpH#i&T}GgYp+02w}K=&~P$=#_>(!xb~0q|+}L{Y!3< zVVX2tlOiflN`Y@EVM#725x=qDA&f3msf|91Q~Qk-F_ zR;+mg_cBqABBr{u!M~Zif_0;kqNEaz+J(X}vfS ziWIK8lxJ1O=E-WZMoyLK8y?&7Zt0x?zgfw#^we=@^+4M8KA7>-!-nJIT_5h_Nd#j} zzFt0Sf`PNLWRZ)MdN)?5V(CDwZoqc- z2V&Nnj=Oo>$09_qA|6evu1tE*lD(X` zg41DQ$1z0p`MLcyDx<3X8?OzN~KZBqJCR09P03@2ltj=&!N#oG?SLBF?C z#tTWCj)pWe*}UC+w%K@{ELktEo2t&hzMIZ=^^0{W`ulB!e~N`ef_Y^dViY<=^`2qk z#DJ!_!c_NnK^ggX3lGWt8Iw;U=Vnyo<6#@6#~Q{+4a^cX;;fqdkchwOyuf@fEnYgs zNt^Z6nzXb%jx~d#B%dZ@0tQ$~Xj4N0GJ;W~KpQV$VL$+J&OY8FS#=If)QRGIJV z8D@iVNt7HdjxkcJt2Q04v(?bX-|Guyso^D9fA7FEC!q+K!-)2!sryp>luxE~H7)pM*EnoieNWW;=0ow56lR8{X9;+v7Dw!r9ALkx zx045#(PQq-lBsj-&Y-=vI1y{5cwuc`U!3Vz%CzCaQXp-w2Wr-6UNJ-x5&_1Wg#at> z3k5W0Yy`8zcZCX!UAo>Q{VhBm$jd|RvX~ZbitC{`Ipb?5`(Btvv!trxxduyb9v<-0 z*znx>^=mAn&G-%%>BEvB8%0 zkOLy_SC5Wzwf^_hPUu&|xgrQ_X^H_eJyW8D>jf;p?(Y%98dL4T_C&_@B&q8WkMy+O zyzgpy7&FA+Z*8Smn7Esv>8t4OyAMCGM%Y#K28g>Zuoofb{if+@0WIO6?hhior?T22 zNc-%NFXU-tx!cJ1nlS6Y1A=86Ug@TkyFj8Zr_*qRLI>xgmF_XO}Z&~R&LcgxS92sDI)5+uS*3@>3Y-ys#0 zgxDE&p3gT~$EPo;3_L`82j39kCAM;Y#cMXnD^!47sUAHCfgmt z1O!KbU%P7E?oX%2zhJ|uQ4ogMha6Ni_H(^&evP*mL!cZ(J=#iPRG~t}YYj_$d?U9U4)nx)WUjCgM=*rCVqX)Ibbe#cy0m_2yYgJ` zJj!TxjEl5-D<)YJ_e|vHOusr!Ok0L?p+fWIq0$Qh@&83P@Xh#5p!ddX?1;9Y;wb0G z2YH-k#%1Tq3dW=mdo(&aV$$_DA>nEMNtE!gzl`Gz{6e$yt@EVL^lXwr!UM|Z&h_tB zB8y=}!1h>1^4{4K_tM~}+<4%_7WUe#0?x_j@E5$GxkEQ^_+i4otDS!^pT!T6)8H?B z-oChOQP=$)V%$FQSwC$8*CU)hmB><{(w-N>671r6I`P;!#}sqKog5rmr%DvFt4otB zd}*U@=C&!Al_J_3B$2ft_8a!Qgcgk5lQ2%=$Q#DT(8g<0eojM=B+A;oCF~}kojN2Td@Pj!-ycXcUYt=YW5;LHQ4$qBIEilt19#W!^l5G+&g%Kg zL10Nrtca{TR4cGhgyvhZ!2+SoYh$k3!!F};HNfYfjQ;UGOxAN|hh^YWH13EuK+C;v zg6`9469WJg^AmL849>M7IXWU*~qjqF`CKU6+c+>fuToXIiv)!vmr*B6J zk*cl&zVgLNtpjsno4jqOLv(!~Cx2Ig!dt_qtFto9COgn7=I`nw(6cnW6Xd>^6Tg)et(<~bW7GiR!Qr5OtXTEpKzv`d&tb`3=(3-2$%mf z0$DDKG=kdDT1A#hzHbD@6d4mh%3^bR76FT$caK!8U%@;Y)RaNE zJ#)Jn80IEU*2GZF2)!P(WlxopBGBm@N%q>Erxd3_xc>3VWOi!W@9lRXYfvE!c=m22 zBWxh$CnkfV|8 z(^&Q^;7wTrY_jX7f1RN9A1z%B6_V`Qd?cm&7zSW!dt4796sL@mti zRDFYoSLvSQ_-03eoxDSt1k6cPqH;a&agj@ZDWIf}UVDW#Jp_NDd`}k5BQs~9C(}eCOUqQPHd~NW}Ju1~Y0Y2e(O)^Q~3dcdz|Oahb9C#nkmk9`@M;nx|=Bex&hx zNrKjhFV&*#I*GW}P~+_;izjS}Rfi z+GimI<7mY##Jr}}jP_;%&%?sHT9OiY>-a`bk39S+!hG69`Fdg^0BI=zCOVZpha>PX zC*zrQA+yuI$Pw^=3DM<*P)#GW^xJ2sWiW9)Up@h2shMeoC;5_LffUHuG##47m*g$@+b6+bYu@6 z%N?fWJO`;xP6HKOoN9Y@cQSMc@`4s?gQxBHm!?XSX1fLa7a7T1mR{ybmmUArXcSU5 z?WV1`<;-2HO`apb0;1NCc9bzk7TVB4I+ESMCTQNCtCw4LF(33kXq2bQ^5=lf7B6URmV z$C@+d9QLP{6bT4u*9k7T^cl$_ixd$Xpp~Kag?{MRxkJ-NR#2A76w{am`4rhzZ*8kb z2jrjFB=Gw?CyvvxXl*PejZ4x?DA96YU_$<`ZXpU%cZeG=R_-?c)t<6!W-J*f)c&y0 z2y2}&Z<$fr8U5G+$G!j-5gEz8?}@3-x^vBv8tXE5mSHQ=DNn6N+T}F2doZSBV>o*B zY?9VcK13o#bEiP{vrggJ|HVLjO?bt{TzEM%5>0@`#Wui4wHyPKkEBhzNQ7lMfXO~< z4EG(Lo}d`Y%o?#!TI$keq;W>ZHs!%AY_ojZX4k@{F=oMWAj6iUtE+X<(5mu#L3F*% z5dF&5tUNn%klt8igCd8e@+83)}Ux4rrmUN2t^;Z^3>LZ2XX z$+Iy@xx+!gy&fQ3)D7PRx+iasIn01@SP4wR8G%rk>wmy%f2gE&iN*P*Eh~?Il1X_Y}`_O#&?tTW{gxTLW4WmTi$qLT=2tx z(qrQ$%Yk<@&1JKmPgjrFU_ z?aW3fjD7xmQCN3N9s0bOK3zKQo`Ua-9E?!H@g3*$kZo|H7S!_ABkE;4p2acWGfp8w36G}dV+oVT zOL$BO{jYqW%S+E{3^fmNqF?B6pkdXz?#)|%xLM_CDQo(~j}*rHLKnab7T)23*AIBU%$%WaK#G;FKuxB{E3ON=qx+O5Cu7}=0OB}xnyJ~h!OtH>4@juHsxCx zEk5u)gGkKgvWJPLHO&J7aFbr)yu?ZPf;;3h8Mdza%^SP^ua=D<-KKZ+D~MnH+Az!A z?d@)H_`18gjOurR)*WWuJI#W^S+a|-!)BMjyJ{zN655K!0u)oi@$)tC)RL<6L9Yl3 z_dKQD+fE>ca_fn9uP6xqoFVggcSRp+fwhuz;CmdnTifUWA6&WHLA#Ycf}ZIC^&$P< z&H@HxN{rt(Scx>pK!slCTY_+2$)thjUBh~ts@P0G#Qx6ryh~#6@MAzFq^!Q06 zN?eUJS`IK(*52bu&{IDY6;t<*C9V-L=cMjb!${?rymS7oEKMaDn)Ky#m*EKkw({x5 z*PMle1-`*S;`>)^)m_L;t1!$}&0%HpsXszvts^e;5qv%`f+uySzrIHvK1U6%jt!d8 zYr40<=e3U7U=X}uxlC@Y{N@YC(6+0R6Zx03z4KL5>!={)udj^YBF0QE9Ug#6Z-Ngl z%v;!;e)N|PYCj)5u4EgRSb{8Zq^$X9aH~UM>cV<&`&T?3mOsWcIr%8XwaP?C7OrS0 zHV%0Y155t6FMkaQC^@Shy|gdd1#@f!Mqib3ysdh}Lt%1$y5Q5K=&K82YLbo*DCy)Y z8Kr>-^GX^cY`D>wv^$ayOOcFG`$Hzyy6b9_&y|lBRgTVi@x1mo;eyplUYV>jO< zgffBeR1Aan!HSB>$Qdse4E+rm+NrI~K#J-*{3XI7A{UkI!MXr8Rb{Rm$!ifN%5~t& zw;9GfU*JNm@zYMt5C7+|U(K-!7{yz<5}A>$rB$ldWX##F=7+X#vDodj8FVYA9rnfuUoe% z=NBe_6RrhuRo;9nyOXs7#qh>V*j8}3l98hqlNP^^w`=m(+|_MRiDaaEQ1}cvAsNtq z)=rI)ps~;&!$1?oEI55RzBf$C%FA;1I*!&Vf>tiD@BDbY(Hb<9(1RarFvfjFqidguwJR7tUtEjso6gF$jeVXpP@YN(KoW|%v*?*m6zC_@Na>7 zbKh0FDQLX9a&`--E3RaLdBX04!9sg!1WG607d_H% zrTIJei+xa)E2|I;Aw;AFz1#Z>n|L+L5VmVbLh_qP@5E9~nL=9A`mE<8=zNYgoL?Up zajvNN^R&Ce1eX;^Lw#9Y<$Dmz7G0z=YmpgHqas%bHVvX8?@LMz@|9lGkP8E)Lc^3# zIekiPDQ8%J@eN0luByK#Xey|q!QvWvIVM7&D7Ho|+29pT&2>E*?CU-nfYQE0M;9$% zrdj+Td|wn%8t7^|5Oy+~lUN#M29i{Rtez66By z53V-0$APc{t&APkNrO93^#~9*U~F#}i+uMs+^1(sbSDQbO4tg8DgoV34nazjc=9_( zie}7>R-n*B_*2&9xc)bey|si#^PTQ%BCplZI$Jl4WR|nrM@F3~iBo;q%egY_q6cvp z?0or!{YIlBB0ZX7g?59SVgA!K2Yb8+iH8cW>6#GxLwyy6(auRXJr>Xv@${jt$I;v& zGaC%&h6UO8oN3=lR_ghfF8s~vF2{?U+V#X|6)UW&DL}t_SQ^lYRwYOV+uGXjA2>Xx z3A><23x;sE`FY6VXQz+J$$;Jn$k$BRp?Q#OXV1MQ6 z!wOU>Po=^4!S!QbvD)m?$AOV0Bq!~Nj}SlQ*Jflsm?`?bYbF=6Jp2oi5#&&h^?v*% zHeZSV;LwuGwOLp9J22mf?N>LO(ZM7d8)J>MiERWtT&R~szp=_xc9pXi(Pz-(w>@*p zR>-w5n&0WZNqx8UUNZi_2N=K0gnDSw%6jJ)tpD#R(Hphpah*3O4TH{9-qY_0Kx5KJlBfk{_ zNW4Ia1Ci@BtVO4p7a8z`>cs|33pHv6KoSC02~7jw&}4Dc$kp~;r2bOzcIWK)-$?mI zNXw}wwcE&Ehw4E1Ma-d`pU&|hN-xglFcRg%b|5T{Z!r?y+xV(kT^dA}C(pJOZxMw8 z2XAv795~!fM)5RL9zWep+l#`+1@;Kd9A)h}{FYSD>Gk+UhN*%DLc#9xw_s*y=NmH{ zSQYeT^At^i036>F0kVR3mEL*p5^B6D1brjm<=2`Xm=?r0FN)_;PvB>LZx2?5i18rU zF;Yw86VNzJkVKG`{AeafG`sm@v*WA2Pxs=c?$-U2Q-P;zpoD8nTu%r7D@);!IZfmc zLtlbs%oWu+UbZb@(q-!#>XZ6oChA8Aq;I@ZI4K=UhxcgJ9)Fg>yfA?v*K)_Khzb!j zo^~d;SM%;}o)0VZvK+~#YR;qw&lnjq( zkRm8$i`cUhAhCRJ%EYewgppLZ4nEy*SJ%9U$tB;Z0+epH$Y+Nrqzk4P3=01IOIzq^ zHao?y1C_Z|EJ-kR%0O!b9M7PvOQsrm{PwF{1DAfsy{{`CV4y@Hj4r{2kKON znpB$_xE+Yo2t}DeS4R)5ve}GKG6bSk4b4+?JEwZuT!X)r&zm$<6%}? zs?u3+udmWVFF5&1I?tc_I7clmoFyChc!U9~oXzczF_Ed(JsEr3a@P#rJ>61CKkcio zdh^`;3pX|9biC~}ud*K{-5bp9-hlb!IL6M+wSgp-c?djyUe%-MKh%A)sDD4wJSHH( z?2H*LNE;TWj7}!t&0{Zl=2o!pB8Pt1U^D3hSey{PESbt>-?>c;+mBA8W)|?UtPjtM z?*qDujAXURK<@7F${WVQfQq(?o8arnHBAo@0xwI;TeqKSCVxTc|5$yt){@}ElQ_n6 zw#Dyk3EO#hv5cWvVMNaZWksRGCbX{K$6a6F`NgOh?+ihcOs~HS^V5QRh_gckWM%wF zzH*O{TDWR$A=F=B58A(O{Eb8&bu#+MhG9_<0huNlSn`N%BE8`MlNt`YWF&6@ZtYiP zEp^sls_pwFV!kk85%$Idh2=V1+fvzU_u8VR*YrG zRql3R5-mjQez~n~1CwM7OleI)pKZnC9@AAT{?NWW>eQo+$;9BwUzGa(RS z%ToDGmcZ#1c0}I|*WHiWR_f^m*m-+R&Gwm$n~`NlK|22akpZ9MvY#{ZZ`Q}Mz@y$3 zfRQBeRegL+ROgTg$}0>tkR$x}#cbS6(!9W4d<*8pPaMxo0B0iKms{bnuhaA>y0-o! z^>n(OYytHwj4N0?mqhDYUl)TT#2MYho*M_7I5@zM zX?%AAWexs=ZAUsFdctlls~#7%ibLc_izx@8by*WdA*te?`B*$4U3@tHxbSlzzIPoQ z8UWs9wrv8klTvM-`FcIV#pU1U8^ACjT*u{QxgLtCztv|7{7ShRfio$snUA8rYlY;5h%o(G(OUzV=a$QhynL|9@(JDT3=di;)a9OL zI>&HSUgb*5NeZ@mluSLs^wyjU#cS@1+Gi<;pZb=pYyRhm{|KDPg+ga?2V;}LNX^7p z;qKq~$FmcmZ6G{q7jQP#a8cqgM`gIJ`IPUnqnv=zhOk&PPU(n^P3!G><5mj756Y~O zV55e+3RH}6IN!^omEzK!xR!RM5c5bmQi8x;U{`w4lB)t@pTT;^A5D4KP!kT~!cQtn zYkip{0ZtjJGrNJ+2t;ywLhf+euNF6}Bot~~DqW3*<&rv3-jpV1zfI0QbQA>F69pti zHh?X1(nFd!O$$1+Y#K+J{xWxn`-D-mvivF7)6r5A7vA9U1V$G?2^$OTg1XNT!opk0 zt1}oGuL!|6seSIqdE|J7&QmY0`5Q7RGlKR?%0@MGUesX-q102M%ogq#wMB6AYFbAn zku5F;Sc80sUHhVV2G4){9aU-*Sr}@r(xG&cpTA&>2RsFe3UAf#LOx+PmhYf_{4hc* zc_8Lw9$I9oijviS_VW89Jg12|ApT9t?YKR~2v?%E*j-k37bMl+tEcoj5zV6wiwDGO z;YQF@cS&>`mdrR=w3uh?MKViusLk0H)Q0g@Ef<<8N4-?YQyCUgP;MMz5r$Hf+U5Df z`ZS)jx5N{4X0&=-Xt%uoQ zn5dkv)zNnNQH~nAI45NpC?%R9+J;D8`-O}6+oa16Mur(qThHFg?K15J&MpIMon5;0 zzQS2TW31nNuFbEx2(6Eq(LvF-wR#H$PD7K1 zc`*ro-?Ij&{*^gAOFb9%n6c^pc}H*}aIN)2??*jLSsfO*QQOW_<#P-2bPC9>AM2-r z1o+SFCaQs`Z$fUu8*TXJcTxe;V_Lfh!K?o|rokjteFaTMF#az^ zBH|m?_%b&d8x^Du>@n-+d&|%q#r`{CJw#6i4{@M)14?hNcgE;!R(7c}$+X1%zjX;X z24XdzUm~lk!9ViT-h|Lzn2Vh4UdB{ptfi*2JjpN1@_lC1dkFyHCx-rjZ;Ex3llR2^ zQw>;{lZ-9}kvaS6C)iq7B8>;CY)|AcINH0#n+++?%>O){aapSysY=|wFs2EPk1!{= zp{oO!cChe@L+ku!H0}J#;M(BR+Bzw_Pt9LgY4}RD;!C?za@Y-rm#bG4*M){AYT76Q z@=*}^i5NUfW~3m=DY8ppO6cS#Gle;?m+Ub@mSM1kfp{gk^JlZaB7cx=p!k)QWYVAOXfQt3xjDsZNRZ9%6197BMm@+58C}&kW&|Taneui1;iYJ>e zFN^|vu_VGgXys9}@pF$bKuFb zXwEL1?aC_FP=0`b6Y+CKp+RkR<(4ivK8aZ04be|5t?RP4_*irToQG@enzRxe?=S~h zO67M;0qgAI$&~p_Ml;qL4fvCw@>6q;nRO%ZZaS`{&)!kF9o>( z#on_0`GMpB0tOU{?|FcKM8b+0qVx;j}Qzmjol>@HahYBVthoV9<>`~!8bMPqW_ z_4GfCRgd>o*_b1-ag6e~JFjm`zI_p>PiKCQ4a2B`Gx$(tM*yz~3N8dfUz(mJ-j%k+ zt^UT;|14)_w1X)LX+?f4(mYF56zqR`2FL}9P zcK2J}F>Iuu{XYH&jNE1l!xO@;pO5oH7<_-55W7Dnzg6m{oA7-hL@&k|(f2Mu_1Iv6 zSf+Mez{l=kByi{le)F=f|E?Ka65O)3xM>7beX!a2&T_mSH;F2TJYIRV%lmQ3wWG>J z&aUrs?mJ&hsBB1}z@xodz~xv=$XSyWm%17q%tB9g@Ry>;V$&d0OZOpG`Qx^v!f|iu z3&D#PZs1crUjiqkl{CB-j=FxF$R%sQ(`(CzBBA~vmf!2=zP!tlZc@SFr0?TBfoArh z`{|+J@vmT})zxD~*y-{x8%?wk-4FAvn2%amoy{|rKxKLwaQ~En#B)uK5k=304Xoo! zRCryS#p*KZa6-535bq_GFcd$t+20>6oAwtyj5)^xhXPE^26tzRB7!zUmmAqJYGcmq z55SNQlFQ9sevfn5*Fo@@*fcFpN*ddI;F3fiE|y>kDG>i@gq4u{P8g_Vmr+WDptB$3 ze@I2Z1#+K|to27BKoEFIcs%00dyCG1jmn?q^S&75c)cBDczp*n)5b^|CI7wnH(0(8 zpin(1W>Go5#O;H27-8qaDw2Np-A-~p+gOfKcmpK$irpynUEJZXKi1?l=W>OB)WXpG zp&{qIH`4@p38lJBR_Qh{hsrt`%`~&IppJE)_iRg za8(_HW`z3kUVzDSrEz=Z!e!A71`R9zg19lw`*vbJU}!}_pvhd<(N5$OZ_8xln3s&B+eU!t^UR`1rkIp)KXzM0D3(p@y7d|;0F4;KiiNB_^eca#Am$(Y^NH8L5_dUp?RJSNd0n2(M2JvLbptxdt=ix@qpy z!WZyASC~tBHZu9%EMu;~la8`_oh)OVtt^IR99rxQ*}&G8R3rM|?(<|?hHuG#Q;`R4 zEiyJIJgw{E;`9mnoWo@M6r(f1-UV~ukk1Ziyt#(qWMs*6|!hS|B~d2`^7nH@`x#Qf4SH$Rq^@WiiXfYaSlEGNWjpJp|9ZkqXVL&k~L}g$bXknlkvOYC&c60=KMAlD*S-_6FlLk_IJdO9Tt=Ur!)|q1B-%4;tg>x4dt1#K?McfdQ*{z4zKuY z>xbWdmH8>20X9V(&66(tTA0mrw3Ilvy_w7l1byx=rz)f5;Q+O%O z085R7xq=rFC8Sa66{rXmeBo~-n58mdlb%YfVcjlSAagkDXs& zi&ig&gb~;bfpVb>9lry8pN>?Tpr<#B} zy#0BZzgB3IlbO*9YK==3y=u^=kn<|X z|Dvjm0t2WPpZ~oqn$8BIQUCB@h)i~1Mjy2hIPo)uA{XG0&oV(I+i0$KL!{>L^x0wpIAjtj+-t*Zc!l>7U%verz3H2Dv~CksvBuwB+U7Ml^r*vZpzTyuz&Vn)gR( z7aI?aW2z{cN&00?CO{+KZO(*T6#UTKL|K1&f+hVnsu45wVmIj0Z8sRlzg8h)M0t8v z^=K3<`n2q6gBwDzYB1m{@vSI8Kgn?l>&Oc-q{fph=eVLTuSrdqWJ1QQ{<*o{-B&ez)G+1{Izn!Zmbo16Om<>Ky9^MvggAqDj} zne#;`uRCR$9r`eZ0gvGR*IAvCqfS3FW6BrTBg-XI8>_C4fv0Qq$rNWWc1Rj4gEs7h znOIaJcG->BQ-rNZ3`YCk5y9Oj17h=O$D^Y!UFmoa4S6aADe<1LR(pQnUTHdg;->_d zu`AUHg1-t(Zo*5o6zuall*x!wGd-5!b0F*6!jnFZwMKrEjQ&p2 zl{wwY?g4vd|MZ77R(TY^QT44hckZ)GBxG^+xQH7bbZb=g%XPLj#BmO|wLBjirx(be zaj@XMb`OPnsGh{{l%Srb34gNONEc|MHWqlw7OvFGuv-94Xv^)KHoWt;D}>&_1~sBx zQ`dHTI*>>GS1e!GbMQs<{`*)Jb%slVmEap%101T z`7;DQ#1gUBy4{6c_XV(jhj6yU7Z4+$X-_wXRCR)z9Fhu&+0T6ObfpBgx>AXR+K>t1 zoZ<~;|E`sMA4|BH$n!)lo*C<5S%m_}?9IKc1f=#G^e<|H#p_X2F7 zn;q>={sSBhow0tn!f;mq%hSLZ2uq6~ebfeYb4 z7d|`CPM&c^$FRv|*OAt4LLg%VQ=tRchgEM4#st)o&34G6FTWl<`XB5jHEL4Bm!*E< zPR7I{B?_Wbi=^RHp;h~bu^2WpSg$~UWFz@^|-J!&%-5#!{k0X-cP~q3{Sw5EH~%w z*wJq$pW6`%Itu?3rzo)YeN!eMdBGm?wUHb0gB8+^%LU^@;Cx*-r0miZl)-sS`k-7_ z-_A&hPFdz`-9T@`jk3z2;rf?q-E5QKXI$WBjW!Y+UxS%Vi(EyYs`rocNj*f2sB}@F={b`9j>PS-`=0IR(868X81dTIwB?1>Qwk?UJRCUokH1|1mfk!Dcm}1Ue`&&Iq_uDe}QU2EBt4LU# zYbc_gtFHzNs(3 zQ`=(Op2o%bMja*XVBbDupKrLV>ajmCtNmDPQ%%Yhjj@vsK9`j3WjT5Z@9MM&x65}b z^mttIefT8cB_@9+#>F24NgSFnA92M?3OfK^K|Jhr(98rVfG}7FSENxUEw9)#seT8( zQadip;X{I-^_fJIZ_$D7N&o#e)cCs7wjnCb8*Z{d4;*)kghj>C^C3fxwNH z|JAsho%qKS>E4Zx@#eVL%guSsP-l{_rlL$xL@WMos{|IunF-Y4J)&v8*3*G>vGgj$2Fz4Iq(*KBrw3h-4!v5YNT>;<+1wZ8LP`oh zR0G;`9?9jZ8JVXlc5J{#gfh1dL~!qaHhbbhNCnDP+oDxde#rW%_-qVYM*I^m;vsF4m1iBpMgm_Nm_ape47&Y$t_zi=QYF}q>oJW4dCK?=&p>)4NSUii~=e8zCP>QJ0Ob@r z9;pt+ALq_GUaJL~#g>hF;qMR{5n(kUiq+ZOX)&Kup{GZ-TGER}l(j_p%BUZc6t7ek zf5n8jjZ;7893id3hR43Ao!7aW$pS6-^zPQ<(?MIiim;rQY|*1~+un zG10eu8J5(fN&EFpSa>*m;?!fVkgq95#G9H-(pyK$-&k||-~ne*sJWsOExmPxbXFG1 zV6b*D?1FyS|0DmmApdNXw%|`x8rJn$5IC#U0Oh%_D`AT{CG^x^wQ|5bfGabaP?=eY zU+Lb?z%(|ETa02Cth31vJRoHeN5Lq9CydIv>P9+GZ~xPq3MLmIxUS+DqfrvINvWr3 z@)$m&B^A^yedoC&^OFvFBXJ1#$T~&HzWz1gS+*&aM+%fUY=IyH2%E*e@=p6aO?EHt zGKp{#r~Ah-Tq6R8<68Q(yDfMAt#XX&+-Y2^J4@`+E|Ws$zx|m^ zA^vqv#qN3kO;FvLU)TnnL?p6qRlf*5S7;wbUi6UK?j~>+G3h0g)URds zn2&l$U)kX#CU)Nih{9!nztBpSsgK;ct$bM#j(3Rx$#!64Mx}&Fj--!Kcl?c8{d1NR zW{&k*=8IT@imRUZrs<7X+!t(Td8w-Y#tN^HI#OPWJ_!^RHp^^zrV9(RSra;UxPA(B*T91Q}(d7Ggm&n1|VFQ zu^VL4mJ}Fl%1j>(^H|K9Bo6Mw+(e2PebdphHq!p>X8Px8JTZf6jR*ZU6CtO}(q;7I z(+$_T?g|++qGMB%GAC(ZL%e8!zs+mr`G#2j=${zR4A?}Ys$WBo=GKb~$+wV=`(=to z?#4KNoZYgSL-6$nicuxgh?oWw0>BiK8fQ8$rz)*ldi{8E^^Pa&Fj9%_*1GL1ZtHgo z+`w4v`iGMA0SlhsD*1nLFGnfTSd_cJg~yEpTA!%cC+F3}_Q`{#S#en=oBj_FriWB3 zZQc${ESe=T{3OO?MZQ z2oT#k7ugD=!luT;?>^a$Yf5tI3{N24j22Mpg;(hfzMfSQ;(_9cj|lYwVf=THKCRy# z|3edc2H%&m<|n}20qTvrjOo|6jePdro!1=g1nwVBD(?qGy!53dYvh?1Zvkr_33`hz z7RoVWNuib>FwXVso?8&;t=rLfco#(Ud<%>JuP0~bn}%B5J>0-(|FFd`Imr(_E=gfo zo^D0i`b+(9(*pz_97yo$rGi_IRe}@IfIwhjeR7J&Awh835YcBXBJyL9x#zMFtI*N4 z15CXL=tf&$y1YE>be5*5pj=}GDk|}0FE59Y4nsShCjqEJ;Ft-{Gs^cwgXsSk`@4ey zDzPZT_`%-R`*6CuE2GvPH93dk5_qhXMGR4eBEw#@(PiQe)D1EDxj265#Xc4<hZv$pfO;?rU!2p?^=FZmzc?GU$|o8G(mxp{ zTJ(|S*LA>FiMg=gccS^Hb!9l~uo`#lu|4$HS!olWP)+va(}V1PSVc!CBuCzfe={B` zU+0>J!T%`Br@4`a-!=t-!vvW@#MU_vuct|FUCNBp+UNv3XJVdxD$f`C7_wb6zd6r6YWgEO7n0ajWciEf@oIpO8EvTDPPkD_%K1&`U@wC3 z>8$C51{5i(ZadyD9e@f$&IKWxKUT!+58Bz7=Qf!j8GO9-TiQk$uSbPYF*@(IrR^M(pK?1W-oQsj=7B5QO7E@FlDj>uB>}{j!Q}}NHRpGQWhTB`}GftsW2Oo(ui~oHa zxBfF@1sKM=SFrlu#+)7ZD~Xy3jtAQZ0h*k=0lsoh4Gam=y)cmNF{f0kI?&ToXhPf~ zdNd4-Qya*v(#6$&Uku*7_&Hvi(Q%(@{1g(2>)E{Ieu<0c147ot6JdVgAM9w$gr?ZA zR#K*n=G9S;y3f{G+rj+&v;CPEERI6`sbmV3lo@M&u_#uK;@Mj48f(-#DDw?|wa94o z-hMnd!`nh$Ew-5CW%z#w82+nKcjp+S{P#LkK>VSV8k}BBg0* zAsYIZJ<$^ok4HiK9h-I+-M=3ml-lr?3B|rPzBf6MoyJ5>ONAvP#sPy4T!??+9M16T>^H z-2*W;HIsu4xT}skj__SbzIa}G&HrJe|MS5c6f*?ID=pCskpnScpCj;b-KWhc5D&Sp= zvgcXRxz~e7o`(%SB^^<2t*M&1US4X5Nil-F>#u!1UlyH*=K5cn94IG!`Mvv{#&4MK z((|}OcJRbTJ^r7N#DqUXa#~USKTTbCJe%G7_NwAFN|lD~x3Ev1dDbC+|Mt!{ z_b_2K09-jtH1W&?4LIik{Q-3!C0nWl`u{CQUf|1YOS-jnO~Zrd4)N(tMG|A^bd-7R za+c8BA@4|D?EzN<%QL)iiif;LCr?uzpiV=g45Fx+;-)j)Nqd5eHp=TtPRn!(Gx_s& zW1U8eh;z((f=%Zfz*eV|k*ENPf_%#fZDcyfVkfw^rGKa8Y$WQCJnZfu`mo#Q*z^Q@ z#~{~YPRD9h4vEq%CU9I*k3Pe-jH%DnS{lnNJrvURrH%#I!d6U=nH4O*l%K}46w;6+ zz z=Q}ozXT_%#9O=X}#U-Hd_@!yM9bCc@AXr_v9_H1t$jiNc2;EJY&XmR%!&IffIrf^m z9^H?N%&c#Nq|FG=`ehF)&cd9(?8;(YRXyW z?NRVHae?QB@D z^Yjrl+$jJuko}yDjAaveD^qUCqwD^mv=#W$_kYMKDMQ~UFQ}xd0c3#DyY*!h^4_x) zU!DG_l5PiR*HUEcl-StscRg6UXz#$;REGYotXWUnxREFt^J~Zt8gRFEH`8)%jqAZc z-10Q=DwZDp?Or7567Ng?&a-WHc3c@tddJs1nQ`?|M#oygs&ZwVnZiEiTZ`Ba5G2oe zbjFvcHP}Sek?%YQqJqE5#fepOBNe)^Z?bC#;zmfPMb3S&#K4k6I^5)Cwv1;VRzgDv zVXK1eYI}DutL$_(KlN<0%K0zUvE5%4t$wlnie4qFP}VQVz*CiXQJ+e@$*!>GADMNifWrGjojRR|@jKUFE-aZ~_ zFaZV`esM;>*{>_~KKM$fE2dl(%d~}5TJIOw2CpRVwTjFN$;>l+p1}q1L$(*S^P#Yi zI7luNr+dtV3sYJb95BXGDn zI_EWi<>xY2_#APar^Si^E6&{nCT;^i%zHB;$=*^Rud`+8@yySnh4-86K7I6D_Tdn! zTSKs`Jo1)Z8Q#;8hTx2)<%qG0!e+wH_~=PSvCt{GDWwXE+TB85VIyXE-?R_qy~(*} zlAKv0x8XP=M=&$hrJcFO3W;dT%h#%h1UhaxT1Vn#*V`H+Z%ZMLo{Ck>Na`9K)8-sg zan`u5|6=4eFpbn|Q)1{0aXECLpBx@}jbrk&Q$+VO9GrFQh_X_s$g+EriH3eAjFkO< zG*s;O>2Vnn8;{4J{~}X$Ti);gqr04#+CeqDa0xQLaGMAIc&O7GU4ox zSijbPC-_eU{#JlPLRJxZ#0)2f_y7=a7^lcdKxNeUSbC+cxl9e(0cEcpIWyFWg>Gvy zIKOgP1E0N*m7BmkYvor-Sp{F9K8HP>YyTM=z|xTNY+8KeL^u@Ka|@={E9dsAk9{=Z z#&8{yRfKJpLk+`!4H6WKc)$^-8k1avOBfU_kKN=NO9mVq+SyuYJ|!z?-J@HL-;8Pw z)7H<7_z_4)*TVL&|0QX+Mt~k)5Jg@yr_9BthgN)XxCEOe1m&Z{qKGFh2tOVB-%wcH z@FcgC$dS^3@IktzJ(3Eg1=qiuh)bz+I+4BV6fOMhJdIC_?zgxemvR|P356G^`jj}o z;U4U|WX{79bhU&}kO{vj$jqJCX)cFP`(Xhc?}Wpf!T7rR&q46V-~!mP50z|8v^hr_ z=gqwltC&5k(sr(S%P5au9+Mcl&qC%x$XL1UU5vcX)G*Wc0KW@uh$XnwJ!IRM4yeE^ zvrlhus*5lYy$gb(j)c*)%@|Y-0uW_tBw2>F3|-vVTAz}B7s$mbw|Tk~7z45Ch@k{t zIV$!)Q|2BjqzjkYg~EFhp^YI2&&IU^l?r+no^g0sZZ18dCgYuc3(ahCAD|hre!;CCczEfeaUKfignw_qNH$95!lBVv6TG{d}~^< zlf(U2d8N_h>=v@E&w@9;!2FnJS~q46I(o5P=@6HPH+n66S68>o5BsOPHM0}6Y4c$O z;c@Zk-8%GphXE*pcze8IpJnj4Ocj|&e4lmvg40NR_(8Z|7{PU$<=ftBw|+WZRgtU* z9n3^r21o1=-#Wgz5|^+TDHvz?F;AYmWiGv%(Je+l4PmttcUm%25!BHm(d@`#tkqQm z{Q%bPbq)o7i3z80<9pq47oKWwy;-UoGz18a@-fY4LghkZW-$bvJ)tK;b(N0P;(w6Z zh!iyji8eJ`n}+oGSO|jGt|xn=O~S(KOZHo8^$&J8NL!NGtv81&#R6wGnK^1;^TVL6W)$1!y$m?>BAiC-j)DKjUrT-nqLr?JyaXWa2^yk^M1$Gx z(fU&NG(N=Mx6+8Tx8ZlfDsSOas41bPYjdHxHZu-*)DHE?SrZ>=4j>K1zgO8Vn$Yf| z^yYyX&9pi)s^C3nhw4m0MC9BAf6P#0(xR>$UW(LHEZPI;bls(%^$4q_Lpzk1#y)wj zbzq+xyd1IBJJ$YrddE(;U3>4BB-Uq)Ey42QW|Xm$()O}+#XSVheg1Xc)Zu%+w<`*K zyM$u@08En$5;UW!CSSrnE5^r9KT7IhWd|L6C-H$QI!02fa|V$=c_g1l3$EVFpR}06 zFTI;n&mq+<&s4f7*_L32fPA>q<404$-fYhO&@c+05nSM`RfYKm=z{+i3Yo=}<*D{o zlFU+u=qGnNQjf000Lr~M2=tn@t@b@2g0+~@31tsh32z8iv(+Q2zf|8Vi8fXD<-!m7 z?mm~iwJsNA)G{DVY~+^$rM39`*MCHkIN6y0LG2lV>Y?u0O|8m#v(da@Q=jyP7Er%r zY4)}@5cSHldPrWsYS`!OOZj%gH8MdvwPS7<&l(@*nqR?sQ;&4!`sjC;f5nag1(q^^ zvR-`P<(NchgpwW* zjmK7a9j{NuK+6POe@0&1a;hCJc`YB9rIGn};&@U5`DF9UM36&Y{rO)59Nsl7+iDbi zSFZ5^7S)oi{;9nT-r<^EkG#0?TbFa6w!?6|tI!Em`D7)H5>|2R<^RbVy>@L%qBAER!)_%Kyo9MslmtPK@S(*Q~OJjqnhU zLjwcxs5Mo#rtgzYLMrLp0EvI7{}ma1D&`(f0kBn|EX+c<`qd@w!~XPMSNKKKBC4S& z50N-&ZeX43hNRh6y4AljinNZW!N|649SW7Y+R@om-&NDo(-ST9VG#ZggkA!p=ylj@ zr-dE0jK@I-9M;dY#>vvsqv@n6QT1J~Vq_hUq=`7|P+=X1+2P=>cC*oi{lADWanr#g zHvc?raZ5Z;nnrMgfSQUtXU1i^8>9U}Rx&l85x3$xZb#01Z|_ejNPtqm1b3ZsW&;XM z{X0#!Vmd_~oLRd)H*j2Ru&GoH-TUjBM^?!gRO+zM`QjGYp?`z^rC9;{*KA~@ALy~B Ka-pJm;Qs(_j&MBy literal 0 HcmV?d00001 diff --git a/docs/src/reference-dsl-builtin-functions.md b/docs/src/reference-dsl-builtin-functions.md index 6e7845cc6..051c89ea2 100644 --- a/docs/src/reference-dsl-builtin-functions.md +++ b/docs/src/reference-dsl-builtin-functions.md @@ -74,7 +74,7 @@ is 2. Unary operators such as `!` and `~` show argument-count of 1; the ternary * [**Hashing functions**](#hashing-functions): [md5](#md5), [sha1](#sha1), [sha256](#sha256), [sha512](#sha512). * [**Higher-order-functions functions**](#higher-order-functions-functions): [any](#any), [apply](#apply), [every](#every), [fold](#fold), [reduce](#reduce), [select](#select), [sort](#sort). * [**Math functions**](#math-functions): [abs](#abs), [acos](#acos), [acosh](#acosh), [asin](#asin), [asinh](#asinh), [atan](#atan), [atan2](#atan2), [atanh](#atanh), [cbrt](#cbrt), [ceil](#ceil), [cos](#cos), [cosh](#cosh), [erf](#erf), [erfc](#erfc), [exp](#exp), [expm1](#expm1), [floor](#floor), [invqnorm](#invqnorm), [log](#log), [log10](#log10), [log1p](#log1p), [logifit](#logifit), [max](#max), [min](#min), [qnorm](#qnorm), [round](#round), [roundm](#roundm), [sgn](#sgn), [sin](#sin), [sinh](#sinh), [sqrt](#sqrt), [tan](#tan), [tanh](#tanh), [urand](#urand), [urand32](#urand32), [urandelement](#urandelement), [urandint](#urandint), [urandrange](#urandrange). -* [**String functions**](#string-functions): [capitalize](#capitalize), [clean_whitespace](#clean_whitespace), [collapse_whitespace](#collapse_whitespace), [format](#format), [gssub](#gssub), [gsub](#gsub), [lstrip](#lstrip), [regextract](#regextract), [regextract_or_else](#regextract_or_else), [rstrip](#rstrip), [ssub](#ssub), [strip](#strip), [strlen](#strlen), [sub](#sub), [substr](#substr), [substr0](#substr0), [substr1](#substr1), [tolower](#tolower), [toupper](#toupper), [truncate](#truncate), [unformat](#unformat), [unformatx](#unformatx), [\.](#dot). +* [**String functions**](#string-functions): [capitalize](#capitalize), [clean_whitespace](#clean_whitespace), [collapse_whitespace](#collapse_whitespace), [format](#format), [gssub](#gssub), [gsub](#gsub), [latin1_to_utf8](#latin1_to_utf8), [lstrip](#lstrip), [regextract](#regextract), [regextract_or_else](#regextract_or_else), [rstrip](#rstrip), [ssub](#ssub), [strip](#strip), [strlen](#strlen), [sub](#sub), [substr](#substr), [substr0](#substr0), [substr1](#substr1), [tolower](#tolower), [toupper](#toupper), [truncate](#truncate), [unformat](#unformat), [unformatx](#unformatx), [utf8_to_latin1](#utf8_to_latin1), [\.](#dot). * [**System functions**](#system-functions): [hostname](#hostname), [os](#os), [system](#system), [version](#version). * [**Time functions**](#time-functions): [dhms2fsec](#dhms2fsec), [dhms2sec](#dhms2sec), [fsec2dhms](#fsec2dhms), [fsec2hms](#fsec2hms), [gmt2localtime](#gmt2localtime), [gmt2sec](#gmt2sec), [hms2fsec](#hms2fsec), [hms2sec](#hms2sec), [localtime2gmt](#localtime2gmt), [localtime2sec](#localtime2sec), [sec2dhms](#sec2dhms), [sec2gmt](#sec2gmt), [sec2gmtdate](#sec2gmtdate), [sec2hms](#sec2hms), [sec2localdate](#sec2localdate), [sec2localtime](#sec2localtime), [strftime](#strftime), [strftime_local](#strftime_local), [strptime](#strptime), [strptime_local](#strptime_local), [systime](#systime), [systimeint](#systimeint), [uptime](#uptime). * [**Typing functions**](#typing-functions): [asserting_absent](#asserting_absent), [asserting_array](#asserting_array), [asserting_bool](#asserting_bool), [asserting_boolean](#asserting_boolean), [asserting_empty](#asserting_empty), [asserting_empty_map](#asserting_empty_map), [asserting_error](#asserting_error), [asserting_float](#asserting_float), [asserting_int](#asserting_int), [asserting_map](#asserting_map), [asserting_nonempty_map](#asserting_nonempty_map), [asserting_not_array](#asserting_not_array), [asserting_not_empty](#asserting_not_empty), [asserting_not_map](#asserting_not_map), [asserting_not_null](#asserting_not_null), [asserting_null](#asserting_null), [asserting_numeric](#asserting_numeric), [asserting_present](#asserting_present), [asserting_string](#asserting_string), [is_absent](#is_absent), [is_array](#is_array), [is_bool](#is_bool), [is_boolean](#is_boolean), [is_empty](#is_empty), [is_empty_map](#is_empty_map), [is_error](#is_error), [is_float](#is_float), [is_int](#is_int), [is_map](#is_map), [is_nan](#is_nan), [is_nonempty_map](#is_nonempty_map), [is_not_array](#is_not_array), [is_not_empty](#is_not_empty), [is_not_map](#is_not_map), [is_not_null](#is_not_null), [is_null](#is_null), [is_numeric](#is_numeric), [is_present](#is_present), [is_string](#is_string), [typeof](#typeof). @@ -1012,6 +1012,15 @@ gsub("prefix4529:suffix8567", "(....ix)([0-9]+)", "[\1 : \2]") gives "[prefix : +### latin1_to_utf8 +

+latin1_to_utf8  (class=string #args=1) Tries to convert Latin-1-encoded string to UTF-8-encoded string. If argument is array or map, recurses into it.
+Examples:
+$y = latin1_to_utf8($x)
+$* = latin1_to_utf8($*)
+
+ + ### lstrip
 lstrip  (class=string #args=1) Strip leading whitespace from string.
@@ -1130,6 +1139,15 @@ is_error(unformatx("{}h{}m{}s", "3:47:22")) gives true.
 
+### utf8_to_latin1 +
+utf8_to_latin1  (class=string #args=1) Tries to convert UTF-8-encoded string to Latin-1-encoded string. If argument is array or map, recurses into it.
+Examples:
+$y = utf8_to_latin1($x)
+$* = utf8_to_latin1($*)
+
+ + ### \. diff --git a/docs/src/reference-verbs.md b/docs/src/reference-verbs.md index 2b48162e5..7a6b753ee 100644 --- a/docs/src/reference-verbs.md +++ b/docs/src/reference-verbs.md @@ -1873,6 +1873,39 @@ Alice 56 missing Carol 45 present +## latin1-to-utf8 + +
+mlr latin1-to-utf8 -h
+
+
+Usage: mlr latin1-to-utf8, with no options.
+Recursively converts record strings from Latin-1 to UTF-8.
+For field-level control, please see the latin1_to_utf8 DSL function.
+Options:
+-h|--help Show this message.
+
+ +![pix/latin1-to-utf8.png](pix/latin1-to-utf8.png) + +## utf8-to-latin1 + +
+mlr utf8-to-latin1 -h
+
+
+Usage: mlr utf8-to-latin1, with no options.
+Recursively converts record strings from Latin-1 to UTF-8.
+For field-level control, please see the utf8_to_latin1 DSL function.
+Options:
+-h|--help Show this message.
+
+ +In this example, the English and German pangrams are convertible from UTF-8 to Latin-1, but the +Russian one is not: + +![pix/utf8-to-latin1.png](pix/utf8-to-latin1.png) + ## least-frequent
diff --git a/docs/src/reference-verbs.md.in b/docs/src/reference-verbs.md.in
index 96df0f9f7..7bc8b6ee2 100644
--- a/docs/src/reference-verbs.md.in
+++ b/docs/src/reference-verbs.md.in
@@ -615,6 +615,25 @@ GENMD-RUN-COMMAND
 mlr --icsv --implicit-csv-header --opprint label name,age,status data/headerless.csv
 GENMD-EOF
 
+## latin1-to-utf8
+
+GENMD-RUN-COMMAND
+mlr latin1-to-utf8 -h
+GENMD-EOF
+
+![pix/latin1-to-utf8.png](pix/latin1-to-utf8.png)
+
+## utf8-to-latin1
+
+GENMD-RUN-COMMAND
+mlr utf8-to-latin1 -h
+GENMD-EOF
+
+In this example, the English and German pangrams are convertible from UTF-8 to Latin-1, but the
+Russian one is not:
+
+![pix/utf8-to-latin1.png](pix/utf8-to-latin1.png)
+
 ## least-frequent
 
 GENMD-RUN-COMMAND
diff --git a/docs/src/special-symbols-and-formatting.md b/docs/src/special-symbols-and-formatting.md
index e1d39b7a6..c84301d59 100644
--- a/docs/src/special-symbols-and-formatting.md
+++ b/docs/src/special-symbols-and-formatting.md
@@ -170,6 +170,8 @@ The
 [`gssub`](reference-dsl-builtin-functions.md#gssub)
 functions exist precisely for this reason: so you don't have to escape anything.
 
+## Latin-1 and UTF-8 character encodings
+
 The `ssub` and `gssub` functions are also handy for dealing with non-UTF-8 strings such as Latin 1, since Go's
 `regexp` library -- which Miller uses -- requires UTF-8 strings. For example:
 
@@ -186,6 +188,24 @@ The `ssub` and `gssub` functions are also handy for dealing with non-UTF-8 strin
 Kaðlín og Þormundr
 
+More generally, though, we have the DSL functions +[`latin1_to_utf8`](reference-dsl-builtin-functions.md#latin1_to_utf8) and +[`utf8_to_latin1`](reference-dsl-builtin-functions.md#utf8_to_latin1) +and the verbs +[`latin1-to-utf8`](reference-verbs.md#latin1-to-utf8) and +[`utf8-to-latin1`](reference-verbs.md#utf8-to-latin1). The former let you fix encodings on a field-by-field +level; the latter, for all records (with less keystroking). (Latin 1 is also known as +[ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1).) + +In this example, all the inputs are convertible from Latin-1 to UTF-8: + +![pix/latin1-to-utf8.png](pix/latin1-to-utf8.png) + +In this example, the English and German pangrams are convertible from UTF-8 to Latin-1, but the +Russian one is not: + +![pix/utf8-to-latin1.png](pix/utf8-to-latin1.png) + ## How to apply math to regex output? * Use parentheses for capture groups diff --git a/docs/src/special-symbols-and-formatting.md.in b/docs/src/special-symbols-and-formatting.md.in index f7e249c54..ff8971805 100644 --- a/docs/src/special-symbols-and-formatting.md.in +++ b/docs/src/special-symbols-and-formatting.md.in @@ -94,6 +94,8 @@ The [`gssub`](reference-dsl-builtin-functions.md#gssub) functions exist precisely for this reason: so you don't have to escape anything. +## Latin-1 and UTF-8 character encodings + The `ssub` and `gssub` functions are also handy for dealing with non-UTF-8 strings such as Latin 1, since Go's `regexp` library -- which Miller uses -- requires UTF-8 strings. For example: @@ -107,6 +109,24 @@ mlr -n put 'end { }' GENMD-EOF +More generally, though, we have the DSL functions +[`latin1_to_utf8`](reference-dsl-builtin-functions.md#latin1_to_utf8) and +[`utf8_to_latin1`](reference-dsl-builtin-functions.md#utf8_to_latin1) +and the verbs +[`latin1-to-utf8`](reference-verbs.md#latin1-to-utf8) and +[`utf8-to-latin1`](reference-verbs.md#utf8-to-latin1). The former let you fix encodings on a field-by-field +level; the latter, for all records (with less keystroking). (Latin 1 is also known as +[ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1).) + +In this example, all the inputs are convertible from Latin-1 to UTF-8: + +![pix/latin1-to-utf8.png](pix/latin1-to-utf8.png) + +In this example, the English and German pangrams are convertible from UTF-8 to Latin-1, but the +Russian one is not: + +![pix/utf8-to-latin1.png](pix/utf8-to-latin1.png) + ## How to apply math to regex output? * Use parentheses for capture groups diff --git a/internal/pkg/bifs/base.go b/internal/pkg/bifs/base.go index 500a84103..700cfab26 100644 --- a/internal/pkg/bifs/base.go +++ b/internal/pkg/bifs/base.go @@ -202,9 +202,33 @@ func _more(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval { return mlrval.FromInt(1) } -// recuriseBinaryFuncOnInput1 is for fmtifnum and other functions which apply themselves recursively +// recurseUnaryFuncOnInput1 is for BIF_latin1_to_utf8 and other functions which apply themselves +// recursively on array/map inputs. +func recurseUnaryFuncOnInput1(unaryFunc UnaryFunc, input1 *mlrval.Mlrval) *mlrval.Mlrval { + if input1.IsArray() { + inputArray := input1.GetArray() + lib.InternalCodingErrorIf(inputArray == nil) + outputArray := make([]*mlrval.Mlrval, len(inputArray)) + for i := range inputArray { + outputArray[i] = unaryFunc(inputArray[i]) + } + return mlrval.FromArray(outputArray) + } else if input1.IsMap() { + inputMap := input1.GetMap() + lib.InternalCodingErrorIf(inputMap == nil) + outputMap := mlrval.NewMlrmap() + for pe := inputMap.Head; pe != nil; pe = pe.Next { + outputMap.PutReference(pe.Key, unaryFunc(pe.Value)) + } + return mlrval.FromMap(outputMap) + } else { + return unaryFunc(input1) + } +} + +// recurseBinaryFuncOnInput1 is for fmtifnum and other functions which apply themselves recursively // on array/map inputs. -func recuriseBinaryFuncOnInput1(binaryFunc BinaryFunc, input1, input2 *mlrval.Mlrval) *mlrval.Mlrval { +func recurseBinaryFuncOnInput1(binaryFunc BinaryFunc, input1, input2 *mlrval.Mlrval) *mlrval.Mlrval { if input1.IsArray() { inputArray := input1.GetArray() lib.InternalCodingErrorIf(inputArray == nil) @@ -222,6 +246,6 @@ func recuriseBinaryFuncOnInput1(binaryFunc BinaryFunc, input1, input2 *mlrval.Ml } return mlrval.FromMap(outputMap) } else { - return fmtnum_dispositions[input1.Type()][input2.Type()](input1, input2) + return binaryFunc(input1, input2) } } diff --git a/internal/pkg/bifs/strings.go b/internal/pkg/bifs/strings.go index def2d9349..f30d0fd0f 100644 --- a/internal/pkg/bifs/strings.go +++ b/internal/pkg/bifs/strings.go @@ -418,7 +418,7 @@ var fmtnum_dispositions = [mlrval.MT_DIM][mlrval.MT_DIM]BinaryFunc{ func BIF_fmtnum(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval { if input1.IsArray() || input1.IsMap() { - return recuriseBinaryFuncOnInput1(BIF_fmtnum, input1, input2) + return recurseBinaryFuncOnInput1(BIF_fmtnum, input1, input2) } else { return fmtnum_dispositions[input1.Type()][input2.Type()](input1, input2) } @@ -426,7 +426,7 @@ func BIF_fmtnum(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval { func BIF_fmtifnum(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval { if input1.IsArray() || input1.IsMap() { - return recuriseBinaryFuncOnInput1(BIF_fmtifnum, input1, input2) + return recurseBinaryFuncOnInput1(BIF_fmtifnum, input1, input2) } else { output := fmtnum_dispositions[input1.Type()][input2.Type()](input1, input2) if output.IsError() { @@ -436,3 +436,37 @@ func BIF_fmtifnum(input1, input2 *mlrval.Mlrval) *mlrval.Mlrval { } } } + +func BIF_latin1_to_utf8(input1 *mlrval.Mlrval) *mlrval.Mlrval { + if input1.IsArray() || input1.IsMap() { + return recurseUnaryFuncOnInput1(BIF_latin1_to_utf8, input1) + } else if input1.IsString() { + output, err := lib.TryLatin1ToUTF8(input1.String()) + if err != nil { + // Somewhat arbitrary design decision + // return input1 + return mlrval.ERROR + } else { + return mlrval.FromString(output) + } + } else { + return input1 + } +} + +func BIF_utf8_to_latin1(input1 *mlrval.Mlrval) *mlrval.Mlrval { + if input1.IsArray() || input1.IsMap() { + return recurseUnaryFuncOnInput1(BIF_utf8_to_latin1, input1) + } else if input1.IsString() { + output, err := lib.TryUTF8ToLatin1(input1.String()) + if err != nil { + // Somewhat arbitrary design decision + // return input1 + return mlrval.ERROR + } else { + return mlrval.FromString(output) + } + } else { + return input1 + } +} diff --git a/internal/pkg/dsl/cst/builtin_function_manager.go b/internal/pkg/dsl/cst/builtin_function_manager.go index 07d065f10..e23012ac9 100644 --- a/internal/pkg/dsl/cst/builtin_function_manager.go +++ b/internal/pkg/dsl/cst/builtin_function_manager.go @@ -598,6 +598,30 @@ with type-inference. On non-match, returns error -- use is_error() to check.`, binaryFunc: bifs.BIF_unformatx, }, + { + name: "latin1_to_utf8", + class: FUNC_CLASS_STRING, + help: `Tries to convert Latin-1-encoded string to UTF-8-encoded string. +If argument is array or map, recurses into it.`, + examples: []string{ + `$y = latin1_to_utf8($x)`, + `$* = latin1_to_utf8($*)`, + }, + unaryFunc: bifs.BIF_latin1_to_utf8, + }, + + { + name: "utf8_to_latin1", + class: FUNC_CLASS_STRING, + help: `Tries to convert UTF-8-encoded string to Latin-1-encoded string. +If argument is array or map, recurses into it.`, + examples: []string{ + `$y = utf8_to_latin1($x)`, + `$* = utf8_to_latin1($*)`, + }, + unaryFunc: bifs.BIF_utf8_to_latin1, + }, + // ---------------------------------------------------------------- // FUNC_CLASS_HASHING diff --git a/internal/pkg/dsl/cst/builtin_functions.go b/internal/pkg/dsl/cst/builtin_functions.go index eb8ec1912..65b86023b 100644 --- a/internal/pkg/dsl/cst/builtin_functions.go +++ b/internal/pkg/dsl/cst/builtin_functions.go @@ -507,7 +507,7 @@ func (node *DotCallsiteNode) Evaluate( // Case 1: map.attribute as shorthand for map["attribute"] value2 := mapvalue1.Get(node.string2) if value2 == nil { - return mlrval.ABSENT.StrictModeCheck(state.StrictMode, "map access [" + node.string2 + "]") + return mlrval.ABSENT.StrictModeCheck(state.StrictMode, "map access ["+node.string2+"]") } else { return value2 } diff --git a/internal/pkg/dsl/cst/evaluable.go b/internal/pkg/dsl/cst/evaluable.go index 82e1e063e..d46cab5b1 100644 --- a/internal/pkg/dsl/cst/evaluable.go +++ b/internal/pkg/dsl/cst/evaluable.go @@ -129,7 +129,7 @@ func (node *IndirectFieldValueNode) Evaluate( os.Exit(1) } if value == nil { - return mlrval.ABSENT.StrictModeCheck(state.StrictMode, "$[" + fieldName.String() + "]") + return mlrval.ABSENT.StrictModeCheck(state.StrictMode, "$["+fieldName.String()+"]") } return value } @@ -164,7 +164,7 @@ func (node *IndirectOosvarValueNode) Evaluate( value := state.Oosvars.Get(oosvarName.String()) if value == nil { - return mlrval.ABSENT.StrictModeCheck(state.StrictMode, "@[" + oosvarName.String() + "]") + return mlrval.ABSENT.StrictModeCheck(state.StrictMode, "@["+oosvarName.String()+"]") } return value diff --git a/internal/pkg/lib/latin1.go b/internal/pkg/lib/latin1.go new file mode 100644 index 000000000..121a267d3 --- /dev/null +++ b/internal/pkg/lib/latin1.go @@ -0,0 +1,38 @@ +package lib + +import ( + "bytes" + "fmt" + "unicode/utf8" +) + +func TryLatin1ToUTF8(input string) (string, error) { + var buffer bytes.Buffer + for _, b := range []byte(input) { + // 0x00-0xff map to 0x0000-0xffff + buffer.WriteRune(rune(b)) + } + output := buffer.String() + return output, nil +} + +func TryUTF8ToLatin1(input string) (string, error) { + var buffer bytes.Buffer + + bytes := []byte(input) + for len(bytes) > 0 { + r, size := utf8.DecodeRune(bytes) + + if r < 0x0080 { + buffer.WriteByte(byte(r)) + } else if r >= 0x80 && r <= 0x00ff { + buffer.WriteByte(byte(r)) + } else { + return "", fmt.Errorf("character 0x%08x (%v) is not encodable as Latin-1", int(r), r) + } + + bytes = bytes[size:] + } + output := buffer.String() + return output, nil +} diff --git a/internal/pkg/lib/latin1_test.go b/internal/pkg/lib/latin1_test.go new file mode 100644 index 000000000..947d0f042 --- /dev/null +++ b/internal/pkg/lib/latin1_test.go @@ -0,0 +1,100 @@ +// ================================================================ +// Most Miller tests (thousands of them) are command-line-driven via +// mlr regtest. Here are some cases needing special focus. +// ================================================================ + +package lib + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +type tDataForLatin1 struct { + input string + expectedOutput string + expectError bool +} + +var dataForLatin1ToUTF8 = []tDataForLatin1{ + { + "", + "", + false, + }, + { + "The quick brown fox jumped over the lazy dogs.", + "The quick brown fox jumped over the lazy dogs.", + false, + }, + { + "a\xe4o\xf6", + "a\xc3\xa4o\xc3\xb6", // "aäoö" -- showing explicitly here "\u00e4" encodes as "\xc3\xa4" + false, + }, + { + "Victor jagt zw\xf6lf Boxk\xe4mpfer quer \xfcber den gro\xdfen Sylter Deich", + "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich", + false, + }, +} + +var dataForUTF8ToLatin1 = []tDataForLatin1{ + { + "", + "", + false, + }, + { + "The quick brown fox jumped over the lazy dogs.", + "The quick brown fox jumped over the lazy dogs.", + false, + }, + { + "a\xc3\xa4o\xc3\xb6", // "aäoö" -- showing explicitly here "\u00e4" encodes as "\xc3\xa4" + "a\xe4o\xf6", + false, + }, + { + "Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich", + "Victor jagt zw\xf6lf Boxk\xe4mpfer quer \xfcber den gro\xdfen Sylter Deich", + false, + }, + { + "Съешь же ещё этих мягких французских булок да выпей чаю", + "", + true, + }, +} + +func TestLatin1ToUTF8(t *testing.T) { + for i, entry := range dataForLatin1ToUTF8 { + actualOutput, err := TryLatin1ToUTF8(entry.input) + if entry.expectError { + assert.NotNil(t, err) + } else { + assert.Nil(t, err) + } + if actualOutput != entry.expectedOutput { + t.Fatalf("case %d input \"%s\" expected \"%s\" got \"%s\"\n", + i, entry.input, entry.expectedOutput, actualOutput, + ) + } + } +} + +func TestUTF8ToLatin1(t *testing.T) { + for i, entry := range dataForUTF8ToLatin1 { + actualOutput, err := TryUTF8ToLatin1(entry.input) + if entry.expectError { + assert.NotNil(t, err) + } else { + assert.Nil(t, err) + } + if actualOutput != entry.expectedOutput { + t.Fatalf("case %d input \"%s\" expected \"%s\" got \"%s\"\n", + i, entry.input, entry.expectedOutput, actualOutput, + ) + } + } +} diff --git a/internal/pkg/mlrval/mlrval_get.go b/internal/pkg/mlrval/mlrval_get.go index cdf9775f9..038e8933c 100644 --- a/internal/pkg/mlrval/mlrval_get.go +++ b/internal/pkg/mlrval/mlrval_get.go @@ -147,7 +147,7 @@ func (mv *Mlrval) AssertNumeric() { _ = mv.GetNumericToFloatValueOrDie() } -func (mv *Mlrval) StrictModeCheck(strictMode bool, description string) *Mlrval{ +func (mv *Mlrval) StrictModeCheck(strictMode bool, description string) *Mlrval { if strictMode && mv.IsAbsent() { fmt.Fprintf(os.Stderr, "mlr: %s is absent and strict mode was requested.\n", description) os.Exit(1) diff --git a/internal/pkg/transformers/aaa_transformer_table.go b/internal/pkg/transformers/aaa_transformer_table.go index 463b745a4..848d24883 100644 --- a/internal/pkg/transformers/aaa_transformer_table.go +++ b/internal/pkg/transformers/aaa_transformer_table.go @@ -39,6 +39,8 @@ var TRANSFORMER_LOOKUP_TABLE = []TransformerSetup{ JSONStringifySetup, JoinSetup, LabelSetup, + Latin1ToUTF8Setup, + UTF8ToLatin1Setup, LeastFrequentSetup, MergeFieldsSetup, MostFrequentSetup, diff --git a/internal/pkg/transformers/latin1_to_utf8.go b/internal/pkg/transformers/latin1_to_utf8.go new file mode 100644 index 000000000..9ba7602f9 --- /dev/null +++ b/internal/pkg/transformers/latin1_to_utf8.go @@ -0,0 +1,122 @@ +package transformers + +import ( + "container/list" + "fmt" + "os" + "strings" + + "github.com/johnkerl/miller/internal/pkg/cli" + "github.com/johnkerl/miller/internal/pkg/lib" + "github.com/johnkerl/miller/internal/pkg/mlrval" + "github.com/johnkerl/miller/internal/pkg/types" +) + +// ---------------------------------------------------------------- +const verbNameLatin1ToUTF8 = "latin1-to-utf8" + +var Latin1ToUTF8Setup = TransformerSetup{ + Verb: verbNameLatin1ToUTF8, + UsageFunc: transformerLatin1ToUTF8Usage, + ParseCLIFunc: transformerLatin1ToUTF8ParseCLI, + IgnoresInput: false, +} + +func transformerLatin1ToUTF8Usage( + o *os.File, + doExit bool, + exitCode int, +) { + fmt.Fprintf(o, "Usage: %s %s, with no options.\n", "mlr", verbNameLatin1ToUTF8) + fmt.Fprintf(o, "Recursively converts record strings from Latin-1 to UTF-8.\n") + fmt.Fprintf(o, "For field-level control, please see the latin1_to_utf8 DSL function.\n") + fmt.Fprintf(o, "Options:\n") + fmt.Fprintf(o, "-h|--help Show this message.\n") + if doExit { + os.Exit(exitCode) + } +} + +func transformerLatin1ToUTF8ParseCLI( + pargi *int, + argc int, + args []string, + _ *cli.TOptions, + doConstruct bool, // false for first pass of CLI-parse, true for second pass +) IRecordTransformer { + + // Skip the verb name from the current spot in the mlr command line + argi := *pargi + argi++ + + for argi < argc /* variable increment: 1 or 2 depending on flag */ { + opt := args[argi] + if !strings.HasPrefix(opt, "-") { + break // No more flag options to process + } + if args[argi] == "--" { + break // All transformers must do this so main-flags can follow verb-flags + } + argi++ + + if opt == "-h" || opt == "--help" { + transformerLatin1ToUTF8Usage(os.Stdout, true, 0) + + } else { + transformerLatin1ToUTF8Usage(os.Stderr, true, 1) + } + } + + *pargi = argi + if !doConstruct { // All transformers must do this for main command-line parsing + return nil + } + + transformer, err := NewTransformerLatin1ToUTF8() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + return transformer +} + +// ---------------------------------------------------------------- +type TransformerLatin1ToUTF8 struct { +} + +func NewTransformerLatin1ToUTF8() (*TransformerLatin1ToUTF8, error) { + tr := &TransformerLatin1ToUTF8{} + return tr, nil +} + +// ---------------------------------------------------------------- + +func (tr *TransformerLatin1ToUTF8) Transform( + inrecAndContext *types.RecordAndContext, + outputRecordsAndContexts *list.List, // list of *types.RecordAndContext + inputDownstreamDoneChannel <-chan bool, + outputDownstreamDoneChannel chan<- bool, +) { + HandleDefaultDownstreamDone(inputDownstreamDoneChannel, outputDownstreamDoneChannel) + if !inrecAndContext.EndOfStream { + inrec := inrecAndContext.Record + + for pe := inrec.Head; pe != nil; pe = pe.Next { + inval := pe.Value + if inval.IsString() { + output, err := lib.TryLatin1ToUTF8(pe.Value.String()) + if err == nil { + pe.Value = mlrval.FromString(output) + } else { + pe.Value = mlrval.ERROR + } + } + } + + outputRecordsAndContexts.PushBack(types.NewRecordAndContext(inrec, &inrecAndContext.Context)) + + } else { // end of record stream + outputRecordsAndContexts.PushBack(inrecAndContext) + } +} diff --git a/internal/pkg/transformers/utf8_to_latin1.go b/internal/pkg/transformers/utf8_to_latin1.go new file mode 100644 index 000000000..d83fd227f --- /dev/null +++ b/internal/pkg/transformers/utf8_to_latin1.go @@ -0,0 +1,122 @@ +package transformers + +import ( + "container/list" + "fmt" + "os" + "strings" + + "github.com/johnkerl/miller/internal/pkg/cli" + "github.com/johnkerl/miller/internal/pkg/lib" + "github.com/johnkerl/miller/internal/pkg/mlrval" + "github.com/johnkerl/miller/internal/pkg/types" +) + +// ---------------------------------------------------------------- +const verbNameUTF8ToLatin1 = "utf8-to-latin1" + +var UTF8ToLatin1Setup = TransformerSetup{ + Verb: verbNameUTF8ToLatin1, + UsageFunc: transformerUTF8ToLatin1Usage, + ParseCLIFunc: transformerUTF8ToLatin1ParseCLI, + IgnoresInput: false, +} + +func transformerUTF8ToLatin1Usage( + o *os.File, + doExit bool, + exitCode int, +) { + fmt.Fprintf(o, "Usage: %s %s, with no options.\n", "mlr", verbNameUTF8ToLatin1) + fmt.Fprintf(o, "Recursively converts record strings from Latin-1 to UTF-8.\n") + fmt.Fprintf(o, "For field-level control, please see the utf8_to_latin1 DSL function.\n") + fmt.Fprintf(o, "Options:\n") + fmt.Fprintf(o, "-h|--help Show this message.\n") + if doExit { + os.Exit(exitCode) + } +} + +func transformerUTF8ToLatin1ParseCLI( + pargi *int, + argc int, + args []string, + _ *cli.TOptions, + doConstruct bool, // false for first pass of CLI-parse, true for second pass +) IRecordTransformer { + + // Skip the verb name from the current spot in the mlr command line + argi := *pargi + argi++ + + for argi < argc /* variable increment: 1 or 2 depending on flag */ { + opt := args[argi] + if !strings.HasPrefix(opt, "-") { + break // No more flag options to process + } + if args[argi] == "--" { + break // All transformers must do this so main-flags can follow verb-flags + } + argi++ + + if opt == "-h" || opt == "--help" { + transformerUTF8ToLatin1Usage(os.Stdout, true, 0) + + } else { + transformerUTF8ToLatin1Usage(os.Stderr, true, 1) + } + } + + *pargi = argi + if !doConstruct { // All transformers must do this for main command-line parsing + return nil + } + + transformer, err := NewTransformerUTF8ToLatin1() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + return transformer +} + +// ---------------------------------------------------------------- +type TransformerUTF8ToLatin1 struct { +} + +func NewTransformerUTF8ToLatin1() (*TransformerUTF8ToLatin1, error) { + tr := &TransformerUTF8ToLatin1{} + return tr, nil +} + +// ---------------------------------------------------------------- + +func (tr *TransformerUTF8ToLatin1) Transform( + inrecAndContext *types.RecordAndContext, + outputRecordsAndContexts *list.List, // list of *types.RecordAndContext + inputDownstreamDoneChannel <-chan bool, + outputDownstreamDoneChannel chan<- bool, +) { + HandleDefaultDownstreamDone(inputDownstreamDoneChannel, outputDownstreamDoneChannel) + if !inrecAndContext.EndOfStream { + inrec := inrecAndContext.Record + + for pe := inrec.Head; pe != nil; pe = pe.Next { + inval := pe.Value + if inval.IsString() { + output, err := lib.TryUTF8ToLatin1(pe.Value.String()) + if err == nil { + pe.Value = mlrval.FromString(output) + } else { + pe.Value = mlrval.ERROR + } + } + } + + outputRecordsAndContexts.PushBack(types.NewRecordAndContext(inrec, &inrecAndContext.Context)) + + } else { // end of record stream + outputRecordsAndContexts.PushBack(inrecAndContext) + } +} diff --git a/man/manpage.txt b/man/manpage.txt index ae13d1f77..90f7c91ba 100644 --- a/man/manpage.txt +++ b/man/manpage.txt @@ -29,7 +29,7 @@ DESCRIPTION insertion-ordered hash map. This encompasses a variety of data formats, including but not limited to the familiar CSV, TSV, and JSON. (Miller can handle positionally-indexed data as a special case.) This - manpage documents mlr 6.2.0. + manpage documents mlr 6.2.0-dev. EXAMPLES mlr --icsv --opprint cat example.csv @@ -171,11 +171,11 @@ VERB LIST altkv bar bootstrap cat check clean-whitespace count-distinct count count-similar cut decimate fill-down fill-empty filter flatten format-values fraction gap grep group-by group-like having-fields head histogram json-parse - json-stringify join label least-frequent merge-fields most-frequent nest - nothing put regularize remove-empty-columns rename reorder repeat reshape - sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records sort - sort-within-records split stats1 stats2 step tac tail tee template top - unflatten uniq unsparsify + json-stringify join label latin1-to-utf8 utf8-to-latin1 least-frequent + merge-fields most-frequent nest nothing put regularize remove-empty-columns + rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle + skip-trivial-records sort sort-within-records split stats1 stats2 step tac + tail tee template top unflatten uniq unsparsify FUNCTION LIST abs acos acosh any append apply arrayify asin asinh asserting_absent @@ -191,16 +191,17 @@ FUNCTION LIST is_absent is_array is_bool is_boolean is_empty is_empty_map is_error is_float is_int is_map is_nan is_nonempty_map is_not_array is_not_empty is_not_map is_not_null is_null is_numeric is_present is_string joink joinkv joinv - json_parse json_stringify leafcount length localtime2gmt localtime2sec log - log10 log1p logifit lstrip madd mapdiff mapexcept mapselect mapsum max md5 - mexp min mmul msub os pow qnorm reduce regextract regextract_or_else round - roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms sec2localdate sec2localtime - select sgn sha1 sha256 sha512 sin sinh sort splita splitax splitkv splitkvx - splitnv splitnvx sqrt ssub strftime strftime_local string strip strlen - strptime strptime_local sub substr substr0 substr1 system systime systimeint - tan tanh tolower toupper truncate typeof unflatten unformat unformatx uptime - urand urand32 urandelement urandint urandrange version ! != !=~ % & && * ** + - - . .* .+ .- ./ / // < << <= <=> == =~ > >= >> >>> ?: ?? ??? ^ ^^ | || ~ + json_parse json_stringify latin1_to_utf8 leafcount length localtime2gmt + localtime2sec log log10 log1p logifit lstrip madd mapdiff mapexcept mapselect + mapsum max md5 mexp min mmul msub os pow qnorm reduce regextract + regextract_or_else round roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms + sec2localdate sec2localtime select sgn sha1 sha256 sha512 sin sinh sort splita + splitax splitkv splitkvx splitnv splitnvx sqrt ssub strftime strftime_local + string strip strlen strptime strptime_local sub substr substr0 substr1 system + systime systimeint tan tanh tolower toupper truncate typeof unflatten unformat + unformatx uptime urand urand32 urandelement urandint urandrange utf8_to_latin1 + version ! != !=~ % & && * ** + - . .* .+ .- ./ / // < << <= <=> == =~ > >= >> + >>> ?: ?? ??? ^ ^^ | || ~ COMMENTS-IN-DATA FLAGS Miller lets you put comments in your data, such as @@ -1298,6 +1299,20 @@ VERBS Options: -h|--help Show this message. + latin1-to-utf8 + Usage: mlr latin1-to-utf8, with no options. + Recursively converts record strings from Latin-1 to UTF-8. + For field-level control, please see the latin1_to_utf8 DSL function. + Options: + -h|--help Show this message. + + utf8-to-latin1 + Usage: mlr utf8-to-latin1, with no options. + Recursively converts record strings from Latin-1 to UTF-8. + For field-level control, please see the utf8_to_latin1 DSL function. + Options: + -h|--help Show this message. + least-frequent Usage: mlr least-frequent [options] Shows the least frequently occurring distinct values for specified field names. @@ -2342,6 +2357,12 @@ FUNCTIONS FOR FILTER/PUT json_stringify (class=collections #args=1,2) Converts value to JSON-formatted string. Default output is single-line. With optional second boolean argument set to true, produces multiline output. + latin1_to_utf8 + (class=string #args=1) Tries to convert Latin-1-encoded string to UTF-8-encoded string. If argument is array or map, recurses into it. + Examples: + $y = latin1_to_utf8($x) + $* = latin1_to_utf8($*) + leafcount (class=collections #args=1) Counts total number of terminal values in map/array. For single-level map/array, same as length. @@ -2673,6 +2694,12 @@ FUNCTIONS FOR FILTER/PUT urandrange (class=math #args=2) Floating-point numbers uniformly distributed on the interval [a, b). + utf8_to_latin1 + (class=string #args=1) Tries to convert UTF-8-encoded string to Latin-1-encoded string. If argument is array or map, recurses into it. + Examples: + $y = utf8_to_latin1($x) + $* = utf8_to_latin1($*) + version (class=system #args=0) Returns the Miller version as a string. @@ -3174,4 +3201,4 @@ SEE ALSO - 2022-03-19 MILLER(1) + 2022-03-20 MILLER(1) diff --git a/man/mlr.1 b/man/mlr.1 index f8d8fb9ab..8561a3659 100644 --- a/man/mlr.1 +++ b/man/mlr.1 @@ -2,12 +2,12 @@ .\" Title: mlr .\" Author: [see the "AUTHOR" section] .\" Generator: ./mkman.rb -.\" Date: 2022-03-19 +.\" Date: 2022-03-20 .\" Manual: \ \& .\" Source: \ \& .\" Language: English .\" -.TH "MILLER" "1" "2022-03-19" "\ \&" "\ \&" +.TH "MILLER" "1" "2022-03-20" "\ \&" "\ \&" .\" ----------------------------------------------------------------- .\" * Portability definitions .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -47,7 +47,7 @@ on integer-indexed fields: if the natural data structure for the latter is the array, then Miller's natural data structure is the insertion-ordered hash map. This encompasses a variety of data formats, including but not limited to the familiar CSV, TSV, and JSON. (Miller can handle positionally-indexed data as -a special case.) This manpage documents mlr 6.2.0. +a special case.) This manpage documents mlr 6.2.0-dev. .SH "EXAMPLES" .sp @@ -212,11 +212,11 @@ for all things with "map" in their names. altkv bar bootstrap cat check clean-whitespace count-distinct count count-similar cut decimate fill-down fill-empty filter flatten format-values fraction gap grep group-by group-like having-fields head histogram json-parse -json-stringify join label least-frequent merge-fields most-frequent nest -nothing put regularize remove-empty-columns rename reorder repeat reshape -sample sec2gmtdate sec2gmt seqgen shuffle skip-trivial-records sort -sort-within-records split stats1 stats2 step tac tail tee template top -unflatten uniq unsparsify +json-stringify join label latin1-to-utf8 utf8-to-latin1 least-frequent +merge-fields most-frequent nest nothing put regularize remove-empty-columns +rename reorder repeat reshape sample sec2gmtdate sec2gmt seqgen shuffle +skip-trivial-records sort sort-within-records split stats1 stats2 step tac +tail tee template top unflatten uniq unsparsify .fi .if n \{\ .RE @@ -238,16 +238,17 @@ gmt2sec gssub gsub haskey hexfmt hms2fsec hms2sec hostname int invqnorm is_absent is_array is_bool is_boolean is_empty is_empty_map is_error is_float is_int is_map is_nan is_nonempty_map is_not_array is_not_empty is_not_map is_not_null is_null is_numeric is_present is_string joink joinkv joinv -json_parse json_stringify leafcount length localtime2gmt localtime2sec log -log10 log1p logifit lstrip madd mapdiff mapexcept mapselect mapsum max md5 -mexp min mmul msub os pow qnorm reduce regextract regextract_or_else round -roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms sec2localdate sec2localtime -select sgn sha1 sha256 sha512 sin sinh sort splita splitax splitkv splitkvx -splitnv splitnvx sqrt ssub strftime strftime_local string strip strlen -strptime strptime_local sub substr substr0 substr1 system systime systimeint -tan tanh tolower toupper truncate typeof unflatten unformat unformatx uptime -urand urand32 urandelement urandint urandrange version ! != !=~ % & && * ** + -- . .* .+ .- ./ / // < << <= <=> == =~ > >= >> >>> ?: ?? ??? ^ ^^ | || ~ +json_parse json_stringify latin1_to_utf8 leafcount length localtime2gmt +localtime2sec log log10 log1p logifit lstrip madd mapdiff mapexcept mapselect +mapsum max md5 mexp min mmul msub os pow qnorm reduce regextract +regextract_or_else round roundm rstrip sec2dhms sec2gmt sec2gmtdate sec2hms +sec2localdate sec2localtime select sgn sha1 sha256 sha512 sin sinh sort splita +splitax splitkv splitkvx splitnv splitnvx sqrt ssub strftime strftime_local +string strip strlen strptime strptime_local sub substr substr0 substr1 system +systime systimeint tan tanh tolower toupper truncate typeof unflatten unformat +unformatx uptime urand urand32 urandelement urandint urandrange utf8_to_latin1 +version ! != !=~ % & && * ** + - . .* .+ .- ./ / // < << <= <=> == =~ > >= >> +>>> ?: ?? ??? ^ ^^ | || ~ .fi .if n \{\ .RE @@ -1626,6 +1627,32 @@ have the respective name. (Fields past the nth are left with their original names.) Particularly useful with --inidx or --implicit-csv-header, to give useful names to otherwise integer-indexed fields. +Options: +-h|--help Show this message. +.fi +.if n \{\ +.RE +.SS "latin1-to-utf8" +.if n \{\ +.RS 0 +.\} +.nf +Usage: mlr latin1-to-utf8, with no options. +Recursively converts record strings from Latin-1 to UTF-8. +For field-level control, please see the latin1_to_utf8 DSL function. +Options: +-h|--help Show this message. +.fi +.if n \{\ +.RE +.SS "utf8-to-latin1" +.if n \{\ +.RS 0 +.\} +.nf +Usage: mlr utf8-to-latin1, with no options. +Recursively converts record strings from Latin-1 to UTF-8. +For field-level control, please see the utf8_to_latin1 DSL function. Options: -h|--help Show this message. .fi @@ -3445,6 +3472,18 @@ joinv({"a":3,"b":4,"c":5}, ",") = "3,4,5" .fi .if n \{\ .RE +.SS "latin1_to_utf8" +.if n \{\ +.RS 0 +.\} +.nf + (class=string #args=1) Tries to convert Latin-1-encoded string to UTF-8-encoded string. If argument is array or map, recurses into it. +Examples: +$y = latin1_to_utf8($x) +$* = latin1_to_utf8($*) +.fi +.if n \{\ +.RE .SS "leafcount" .if n \{\ .RS 0 @@ -4256,6 +4295,18 @@ Int-valued example: '$n=floor(20+urand()*11)'. .fi .if n \{\ .RE +.SS "utf8_to_latin1" +.if n \{\ +.RS 0 +.\} +.nf + (class=string #args=1) Tries to convert UTF-8-encoded string to Latin-1-encoded string. If argument is array or map, recurses into it. +Examples: +$y = utf8_to_latin1($x) +$* = utf8_to_latin1($*) +.fi +.if n \{\ +.RE .SS "version" .if n \{\ .RS 0 diff --git a/test/cases/cli-help/0001/expout b/test/cases/cli-help/0001/expout index b5724e8f2..65e52b571 100644 --- a/test/cases/cli-help/0001/expout +++ b/test/cases/cli-help/0001/expout @@ -481,6 +481,22 @@ useful names to otherwise integer-indexed fields. Options: -h|--help Show this message. +================================================================ +latin1-to-utf8 +Usage: mlr latin1-to-utf8, with no options. +Recursively converts record strings from Latin-1 to UTF-8. +For field-level control, please see the latin1_to_utf8 DSL function. +Options: +-h|--help Show this message. + +================================================================ +utf8-to-latin1 +Usage: mlr utf8-to-latin1, with no options. +Recursively converts record strings from Latin-1 to UTF-8. +For field-level control, please see the utf8_to_latin1 DSL function. +Options: +-h|--help Show this message. + ================================================================ least-frequent Usage: mlr least-frequent [options] diff --git a/test/cases/dsl-latin1/0001/cmd b/test/cases/dsl-latin1/0001/cmd new file mode 100644 index 000000000..34b2574a2 --- /dev/null +++ b/test/cases/dsl-latin1/0001/cmd @@ -0,0 +1 @@ +mlr --xtab --from ${CASEDIR}/input put -f ${CASEDIR}/mlr diff --git a/test/cases/dsl-latin1/0001/experr b/test/cases/dsl-latin1/0001/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/dsl-latin1/0001/expout b/test/cases/dsl-latin1/0001/expout new file mode 100644 index 000000000..0b71aef17 --- /dev/null +++ b/test/cases/dsl-latin1/0001/expout @@ -0,0 +1,15 @@ +x The quick brown fox jumped over the lazy dogs. +y The quick brown fox jumped over the lazy dogs. +z The quick brown fox jumped over the lazy dogs. + +x Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. +y Victor jagt zwlf Boxkmpfer quer ber den groen Sylter Deich. +z Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. + +x Съешь же ещё этих мягких французских булок да выпей чаю. +y (error) +z (error) + +x This¹ is² it³. +y This is it. +z This¹ is² it³. diff --git a/test/cases/dsl-latin1/0001/input b/test/cases/dsl-latin1/0001/input new file mode 100644 index 000000000..3b597cd70 --- /dev/null +++ b/test/cases/dsl-latin1/0001/input @@ -0,0 +1,7 @@ +x The quick brown fox jumped over the lazy dogs. + +x Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. + +x Съешь же ещё этих мягких французских булок да выпей чаю. + +x This¹ is² it³. diff --git a/test/cases/dsl-latin1/0001/mlr b/test/cases/dsl-latin1/0001/mlr new file mode 100644 index 000000000..a26683338 --- /dev/null +++ b/test/cases/dsl-latin1/0001/mlr @@ -0,0 +1,2 @@ +$y = utf8_to_latin1($x); +$z = latin1_to_utf8($y); diff --git a/test/cases/dsl-latin1/0002/cmd b/test/cases/dsl-latin1/0002/cmd new file mode 100644 index 000000000..34b2574a2 --- /dev/null +++ b/test/cases/dsl-latin1/0002/cmd @@ -0,0 +1 @@ +mlr --xtab --from ${CASEDIR}/input put -f ${CASEDIR}/mlr diff --git a/test/cases/dsl-latin1/0002/experr b/test/cases/dsl-latin1/0002/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/dsl-latin1/0002/expout b/test/cases/dsl-latin1/0002/expout new file mode 100644 index 000000000..ec6c2e346 --- /dev/null +++ b/test/cases/dsl-latin1/0002/expout @@ -0,0 +1,7 @@ +x The quick brown fox jumped over the lazy dogs. + +x Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. + +x (error) + +x This¹ is² it³. diff --git a/test/cases/dsl-latin1/0002/input b/test/cases/dsl-latin1/0002/input new file mode 100644 index 000000000..3b597cd70 --- /dev/null +++ b/test/cases/dsl-latin1/0002/input @@ -0,0 +1,7 @@ +x The quick brown fox jumped over the lazy dogs. + +x Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. + +x Съешь же ещё этих мягких французских булок да выпей чаю. + +x This¹ is² it³. diff --git a/test/cases/dsl-latin1/0002/mlr b/test/cases/dsl-latin1/0002/mlr new file mode 100644 index 000000000..cee468f70 --- /dev/null +++ b/test/cases/dsl-latin1/0002/mlr @@ -0,0 +1,2 @@ +$* = utf8_to_latin1($*); +$* = latin1_to_utf8($*); diff --git a/test/cases/verb-latin1-to-utf8/0001/cmd b/test/cases/verb-latin1-to-utf8/0001/cmd new file mode 100644 index 000000000..366fdb73d --- /dev/null +++ b/test/cases/verb-latin1-to-utf8/0001/cmd @@ -0,0 +1 @@ +mlr --xtab --from test/input/latin1.xtab latin1-to-utf8 diff --git a/test/cases/verb-latin1-to-utf8/0001/experr b/test/cases/verb-latin1-to-utf8/0001/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-latin1-to-utf8/0001/expout b/test/cases/verb-latin1-to-utf8/0001/expout new file mode 100644 index 000000000..d453b3fd6 --- /dev/null +++ b/test/cases/verb-latin1-to-utf8/0001/expout @@ -0,0 +1,5 @@ +x The quick brown fox jumped over the lazy dogs. + +x Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. + +x This¹ is² it³. diff --git a/test/cases/verb-utf8-to-latin1/0001/cmd b/test/cases/verb-utf8-to-latin1/0001/cmd new file mode 100644 index 000000000..141212006 --- /dev/null +++ b/test/cases/verb-utf8-to-latin1/0001/cmd @@ -0,0 +1 @@ +mlr --xtab --from test/input/utf8.xtab utf8-to-latin1 diff --git a/test/cases/verb-utf8-to-latin1/0001/experr b/test/cases/verb-utf8-to-latin1/0001/experr new file mode 100644 index 000000000..e69de29bb diff --git a/test/cases/verb-utf8-to-latin1/0001/expout b/test/cases/verb-utf8-to-latin1/0001/expout new file mode 100644 index 000000000..34e9d3802 --- /dev/null +++ b/test/cases/verb-utf8-to-latin1/0001/expout @@ -0,0 +1,7 @@ +x The quick brown fox jumped over the lazy dogs. + +x Victor jagt zwlf Boxkmpfer quer ber den groen Sylter Deich. + +x (error) + +x This is it. diff --git a/test/input/latin1.xtab b/test/input/latin1.xtab new file mode 100644 index 000000000..c445437c1 --- /dev/null +++ b/test/input/latin1.xtab @@ -0,0 +1,5 @@ +x The quick brown fox jumped over the lazy dogs. + +x Victor jagt zwlf Boxkmpfer quer ber den groen Sylter Deich. + +x This is it. diff --git a/test/input/utf8.xtab b/test/input/utf8.xtab new file mode 100644 index 000000000..3b597cd70 --- /dev/null +++ b/test/input/utf8.xtab @@ -0,0 +1,7 @@ +x The quick brown fox jumped over the lazy dogs. + +x Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich. + +x Съешь же ещё этих мягких французских булок да выпей чаю. + +x This¹ is² it³.