From 4c4e51830fe2333c2c79b7507992723f237c4bac Mon Sep 17 00:00:00 2001 From: Steve Brown Date: Sat, 24 Oct 2026 02:28:52 -0400 Subject: [PATCH] docs(examples): add the hand-authored Stiwi portrait --- examples/stiwi/README.md | 48 +++++++++++ examples/stiwi/stiwi-hand-32-preview.png | Bin 0 -> 8308 bytes examples/stiwi/stiwi-hand-32.png | Bin 0 -> 1792 bytes examples/stiwi/stiwi-hand-32.pxl | 86 +++++++++++++++++++ examples/stiwi/stiwi-hand-48-preview.png | Bin 0 -> 10654 bytes examples/stiwi/stiwi-hand-48.png | Bin 0 -> 3251 bytes examples/stiwi/stiwi-hand-48.pxl | 101 +++++++++++++++++++++++ tests/stiwi_example.rs | 35 ++++++++ 8 files changed, 270 insertions(+) create mode 100644 examples/stiwi/README.md create mode 100644 examples/stiwi/stiwi-hand-32-preview.png create mode 100644 examples/stiwi/stiwi-hand-32.png create mode 100644 examples/stiwi/stiwi-hand-32.pxl create mode 100644 examples/stiwi/stiwi-hand-48-preview.png create mode 100644 examples/stiwi/stiwi-hand-48.png create mode 100644 examples/stiwi/stiwi-hand-48.pxl create mode 100644 tests/stiwi_example.rs diff --git a/examples/stiwi/README.md b/examples/stiwi/README.md new file mode 100644 index 0000000..f9cee7e --- /dev/null +++ b/examples/stiwi/README.md @@ -0,0 +1,48 @@ +# Stiwi: a hand-authored semantic portrait + +![48-pixel portrait of Stiwi](stiwi-hand-48-preview.png) + +Authored by **GPT-6.1-Sol running in Codex (model as declared by the +harness)**. This records the selected model; it is not an independent +attestation of the backend. Pixelsrc rendered the artwork. + +The model placed every palette colour and geometric region by hand while +looking at a photo reference. There was no image import, quantizer or tracing. +The reference photo is intentionally not included or linked here. + +The portrait went through **six revisions with human feedback**: softening the +side hair, curving the moustache, exposing a small philtrum, and closing a gap +in the right forelock. Named palette tokens, semantic roles and relationships, +and layered `rect`, `union`, `points`, `line` and `stroke` regions make those +changes editable rather than requiring a new pixel grid. + +| Variant | Editable source | Native render | Nearest-neighbour preview | +| --- | --- | --- | --- | +| Detailed, 48 × 48 | [source](stiwi-hand-48.pxl) | [PNG](stiwi-hand-48.png) | [528 × 528](stiwi-hand-48-preview.png) | +| Compact, 32 × 32 | [source](stiwi-hand-32.pxl) | [PNG](stiwi-hand-32.png) | [512 × 512](stiwi-hand-32-preview.png) | + +The 48-pixel portrait is independently authored, not an enlargement of the +32-pixel study. + +## A renderer bug found during the revisions + +A three-pixel forelock exposed that semantic `line` regions ignored their +`thickness`, including inside a `union`. [PR #25](https://github.com/scbrown/pixelsrc/pull/25) +fixed the renderer and added PNG/mask regression coverage. These examples +require a build containing that fix. + +## Validate and render + +From this directory, using `pxl` built from the repository: + +```sh +pxl validate --strict stiwi-hand-48.pxl +pxl validate --strict stiwi-hand-32.pxl +pxl render stiwi-hand-48.pxl --strict --scale 1 -o stiwi-hand-48.png +pxl render stiwi-hand-48.pxl --strict --scale 11 -o stiwi-hand-48-preview.png +pxl render stiwi-hand-32.pxl --strict --scale 1 -o stiwi-hand-32.png +pxl render stiwi-hand-32.pxl --strict --scale 16 -o stiwi-hand-32-preview.png +``` + +`cargo test --test stiwi_example` validates both sources strictly and compares +all four newly rendered PNGs with the saved artwork. diff --git a/examples/stiwi/stiwi-hand-32-preview.png b/examples/stiwi/stiwi-hand-32-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..f06455e48a41aeee71e9ca69cd7fe67b6eed4754 GIT binary patch literal 8308 zcmdT~3vd(H6?H;`Q>bw>givBwH%(G^LWoLQaHxHoxaG_&)Vami}vz4z8U-|JNVW-JUo-U z%EDM!nRl)z`}`>xLXmm$+YiP65RLJ&P}T()ms{)36^MIZL5Us8i`dL~pkf=|1BJw~ zE8W9;s*>0XjOB}C15lm_A8=h!y|v7>Dzhzpj2(>4?JcSpBBhM}&IUnWUH9z9Zq`1i zYp+$Q1Cr<^9hk(q71~C|5--#%vye!ar|&Kd(jNPMbdl$mh=t}(v9Xhe#u{N9y9eul z$>-4q9usASxfYqApWl1pmWR)2R_oV@vfQq;+(S4e`Pf5Y_%Cnr{?w==MeX9${!=hl z3u`$GDT=Vrn!Wjgu2Q_P{tN=PimRpxO~V(OF2n{JSa)nv5}#&wR3`9_6s{npeWgq5p3FM^f`0mo zv7y2Vhfmz}!f;y3t&TH8?8u0ev$OW&OrXUBf9pT1f^4}skv#_)(J7c-PzOwhv>P4V zYzNaeKrSYYa%HYwrk}A%4OikvIY%=G;|2XTrwN{h0)xxXJOY#vo;RMwO1mEpfg%w; zWAM$BGN9&Q#4uQVPN^3TS-5jeKtZh`mT6#PFafAU zXSTMEv1o*L$sNv7pVnT_SR(UwB`9zx{1rAi|7*nLYY$BO-w$5=nhj9yRu{_UEb0iHP2ZW04*}nAkoW;|yR_1f`HIN&}az;*WtU9TT-@VXa1> zN-ZiN28X_y0%PQ4Sm=gSKIaIjVZGpyY>Nf@HxJ!3-j|37az4biejz2K<*}M><#fHQ zJ*XritV7A~yvbcao#C7(N1{n4HxnF8YjwORtMR6?yYM681r2KAViw{&>~M&hdCw3} z#^H?asj!{UJNkljb!>pOmqIt~A$y{-LZ$XWg~`89jmt=?8RWg3Gmnf~&=XuPsF{w8 z;#)yuTExQ8#(QXDg`?U!6&NCs(o|;jGB&Gl#g29<6d`HY86OTx)Trf|1~^q&g|_&fyVI`Adf2{a zB)UUjrNEgq3O|TWtAgYnNZxAG<)mW);Hq->5PB>&4^7$orkq76DZ16-yC^0+Q#5!+ z;;)eRF}9PRF=%Tp=Lf}Ilb^EUB@&{vrUu)ewY4R!NOYm?XNRxRTOS8X%*? zlvxsgegQ^vnEw)?%!su>Uu~5l>Mg{TBg#^^netuH+m~7jLCP-{ zd0&&ngGiWUWiK+8SqVbbboP_6yNg`yT|?DkZ(QiGqlgM;LUq%U`RF}Lr7I95#}i%O zk8lSXTvwSKXZN2>K)G;UsoxT{Ee`wz30f%M^@IIvMy1Q-Wrss}ph`ziNvxPCaL#y% z6!CC`M=sQgBMw1#BUlwPw`HK29gJmu4iw+1KTs^P(b=|K>eY-aW4f%k@*C@|qg>|g z)9bJ$d&4dsB1Sv5F4ttBzYGe6!=13Ba|hZ}ZdXXQL<-EV(bCC=3%yD8Hl~ z*_;1D4q5_pfQmN^FF}mWVa4x>vJo@?A~sCAi_G(3ceGX#7q=-#RA2);J9wO{>_Ghx zUghi#UmNzwFsazVHm1*yQ9M7{h$u0Uv8mX-xXs=%+!IS%|jwuCF$Eb+61PNpLs_6Ksp-4RGi+QxpCF u4E~<1R_fa|W9-{wP5IHg?c_Vte)|*Ehn2pI_-}%k#fuaROJ03z`@aArF;(aQ literal 0 HcmV?d00001 diff --git a/examples/stiwi/stiwi-hand-32.png b/examples/stiwi/stiwi-hand-32.png new file mode 100644 index 0000000000000000000000000000000000000000..8261655eaa617a483879ce3776a44ef2d753eab0 GIT binary patch literal 1792 zcmYLKe^3)=8s3z{SUHFeLz!!6(qgB~RBdW)rAo-!R)_PbaCg=^mMQU$KWvMa6jEhF zLVieVv}ki3PjOTNqvIh%1sSW*60!*>p#qH-6)ZXO3lg9tyPL%9CcD|aZ02TeX1{ND z-sj!-`JU(9clP9;E6TFhJii72fb89W-1*nk{Y7@IUX|Jvjg3(NSY_Y6^PLYMPSBds z@$!LlqZrc=Iz2YgSzlh$^N-ov|GPdtWjgn#Ueg;}3PbUu{hu}d+fY*bs8_NOgI{Nk z!L$MNx_noqEBheMHHxpMi!>#oiB9bj87X|X@`t2o0(J*oD@jNrsGmCGMD|I8XXAQd z{8Pc=6dX-*prw3OUN!J4vkHk-$R~xgO&E!mggEYl+W_>R7khk&NzJcnG3Bpoycg8| zt@=d2_9pJrv&F>sr;q_d^8#Qk7ki(hLqGNR-C9(32$`=CcV_iomcmYQXFNX^u7EOcNpB`ThNKf9&!ea86#)*uB=p@mqruyk;Dq)|1r7|yf z54{1R>%mDFC}ov9?6dF_l7q^S=wtIl-#XoIa`W;0`A`Ys^TAK^0cdQ`H0HFdR9SR^ zX15eIXi>ZQnuW@6{a)AUs^bA{Ws}BUDo%c*g2-YOXyPqPnGqp&tY9OT1*obtl&Zr) zQ-*jlceLYsgfi23rFsfc+$fm&CC-Fy#{c^&;ji0Eun`t@~kyk3MkGwN9kl#bgtdDE_C*3DgmMwxUNfY#UIXvi2b`ghI#_XBwe~* z4O8r9Lj#ucLdu|;(L~EJeQ)F!^-~h&?2U@O$Iqx8#$+K#XSr;OmmrCR$%Wgl?{c_G z<6GyJH%VK`An1`3voOVtwWGyOB*E|XXvj)}Psc=zK3PO%hmIvaoVR(hgzXKoBnTj*4aQf*A*qLter#$t|_bb&y1C6 z$zE)I`%{?{X_ExFgrC>6K2(e}%jx^Y-ewrvpB5RySp(BzTxg5dW~)C~`yevSpk-oU z;fRaM121x+l?~2eA46?D-nF?P6#3dXpf|`I@sSp^0WUz~uEb4s#9R~?q!*uMQ4 z_oUS0p?>{OZol9H!aM>O*yaF>J<7Es9?77JYxeWa8+kfYJt;jO2(wh_VdIYLx7fET zWe6rgtRi}*vYzh1lt}WpdbELgwe$8GAi#T`7fnY-M06$+`&RyQF%f)<~jC8$d3sEHT-*DNzEZcPulMv5)DMnVt1_VE>SzNR_7l#Kld>3KDA5V(x$L}7H9%DsWKeS|!ZiTu;VN?>gKp4TlXFC#^puGF0nBtid@TLk zKUxJXHyH!c9SghA8?{^GELR9$EGzwzOO}eMxY! z6pCIE3@cPdT*;NtHDK$0=uzt-{FA$ZrUfo0>Y$&3)H=~vr^eQz-6(+uY6aHa!yYf`8BMn0ijtdU;Oa?Wyzhay4|Y6#vsG!XlBi#S-P%`V`&&z=7G zsPRL<%y5Ue+DLpm;>Z&p)w&1>lst09ncQ93xpPNX)eQYc0t?I914j5dKwr zEG*8oMe0%#OtAsjKc{lk!v;z0D(7v>X0Ce{ULXkzlGtoXUWC``aHze({hP%@&Xj&s zm*|sEBtt{^Mtn|nE?<}ElA-}8f>Lb&D=iSXeZ`lS#Y$#B8)Ebl93QktzATcofpoY1 zru|47hv)agZin)f=-4zQ7n@~ literal 0 HcmV?d00001 diff --git a/examples/stiwi/stiwi-hand-32.pxl b/examples/stiwi/stiwi-hand-32.pxl new file mode 100644 index 0000000..d8596e3 --- /dev/null +++ b/examples/stiwi/stiwi-hand-32.pxl @@ -0,0 +1,86 @@ +// Stiwi, hand-drawn from the GitHub photograph. 32px icon study. +// Every contour, highlight and grey beard strand below is an authored shape. +// No raster input, import, quantizer, generated grid or per-pixel tracing. +{ + type: "palette", name: "stiwi-hand-32", + colors: { + background: "#acb894", "background-light": "#dce3cd", "background-leaf": "#83976c", + shirt: "#263d60", "shirt-shadow": "#1b2a45", collar: "#3d5475", + hair: "#302e30", "hair-swoop": "#302e30", "hair-shadow": "#24252a", "hair-wave": "#514a48", "hair-silver": "#8b8580", + skin: "#bc947b", "skin-under-nose": "#bc947b", "skin-light": "#d5af91", "skin-shadow": "#966f60", "skin-warm": "#c49a7d", + beard: "#393435", "beard-shadow": "#292a2d", "beard-mid": "#615b56", "beard-grey": "#96958a", "beard-white": "#c5c2b3", + moustache: "#4c4038", "moustache-grey": "#96958a", mouth: "#664b40", lip: "#ae816b", teeth: "#d9c8a6", + "eye-white": "#c9bcaa", iris: "#626963", pupil: "#343738", + frame: "#2c3036", "frame-light": "#7b7e78", "lens-glint": "#b0b9ab" + }, + roles: { + background: "fill", "background-light": "highlight", "background-leaf": "shadow", + shirt: "fill", "shirt-shadow": "shadow", collar: "boundary", + hair: "fill", "hair-swoop": "fill", "hair-shadow": "shadow", "hair-wave": "highlight", "hair-silver": "highlight", + skin: "fill", "skin-under-nose": "fill", "skin-light": "highlight", "skin-shadow": "shadow", "skin-warm": "fill", + beard: "fill", "beard-shadow": "shadow", "beard-mid": "highlight", "beard-grey": "highlight", "beard-white": "highlight", + moustache: "anchor", "moustache-grey": "highlight", mouth: "anchor", lip: "fill", teeth: "anchor", + "eye-white": "fill", iris: "anchor", pupil: "anchor", frame: "boundary", "frame-light": "highlight", "lens-glint": "highlight" + }, + relationships: { + "skin-light": {type: "derives-from", target: "skin"}, + "skin-shadow": {type: "derives-from", target: "skin"}, + "hair-wave": {type: "derives-from", target: "hair"}, + "beard-grey": {type: "derives-from", target: "beard"}, + "shirt-shadow": {type: "derives-from", target: "shirt"} + } +} +{ + type: "sprite", name: "stiwi-hand-32", size: [32,32], palette: "stiwi-hand-32", + regions: { + background: {rect: [0,0,32,32], z: 0}, + "background-light": {union: [{rect: [0,0,9,10], round: 3},{rect: [25,0,7,16], round: 3},{rect: [0,18,5,8], round: 2}], z: 1}, + "background-leaf": {union: [{rect: [0,11,5,7], round: 2},{rect: [28,21,4,7], round: 2}], z: 2}, + shirt: {union: [{rect: [0,30,32,2]},{rect: [3,28,26,4]},{rect: [7,26,18,6]}], z: 5}, + "shirt-shadow": {union: [{rect: [8,26,16,6]},{line: [[1,31],[6,29],[8,28]]}], z: 6}, + collar: {union: [{line: [[6,28],[10,27],[13,31]]},{line: [[25,28],[22,27],[20,31]]},{stroke: [10,29,12,3]}], z: 7}, + // Wavy crown with a high, off-centre swept forelock and long side hair. + hair: {union: [{rect: [9,2,14,10], round: 4},{rect: [13,1,8,7], round: 3},{rect: [8,4,17,9], round: 3}, + // Alternate one-pixel curls and notches; narrow locks finish at the ears. + {rect: [7,7,5,12]},{rect: [6,8,3,3]},{rect: [5,11,4,2]},{rect: [6,13,3,3]},{rect: [5,16,4,2]},{rect: [6,18,3,2]},{rect: [8,20,2,2]}, + {rect: [22,8,4,11]},{rect: [25,9,2,2]},{rect: [24,11,4,2]},{rect: [25,14,2,2]},{rect: [24,16,4,2]},{rect: [24,18,2,2]},{rect: [23,20,2,1]}, + {points: [[5,14],[4,16],[27,15],[26,19]]}], z: 10}, + "hair-shadow": {union: [{line: [[7,10],[6,12],[7,15],[6,17],[8,20]]},{line: [[24,11],[26,12],[25,15],[26,17],[24,20]]},{rect: [17,3,4,6], round: 2}], z: 11}, + // Exposed forehead, cheeks and small ear lobes. + skin: {union: [{rect: [9,7,14,17], round: 4},{rect: [8,13,2,6], round: 1},{rect: [23,13,2,6], round: 1}], z: 20}, + "skin-light": {union: [{rect: [11,8,7,4], round: 1},{rect: [10,16,3,3], round: 1},{line: [[16,14],[16,17]]}], z: 21}, + "skin-shadow": {union: [{line: [[22,10],[22,17],[23,19]], thickness: 1},{line: [[9,17],[10,20]]},{points: [[8,15],[24,15],[18,17],[15,18]]}], z: 22}, + "skin-warm": {union: [{rect: [13,16,3,3]},{rect: [17,16,3,3]},{points: [[16,18],[17,17]]}], z: 23}, + // An extra right-hand forelock covers the bare upper temple. + "hair-swoop": {line: [[20,7],[21,9],[23,11],[25,11]], thickness: 3, z: 24}, + // Hair sweeps over the forehead without flattening the open face. + "hair-wave": {union: [{line: [[8,9],[9,6],[12,4],[15,4]]},{line: [[14,3],[16,2],[19,3],[20,6],[22,8],[25,8]]},{line: [[8,12],[7,13],[8,15]]},{line: [[7,17],[8,19]]},{line: [[25,13],[26,14],[25,16],[26,17],[24,19]]},{line: [[21,8],[22,9],[24,10]]}], z: 25}, + "hair-silver": {union: [{line: [[8,8],[9,6],[11,5]]},{points: [[13,3],[18,2],[22,7],[6,12],[7,16],[8,19],[26,12],[25,17],[24,20]]}], z: 26}, + "eye-white": {union: [{rect: [11,13,3,1]},{rect: [19,13,3,1]}], z: 30}, + iris: {points: [[12,13],[20,13]], z: 31}, + pupil: {points: [[12,14],[20,14]], z: 32}, + // Full beard tapers below the jaw; it is not a dark rectangular mouth. + beard: {union: [{rect: [8,18,16,7], round: 2},{rect: [9,23,14,5], round: 2},{rect: [11,27,10,3]},{rect: [13,29,6,2]}], z: 40}, + "beard-shadow": {union: [{line: [[9,20],[9,24],[12,28],[14,30]]},{line: [[23,20],[23,24],[21,28],[18,30]]},{rect: [14,26,4,3]}], z: 41}, + "beard-mid": {union: [{line: [[10,22],[11,25],[13,27]]},{line: [[22,22],[21,25],[20,27]]},{line: [[13,23],[14,26],[14,29]]},{line: [[18,23],[18,26],[17,29]]}], z: 42}, + "beard-grey": {union: [{line: [[12,24],[13,26],[13,29]]},{line: [[16,24],[15,27],[16,30]]},{line: [[20,23],[19,26],[19,28]]},{points: [[10,21],[22,21],[11,24],[21,25],[18,29]]}], z: 43}, + "beard-white": {points: [[13,25],[14,28],[16,26],[16,29],[18,27],[20,24]], z: 44}, + // Restore rev 3 cheeks; retain only a one-pixel central philtrum. + "skin-under-nose": {rect: [16,18,1,2], z: 49}, + // Open smile, modest teeth and moustache parted around the nose. + mouth: {union: [{rect: [12,20,9,2], round: 1},{line: [[12,20],[14,22],[18,22],[21,20]]}], z: 50}, + teeth: {rect: [15,21,3,1], z: 51}, + lip: {line: [[14,22],[18,22],[20,21]], z: 52}, + moustache: {union: [ + {rect: [13,18,2,2]},{rect: [18,18,2,2]}, + {line: [[13,19],[11,20],[10,22],[9,23]]}, + {line: [[19,19],[21,20],[21,22],[22,23]]}, + {points: [[12,19],[11,21],[10,23],[20,19],[22,21],[21,23]]}, + {rect: [12,20,9,1]}], z: 53}, + "moustache-grey": {points: [[13,18],[11,20],[10,22],[19,19],[21,21]], z: 54}, + // Thin round metal frames, rather than thick square sunglasses. + frame: {union: [{line: [[8,13],[9,11],[12,11],[14,13],[14,15],[12,17],[10,17],[8,15],[8,13]]},{line: [[18,13],[19,11],[22,11],[24,13],[24,15],[22,17],[20,17],[18,15],[18,13]]},{line: [[15,12],[17,12]]},{line: [[6,12],[8,12]]},{line: [[25,12],[26,13]]}], z: 60}, + "frame-light": {points: [[10,17],[11,17],[20,17],[21,17],[8,14],[24,14]], z: 61}, + "lens-glint": {points: [[10,12],[19,12]], z: 62} + } +} diff --git a/examples/stiwi/stiwi-hand-48-preview.png b/examples/stiwi/stiwi-hand-48-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..db05230295cc4f4c4281f5305b384e4d8f665ad1 GIT binary patch literal 10654 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 literal 0 HcmV?d00001 diff --git a/examples/stiwi/stiwi-hand-48.png b/examples/stiwi/stiwi-hand-48.png new file mode 100644 index 0000000000000000000000000000000000000000..1db1b766fca1f2d6f9b689ea0e57d38908da46f6 GIT binary patch literal 3251 zcmYjU3se(V8lDg}Dne>oq&^63-4WiSLNg!k* z)`B9YU0cyo6S{82maS8lYM|r+Dn>yWTScfuCJ>V#NM1uSnPf8AnW2w8Cz;pH{l5SI zzW@Gra`5%_xk)qU%>)1-Y3-j^ze$~6q`%XrQOAM=yb1tjm91U9>MaFpyq(?fhj))% z@yF$!+N;+acjXnH-7#?Cm(P~Nx?`_Fx}}*zmOB0h5+OX$pS}&VlUn!>%>SO?7K+d4qeY4t3iodMIRO@ zI_n&b>PP|5Fa0(wU&(~CX5#lrQ`_~i2htLYRXm>Tk+;lawRplW!8^e7!>zF}KemYf z^z-p#8hvUz0}t)ImDJekI9p1y%O-SQ;%z3z0W>RKJDp78p*QP+ejWTXMc4NO^*h_{ zOIt|x>+rp3l*n5zjgAU$E;bH#`yU-(i>Io7<``%2zky?BWVm$)?6%1$V(GyyO9vg5 z?=SL`j!eX{2Watk2vB}2dS?L7U+G-q6U2S>HZLs(9rp!yspR8C%y#42*je`hIyjot z(=xUI9v?^Ur?n#5_)prv%dabEs|KxLW_(@-)TT@AOrzj;3`T0hU+c*fvi1zIIQENn z_;pN?#v8eqBQFj7Fs6KO(77!A#zNli9DTIH(itNk=Eo}y$}vHLoz|9;RzaH%n6WBw znnsWJ%G^_FZ;n?DUUumBa$uN_Od6=>Y=n>McM9}454z-5BQjQrb)(y!A5YLsqQT?@ zzlDl_JM1>b>WvEluYZZ`D!R(KW`f4ji#-pv_hjn^4wQRb_xJRnvOUy%fC8v=yK_XY zBqi$%kthnAEORuB^ZxucwkFnlh!Z&?jbwVTnOxJ6T;WKWKa8@Cg z+RQ!OK0J^ou(6eu2H!H1P^lxNfSQu3hC*XN-^NF+Vb^on`>Zmd55RFQDi)C@MVi z@V_k_d*Yz;Jg}T*xwt^|z>8PPm45`1^%Iy7pDRaK%J4Z53=uXy`qMA#MdaufA5X2c zulb%v3S@d*MWCloNneQX()B5hmRfq~KIIQL-s>n*;T)9zq~a-h-V++SE(Xz)$RVq6 z;#r=*VT`4?@^FRZ_-~1a`Ei&QfQW?z4;g&s)nSjy;kCNc3CraI5Lcm~m$O zpQhZLYG#vJv)YMl0+)T4<5f0Pog7h~=u@WvYOjH;j#gZPi5IY_35hKH4PbMg?{*EF zoBbn7oq%Z5KJc06`R%l_fs00K)W`-SRbba+`tU3uc@`KPplbP8%fn1j{FJf*j!r-> zNFCKGYWtKa3Kkw5-b#szQIkf|9_I_p3yl`QLIT>EW^9_ z)0%QFOyPXAO^c}zdF+Y!t8bBMy71+ql5xMTPjRwf$O?|if&LXgqQ@X&Gob3_$5OE9 zae;C!pblx{EDih8He*kduiO&M1s+1vF1T~zue~MFP=zQoWW!0qo8?A0+t&z&8;L<# zY<3^do24EP3jGIRdz1PB1cYfU57rD4+}qpEy1!24cnr(cN$~icZ2gs3vFWJWx0N6K zK$qBIx#cm*(Y5;6bHk$)~N&LkUNXHyp2TOT3j?|{og z1#AS{D852hg=plJ!TA~)e%kB8@qR72fPPS~jg7!8`+jOk;@p)!S&39w9UWdJylGI~ zlA}z5!%gO=8IS^Xu*iQ=^)MGq_WDKMc5>^cR{wNQ4aYBA=|t>bNk*Ru*IV#x%1^2~ z$CWUxNP=%EKllzg@dkHzpTzYQFVTx8GZ0*+)~LOMnx=V${EXT$2jh--HD`s=^`}O; z%O)!yY_`k`o4t`GyxH2rlT zUp1WBKbexSF|i0{(NG>N(=scyN5=+8>P