From 5745d9ee43923b61f9607d6178ec353114002416 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Fri, 22 Jun 2012 22:20:39 -0400 Subject: [PATCH 1/1] From http://www.jwz.org/xscreensaver/xscreensaver-5.17.tar.gz -rw-r--r-- 1 zblaxell zblaxell 7238015 Jun 22 19:09 xscreensaver-5.17.tar.gz 8cbe8d03642a7c3216030d01286b95568319d54c xscreensaver-5.17.tar.gz --- INSTALL | 183 + Makefile.in | 374 + OSX/English.lproj/InfoPlist.strings | Bin 0 -> 92 bytes .../SaverRunner.nib/designable.nib | 1790 + .../SaverRunner.nib/keyedobjects.nib | Bin 0 -> 13707 bytes OSX/InvertedSlider.h | 33 + OSX/InvertedSlider.m | 159 + OSX/Makefile | 148 + OSX/PrefsReader.h | 50 + OSX/PrefsReader.m | 385 + OSX/README | 10 + OSX/SaverListController.h | 36 + OSX/SaverListController.m | 312 + OSX/SaverRunner.h | 73 + OSX/SaverRunner.icns | Bin 0 -> 62554 bytes OSX/SaverRunner.m | 1014 + OSX/SaverRunner.plist | 39 + OSX/XScreenSaver.icns | Bin 0 -> 187557 bytes OSX/XScreenSaver.plist | 30 + OSX/XScreenSaverConfigSheet.h | 77 + OSX/XScreenSaverConfigSheet.m | 3226 ++ OSX/XScreenSaverDMG.icns | Bin 0 -> 110173 bytes OSX/XScreenSaverGLView.h | 39 + OSX/XScreenSaverGLView.m | 453 + OSX/XScreenSaverSubclass.m | 33 + OSX/XScreenSaverView.h | 106 + OSX/XScreenSaverView.m | 1492 + OSX/bindist-DS_Store | Bin 0 -> 12292 bytes OSX/bindist.rtf | 62 + OSX/iSaverRunner.ai | 3593 ++ OSX/iSaverRunner.plist | 67 + OSX/iSaverRunner.xib | 176 + OSX/iSaverRunner114.png | Bin 0 -> 3809 bytes OSX/iSaverRunner29.png | Bin 0 -> 845 bytes OSX/iSaverRunner29t.png | Bin 0 -> 906 bytes OSX/iSaverRunner50.png | Bin 0 -> 1506 bytes OSX/iSaverRunner57.png | Bin 0 -> 1688 bytes OSX/iSaverRunner72.png | Bin 0 -> 2224 bytes OSX/icmp-warning.pl | 49 + OSX/iostextclient.m | 556 + OSX/jwxyz-timers.h | 29 + OSX/jwxyz-timers.m | 403 + OSX/jwxyz.h | 736 + OSX/jwxyz.m | 3167 ++ OSX/main.m | 29 + OSX/osxgrabscreen.m | 460 + OSX/update-info-plist.pl | 317 + OSX/xscreensaver_Prefix.pch | 33 + README | 1397 + README.VMS | 57 + README.hacking | 180 + aclocal.m4 | 443 + config.guess | 1516 + config.h-vms | 284 + config.h.in | 486 + config.sub | 1626 + configure | 23127 ++++++++++ configure.in | 4445 ++ driver/.gdbinit | 27 + driver/Makefile.in | 1023 + driver/README | 6 + driver/XScreenSaver-Xm.ad | 126 + driver/XScreenSaver.ad.in | 503 + driver/XScreenSaver_Xm_ad.h | 108 + driver/XScreenSaver_ad.h | 364 + driver/auth.h | 54 + driver/compile_axp.com | 15 + driver/compile_decc.com | 15 + driver/demo-Gtk-conf.c | 1996 + driver/demo-Gtk-conf.h | 31 + driver/demo-Gtk-stubs.h | 90 + driver/demo-Gtk-support.c | 219 + driver/demo-Gtk-support.h | 61 + driver/demo-Gtk-widgets.c | 1764 + driver/demo-Gtk-widgets.h | 6 + driver/demo-Gtk.c | 5334 +++ driver/demo-Xm-widgets.c | 907 + driver/demo-Xm.c | 1875 + driver/dpms.c | 296 + driver/exec.c | 299 + driver/exec.h | 21 + driver/link_axp.com | 15 + driver/link_decc.com | 15 + driver/lock.c | 2263 + driver/mlstring.c | 229 + driver/mlstring.h | 57 + driver/passwd-helper.c | 162 + driver/passwd-kerberos.c | 251 + driver/passwd-pam.c | 514 + driver/passwd-pwent.c | 312 + driver/passwd.c | 334 + driver/pdf2jpeg.m | 152 + driver/pdf2jpeg.man | 43 + driver/prefs.c | 1650 + driver/prefs.h | 35 + driver/remote.c | 595 + driver/remote.h | 24 + driver/screens.c | 1077 + driver/screensaver-properties.desktop.in | 8 + driver/setuid.c | 361 + driver/splash.c | 866 + driver/stderr.c | 560 + driver/subprocs.c | 1373 + driver/test-apm.c | 101 + driver/test-fade.c | 123 + driver/test-grab.c | 89 + driver/test-mlstring.c | 312 + driver/test-passwd.c | 303 + driver/test-randr.c | 339 + driver/test-screens.c | 208 + driver/test-uid.c | 209 + driver/test-vp.c | 213 + driver/test-xdpms.c | 179 + driver/test-xinerama.c | 112 + driver/timers.c | 1669 + driver/types.h | 437 + driver/vms-getpwnam.c | 129 + driver/vms-hpwd.c | 75 + driver/vms-pwd.h | 48 + driver/vms-validate.c | 75 + driver/vms_axp.opt | 5 + driver/vms_axp_12.opt | 5 + driver/vms_decc.opt | 5 + driver/vms_decc_12.opt | 5 + driver/windows.c | 2001 + driver/xdpyinfo.c | 1098 + driver/xscreensaver-command.c | 439 + driver/xscreensaver-command.man | 263 + driver/xscreensaver-demo.glade2 | 3136 ++ driver/xscreensaver-demo.glade2p | 19 + driver/xscreensaver-demo.man | 398 + driver/xscreensaver-getimage-desktop | 207 + driver/xscreensaver-getimage-desktop.man | 55 + driver/xscreensaver-getimage-file | 1003 + driver/xscreensaver-getimage-file.man | 66 + driver/xscreensaver-getimage-video | 178 + driver/xscreensaver-getimage-video.man | 51 + driver/xscreensaver-getimage.c | 1951 + driver/xscreensaver-getimage.man | 73 + driver/xscreensaver-text | 808 + driver/xscreensaver-text.man | 85 + driver/xscreensaver.c | 2372 ++ driver/xscreensaver.h | 207 + driver/xscreensaver.man | 920 + driver/xscreensaver.pam.in | 13 + driver/xset.c | 389 + hacks/.gdbinit | 12 + hacks/Makefile.in | 2809 ++ hacks/README | 6 + hacks/abstractile.c | 1592 + hacks/abstractile.man | 52 + hacks/analogtv.c | 2209 + hacks/analogtv.h | 312 + hacks/anemone.c | 435 + hacks/anemone.man | 74 + hacks/anemotaxis.c | 752 + hacks/anemotaxis.man | 78 + hacks/ant.c | 1371 + hacks/ant.man | 96 + hacks/apollonian.c | 840 + hacks/apollonian.man | 70 + hacks/apple2-main.c | 1808 + hacks/apple2.c | 860 + hacks/apple2.h | 121 + hacks/apple2.man | 206 + hacks/asm6502.c | 2255 + hacks/asm6502.h | 181 + hacks/attraction.c | 1049 + hacks/attraction.man | 227 + hacks/automata.h | 64 + hacks/barcode.c | 1984 + hacks/barcode.man | 61 + hacks/blaster.c | 1187 + hacks/blaster.man | 65 + hacks/blitspin.c | 430 + hacks/blitspin.man | 96 + hacks/bouboule.c | 847 + hacks/bouboule.man | 80 + hacks/boxfit.c | 556 + hacks/boxfit.man | 102 + hacks/braid.c | 467 + hacks/braid.man | 69 + hacks/bsod.c | 4176 ++ hacks/bsod.man | 140 + hacks/bubbles-default.c | 151 + hacks/bubbles.c | 1433 + hacks/bubbles.h | 224 + hacks/bubbles.man | 140 + hacks/bumps.c | 732 + hacks/bumps.man | 80 + hacks/ccurve.c | 848 + hacks/ccurve.man | 60 + hacks/celtic.c | 1116 + hacks/celtic.man | 64 + hacks/check-configs.pl | 341 + hacks/cloudlife.c | 416 + hacks/cloudlife.man | 87 + hacks/compass.c | 973 + hacks/compass.man | 57 + hacks/compile_axp.com | 148 + hacks/compile_decc.com | 148 + hacks/config/README | 249 + hacks/config/abstractile.xml | 32 + hacks/config/anemone.xml | 50 + hacks/config/anemotaxis.xml | 36 + hacks/config/ant.xml | 63 + hacks/config/antinspect.xml | 21 + hacks/config/antmaze.xml | 19 + hacks/config/antspotlight.xml | 22 + hacks/config/apollonian.xml | 38 + hacks/config/apple2.xml | 62 + hacks/config/atlantis.xml | 46 + hacks/config/attraction.xml | 83 + hacks/config/atunnel.xml | 22 + hacks/config/barcode.xml | 32 + hacks/config/blaster.xml | 59 + hacks/config/blinkbox.xml | 31 + hacks/config/blitspin.xml | 38 + hacks/config/blocktube.xml | 30 + hacks/config/boing.xml | 47 + hacks/config/bouboule.xml | 30 + hacks/config/bouncingcow.xml | 28 + hacks/config/boxed.xml | 54 + hacks/config/boxfit.xml | 56 + hacks/config/braid.xml | 35 + hacks/config/bsod.xml | 88 + hacks/config/bubble3d.xml | 21 + hacks/config/bubbles.xml | 38 + hacks/config/bumps.xml | 33 + hacks/config/cage.xml | 23 + hacks/config/carousel.xml | 53 + hacks/config/ccurve.xml | 28 + hacks/config/celtic.xml | 28 + hacks/config/circuit.xml | 33 + hacks/config/cloudlife.xml | 37 + hacks/config/companioncube.xml | 52 + hacks/config/compass.xml | 20 + hacks/config/coral.xml | 32 + hacks/config/crackberg.xml | 48 + hacks/config/critical.xml | 27 + hacks/config/crystal.xml | 44 + hacks/config/cube21.xml | 73 + hacks/config/cubenetic.xml | 57 + hacks/config/cubestorm.xml | 38 + hacks/config/cubicgrid.xml | 28 + hacks/config/cwaves.xml | 27 + hacks/config/cynosure.xml | 28 + hacks/config/dangerball.xml | 33 + hacks/config/decayscreen.xml | 45 + hacks/config/deco.xml | 41 + hacks/config/deluxe.xml | 35 + hacks/config/demon.xml | 37 + hacks/config/discrete.xml | 28 + hacks/config/distort.xml | 49 + hacks/config/dnalogo.xml | 36 + hacks/config/drift.xml | 27 + hacks/config/endgame.xml | 25 + hacks/config/engine.xml | 40 + hacks/config/epicycle.xml | 52 + hacks/config/eruption.xml | 49 + hacks/config/euler2d.xml | 44 + hacks/config/extrusion.xml | 41 + hacks/config/fadeplot.xml | 31 + hacks/config/fiberlamp.xml | 27 + hacks/config/fireworkx.xml | 28 + hacks/config/flag.xml | 37 + hacks/config/flame.xml | 35 + hacks/config/flipflop.xml | 48 + hacks/config/flipscreen3d.xml | 23 + hacks/config/fliptext.xml | 47 + hacks/config/flow.xml | 56 + hacks/config/fluidballs.xml | 49 + hacks/config/flurry.xml | 28 + hacks/config/flyingtoasters.xml | 38 + hacks/config/fontglide.xml | 44 + hacks/config/forest.xml | 26 + hacks/config/fuzzyflakes.xml | 62 + hacks/config/galaxy.xml | 33 + hacks/config/gears.xml | 36 + hacks/config/gflux.xml | 57 + hacks/config/glblur.xml | 43 + hacks/config/glcells.xml | 60 + hacks/config/gleidescope.xml | 37 + hacks/config/glforestfire.xml | 42 + hacks/config/glhanoi.xml | 44 + hacks/config/glknots.xml | 59 + hacks/config/glmatrix.xml | 50 + hacks/config/glplanet.xml | 38 + hacks/config/glschool.xml | 41 + hacks/config/glslideshow.xml | 56 + hacks/config/glsnake.xml | 53 + hacks/config/gltext.xml | 47 + hacks/config/goop.xml | 61 + hacks/config/grav.xml | 32 + hacks/config/greynetic.xml | 21 + hacks/config/halftone.xml | 55 + hacks/config/halo.xml | 38 + hacks/config/helix.xml | 23 + hacks/config/hilbert.xml | 73 + hacks/config/hopalong.xml | 55 + hacks/config/hyperball.xml | 61 + hacks/config/hypercube.xml | 71 + hacks/config/hypertorus.xml | 114 + hacks/config/hypnowheel.xml | 50 + hacks/config/ifs.xml | 61 + hacks/config/imsmap.xml | 42 + hacks/config/interaggregate.xml | 29 + hacks/config/interference.xml | 53 + hacks/config/intermomentary.xml | 33 + hacks/config/jigglypuff.xml | 88 + hacks/config/jigsaw.xml | 48 + hacks/config/juggle.xml | 56 + hacks/config/juggler3d.xml | 51 + hacks/config/julia.xml | 35 + hacks/config/kaleidescope.xml | 38 + hacks/config/klein.xml | 127 + hacks/config/kumppa.xml | 28 + hacks/config/lament.xml | 26 + hacks/config/laser.xml | 34 + hacks/config/lavalite.xml | 86 + hacks/config/lcdscrub.xml | 51 + hacks/config/lightning.xml | 26 + hacks/config/lisa.xml | 40 + hacks/config/lissie.xml | 39 + hacks/config/lmorph.xml | 41 + hacks/config/lockward.xml | 63 + hacks/config/loop.xml | 33 + hacks/config/m6502.xml | 49 + hacks/config/maze.xml | 56 + hacks/config/memscroller.xml | 30 + hacks/config/menger.xml | 47 + hacks/config/metaballs.xml | 51 + hacks/config/mirrorblob.xml | 70 + hacks/config/mismunch.xml | 40 + hacks/config/moebius.xml | 25 + hacks/config/moebiusgears.xml | 43 + hacks/config/moire.xml | 34 + hacks/config/moire2.xml | 30 + hacks/config/molecule.xml | 57 + hacks/config/morph3d.xml | 30 + hacks/config/mountain.xml | 27 + hacks/config/munch.xml | 58 + hacks/config/nerverot.xml | 59 + hacks/config/noof.xml | 19 + hacks/config/noseguy.xml | 15 + hacks/config/pacman.xml | 24 + hacks/config/pedal.xml | 26 + hacks/config/penetrate.xml | 30 + hacks/config/penrose.xml | 52 + hacks/config/petri.xml | 83 + hacks/config/phosphor.xml | 39 + hacks/config/photopile.xml | 62 + hacks/config/piecewise.xml | 42 + hacks/config/pinion.xml | 45 + hacks/config/pipes.xml | 41 + hacks/config/polyhedra.xml | 195 + hacks/config/polyominoes.xml | 32 + hacks/config/polytopes.xml | 109 + hacks/config/pong.xml | 36 + hacks/config/popsquares.xml | 52 + hacks/config/providence.xml | 25 + hacks/config/pulsar.xml | 39 + hacks/config/pyro.xml | 33 + hacks/config/qix.xml | 70 + hacks/config/queens.xml | 27 + hacks/config/rd-bomb.xml | 62 + hacks/config/rdbomb.xml | 62 + hacks/config/ripples.xml | 51 + hacks/config/rocks.xml | 42 + hacks/config/rorschach.xml | 34 + hacks/config/rotor.xml | 36 + hacks/config/rotzoomer.xml | 37 + hacks/config/rubik.xml | 36 + hacks/config/rubikblocks.xml | 63 + hacks/config/sballs.xml | 33 + hacks/config/shadebobs.xml | 35 + hacks/config/sierpinski.xml | 34 + hacks/config/sierpinski3d.xml | 30 + hacks/config/skytentacles.xml | 67 + hacks/config/slidescreen.xml | 50 + hacks/config/slip.xml | 43 + hacks/config/sonar.xml | 76 + hacks/config/speedmine.xml | 58 + hacks/config/sphere.xml | 26 + hacks/config/spheremonics.xml | 56 + hacks/config/spiral.xml | 34 + hacks/config/spotlight.xml | 30 + hacks/config/sproingies.xml | 32 + hacks/config/squiral.xml | 47 + hacks/config/stairs.xml | 21 + hacks/config/starfish.xml | 39 + hacks/config/starwars.xml | 59 + hacks/config/stonerview.xml | 23 + hacks/config/strange.xml | 30 + hacks/config/substrate.xml | 41 + hacks/config/superquadrics.xml | 32 + hacks/config/surfaces.xml | 67 + hacks/config/swirl.xml | 29 + hacks/config/t3d.xml | 49 + hacks/config/tangram.xml | 41 + hacks/config/thornbird.xml | 33 + hacks/config/timetunnel.xml | 39 + hacks/config/topblock.xml | 60 + hacks/config/triangle.xml | 24 + hacks/config/tronbit.xml | 37 + hacks/config/truchet.xml | 37 + hacks/config/twang.xml | 57 + hacks/config/vermiculate.xml | 18 + hacks/config/vidwhacker.xml | 26 + hacks/config/vines.xml | 26 + hacks/config/voronoi.xml | 59 + hacks/config/wander.xml | 45 + hacks/config/webcollage.xml | 52 + hacks/config/whirlwindwarp.xml | 24 + hacks/config/whirlygig.xml | 86 + hacks/config/worm.xml | 35 + hacks/config/wormhole.xml | 27 + hacks/config/xanalogtv.xml | 39 + hacks/config/xflame.xml | 31 + hacks/config/xjack.xml | 21 + hacks/config/xlyap.xml | 48 + hacks/config/xmatrix.xml | 63 + hacks/config/xrayswarm.xml | 19 + hacks/config/xspirograph.xml | 28 + hacks/config/xss.dtd | 109 + hacks/config/xss.xsd | 375 + hacks/config/zoom.xml | 50 + hacks/coral.c | 301 + hacks/coral.man | 64 + hacks/critical.c | 452 + hacks/critical.man | 94 + hacks/crystal.c | 1273 + hacks/crystal.man | 81 + hacks/cwaves.c | 208 + hacks/cwaves.man | 76 + hacks/cynosure.c | 432 + hacks/cynosure.man | 64 + hacks/decayscreen.c | 362 + hacks/decayscreen.man | 92 + hacks/deco.c | 333 + hacks/deco.man | 105 + hacks/deluxe.c | 453 + hacks/deluxe.man | 72 + hacks/demon.c | 978 + hacks/demon.man | 69 + hacks/discrete.c | 453 + hacks/discrete.man | 61 + hacks/distort.c | 856 + hacks/distort.man | 137 + hacks/drift.c | 695 + hacks/drift.man | 79 + hacks/epicycle.c | 779 + hacks/epicycle.man | 204 + hacks/eruption.c | 505 + hacks/eruption.man | 77 + hacks/euler2d.c | 881 + hacks/euler2d.man | 69 + hacks/euler2d.tex | 337 + hacks/fadeplot.c | 236 + hacks/fadeplot.man | 65 + hacks/fiberlamp.c | 473 + hacks/fiberlamp.man | 65 + hacks/fireworkx.c | 499 + hacks/fireworkx.man | 90 + hacks/fireworkx_mmx.S | 226 + hacks/flag.c | 568 + hacks/flag.man | 92 + hacks/flame.c | 453 + hacks/flame.man | 74 + hacks/flow.c | 1225 + hacks/flow.man | 137 + hacks/fluidballs.c | 805 + hacks/fluidballs.man | 90 + hacks/fontglide.c | 1681 + hacks/fontglide.man | 124 + hacks/forest.c | 260 + hacks/forest.man | 62 + hacks/fps.c | 251 + hacks/fps.h | 35 + hacks/fpsI.h | 42 + hacks/fuzzyflakes.c | 639 + hacks/fuzzyflakes.man | 112 + hacks/galaxy.c | 462 + hacks/galaxy.man | 87 + hacks/glx/Makefile.in | 2604 ++ hacks/glx/README | 10 + hacks/glx/antinspect.c | 723 + hacks/glx/antinspect.man | 56 + hacks/glx/antmaze.c | 1652 + hacks/glx/antmaze.man | 52 + hacks/glx/ants.h | 45 + hacks/glx/antspotlight.c | 824 + hacks/glx/antspotlight.man | 56 + hacks/glx/atlantis.c | 579 + hacks/glx/atlantis.h | 129 + hacks/glx/atlantis.man | 78 + hacks/glx/atunnel.c | 325 + hacks/glx/atunnel.man | 83 + hacks/glx/b_draw.c | 239 + hacks/glx/b_lockglue.c | 237 + hacks/glx/b_sphere.c | 219 + hacks/glx/blinkbox.c | 597 + hacks/glx/blinkbox.man | 73 + hacks/glx/blocktube.c | 449 + hacks/glx/blocktube.man | 73 + hacks/glx/boing.c | 665 + hacks/glx/boing.man | 105 + hacks/glx/bouncingcow.c | 543 + hacks/glx/bouncingcow.man | 73 + hacks/glx/boxed.c | 1315 + hacks/glx/boxed.h | 4116 ++ hacks/glx/boxed.man | 56 + hacks/glx/bubble3d.c | 281 + hacks/glx/bubble3d.h | 100 + hacks/glx/bubble3d.man | 62 + hacks/glx/buildlwo.c | 96 + hacks/glx/buildlwo.h | 38 + hacks/glx/cage.c | 489 + hacks/glx/cage.man | 61 + hacks/glx/carousel.c | 905 + hacks/glx/carousel.man | 109 + hacks/glx/chessgames.h | 343 + hacks/glx/chessmodels.c | 1722 + hacks/glx/chessmodels.h | 44 + hacks/glx/circuit.c | 2283 + hacks/glx/circuit.man | 72 + hacks/glx/companion.c | 614 + hacks/glx/companion_disc.c | 9593 +++++ hacks/glx/companion_heart.c | 653 + hacks/glx/companion_quad.c | 389 + hacks/glx/companioncube.man | 85 + hacks/glx/cow_face.c | 341 + hacks/glx/cow_hide.c | 13055 ++++++ hacks/glx/cow_hoofs.c | 1037 + hacks/glx/cow_horns.c | 1025 + hacks/glx/cow_tail.c | 464 + hacks/glx/cow_udder.c | 1520 + hacks/glx/crackberg.c | 1424 + hacks/glx/crackberg.man | 123 + hacks/glx/cube21.c | 908 + hacks/glx/cube21.man | 147 + hacks/glx/cubenetic.c | 607 + hacks/glx/cubenetic.man | 89 + hacks/glx/cubestorm.c | 429 + hacks/glx/cubestorm.man | 77 + hacks/glx/cubicgrid.c | 290 + hacks/glx/cubicgrid.man | 83 + hacks/glx/dangerball.c | 385 + hacks/glx/dangerball.man | 72 + hacks/glx/dnalogo.c | 2386 ++ hacks/glx/dolphin.c | 2061 + hacks/glx/dropshadow.c | 181 + hacks/glx/dropshadow.h | 51 + hacks/glx/dxf2gl.pl | 501 + hacks/glx/e_textures.h | 1478 + hacks/glx/endgame.c | 909 + hacks/glx/endgame.man | 72 + hacks/glx/engine.c | 1014 + hacks/glx/engine.man | 80 + hacks/glx/extrusion-helix2.c | 47 + hacks/glx/extrusion-helix3.c | 46 + hacks/glx/extrusion-helix4.c | 63 + hacks/glx/extrusion-joinoffset.c | 148 + hacks/glx/extrusion-screw.c | 114 + hacks/glx/extrusion-taper.c | 218 + hacks/glx/extrusion-twistoid.c | 213 + hacks/glx/extrusion.c | 556 + hacks/glx/extrusion.h | 55 + hacks/glx/extrusion.man | 71 + hacks/glx/flipflop.c | 876 + hacks/glx/flipflop.man | 95 + hacks/glx/flipscreen3d.c | 545 + hacks/glx/flipscreen3d.man | 61 + hacks/glx/fliptext.c | 1008 + hacks/glx/fliptext.man | 114 + hacks/glx/flurry-smoke.c | 1444 + hacks/glx/flurry-spark.c | 285 + hacks/glx/flurry-star.c | 106 + hacks/glx/flurry-texture.c | 224 + hacks/glx/flurry.c | 567 + hacks/glx/flurry.h | 296 + hacks/glx/flurry.man | 73 + hacks/glx/flyingtoasters.c | 873 + hacks/glx/flyingtoasters.man | 86 + hacks/glx/font-ximage.c | 254 + hacks/glx/font-ximage.h | 30 + hacks/glx/fps-gl.c | 113 + hacks/glx/gears.c | 943 + hacks/glx/gears.man | 79 + hacks/glx/gflux.c | 835 + hacks/glx/gflux.man | 111 + hacks/glx/glblur.c | 640 + hacks/glx/glblur.man | 76 + hacks/glx/glcells.c | 1325 + hacks/glx/glcells.man | 97 + hacks/glx/gleidescope.c | 1630 + hacks/glx/gleidescope.man | 77 + hacks/glx/glforestfire.c | 1147 + hacks/glx/glforestfire.man | 130 + hacks/glx/glhanoi.c | 2060 + hacks/glx/glhanoi.man | 83 + hacks/glx/glknots.c | 460 + hacks/glx/glknots.man | 81 + hacks/glx/gllist.c | 9 + hacks/glx/gllist.h | 28 + hacks/glx/glmatrix.c | 1069 + hacks/glx/glmatrix.man | 116 + hacks/glx/glplanet.c | 659 + hacks/glx/glplanet.man | 70 + hacks/glx/glschool.c | 218 + hacks/glx/glschool.h | 17 + hacks/glx/glschool.man | 126 + hacks/glx/glschool_alg.c | 364 + hacks/glx/glschool_alg.h | 126 + hacks/glx/glschool_gl.c | 274 + hacks/glx/glschool_gl.h | 47 + hacks/glx/glslideshow.c | 1260 + hacks/glx/glslideshow.man | 131 + hacks/glx/glsnake.c | 2694 ++ hacks/glx/glsnake.man | 98 + hacks/glx/gltext.c | 661 + hacks/glx/gltext.man | 123 + hacks/glx/gltrackball.c | 154 + hacks/glx/gltrackball.h | 59 + hacks/glx/glut_roman.h | 2455 ++ hacks/glx/glut_stroke.c | 57 + hacks/glx/glut_swidth.c | 73 + hacks/glx/glutstroke.h | 47 + hacks/glx/glxfonts.c | 636 + hacks/glx/glxfonts.h | 58 + hacks/glx/grab-ximage.c | 839 + hacks/glx/grab-ximage.h | 76 + hacks/glx/hilbert.c | 1147 + hacks/glx/hilbert.man | 103 + hacks/glx/hypertorus.c | 1035 + hacks/glx/hypertorus.man | 188 + hacks/glx/hypnowheel.c | 298 + hacks/glx/hypnowheel.man | 80 + hacks/glx/involute.c | 968 + hacks/glx/involute.h | 77 + hacks/glx/jigglypuff.c | 1085 + hacks/glx/jigglypuff.man | 121 + hacks/glx/jigsaw.c | 1178 + hacks/glx/jigsaw.man | 90 + hacks/glx/juggler3d.c | 3097 ++ hacks/glx/juggler3d.man | 183 + hacks/glx/jwzgles.c | 3545 ++ hacks/glx/jwzgles.h | 519 + hacks/glx/jwzglesI.h | 311 + hacks/glx/klein.c | 2048 + hacks/glx/klein.man | 299 + hacks/glx/lament.c | 2055 + hacks/glx/lament.man | 68 + hacks/glx/lavalite.c | 1569 + hacks/glx/lavalite.man | 160 + hacks/glx/lockward.c | 934 + hacks/glx/lockward.man | 79 + hacks/glx/marching.c | 641 + hacks/glx/marching.h | 48 + hacks/glx/menger.c | 552 + hacks/glx/menger.man | 78 + hacks/glx/mirrorblob.c | 1858 + hacks/glx/mirrorblob.man | 107 + hacks/glx/moebius.c | 813 + hacks/glx/moebius.man | 65 + hacks/glx/moebiusgears.c | 411 + hacks/glx/moebiusgears.man | 86 + hacks/glx/molecule.c | 1721 + hacks/glx/molecule.man | 160 + hacks/glx/molecules.sh | 22 + hacks/glx/morph3d.c | 833 + hacks/glx/morph3d.man | 57 + hacks/glx/noof.c | 477 + hacks/glx/noof.man | 52 + hacks/glx/normals.c | 52 + hacks/glx/normals.h | 44 + hacks/glx/photopile.c | 785 + hacks/glx/photopile.man | 113 + hacks/glx/pinion.c | 1536 + hacks/glx/pinion.man | 82 + hacks/glx/pipeobjs.c | 3262 ++ hacks/glx/pipes.c | 1107 + hacks/glx/pipes.man | 85 + hacks/glx/polyhedra-gl.c | 715 + hacks/glx/polyhedra.c | 2458 ++ hacks/glx/polyhedra.h | 52 + hacks/glx/polyhedra.man | 124 + hacks/glx/polytopes.c | 3213 ++ hacks/glx/polytopes.man | 207 + hacks/glx/providence.c | 818 + hacks/glx/providence.man | 66 + hacks/glx/pulsar.c | 517 + hacks/glx/pulsar.man | 102 + hacks/glx/queens.c | 560 + hacks/glx/queens.man | 66 + hacks/glx/rotator.c | 247 + hacks/glx/rotator.h | 60 + hacks/glx/rubik.c | 2114 + hacks/glx/rubik.man | 69 + hacks/glx/rubikblocks.c | 652 + hacks/glx/rubikblocks.man | 117 + hacks/glx/s1_1.c | 1733 + hacks/glx/s1_2.c | 1733 + hacks/glx/s1_3.c | 1733 + hacks/glx/s1_4.c | 1733 + hacks/glx/s1_5.c | 1733 + hacks/glx/s1_6.c | 1733 + hacks/glx/s1_b.c | 505 + hacks/glx/sballs.c | 870 + hacks/glx/sballs.man | 125 + hacks/glx/shark.c | 1395 + hacks/glx/sierpinski3d.c | 580 + hacks/glx/sierpinski3d.man | 67 + hacks/glx/skytentacles.c | 1092 + hacks/glx/skytentacles.man | 102 + hacks/glx/sonar-icmp.c | 1233 + hacks/glx/sonar-sim.c | 112 + hacks/glx/sonar.c | 1020 + hacks/glx/sonar.h | 68 + hacks/glx/sonar.man | 163 + hacks/glx/sphere.c | 138 + hacks/glx/sphere.h | 23 + hacks/glx/spheremonics.c | 924 + hacks/glx/spheremonics.man | 92 + hacks/glx/sproingies.c | 928 + hacks/glx/sproingies.h | 25 + hacks/glx/sproingies.man | 68 + hacks/glx/sproingiewrap.c | 252 + hacks/glx/stairs.c | 619 + hacks/glx/stairs.man | 56 + hacks/glx/starwars.c | 1051 + hacks/glx/starwars.h | 312 + hacks/glx/starwars.man | 181 + hacks/glx/starwars.txt | 311 + hacks/glx/stonerview-move.c | 158 + hacks/glx/stonerview-move.h | 31 + hacks/glx/stonerview-osc.c | 341 + hacks/glx/stonerview-osc.h | 175 + hacks/glx/stonerview-view.c | 114 + hacks/glx/stonerview.c | 187 + hacks/glx/stonerview.h | 67 + hacks/glx/stonerview.man | 53 + hacks/glx/superquadrics.c | 797 + hacks/glx/superquadrics.man | 70 + hacks/glx/surfaces.c | 680 + hacks/glx/surfaces.man | 127 + hacks/glx/swim.c | 232 + hacks/glx/tangram.c | 1095 + hacks/glx/tangram.man | 67 + hacks/glx/tangram_shapes.c | 230 + hacks/glx/tangram_shapes.h | 15 + hacks/glx/teapot.c | 223 + hacks/glx/teapot.h | 7 + hacks/glx/texfont.c | 585 + hacks/glx/texfont.h | 37 + hacks/glx/timetunnel.c | 1263 + hacks/glx/timetunnel.man | 105 + hacks/glx/toast.c | 185 + hacks/glx/toast2.c | 209 + hacks/glx/toaster.c | 371 + hacks/glx/toaster_base.c | 125 + hacks/glx/toaster_handle.c | 59 + hacks/glx/toaster_handle2.c | 35 + hacks/glx/toaster_jet.c | 173 + hacks/glx/toaster_knob.c | 71 + hacks/glx/toaster_slots.c | 101 + hacks/glx/toaster_wing.c | 38 + hacks/glx/topblock.c | 893 + hacks/glx/topblock.h | 45 + hacks/glx/topblock.man | 170 + hacks/glx/trackball.c | 330 + hacks/glx/trackball.h | 82 + hacks/glx/tronbit.c | 554 + hacks/glx/tronbit.man | 79 + hacks/glx/tronbit_idle1.c | 247 + hacks/glx/tronbit_idle2.c | 175 + hacks/glx/tronbit_no.c | 1087 + hacks/glx/tronbit_yes.c | 31 + hacks/glx/tube.c | 400 + hacks/glx/tube.h | 32 + hacks/glx/tunnel_draw.c | 504 + hacks/glx/tunnel_draw.h | 11 + hacks/glx/voronoi.c | 506 + hacks/glx/voronoi.man | 88 + hacks/glx/vrml2gl.pl | 361 + hacks/glx/wfront2gl.pl | 361 + hacks/glx/whale.c | 1887 + hacks/glx/xlock-gl-utils.c | 219 + hacks/glx/xpm-ximage.c | 462 + hacks/glx/xpm-ximage.h | 31 + hacks/glx/xscreensaver-gl-helper.c | 74 + hacks/glx/xscreensaver-gl-helper.man | 33 + hacks/goop.c | 594 + hacks/goop.man | 84 + hacks/grav.c | 355 + hacks/grav.man | 78 + hacks/greynetic.c | 290 + hacks/greynetic.man | 56 + hacks/halftone.c | 394 + hacks/halftone.man | 83 + hacks/halo.c | 436 + hacks/halo.man | 75 + hacks/helix.c | 353 + hacks/helix.man | 62 + hacks/hopalong.c | 579 + hacks/hopalong.man | 82 + hacks/hyperball.c | 2463 ++ hacks/hyperball.man | 88 + hacks/hypercube.c | 571 + hacks/hypercube.man | 97 + hacks/ifs.c | 532 + hacks/ifs.man | 111 + hacks/images/6x10font.xbm | 190 + hacks/images/amiga.xpm | 269 + hacks/images/apple2font.xbm | 41 + hacks/images/atari.xbm | 6 + hacks/images/atm.xbm | 246 + hacks/images/blocktube.xpm | 320 + hacks/images/bob.xbm | 43 + hacks/images/bubbles/blood.pov | 24 + hacks/images/bubbles/blood1.xpm | 75 + hacks/images/bubbles/blood10.xpm | 159 + hacks/images/bubbles/blood11.xpm | 170 + hacks/images/bubbles/blood2.xpm | 101 + hacks/images/bubbles/blood3.xpm | 112 + hacks/images/bubbles/blood4.xpm | 116 + hacks/images/bubbles/blood5.xpm | 121 + hacks/images/bubbles/blood6.xpm | 128 + hacks/images/bubbles/blood7.xpm | 135 + hacks/images/bubbles/blood8.xpm | 143 + hacks/images/bubbles/blood9.xpm | 149 + hacks/images/bubbles/blue.pov | 22 + hacks/images/bubbles/blue1.xpm | 64 + hacks/images/bubbles/blue10.xpm | 157 + hacks/images/bubbles/blue11.xpm | 169 + hacks/images/bubbles/blue2.xpm | 90 + hacks/images/bubbles/blue3.xpm | 104 + hacks/images/bubbles/blue4.xpm | 116 + hacks/images/bubbles/blue5.xpm | 122 + hacks/images/bubbles/blue6.xpm | 128 + hacks/images/bubbles/blue7.xpm | 132 + hacks/images/bubbles/blue8.xpm | 142 + hacks/images/bubbles/blue9.xpm | 149 + hacks/images/bubbles/glass.pov | 27 + hacks/images/bubbles/glass1.xpm | 79 + hacks/images/bubbles/glass10.xpm | 155 + hacks/images/bubbles/glass11.xpm | 167 + hacks/images/bubbles/glass2.xpm | 95 + hacks/images/bubbles/glass3.xpm | 112 + hacks/images/bubbles/glass4.xpm | 118 + hacks/images/bubbles/glass5.xpm | 120 + hacks/images/bubbles/glass6.xpm | 128 + hacks/images/bubbles/glass7.xpm | 133 + hacks/images/bubbles/glass8.xpm | 140 + hacks/images/bubbles/glass9.xpm | 147 + hacks/images/bubbles/jade.pov | 24 + hacks/images/bubbles/jade1.xpm | 76 + hacks/images/bubbles/jade10.xpm | 158 + hacks/images/bubbles/jade11.xpm | 171 + hacks/images/bubbles/jade2.xpm | 96 + hacks/images/bubbles/jade3.xpm | 113 + hacks/images/bubbles/jade4.xpm | 116 + hacks/images/bubbles/jade5.xpm | 123 + hacks/images/bubbles/jade6.xpm | 128 + hacks/images/bubbles/jade7.xpm | 133 + hacks/images/bubbles/jade8.xpm | 143 + hacks/images/bubbles/jade9.xpm | 149 + hacks/images/chromesphere.xpm | 350 + hacks/images/earth.xpm | 303 + hacks/images/ground.xpm | 227 + hacks/images/hmac.xpm | 52 + hacks/images/jigglymap.xpm | 350 + hacks/images/lament128.xpm | 791 + hacks/images/lament512.xpm | 3094 ++ hacks/images/m6502/amiga.asm | 120 + hacks/images/m6502/breakout.asm | 195 + hacks/images/m6502/byterun.asm | 100 + hacks/images/m6502/cellular-30.asm | 67 + hacks/images/m6502/cellular-600.asm | 209 + hacks/images/m6502/colors.asm | 46 + hacks/images/m6502/crunch6502.asm | 292 + hacks/images/m6502/demoscene.asm | 457 + hacks/images/m6502/disco.asm | 23 + hacks/images/m6502/dmsc.asm | 108 + hacks/images/m6502/dragon-fractal.asm | 49 + hacks/images/m6502/fullscreenlogo.asm | 107 + hacks/images/m6502/keftal.asm | 82 + hacks/images/m6502/matrix.asm | 67 + hacks/images/m6502/noise.asm | 16 + hacks/images/m6502/random-walk.asm | 82 + hacks/images/m6502/random.asm | 11 + hacks/images/m6502/random2.asm | 11 + hacks/images/m6502/rorschach.asm | 124 + hacks/images/m6502/santa.asm | 142 + hacks/images/m6502/selfmodify.asm | 12 + hacks/images/m6502/sierpinsky.asm | 131 + hacks/images/m6502/softsprite.asm | 132 + hacks/images/m6502/spacer.asm | 235 + hacks/images/m6502/starfield2d.asm | 50 + hacks/images/m6502/wave6502.asm | 164 + hacks/images/m6502/zookeeper.asm | 109 + hacks/images/mac.xbm | 14 + hacks/images/macbomb.xbm | 474 + hacks/images/matrix1.xbm | 1260 + hacks/images/matrix1.xpm | 392 + hacks/images/matrix1b.xbm | 307 + hacks/images/matrix1b.xpm | 227 + hacks/images/matrix2.xbm | 1260 + hacks/images/matrix2.xpm | 393 + hacks/images/matrix2b.xbm | 307 + hacks/images/matrix2b.xpm | 233 + hacks/images/matrix3.xpm | 692 + hacks/images/molecules/adenine.pdb | 37 + hacks/images/molecules/adrenochrome.pdb | 55 + hacks/images/molecules/bucky.pdb | 156 + hacks/images/molecules/caffeine.pdb | 54 + hacks/images/molecules/capsaicin.pdb | 49 + hacks/images/molecules/chlordecone.pdb | 49 + hacks/images/molecules/cocaine.pdb | 93 + hacks/images/molecules/codeine.pdb | 93 + hacks/images/molecules/cyclohexane.pdb | 151 + hacks/images/molecules/cytosine.pdb | 33 + hacks/images/molecules/dna.pdb | 972 + hacks/images/molecules/dodecahedrane.pdb | 87 + hacks/images/molecules/dthc.pdb | 107 + hacks/images/molecules/dynamite.pdb | 47 + hacks/images/molecules/glycol.pdb | 27 + hacks/images/molecules/guanine.pdb | 39 + hacks/images/molecules/heroin.pdb | 107 + hacks/images/molecules/hexahelicene.pdb | 90 + hacks/images/molecules/ibuprofen.pdb | 72 + hacks/images/molecules/lsd.pdb | 104 + hacks/images/molecules/menthol.pdb | 69 + hacks/images/molecules/mescaline.pdb | 71 + hacks/images/molecules/methamphetamine.pdb | 88 + hacks/images/molecules/morphine.pdb | 87 + hacks/images/molecules/nicotine.pdb | 59 + hacks/images/molecules/novocaine.pdb | 81 + hacks/images/molecules/olestra.pdb | 913 + hacks/images/molecules/penicillin.pdb | 89 + hacks/images/molecules/salvinorin.pdb | 92 + hacks/images/molecules/sarin.pdb | 43 + hacks/images/molecules/strychnine.pdb | 101 + hacks/images/molecules/sucrose.pdb | 97 + hacks/images/molecules/thalidomide.pdb | 65 + hacks/images/molecules/thymine.pdb | 37 + hacks/images/molecules/viagra.pdb | 133 + hacks/images/molecules/vitaminb6.pdb | 56 + hacks/images/molecules/vitaminc.pdb | 47 + hacks/images/molecules/vx.pdb | 92 + hacks/images/noseguy/nose-f1.xbm | 46 + hacks/images/noseguy/nose-f1.xpm | 74 + hacks/images/noseguy/nose-f2.xbm | 46 + hacks/images/noseguy/nose-f2.xpm | 74 + hacks/images/noseguy/nose-f3.xbm | 46 + hacks/images/noseguy/nose-f3.xpm | 74 + hacks/images/noseguy/nose-f4.xbm | 46 + hacks/images/noseguy/nose-f4.xpm | 73 + hacks/images/noseguy/nose-l1.xbm | 46 + hacks/images/noseguy/nose-l1.xpm | 74 + hacks/images/noseguy/nose-l2.xbm | 46 + hacks/images/noseguy/nose-l2.xpm | 74 + hacks/images/noseguy/nose-r1.xbm | 46 + hacks/images/noseguy/nose-r1.xpm | 74 + hacks/images/noseguy/nose-r2.xbm | 46 + hacks/images/noseguy/nose-r2.xpm | 74 + hacks/images/osx_10_2.xpm | 298 + hacks/images/osx_10_3.xpm | 279 + hacks/images/pacman/eyes-d.xpm | 70 + hacks/images/pacman/eyes-l.xpm | 70 + hacks/images/pacman/eyes-r.xpm | 70 + hacks/images/pacman/eyes-u.xpm | 70 + hacks/images/pacman/ghost-d1.xpm | 72 + hacks/images/pacman/ghost-d2.xpm | 72 + hacks/images/pacman/ghost-l1.xpm | 72 + hacks/images/pacman/ghost-l2.xpm | 73 + hacks/images/pacman/ghost-mask.xpm | 69 + hacks/images/pacman/ghost-r1.xpm | 72 + hacks/images/pacman/ghost-r2.xpm | 72 + hacks/images/pacman/ghost-s1.xpm | 71 + hacks/images/pacman/ghost-s2.xpm | 71 + hacks/images/pacman/ghost-sf1.xpm | 71 + hacks/images/pacman/ghost-sf2.xpm | 71 + hacks/images/pacman/ghost-u1.xpm | 72 + hacks/images/pacman/ghost-u2.xpm | 72 + hacks/images/pacman/pacman-0.xpm | 69 + hacks/images/pacman/pacman-d1.xpm | 69 + hacks/images/pacman/pacman-d2.xpm | 69 + hacks/images/pacman/pacman-ds1.xpm | 69 + hacks/images/pacman/pacman-ds2.xpm | 69 + hacks/images/pacman/pacman-ds3.xpm | 69 + hacks/images/pacman/pacman-ds4.xpm | 69 + hacks/images/pacman/pacman-ds5.xpm | 69 + hacks/images/pacman/pacman-ds6.xpm | 69 + hacks/images/pacman/pacman-ds7.xpm | 69 + hacks/images/pacman/pacman-ds8.xpm | 69 + hacks/images/pacman/pacman-l1.xpm | 69 + hacks/images/pacman/pacman-l2.xpm | 69 + hacks/images/pacman/pacman-r1.xpm | 69 + hacks/images/pacman/pacman-r2.xpm | 69 + hacks/images/pacman/pacman-u1.xpm | 69 + hacks/images/pacman/pacman-u2.xpm | 69 + hacks/images/sball-bg.xpm | 355 + hacks/images/sball.xpm | 131 + hacks/images/scales.xpm | 204 + hacks/images/sea-texture.xpm | 199 + hacks/images/som.xbm | 1685 + hacks/images/timetunnel0.xpm | 343 + hacks/images/timetunnel1.xpm | 1111 + hacks/images/timetunnel2.xpm | 599 + hacks/images/toast.xpm | 222 + hacks/images/tree.xpm | 226 + hacks/images/tunnel0.xpm | 198 + hacks/images/tunnel1.xpm | 134 + hacks/images/tunnel2.xpm | 206 + hacks/images/tunnel3.xpm | 150 + hacks/images/tunnel4.xpm | 134 + hacks/images/tunnel5.xpm | 134 + hacks/images/tunnelstar.xpm | 323 + hacks/images/wood.xpm | 70 + hacks/imsmap.c | 416 + hacks/imsmap.man | 64 + hacks/interaggregate.c | 971 + hacks/interaggregate.man | 72 + hacks/interference.c | 473 + hacks/interference.man | 86 + hacks/intermomentary.c | 572 + hacks/intermomentary.man | 82 + hacks/juggle.c | 2823 ++ hacks/juggle.man | 181 + hacks/julia.c | 442 + hacks/julia.man | 87 + hacks/kaleidescope.c | 487 + hacks/kaleidescope.man | 89 + hacks/kumppa.c | 533 + hacks/kumppa.man | 65 + hacks/laser.c | 366 + hacks/laser.man | 68 + hacks/lcdscrub.c | 204 + hacks/lcdscrub.man | 73 + hacks/lightning.c | 614 + hacks/lightning.man | 62 + hacks/link_axp.com | 107 + hacks/link_decc.com | 107 + hacks/lisa.c | 751 + hacks/lisa.man | 71 + hacks/lissie.c | 329 + hacks/lissie.man | 69 + hacks/ljlatest | 18 + hacks/ljlatest.man | 61 + hacks/lmorph.c | 568 + hacks/lmorph.man | 65 + hacks/loop.c | 1697 + hacks/loop.man | 65 + hacks/m6502.c | 281 + hacks/m6502.sh | 25 + hacks/maze.c | 1650 + hacks/maze.man | 148 + hacks/memscroller.c | 639 + hacks/memscroller.man | 78 + hacks/metaballs.c | 429 + hacks/metaballs.man | 73 + hacks/moire.c | 294 + hacks/moire.man | 68 + hacks/moire2.c | 349 + hacks/moire2.man | 63 + hacks/mountain.c | 291 + hacks/mountain.man | 60 + hacks/munch.c | 456 + hacks/munch.man | 153 + hacks/munge-ad.pl | 243 + hacks/nerverot.c | 1350 + hacks/nerverot.man | 132 + hacks/noseguy.c | 619 + hacks/noseguy.man | 84 + hacks/pacman.c | 1792 + hacks/pacman.h | 231 + hacks/pacman.man | 67 + hacks/pacman_ai.c | 876 + hacks/pacman_ai.h | 32 + hacks/pacman_level.c | 772 + hacks/pacman_level.h | 32 + hacks/pedal.c | 326 + hacks/pedal.man | 60 + hacks/penetrate.c | 987 + hacks/penetrate.man | 98 + hacks/penrose.c | 1348 + hacks/penrose.man | 106 + hacks/petri.c | 758 + hacks/petri.man | 129 + hacks/phosphor.c | 1261 + hacks/phosphor.man | 173 + hacks/piecewise.c | 995 + hacks/piecewise.man | 77 + hacks/polyominoes.c | 2375 ++ hacks/polyominoes.man | 65 + hacks/pong.c | 790 + hacks/pong.man | 82 + hacks/popsquares.c | 237 + hacks/pyro.c | 368 + hacks/pyro.man | 64 + hacks/qix.c | 621 + hacks/qix.man | 132 + hacks/rd-bomb.c | 590 + hacks/rd-bomb.man | 100 + hacks/ripples.c | 1131 + hacks/ripples.man | 96 + hacks/rocks.c | 545 + hacks/rocks.man | 90 + hacks/rorschach.c | 205 + hacks/rorschach.man | 75 + hacks/rotor.c | 401 + hacks/rotor.man | 68 + hacks/rotzoomer.c | 483 + hacks/rotzoomer.man | 88 + hacks/screenhack.c | 931 + hacks/screenhack.h | 61 + hacks/screenhackI.h | 138 + hacks/shadebobs.c | 465 + hacks/shadebobs.man | 65 + hacks/sierpinski.c | 224 + hacks/sierpinski.man | 69 + hacks/slidescreen.c | 475 + hacks/slidescreen.man | 97 + hacks/slip.c | 367 + hacks/slip.man | 86 + hacks/speedmine.c | 1634 + hacks/speedmine.man | 246 + hacks/sphere.c | 308 + hacks/sphere.man | 62 + hacks/spiral.c | 335 + hacks/spiral.man | 71 + hacks/spotlight.c | 325 + hacks/spotlight.man | 80 + hacks/squiral.c | 264 + hacks/squiral.man | 80 + hacks/starfish.c | 541 + hacks/starfish.man | 84 + hacks/strange.c | 695 + hacks/strange.man | 62 + hacks/substrate.c | 739 + hacks/substrate.man | 73 + hacks/swirl.c | 1482 + hacks/swirl.man | 70 + hacks/t3d.c | 970 + hacks/t3d.man | 131 + hacks/thornbird.c | 275 + hacks/thornbird.man | 64 + hacks/triangle.c | 363 + hacks/triangle.man | 56 + hacks/truchet.c | 526 + hacks/truchet.man | 139 + hacks/twang.c | 791 + hacks/twang.man | 132 + hacks/vermiculate.c | 1214 + hacks/vermiculate.man | 48 + hacks/vidwhacker | 506 + hacks/vidwhacker.man | 89 + hacks/vines.c | 203 + hacks/vines.man | 66 + hacks/vms_axp.opt | 4 + hacks/vms_axp_12.opt | 4 + hacks/vms_decc.opt | 4 + hacks/vms_decc_12.opt | 4 + hacks/wander.c | 255 + hacks/wander.man | 76 + hacks/webcollage | 3885 ++ hacks/webcollage-cocoa.m | 420 + hacks/webcollage-helper-cocoa.m | 407 + hacks/webcollage-helper.c | 504 + hacks/webcollage.man | 247 + hacks/whirlwindwarp.c | 499 + hacks/whirlwindwarp.man | 64 + hacks/whirlygig.c | 733 + hacks/whirlygig.man | 137 + hacks/worm.c | 442 + hacks/worm.man | 65 + hacks/wormhole.c | 721 + hacks/wormhole.man | 69 + hacks/xanalogtv.c | 617 + hacks/xanalogtv.man | 84 + hacks/xflame.c | 816 + hacks/xflame.man | 72 + hacks/xjack.c | 484 + hacks/xjack.man | 52 + hacks/xlockmore.c | 557 + hacks/xlockmore.h | 198 + hacks/xlockmoreI.h | 170 + hacks/xlyap.c | 1919 + hacks/xlyap.man | 223 + hacks/xmatrix.c | 1850 + hacks/xmatrix.man | 146 + hacks/xml2man.pl | 250 + hacks/xpm-pixmap.c | 363 + hacks/xpm-pixmap.h | 26 + hacks/xrayswarm.c | 1214 + hacks/xrayswarm.man | 50 + hacks/xscreensaver-sgigl.c | 266 + hacks/xspirograph.c | 330 + hacks/xspirograph.man | 71 + hacks/xsublim.c | 798 + hacks/xsublim.man | 91 + hacks/zoom.c | 269 + hacks/zoom.man | 111 + install-sh | 250 + intltool-extract.in | 309 + intltool-merge.in | 567 + intltool-update.in | 613 + makevms.com | 57 + po/ChangeLog | 300 + po/Makefile.in.in | 384 + po/POTFILES.in | 230 + po/ca.po | 8905 ++++ po/da.po | 9938 +++++ po/de.po | 9219 ++++ po/es.po | 10021 +++++ po/et.po | 8995 ++++ po/fi.po | 8939 ++++ po/fr.po | 9248 ++++ po/hu.po | 9760 +++++ po/it.po | 8967 ++++ po/ja.po | 9039 ++++ po/ko.po | 9340 +++++ po/nb.po | 9071 ++++ po/nl.po | 11325 +++++ po/pl.po | 9387 +++++ po/pt.po | 9995 +++++ po/pt_BR.po | 9563 +++++ po/ru.po | 9132 ++++ po/sk.po | 9242 ++++ po/sv.po | 11236 +++++ po/update.sh | 24 + po/vi.po | 9347 +++++ po/wa.po | 9138 ++++ po/zh_CN.po | 9513 +++++ po/zh_TW.po | 9358 +++++ setup.com | 123 + utils/Makefile.in | 306 + utils/README | 6 + utils/ad2c | 42 + utils/alpha.c | 215 + utils/alpha.h | 22 + utils/colorbars.c | 144 + utils/colorbars.h | 24 + utils/colors.c | 701 + utils/colors.h | 140 + utils/compile_axp.com | 26 + utils/compile_decc.com | 26 + utils/erase.c | 758 + utils/erase.h | 20 + utils/fade.c | 962 + utils/fade.h | 21 + utils/grabclient.c | 883 + utils/grabscreen.c | 925 + utils/grabscreen.h | 95 + utils/hsv.c | 81 + utils/hsv.h | 27 + utils/images/logo-180.gif | Bin 0 -> 3328 bytes utils/images/logo-180.xpm | 207 + utils/images/logo-50.gif | Bin 0 -> 857 bytes utils/images/logo-50.xpm | 77 + utils/images/logo-big.gif | Bin 0 -> 17019 bytes utils/images/logo.eps | 8058 ++++ utils/images/screensaver-cmndln.png | Bin 0 -> 1040 bytes utils/images/screensaver-colorselector.png | Bin 0 -> 1104 bytes utils/images/screensaver-diagnostic.png | Bin 0 -> 1307 bytes utils/images/screensaver-locking.png | Bin 0 -> 944 bytes utils/images/screensaver-power.png | Bin 0 -> 973 bytes utils/images/screensaver-snap.png | Bin 0 -> 1272 bytes utils/logo.c | 75 + utils/minixpm.c | 235 + utils/minixpm.h | 28 + utils/overlay.c | 158 + utils/resources.c | 265 + utils/resources.h | 33 + utils/spline.c | 319 + utils/spline.h | 51 + utils/textclient.c | 502 + utils/textclient.h | 31 + utils/usleep.c | 64 + utils/usleep.h | 20 + utils/utils.h | 27 + utils/version.h | 2 + utils/visual-gl.c | 308 + utils/visual.c | 544 + utils/visual.h | 32 + utils/vms-gtod.c | 31 + utils/vms-gtod.h | 85 + utils/vms-strdup.c | 25 + utils/vroot.h | 156 + utils/xdbe.c | 75 + utils/xdbe.h | 27 + utils/xmu.c | 173 + utils/xmu.h | 14 + utils/xscreensaver-intl.h | 36 + utils/xshm.c | 229 + utils/xshm.h | 37 + utils/yarandom.c | 139 + utils/yarandom.h | 65 + xscreensaver.spec | 204 + xscreensaver.xcodeproj/project.pbxproj | 34919 ++++++++++++++++ 1301 files changed, 739333 insertions(+) create mode 100644 INSTALL create mode 100644 Makefile.in create mode 100644 OSX/English.lproj/InfoPlist.strings create mode 100644 OSX/English.lproj/SaverRunner.nib/designable.nib create mode 100644 OSX/English.lproj/SaverRunner.nib/keyedobjects.nib create mode 100644 OSX/InvertedSlider.h create mode 100644 OSX/InvertedSlider.m create mode 100644 OSX/Makefile create mode 100644 OSX/PrefsReader.h create mode 100644 OSX/PrefsReader.m create mode 100644 OSX/README create mode 100644 OSX/SaverListController.h create mode 100644 OSX/SaverListController.m create mode 100644 OSX/SaverRunner.h create mode 100644 OSX/SaverRunner.icns create mode 100644 OSX/SaverRunner.m create mode 100644 OSX/SaverRunner.plist create mode 100644 OSX/XScreenSaver.icns create mode 100644 OSX/XScreenSaver.plist create mode 100644 OSX/XScreenSaverConfigSheet.h create mode 100644 OSX/XScreenSaverConfigSheet.m create mode 100644 OSX/XScreenSaverDMG.icns create mode 100644 OSX/XScreenSaverGLView.h create mode 100644 OSX/XScreenSaverGLView.m create mode 100644 OSX/XScreenSaverSubclass.m create mode 100644 OSX/XScreenSaverView.h create mode 100644 OSX/XScreenSaverView.m create mode 100644 OSX/bindist-DS_Store create mode 100644 OSX/bindist.rtf create mode 100644 OSX/iSaverRunner.ai create mode 100644 OSX/iSaverRunner.plist create mode 100644 OSX/iSaverRunner.xib create mode 100644 OSX/iSaverRunner114.png create mode 100644 OSX/iSaverRunner29.png create mode 100644 OSX/iSaverRunner29t.png create mode 100644 OSX/iSaverRunner50.png create mode 100644 OSX/iSaverRunner57.png create mode 100644 OSX/iSaverRunner72.png create mode 100755 OSX/icmp-warning.pl create mode 100644 OSX/iostextclient.m create mode 100644 OSX/jwxyz-timers.h create mode 100644 OSX/jwxyz-timers.m create mode 100644 OSX/jwxyz.h create mode 100644 OSX/jwxyz.m create mode 100644 OSX/main.m create mode 100644 OSX/osxgrabscreen.m create mode 100755 OSX/update-info-plist.pl create mode 100644 OSX/xscreensaver_Prefix.pch create mode 100644 README create mode 100644 README.VMS create mode 100644 README.hacking create mode 100644 aclocal.m4 create mode 100755 config.guess create mode 100644 config.h-vms create mode 100644 config.h.in create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 driver/.gdbinit create mode 100644 driver/Makefile.in create mode 100644 driver/README create mode 100644 driver/XScreenSaver-Xm.ad create mode 100644 driver/XScreenSaver.ad.in create mode 100644 driver/XScreenSaver_Xm_ad.h create mode 100644 driver/XScreenSaver_ad.h create mode 100644 driver/auth.h create mode 100644 driver/compile_axp.com create mode 100644 driver/compile_decc.com create mode 100644 driver/demo-Gtk-conf.c create mode 100644 driver/demo-Gtk-conf.h create mode 100644 driver/demo-Gtk-stubs.h create mode 100644 driver/demo-Gtk-support.c create mode 100644 driver/demo-Gtk-support.h create mode 100644 driver/demo-Gtk-widgets.c create mode 100644 driver/demo-Gtk-widgets.h create mode 100644 driver/demo-Gtk.c create mode 100644 driver/demo-Xm-widgets.c create mode 100644 driver/demo-Xm.c create mode 100644 driver/dpms.c create mode 100644 driver/exec.c create mode 100644 driver/exec.h create mode 100644 driver/link_axp.com create mode 100644 driver/link_decc.com create mode 100644 driver/lock.c create mode 100644 driver/mlstring.c create mode 100644 driver/mlstring.h create mode 100644 driver/passwd-helper.c create mode 100644 driver/passwd-kerberos.c create mode 100644 driver/passwd-pam.c create mode 100644 driver/passwd-pwent.c create mode 100644 driver/passwd.c create mode 100644 driver/pdf2jpeg.m create mode 100644 driver/pdf2jpeg.man create mode 100644 driver/prefs.c create mode 100644 driver/prefs.h create mode 100644 driver/remote.c create mode 100644 driver/remote.h create mode 100644 driver/screens.c create mode 100644 driver/screensaver-properties.desktop.in create mode 100644 driver/setuid.c create mode 100644 driver/splash.c create mode 100644 driver/stderr.c create mode 100644 driver/subprocs.c create mode 100644 driver/test-apm.c create mode 100644 driver/test-fade.c create mode 100644 driver/test-grab.c create mode 100644 driver/test-mlstring.c create mode 100644 driver/test-passwd.c create mode 100644 driver/test-randr.c create mode 100644 driver/test-screens.c create mode 100644 driver/test-uid.c create mode 100644 driver/test-vp.c create mode 100644 driver/test-xdpms.c create mode 100644 driver/test-xinerama.c create mode 100644 driver/timers.c create mode 100644 driver/types.h create mode 100644 driver/vms-getpwnam.c create mode 100644 driver/vms-hpwd.c create mode 100644 driver/vms-pwd.h create mode 100644 driver/vms-validate.c create mode 100644 driver/vms_axp.opt create mode 100644 driver/vms_axp_12.opt create mode 100644 driver/vms_decc.opt create mode 100644 driver/vms_decc_12.opt create mode 100644 driver/windows.c create mode 100644 driver/xdpyinfo.c create mode 100644 driver/xscreensaver-command.c create mode 100644 driver/xscreensaver-command.man create mode 100644 driver/xscreensaver-demo.glade2 create mode 100644 driver/xscreensaver-demo.glade2p create mode 100644 driver/xscreensaver-demo.man create mode 100755 driver/xscreensaver-getimage-desktop create mode 100644 driver/xscreensaver-getimage-desktop.man create mode 100755 driver/xscreensaver-getimage-file create mode 100644 driver/xscreensaver-getimage-file.man create mode 100755 driver/xscreensaver-getimage-video create mode 100644 driver/xscreensaver-getimage-video.man create mode 100644 driver/xscreensaver-getimage.c create mode 100644 driver/xscreensaver-getimage.man create mode 100755 driver/xscreensaver-text create mode 100644 driver/xscreensaver-text.man create mode 100644 driver/xscreensaver.c create mode 100644 driver/xscreensaver.h create mode 100644 driver/xscreensaver.man create mode 100644 driver/xscreensaver.pam.in create mode 100644 driver/xset.c create mode 100644 hacks/.gdbinit create mode 100644 hacks/Makefile.in create mode 100644 hacks/README create mode 100644 hacks/abstractile.c create mode 100644 hacks/abstractile.man create mode 100644 hacks/analogtv.c create mode 100644 hacks/analogtv.h create mode 100644 hacks/anemone.c create mode 100644 hacks/anemone.man create mode 100644 hacks/anemotaxis.c create mode 100644 hacks/anemotaxis.man create mode 100644 hacks/ant.c create mode 100644 hacks/ant.man create mode 100644 hacks/apollonian.c create mode 100644 hacks/apollonian.man create mode 100644 hacks/apple2-main.c create mode 100644 hacks/apple2.c create mode 100644 hacks/apple2.h create mode 100644 hacks/apple2.man create mode 100644 hacks/asm6502.c create mode 100644 hacks/asm6502.h create mode 100644 hacks/attraction.c create mode 100644 hacks/attraction.man create mode 100644 hacks/automata.h create mode 100644 hacks/barcode.c create mode 100644 hacks/barcode.man create mode 100644 hacks/blaster.c create mode 100644 hacks/blaster.man create mode 100644 hacks/blitspin.c create mode 100644 hacks/blitspin.man create mode 100644 hacks/bouboule.c create mode 100644 hacks/bouboule.man create mode 100644 hacks/boxfit.c create mode 100644 hacks/boxfit.man create mode 100644 hacks/braid.c create mode 100644 hacks/braid.man create mode 100644 hacks/bsod.c create mode 100644 hacks/bsod.man create mode 100644 hacks/bubbles-default.c create mode 100644 hacks/bubbles.c create mode 100644 hacks/bubbles.h create mode 100644 hacks/bubbles.man create mode 100644 hacks/bumps.c create mode 100644 hacks/bumps.man create mode 100644 hacks/ccurve.c create mode 100644 hacks/ccurve.man create mode 100644 hacks/celtic.c create mode 100644 hacks/celtic.man create mode 100755 hacks/check-configs.pl create mode 100644 hacks/cloudlife.c create mode 100644 hacks/cloudlife.man create mode 100644 hacks/compass.c create mode 100644 hacks/compass.man create mode 100644 hacks/compile_axp.com create mode 100644 hacks/compile_decc.com create mode 100644 hacks/config/README create mode 100644 hacks/config/abstractile.xml create mode 100644 hacks/config/anemone.xml create mode 100644 hacks/config/anemotaxis.xml create mode 100644 hacks/config/ant.xml create mode 100644 hacks/config/antinspect.xml create mode 100644 hacks/config/antmaze.xml create mode 100644 hacks/config/antspotlight.xml create mode 100644 hacks/config/apollonian.xml create mode 100644 hacks/config/apple2.xml create mode 100644 hacks/config/atlantis.xml create mode 100644 hacks/config/attraction.xml create mode 100644 hacks/config/atunnel.xml create mode 100644 hacks/config/barcode.xml create mode 100644 hacks/config/blaster.xml create mode 100644 hacks/config/blinkbox.xml create mode 100644 hacks/config/blitspin.xml create mode 100644 hacks/config/blocktube.xml create mode 100644 hacks/config/boing.xml create mode 100644 hacks/config/bouboule.xml create mode 100644 hacks/config/bouncingcow.xml create mode 100644 hacks/config/boxed.xml create mode 100644 hacks/config/boxfit.xml create mode 100644 hacks/config/braid.xml create mode 100644 hacks/config/bsod.xml create mode 100644 hacks/config/bubble3d.xml create mode 100644 hacks/config/bubbles.xml create mode 100644 hacks/config/bumps.xml create mode 100644 hacks/config/cage.xml create mode 100644 hacks/config/carousel.xml create mode 100644 hacks/config/ccurve.xml create mode 100644 hacks/config/celtic.xml create mode 100644 hacks/config/circuit.xml create mode 100644 hacks/config/cloudlife.xml create mode 100644 hacks/config/companioncube.xml create mode 100644 hacks/config/compass.xml create mode 100644 hacks/config/coral.xml create mode 100644 hacks/config/crackberg.xml create mode 100644 hacks/config/critical.xml create mode 100644 hacks/config/crystal.xml create mode 100644 hacks/config/cube21.xml create mode 100644 hacks/config/cubenetic.xml create mode 100644 hacks/config/cubestorm.xml create mode 100644 hacks/config/cubicgrid.xml create mode 100644 hacks/config/cwaves.xml create mode 100644 hacks/config/cynosure.xml create mode 100644 hacks/config/dangerball.xml create mode 100644 hacks/config/decayscreen.xml create mode 100644 hacks/config/deco.xml create mode 100644 hacks/config/deluxe.xml create mode 100644 hacks/config/demon.xml create mode 100644 hacks/config/discrete.xml create mode 100644 hacks/config/distort.xml create mode 100644 hacks/config/dnalogo.xml create mode 100644 hacks/config/drift.xml create mode 100644 hacks/config/endgame.xml create mode 100644 hacks/config/engine.xml create mode 100644 hacks/config/epicycle.xml create mode 100644 hacks/config/eruption.xml create mode 100644 hacks/config/euler2d.xml create mode 100644 hacks/config/extrusion.xml create mode 100644 hacks/config/fadeplot.xml create mode 100644 hacks/config/fiberlamp.xml create mode 100644 hacks/config/fireworkx.xml create mode 100644 hacks/config/flag.xml create mode 100644 hacks/config/flame.xml create mode 100644 hacks/config/flipflop.xml create mode 100644 hacks/config/flipscreen3d.xml create mode 100644 hacks/config/fliptext.xml create mode 100644 hacks/config/flow.xml create mode 100644 hacks/config/fluidballs.xml create mode 100644 hacks/config/flurry.xml create mode 100644 hacks/config/flyingtoasters.xml create mode 100644 hacks/config/fontglide.xml create mode 100644 hacks/config/forest.xml create mode 100644 hacks/config/fuzzyflakes.xml create mode 100644 hacks/config/galaxy.xml create mode 100644 hacks/config/gears.xml create mode 100644 hacks/config/gflux.xml create mode 100644 hacks/config/glblur.xml create mode 100644 hacks/config/glcells.xml create mode 100644 hacks/config/gleidescope.xml create mode 100644 hacks/config/glforestfire.xml create mode 100644 hacks/config/glhanoi.xml create mode 100644 hacks/config/glknots.xml create mode 100644 hacks/config/glmatrix.xml create mode 100644 hacks/config/glplanet.xml create mode 100644 hacks/config/glschool.xml create mode 100644 hacks/config/glslideshow.xml create mode 100644 hacks/config/glsnake.xml create mode 100644 hacks/config/gltext.xml create mode 100644 hacks/config/goop.xml create mode 100644 hacks/config/grav.xml create mode 100644 hacks/config/greynetic.xml create mode 100644 hacks/config/halftone.xml create mode 100644 hacks/config/halo.xml create mode 100644 hacks/config/helix.xml create mode 100644 hacks/config/hilbert.xml create mode 100644 hacks/config/hopalong.xml create mode 100644 hacks/config/hyperball.xml create mode 100644 hacks/config/hypercube.xml create mode 100644 hacks/config/hypertorus.xml create mode 100644 hacks/config/hypnowheel.xml create mode 100644 hacks/config/ifs.xml create mode 100644 hacks/config/imsmap.xml create mode 100644 hacks/config/interaggregate.xml create mode 100644 hacks/config/interference.xml create mode 100644 hacks/config/intermomentary.xml create mode 100644 hacks/config/jigglypuff.xml create mode 100644 hacks/config/jigsaw.xml create mode 100644 hacks/config/juggle.xml create mode 100644 hacks/config/juggler3d.xml create mode 100644 hacks/config/julia.xml create mode 100644 hacks/config/kaleidescope.xml create mode 100644 hacks/config/klein.xml create mode 100644 hacks/config/kumppa.xml create mode 100644 hacks/config/lament.xml create mode 100644 hacks/config/laser.xml create mode 100644 hacks/config/lavalite.xml create mode 100644 hacks/config/lcdscrub.xml create mode 100644 hacks/config/lightning.xml create mode 100644 hacks/config/lisa.xml create mode 100644 hacks/config/lissie.xml create mode 100644 hacks/config/lmorph.xml create mode 100644 hacks/config/lockward.xml create mode 100644 hacks/config/loop.xml create mode 100644 hacks/config/m6502.xml create mode 100644 hacks/config/maze.xml create mode 100644 hacks/config/memscroller.xml create mode 100644 hacks/config/menger.xml create mode 100644 hacks/config/metaballs.xml create mode 100644 hacks/config/mirrorblob.xml create mode 100644 hacks/config/mismunch.xml create mode 100644 hacks/config/moebius.xml create mode 100644 hacks/config/moebiusgears.xml create mode 100644 hacks/config/moire.xml create mode 100644 hacks/config/moire2.xml create mode 100644 hacks/config/molecule.xml create mode 100644 hacks/config/morph3d.xml create mode 100644 hacks/config/mountain.xml create mode 100644 hacks/config/munch.xml create mode 100644 hacks/config/nerverot.xml create mode 100644 hacks/config/noof.xml create mode 100644 hacks/config/noseguy.xml create mode 100644 hacks/config/pacman.xml create mode 100644 hacks/config/pedal.xml create mode 100644 hacks/config/penetrate.xml create mode 100644 hacks/config/penrose.xml create mode 100644 hacks/config/petri.xml create mode 100644 hacks/config/phosphor.xml create mode 100644 hacks/config/photopile.xml create mode 100644 hacks/config/piecewise.xml create mode 100644 hacks/config/pinion.xml create mode 100644 hacks/config/pipes.xml create mode 100644 hacks/config/polyhedra.xml create mode 100644 hacks/config/polyominoes.xml create mode 100644 hacks/config/polytopes.xml create mode 100644 hacks/config/pong.xml create mode 100644 hacks/config/popsquares.xml create mode 100644 hacks/config/providence.xml create mode 100644 hacks/config/pulsar.xml create mode 100644 hacks/config/pyro.xml create mode 100644 hacks/config/qix.xml create mode 100644 hacks/config/queens.xml create mode 100644 hacks/config/rd-bomb.xml create mode 100644 hacks/config/rdbomb.xml create mode 100644 hacks/config/ripples.xml create mode 100644 hacks/config/rocks.xml create mode 100644 hacks/config/rorschach.xml create mode 100644 hacks/config/rotor.xml create mode 100644 hacks/config/rotzoomer.xml create mode 100644 hacks/config/rubik.xml create mode 100644 hacks/config/rubikblocks.xml create mode 100644 hacks/config/sballs.xml create mode 100644 hacks/config/shadebobs.xml create mode 100644 hacks/config/sierpinski.xml create mode 100644 hacks/config/sierpinski3d.xml create mode 100644 hacks/config/skytentacles.xml create mode 100644 hacks/config/slidescreen.xml create mode 100644 hacks/config/slip.xml create mode 100644 hacks/config/sonar.xml create mode 100644 hacks/config/speedmine.xml create mode 100644 hacks/config/sphere.xml create mode 100644 hacks/config/spheremonics.xml create mode 100644 hacks/config/spiral.xml create mode 100644 hacks/config/spotlight.xml create mode 100644 hacks/config/sproingies.xml create mode 100644 hacks/config/squiral.xml create mode 100644 hacks/config/stairs.xml create mode 100644 hacks/config/starfish.xml create mode 100644 hacks/config/starwars.xml create mode 100644 hacks/config/stonerview.xml create mode 100644 hacks/config/strange.xml create mode 100644 hacks/config/substrate.xml create mode 100644 hacks/config/superquadrics.xml create mode 100644 hacks/config/surfaces.xml create mode 100644 hacks/config/swirl.xml create mode 100644 hacks/config/t3d.xml create mode 100644 hacks/config/tangram.xml create mode 100644 hacks/config/thornbird.xml create mode 100644 hacks/config/timetunnel.xml create mode 100644 hacks/config/topblock.xml create mode 100644 hacks/config/triangle.xml create mode 100644 hacks/config/tronbit.xml create mode 100644 hacks/config/truchet.xml create mode 100644 hacks/config/twang.xml create mode 100644 hacks/config/vermiculate.xml create mode 100644 hacks/config/vidwhacker.xml create mode 100644 hacks/config/vines.xml create mode 100644 hacks/config/voronoi.xml create mode 100644 hacks/config/wander.xml create mode 100644 hacks/config/webcollage.xml create mode 100644 hacks/config/whirlwindwarp.xml create mode 100644 hacks/config/whirlygig.xml create mode 100644 hacks/config/worm.xml create mode 100644 hacks/config/wormhole.xml create mode 100644 hacks/config/xanalogtv.xml create mode 100644 hacks/config/xflame.xml create mode 100644 hacks/config/xjack.xml create mode 100644 hacks/config/xlyap.xml create mode 100644 hacks/config/xmatrix.xml create mode 100644 hacks/config/xrayswarm.xml create mode 100644 hacks/config/xspirograph.xml create mode 100644 hacks/config/xss.dtd create mode 100644 hacks/config/xss.xsd create mode 100644 hacks/config/zoom.xml create mode 100644 hacks/coral.c create mode 100644 hacks/coral.man create mode 100644 hacks/critical.c create mode 100644 hacks/critical.man create mode 100644 hacks/crystal.c create mode 100644 hacks/crystal.man create mode 100644 hacks/cwaves.c create mode 100644 hacks/cwaves.man create mode 100644 hacks/cynosure.c create mode 100644 hacks/cynosure.man create mode 100644 hacks/decayscreen.c create mode 100644 hacks/decayscreen.man create mode 100644 hacks/deco.c create mode 100644 hacks/deco.man create mode 100644 hacks/deluxe.c create mode 100644 hacks/deluxe.man create mode 100644 hacks/demon.c create mode 100644 hacks/demon.man create mode 100644 hacks/discrete.c create mode 100644 hacks/discrete.man create mode 100644 hacks/distort.c create mode 100644 hacks/distort.man create mode 100644 hacks/drift.c create mode 100644 hacks/drift.man create mode 100644 hacks/epicycle.c create mode 100644 hacks/epicycle.man create mode 100644 hacks/eruption.c create mode 100644 hacks/eruption.man create mode 100644 hacks/euler2d.c create mode 100644 hacks/euler2d.man create mode 100644 hacks/euler2d.tex create mode 100644 hacks/fadeplot.c create mode 100644 hacks/fadeplot.man create mode 100644 hacks/fiberlamp.c create mode 100644 hacks/fiberlamp.man create mode 100644 hacks/fireworkx.c create mode 100644 hacks/fireworkx.man create mode 100644 hacks/fireworkx_mmx.S create mode 100644 hacks/flag.c create mode 100644 hacks/flag.man create mode 100644 hacks/flame.c create mode 100644 hacks/flame.man create mode 100644 hacks/flow.c create mode 100644 hacks/flow.man create mode 100644 hacks/fluidballs.c create mode 100644 hacks/fluidballs.man create mode 100644 hacks/fontglide.c create mode 100644 hacks/fontglide.man create mode 100644 hacks/forest.c create mode 100644 hacks/forest.man create mode 100644 hacks/fps.c create mode 100644 hacks/fps.h create mode 100644 hacks/fpsI.h create mode 100644 hacks/fuzzyflakes.c create mode 100644 hacks/fuzzyflakes.man create mode 100644 hacks/galaxy.c create mode 100644 hacks/galaxy.man create mode 100644 hacks/glx/Makefile.in create mode 100644 hacks/glx/README create mode 100644 hacks/glx/antinspect.c create mode 100644 hacks/glx/antinspect.man create mode 100644 hacks/glx/antmaze.c create mode 100644 hacks/glx/antmaze.man create mode 100644 hacks/glx/ants.h create mode 100644 hacks/glx/antspotlight.c create mode 100644 hacks/glx/antspotlight.man create mode 100644 hacks/glx/atlantis.c create mode 100644 hacks/glx/atlantis.h create mode 100644 hacks/glx/atlantis.man create mode 100644 hacks/glx/atunnel.c create mode 100644 hacks/glx/atunnel.man create mode 100644 hacks/glx/b_draw.c create mode 100644 hacks/glx/b_lockglue.c create mode 100644 hacks/glx/b_sphere.c create mode 100644 hacks/glx/blinkbox.c create mode 100644 hacks/glx/blinkbox.man create mode 100644 hacks/glx/blocktube.c create mode 100644 hacks/glx/blocktube.man create mode 100644 hacks/glx/boing.c create mode 100644 hacks/glx/boing.man create mode 100644 hacks/glx/bouncingcow.c create mode 100644 hacks/glx/bouncingcow.man create mode 100644 hacks/glx/boxed.c create mode 100644 hacks/glx/boxed.h create mode 100644 hacks/glx/boxed.man create mode 100644 hacks/glx/bubble3d.c create mode 100644 hacks/glx/bubble3d.h create mode 100644 hacks/glx/bubble3d.man create mode 100644 hacks/glx/buildlwo.c create mode 100644 hacks/glx/buildlwo.h create mode 100644 hacks/glx/cage.c create mode 100644 hacks/glx/cage.man create mode 100644 hacks/glx/carousel.c create mode 100644 hacks/glx/carousel.man create mode 100644 hacks/glx/chessgames.h create mode 100644 hacks/glx/chessmodels.c create mode 100644 hacks/glx/chessmodels.h create mode 100644 hacks/glx/circuit.c create mode 100644 hacks/glx/circuit.man create mode 100644 hacks/glx/companion.c create mode 100644 hacks/glx/companion_disc.c create mode 100644 hacks/glx/companion_heart.c create mode 100644 hacks/glx/companion_quad.c create mode 100644 hacks/glx/companioncube.man create mode 100644 hacks/glx/cow_face.c create mode 100644 hacks/glx/cow_hide.c create mode 100644 hacks/glx/cow_hoofs.c create mode 100644 hacks/glx/cow_horns.c create mode 100644 hacks/glx/cow_tail.c create mode 100644 hacks/glx/cow_udder.c create mode 100644 hacks/glx/crackberg.c create mode 100644 hacks/glx/crackberg.man create mode 100644 hacks/glx/cube21.c create mode 100644 hacks/glx/cube21.man create mode 100644 hacks/glx/cubenetic.c create mode 100644 hacks/glx/cubenetic.man create mode 100644 hacks/glx/cubestorm.c create mode 100644 hacks/glx/cubestorm.man create mode 100644 hacks/glx/cubicgrid.c create mode 100644 hacks/glx/cubicgrid.man create mode 100644 hacks/glx/dangerball.c create mode 100644 hacks/glx/dangerball.man create mode 100644 hacks/glx/dnalogo.c create mode 100644 hacks/glx/dolphin.c create mode 100644 hacks/glx/dropshadow.c create mode 100644 hacks/glx/dropshadow.h create mode 100755 hacks/glx/dxf2gl.pl create mode 100644 hacks/glx/e_textures.h create mode 100644 hacks/glx/endgame.c create mode 100644 hacks/glx/endgame.man create mode 100644 hacks/glx/engine.c create mode 100644 hacks/glx/engine.man create mode 100644 hacks/glx/extrusion-helix2.c create mode 100644 hacks/glx/extrusion-helix3.c create mode 100644 hacks/glx/extrusion-helix4.c create mode 100644 hacks/glx/extrusion-joinoffset.c create mode 100644 hacks/glx/extrusion-screw.c create mode 100644 hacks/glx/extrusion-taper.c create mode 100644 hacks/glx/extrusion-twistoid.c create mode 100644 hacks/glx/extrusion.c create mode 100644 hacks/glx/extrusion.h create mode 100644 hacks/glx/extrusion.man create mode 100644 hacks/glx/flipflop.c create mode 100644 hacks/glx/flipflop.man create mode 100644 hacks/glx/flipscreen3d.c create mode 100644 hacks/glx/flipscreen3d.man create mode 100644 hacks/glx/fliptext.c create mode 100644 hacks/glx/fliptext.man create mode 100644 hacks/glx/flurry-smoke.c create mode 100644 hacks/glx/flurry-spark.c create mode 100644 hacks/glx/flurry-star.c create mode 100644 hacks/glx/flurry-texture.c create mode 100644 hacks/glx/flurry.c create mode 100644 hacks/glx/flurry.h create mode 100644 hacks/glx/flurry.man create mode 100644 hacks/glx/flyingtoasters.c create mode 100644 hacks/glx/flyingtoasters.man create mode 100644 hacks/glx/font-ximage.c create mode 100644 hacks/glx/font-ximage.h create mode 100644 hacks/glx/fps-gl.c create mode 100644 hacks/glx/gears.c create mode 100644 hacks/glx/gears.man create mode 100644 hacks/glx/gflux.c create mode 100644 hacks/glx/gflux.man create mode 100644 hacks/glx/glblur.c create mode 100644 hacks/glx/glblur.man create mode 100644 hacks/glx/glcells.c create mode 100644 hacks/glx/glcells.man create mode 100644 hacks/glx/gleidescope.c create mode 100644 hacks/glx/gleidescope.man create mode 100644 hacks/glx/glforestfire.c create mode 100644 hacks/glx/glforestfire.man create mode 100644 hacks/glx/glhanoi.c create mode 100644 hacks/glx/glhanoi.man create mode 100644 hacks/glx/glknots.c create mode 100644 hacks/glx/glknots.man create mode 100644 hacks/glx/gllist.c create mode 100644 hacks/glx/gllist.h create mode 100644 hacks/glx/glmatrix.c create mode 100644 hacks/glx/glmatrix.man create mode 100644 hacks/glx/glplanet.c create mode 100644 hacks/glx/glplanet.man create mode 100644 hacks/glx/glschool.c create mode 100644 hacks/glx/glschool.h create mode 100644 hacks/glx/glschool.man create mode 100644 hacks/glx/glschool_alg.c create mode 100644 hacks/glx/glschool_alg.h create mode 100644 hacks/glx/glschool_gl.c create mode 100644 hacks/glx/glschool_gl.h create mode 100644 hacks/glx/glslideshow.c create mode 100644 hacks/glx/glslideshow.man create mode 100644 hacks/glx/glsnake.c create mode 100644 hacks/glx/glsnake.man create mode 100644 hacks/glx/gltext.c create mode 100644 hacks/glx/gltext.man create mode 100644 hacks/glx/gltrackball.c create mode 100644 hacks/glx/gltrackball.h create mode 100644 hacks/glx/glut_roman.h create mode 100644 hacks/glx/glut_stroke.c create mode 100644 hacks/glx/glut_swidth.c create mode 100644 hacks/glx/glutstroke.h create mode 100644 hacks/glx/glxfonts.c create mode 100644 hacks/glx/glxfonts.h create mode 100644 hacks/glx/grab-ximage.c create mode 100644 hacks/glx/grab-ximage.h create mode 100644 hacks/glx/hilbert.c create mode 100644 hacks/glx/hilbert.man create mode 100644 hacks/glx/hypertorus.c create mode 100644 hacks/glx/hypertorus.man create mode 100644 hacks/glx/hypnowheel.c create mode 100644 hacks/glx/hypnowheel.man create mode 100644 hacks/glx/involute.c create mode 100644 hacks/glx/involute.h create mode 100644 hacks/glx/jigglypuff.c create mode 100644 hacks/glx/jigglypuff.man create mode 100644 hacks/glx/jigsaw.c create mode 100644 hacks/glx/jigsaw.man create mode 100644 hacks/glx/juggler3d.c create mode 100644 hacks/glx/juggler3d.man create mode 100644 hacks/glx/jwzgles.c create mode 100644 hacks/glx/jwzgles.h create mode 100644 hacks/glx/jwzglesI.h create mode 100644 hacks/glx/klein.c create mode 100644 hacks/glx/klein.man create mode 100644 hacks/glx/lament.c create mode 100644 hacks/glx/lament.man create mode 100644 hacks/glx/lavalite.c create mode 100644 hacks/glx/lavalite.man create mode 100644 hacks/glx/lockward.c create mode 100644 hacks/glx/lockward.man create mode 100644 hacks/glx/marching.c create mode 100644 hacks/glx/marching.h create mode 100644 hacks/glx/menger.c create mode 100644 hacks/glx/menger.man create mode 100644 hacks/glx/mirrorblob.c create mode 100644 hacks/glx/mirrorblob.man create mode 100644 hacks/glx/moebius.c create mode 100644 hacks/glx/moebius.man create mode 100644 hacks/glx/moebiusgears.c create mode 100644 hacks/glx/moebiusgears.man create mode 100644 hacks/glx/molecule.c create mode 100644 hacks/glx/molecule.man create mode 100755 hacks/glx/molecules.sh create mode 100644 hacks/glx/morph3d.c create mode 100644 hacks/glx/morph3d.man create mode 100644 hacks/glx/noof.c create mode 100644 hacks/glx/noof.man create mode 100644 hacks/glx/normals.c create mode 100644 hacks/glx/normals.h create mode 100644 hacks/glx/photopile.c create mode 100644 hacks/glx/photopile.man create mode 100644 hacks/glx/pinion.c create mode 100644 hacks/glx/pinion.man create mode 100644 hacks/glx/pipeobjs.c create mode 100644 hacks/glx/pipes.c create mode 100644 hacks/glx/pipes.man create mode 100644 hacks/glx/polyhedra-gl.c create mode 100644 hacks/glx/polyhedra.c create mode 100644 hacks/glx/polyhedra.h create mode 100644 hacks/glx/polyhedra.man create mode 100644 hacks/glx/polytopes.c create mode 100644 hacks/glx/polytopes.man create mode 100644 hacks/glx/providence.c create mode 100644 hacks/glx/providence.man create mode 100644 hacks/glx/pulsar.c create mode 100644 hacks/glx/pulsar.man create mode 100644 hacks/glx/queens.c create mode 100644 hacks/glx/queens.man create mode 100644 hacks/glx/rotator.c create mode 100644 hacks/glx/rotator.h create mode 100644 hacks/glx/rubik.c create mode 100644 hacks/glx/rubik.man create mode 100644 hacks/glx/rubikblocks.c create mode 100644 hacks/glx/rubikblocks.man create mode 100644 hacks/glx/s1_1.c create mode 100644 hacks/glx/s1_2.c create mode 100644 hacks/glx/s1_3.c create mode 100644 hacks/glx/s1_4.c create mode 100644 hacks/glx/s1_5.c create mode 100644 hacks/glx/s1_6.c create mode 100644 hacks/glx/s1_b.c create mode 100644 hacks/glx/sballs.c create mode 100644 hacks/glx/sballs.man create mode 100644 hacks/glx/shark.c create mode 100644 hacks/glx/sierpinski3d.c create mode 100644 hacks/glx/sierpinski3d.man create mode 100644 hacks/glx/skytentacles.c create mode 100644 hacks/glx/skytentacles.man create mode 100644 hacks/glx/sonar-icmp.c create mode 100644 hacks/glx/sonar-sim.c create mode 100644 hacks/glx/sonar.c create mode 100644 hacks/glx/sonar.h create mode 100644 hacks/glx/sonar.man create mode 100644 hacks/glx/sphere.c create mode 100644 hacks/glx/sphere.h create mode 100644 hacks/glx/spheremonics.c create mode 100644 hacks/glx/spheremonics.man create mode 100644 hacks/glx/sproingies.c create mode 100644 hacks/glx/sproingies.h create mode 100644 hacks/glx/sproingies.man create mode 100644 hacks/glx/sproingiewrap.c create mode 100644 hacks/glx/stairs.c create mode 100644 hacks/glx/stairs.man create mode 100644 hacks/glx/starwars.c create mode 100644 hacks/glx/starwars.h create mode 100644 hacks/glx/starwars.man create mode 100644 hacks/glx/starwars.txt create mode 100644 hacks/glx/stonerview-move.c create mode 100644 hacks/glx/stonerview-move.h create mode 100644 hacks/glx/stonerview-osc.c create mode 100644 hacks/glx/stonerview-osc.h create mode 100644 hacks/glx/stonerview-view.c create mode 100644 hacks/glx/stonerview.c create mode 100644 hacks/glx/stonerview.h create mode 100644 hacks/glx/stonerview.man create mode 100644 hacks/glx/superquadrics.c create mode 100644 hacks/glx/superquadrics.man create mode 100644 hacks/glx/surfaces.c create mode 100644 hacks/glx/surfaces.man create mode 100644 hacks/glx/swim.c create mode 100644 hacks/glx/tangram.c create mode 100644 hacks/glx/tangram.man create mode 100644 hacks/glx/tangram_shapes.c create mode 100644 hacks/glx/tangram_shapes.h create mode 100644 hacks/glx/teapot.c create mode 100644 hacks/glx/teapot.h create mode 100644 hacks/glx/texfont.c create mode 100644 hacks/glx/texfont.h create mode 100644 hacks/glx/timetunnel.c create mode 100644 hacks/glx/timetunnel.man create mode 100644 hacks/glx/toast.c create mode 100644 hacks/glx/toast2.c create mode 100644 hacks/glx/toaster.c create mode 100644 hacks/glx/toaster_base.c create mode 100644 hacks/glx/toaster_handle.c create mode 100644 hacks/glx/toaster_handle2.c create mode 100644 hacks/glx/toaster_jet.c create mode 100644 hacks/glx/toaster_knob.c create mode 100644 hacks/glx/toaster_slots.c create mode 100644 hacks/glx/toaster_wing.c create mode 100644 hacks/glx/topblock.c create mode 100644 hacks/glx/topblock.h create mode 100644 hacks/glx/topblock.man create mode 100644 hacks/glx/trackball.c create mode 100644 hacks/glx/trackball.h create mode 100644 hacks/glx/tronbit.c create mode 100644 hacks/glx/tronbit.man create mode 100644 hacks/glx/tronbit_idle1.c create mode 100644 hacks/glx/tronbit_idle2.c create mode 100644 hacks/glx/tronbit_no.c create mode 100644 hacks/glx/tronbit_yes.c create mode 100644 hacks/glx/tube.c create mode 100644 hacks/glx/tube.h create mode 100644 hacks/glx/tunnel_draw.c create mode 100644 hacks/glx/tunnel_draw.h create mode 100644 hacks/glx/voronoi.c create mode 100644 hacks/glx/voronoi.man create mode 100755 hacks/glx/vrml2gl.pl create mode 100755 hacks/glx/wfront2gl.pl create mode 100644 hacks/glx/whale.c create mode 100644 hacks/glx/xlock-gl-utils.c create mode 100644 hacks/glx/xpm-ximage.c create mode 100644 hacks/glx/xpm-ximage.h create mode 100644 hacks/glx/xscreensaver-gl-helper.c create mode 100644 hacks/glx/xscreensaver-gl-helper.man create mode 100644 hacks/goop.c create mode 100644 hacks/goop.man create mode 100644 hacks/grav.c create mode 100644 hacks/grav.man create mode 100644 hacks/greynetic.c create mode 100644 hacks/greynetic.man create mode 100644 hacks/halftone.c create mode 100644 hacks/halftone.man create mode 100644 hacks/halo.c create mode 100644 hacks/halo.man create mode 100644 hacks/helix.c create mode 100644 hacks/helix.man create mode 100644 hacks/hopalong.c create mode 100644 hacks/hopalong.man create mode 100644 hacks/hyperball.c create mode 100644 hacks/hyperball.man create mode 100644 hacks/hypercube.c create mode 100644 hacks/hypercube.man create mode 100644 hacks/ifs.c create mode 100644 hacks/ifs.man create mode 100644 hacks/images/6x10font.xbm create mode 100644 hacks/images/amiga.xpm create mode 100644 hacks/images/apple2font.xbm create mode 100644 hacks/images/atari.xbm create mode 100644 hacks/images/atm.xbm create mode 100644 hacks/images/blocktube.xpm create mode 100644 hacks/images/bob.xbm create mode 100644 hacks/images/bubbles/blood.pov create mode 100644 hacks/images/bubbles/blood1.xpm create mode 100644 hacks/images/bubbles/blood10.xpm create mode 100644 hacks/images/bubbles/blood11.xpm create mode 100644 hacks/images/bubbles/blood2.xpm create mode 100644 hacks/images/bubbles/blood3.xpm create mode 100644 hacks/images/bubbles/blood4.xpm create mode 100644 hacks/images/bubbles/blood5.xpm create mode 100644 hacks/images/bubbles/blood6.xpm create mode 100644 hacks/images/bubbles/blood7.xpm create mode 100644 hacks/images/bubbles/blood8.xpm create mode 100644 hacks/images/bubbles/blood9.xpm create mode 100644 hacks/images/bubbles/blue.pov create mode 100644 hacks/images/bubbles/blue1.xpm create mode 100644 hacks/images/bubbles/blue10.xpm create mode 100644 hacks/images/bubbles/blue11.xpm create mode 100644 hacks/images/bubbles/blue2.xpm create mode 100644 hacks/images/bubbles/blue3.xpm create mode 100644 hacks/images/bubbles/blue4.xpm create mode 100644 hacks/images/bubbles/blue5.xpm create mode 100644 hacks/images/bubbles/blue6.xpm create mode 100644 hacks/images/bubbles/blue7.xpm create mode 100644 hacks/images/bubbles/blue8.xpm create mode 100644 hacks/images/bubbles/blue9.xpm create mode 100644 hacks/images/bubbles/glass.pov create mode 100644 hacks/images/bubbles/glass1.xpm create mode 100644 hacks/images/bubbles/glass10.xpm create mode 100644 hacks/images/bubbles/glass11.xpm create mode 100644 hacks/images/bubbles/glass2.xpm create mode 100644 hacks/images/bubbles/glass3.xpm create mode 100644 hacks/images/bubbles/glass4.xpm create mode 100644 hacks/images/bubbles/glass5.xpm create mode 100644 hacks/images/bubbles/glass6.xpm create mode 100644 hacks/images/bubbles/glass7.xpm create mode 100644 hacks/images/bubbles/glass8.xpm create mode 100644 hacks/images/bubbles/glass9.xpm create mode 100644 hacks/images/bubbles/jade.pov create mode 100644 hacks/images/bubbles/jade1.xpm create mode 100644 hacks/images/bubbles/jade10.xpm create mode 100644 hacks/images/bubbles/jade11.xpm create mode 100644 hacks/images/bubbles/jade2.xpm create mode 100644 hacks/images/bubbles/jade3.xpm create mode 100644 hacks/images/bubbles/jade4.xpm create mode 100644 hacks/images/bubbles/jade5.xpm create mode 100644 hacks/images/bubbles/jade6.xpm create mode 100644 hacks/images/bubbles/jade7.xpm create mode 100644 hacks/images/bubbles/jade8.xpm create mode 100644 hacks/images/bubbles/jade9.xpm create mode 100644 hacks/images/chromesphere.xpm create mode 100644 hacks/images/earth.xpm create mode 100644 hacks/images/ground.xpm create mode 100644 hacks/images/hmac.xpm create mode 100644 hacks/images/jigglymap.xpm create mode 100644 hacks/images/lament128.xpm create mode 100644 hacks/images/lament512.xpm create mode 100644 hacks/images/m6502/amiga.asm create mode 100644 hacks/images/m6502/breakout.asm create mode 100644 hacks/images/m6502/byterun.asm create mode 100644 hacks/images/m6502/cellular-30.asm create mode 100644 hacks/images/m6502/cellular-600.asm create mode 100644 hacks/images/m6502/colors.asm create mode 100644 hacks/images/m6502/crunch6502.asm create mode 100644 hacks/images/m6502/demoscene.asm create mode 100644 hacks/images/m6502/disco.asm create mode 100644 hacks/images/m6502/dmsc.asm create mode 100644 hacks/images/m6502/dragon-fractal.asm create mode 100644 hacks/images/m6502/fullscreenlogo.asm create mode 100644 hacks/images/m6502/keftal.asm create mode 100644 hacks/images/m6502/matrix.asm create mode 100644 hacks/images/m6502/noise.asm create mode 100644 hacks/images/m6502/random-walk.asm create mode 100644 hacks/images/m6502/random.asm create mode 100644 hacks/images/m6502/random2.asm create mode 100644 hacks/images/m6502/rorschach.asm create mode 100644 hacks/images/m6502/santa.asm create mode 100644 hacks/images/m6502/selfmodify.asm create mode 100644 hacks/images/m6502/sierpinsky.asm create mode 100644 hacks/images/m6502/softsprite.asm create mode 100644 hacks/images/m6502/spacer.asm create mode 100644 hacks/images/m6502/starfield2d.asm create mode 100644 hacks/images/m6502/wave6502.asm create mode 100644 hacks/images/m6502/zookeeper.asm create mode 100644 hacks/images/mac.xbm create mode 100644 hacks/images/macbomb.xbm create mode 100644 hacks/images/matrix1.xbm create mode 100644 hacks/images/matrix1.xpm create mode 100644 hacks/images/matrix1b.xbm create mode 100644 hacks/images/matrix1b.xpm create mode 100644 hacks/images/matrix2.xbm create mode 100644 hacks/images/matrix2.xpm create mode 100644 hacks/images/matrix2b.xbm create mode 100644 hacks/images/matrix2b.xpm create mode 100644 hacks/images/matrix3.xpm create mode 100644 hacks/images/molecules/adenine.pdb create mode 100644 hacks/images/molecules/adrenochrome.pdb create mode 100644 hacks/images/molecules/bucky.pdb create mode 100644 hacks/images/molecules/caffeine.pdb create mode 100644 hacks/images/molecules/capsaicin.pdb create mode 100644 hacks/images/molecules/chlordecone.pdb create mode 100644 hacks/images/molecules/cocaine.pdb create mode 100644 hacks/images/molecules/codeine.pdb create mode 100644 hacks/images/molecules/cyclohexane.pdb create mode 100644 hacks/images/molecules/cytosine.pdb create mode 100644 hacks/images/molecules/dna.pdb create mode 100644 hacks/images/molecules/dodecahedrane.pdb create mode 100644 hacks/images/molecules/dthc.pdb create mode 100644 hacks/images/molecules/dynamite.pdb create mode 100644 hacks/images/molecules/glycol.pdb create mode 100644 hacks/images/molecules/guanine.pdb create mode 100644 hacks/images/molecules/heroin.pdb create mode 100644 hacks/images/molecules/hexahelicene.pdb create mode 100644 hacks/images/molecules/ibuprofen.pdb create mode 100644 hacks/images/molecules/lsd.pdb create mode 100644 hacks/images/molecules/menthol.pdb create mode 100644 hacks/images/molecules/mescaline.pdb create mode 100644 hacks/images/molecules/methamphetamine.pdb create mode 100644 hacks/images/molecules/morphine.pdb create mode 100644 hacks/images/molecules/nicotine.pdb create mode 100644 hacks/images/molecules/novocaine.pdb create mode 100644 hacks/images/molecules/olestra.pdb create mode 100644 hacks/images/molecules/penicillin.pdb create mode 100644 hacks/images/molecules/salvinorin.pdb create mode 100644 hacks/images/molecules/sarin.pdb create mode 100644 hacks/images/molecules/strychnine.pdb create mode 100644 hacks/images/molecules/sucrose.pdb create mode 100644 hacks/images/molecules/thalidomide.pdb create mode 100644 hacks/images/molecules/thymine.pdb create mode 100644 hacks/images/molecules/viagra.pdb create mode 100644 hacks/images/molecules/vitaminb6.pdb create mode 100644 hacks/images/molecules/vitaminc.pdb create mode 100644 hacks/images/molecules/vx.pdb create mode 100644 hacks/images/noseguy/nose-f1.xbm create mode 100644 hacks/images/noseguy/nose-f1.xpm create mode 100644 hacks/images/noseguy/nose-f2.xbm create mode 100644 hacks/images/noseguy/nose-f2.xpm create mode 100644 hacks/images/noseguy/nose-f3.xbm create mode 100644 hacks/images/noseguy/nose-f3.xpm create mode 100644 hacks/images/noseguy/nose-f4.xbm create mode 100644 hacks/images/noseguy/nose-f4.xpm create mode 100644 hacks/images/noseguy/nose-l1.xbm create mode 100644 hacks/images/noseguy/nose-l1.xpm create mode 100644 hacks/images/noseguy/nose-l2.xbm create mode 100644 hacks/images/noseguy/nose-l2.xpm create mode 100644 hacks/images/noseguy/nose-r1.xbm create mode 100644 hacks/images/noseguy/nose-r1.xpm create mode 100644 hacks/images/noseguy/nose-r2.xbm create mode 100644 hacks/images/noseguy/nose-r2.xpm create mode 100644 hacks/images/osx_10_2.xpm create mode 100644 hacks/images/osx_10_3.xpm create mode 100644 hacks/images/pacman/eyes-d.xpm create mode 100644 hacks/images/pacman/eyes-l.xpm create mode 100644 hacks/images/pacman/eyes-r.xpm create mode 100644 hacks/images/pacman/eyes-u.xpm create mode 100644 hacks/images/pacman/ghost-d1.xpm create mode 100644 hacks/images/pacman/ghost-d2.xpm create mode 100644 hacks/images/pacman/ghost-l1.xpm create mode 100644 hacks/images/pacman/ghost-l2.xpm create mode 100644 hacks/images/pacman/ghost-mask.xpm create mode 100644 hacks/images/pacman/ghost-r1.xpm create mode 100644 hacks/images/pacman/ghost-r2.xpm create mode 100644 hacks/images/pacman/ghost-s1.xpm create mode 100644 hacks/images/pacman/ghost-s2.xpm create mode 100644 hacks/images/pacman/ghost-sf1.xpm create mode 100644 hacks/images/pacman/ghost-sf2.xpm create mode 100644 hacks/images/pacman/ghost-u1.xpm create mode 100644 hacks/images/pacman/ghost-u2.xpm create mode 100644 hacks/images/pacman/pacman-0.xpm create mode 100644 hacks/images/pacman/pacman-d1.xpm create mode 100644 hacks/images/pacman/pacman-d2.xpm create mode 100644 hacks/images/pacman/pacman-ds1.xpm create mode 100644 hacks/images/pacman/pacman-ds2.xpm create mode 100644 hacks/images/pacman/pacman-ds3.xpm create mode 100644 hacks/images/pacman/pacman-ds4.xpm create mode 100644 hacks/images/pacman/pacman-ds5.xpm create mode 100644 hacks/images/pacman/pacman-ds6.xpm create mode 100644 hacks/images/pacman/pacman-ds7.xpm create mode 100644 hacks/images/pacman/pacman-ds8.xpm create mode 100644 hacks/images/pacman/pacman-l1.xpm create mode 100644 hacks/images/pacman/pacman-l2.xpm create mode 100644 hacks/images/pacman/pacman-r1.xpm create mode 100644 hacks/images/pacman/pacman-r2.xpm create mode 100644 hacks/images/pacman/pacman-u1.xpm create mode 100644 hacks/images/pacman/pacman-u2.xpm create mode 100644 hacks/images/sball-bg.xpm create mode 100644 hacks/images/sball.xpm create mode 100644 hacks/images/scales.xpm create mode 100644 hacks/images/sea-texture.xpm create mode 100644 hacks/images/som.xbm create mode 100644 hacks/images/timetunnel0.xpm create mode 100644 hacks/images/timetunnel1.xpm create mode 100644 hacks/images/timetunnel2.xpm create mode 100644 hacks/images/toast.xpm create mode 100644 hacks/images/tree.xpm create mode 100644 hacks/images/tunnel0.xpm create mode 100644 hacks/images/tunnel1.xpm create mode 100644 hacks/images/tunnel2.xpm create mode 100644 hacks/images/tunnel3.xpm create mode 100644 hacks/images/tunnel4.xpm create mode 100644 hacks/images/tunnel5.xpm create mode 100644 hacks/images/tunnelstar.xpm create mode 100644 hacks/images/wood.xpm create mode 100644 hacks/imsmap.c create mode 100644 hacks/imsmap.man create mode 100644 hacks/interaggregate.c create mode 100644 hacks/interaggregate.man create mode 100644 hacks/interference.c create mode 100644 hacks/interference.man create mode 100644 hacks/intermomentary.c create mode 100644 hacks/intermomentary.man create mode 100644 hacks/juggle.c create mode 100644 hacks/juggle.man create mode 100644 hacks/julia.c create mode 100644 hacks/julia.man create mode 100644 hacks/kaleidescope.c create mode 100644 hacks/kaleidescope.man create mode 100644 hacks/kumppa.c create mode 100644 hacks/kumppa.man create mode 100644 hacks/laser.c create mode 100644 hacks/laser.man create mode 100644 hacks/lcdscrub.c create mode 100644 hacks/lcdscrub.man create mode 100644 hacks/lightning.c create mode 100644 hacks/lightning.man create mode 100644 hacks/link_axp.com create mode 100644 hacks/link_decc.com create mode 100644 hacks/lisa.c create mode 100644 hacks/lisa.man create mode 100644 hacks/lissie.c create mode 100644 hacks/lissie.man create mode 100755 hacks/ljlatest create mode 100644 hacks/ljlatest.man create mode 100644 hacks/lmorph.c create mode 100644 hacks/lmorph.man create mode 100644 hacks/loop.c create mode 100644 hacks/loop.man create mode 100644 hacks/m6502.c create mode 100755 hacks/m6502.sh create mode 100644 hacks/maze.c create mode 100644 hacks/maze.man create mode 100644 hacks/memscroller.c create mode 100644 hacks/memscroller.man create mode 100644 hacks/metaballs.c create mode 100644 hacks/metaballs.man create mode 100644 hacks/moire.c create mode 100644 hacks/moire.man create mode 100644 hacks/moire2.c create mode 100644 hacks/moire2.man create mode 100644 hacks/mountain.c create mode 100644 hacks/mountain.man create mode 100644 hacks/munch.c create mode 100644 hacks/munch.man create mode 100755 hacks/munge-ad.pl create mode 100644 hacks/nerverot.c create mode 100644 hacks/nerverot.man create mode 100644 hacks/noseguy.c create mode 100644 hacks/noseguy.man create mode 100644 hacks/pacman.c create mode 100644 hacks/pacman.h create mode 100644 hacks/pacman.man create mode 100644 hacks/pacman_ai.c create mode 100644 hacks/pacman_ai.h create mode 100644 hacks/pacman_level.c create mode 100644 hacks/pacman_level.h create mode 100644 hacks/pedal.c create mode 100644 hacks/pedal.man create mode 100644 hacks/penetrate.c create mode 100644 hacks/penetrate.man create mode 100644 hacks/penrose.c create mode 100644 hacks/penrose.man create mode 100644 hacks/petri.c create mode 100644 hacks/petri.man create mode 100644 hacks/phosphor.c create mode 100644 hacks/phosphor.man create mode 100644 hacks/piecewise.c create mode 100644 hacks/piecewise.man create mode 100644 hacks/polyominoes.c create mode 100644 hacks/polyominoes.man create mode 100644 hacks/pong.c create mode 100644 hacks/pong.man create mode 100644 hacks/popsquares.c create mode 100644 hacks/pyro.c create mode 100644 hacks/pyro.man create mode 100644 hacks/qix.c create mode 100644 hacks/qix.man create mode 100644 hacks/rd-bomb.c create mode 100644 hacks/rd-bomb.man create mode 100644 hacks/ripples.c create mode 100644 hacks/ripples.man create mode 100644 hacks/rocks.c create mode 100644 hacks/rocks.man create mode 100644 hacks/rorschach.c create mode 100644 hacks/rorschach.man create mode 100644 hacks/rotor.c create mode 100644 hacks/rotor.man create mode 100644 hacks/rotzoomer.c create mode 100644 hacks/rotzoomer.man create mode 100644 hacks/screenhack.c create mode 100644 hacks/screenhack.h create mode 100644 hacks/screenhackI.h create mode 100644 hacks/shadebobs.c create mode 100644 hacks/shadebobs.man create mode 100644 hacks/sierpinski.c create mode 100644 hacks/sierpinski.man create mode 100644 hacks/slidescreen.c create mode 100644 hacks/slidescreen.man create mode 100644 hacks/slip.c create mode 100644 hacks/slip.man create mode 100644 hacks/speedmine.c create mode 100644 hacks/speedmine.man create mode 100644 hacks/sphere.c create mode 100644 hacks/sphere.man create mode 100644 hacks/spiral.c create mode 100644 hacks/spiral.man create mode 100644 hacks/spotlight.c create mode 100644 hacks/spotlight.man create mode 100644 hacks/squiral.c create mode 100644 hacks/squiral.man create mode 100644 hacks/starfish.c create mode 100644 hacks/starfish.man create mode 100644 hacks/strange.c create mode 100644 hacks/strange.man create mode 100644 hacks/substrate.c create mode 100644 hacks/substrate.man create mode 100644 hacks/swirl.c create mode 100644 hacks/swirl.man create mode 100644 hacks/t3d.c create mode 100644 hacks/t3d.man create mode 100644 hacks/thornbird.c create mode 100644 hacks/thornbird.man create mode 100644 hacks/triangle.c create mode 100644 hacks/triangle.man create mode 100644 hacks/truchet.c create mode 100644 hacks/truchet.man create mode 100644 hacks/twang.c create mode 100644 hacks/twang.man create mode 100644 hacks/vermiculate.c create mode 100644 hacks/vermiculate.man create mode 100755 hacks/vidwhacker create mode 100644 hacks/vidwhacker.man create mode 100644 hacks/vines.c create mode 100644 hacks/vines.man create mode 100644 hacks/vms_axp.opt create mode 100644 hacks/vms_axp_12.opt create mode 100644 hacks/vms_decc.opt create mode 100644 hacks/vms_decc_12.opt create mode 100644 hacks/wander.c create mode 100644 hacks/wander.man create mode 100755 hacks/webcollage create mode 100644 hacks/webcollage-cocoa.m create mode 100644 hacks/webcollage-helper-cocoa.m create mode 100644 hacks/webcollage-helper.c create mode 100644 hacks/webcollage.man create mode 100644 hacks/whirlwindwarp.c create mode 100644 hacks/whirlwindwarp.man create mode 100644 hacks/whirlygig.c create mode 100644 hacks/whirlygig.man create mode 100644 hacks/worm.c create mode 100644 hacks/worm.man create mode 100644 hacks/wormhole.c create mode 100644 hacks/wormhole.man create mode 100644 hacks/xanalogtv.c create mode 100644 hacks/xanalogtv.man create mode 100644 hacks/xflame.c create mode 100644 hacks/xflame.man create mode 100644 hacks/xjack.c create mode 100644 hacks/xjack.man create mode 100644 hacks/xlockmore.c create mode 100644 hacks/xlockmore.h create mode 100644 hacks/xlockmoreI.h create mode 100644 hacks/xlyap.c create mode 100644 hacks/xlyap.man create mode 100644 hacks/xmatrix.c create mode 100644 hacks/xmatrix.man create mode 100755 hacks/xml2man.pl create mode 100644 hacks/xpm-pixmap.c create mode 100644 hacks/xpm-pixmap.h create mode 100644 hacks/xrayswarm.c create mode 100644 hacks/xrayswarm.man create mode 100644 hacks/xscreensaver-sgigl.c create mode 100644 hacks/xspirograph.c create mode 100644 hacks/xspirograph.man create mode 100644 hacks/xsublim.c create mode 100644 hacks/xsublim.man create mode 100644 hacks/zoom.c create mode 100644 hacks/zoom.man create mode 100644 install-sh create mode 100644 intltool-extract.in create mode 100644 intltool-merge.in create mode 100644 intltool-update.in create mode 100644 makevms.com create mode 100644 po/ChangeLog create mode 100644 po/Makefile.in.in create mode 100644 po/POTFILES.in create mode 100644 po/ca.po create mode 100644 po/da.po create mode 100644 po/de.po create mode 100644 po/es.po create mode 100644 po/et.po create mode 100644 po/fi.po create mode 100644 po/fr.po create mode 100644 po/hu.po create mode 100644 po/it.po create mode 100644 po/ja.po create mode 100644 po/ko.po create mode 100644 po/nb.po create mode 100644 po/nl.po create mode 100644 po/pl.po create mode 100644 po/pt.po create mode 100644 po/pt_BR.po create mode 100644 po/ru.po create mode 100644 po/sk.po create mode 100644 po/sv.po create mode 100755 po/update.sh create mode 100644 po/vi.po create mode 100644 po/wa.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_TW.po create mode 100644 setup.com create mode 100644 utils/Makefile.in create mode 100644 utils/README create mode 100755 utils/ad2c create mode 100644 utils/alpha.c create mode 100644 utils/alpha.h create mode 100644 utils/colorbars.c create mode 100644 utils/colorbars.h create mode 100644 utils/colors.c create mode 100644 utils/colors.h create mode 100644 utils/compile_axp.com create mode 100644 utils/compile_decc.com create mode 100644 utils/erase.c create mode 100644 utils/erase.h create mode 100644 utils/fade.c create mode 100644 utils/fade.h create mode 100644 utils/grabclient.c create mode 100644 utils/grabscreen.c create mode 100644 utils/grabscreen.h create mode 100644 utils/hsv.c create mode 100644 utils/hsv.h create mode 100644 utils/images/logo-180.gif create mode 100644 utils/images/logo-180.xpm create mode 100644 utils/images/logo-50.gif create mode 100644 utils/images/logo-50.xpm create mode 100644 utils/images/logo-big.gif create mode 100644 utils/images/logo.eps create mode 100644 utils/images/screensaver-cmndln.png create mode 100644 utils/images/screensaver-colorselector.png create mode 100644 utils/images/screensaver-diagnostic.png create mode 100644 utils/images/screensaver-locking.png create mode 100644 utils/images/screensaver-power.png create mode 100644 utils/images/screensaver-snap.png create mode 100644 utils/logo.c create mode 100644 utils/minixpm.c create mode 100644 utils/minixpm.h create mode 100644 utils/overlay.c create mode 100644 utils/resources.c create mode 100644 utils/resources.h create mode 100644 utils/spline.c create mode 100644 utils/spline.h create mode 100644 utils/textclient.c create mode 100644 utils/textclient.h create mode 100644 utils/usleep.c create mode 100644 utils/usleep.h create mode 100644 utils/utils.h create mode 100644 utils/version.h create mode 100644 utils/visual-gl.c create mode 100644 utils/visual.c create mode 100644 utils/visual.h create mode 100644 utils/vms-gtod.c create mode 100644 utils/vms-gtod.h create mode 100644 utils/vms-strdup.c create mode 100644 utils/vroot.h create mode 100644 utils/xdbe.c create mode 100644 utils/xdbe.h create mode 100644 utils/xmu.c create mode 100644 utils/xmu.h create mode 100644 utils/xscreensaver-intl.h create mode 100644 utils/xshm.c create mode 100644 utils/xshm.h create mode 100644 utils/yarandom.c create mode 100644 utils/yarandom.h create mode 100644 xscreensaver.spec create mode 100644 xscreensaver.xcodeproj/project.pbxproj diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..50dbe439 --- /dev/null +++ b/INSTALL @@ -0,0 +1,183 @@ +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..a99184a2 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,374 @@ +# Makefile.in --- xscreensaver, Copyright (c) 1999-2010 Jamie Zawinski. +# the `../configure' script generates `Makefile' from this file. + +@SET_MAKE@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +SHELL = /bin/sh +SUBDIRS = utils driver hacks hacks/glx po +#SUBDIRS = utils driver hacks hacks/glx +SUBDIRS2 = $(SUBDIRS) OSX +TARFILES = README README.hacking README.VMS INSTALL \ + configure configure.in Makefile.in config.h.in \ + config.h-vms install-sh setup.com config.guess aclocal.m4 \ + config.sub makevms.com \ + intltool-merge.in intltool-extract.in intltool-update.in \ + xscreensaver.spec \ + xscreensaver.xcodeproj/project.pbxproj + +TAR = tar + +MAKE_SUBDIR = for dir in $(SUBDIRS); do (cd $$dir; $(MAKE) $@) || exit 5; done +MAKE_SUBDIR2 = for dir in $(SUBDIRS2);do (cd $$dir; $(MAKE) $@) || exit 5; done + +default:: + @$(MAKE_SUBDIR) +all:: + @$(MAKE_SUBDIR) +install:: + @$(MAKE_SUBDIR) +install-program:: + @$(MAKE_SUBDIR) +install-man:: + @$(MAKE_SUBDIR) +install-strip:: + @$(MAKE_SUBDIR) +uninstall:: + @$(MAKE_SUBDIR) +uninstall-program:: + @$(MAKE_SUBDIR) +uninstall-man:: + @$(MAKE_SUBDIR) +depend:: + @$(MAKE_SUBDIR) +distdepend:: + @$(MAKE) update_spec_version + @$(MAKE_SUBDIR2) + @cd po ; $(MAKE) update-po + +TAGS:: tags +tags:: + @$(MAKE_SUBDIR) + +clean:: + @$(MAKE_SUBDIR2) + +distclean:: clean + -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"* intltool-extract intltool-merge intltool-update + @$(MAKE_SUBDIR2) + +dist:: tar + +# This really makes me sick... +tar:: + @ \ + sh config.status ; \ + rm -f configure ; \ + $(MAKE) configure ; \ + $(MAKE) version-date distdepend ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \ + NAME="xscreensaver-$$VERS" ; \ + rm -rf $$NAME ; ln -s . $$NAME ; \ + FILES= ; \ + ADIR=archive/ ; \ + for subdir in $(SUBDIRS2) ; do \ + d=`pwd` ; \ + cd $$subdir ; \ + FILES="$$FILES `$(MAKE) echo_tarfiles \ + | grep -v '^.*make\[' \ + | sed \"s|^|$$subdir/|g;s| | $$subdir/|g\" \ + ` "; \ + cd $$d ; done ; \ + echo creating tar file $$ADIR$$NAME.tar.gz... ; \ + export COPYFILE_DISABLE=true ; \ + GZIP="-9v" $(TAR) -vchzf $$ADIR$$NAME.tar.gz \ + `echo $(TARFILES) $$FILES | sed "s|^|$$NAME/|g; s| | $$NAME/|g" ` ; \ + rm $$NAME + + +# This also makes me sick... +# autoconf generates a configure script that begins with a very hard to read, +# nearly impossible to customize --help blurb. This horrid set of regexps +# go through and clean up the help text, by inserting whitespace and ripping +# out options we don't use. Odds are good that this will fail with any version +# of autoconf other than the ones I've tried (2.12 and 2.13.) +# +# NOTE: we now require autoconf 2.63 or earlier, because later versions have +# the "Expanded-Before-Required" change and I can't make any sense of it. +# If someone wants to send me a patch to make configure.in work with 2.64 +# or later, feel free. Personally, I can't be bothered. +# +configure:: + autoconf263 + autoheader263 + @TMP=configure.$$$$ ; \ + echo "munging configure's --help message..." ; \ + ( perl -e ' \ + my $$file=""; \ + while (<>) { $$file .= $$_; } \ + $$_ = $$file; \ + \ + s/^(Configuration:)$$/\n$$1\n/m; \ + s/^(Directory and file names:)$$/\n$$1\n/m; \ + s/^ --sbindir=.*\n//m; \ + s/^ --sysconfdir.*\n//m; \ + s/^ --sharedstatedir.*\n.*\n//m; \ + s/^ --localstatedir.*\n//m; \ + s/^ --infodir.*\n//m; \ + s/^(Host type:)$$/\n$$1\n/m; \ + s/\nFeatures and packages:\n.*library files are in DIR\n/\n/s;\ + s/--enable and --with options recognized://m; \ + s/\n --with-x .*?(["\n])/$$1/s; \ + s/\n(Installation options:\n)/$$1/s; \ + \ + s/^ --oldincludedir=.*$$/ \ + --x-includes=DIR X include files are in DIR\n \ + --x-libraries=DIR X library files are in DIR/m; \ + \ + s@mandir=.\$${prefix}/man.@mandir=\\\$${datadir}/man@; \ + \ + s@rm -f conftest@rm -rf conftest@g; \ + \ + print;' \ + < configure \ + > $$TMP && \ + cat $$TMP > configure ) ; \ + rm -f $$TMP + +bump-version:: + @ \ + SRC=utils/version.h ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\)\.\([0-9][^. ]*\).*/\1 \2/p' $$SRC` ; \ + set - $$VERS ; \ + MAJOR="$$1"; MINOR="$$2"; \ + NEW=`echo $$MINOR + 1 | bc` ; \ + NEW=`echo $$NEW | sed 's/^\([0-9]\)$$/0\1/'` ; \ + D=`date '+%d-%b-%Y'`; \ + ADIR=archive/ ; \ + if [ ! -f $${ADIR}xscreensaver-$$MAJOR.$$MINOR.tar.gz ]; then \ + echo "WARNING: $${ADIR}xscreensaver-$$MAJOR.$$MINOR.tar.gz does not exist.";\ + fi ; \ + if [ -f $${ADIR}xscreensaver-$$MAJOR.$$NEW.tar.gz ]; then \ + echo "WARNING: $${ADIR}xscreensaver-$$MAJOR.$$NEW.tar.gz already exists.";\ + fi ; \ + /bin/echo -n "Bumping $$MAJOR.$$MINOR to $$MAJOR.$$NEW ($$D), ok? "; \ + read line; \ + if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \ + exit 1 ; \ + fi ; \ + TMP=/tmp/bv.$$ ; \ + sed -e "s/\([0-9]\.[0-9][0-9]*\)/$$MAJOR.$$NEW/" \ + -e "s/\(([0-9][0-9]*-[A-Za-z][a-z][a-z]-[0-9][0-9][0-9]*\))/($$D)/" \ + $$SRC > $$TMP ; \ + /bin/echo -n "New version and date are "; \ + sed -n "s/[^0-9]*\([0-9]\.[0-9][0-9]*\) (\([-A-Za-z0-9]*\)).*/\1, \2./p" \ + $$TMP; \ + cat $$TMP > $$SRC ; \ + rm -f $$TMP; \ + echo "overwrote $$SRC"; \ + ls -lFd $$SRC + +bump_version:: bump-version +tick-version:: bump-version +tick_version:: bump-version + +version-date:: + @ \ + SRC=utils/version.h ; \ + D=`date '+%d-%b-%Y'`; \ + TMP=/tmp/bv.$$ ; \ + sed -e "s/([0-9][^()]*)/($$D)/" < $$SRC > $$TMP ; \ + /bin/echo -n "Updating date in $$SRC to \"$$D\"... " ; \ + if cmp -s $$SRC $$TMP ; then \ + echo "unchanged." ; \ + else \ + cat $$TMP > $$SRC ; \ + echo "done." ; \ + fi ; \ + rm -f $$TMP + + +update_spec_version:: + @S=$(srcdir)/xscreensaver.spec ; \ + U=$(srcdir)/utils/version.h ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' < $$U` ; \ + /bin/echo -n "Updating $$S to \"$$VERS\"... " ; \ + T=/tmp/xs.$$$$ ; \ + sed "s/^\(%define.version[^0-9]*\)\(.*\)/\1$$VERS/" \ + < $$S > $$T ; \ + if cmp -s $$S $$T ; then \ + echo "unchanged." ; \ + else \ + cat $$T > $$S ; \ + echo "done." ; \ + fi ; \ + rm $$T + +rpm:: + @ \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \ + DIR=`pwd`/rpm_build ; \ + ARCH=`rpm --showrc | sed -n 's/^build arch *: //p'` ; \ + ADIR=archive/ ; \ + TGZ=xscreensaver-$$VERS.tar.gz ; \ + if [ ! -f $${ADIR}$$TGZ ]; then \ + echo "$${ADIR}$$TGZ does not exist! Did you forget to \`make tar'?" ; \ + exit 1 ; \ + fi ; \ + rm -rf /var/tmp/xscreensaver-$$VERS-root ; \ + rm -rf $$DIR ; \ + mkdir $$DIR ; \ + ( cd $$DIR; mkdir BUILD RPMS RPMS/$$ARCH SOURCES SPECS SRPMS ) ; \ + cp -p $${ADIR}$$TGZ $$DIR/SOURCES/ ; \ + rpmbuild --define "_topdir $$DIR" \ + --define "USE_GL yes" \ + -v -ba xscreensaver.spec ; \ + echo '' ; \ + echo 'RPM build complete' ; \ + echo '' ; \ + rm -f $$DIR/$$TGZ ; \ + rm -rf $$DIR/BUILD/xscreensaver-$$VERS ; \ + mv $$DIR/SRPMS/xscreensaver*-$$VERS-*.rpm . ; \ + mv $$DIR/RPMS/$$ARCH/xscreensaver*-$$VERS-*.rpm . ; \ + rm -rf $$DIR ; \ + echo '' ; \ + ls -lFG xscreensaver*-$$VERS-*.rpm + +test-tar:: + @ \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \ + D=xscreensaver-$$VERS ; \ + ADIR=archive/ ; \ + NAME="$${ADIR}$$D.tar.gz" ; \ + if [ ! -f $$NAME ]; then \ + echo "$$NAME does not exist! Did you forget to \`make tar'?" ; \ + exit 1 ; \ + fi ; \ + \ + set -e ; \ + set -x ; \ + \ + if [ -d $$D ]; then \ + chmod -R u+w $$D ; \ + fi ; \ + rm -rf $$D ; \ + zcat $${ADIR}$$D.tar.gz | tar -xf - ; \ + cd $$D ; \ + chmod -R a-w . ; \ + chmod u+w . ; \ + mkdir BIN ; \ + mkdir BIN/motif ; \ + mkdir BIN/lesstif ; \ + chmod a-w . ; \ + \ + ( cd BIN/motif ; \ + CC=cc ; \ + export CC ; \ + ../../configure --without-xpm --without-xdbe --without-xshm \ + --with-motif=/usr/local/motif ; \ + echo --------------------------------------------------------------- ; \ + gmake all ; \ + ( cd driver; gmake tests ) ; \ + echo --------------------------------------------------------------- ); \ + \ + ( cd BIN/lesstif ; \ + CC=cc ; \ + export CC ; \ + ../../configure --with-motif=/usr/local/lesstif --without-gnome ; \ + echo --------------------------------------------------------------- ; \ + ( cd utils; gmake all ) ; \ + ( cd driver; gmake all ) ; \ + echo --------------------------------------------------------------- ); \ + \ + chmod -R u+w . + +dmg:: + cd OSX ; $(MAKE) release dmg + +www:: + @ \ + DEST=$$HOME/www/xscreensaver ; \ + VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \ + HEAD="xscreensaver-$$VERS" ; \ + ADIR=archive/ ; \ + BNAME="$$HEAD.tar.gz" ; \ + NAME="$$ADIR$$BNAME" ; \ + DNAME="$$DEST/$$HEAD.tar.gz" ; \ + BNAME2="$$HEAD.dmg" ; \ + NAME2="$$ADIR$$BNAME2" ; \ + DNAME2="$$DEST/$$HEAD.dmg" ; \ + \ + if [ ! -f $$NAME ]; then \ + echo "$$NAME does not exist! Did you forget to \`make tar'?" ; \ + exit 1 ; \ + fi ; \ + if [ ! -f $$NAME2 ]; then \ + echo "$$NAME2 does not exist! Did you forget to \`make dmg'?" ; \ + exit 1 ; \ + fi ; \ + chmod a-w $$NAME ; \ + if [ -f $$DNAME ]; then \ + /bin/echo -n "WARNING: $$DNAME already exists! Overwrite? "; \ + read line; \ + if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \ + exit 1 ; \ + fi ; \ + fi ; \ + if [ -f $$DNAME2 ]; then \ + /bin/echo -n "WARNING: $$DNAME2 already exists! Overwrite? "; \ + read line; \ + if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \ + exit 1 ; \ + fi ; \ + fi ; \ + cp -p $$NAME $$DNAME ; \ + cp -p $$NAME2 $$DNAME2 ; \ + chmod u+w $$DNAME $$DNAME2 ; \ + cd $$DEST ; \ + \ + TMP=/tmp/xd.$$$$ ; \ + sed "s/xscreensaver-5\.[0-9][0-9ab]*/$$HEAD/g" download.html > $$TMP ; \ + echo '' ; \ + diff -U0 download.html $$TMP ; \ + echo '' ; \ + \ + for EXT in tar.gz dmg ; do \ + OLDEST=`ls xscreensaver*.$$EXT | head -n 1` ; \ + /bin/echo -n "Delete $$DEST/$$OLDEST? "; \ + read line; \ + if [ "x$$line" = "xyes" -o "x$$line" = "xy" ]; then \ + set -x ; \ + rm $$OLDEST ; \ + cvs remove $$OLDEST ; \ + set +x ; \ + fi ; \ + done ; \ + set -x ; \ + cvs add -kb $$BNAME $$BNAME2 ; \ + cat $$TMP > download.html ; \ + rm -f $$TMP ; \ + \ + (cd ..; $(MAKE) xscreensaver/changelog.html \ + xscreensaver/screenshots/index.html ); \ + cvs diff -U0 changelog.html ; \ + set +x ; \ + \ + /bin/echo -n "Ok? "; \ + read line; \ + if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \ + exit 1 ; \ + fi ; \ + \ + cvs commit -m "$$VERS" + + +count:: + @ \ + /bin/echo -n "Current hack count: " ; \ + ( ( cd hacks; make -s INSTALL=true install-program install-scripts ) ; \ + ( cd hacks/glx; make -s INSTALL=true install-program ) ) | \ + grep true | \ + grep -v helper | \ + grep -v ljlatest | \ + wc -l diff --git a/OSX/English.lproj/InfoPlist.strings b/OSX/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..dea12de4cad936a6204d4da70d2ca96aef900b31 GIT binary patch literal 92 zcmW-Z!3uyN5C!M#S9tbN-x2r|Q3;V~qzLu#)x*oq?lA28G2*azG7B@2orjH8u89{# bCX+-f2F*!V&^~bXzEEWk)pxI)ej3aVcM}l{ literal 0 HcmV?d00001 diff --git a/OSX/English.lproj/SaverRunner.nib/designable.nib b/OSX/English.lproj/SaverRunner.nib/designable.nib new file mode 100644 index 00000000..1facee5e --- /dev/null +++ b/OSX/English.lproj/SaverRunner.nib/designable.nib @@ -0,0 +1,1790 @@ + + + + 1050 + 10K549 + 851 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 851 + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + + NSApplication + + + + FirstResponder + + + NSApplication + + + MainMenu + + + + XScreenSaver + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + XScreenSaver + + + + About XScreenSaver + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + YES + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + + Services + + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide XScreenSaver + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit XScreenSaver + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + + File + + + + + Close + w + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup… + P + 1048576 + 2147483647 + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + + Edit + + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + + Find + + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1048576 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling + + 1048576 + 2147483647 + + + submenuAction: + + Spelling + + + + Spelling… + : + 1048576 + 2147483647 + + + + + + Check Spelling + ; + 1048576 + 2147483647 + + + + + + Check Spelling as You Type + + 1048576 + 2147483647 + + + + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + + Window + + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 1048576 + 2147483647 + + + submenuAction: + + Help + + + + YES + XScreenSaver Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + SaverRunner + + + + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + showHelp: + + + + 122 + + + + terminate: + + + + 139 + + + + hideOtherApplications: + + + + 146 + + + + hide: + + + + 152 + + + + unhideAllApplications: + + + + 153 + + + + cut: + + + + 175 + + + + paste: + + + + 176 + + + + redo: + + + + 178 + + + + selectAll: + + + + 179 + + + + undo: + + + + 180 + + + + copy: + + + + 181 + + + + showGuessPanel: + + + + 188 + + + + checkSpelling: + + + + 190 + + + + toggleContinuousSpellChecking: + + + + 192 + + + + performClose: + + + + 193 + + + + delete: + + + + 195 + + + + performZoom: + + + + 198 + + + + performFindPanelAction: + + + + 199 + + + + performFindPanelAction: + + + + 200 + + + + performFindPanelAction: + + + + 201 + + + + performFindPanelAction: + + + + 202 + + + + centerSelectionInVisibleArea: + + + + 203 + + + + pasteAsPlainText: + + + + 205 + + + + delegate + + + + 207 + + + + menubar + + + + 209 + + + + openPreferences: + + + + 212 + + + + aboutPanel: + + + + 213 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + MainMenu + + + 19 + + + + + + + + 24 + + + + + + + + + + + 5 + + + + + 23 + + + + + 92 + + + + + 197 + + + + + 56 + + + + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 129 + + + + + 131 + + + + + + + + 130 + + + + + 134 + + + + + 136 + + + + + 143 + + + + + 144 + + + + + 145 + + + + + 149 + + + + + 150 + + + + + 196 + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + 73 + + + + + 74 + + + + + 77 + + + + + 78 + + + + + 103 + + + + + + + + 106 + + + + + + + + 111 + + + + + 163 + + + + + + + + 169 + + + + + + + + + + + + + + + + + + + 156 + + + + + 157 + + + + + 158 + + + + + 160 + + + + + 164 + + + + + 168 + + + + + + + + 159 + + + + + + + + + + + + 154 + + + + + 155 + + + + + 161 + + + + + 162 + + + + + 167 + + + + + 171 + + + + + 172 + + + + + 173 + + + + + 174 + + + + + 184 + + + + + + + + 185 + + + + + + + + + + 187 + + + + + 189 + + + + + 191 + + + + + 204 + + + + + 206 + + + SaverRunner + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{72, 1365}, {344, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{84, 1182}, {225, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + + 213 + + + + + SaverRunner + NSObject + + id + id + + + + aboutPanel: + id + + + openPreferences: + id + + + + menubar + NSMenu + + + menubar + + menubar + NSMenu + + + + IBProjectSource + OSX/SaverRunner.h + + + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSDocument + NSObject + + id + id + id + id + id + id + + + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocument.h + + + + NSDocument + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentScripting.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAlert.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAnimation.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSComboBox.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSComboBoxCell.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDatePickerCell.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSImage.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSound.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSpeechRecognizer.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSpeechSynthesizer.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSplitView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTabView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTextStorage.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTextView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTokenField.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTokenFieldCell.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbar.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSTableView + NSControl + + + + NSText + NSView + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + + + NSWindow + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + YES + ../../xscreensaver.xcodeproj + 3 + + {9, 8} + {7, 2} + + + diff --git a/OSX/English.lproj/SaverRunner.nib/keyedobjects.nib b/OSX/English.lproj/SaverRunner.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..96d6891c19180e3ef02fa68453004348827e9178 GIT binary patch literal 13707 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 +* +* Permission to use, copy, modify, distribute, and sell this software and its +* documentation for any purpose is hereby granted without fee, provided that +* the above copyright notice appear in all copies and that both that +* copyright notice and this permission notice appear in supporting +* documentation. No representations are made about the suitability of this +* software for any purpose. It is provided "as is" without express or +* implied warranty. +* +* This is a subclass of NSSlider that is flipped horizontally: +* the high value is on the left and the low value is on the right. +*/ + +#ifdef USE_IPHONE +# import +# define NSSlider UISlider +# define NSRect CGRect +# define minValue minimumValue +# define maxValue maximumValue +#else +# import +#endif + +@interface InvertedSlider : NSSlider +{ + BOOL inverted; + BOOL integers; +} + +- (id) initWithFrame:(NSRect)r inverted:(BOOL)_inv integers:(BOOL)_int; + +@end diff --git a/OSX/InvertedSlider.m b/OSX/InvertedSlider.m new file mode 100644 index 00000000..c4fd5e37 --- /dev/null +++ b/OSX/InvertedSlider.m @@ -0,0 +1,159 @@ +/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski +* +* Permission to use, copy, modify, distribute, and sell this software and its +* documentation for any purpose is hereby granted without fee, provided that +* the above copyright notice appear in all copies and that both that +* copyright notice and this permission notice appear in supporting +* documentation. No representations are made about the suitability of this +* software for any purpose. It is provided "as is" without express or +* implied warranty. +* +* This is a subclass of NSSlider that is flipped horizontally: +* the high value is on the left and the low value is on the right. +*/ + +#import "InvertedSlider.h" + +@implementation InvertedSlider + +- (id) initWithFrame:(NSRect)r +{ + self = [super initWithFrame:r]; + if (! self) return 0; + inverted = YES; + integers = NO; + return self; +} + +- (id) initWithFrame:(NSRect)r inverted:(BOOL)_inv integers:(BOOL)_int +{ + self = [self initWithFrame:r]; + inverted = _inv; + integers = _int; + return self; +} + + +-(double) transformValue:(double) value +{ + double v2 = (integers + ? (int) (value + (value < 0 ? -0.5 : 0.5)) + : value); + double low = [self minValue]; + double high = [self maxValue]; + double range = high - low; + double off = v2 - low; + if (inverted) + v2 = low + (range - off); + // NSLog (@" ... %.1f -> %.1f [%.1f - %.1f]", value, v2, low, high); + return v2; +} + +-(double) doubleValue; +{ +# ifdef USE_IPHONE + return [self transformValue:[self value]]; +# else + return [self transformValue:[super doubleValue]]; +# endif +} + +-(void) setDoubleValue:(double)v +{ +# ifdef USE_IPHONE + return [super setValue:[self transformValue:v]]; +# else + return [super setDoubleValue:[self transformValue:v]]; +# endif +} + + +#ifdef USE_IPHONE + +- (void)setValue:(float)v animated:(BOOL)a +{ + return [super setValue:[self transformValue:v] animated:a]; +} + + +/* Draw the thumb in the right place by also inverting its position + relative to the track. + */ +- (CGRect)thumbRectForBounds:(CGRect)bounds + trackRect:(CGRect)rect + value:(float)value +{ + CGRect thumb = [super thumbRectForBounds:bounds trackRect:rect value:value]; + if (inverted) + thumb.origin.x = rect.size.width - thumb.origin.x - thumb.size.width; + return thumb; +} + +#endif // !USE_IPHONE + + + +/* Implement all accessor methods in terms of "doubleValue" above. + (Note that these normally exist only on MacOS, not on iOS.) + */ + +-(float) floatValue; +{ + return (float) [self doubleValue]; +} + +-(int) intValue; +{ + return (int) [self doubleValue]; +} + +-(id) objectValue; +{ + return [NSNumber numberWithDouble:[self doubleValue]]; +} + +-(NSString *) stringValue; +{ + return [NSString stringWithFormat:@"%f", [self floatValue]]; +} + +- (NSAttributedString *)attributedStringValue; +{ + // #### "Build and Analyze" says this leaks. Unsure whether this is true. + return [[NSAttributedString alloc] initWithString:[self stringValue]]; +} + + +/* Implment all setter methods in terms of "setDoubleValue", above. + */ + +-(void) setFloatValue:(float)v +{ + [self setDoubleValue:(double)v]; +} + +-(void) setIntValue:(int)v +{ + [self setDoubleValue:(double)v]; +} + +-(void) setObjectValue:(id )v +{ + NSAssert2((v == nil) || + [(NSObject *) v respondsToSelector:@selector(doubleValue)], + @"argument %@ to %s does not respond to doubleValue", + v, __PRETTY_FUNCTION__); + [self setDoubleValue:[((NSNumber *) v) doubleValue]]; +} + +-(void) setStringValue:(NSString *)v +{ + [self setDoubleValue:[v doubleValue]]; +} + +-(void) setAttributedStringValue:(NSAttributedString *)v +{ + [self setStringValue:[v string]]; +} + +@end diff --git a/OSX/Makefile b/OSX/Makefile new file mode 100644 index 00000000..63a5aba5 --- /dev/null +++ b/OSX/Makefile @@ -0,0 +1,148 @@ +# XScreenSaver for MacOS X, Copyright (c) 2006-2011 by Jamie Zawinski. + +XCODEBUILD = /Developer/usr/bin/xcodebuild +TARGETS = -target "All Savers" +ARCH = -arch i386 -arch x86_64 +CERT = 'Jamie Zawinski' +CERT = 'iPhone Developer: Jamie Zawinski (Y5M82TL69N)' + +default: release +all: debug release + +clean: + -rm -rf build +# cd ..; $(XCODEBUILD) -target $(TARGETS) clean + +distclean: + -rm -f config.status config.cache config.log \ + *.bak *.rej TAGS *~ "#"* + -rm -rf autom4te*.cache + -rm -rf build + +distdepend:: update_plist_version + +debug: distdepend + cd ..; $(XCODEBUILD) $(ARCH) $(TARGETS) -configuration Debug build + +release:: distdepend + cd ..; $(XCODEBUILD) $(ARCH) $(TARGETS) -configuration Release build + +release:: check_versions + +release:: sign + +sign: + @for f in build/Release/*.{saver,app} ; do \ + codesign -vfs $(CERT) $$f ; \ + done + +check_versions: + @\ + SRC=../utils/version.h ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' $$SRC` ; \ + DIR=build/Release ; \ + RESULT=0 ; \ + for S in $$DIR/*.{saver,app} ; do \ + for P in $$S/Contents/Info.plist ; do \ + V2=`perl -0000 -n -e \ + 'm@CFBundleVersion\s*(.*?)@si \ + && print $$1' < $$P` ; \ + if [ "$$V2" != "$$V" ] ; then \ + echo "Wrong version: $$S ($$V2)" ; \ + RESULT=1 ; \ + fi ; \ + done ; \ + done ; \ + if [ "$$RESULT" = 0 ]; then echo "Versions match ($$V2)" ; fi ; \ + exit $$RESULT + + +echo_tarfiles: + @echo `find . \ + \( \( -name '.??*' -o -name build -o -name CVS -o -name '*~*' \ + -o -name 'jwz.*' \) \ + -prune \) \ + -o -type f -print \ + | sed 's@^\./@@' \ + | sort` + +update_plist_version: + @ \ + SRC=../utils/version.h ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' $$SRC` ; \ + T=/tmp/xs.$$$$ ; \ + for S in XScreenSaver.plist SaverRunner.plist iSaverRunner.plist ; do \ + /bin/echo -n "Updating version number in $$S to \"$$V\"... " ; \ + KEYS="CFBundleVersion|CFBundleShortVersionString" ; \ + perl -0777 -pne \ + "s@(($$KEYS)\s*)[^<>]+()@\$${1}$$V\$${3}@g" \ + < $$S > $$T ; \ + if cmp -s $$S $$T ; then \ + echo "unchanged." ; \ + else \ + cat $$T > $$S ; \ + echo "done." ; \ + fi ; \ + done ; \ + rm $$T + +# -format UDBZ saves 4% (~1.2 MB) over UDZO. +dmg:: distdepend check_versions + @ \ + set -e ; \ + SRC=../utils/version.h ; \ + V=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' $$SRC` ; \ + TMPDIR="build" ; \ + SRC="build/Release" ; \ + EXTRAS=../../xdaliclock/OSX/build/Release/*.saver ; \ + BASE="xscreensaver-$$V" ; \ + OUTDIR="../archive" ; \ + DMG="$$OUTDIR/$$BASE.dmg" ; \ + TMPDMG="$$TMPDIR/tmp.dmg" ; \ + VOLNAME="XScreenSaver $$V" ; \ + STAGE="$$TMPDIR/dmg_stage" ; \ + rm -f "$$DMG" ; \ + rm -rf "$$STAGE" ; \ + echo + mkdir "$$STAGE" ; \ + mkdir "$$STAGE" ; \ + \ + retired=`perl -0 -ne \ + 's/\\\\\\n//g; m/^RETIRED_EXES\s*=\s*(.*)$$/m && print "$$1\n"' \ + ../hacks/Makefile.in ; \ + perl -0 -ne \ + 's/\\\\\\n//g; m/^RETIRED_GL_EXES\s*=\s*(.*)$$/m && print "$$1\n"' \ + ../hacks/glx/Makefile.in ; \ + echo xscreensaver` ; \ + \ + for f in $$SRC/*.{saver,app} $$EXTRAS ; do \ + ok=yes ; \ + ff=`echo $$f | perl -e '$$_=<>; s@^.*/(.*)\..*$$@\L$$1@; print'`; \ + for r in $$retired ; do \ + if [ "$$ff" = "$$r" ]; then ok=no ; fi ; \ + done ; \ + if [ "$$ok" = yes ]; then \ + echo + cp -pr "$$f" "$$STAGE/" ; \ + cp -pr "$$f" "$$STAGE/" ; \ + else \ + echo skipping "$$f" ; \ + fi ; \ + done ; \ + set -x ; \ + cp -p bindist.rtf "$$STAGE/ READ ME.rtf" ; \ + cp -p bindist-DS_Store "$$STAGE/.DS_Store" ; \ + cp -p XScreenSaverDMG.icns "$$STAGE/.VolumeIcon.icns" ; \ + /Developer/Tools/SetFile -a C "$$STAGE" ; \ + /Developer/Tools/SetFile -a E "$$STAGE/ READ ME.rtf" ; \ + seticon -d ../../xdaliclock/OSX/daliclockSaver.icns $$STAGE/DaliClock.saver;\ + hdiutil makehybrid -quiet -ov -hfs -hfs-volume-name "$$VOLNAME" \ + -hfs-openfolder "$$STAGE" "$$STAGE" -o "$$TMPDMG" ; \ + rm -rf "$$STAGE" ; \ + hdiutil convert -quiet -ov -format UDBZ -imagekey zlib-level=9 \ + "$$TMPDMG" -o "$$DMG" ; \ + rm -f "$$TMPDMG" ; \ + ls -ldhgF "$$DMG" + +# Adding this is cute: +# hdiutil internet-enable -yes -quiet "$$DMG" +# but means that nobody will ever see the display settings I used! +# When finder copies the .dmg to a folder, it doesn't preserve them. diff --git a/OSX/PrefsReader.h b/OSX/PrefsReader.h new file mode 100644 index 00000000..06963740 --- /dev/null +++ b/OSX/PrefsReader.h @@ -0,0 +1,50 @@ +/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* This implements the substrate of the xscreensaver preferences code: + It does this by writing defaults to, and reading values from, the + NSUserDefaultsController (and ScreenSaverDefaults/NSUserDefaults) + and thereby reading the preferences that may have been edited by + the UI (XScreenSaverConfigSheet). + */ + +#ifdef USE_IPHONE +# import +# import +# define NSUserDefaultsController NSUserDefaults +#else +# import +#endif + + +#import "jwxyz.h" + +@interface PrefsReader : NSObject +{ + NSString *saver_name; + NSUserDefaultsController *userDefaultsController; + NSUserDefaults *userDefaults; // this is actually a 'ScreenSaverDefaults' + NSDictionary *defaultOptions; // Hardcoded defaults before any changes. +} + +- (id) initWithName: (NSString *) name + xrmKeys: (const XrmOptionDescRec *) opts + defaults: (const char * const *) defs; + +- (NSUserDefaultsController *) userDefaultsController; +- (NSDictionary *) defaultOptions; + +- (char *) getStringResource: (const char *) name; +- (double) getFloatResource: (const char *) name; +- (int) getIntegerResource: (const char *) name; +- (BOOL) getBooleanResource: (const char *) name; + +@end diff --git a/OSX/PrefsReader.m b/OSX/PrefsReader.m new file mode 100644 index 00000000..dd9170fe --- /dev/null +++ b/OSX/PrefsReader.m @@ -0,0 +1,385 @@ +/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* This implements the substrate of the xscreensaver preferences code: + It does this by writing defaults to, and reading values from, the + NSUserDefaultsController (and ScreenSaverDefaults/NSUserDefaults) + and thereby reading the preferences that may have been edited by + the UI (XScreenSaverConfigSheet). + */ + +#ifndef USE_IPHONE +# import +#endif + +#import "PrefsReader.h" +#import "screenhackI.h" + +@implementation PrefsReader + +/* Normally we read resources by looking up "KEY" in the database + "org.jwz.xscreensaver.SAVERNAME". But in the all-in-one iPhone + app, everything is stored in the database "org.jwz.xscreensaver" + instead, so transform keys to "SAVERNAME.KEY". + + NOTE: This is duplicated in XScreenSaverConfigSheet.m, cause I suck. +*/ +- (NSString *) makeKey:(NSString *)key +{ +# ifdef USE_IPHONE + NSString *prefix = [saver_name stringByAppendingString:@"."]; + if (! [key hasPrefix:prefix]) // Don't double up! + key = [prefix stringByAppendingString:key]; +# endif + return key; +} + +- (NSString *) makeCKey:(const char *)key +{ + return [self makeKey:[NSString stringWithCString:key + encoding:NSUTF8StringEncoding]]; +} + + +/* Converts an array of "key:value" strings to an NSDictionary. + */ +- (NSDictionary *) defaultsToDict: (const char * const *) defs +{ + NSDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:20]; + while (*defs) { + char *line = strdup (*defs); + char *key, *val; + key = line; + while (*key == '.' || *key == '*' || *key == ' ' || *key == '\t') + key++; + val = key; + while (*val && *val != ':') + val++; + if (*val != ':') abort(); + *val++ = 0; + while (*val == ' ' || *val == '\t') + val++; + + int L = strlen(val); + while (L > 0 && (val[L-1] == ' ' || val[L-1] == '\t')) + val[--L] = 0; + + // When storing into preferences, look at the default string and + // decide whether it's a boolean, int, float, or string, and store + // an object of the appropriate type in the prefs. + // + NSString *nskey = [self makeCKey:key]; + NSObject *nsval; + int dd; + double ff; + char cc; + if (!strcasecmp (val, "true") || !strcasecmp (val, "yes")) + nsval = [NSNumber numberWithBool:YES]; + else if (!strcasecmp (val, "false") || !strcasecmp (val, "no")) + nsval = [NSNumber numberWithBool:NO]; + else if (1 == sscanf (val, " %d %c", &dd, &cc)) + nsval = [NSNumber numberWithInt:dd]; + else if (1 == sscanf (val, " %lf %c", &ff, &cc)) + nsval = [NSNumber numberWithDouble:ff]; + else + nsval = [NSString stringWithCString:val encoding:NSUTF8StringEncoding]; + +// NSLog (@"default: \"%@\" = \"%@\" [%@]", nskey, nsval, [nsval class]); + [dict setValue:nsval forKey:nskey]; + free (line); + defs++; + } + return dict; +} + + +/* Initialize the Cocoa preferences database: + - sets the default preferences values from the 'defaults' array; + - binds 'self' to each preference as an observer; + - ensures that nothing is mentioned in 'options' and not in 'defaults'; + - ensures that nothing is mentioned in 'defaults' and not in 'options'. + */ +- (void) registerXrmKeys: (const XrmOptionDescRec *) opts + defaults: (const char * const *) defs +{ + // Store the contents of 'defaults' into the real preferences database. + NSDictionary *defsdict = [self defaultsToDict:defs]; + [userDefaults registerDefaults:defsdict]; + + // Save a copy of the default options, since iOS doesn't have + // [userDefaultsController initialValues]. + // + if (defaultOptions) + [defaultOptions release]; + defaultOptions = [[NSMutableDictionary dictionaryWithCapacity:20] + retain]; + for (NSString *key in defsdict) { + [defaultOptions setValue:[defsdict objectForKey:key] forKey:key]; + } + +# ifndef USE_IPHONE + userDefaultsController = + [[NSUserDefaultsController alloc] initWithDefaults:userDefaults + initialValues:defsdict]; +# else // USE_IPHONE + userDefaultsController = userDefaults; +# endif // USE_IPHONE + + NSDictionary *optsdict = [NSMutableDictionary dictionaryWithCapacity:20]; + + while (opts[0].option) { + //const char *option = opts->option; + const char *resource = opts->specifier; + + while (*resource == '.' || *resource == '*') + resource++; + NSString *nsresource = [self makeCKey:resource]; + + // make sure there's no resource mentioned in options and not defaults. + if (![defsdict objectForKey:nsresource]) { + if (! (!strcmp(resource, "font") || // don't warn about these + !strcmp(resource, "textLiteral") || + !strcmp(resource, "textFile") || + !strcmp(resource, "textURL") || + !strcmp(resource, "textProgram") || + !strcmp(resource, "imageDirectory"))) + NSLog (@"warning: \"%s\" is in options but not defaults", resource); + } + [optsdict setValue:nsresource forKey:nsresource]; + + opts++; + } + +#if 0 + // make sure there's no resource mentioned in defaults and not options. + for (NSString *key in defsdict) { + if (! [optsdict objectForKey:key]) + if (! ([key isEqualToString:@"foreground"] || // don't warn about these + [key isEqualToString:@"background"] || + [key isEqualToString:@"Background"] || + [key isEqualToString:@"geometry"] || + [key isEqualToString:@"font"] || + [key isEqualToString:@"dontClearRoot"] || + + // fps.c settings + [key isEqualToString:@"fpsSolid"] || + [key isEqualToString:@"fpsTop"] || + [key isEqualToString:@"titleFont"] || + + // analogtv.c settings + [key isEqualToString:@"TVBrightness"] || + [key isEqualToString:@"TVColor"] || + [key isEqualToString:@"TVContrast"] || + [key isEqualToString:@"TVTint"] + )) + NSLog (@"warning: \"%@\" is in defaults but not options", key); + } +#endif /* 0 */ + +#if 0 + // Dump the entire resource database. + NSDictionary *d = [userDefaults dictionaryRepresentation]; + for (NSObject *key in [[d allKeys] + sortedArrayUsingSelector:@selector(compare:)]) { + NSObject *val = [d objectForKey:key]; + NSLog (@"%@ = %@", key, val); + } +#endif + +} + +- (NSUserDefaultsController *) userDefaultsController +{ + NSAssert(userDefaultsController, @"userDefaultsController uninitialized"); + return userDefaultsController; +} + +- (NSDictionary *) defaultOptions +{ + NSAssert(defaultOptions, @"userDefaultsController uninitialized"); + return defaultOptions; +} + + +- (NSObject *) getObjectResource: (const char *) name +{ + while (1) { + NSString *key = [self makeCKey:name]; + NSObject *obj = [userDefaults objectForKey:key]; + if (obj) + return obj; + + // If key is "foo.bar.baz", check "foo.bar.baz", "bar.baz", and "baz". + // + const char *dot = strchr (name, '.'); + if (dot && dot[1]) + name = dot + 1; + else + return nil; + } +} + + +- (char *) getStringResource: (const char *) name +{ + NSObject *o = [self getObjectResource:name]; + //NSLog(@"%s = %@",name,o); + if (o == nil) { + if (! (!strcmp(name, "eraseMode") || // erase.c + // xlockmore.c reads all of these whether used or not... + !strcmp(name, "right3d") || + !strcmp(name, "left3d") || + !strcmp(name, "both3d") || + !strcmp(name, "none3d") || + !strcmp(name, "font") || + !strcmp(name, "labelFont") || // grabclient.c + !strcmp(name, "titleFont") || + !strcmp(name, "fpsFont") || // fps.c + !strcmp(name, "foreground") || // fps.c + !strcmp(name, "background") || + !strcmp(name, "textLiteral") + )) + NSLog(@"warning: no preference \"%s\" [string]", name); + return NULL; + } + if (! [o isKindOfClass:[NSString class]]) { + NSLog(@"asked for %s as a string, but it is a %@", name, [o class]); + o = [(NSNumber *) o stringValue]; + } + + NSString *os = (NSString *) o; + char *result = strdup ([os cStringUsingEncoding:NSUTF8StringEncoding]); + + // Kludge: if the string is surrounded with single-quotes, remove them. + // This happens when the .xml file says things like arg="-foo 'bar baz'" + if (result[0] == '\'' && result[strlen(result)-1] == '\'') { + result[strlen(result)-1] = 0; + strcpy (result, result+1); + } + + // Kludge: assume that any string that begins with "~" and has a "/" + // anywhere in it should be expanded as if it is a pathname. + if (result[0] == '~' && strchr (result, '/')) { + os = [NSString stringWithCString:result encoding:NSUTF8StringEncoding]; + free (result); + result = strdup ([[os stringByExpandingTildeInPath] + cStringUsingEncoding:NSUTF8StringEncoding]); + } + + return result; +} + + +- (double) getFloatResource: (const char *) name +{ + NSObject *o = [self getObjectResource:name]; + if (o == nil) { + // xlockmore.c reads all of these whether used or not... + if (! (!strcmp(name, "cycles") || + !strcmp(name, "size") || + !strcmp(name, "use3d") || + !strcmp(name, "delta3d") || + !strcmp(name, "wireframe") || + !strcmp(name, "showFPS") || + !strcmp(name, "fpsSolid") || + !strcmp(name, "fpsTop") || + !strcmp(name, "mono") || + !strcmp(name, "count") || + !strcmp(name, "ncolors") || + !strcmp(name, "doFPS") || // fps.c + !strcmp(name, "eraseSeconds") // erase.c + )) + NSLog(@"warning: no preference \"%s\" [float]", name); + return 0.0; + } + if ([o isKindOfClass:[NSString class]]) { + return [(NSString *) o doubleValue]; + } else if ([o isKindOfClass:[NSNumber class]]) { + return [(NSNumber *) o doubleValue]; + } else { + NSAssert2(0, @"%s = \"%@\" but should have been an NSNumber", name, o); + abort(); + } +} + + +- (int) getIntegerResource: (const char *) name +{ + // Sliders might store float values for integral resources; round them. + float v = [self getFloatResource:name]; + int i = (int) (v + (v < 0 ? -0.5 : 0.5)); // ignore sign or -1 rounds to 0 + // if (i != v) NSLog(@"%s: rounded %.3f to %d", name, v, i); + return i; +} + + +- (BOOL) getBooleanResource: (const char *) name +{ + NSObject *o = [self getObjectResource:name]; + if (! o) { + return NO; + } else if ([o isKindOfClass:[NSNumber class]]) { + double n = [(NSNumber *) o doubleValue]; + if (n == 0) return NO; + else if (n == 1) return YES; + else goto FAIL; + } else if ([o isKindOfClass:[NSString class]]) { + NSString *s = (NSString *) o; + if ([s isEqualToString:@"true"] || + [s isEqualToString:@"yes"] || + [s isEqualToString:@"1"]) + return YES; + else if ([s isEqualToString:@"false"] || + [s isEqualToString:@"no"] || + [s isEqualToString:@"0"] || + [s isEqualToString:@""]) + return NO; + else + goto FAIL; + } else { + FAIL: + NSAssert2(0, @"%s = \"%@\" but should have been a boolean", name, o); + abort(); + } +} + + +- (id) initWithName: (NSString *) name + xrmKeys: (const XrmOptionDescRec *) opts + defaults: (const char * const *) defs +{ + self = [self init]; + if (!self) return nil; + +# ifndef USE_IPHONE + userDefaults = [ScreenSaverDefaults defaultsForModuleWithName:name]; +# else // USE_IPHONE + userDefaults = [NSUserDefaults standardUserDefaults]; +# endif // USE_IPHONE + + // Convert "org.jwz.xscreensaver.NAME" to just "NAME". + NSRange r = [name rangeOfString:@"." options:NSBackwardsSearch]; + if (r.length) + name = [name substringFromIndex:r.location+1]; + saver_name = [name retain]; + + [self registerXrmKeys:opts defaults:defs]; + return self; +} + +- (void) dealloc +{ + [saver_name release]; + [userDefaultsController release]; + [super dealloc]; +} + +@end diff --git a/OSX/README b/OSX/README new file mode 100644 index 00000000..551e3bb6 --- /dev/null +++ b/OSX/README @@ -0,0 +1,10 @@ + +This directory contains the MacOS-specific code for building a Cocoa +version of xscreensaver without using X11. + +To build it, just type "make", or use the included XCode project. The +executables will show up in the "build/Release/" and/or "build/Debug/" +directories. + +To build these programs, XCode 2.4 or later is required. +To run them, MacOS 10.4.0 or later is required. diff --git a/OSX/SaverListController.h b/OSX/SaverListController.h new file mode 100644 index 00000000..fef8a78e --- /dev/null +++ b/OSX/SaverListController.h @@ -0,0 +1,36 @@ +/* xscreensaver, Copyright (c) 2012 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * This implements the top-level screen-saver selection list in the iOS app. + */ + +#ifdef USE_IPHONE + +#import + +@interface SaverListController : UITableViewController { + + int active_section_count; + NSMutableArray *list_by_letter[26]; // 27 to get "#" after "Z". + NSMutableArray *letter_sections; + NSMutableArray *section_titles; + NSDictionary *descriptions; + + int tap_count; + NSTimer *tap_timer; + NSIndexPath *last_tap; +} + +- (id)initWithNames:(NSArray *)names descriptions:(NSDictionary *)descs; +- (void) reload:(NSArray *)names descriptions:(NSDictionary *)descs; +- (void) scrollTo:(NSString *)name; +@end + +#endif // USE_IPHONE diff --git a/OSX/SaverListController.m b/OSX/SaverListController.m new file mode 100644 index 00000000..75e8751b --- /dev/null +++ b/OSX/SaverListController.m @@ -0,0 +1,312 @@ +/* xscreensaver, Copyright (c) 2012 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * This implements the top-level screen-saver selection list in the iOS app. + */ + +#ifdef USE_IPHONE // whole file + + +#import "SaverListController.h" +#import "SaverRunner.h" +#import "version.h" + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + + +@implementation SaverListController + +- (void) titleTapped:(id) sender +{ + [[UIApplication sharedApplication] + openURL:[NSURL URLWithString:@"http://www.jwz.org/xscreensaver/"]]; +} + + +- (void)makeTitleBar +{ + // Extract the version number and release date from the version string. + // Here's an area where I kind of wish I had "Two Problems". + + NSArray *a = [[NSString stringWithCString: screensaver_id + encoding:NSASCIIStringEncoding] + componentsSeparatedByCharactersInSet: + [NSCharacterSet + characterSetWithCharactersInString:@" ()-"]]; + NSString *vers = [a objectAtIndex: 3]; + NSString *year = [a objectAtIndex: 7]; + + NSString *line1 = [@"XScreenSaver " stringByAppendingString: vers]; + NSString *line2 = [@"\u00A9 " stringByAppendingString: + [year stringByAppendingString: + @" Jamie Zawinski "]]; + + UIView *v = [[UIView alloc] initWithFrame:CGRectZero]; + + // The "go to web page" button on the right + + UIImage *img = [UIImage imageWithContentsOfFile: + [[[NSBundle mainBundle] bundlePath] + stringByAppendingPathComponent: + @"iSaverRunner29t.png"]]; + UIBarButtonItem *button = [[[UIBarButtonItem alloc] + initWithImage: img + style: UIBarButtonItemStylePlain + target: self + action: @selector(titleTapped:)] + autorelease]; + button.width = img.size.width; + self.navigationItem.rightBarButtonItem = button; + + // The title bar + + UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectZero]; + UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectZero]; + [label1 setText: line1]; + [label2 setText: line2]; + [label1 setBackgroundColor:[UIColor clearColor]]; + [label2 setBackgroundColor:[UIColor clearColor]]; + + [label1 setFont: [UIFont boldSystemFontOfSize: 17]]; + [label2 setFont: [UIFont systemFontOfSize: 12]]; + [label1 sizeToFit]; + [label2 sizeToFit]; + + CGRect r1 = [label1 frame]; + CGRect r2 = [label2 frame]; + CGRect r3 = r2; + + CGRect win = [self view].frame; + if (win.size.width > 320) { // iPad + [label1 setTextAlignment: UITextAlignmentLeft]; + [label2 setTextAlignment: UITextAlignmentRight]; + label2.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; + r3.size.width = win.size.width; + r1 = r3; + r1.origin.x += 6; + r1.size.width -= 12; + r2 = r1; + + } else { // iPhone + r3.size.width = 320; // force it to be flush-left + [label1 setTextAlignment: UITextAlignmentLeft]; + [label2 setTextAlignment: UITextAlignmentLeft]; + r1.origin.y = -1; // make it fit in landscape + r2.origin.y = r1.origin.y + r1.size.height - 2; + r3.size.height = r1.size.height + r2.size.height; + } + v.autoresizingMask = UIViewAutoresizingFlexibleWidth; + [label1 setFrame:r1]; + [label2 setFrame:r2]; + [v setFrame:r3]; + + [v addSubview:label1]; + [v addSubview:label2]; + + self.navigationItem.titleView = v; +} + + +- (id)initWithNames:(NSArray *)names descriptions:(NSDictionary *)descs; +{ + self = [self init]; + if (! self) return 0; + [self reload:names descriptions:descs]; + [self makeTitleBar]; + return self; +} + + +- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tv +{ + int n = countof(list_by_letter); + NSMutableArray *a = [NSMutableArray arrayWithCapacity: n]; + for (int i = 0; i < n; i++) { + char s[2]; + s[0] = (i == 'Z'-'A'+1 ? '#' : i+'A'); + s[1] = 0; + [a addObject: [NSString stringWithCString:s + encoding:NSASCIIStringEncoding]]; + } + return a; +} + + +- (void) reload:(NSArray *)names descriptions:(NSDictionary *)descs +{ + if (descriptions) + [descriptions release]; + descriptions = [descs retain]; + + int n = countof(list_by_letter); + for (int i = 0; i < n; i++) { + list_by_letter[i] = [[NSMutableArray alloc] init]; + } + + for (NSString *name in names) { + int index = ([name cStringUsingEncoding: NSASCIIStringEncoding])[0]; + if (index >= 'a' && index <= 'z') + index -= 'a'-'A'; + if (index >= 'A' && index <= 'Z') + index -= 'A'; + else + index = n-1; + [list_by_letter[index] addObject: name]; + } + + active_section_count = 0; + letter_sections = [[[NSMutableArray alloc] init] retain]; + section_titles = [[[NSMutableArray alloc] init] retain]; + for (int i = 0; i < n; i++) { + if ([list_by_letter[i] count] > 0) { + active_section_count++; + [letter_sections addObject: list_by_letter[i]]; + if (i <= 'Z'-'A') + [section_titles addObject: [NSString stringWithFormat: @"%c", i+'A']]; + else + [section_titles addObject: @"#"]; + } + } + [self.tableView reloadData]; +} + + +- (NSString *)tableView:(UITableView *)tv + titleForHeaderInSection:(NSInteger)section +{ + return [section_titles objectAtIndex: section]; +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tv +{ + return active_section_count; +} + + +- (NSInteger)tableView:(UITableView *)tv + numberOfRowsInSection:(NSInteger)section +{ + return [[letter_sections objectAtIndex: section] count]; +} + +- (NSInteger)tableView:(UITableView *)tv + sectionForSectionIndexTitle:(NSString *)title + atIndex:(NSInteger) index +{ + int i = 0; + for (NSString *sectionTitle in section_titles) { + if ([sectionTitle isEqualToString: title]) + return i; + i++; + } + return -1; +} + + +- (UITableViewCell *)tableView:(UITableView *)tv + cellForRowAtIndexPath:(NSIndexPath *)ip +{ + NSString *id = + [[letter_sections objectAtIndex: [ip indexAtPosition: 0]] + objectAtIndex: [ip indexAtPosition: 1]]; + NSString *desc = [descriptions objectForKey:id]; + + UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier: id]; + if (!cell) { + cell = [[[UITableViewCell alloc] + initWithStyle: (desc + ? UITableViewCellStyleSubtitle + : UITableViewCellStyleDefault) + reuseIdentifier: id] + autorelease]; + cell.textLabel.text = id; + + cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; + if (desc) + cell.detailTextLabel.text = desc; + } + return cell; +} + + +/* Selecting a row launches the saver. + */ +- (void)tableView:(UITableView *)tv + didSelectRowAtIndexPath:(NSIndexPath *)ip +{ + UITableViewCell *cell = [tv cellForRowAtIndexPath: ip]; + SaverRunner *s = + (SaverRunner *) [[UIApplication sharedApplication] delegate]; + if (! s) return; + if (! [s isKindOfClass:[SaverRunner class]]) + abort(); + [s loadSaver: cell.textLabel.text]; +} + +/* Selecting a row's Disclosure Button opens the preferences. + */ +- (void)tableView:(UITableView *)tv + accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)ip +{ + UITableViewCell *cell = [tv cellForRowAtIndexPath: ip]; + SaverRunner *s = + (SaverRunner *) [[UIApplication sharedApplication] delegate]; + if (! s) return; + if (! [s isKindOfClass:[SaverRunner class]]) + abort(); + [s openPreferences: cell.textLabel.text]; +} + + +- (void) scrollTo: (NSString *) name +{ + int i = 0; + int j = 0; + Bool ok = NO; + for (NSArray *a in letter_sections) { + j = 0; + for (NSString *n in a) { + ok = [n isEqualToString: name]; + if (ok) goto DONE; + j++; + } + i++; + } + DONE: + if (ok) { + NSIndexPath *ip = [NSIndexPath indexPathForRow: j inSection: i]; + [self.tableView selectRowAtIndexPath:ip + animated:NO + scrollPosition: UITableViewScrollPositionMiddle]; + } +} + + +- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o +{ + return YES; +} + + +- (void)dealloc +{ + for (int i = 0; i < countof(list_by_letter); i++) + [list_by_letter[i] release]; + [letter_sections release]; + [section_titles release]; + [descriptions release]; + [super dealloc]; +} + +@end + + +#endif // USE_IPHONE -- whole file diff --git a/OSX/SaverRunner.h b/OSX/SaverRunner.h new file mode 100644 index 00000000..2c5d0461 --- /dev/null +++ b/OSX/SaverRunner.h @@ -0,0 +1,73 @@ +/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +#ifdef USE_IPHONE +# import +# import +# import +# import +# import +# import +# define NSView UIView +# define NSRect CGRect +# define NSSize CGSize +# define NSColor UIColor +# define NSImage UIImage +# define NSEvent UIEvent +# define NSWindow UIWindow +# define NSButton UIButton +# define NSApplication UIApplication +# define NSScreen UIScreen +#else +# import +# import +#endif + +@class ScreenSaverView; + +@interface SaverRunner : NSObject +{ + NSString *saverName; // the one currently loaded + NSArray *saverNames; // Names of available savers + NSString *saverDir; // Where we find saver bundles + +# ifndef USE_IPHONE + + NSBundle *saverBundle; + NSArray *windows; + IBOutlet NSMenu *menubar; + +# else // USE_IPHONE + + ScreenSaverView *saverView; + UINavigationController *rootViewController; + IBOutlet UIWindow *window; + EAGLContext *eagl_ctx; + GLuint gl_framebuffer, gl_renderbuffer; + IBOutlet UIView *view; + UIImage *saved_screenshot; + +# endif // USE_IPHONE +} + +- (void) aboutPanel: (id)sender; +- (void)loadSaver:(NSString *)name launch:(BOOL)launch; +- (void) loadSaver: (NSString *)name; +- (void)selectedSaverDidChange:(NSDictionary *)change; + +#ifndef USE_IPHONE +- (void) openPreferences: (id)sender; +#else // USE_IPHONE +- (void) openPreferences: (NSString *)which; +- (UIImage *) screenshot; +#endif // USE_IPHONE + +@end diff --git a/OSX/SaverRunner.icns b/OSX/SaverRunner.icns new file mode 100644 index 0000000000000000000000000000000000000000..0f052ae1bde28f2b299ddaa77c786f833a14a43d GIT binary patch literal 62554 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 literal 0 HcmV?d00001 diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m new file mode 100644 index 00000000..60233a08 --- /dev/null +++ b/OSX/SaverRunner.m @@ -0,0 +1,1014 @@ +/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* This program serves three purposes: + + First, It is a test harness for screen savers. When it launches, it + looks around for .saver bundles (in the current directory, and then in + the standard directories) and puts up a pair of windows that allow you + to select the saver to run. This is less clicking than running them + through System Preferences. This is the "SaverTester.app" program. + + Second, it can be used to transform any screen saver into a standalone + program. Just put one (and only one) .saver bundle into the app + bundle's Contents/PlugIns/ directory, and it will load and run that + saver at start-up (without the saver-selection menu or other chrome). + This is how the "Phosphor.app" and "Apple2.app" programs work. + + Third, it is the scaffolding which turns a set of screen savers into + a single iPhone / iPad program. In that case, all of the savers are + linked in to this executable, since iOS does not allow dynamic loading + of bundles that have executable code in them. Bleh. + */ + +#import "SaverRunner.h" +#import "SaverListController.h" +#import "XScreenSaverGLView.h" +#import + +#ifdef USE_IPHONE + +@interface RotateyViewController : UINavigationController +@end + +@implementation RotateyViewController +- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o +{ + return YES; +} +@end + +#endif // USE_IPHONE + + +@implementation SaverRunner + + +- (ScreenSaverView *) makeSaverView: (NSString *) module + withSize: (NSSize) size +{ + Class new_class = 0; + +# ifndef USE_IPHONE + + // Load the XScreenSaverView subclass and code from a ".saver" bundle. + + NSString *name = [module stringByAppendingPathExtension:@"saver"]; + NSString *path = [saverDir stringByAppendingPathComponent:name]; + + if (! [[NSFileManager defaultManager] fileExistsAtPath:path]) { + NSLog(@"bundle \"%@\" does not exist", path); + return 0; + } + + NSLog(@"Loading %@", path); + + // NSBundle *obundle = saverBundle; + + saverBundle = [NSBundle bundleWithPath:path]; + if (saverBundle) + new_class = [saverBundle principalClass]; + + // Not entirely unsurprisingly, this tends to break the world. + // if (obundle && obundle != saverBundle) + // [obundle unload]; + +# else // USE_IPHONE + + // Determine whether to create an X11 view or an OpenGL view by + // looking for the "gl" tag in the xml file. This is kind of awful. + + NSString *path = [saverDir + stringByAppendingPathComponent: + [[[module lowercaseString] + stringByReplacingOccurrencesOfString:@" " + withString:@""] + stringByAppendingPathExtension:@"xml"]]; + NSString *xml = [NSString stringWithContentsOfFile:path + encoding:NSISOLatin1StringEncoding + error:nil]; + NSAssert (xml, @"no XML: %@", path); + Bool gl_p = (xml && [xml rangeOfString:@"gl=\"yes\""].length > 0); + + new_class = (gl_p + ? [XScreenSaverGLView class] + : [XScreenSaverView class]); + +# endif // USE_IPHONE + + if (! new_class) + return 0; + + NSRect rect; + rect.origin.x = rect.origin.y = 0; + rect.size.width = size.width; + rect.size.height = size.height; + + XScreenSaverView *instance = + [(XScreenSaverView *) [new_class alloc] + initWithFrame:rect + saverName:module + isPreview:YES]; + if (! instance) return 0; + + + /* KLUGE: Inform the underlying program that we're in "standalone" + mode, e.g. running as "Phosphor.app" rather than "Phosphor.saver". + This is kind of horrible but I haven't thought of a more sensible + way to make this work. + */ +# ifndef USE_IPHONE + if ([saverNames count] == 1) { + putenv (strdup ("XSCREENSAVER_STANDALONE=1")); + } +# endif + + return (ScreenSaverView *) instance; +} + + +#ifndef USE_IPHONE + +static ScreenSaverView * +find_saverView_child (NSView *v) +{ + NSArray *kids = [v subviews]; + int nkids = [kids count]; + int i; + for (i = 0; i < nkids; i++) { + NSObject *kid = [kids objectAtIndex:i]; + if ([kid isKindOfClass:[ScreenSaverView class]]) { + return (ScreenSaverView *) kid; + } else { + ScreenSaverView *sv = find_saverView_child ((NSView *) kid); + if (sv) return sv; + } + } + return 0; +} + + +static ScreenSaverView * +find_saverView (NSView *v) +{ + while (1) { + NSView *p = [v superview]; + if (p) v = p; + else break; + } + return find_saverView_child (v); +} + + +/* Changes the contents of the menubar menus to correspond to + the running saver. Desktop only. + */ +static void +relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) +{ + if ([v isKindOfClass:[NSMenu class]]) { + NSMenu *m = (NSMenu *)v; + [m setTitle: [[m title] stringByReplacingOccurrencesOfString:old_str + withString:new_str]]; + NSArray *kids = [m itemArray]; + int nkids = [kids count]; + int i; + for (i = 0; i < nkids; i++) { + relabel_menus ([kids objectAtIndex:i], old_str, new_str); + } + } else if ([v isKindOfClass:[NSMenuItem class]]) { + NSMenuItem *mi = (NSMenuItem *)v; + [mi setTitle: [[mi title] stringByReplacingOccurrencesOfString:old_str + withString:new_str]]; + NSMenu *m = [mi submenu]; + if (m) relabel_menus (m, old_str, new_str); + } +} + + +- (void) openPreferences: (id) sender +{ + ScreenSaverView *sv; + if ([sender isKindOfClass:[NSView class]]) { // Sent from button + sv = find_saverView ((NSView *) sender); + } else { + int i; + NSWindow *w = 0; + for (i = [windows count]-1; i >= 0; i--) { // Sent from menubar + w = [windows objectAtIndex:i]; + if ([w isKeyWindow]) break; + } + sv = find_saverView ([w contentView]); + } + + NSAssert (sv, @"no saver view"); + NSWindow *prefs = [sv configureSheet]; + + [NSApp beginSheet:prefs + modalForWindow:[sv window] + modalDelegate:self + didEndSelector:@selector(preferencesClosed:returnCode:contextInfo:) + contextInfo:nil]; + int code = [NSApp runModalForWindow:prefs]; + + /* Restart the animation if the "OK" button was hit, but not if "Cancel". + We have to restart *both* animations, because the xlockmore-style + ones will blow up if one re-inits but the other doesn't. + */ + if (code != NSCancelButton) { + if ([sv isAnimating]) + [sv stopAnimation]; + [sv startAnimation]; + } +} + + +- (void) preferencesClosed: (NSWindow *) sheet + returnCode: (int) returnCode + contextInfo: (void *) contextInfo +{ + [NSApp stopModalWithCode:returnCode]; +} + +#else // USE_IPHONE + + +- (UIImage *) screenshot +{ + return saved_screenshot; +} + +- (void) saveScreenshot +{ + // Most of this is from: + // http://developer.apple.com/library/ios/#qa/qa1703/_index.html + // The rotation stuff is by me. + + CGSize size = [[UIScreen mainScreen] bounds].size; + + UIInterfaceOrientation orient = + [[window rootViewController] interfaceOrientation]; + if (orient == UIInterfaceOrientationLandscapeLeft || + orient == UIInterfaceOrientationLandscapeRight) { + // Rotate the shape of the canvas 90 degrees. + double s = size.width; + size.width = size.height; + size.height = s; + } + + + // Create a graphics context with the target size + // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to + // take the scale into consideration + // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext + + if (UIGraphicsBeginImageContextWithOptions) + UIGraphicsBeginImageContextWithOptions (size, NO, 0); + else + UIGraphicsBeginImageContext (size); + + CGContextRef ctx = UIGraphicsGetCurrentContext(); + + + // Rotate the graphics context to match current hardware rotation. + // + switch (orient) { + case UIInterfaceOrientationPortraitUpsideDown: + CGContextTranslateCTM (ctx, [window center].x, [window center].y); + CGContextRotateCTM (ctx, M_PI); + CGContextTranslateCTM (ctx, -[window center].x, -[window center].y); + break; + case UIInterfaceOrientationLandscapeLeft: + case UIInterfaceOrientationLandscapeRight: + CGContextTranslateCTM (ctx, + ([window frame].size.height - + [window frame].size.width) / 2, + ([window frame].size.width - + [window frame].size.height) / 2); + CGContextTranslateCTM (ctx, [window center].x, [window center].y); + CGContextRotateCTM (ctx, + (orient == UIInterfaceOrientationLandscapeLeft + ? M_PI/2 + : -M_PI/2)); + CGContextTranslateCTM (ctx, -[window center].x, -[window center].y); + break; + default: + break; + } + + // Iterate over every window from back to front + // + for (UIWindow *win in [[UIApplication sharedApplication] windows]) { + if (![win respondsToSelector:@selector(screen)] || + [win screen] == [UIScreen mainScreen]) { + + // -renderInContext: renders in the coordinate space of the layer, + // so we must first apply the layer's geometry to the graphics context + CGContextSaveGState (ctx); + + // Center the context around the window's anchor point + CGContextTranslateCTM (ctx, [win center].x, [win center].y); + + // Apply the window's transform about the anchor point + CGContextConcatCTM (ctx, [win transform]); + + // Offset by the portion of the bounds left of and above anchor point + CGContextTranslateCTM (ctx, + -[win bounds].size.width * [[win layer] anchorPoint].x, + -[win bounds].size.height * [[win layer] anchorPoint].y); + + // Render the layer hierarchy to the current context + [[win layer] renderInContext:ctx]; + + // Restore the context + CGContextRestoreGState (ctx); + } + } + + if (saved_screenshot) + [saved_screenshot release]; + saved_screenshot = [UIGraphicsGetImageFromCurrentImageContext() retain]; + + UIGraphicsEndImageContext(); +} + + +- (void) openPreferences: (NSString *) saver +{ + [self loadSaver:saver launch:NO]; + if (! saverView) return; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + [prefs setObject:saver forKey:@"selectedSaverName"]; + [prefs synchronize]; + + [rootViewController pushViewController: [saverView configureView] + animated:YES]; +} + + +#endif // USE_IPHONE + + + +- (void)loadSaver:(NSString *)name launch:(BOOL)launch +{ + // NSLog (@"selecting saver \"%@\"", name); + +# ifndef USE_IPHONE + + if (saverName && [saverName isEqualToString: name]) { + if (launch) + for (NSWindow *win in windows) { + ScreenSaverView *sv = find_saverView ([win contentView]); + if (![sv isAnimating]) + [sv startAnimation]; + } + return; + } + + saverName = name; + + for (NSWindow *win in windows) { + NSView *cv = [win contentView]; + NSString *old_title = [win title]; + if (!old_title) old_title = @"XScreenSaver"; + [win setTitle: name]; + relabel_menus (menubar, old_title, name); + + ScreenSaverView *old_view = find_saverView (cv); + NSView *sup = old_view ? [old_view superview] : cv; + + if (old_view) { + if ([old_view isAnimating]) + [old_view stopAnimation]; + [old_view removeFromSuperview]; + } + + NSSize size = [cv frame].size; + ScreenSaverView *new_view = [self makeSaverView:name withSize: size]; + NSAssert (new_view, @"unable to make a saver view"); + + [new_view setFrame: (old_view ? [old_view frame] : [cv frame])]; + [sup addSubview: new_view]; + [win makeFirstResponder:new_view]; + [new_view setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + [new_view retain]; + if (launch) + [new_view startAnimation]; + } + + NSUserDefaultsController *ctl = + [NSUserDefaultsController sharedUserDefaultsController]; + [ctl save:self]; + +# else // USE_IPHONE + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + [prefs setObject:name forKey:@"selectedSaverName"]; + [prefs synchronize]; + + if (saverName && [saverName isEqualToString: name]) { + if (launch && ![saverView isAnimating]) { + [window addSubview: saverView]; + [saverView startAnimation]; + } + return; + } + + saverName = name; + + if (saverView) { + if ([saverView isAnimating]) + [saverView stopAnimation]; + [saverView removeFromSuperview]; + } + + NSSize size = [window frame].size; + saverView = [self makeSaverView:name withSize: size]; + + if (! saverView) { + [[[UIAlertView alloc] initWithTitle: name + message: @"Unable to load!" + delegate: nil + cancelButtonTitle: @"Bummer" + otherButtonTitles: nil] + show]; + return; + } + + [saverView setFrame: [window frame]]; + [saverView retain]; + [[NSNotificationCenter defaultCenter] + addObserver:saverView + selector:@selector(didRotate:) + name:UIDeviceOrientationDidChangeNotification object:nil]; + + if (launch) { + [window addSubview: saverView]; + [saverView startAnimation]; + } +# endif // USE_IPHONE +} + + +- (void)loadSaver:(NSString *)name +{ + [self loadSaver:name launch:YES]; +} + + +- (void)aboutPanel:(id)sender +{ +# ifndef USE_IPHONE + NSDictionary *bd = [saverBundle infoDictionary]; + NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:20]; + + [d setValue:[bd objectForKey:@"CFBundleName"] forKey:@"ApplicationName"]; + [d setValue:[bd objectForKey:@"CFBundleVersion"] forKey:@"Version"]; + [d setValue:[bd objectForKey:@"CFBundleShortVersionString"] + forKey:@"ApplicationVersion"]; + [d setValue:[bd objectForKey:@"NSHumanReadableCopyright"] forKey:@"Copy"]; + [d setValue:[[NSAttributedString alloc] + initWithString: (NSString *) + [bd objectForKey:@"CFBundleGetInfoString"]] + forKey:@"Credits"]; + + [[NSApplication sharedApplication] + orderFrontStandardAboutPanelWithOptions:d]; + +# else // USE_IPHONE + + NSDictionary *bd = [[NSBundle mainBundle] infoDictionary]; + NSString *body = [bd objectForKey:@"CFBundleGetInfoString"]; + + body = [body stringByReplacingOccurrencesOfString:@", " withString:@",\n"]; + body = [body stringByAppendingString: + @"\n\n" + "Double-tap to run.\n\n" + "Double-tap again to\n" + "return to this list."]; + + [[[UIAlertView alloc] initWithTitle: @"" + message: body + delegate: nil + cancelButtonTitle: @"OK" + otherButtonTitles: nil] + show]; + +# endif // USE_IPHONE +} + + + +- (void)selectedSaverDidChange:(NSDictionary *)change +{ + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSString *name = [prefs stringForKey:@"selectedSaverName"]; + + if (! name) return; + + if (! [saverNames containsObject:name]) { + NSLog (@"saver \"%@\" does not exist", name); + return; + } + + [self loadSaver: name]; +} + + +- (NSArray *) listSaverBundleNamesInDir:(NSString *)dir +{ +# ifndef USE_IPHONE + NSString *ext = @"saver"; +# else + NSString *ext = @"xml"; +# endif + + NSArray *files = [[NSFileManager defaultManager] + contentsOfDirectoryAtPath:dir error:nil]; + if (! files) return 0; + NSMutableArray *result = [NSMutableArray arrayWithCapacity: [files count]+1]; + + for (NSString *p in files) { + if ([[p pathExtension] caseInsensitiveCompare: ext]) + continue; + +# ifndef USE_IPHONE + NSString *name = [[p lastPathComponent] stringByDeletingPathExtension]; +# else // !USE_IPHONE + + // Get the saver name's capitalization right by reading the XML file. + + p = [dir stringByAppendingPathComponent: p]; + NSString *name = [NSString stringWithContentsOfFile:p + encoding:NSISOLatin1StringEncoding + error:nil]; + NSRange r = [name rangeOfString:@"_label=\"" options:0]; + name = [name substringFromIndex: r.location + r.length]; + r = [name rangeOfString:@"\"" options:0]; + name = [name substringToIndex: r.location]; + + NSAssert1 (name, @"no name in %@", p); + +# endif // !USE_IPHONE + + [result addObject: name]; + } + + return result; +} + + + +- (NSArray *) listSaverBundleNames +{ + NSMutableArray *dirs = [NSMutableArray arrayWithCapacity: 10]; + +# ifndef USE_IPHONE + // On MacOS, look in the "Contents/PlugIns/" directory in the bundle. + [dirs addObject: [[NSBundle mainBundle] builtInPlugInsPath]]; + + // Also look in the same directory as the executable. + [dirs addObject: [[[NSBundle mainBundle] bundlePath] + stringByDeletingLastPathComponent]]; + + // Finally, look in standard MacOS screensaver directories. + [dirs addObject: @"~/Library/Screen Savers"]; + [dirs addObject: @"/Library/Screen Savers"]; + [dirs addObject: @"/System/Library/Screen Savers"]; + +# else + // On iOS, just look in the bundle's root directory. + [dirs addObject: [[NSBundle mainBundle] bundlePath]]; +# endif + + int i; + for (i = 0; i < [dirs count]; i++) { + NSString *dir = [dirs objectAtIndex:i]; + NSArray *names = [self listSaverBundleNamesInDir:dir]; + if (! names) continue; + saverDir = [dir retain]; + saverNames = [names retain]; + return names; + } + + NSString *err = @"no .saver bundles found in: "; + for (i = 0; i < [dirs count]; i++) { + if (i) err = [err stringByAppendingString:@", "]; + err = [err stringByAppendingString:[[dirs objectAtIndex:i] + stringByAbbreviatingWithTildeInPath]]; + err = [err stringByAppendingString:@"/"]; + } + NSLog (@"%@", err); + return [NSArray array]; +} + + +/* Create the popup menu of available saver names. + */ +#ifndef USE_IPHONE + +- (NSPopUpButton *) makeMenu +{ + NSRect rect; + rect.origin.x = rect.origin.y = 0; + rect.size.width = 10; + rect.size.height = 10; + NSPopUpButton *popup = [[NSPopUpButton alloc] initWithFrame:rect + pullsDown:NO]; + int i; + float max_width = 0; + for (i = 0; i < [saverNames count]; i++) { + NSString *name = [saverNames objectAtIndex:i]; + [popup addItemWithTitle:name]; + [[popup itemWithTitle:name] setRepresentedObject:name]; + [popup sizeToFit]; + NSRect r = [popup frame]; + if (r.size.width > max_width) max_width = r.size.width; + } + + // Bind the menu to preferences, and trigger a callback when an item + // is selected. + // + NSString *key = @"values.selectedSaverName"; + NSUserDefaultsController *prefs = + [NSUserDefaultsController sharedUserDefaultsController]; + [prefs addObserver:self + forKeyPath:key + options:0 + context:@selector(selectedSaverDidChange:)]; + [popup bind:@"selectedObject" + toObject:prefs + withKeyPath:key + options:nil]; + [prefs setAppliesImmediately:YES]; + + NSRect r = [popup frame]; + r.size.width = max_width; + [popup setFrame:r]; + return popup; +} + +#else // USE_IPHONE + +/* Create a dictionary of one-line descriptions of every saver, + for display on the UITableView. + */ +- (NSDictionary *)makeDescTable +{ + NSMutableDictionary *dict = + [NSMutableDictionary dictionaryWithCapacity:[saverNames count]]; + + for (NSString *saver in saverNames) { + NSString *desc = 0; + NSString *path = [saverDir stringByAppendingPathComponent: + [[saver lowercaseString] + stringByReplacingOccurrencesOfString:@" " + withString:@""]]; + NSRange r; + + path = [path stringByAppendingPathExtension:@"xml"]; + desc = [NSString stringWithContentsOfFile:path + encoding:NSISOLatin1StringEncoding + error:nil]; + if (! desc) goto FAIL; + + r = [desc rangeOfString:@"<_description>" + options:NSCaseInsensitiveSearch]; + if (r.length == 0) { + desc = 0; + goto FAIL; + } + desc = [desc substringFromIndex: r.location + r.length]; + r = [desc rangeOfString:@"" + options:NSCaseInsensitiveSearch]; + if (r.length > 0) + desc = [desc substringToIndex: r.location]; + + // Leading and trailing whitespace. + desc = [desc stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + + // Let's see if we can find a year on the last line. + r = [desc rangeOfString:@"\n" options:NSBackwardsSearch]; + NSString *year = 0; + for (NSString *word in + [[desc substringFromIndex:r.location + r.length] + componentsSeparatedByCharactersInSet: + [NSCharacterSet characterSetWithCharactersInString: + @" \t\n-."]]) { + int n = [word doubleValue]; + if (n > 1970 && n < 2100) + year = word; + } + + // Delete everything after the first blank line. + r = [desc rangeOfString:@"\n\n" options:0]; + if (r.length > 0) + desc = [desc substringToIndex: r.location]; + + // Truncate really long ones. + int max = 140; + if ([desc length] > max) + desc = [desc substringToIndex: max]; + + if (year) + desc = [year stringByAppendingString: + [@": " stringByAppendingString: desc]]; + + FAIL: + if (! desc) { + desc = @"Oops, this module appears to be incomplete."; + // NSLog(@"broken saver: %@", path); + } + + [dict setObject:desc forKey:saver]; + } + + return dict; +} + + +#endif // USE_IPHONE + + + +/* This is called when the "selectedSaverName" pref changes, e.g., + when a menu selection is made. + */ +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context +{ + SEL dispatchSelector = (SEL)context; + if (dispatchSelector != NULL) { + [self performSelector:dispatchSelector withObject:change]; + } else { + [super observeValueForKeyPath:keyPath + ofObject:object + change:change + context:context]; + } +} + + +# ifndef USE_IPHONE + +/* Create the desktop window shell, possibly including a preferences button. + */ +- (NSWindow *) makeWindow +{ + NSRect rect; + static int count = 0; + Bool simple_p = ([saverNames count] == 1); + NSButton *pb = 0; + NSPopUpButton *menu = 0; + NSBox *gbox = 0; + NSBox *pbox = 0; + + NSRect sv_rect; + sv_rect.origin.x = sv_rect.origin.y = 0; + sv_rect.size.width = 320; + sv_rect.size.height = 240; + ScreenSaverView *sv = [[ScreenSaverView alloc] // dummy placeholder + initWithFrame:sv_rect + isPreview:YES]; + + // make a "Preferences" button + // + if (! simple_p) { + rect.origin.x = 0; + rect.origin.y = 0; + rect.size.width = rect.size.height = 10; + pb = [[NSButton alloc] initWithFrame:rect]; + [pb setTitle:@"Preferences"]; + [pb setBezelStyle:NSRoundedBezelStyle]; + [pb sizeToFit]; + + rect.origin.x = ([sv frame].size.width - + [pb frame].size.width) / 2; + [pb setFrameOrigin:rect.origin]; + + // grab the click + // + [pb setTarget:self]; + [pb setAction:@selector(openPreferences:)]; + + // Make a saver selection menu + // + menu = [self makeMenu]; + rect.origin.x = 2; + rect.origin.y = 2; + [menu setFrameOrigin:rect.origin]; + + // make a box to wrap the saverView + // + rect = [sv frame]; + rect.origin.x = 0; + rect.origin.y = [pb frame].origin.y + [pb frame].size.height; + gbox = [[NSBox alloc] initWithFrame:rect]; + rect.size.width = rect.size.height = 10; + [gbox setContentViewMargins:rect.size]; + [gbox setTitlePosition:NSNoTitle]; + [gbox addSubview:sv]; + [gbox sizeToFit]; + + // make a box to wrap the other two boxes + // + rect.origin.x = rect.origin.y = 0; + rect.size.width = [gbox frame].size.width; + rect.size.height = [gbox frame].size.height + [gbox frame].origin.y; + pbox = [[NSBox alloc] initWithFrame:rect]; + [pbox setTitlePosition:NSNoTitle]; + [pbox setBorderType:NSNoBorder]; + [pbox addSubview:gbox]; + if (menu) [pbox addSubview:menu]; + if (pb) [pbox addSubview:pb]; + [pbox sizeToFit]; + + [pb setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin]; + [menu setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin]; + [gbox setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + [pbox setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + } + + [sv setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + + + // and make a window to hold that. + // + NSScreen *screen = [NSScreen mainScreen]; + rect = pbox ? [pbox frame] : [sv frame]; + rect.origin.x = ([screen frame].size.width - rect.size.width) / 2; + rect.origin.y = ([screen frame].size.height - rect.size.height) / 2; + + rect.origin.x += rect.size.width * (count ? 0.55 : -0.55); + + NSWindow *win = [[NSWindow alloc] + initWithContentRect:rect + styleMask:(NSTitledWindowMask | + NSClosableWindowMask | + NSMiniaturizableWindowMask | + NSResizableWindowMask) + backing:NSBackingStoreBuffered + defer:YES + screen:screen]; + [win setMinSize:[win frameRectForContentRect:rect].size]; + [[win contentView] addSubview: (pbox ? (NSView *) pbox : (NSView *) sv)]; + + [win makeKeyAndOrderFront:win]; + + [sv startAnimation]; // this is the dummy saver + + count++; + + return win; +} + +# endif // !USE_IPHONE + + +- (void)applicationDidFinishLaunching: +# ifndef USE_IPHONE + (NSNotification *) notif +# else // USE_IPHONE + (UIApplication *) application +# endif // USE_IPHONE +{ + [self listSaverBundleNames]; + +# ifndef USE_IPHONE + int window_count = ([saverNames count] <= 1 ? 1 : 2); + NSMutableArray *a = [[NSMutableArray arrayWithCapacity: window_count+1] + retain]; + windows = a; + + int i; + // Create either one window (for standalone, e.g. Phosphor.app) + // or two windows for SaverTester.app. + for (i = 0; i < window_count; i++) { + NSWindow *win = [self makeWindow]; + // Get the last-saved window position out of preferences. + [win setFrameAutosaveName: + [NSString stringWithFormat:@"XScreenSaverWindow%d", i]]; + [win setFrameUsingName:[win frameAutosaveName]]; + [a addObject: win]; + } +# else // USE_IPHONE + +# undef ya_rand_init + ya_rand_init (0); // Now's a good time. + + rootViewController = [[[RotateyViewController alloc] init] retain]; + [window setRootViewController: rootViewController]; + + SaverListController *menu = [[SaverListController alloc] + initWithNames:saverNames + descriptions:[self makeDescTable]]; + [rootViewController pushViewController:menu animated:YES]; + + [window makeKeyAndVisible]; + [window setAutoresizesSubviews:YES]; + [window setAutoresizingMask: + (UIViewAutoresizingFlexibleWidth | + UIViewAutoresizingFlexibleHeight)]; + + // Has to be after the list window is up, or we get black. + [self saveScreenshot]; + +# endif // USE_IPHONE + + NSString *forced = 0; + /* In the XCode project, each .saver scheme sets this env var when + launching SaverTester.app so that it knows which one we are + currently debugging. If this is set, it overrides the default + selection in the popup menu. If unset, that menu persists to + whatever it was last time. + */ + const char *f = getenv ("SELECTED_SAVER"); + if (f && *f) + forced = [NSString stringWithCString:(char *)f + encoding:NSUTF8StringEncoding]; + + if (forced && ![saverNames containsObject:forced]) { + NSLog(@"forced saver \"%@\" does not exist", forced); + forced = 0; + } + + // If there's only one saver, run that. + if (!forced && [saverNames count] == 1) + forced = [saverNames objectAtIndex:0]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + +# ifdef USE_IPHONE + NSString *prev = [prefs stringForKey:@"selectedSaverName"]; + + if (forced) + prev = forced; + + // If nothing was selected (e.g., this is the first launch) + // then scroll randomly instead of starting up at "A". + // + if (!prev) + prev = [saverNames objectAtIndex: (random() % [saverNames count])]; + + if (prev) + [menu scrollTo: prev]; +# endif // USE_IPHONE + + if (forced) + [prefs setObject:forced forKey:@"selectedSaverName"]; + +# ifdef USE_IPHONE + /* Don't auto-launch the saver unless it was running last time. + XScreenSaverView manages this, on crash_timer. + */ + if (! [prefs boolForKey:@"wasRunning"]) + return; +# endif + + [self selectedSaverDidChange:nil]; +} + + +#ifndef USE_IPHONE + +/* When the window closes, exit (even if prefs still open.) +*/ +- (BOOL) applicationShouldTerminateAfterLastWindowClosed: (NSApplication *) n +{ + return YES; +} + +# else // USE_IPHONE + +- (void)applicationWillResignActive:(UIApplication *)app +{ + [(XScreenSaverView *)view setScreenLocked:YES]; +} + +- (void)applicationDidBecomeActive:(UIApplication *)app +{ + [(XScreenSaverView *)view setScreenLocked:NO]; +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + [(XScreenSaverView *)view setScreenLocked:YES]; +} + +#endif // USE_IPHONE + + +@end diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist new file mode 100644 index 00000000..5ac695ff --- /dev/null +++ b/OSX/SaverRunner.plist @@ -0,0 +1,39 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleGetInfoString + XScreenSaver 5.15, © 2001-2012 Jamie Zawinski. +http://www.jwz.org/xscreensaver/ + CFBundleIconFile + SaverRunner + CFBundleIdentifier + org.jwz.xscreensaver.${EXECUTABLE_NAME} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + XScreenSaver 5.15, © 2001-2012 Jamie Zawinski. + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 5.17 + CFBundleSignature + ???? + CFBundleVersion + 5.17 + LSMinimumSystemVersion + 10.4 + NSHumanReadableCopyright + XScreenSaver 5.15, © 2001-2012 Jamie Zawinski. + NSMainNibFile + SaverRunner + NSPrincipalClass + NSApplication + + diff --git a/OSX/XScreenSaver.icns b/OSX/XScreenSaver.icns new file mode 100644 index 0000000000000000000000000000000000000000..c82eb94a8be3d6ad72425a693fc0dc6dcc34edac GIT binary patch literal 187557 zcmeEv1z40#)b`n8>4q&zmd5VJj@JMK?C$Qa-KCTe5fuZw#V#x?Y`{Vh38j`UQ99;3 z&n_q+_WOR<_5YtM$UZwW_nbL%=FB{E&v|ynq`8ZL9(#Dkq87~o=E=XYukZ z>2T_CYATu2x$07LY()i$v}-H7JVU12uD;~kq0O2yD)WW(ThTKuj9pR#Q!nD>shm5n z?nk_N7IEQYAYLAL{2<`u1Fu_d*RJiv%bf{#?!F8Ue{e4*)?ZB2S_~gHX3WU3BPNa< z-HMQJwYa>fMvIe6K0N*0;&QU}H2LtLy2W9|n;RYe6e_N2@z(wQjJxdcKTy@;t}IO+ zjBGA%@mXS_*Ov)rb~UMLVi&Ms!f>xH)FtCAX=5b3Jlr!m6i_c`;dUgA4Wax|2A5Kv%-W9M^w14d8pVM#aypOxE4TKs) zTU58Wk&c4^&hDsgaaU+#!JOn}SEYdFR+?6tJ;zkHczU%NA*bf1GOxDpuPLFlFF z{ax@qy(>v~PhloTy+|AAEWgfhPi3Vfg}kclE}=f?Ml!`|swuf8DQW5HX_3LCw3}G| zd6qa`Dfe}FMM`>RMs%=x%r6^mljTv5 zlX&m;Et@uYKaY}jkR_Eb*^}`4Wx&C+&-U+2e)~2qZuV|My2_G@0^)aXTmSZ1uMZJ3 zwr%zIetv5gAw67)T6a=n?=1 zv^QDLPgQDnJX|AbE6gW1Ho(1DPYM5#1^oQpGSe>hMkJ4cp8 zvw!`mGC`V1-t0}%w5v*DV$uzF5zuVoL`3<6A<&`4q0{nG-3d7y?9jVwuf?LhzUKBr zx^~-i?vPAEs+32Ch|uynhylc6!o0ZibD8Cr-$qAE?B~y$Ii>%ex6yCb1$-9b!D|2Q z+s_|6dF*lcrJehB99Z~Trgj+WM_>qQ@*lEx=b_`Trcb#YxZiR5{)p8}X9u3>OGaQ) zf3h%S)0(IDbAylU8ZrCM;>iO%ZtrPN>@jH=xp(_UP{7-e7x&J+eR1~w)2qeL!)}w| zXs>n%+{Km9m|9{@EiDcF)z(ng(ook_*V59|V(usZsfE9aCiPl)K~(pIqHkC@>1|Cu zzNl;A&O|*Bl049>)Hd-@KmYCi*CxY6t4(|TxA?5DVd9JT#7D>NhlAtbNfKq^v%Z-4 zuJ}DZ8(XP+He)&O+OpOA`E7aUF)0)G76a2*4-}Ya;jL;~_$E;6uSsjv43uYI+Qsfx z)584#Rt*7WV+CkTh<58Q7G8OA3xI{Y3g`#`t`N=kUy{&PX#h^W09XLaF{#SJmC))g z`7v>gVI%>?e~5l{0-G{oKNw=`0*Y;kY1=9TR+N9d>?X?@6n(QaJ5_y7WxwGDpf3Ss zI_Ls4t6|oMf*pExo<5qTro&$_(5_2Ov)+Jat&r^qDBK#f>q|R6+x4nzu`#hOLl!Nb zGtFUNOx##1WIm5&!MGw#_-Y z>(qYlYnMC@Uf7&+{)i7%3c4UL`YXz=wY7A$b#(RgwKR0JG_*Bz^>nlu|FvDe{gz$# zNGSf6T{|?Z->!oo()(ClyQW`zSiHBcU2nt{lcFuCG?vt{YhTdl-jd(2Lj#o&R|44GYuhz@(gc=`m5ENnx^}%8 z8ko(sZD3$%1LrB@t>M%+gHXNK5M47LmSt`3SemNr7r254T##O)@H=NfSh z=GfbHt!d&i&z&DYNjgWcTiUI~Shcd+x~Q;43~ygZ$Gj2X3QE$t)a)5QnLyt*xc4i$A)0 znv{uaY3S<8OnkO%vBt#38i0+*hV|924IYb(sLyJ?CVg4{Q142*)l9_qPPNkssguF6 zZhD;zU#Hj3P)~ZT4E3eg%usJSY4f=i^`{r;RA;C^ojCp=eb^7uhx|>KYv3FD{Xe6h z5nqiD*$1EP=d1B0&;Qx}wA!?4`PHjc8`-T?wT*r2?~KLN&B~~MsB~`<2fGQb9%x#+ z$F*qM+F~t+whB}00Dg+=47JypvB%>?F^bVK(UDJsRt(YDTa}PY3Xc`h3kwQFpV%Mr zJ{6PPCvEn~(^TJ;Bp;K~l9NS=O7ZXFq9b3uDah@=yDIU0iS$?sO)3>7DP!W>x38by zizOohYNl#RlarDXZfdn?O$>nPu0N; z$qDiAv5FVr4{lyK`X)Ko!M|n>T`ETsRY_FD)5mwN>`VR- z7Z#H_(61^_LRo5Hntp0(id34E_#Sb>?ga(JR;IiQi_RFh`Aeo#X?m$rY<7Iy+t*L; zU)%kHWTnQ1MQ7Uk*35%I6wbTo$mb7(_dX<_vZYjQ_M7CH)Dp_mPNj3w(y+SZ__(N- zPi`N)Mam1ZrLj~lpD(#i%X1|s#J!COy?q$B14?AMu)>XBa_vf|rKR~`*3^{b#JK2J z;dhQ)CZxP7YnHwDm#jO}8PXCW-I&g$Do=WcnM00WB&4z`cTBdu*O%No(pkwBuO3&V zdZ(+Pw9=&aF|WfzPF%u!HhF=#u-I$|&#D5673teE*y*3%EKn~jP4&u9!P{?Xazaex z^ZTbRi$50$kIQlJs8uA5+-L(+Nap7vv8cB*K@zG+X+d^M993jPRgt91j2)TmEaGbf zH%O{yrb@{aBQc+5&J3KDeVSUXais|I;Ndx5%m1!QbGO5zUxHr$A zoV&H2C={echsEU$a<7?RDWmw&+4sx~NivxknOTKdq6{Of8;vO<^zM~Y0iL2&t5z;sws7|3 z(Zhz#^gNqOdb?C1B$LdYS<0CeH@A{fu2Nn_x+u#kBcG6>jI6B8jP%sx_c5=YKDcpi z|0d_P>qP6;u3EVge-=&}Is1B92j?#!yRxi4#&60Xci$l-(g_wC)gN3@&0Ysa?DzAKM8 z*8*un4&2VqdV8hG5|aPXV;-{=4#_Hz#MrkHVUO-!54w2%?3q(1PX-2_IDY)-;RE{v zcKO`vAgU>f4LNYLKq?I#W{X=Cdt1VKl8Gp&mQ+-2^qUu9k8nre+SRL9E(cu^T~@k; zh^GRN?Yrw$1I0CaOO{sU?uR+$;hvnmB!1%^pXnOUgU_;|N}Lpu?UF;wDBVKTeWEi91AFu##P3eXk{+R6goQ&n z|3j`gTPrX5@srRej~_m`7joyu!)ux~N;~H;GfDBj^=>}2O`F6%de{Lz{_`Y7AZTN3>Dd+sn&igS)G%vqUTwX|G*zso>Sih?g&(KMj5IF!GLSHE1fy zk>oORiZh#S0p=Z&ePRRN(qAQ)PITS@8vbQ(qNCrwiF_3ik@Oh1F6I4;MVxb4WGQs@ zUGL@&ZqDwyF8Si`p_UKaepH>CyJL{RyKPJR;&m#RQyk@}g>& zQ}{rpLm7oq9^tANUvV_{GN)+mGM9nG2+m(+ZqH}c#Ny&PB z-UV+KBmK&fl1a#r_M3@vPIgWqX$r4MR<<}xAv2>gNv&G%=_F6`q2Wg|1A%gL2zeV7 z6B8Sg^knXag)isFeo8Dmb#vs9oRrN+NK$ga^EC}Fr$>uoA%^-D$7)b{UuBT|tYUFN6|@vgK{ zNf!16x$6k3u4O& zur7nHq!Cq?EKMpuchnw?U?52oNfnaHul5Bafj3{-0LGF^1dJpfoby>9>H;cN0X|^s zi1~_oka7m-ZA!95Ql)h1=~-X`ebHQ`3dtoeM5ZbRE_|8*>jnHp;E4#_v>ssWK*>j? z0=c9JEaEE}(pr+40R1W9loH9+1r0Q4EsAo)h+KBT9t?TTe31YQBz(F7Ob`(!1)J~u zk(Ey}J}W>5%lQH;;PVa9Pp;|&?MYe+;-(fJ=%%O)uPTx#4HQMWw_vKf1I-Aft%9Z0 zP%o_h7g#=Dpv`<$bZw-aUvj2cs+;uj(@N;%wSy!|aRrw^E-!`|7oB%71GaT!8~qr$ zhQNHj0kkEFAp_RFxloKUs-z^8W)GmK9ckwl49F@a>XfHikX0xCGMFfCvRWVsS{FEIFm`i6XT z{>1u7GSsVvZXHxMqVnJZ$-n4lnY=kG)mf?-PvXsCa$#OFsy8KpgdS})6j3|NQ72-r zHG!{DGs!1OfklyA)`x6uzCf9iSVT^pXb^tp7)g>!ajB0x_>UUFMwz$>d})qWipy8P zpPUO=pGf9sab>{VYG71?0U&=FUa zLRLX7MN}i>mfb^C1P^_0k~Bkl$dy6-Zj>fDOWDaEq7LZJlF5rz!X7zlO>3whwHQY& zg^K;A4?&2UNRA%0UQ;Y0iE;&NCRJYU$N!Lv{fNG?;w?=2NoYe#6;;rBv>P%@DBS4+ zWqWU;_f8R`%!P4tP+6#OW=aOJ=KmNtixf(V3`?tYtU$?pg#u12dAXx&pL7qBn35uq zDkPM?7<*f$;*=yZ2QnpfY%PiuIv24DN!DjulL2c~1EVr{$e5u9l;X(^SEbWuZWkoG zNSTR+Bs;-b%1k0>;nEjSxuMkt#rt{nEaF_OQ6?Am5ejPvvq+Le$|h&~Gz>aKl3b+p z6lsd9l$l)e9$dcQp&c+N!*wlYR*6`RrdfvFh354LB{Wdt=M>;5P)y1y+Rd1LBROr8 zl#yAf)4MKE)DM8r@^+AT?2m-Pg8n+5(I0%UKcu7!r!LTUB~s84@D1tBNVY_(5>M_y zlL(x%aO`_XSt-dVb+Pz!C!oHtef5c@Roy-c4g26UiO25DAa-z>pg)BaPfGbd@LUdt zHBysFJz&|yxkS7Cv+AjtglSWhhoep*q2x`gyCuoaQU)3{rTrvw5l(!OPOg2Fu7pXl zWd=fNp8`}WuhPDPwn)I@Yr{Tjys;7rOVSfl+)z5PRFQIaNhA~`KLFG~z*40O1Vp|Q zjYA|*FaQVl$Cc>anaSCyQf#UWEV=R-e?(odx5Tv+rPH81J4*Kj3~l4F0?x;51L*&D zNkInM2Q4MV49L0iBV2%x!$upZ4X%TB^(u~Opkc69~1pEjSTIj$w#V@B26eN)9OeHKYlDK+N_|5O9#U*64iw&Hy~9K z;aKJi_(mLPU~blewvD7E$%YN~enJiz0&Q(Yrc5(a(5KcSH2}-&$R-CwjiaV0K)wN& zt)QT!3j0yKloS_K7|s*%AILo5Yq3OZrUIL5AYVCsR@+yYN|cZkrh>K$Uo22CRtJBQ zAMZk073IMb2#zt1fwO>tE03QAyT{Poz*jcbgaw3TCg5Bkkt!ui6Z6TtPQWqr;4=gU zFh(}4u?xNuNx4dI&p_K?gMeeC53O;-sx&JVcLSvvxy7W|TOAAyy##b)82(KZl`53- z)}XAofz4LJ8_RY(-xN!TVti!8ULmOSSYkF)k8GPLNgWvZw`t02k! z^-M&jAQYJj8kh=AO&ge+o9lo^yWw+|&s%op%y0k!uc2)NiK$KlDp6=E6dG7;!(}!u z;1Rf@PM>}T#$#$ZIi4Swd1M-BIfIfzFI5dg16;f3dwx*P!kr|{P(K1o-cV7657B-? z*A@s23SS)+o;a(9Crsw9=8mK;wq2CyZR#){N})^@J9F&Mk;>M zG5!g{t)w8@l`GCc&iKp3kAtqbd!MUJcuvTN>z@dT+j>AkSSe`4F*!Ije5fF=J^Z|1Ak3?5NgZTG z36GF-IQbtDfw>rWYkI-7Vp1|01a5?!$Kk<$M0$gc-XOA-o{h_hhvbF`V3wHZH}WFH zx*s7Y^vd$tz|-|68NI+_A095Op#c#wdj-Lyn<61hUcw3>$p8+xygv=QU$G98tq@09 zJGYyt!kX-co#Y`_V5t1o4^j#FM9oo+@yz5jAPKOiqN1Fvf;++R9L={z6=Gs27(=wC z69UUfTnF+D{{&qiUf84UCy~9(0x_XkjuaE4U0{!iw~3k)DQpo-aEfU_h#M4>7Htq8 zkNvR*n-XHWwJyBI65Xrt1W#|yz_Y337F-n*rOl8|n*BopSUHF;93>{In?boK7S0fU zf82l<5%t{w_sIj?Qlc#_9^nNf)L=>CD8ax_t zRSB)d#2-!_#uZ8cZS5f(x3;{)0dI*94aP^{0ffG=>;THmHJaO{6(Rb|Uo#TO3)W*iVJt+Fp-YX-3cGaWr#h7+c#a~Y`UV$at$ zLyf0Oi*%9*xe`Yrl+$0qHN@Vko31hew{saE5nC_@t#G9QIvU1ZawCFd>fIn6^oEYY zeI48yL+|~ZT7of0wt5e{>Vg|i*CuLfQIP2*Q8z0Lo{>kx$PPU+R-NF$!Sy%Iq%EQ^ z5s+vaJRll9NQL18Vhn}=EeL6bJ`b%BPpdK=TN2aGU!gMxlYVGLYBuC4WIlv@WD$_V zO5_qwf;*uM(GBepeLRN{8werhIwXts>J@mAgjSfNH=xsr0_+FYNE6%v#^X;lH6tQz zZ{x5#jk~qWperbp=Hf9Eu)x7zRsgffUKla^pR2?|VTt|tk}+ud^WYrW1f5l&*v$}E zh0)+lM(T=)>RV{Nr0;q%Oo2RxLtj;K$s5O=-F}<|v^$3oa;h0`$a`|4Wf>Vfo`knF zGQ|BzvAF@q>fvJR`26Zyy2nohvubSW2$VktTc=jfwt!M2T+z3?O z!(ZoGO{?vvYhGzp;#DP*&$1f=^`wG`TxLO1_5CePQ%B>4CQCy{6VHh4mJ!Yr=^Tfx zm%m)eUmE%^4UHzj0#HRh`xM1z+$taJr8;*N>ze+>PPZ*Hi|)IklGPK+JUjg5sHR3m(kF8jHDI~eH+Q>@6ymPLj=mrIt(JX*oDF7kw`;V zlu|UbC`UW{`#f|ODc(Av*+20DFCQ>31^l|_AZ9tD?uiNX##K+8$W z7--T!1at?pCrCgy#g*2#3Fv8Xk|LlP*?GhbPr@%Xn?`VN3YdMYJU-LUw9E{NoPBQk zefD`;HT$eUvClc=k{A^DYZdU8Z#Y7>wjNU-_uLp>evf;eD#Oev-au$M>SCZf4rznU z6W}}Dj_u^Ea}jPOM0|^N#v5S@qKb9KbH52u6C`spM&j}4l{Qmy(k?jztGD5ew3t}0 z7?moPxe1ck^|H*!22*XMSY|e!NM~_XK>>IYV6&W?YjC-mG<@5oBXG5~b#z49dOAAV z_)iC~RCJMPEpY!DbrL` z#L7$+6=f9_k+Q0i8Uxv8IrKN!W+gc?4qZ(VPm#;z^XR&K0~JJ8TWO}j73jJEqra^> zPs9bDv+NgX+#$F-^i9GU`C&>Abk|n3`M;hszbv75D-@7hv@n0el%EZHQ1q#ARX{ha-_= z@?rcpFlDT;ZUIVpoRIrW>>Cb8pa;r)0~C(M9&ez@*K-AZo54&zC7k?+N4@3nU>tIQ zjZx5gIbme5<)92r5m%98s0!A2hMI;=w(PH}>kf>e%~e#~aZf_TW&8;1vw#d)qxno2 z*kQ_KH(<6hv^%5d3QV2JFz>v0yTXp`yS8><@kLxZ561tLbWD_v&DR4MXno)%N@c76 zZj&1@n%G+wQdF`bo5w-vzJVnteRT^zw-ohafVTzR`Z#8~V|alH=X4_k>)Dx^gH&%% zKrHMEnOu?e6UchiShDUlz_aYO6NF?Sf~gy|a$>mweHIr_!?Qa9cGS1AWbCe9kz6jy zRJc4Yx;%xYstHfm14FL`PZj0T7@?7g)N7~Oa@EV|s@1^a2z1d)&9j+B3=zx1PKkkH z_2Rh8p|Gkd!-%Y(9R3W&(BN_e8VJ>9h9Wt(0cd?&xdUCtrrQ^wYF<6Oy)SCGz$? zq|BBYrcAN&ZlaDd>5ovSqfFMONk}_j^C+3Bq3UI7Yd~?h0wsj%K3HF0>^(k(WIYSW!3{v~*^-9irn4O9i*-hlx=oYu zu4<*#T0$HF+Xa{-8V)8p*faqXk9X*&A;D8iMQ`foZ@=JRw;3oQ4r4Neo!kO+CS0z@ z;8%5hZH#JyRjmw9NFj;#5Qi~Wpn>DopsQ^v*N=kOB!{RnYDVLF8Cvyf0BUsbxHMN_ zG}7>0yA@!HtT_LN#iz;Ymk%x#90JB&+?g1X)}^X;u53tsyY?Ez1$tOq&8VOD7N9jK zLb8n-lHV|eb*{p z#f!>%Tvi-KZ;D&PwP2sOel8o2|!WFzI?m%6_1tVaQjdGglA8n#E~tl za4j%eHYC0W^%T^_JQ|nl!eerIM*2#gz*6NIqI4oIjmH)7#Avr%LvZ>gP_>%NTLD|d zqBEH+5mTAP!oSFKDycJFK|#xqBQVgQi<#>9Ih8{F&jvXCEzk<&OQ^m>>a(A&k%_Uy zgl=qNA~MFe7R~rPeQiy3CEcD*-OM>0T^nl?V@#xeFrPBlY%4DLh^!atBR*xY6!Dqs zNgb4&1bn{8K$UCKqn)M}8bWXKG0y|Z&oUYLSw9L=lN1U?elniWG`V7qGEbka!bPLj zh2z!S=htPc*h^X2D(+L2h08!12m4Wp>N$ZbU_eC`{V4engJoBym)zx{^4uWci##j%+8# zaeY9yK900(IC7+%uQ*ah*!i2m8-uvPcY<$T3%YXq*3ICctJi{puHHa?^y9PeftkD zJ2ooS9AFh`DFRI` zlG=j_n&-(C9FoE)(pL<$Ny!pW3Uh!hWC@5#Kg`9DB5e!Ji4>rS41gP#@djI&>=6O2 zMHUX@8dRo;43gl38B`(d8K|!60I&Ds4HeL^qXxUcU@{b@U%#F4610y7hZPROqc=XV zB?Fkt{=v$~E}-QWE5K7?3JIsc?((hI#1a$Hg`S&qf{xK`DaGhLwol4{j0!8V!f>qx)cpAxbUrAtYO2 zaTF*eqD&t+EPS-UVGtjKsl=CB@hDW7!Y3(ostd0XsmRpJBVhoIhKG>F5FjQU`$4av zxN|uOY$uKQ^pdXBZ}e``2{g?5!~A?2SUKUdQSRa0l3H;b^qP)5p$iy}86HloU}!H` zQo8~f0XYmUX&oAkVv#raA#>VS1Uz~W>5dJ9v>3WRKtIw0n3{^n4Q^Ewf#5mW4>nfl z2&p&r0r%`!w#N%MFbS*DRI@+ysEv=-UuncxjD~OrG{^-A+K#fVgm+WmN?YWB2ZJ{@ z;1MWgW5%YC;(_YQ2SC2@zysVs2Th1bpaC9?@Bw?u{P|iTs%&g*P5s~)4hHiwW5`Sf zR>W#Jkdt!JBvtBkc}Su>7#QDHyvFSWIq)k<6R-A3x3}&u>3^7(sF|AEaWx z=iG^MCCvADwCovDwMBPB9zS?bo?O63BD|}uo|-hQW^T=^zohKn*xt7~ihr%z$2B(qh45oI@&y%uc%{6d;;TJ=LWu)v<5aJ^5H%ZxxV6F3K zq->h0o()4c@6Slt-b^cV7$hfUD}IZVZH-Gq3rjBE*ioUuJ|lmNlx>KlESOuE(*>VO z(ko)@M*J2j+ct}A2cem{0E3%y$zZ{6va+^WxSkdYElg1{kq+ zVhC_8(NM#}Oc!1uE!*S=v}{#ea2|06Q%j)$Z|3lR!%~Pwv-1y#Sy@GtnS}|5 zYs}?n8C!^iEDK{zb*{Fzj*6nP4gce46o4Cq+82t^xG@W1^v5eN05vE!a zE=%96fxbRpY^H=zd=yKcZ!R`t;)A=m95>uNAdfFGV+$=B=qfHh zw_UP>NpZ5czxNsU+l;YX3oP7XRz)pZ7{cXnu#(BEXl|~pndFHUFE(RgFR|K`%R+tG zNbbpbP>M3I!$iyZS*60y+7)5%7+IJb!{j7&LrT9?_gg8do@%RaCK9so+QJxgF^HHV zYrg=0gRHFutd53hZcMi#4s=TjmeQ&v*o@(bQ5R-rRAUy(h}-Yt%7|M|4YC#Yu&Dv5 z4e1ZTQY6$z5zT}a7HmCyW*k}s{HRAE;#^JVxg)G&4RCE zOpRRhQbG$e==C$eNb)xSO!A_{*mo$EDHrEojutf}C>5AlG|=Ok$p;9kN<}%XnqigO z1toJ`W;Bx^v{5Z+*`xL>3>n7wd|qn`77dMQF3>f$5DOLX%F+mq%7FRRcJV`CnKC#S zc!t_Qp?4E~ZJBCCW}2uT9iB`tSe3as%=$@alWLh+R0qnS%`8pWia6(4%leEOgj{V| zg4m311#Rjo@ZNX-#472=d3WcO{>n)W8a+6utktyd5V zExD>@<{~o?N)Sx0U6GJs!C}a`>*`@q4{B9-uS};%g^IZfd<}s$VxY@47wS>QCXQ`m}rr`Sn-0Emwxv_l0k~i zG-TaIUE&+GxGuj0OY!T96h$5ihUVC06$+ISocfiR(eVxTnYjsA{4%UMk0Q^P;dCs= z6boHtcoHGg+(H>{{xTravPh>h+kmYQC8cA7DYrtko3dC1l-o)l0&pN8%}%+P`n6gW zH(YI7IJ9`s4EN)UgesJzLX?uSSgQXSs7^7u!`5;<`M^R>_$%5S!#>kxU_fVdKh8K^mFEF*RFsB-)h$7)zV~+kt9!73c z#Jnu3{3}&q_^_-uk(gIh@MP&QXqpXhDzLyG3v*K=o*rL|;mQI9XBGol0V)hxM)}so zsleDQ3a5f3^+zt=q`?LgmSrOyF5f_8sAM4EbM!b|JsWFR6KLQ}(eJXjV;R!->36RW zOx(ohah&x5kAO1y6!lJp9sfM@uEpEHrR&16A2ROL!&5}n(Z(zT4=$??(f$qYnkrWv zXKdibWf-z+kn7(mQypWhXza~r^Dw%-2C4p?Vn0u+Q-aA!^`3*a{1k~ky^2IfOZzs7 zZd)&jjv=UCNTLtlgao>?6Uz~)b4SO`$f7$rj_(6{`85!cosq{8kEl0}m>G6HI2dDw zF?iTDNbLrG`^43tD>rZ6xDj;as_2U1b&4Jj4yMA3nG|b|IT=?j-z@wASAKL8AgVBO{PviQ9#QG(C0eF%jXt8{d0a|10G9K>I-xDvmEKCl4luA@Swp_yD=`dCy6O z*GWQ>4&;@KdOP;tfDE_ym9Mz+#t@F&^#;-fS#TqgVb2DBFu8|8agE;*e0DT#Rt|FI zZyYh2LxMcq2+XB|Ja7y$+ZZBPicd}qxrs!RJ~@nBxgCZw*WuZ`@EJ_nkQ)i=zC9rB zB%aX%MKTe_Y=seIB&>Y!I6DsbL60JehC?r86Zd=on#V9eivJj}Kb5QFQpN_-F2lgP zk7ALaT)P@P>Q-U&9$H6YsNyYXNe)5OUTE=V`Yhz(Ul6dx2QgenZN*X(qfsBwC_Vz4 z(lMksgktZO0`k$_;TBO+#whBg7#V2>q!dQft^jH2X7moY|8x`a^G;N{!fa$y2VxKs z-Goem^9UaW)(GDn_rR~figYj`CC9U5Jnnqr0Y{^ePCW`s5Z)TnQ=ms(c;qvI8G_GK zvBcowm9QSs2Vp2P%ZQAF%ZUDr5?&dJ_XUSxWh&@kth7dvDFac@fZJsxUjtx1g4+Pe zhwgR3HR9F5qzJi8Xfrk(iTk6-lMe>Rao|XXL7VAQilUjyBPQ%8y+FC~WLQzef@Y&` zU<55)ldV&p4EC$B-|<1`Q%651O=%PDVO{MCkSA|XO%;lsDmXSu@nN*clMfaFgLRAa z7lT%Aq5?9LPNWZTv`lf6ZJ&+^^rHx#eV{l`LsfI64ZHx$o}kWZ(DduDgh&h*TEHk= zgJj+53Q314Ep~7OE^Q~l^BqcCKawYGXo+-bN5)u94)th^kN1b+qc>*4_T{jZ`~$$v z#=Tvb9ZyIL&}QJUsA--^lVk9Vh7@UXU$`&pBPAz{Xjn&(&GyBXhST&5aM!XO{bB<( zScEkBDLgjN0$!a%-ghyc2ghd>!catM1q>R79M{G+TnAcs=p${CA2|p&j>BqF@d$^@ zY`Q5y5}WGTmomF)4{uRW*UG8RNOt>|D65$^#=bues4mc; zp};`~_||@W9ML*Rp8=0M;zr(Z*n!eVfEG$`)CThW0DLNuBYzGjA}Eeo1!B?|@&hSD z&~!}oUaP9&lMQQDfDZ+DgojUrke>-E@#`UICoG9+3fERa_*$gLM`O@M8OFj2#KZ~* zs1)#2f-*$!g~Pj{&2wKxJc}Zrw!Ze@4jDda!yJ-(Lr~os28r@aL120!;eSfrZ$!Js9tOKJAUv@^FARN;40#&HK}R7&UK|=0@hp|R2qxr~v^IE6PW)eH z$QR3=sNV&bMRi`ZI@kZ(mo!ClYs+7KSy>q=P=fxs@N}>!Bh}xR^b3DK#avw7RCc`M z&lE=a^xuA+wWZFN{Lza6U4FZILJI!@`k(aygVyU0>c=R%KNNsL>-|Ud0{k2G|A_$qO8tKzz`s-f?+frR)&JW9{9E<^t^og9{l6)| zzgPe73Ggr0|62n5oAv*W0RL+JzahZCTmP>M@GsZ@%L4q{_5Z2>|9btuD8Rp8|E~$~ zAJqR#0{j>C|B3+rN&UYdz<*Oe9F^%n_$ zN`U{Yev+W{GdHLIUHxR=&nVzOtRDlXemn^N%ldKW{f8sqzpOun`@`yS6ZOyT|G#_l z-tNa1_+Qpv`4a~4pVn_j`=J5+r}cNC|E>QAL*TFe|GV*D`Pcsbj=#U-@4FiK>wo_G zpYN`r{vh$M|NXoE`L6T9#J~RMumAZ27xUesfBny2|MS=Xd|v~9{qJA@`&}pc2Z?|E z?_dA>eed&k{rA`Z{`J3q;9|d9^soQ@>wo|H-|uVSumAn)f4}QQ{~+FSmP#!sC(ScFSIEEr z;&Zf>f8q!@4Zm*ZKYB6$Brx>*ZsTw2|Dzh1F{x=={Dz92D8A}U2NM%DWp`zKuRC?| ziup6=H#ec0RrS{%|4zqC{Tb6IFOtbtAB<&I1I-JFKGd---KBcCNF8Uv{mEgjho?@)l*G_fZ*hQ)iF0%^=>so1|Gwxo` z<_{X`4{H=P@|fsy*AamaqijMlcn(&_w)rI6?N+%orV*q6O*4b(r<(y+Gd`>_Y;oJ0 zycPY=z8P*ksi9hvC+9Eia^ke^HhuNNi}6#Vn+Y1;yV>=W`^R+ahD)x$ZE4uae^*!g zjh$MyemqF)VZ5KQILnUl+%)|K%TvG{f23qlvvs}=)>ORqjqG?c;NWZ++QOjKp^HHm zJgt_cy}jS~y8e4Tzb7tJ%{wnmz5c*vUtZG8R(&c|hel*-HhXa7(Okm@>^nC{-gNCU zHGk^GmunnP+MItN_6jZw&~xn3@t*{T9vTCN&FiYwFnNCKXu(om=|9JuuiRtbnmcsF z`B(33W9MA!wLPTC2S%I9A${DJoH`KOL1$=yg8!&c^>E)i$t#=N>}oK4<5rUZ&q$~6 zOQFez#ZS#PAF=H?D|1=IodVU{C1G7k-9gxdee_=WgaH5R`(k=Fy)tO?gQ4f6941Y- z?ALhB{AUA4$8HI@ec{oQJzWl$I`%Y;zj@zGyWPy?vkFG6NMk*?ceurpT@h3LFEuK2 zD3Rz{J&dPqJA->XZ_OPBWC%>uO>R1{xR5+dyeNs8+!O4ip`&REcF#f|+6aMwp zu5(9rN?tVKy+^j`g`Im-%r`|Swyij!xkI0>xtN%jR^)K@J=HLLyWnAbZ(~vU+DRt* zqR^bMLOZXML({@$Wtpx`uu$f#mI}LRaoSH5ua2R6m}MDuOy2z7@Z_bw^Uu4jJuoJ7 z-TGZkZXBET{{AM{WP_Knwy{}#C+KHi;e|<58yG(A;@n|UqcP4=ZFc$_m4gcI(S|p@i<}IqK{ymf8zE{F@inX z36b<>3s@@{d)P+1wHI9#Pmj9yPwE-2;Ksr=iTy;1=j~sNEo)jidP7U2o?A;aw%qKo z&gGhI!v)c|&UA9(X1Z?Om|EnV=x6aA{q$aT zi*V^(!B|2@(GITmpD<6odBk3(>Y&q=A=BT5?RwU`$H)So4zD%$ck&*}992~4uDo)z z_sP7DHk^xF`~u!24GHH@weFF&j^o_lbP{8g>4f$HLr+;;Thsi#((R6RaY>6kCNAw` zzsUaJy@vxIrY~r+;L!2V$9{t@-!3ijo3}qbFg(=!+~o7ynyuMAbn3F)u?Y|27meGs zea4-_Q*pBvk;Wc-`Un(n%-fp&?$!DeoS^ohEj5n&XSCw_4!eG>rD^m~;oU}8vxiO_ zU~HG`|KW0TH{SuhZl&+LG5AxLM&s^I^$h49%8A-FWt#6srvI*+C(aF6er#2rPxlh1 z6fB9kJTd(JiRLTQd#}y+TiU|uLeB?5hjwjv({7w*SWE*&~t$c^H*3cA315pDCry4nx(x?jvc#HO|2n) zu+SAw?0=NPRlYu`(pmGI=RDKkd+A05bPxyI?G@3IN)u0GArIaY4KY3QPxIK{EQ z%|e3<@w4wtz2kGcP<#1op3}%psoVH>l@EEJUDST`5Dm|9GuB()@{M#n*s#OeknDcq zk1tHhhKMAMmsUPc89T1WEOC)7uknuPm*MvqOEX_Kz~ zLA=hk=O<&S-vHKWf7df=#xckLdAj77>GR>7-~~==dYaDe+VFzj$~g-+c9=HGyLoed z-`4|%q^7GZUu`jW$q`?N#}^uR8fETnSJvuSKuVAG&%$roDMYPR7fD*~2+y**zx8Tz z?9_{46YWDsb$)r&WZg4`=zFsVM$K{(uYB}U<3Nl1d=*C9?!Kmhg?-zYI~^-qG&wO~ z?4`uOhFhAqN-o&)a$E33R!F13lD@a{JU(r>#?B8I67b-ez1F4^y-%!dvtU}A5hGd) zFN^kXby}Sg|IX53RF2S^X=1%5ikY+_G;~Puygm!t5t1gIY&?h<}^jGjfX3_ShY(y^b0sTuBTYa(UW_ z1x0(gl97u~woE#2mAziP?BV+zjoiAlKEK8NltSKWgTN>h zJlv~=*P_%Gl`C=%Jm1CW9eGbUiLTmTZNuS}hTSf&87{f8C#-m}qx-=2hrJ{6Zy${7 z=%&Bxt$#O5jVJU5O=h9sR7}Q0CJskDc~5 zX_&>6bWY=j*|drrXLY9_GO?MBWJ$gU${C`_6;yTOIk^JAj+sf#<@ zosdD>N;B4RQrJ86)r_`I2_v)?m`+k;i%!vQMiy-6`Poms*4xgV?jUN?@nDk|OXyc~ zuBj&;w(rtAcIp~-xcY)a!C7#@%421xfJ%cBZRyUrFCs%Y?x5v;%X&VZa4J#$RZFlan zK5bN%=40h+^@OWEO690?|B&lVU+Xn6*)nD6#nFBH-_$&KBbhd(|Gw^X7#AYY zcILRDJ4|N<%Fioeyb zw$flN)uy5a8*MZ;bbB;)Nsf>4V@Ne*Z z=wscubNw3yYBO#awN;z*(TscPK7W4kyVc8Pr!?B`x;u1w^Qitt7aUJ?$q(GqJZ0gb zZUxreSKUt*FTW*PIecHkMk*=I+UIT)*!A8Kpf=IRA;`Pol2C4+!DZ)OGIsT8ImvVX zF|V*s%$3`AC!#151b=e)P=BoU1P3MEVGcN9l*#BI?gEKv{ z(ad&t?8n-TC{-v5?Bp>0$keubZqk~E+>XfJnH&@nv~2xR$7ePR9_Q`1_tQSsP;Ks% z3w*au4XxH3&}+4%>$DEq?YtA?*CxK6cX96OK?AQUzjj!;vdBp3pykHpEB9aAo;+!b zrgfirYR?W9Y~r3uYGUQ>pfEL3dzlJj&g6g#0oN9}1}FA8KfU{e^EnGIEooD^z2QgW zsip^Wy5YC{zBssP&oHN!i&iI94ly3f_9hP66n{LAj2{?7?RCDik z<+BZTEN{+Ty%TH(Zw_rU*Sn;|D@Q?nwBL&Zy^d+VjkTCR#yxh-*sUXs95cdBHc9St zefSb-%Lk6uN8--tJaTH;;p5^bC!E48hIToWm)fwm*6K&1Rzl-p6N07~1fEM0S6)3c z_weHVK8wS|3t`78)3ruhB8=Q~Dx}G;PHfaJ>!!CN}x3xNdZfrra(z3fwV~-E^oa2A+GRyWzr?Y|c^PaBdn!oBYGrwzO zSjM`%r<3j08H)F==s53O_EOs7CPU&cU7j>_sP7J2K5OBOH5O%s}~2I+g7G}uw|z?O`NlW$c!Tqjc!GnhAeNe zG%Pygx6=YjxCe#Nh{v!j-nEJX{pWC@^|HzLkBKd z&{VH&N6p;8Zt+pH;~`m_J4YPh#uw}EKdM&QJ7ho~_V)gqpwK4lA+xW~c(ZWOwxjwh zq1?aD<=GVU5?3*fE_`Iv(|%{(j)q(MAJiAD=O08C}iqggrBe=1ypuVK-*WwJqub2AEjC=Y_rDM#>^i80YVYPQ z{l-a1(^R8xa<1sdh6D7-Tc1y`BLBG?`~?WYBAzXlh}=}>NB+*ZMRxA zO78CvFKx2IG>LV+tgw9kmE%rhQiCt|7lr6|IU1yX+Ayu#y6Z2e-OtYqf9#tk9+bLo zt5=6l(rTb|T!;{Cq& zUE{EPc6WuyR!t`>Y+qbB-Fm(Bqi2kBM!Vb(N?lZ~XKg82LwFh=qe|~O^iDAxV{m(E z%L%mUXB;HWvx9tvwmo+Y37THwm;4~Q=u(d}t2a5cp5dWz-23s0>uVInx4a&nEJ~Te z_q{tJtw*uOLhXGmKa}kkSFW`^!m-_VyW!nlfql<(d!lh`M#+=LyKW{~1dWjxM3lEJ zh`4biu^{Zu-hH-j{UW1m^gEDcr+lLwUEPy*^YmN`HfeWS)3D;j!gbr`6sIhYPI=L8G)^%^9k;!d)zG8yMEJ+sfhE%etuaYn2mxU_j3SN4o|% zhj(*%`6_bDl+MjswJKh+=Gdj~8v+a)sLuK{#%7kWRB40w#I*3irhT^;nZD^#bfhIc zBU!O$yvCE|M<#~eZWZW#Lhm1~8LqHx&ym7Doz|UHy?CH;YOh8m|5#i$e7D#-dTFq5 z&7D&I>g$oKo2|8FWIkDIp|M|Yr}grQ(r#^AsHpW=IxKWpXh`<8@ueq+caC{}V^dUP zLExL5;+KQkK246kJiGD#08l`$zZNR9SNS84nmUYx&`fJA*6oS zf|seb)p8bjzGZ!CMKK3>5$2)f)y95Sh@!3x&3X|Z^;{n%PMPgCx`;8@{PBwF zGjwc%^>pewU{c`bN}nHolE)<$hb_1R<*0IzB@mADFt!IiHw#)?V3d?c{~zn?;5#uZ z3r)-GJZUpjwFH->e-fw)_NCC@^FfvBco68hsJ^#(ZO)mLK*TY-LT9^oWqUdy$X)gb z!U2sk&b@xu;D{nt{h?pQcTXlnn1biHGsGZC?HprPw6C8~E zmKW*uEjctllg(b6vPF%PB8lHwhqmKj;RvtJmcKe$NwsZ+CB!lFpy=X#)G0T*KGbp-~`PAeXOqidQ`Eo*O|7u3u+4EO z9HScEhHUIYiS=l5XVBQMU3I%da0lR{$j+{F$nmyEV^@q($(hin8FDS(t)dx5Q=2Cz zw3|Nd7#5Q2Py@6QA;;2+8YDeWs2b^+5F+0D5fI=S%Z+w^)1EuWpkd>w)slsC;Azz{ z;HAjtdz?{@>5^r4H;bS-WVciV@jjcp0wsHl#2=kG$ZyzRc8>IhGIQA15dML=RGu1M zWP7he?p$k@W&wOYQ%599JSf8fggOpZ>3;8i!&3%2+fbya?=t{6VScE9UIg@7ORPbSXQwQG-ZNK(C@tg?M0A7okNn|t8P%DGVPQtslvQOmkg*$Qx4S= zO1y6e8>01wcBa4RXFN7r4{6;WI7kI-umV>Sr>I0Ok*plT0S^%-a88cM`d(dhsA;)9 zgd8+nEPow1dZq->WGG3egf)aoodgu@&1{gpxlZ&}VOK3$mRY#R!7r(+y(*k;68PU*i8nB-Se81yTzHw%}_mx=(V^&85U zR%>9<19oC?+r&b$O``H66^{X=q7F_4_&T2CPDnZyNY~l6--Qamd8rTMYY_nR9-m4;-O;nxd+m&D zRBb)jf-?MvAzlqMfm2H754lRP320)aC=)T%gJGxam@FR7smjPZ$_h7zewdoPLK5zd;Vq4ATF|Z_{aW0PJ`$3q ziBe9}WK;8hml#7}5K&|%j$pmAVt`Fh6Ci51l}#@DVNjWd+O@~wM91LG55Vxkw)=H4 z)R#pq0dhV{Od|8=_Crx6@+5!H46>^$lZfy5kgEWwy^7nfH1ISl2bX8Yn>ILV3Z8j$ zxJ~nX-!~xjCZMOb3Avw$0M3t3Qc{L_3dMl34gD+ zf**uS+b`X}{QAU=8E|n%o!8CteBU?C^Mpl5bFvM@R{>~G_}^6jBJ8m(J&ITQX17Bd ze&U-X9vlB-xQay^n=Av^jDm;&w~0D00_6kY@_$-HnO#E# zxqE-)3(ysAd96u^7z|UB`2FdmxBvhE08V#cv~TE93KapuA8T%RG!LEC5Rhxw!M139 z5Ks2l(RH^y;N`UdDb1*Aa^k$awDGUN@RDDGtLK?3%WrJN=L_2%3#Y0h-qAEO1fMUplW~cQ zu@n%mQ}f$2b>A%INZJDU?J3feHx9_1=`_k=b5}WRN1(d2-ru(yd1Jgrj@{o8*+U6U zLP>W2Tbe1CkUjj9w_0&jr5oajB9J>ok}XB?d>8)y{}Wu^C%+?*&Ph4zR_JKKFc0|u zA|2(a?ZHfI`bId)2Wykl8>PB{Y5#_lDhe15I3OgRIybg?5DRAG)V;7(c}lrduvbTnW@3aJ57AM3jT)Fvgc?eaxHhgIsv|=x$WdS=iPCO76_g1(=0AE z$nh!>gib3Ah>LAka_Jtd<}xwswEj`93I7yz26?nK54)29y%2sd(N~u8fd&Om6hp5a zp--UA)|@ileLRMjWDxEa6LFd#qHzjmsMNY-4{9Q8tG^-K=X*y|6a#^r5E_5{m7%*m=5h$<_&#oCI?N9;Hn&744np~(_HacJ59KB( zF-2VS1Ro%KFs%o4Q)ac@^bEA#?FD*Rc}b~e%PzJG!~j8Y_ncIygd)zi-1;Oiq!9DV z^qQ)M`f>Ro8y)NMqhDgE3|iW12AeWLYceZ8?Ny0gZ%DxKYFv|(kub4duQ@KQolhOV=lGj9ORv0%XQm!T^qr4Fxg_<@fkcMs%Zf!TGA)pxT+|9) zdL($viTE{oU|%!KGbAVYDU`j!k)!$H^>r)&VOg4;pP-_p2Q&)b0jV_`pA^m*3cu}~ zQUPHi=1iORUG*N_P2*M<1yuvKEREXtPa=kshk6LCas)sQrd!*sy_HxYhGdmUQ2Cnl z%9jF2^h408zEqRgaIjP42-~ffBxrUE_Qw4O(KC|x+MlB~e|ONAy-ZzAE1TPxqmBhk zanKnbq|M8uj4|(fLIgh5upox_+F{K1- ze0t6(aF^t59qRn+2K(vHIR}yRl*{~T1fIT+JZ;CGxa%W%-|Yd;fzmkdoaCd$g@G%3 z=UyvEVT^2!8yaX1UN#b|kKSi3UAy8l<;`2GWq*+%Y4R z4#@_T-KbW7W5Fxg1H;EE7(2{jhlvZJ4} zRrQ(k+$(4GtWc)~*Wt_hnDx*55I5hCq6ZVJXBwKKaycFz*m1)|kG(L*w}5l}tuo&Z zs?s)y>N%33MzXK5iu1P$9&cE9;K z#zwGMFUuQ+EqCkmv$r!vo9+fpt{FeDqZ_4v(dX}Q;BL*|5u23LtOVg=7l?^0EVx(a z;m^$&Sdqfa6St(EzUZr~fX6`;YAFqTy)PL*M!4=6qzX7A$gi>vinws=7Wgq=Ry~qp zYAdR$6!|grR-Tt=vno?6V?855C^LTG1)i#3)4LSYBoO1oTnVW9+igcC;Q z>tcUrudsQve=OqEHU*dlW2x)wkXg@(VkK=qsUJ&P5s_nRqJfMvy;x96=z`LC3eE#~ z(0&jy$~sSSs#1I-aq0*A;UjZ?NAns=HyB*)0tbY+2*|c-XdZ>xScr{nLd2zq?}k)P zAvH#yb!T^)o*VO8?eJm^c-jl??cidP6gkExWr({m1p>ZP=21*!WFgtu$O6T9fB-Ov zHGJX95p=H)V=ZYtGq>@ckf*Ar-k4GN=*3DZ6;9Q5Qy0QX040H+)D#Gfv}G;57L342 z9@KJJ3#v`db*q)K9G#|6G5Hp2oX*0(`xRUSiA9SIIF*ifkIA?*BJ)}8Mk)y?r^jEyaw0-0JG7%H~ishof|9}5^L~;OO z7ofzrDVib^WKLt!FcpM^Y;!VH1sdF82mkb8NKUNQ_|5zn125(SA^`BrHwQbyrhe( ztA&Xsf+WuN9c0ablw3L~a;?Cwd(`-@9ofP&emTqhTEEt>;ejwI+9!0cR0?y^)Qi~= zgTsxTR(p=3>ikURG1wix!A+P~=r|z!)@U&?*;0aD)7VyI@@;AcK_gf5H6K?AKSK;( zLU{4xH4p*A_V?hGM>gqduCtckE%ZBF8mRi?IC(=4|9#eF`C;lwSk2nH}peK&FaC5P_IWHJIN>=n|J49BrQAoEwUo(PEWh zFmvq7%wr+Dtha2Il&n1KM;W9jHsq2?B$7!al1U_zNxK)cmL@t?Ni-^{KTR?-&+z^a z*v)|gxQgz;bCREEXD;M1&0m`!9NZ=nTo4qaO2pNAmDDKQ%Il>l7g=_6%aSHJP+j5mB?NHRxIXa^)nkINZgB7 z#({`g2C~<8w5&>3+Uths90th4B|z~R;#s0v8g!y>^eFG8DrHzvH?`B8vtuxDuAKuu z-3nK=n!Na^@bngfl`tdyZLM;Cjqod3Gl>gGE@?EGG^gG@S}P2fskjor^b1LN z;;9OJfrS2!9q{2KFEh(VTuMQrnfR3!Rk7xhw$c&wr2|Bk5mAT|v-JQ(|7@UdHyZws z^EJl>)2N!?JP#hfZjSsW6_14}JsB*h%2RWsxl2`Y@56XQH=k&c2B?v1=04qNL^_EV4rn7F^DT~dOkRwe0mY~XI!lye>ikN)n#J=8olgI z;Yyetp;TuWYKL7+M5rz^4$;0-j)=Tlh> z=#8Zcewc-5uJN_pky&R$Kl6^)$%Xhrk%Gh>ki?pX>cWG+78!Wz#erHtI3B8=?PV&7 z{MMrqbkGzD4fm=h#D`67Yydsm<4I_zxo@)3n#W!Vv{(2SV{Ga zPj4NQV(G+Suyv+1umo-oWU{erx~*_WU@bW74ECB!CHqmdjU)ijtad3Vam0mflmqbg z6e|9cA|_Y1+hVPDp*>?vxUkTfizv6L|897We#6J-c6Q69EAw*?`}&}i2;1D&>s|)H z&P|xxtRJV4sM`qZ;6Or_Q#Ua8uG*}m22`9TxOaS(lbCY#-*{cGVva>fkT_}M<$Arv zX{=ycS`dy_|A0T%Z7bV}i@`p6ZuTT3*PbPOmS6RF3o%4F%Lr*u1!gFkQHhJ56+PC2 zVm5Sv*iNBd2%K2JAkw&c)9(je*5EQ25Z_9!o9ck>95-=e#`$c1-Q%Bf>`=6evmDFn z2WZOS+FfW}k(?=nALJCfw)FuQzS~`+d`mi4ku2)%8%i6|C(6w{gssSifUvMQF!nx% z0Q<}`pzKwo#Mp)A<2dbz_fj$yRHp4wETF>4kn^k0tGs{4R8`35?S+Vnt7PQGUS=RO{b-j@`!7D%qgcTC6kMa2v6-D75X# z2nVW%(5Fj30Q|B9#4>4li$ymeLH`^t=Rx^Yg|>g~_=fzG_C+PgB*p568I*y!Z^z3w z%uHrwkZ5So_QWwbTe#dz?aPVWWYYC<jjnD*U zJ$Byj(kgvVpu5l4t4W8hK3u(~kg!`8tUbS<86KSJIK@>>~fPhsK0&h>) zyXkyGztxAp+?K!u@V*s3+pw$UCuIp)(G69S4F;}?@5kZR+&N75x%sdG={6f6iPIdt3DOY(xMDHg7Z$RJ|poGtJ- zDjMSZwP&Di;gsu(HWNiIB*guWT)X$NwqmdKm{8qWlstfAt_r0W_G&n!e7VMIQRwVv zBy~|DZDHNA%&1J@!lI|_O0M#%fFUuOY@|lxG!G&*@!LgUbiC+tsbO?OcN}~dJ$a7J z6(JD#U$)}cJlrTJ_bqnyu#IHHil<~5Fu#8qEkuh7U%UfyN;5MM(@K9`ko-MNVQ3ho zfs?HU|47+yN29H{#U7^UC#(ED2UXUyST{(VH|)U%nzk3VlN9TzkVdW4MdY}kzTA|z zp;OmX4+-YR=Ii#><3xxI?|JXd^0$|Tk0k4l8Y`y)qi=xh53=1~M#VlTG?mPn{{ClG zU%ta}n_iu+ZQt6&8{G<*Myepi7t%d!OxjLAJIYb)Ukgc?fYHttS^GDWV8rwv9SplO zZ=C_)cY-B-)~DrDXH%Hz0VgW$T8{(Xzsn;)q%4j}Fo)3My<%JWExL=*u|0!C^KW;9 zhCn`F5;(siB?}ae`JQfceWNarL&OnUc~Wp)s2khn9vil@5jGi;y!kT%X@(r>lyt|i7iO$cAG8TQfMW6d0$*c z&{nWbsG-&tuU2URv#r7>_6d@SM?^CNMZM}CgsVn$@9{6RKykM>Ltf@@sMEQp_Bf6U zC@fyfn1v3ArCu^bF8OIje;O3Ix0J=*Yl>V!0h5$}tI z2|T1PZ6+9Hn+pm-am#fi%NJQ_)2}O`&~-n-{MPtI?BMTz{dRys%A2qFUzKC@4Zn0! z>JzoY`QwlNY}`fVTQM*Pq{Z@2`lZNxPH#U=Z5knA+)9@Z#5kOh9`GSacsSj3Mg=C_ zh3Bv)jBlc`=I7kuHL)qm8=2(G?gB-e`cZP>*97#`Vuvj=Yv`}M{GAEb_|ZX%6%UNY zpMsh>dMPOog?5_#HPKZgO0eEsFYSy>cIBbbLZ=3*D@=Lp50*BQ8Bo4b>LrSldzNwg zDsI5bCGS{Fk}krL4v-Z?k`e<&;}N3Va4M3&wB-8MJNOPB`$*!+t@TNyps8}qwv+R= z+i~+w@su#vi-Dsz$3(_8&XvW`uATLVMaqZ(WGhrVc3>|v`GVB`3{B_CYl1I7=!bvK zWA?R)!!E^694#=D4z_6w(&BP17vl-g92gqm0S8%GxYde2=jVgN29g_UoqImzLzSZt z&T&9n>4V@m2H6T2;;ah%^i5UmX)DK~pa34>22~+&cv2Gn&L3b7R|%X^3B2Yj-R^!6 z8#*a-?>e%D<8~jFwIwqW+k4HbtFx+ykp+J`Ri%y~O=l@zv$rE{vBoX?x?R%uG8tVn# zRKQ&jw7>-JIUrkEXeiq1S?pjY{bY7e;%_pK6Z6Tbt^#i)#s6De`XaT-3pE|6TM|W5 z0DZ+OueH7zG*Tm#IWhZ>6swppM{2-)Cl%><{6b3uU$Hcxp-$rMV;Fj6s`M&Bzr@~= z;@^;J?y$My6iLD{kD=(b?okT6y588IE=H9@=u{TyQqE2id5RrkJk3=p42l7>tzS`wF(2m>6O}76V5Hk)F~?WAI3)fV4oK^V zZ_z+K_O@!rKolxr(w&>xAdWr7#6omq2BqGtAjkkk8eO6wZTbK$A4zE;3uJm|zfUct zR9aoD&*(SC(0-2?)$?^s5d5*Wis-{SuAG-w*>SaK{#Ydg5{_0B-1l!Js`q-<+boyY zy!y!l&KMStlm+k0zv)>M$M*EKwxWNxM*;*WZJ2s40pXgMcvSYZ=AZPtI4T-yKgL!P z!epz@GIAb}{lI7}_}Kow_b3CVzypP`m=(?rqPa}NkS+N2a;mZ_50?U49FBSJ{>`D< zSnNovQ(dQv@6sN1qI?f(R#QTq_~rKD@z9Kqyoh5M zux8Des?w5BJl)~51!^S&mF!%RQ%YP+*I8P8(-jAdXx!&->sgeGXfl1dFk2r*TTztmgh8$OVsAzLWqzQ(SYQoV03H~DYmnQ^>cP@|2{y)=V7W+ zv;pWF;~T}ng=&ENgi&AyC})ez$W#6jc56%{a|yTMw~+rI-$ zh3b+R|5g-Os3m)Z_F*RMGCXuJL+Gs;1-sABz3BWqY>&gdkmb1tZ|Da1vJ<#Q=yLRL za7H|Gepg`<`mIDgD-?%i_n4_P%77=1cY=B77L}h9rP@i+8QmFrVQv@c@~XNw>N)No z1jV+b5H~s_MaII+#+XNuLQWEBAM6bJFj28tbqZ69MsPt$O~A^!V$Q6N0(W!8Zku?E zM-R8e&W!hNt^@CV_eU7@EY;-En2-o#>1~n=+Pbj0ZlecSj^~aVLtx~`vj1*@#fN$D zLnj8A8IO2=>XfH$y60|gmV@L@6bbeVj2m*6Q9Q*W!qykMpSTFaGT$>tTpX^Fwb%6y zU08V!J|pAW?!s1yjfWYGzzO(z)O_{E`n=QK+KkV3-!Ps$S@|LN>zUQmvP`baU{@O3 zc+MYzp+(x3a)k(TDP#C!Uy=@*hY^sCn%u@(RsIQxLQka-e)3m9RzzN5?{jBb(aIfv zWovxE{6yS-7Ci*>GYBzI4>XG{8nG*QU3@l48odMTaXU3`;o=AAmq8UqLzpKQ?ETgo zl}?=8`0nW|fLhB90f=y~Bxrs+Flzpdo-*AONL<1x(fW-D58O{wg7zU@)L2&kS6#QLM zl7Ibr9gP-(4d@y#mw-Z}_K~hT{RQAemghoqA~5QJ;l3axnr+I9-Sww$oUr0OT_O3a zDc+b-hV^AalC`ivKcuaB!1kVPJaIw?%|a0#Mj$*&b86$3JBi?Bf(YZGWx+87O8n(s zxm52OW;uDOzliT}E}sRqHzn7eyqnd9&+zzy3L(Q_5EaQY~edIL5J-ce>1a z_NUHpgCQ3%b3u&E%lJdF8>HzbQ~kkcoB$LLRT>G}IzU+!G7_+fZ&2NJMFQ-A<`n0m z-W4c_fC0)2w67`uexsS)?f~8wr)qFxV}oJ6y7x;IPC|Mj3Ywd)5eRDh6GU&|H&yPU zCb^49+3 zu|(7#or$<%_hvHp1!J=}WBB{O@# zyuIrPzovZ+aWLQSem8n{@M08(9aZp=w+(;F4Z5iF_%_Qx79m;AMo#9Q zvD{d0O)S`858XB=Cw3z{l$z&k#Hm4}2UHo7a91q!ov0`-&4ChmrMO`yh?CNW;mH0% zYZXSYVr$wy-ofNFkfiO;(`0VtFA}p*aks-3T^COBHSo`E;Yh`Q8+fnPDQpoj+S4Py^;oo*c+Umh>YT{e zR_T+$Qy=hkRMowi@zr<}zW-LQZx=|Ghuy5=>$`FwvH|+Z8 zX}LNef#BqFniHI8983+!q^)E@Pdj-xe0QKZ<^i54JtZ~^Wpd;%(St8H6$;MxbE5|^ z@5*pd#o&5f;&(YZHX>U3s#oqOJnR=2Gwm?`Xs^l1ZMK=nJ^fY4`~lQ&F~9 zd8{S{BNK5e=82NWhtqd@2N8Cw0fd2wq8iIPRJu&XJ451N_!v$&=YDiw*Qhx`fsUJc z8m4WeZ^ziABZv4jGYxtt%-DZQ;fV4tNA}VQM)f0ss!(j86YORUvl%fxvG+<4{nYk( zosvMw_Z{{G(56DjYSzaq20HLoy9&Gx12AU5cR%lr zc#2`u#~)o4-6bgmpLH7Pk{5DFK#ThUzD!tJRq=pQV$lPg-7!kGKsX@49~ji=34T1M z?{|IrGFErl8Acsv+1*qrT5uY_r!PQ^PjIvJ)DgEZgLdv~7X$h#qwSXElx;i*I==N- z4d-9rc%E8<;Ix6GNWxh7qvFKCeTP;}sK{}SGzfIzFL4NBGF}JK&4|9o=S|5s{kD_B z;JvQ0?7}|ta5u|xhR@7_4s6D}2+*p&?RhX~o|zW9RU z8|$7GLQ}l)*SQ7bdBxy=dX)4%F0@qtS6PPe(e3g0l$Kkw5=@g`#@G%w`7j@FAouUF zO6a!FxFyC={8Vor5N4qdTui}v4Y=d0NmG5R^QxTq2E~jy7vyOWn+4h0CM4VLI?Ozc zF-NmX&yKoU_sNqPQadvel-VvohRhsgXE2RZ-SKXZ%4#YpdgthgJZ%M zcyo9EfM$7&TatpCriL-B?^v0S{sHW?II1-f`)#sTNs_=Wh+T1bx22M3fF2_M#~CAB1tr$Ox!!uDq@ljKglL;BSV`|>bOp2G|83hE0;f&A7+x#@uQK4 z3bZ)AQCe4DArn!fD{cFS-;QRK?-7ybnTCJhd8{vOthMZNnx&rB>PK(PQ^kKrgnbCB zTa$6vs(T>hE#KjgMlCTljcr*HHwp!G0H_2e5cDUeJvBztw6?cav}4VN3Oer$LeUl*N^RJ46@{;4Z-LBDc_%7$;Dh-ORc)&pM!dwDTfFJ;wOU1%OsO5+*6nYz1!lVbpLkCu}3AEQVtSi zHB$+I*oD>(H^aL8BPKz#UtRVvH%zN1qzRF!9=jk*i_{irD+1-)=JSnHv5EEwZ_Fq( z^V7fnEt?u9(lR4w8$ZmgIjWhEH_aY;*V*q6?=oU%^X;%9tmQ2O09^ld4je?@@zz|{ z;TklQOm7)Kom8Gc-zTKR(~dU`f9Exn6KduozckFWk&PX8j|@h0f`FP-?$@?Y(sZ z59c&P^~fmR#j-eD$KiIz;a$hz(B}%fs9cG}+KMp$eJR0$|2~L#s@O{8J zb(tYESMVivk-b<*5NQODuw@5$JjckD^gjj<{R2G7oRz_O3fr%n=J~#Fo96ff9os$o zIhv62-C3LTPUJfEx>{hR!H1K1w`_{^Yuh2VXJhrCR?BFocDkm_sK z@)aN9kO^`;nhmouPF9>FHm99TSpJ)?-qXyYdKi@@{0(SF^Hkst#g>CgR&a`ub^X?zDm3(w_Qxu}ju z!^o%r007Xs@e(l!&l2LQdbdrNgb}*CqjR@ z%A|=_E7f0He1T(&S?w!4xk4MNkqZHtwA~r)IUkA!5GbebN*U^MEiB<-Qi~4+bIul7 z*vMn1(ojh~hpw_Hxn0X=u5A%&1nO)r;=KVbf#>k-i}-fw{5>GQhoe@14v{anukYdB z5Ag1*AH#Zohfdeq*Nyh|gkPq$w`Y4t%YKIh|5#AJCTkgSJbqhyIC!0=fK@-SlS@OB zG40E~02MfaCZOTX8DYI8`e8${j-ko7!aiOGp zN;-nlFYb@qXI%-f>~&?eqVQC*J|zCm*GDRV^-ZVAN{YnCGSL@7*hn=oWobK>Dx z)~tO#?)Eu81?^7t+mp0X1TqXfzPu%0gKaPALKypKk*JzO+-pm;1NU<_Gikkdt+#U1 zI{$hJv>k-Q?I$V=QO*_|OJ+p~!JSr(+HOLJ%SRj(Dv$DF@m{rBPcAg0ym9=km2nBa zKfr|1BSw1rsL*tQOv+?7s@Bsl0;WuzaXla0Oz)XHBpGA&$I3;{r|%aS4(Rbe#xNK& z^H-pmD&fy|-KCIHwe#}9&o{h^uo0bZZ1l9;U0G;N`<{5r-|NV4uYM7R{tEm@V<7DU zFqUxJf9DmKW42yPULV_<0|O>_AX+Z=hqXeMJq6exf2ZLMa(M396;;^Kz`qOdzYgkX zeNKDa3j$;7x9!IoYyRHb zsk~B0ZS5Jnfh=eX!Tq>}=s`ETfNXK_#F)lLyQ$Z?4U?CZCt%QZMu9l1Cgb^93+6Gt zCzvw|cM=53VWaTB3-G@RVd!H-7An9sD8xI*OvDP7&ihc)75@(IX1L}+?NKB)Ey9m5 zY@;%u&?r^m+7{k%5eK4si9VlS34KpI-8#1vQ{0V%6tJ@1KR~HTU)6SSmc(h_6g>Or z;%2gX;+ycbd={Z11#CoME~0vD*cSW)c}zrGbjNw6=^4i|CtVrk_RKCx-atwYX>6l3 zwt4NFMdxq!&15IMeB(A0{q9}}T5$DHEs(*4_>Z1POcqRfUK;WxC~dqis5Y6}T#%Qv z8!|7+S*`)*`AirQFkM(c43VX>2cTUh`8EE~ErJhDZNL*VDFQC>I)Js%s)rL$t-bI6 zeR?&7Ob7s55{m5J%W$F2UsDVPB!fM;U@}hxYMv&D5|e3Jd|^n~xrD#|QFbel46tlo z9Q?^_<%`bLRSaGL)r$NYjVh_2;nt+xL|0@^%h0V z;1zxlDoAzM9k^7C7L(WA#Tv_p^tJK+D7&sdB<3P7CqvOxJU++Zl!Sr0WqjnIPFT{X zBGBp6c|rIn3z_u94{f5p?Gb;O;n+3WmiPRbwz^Qx_G0HSjUj*N^mPU>9^nh5wxCjZ zzz>0P@QD@3QwaHOxK7+38s4pAwOD8UAHFm4je#8&%k{#mcAC^N3=79Fb_My=C=lT+ zz}9%@wQ1MbMYvRqd>_(&Fx&dc)ewtbt~-e7FBzZJte&=uSXR{;48!gZ1u=|0AHw5G z=A)8|du`ztTNo_#VGHbi=7m{cdN=k$2V6w=XY?lzCrFiM3xs9w$oK*4l2#AF%81Uu zp*@*_+qClIoRFoepphE9)>SZ%G0g~}YG4zH9oC7A@00=*O&kyN&0&AK`LYPkq_PsB z2H?p0@bOHVf;*f!mKfx(UcroI(jA^X*Pb_5i)rUdqE`Zvz4q2e>{?t{5~W>6@elcc7Ibca`%cWfG#}{D7aIOU>x^olCf%HKM7`OT0qsyleuj3W zMZj)oU&$Gi70cnrV?2X~8@Wa>B)#1=krTFrgaBvgBzz17Zy~O+HXS#rzWN!ti1Hq2*`bgP|u$DjC1G80tH4bcNYU|m`l3J z)7!^(GO~(RbS`6K4tkkZ^;?C20*TH?s9wTDpq7+-DNp&I$yzJrVf+kJBH!!e=?EpW zHl4>eO)t@~K36Xsv~F#-S_(HhDLlQ#(bBF0BI)P-LHw$xGd@&=CgH|rC4IsqhnL&_ z5)l-7$LfW;pv@#GAUU9_*}*FV5MN(~NRV~@hCXKzr8)kz_~$k9Oz^DP z^umU=5@DG))$-WnKS{?(1C9q?f6D4K=#2+P>!+3JU|Ps>GWWqmVSJv^1jdIy4bR9N z0z5xl`af9m3j$KoOF1A)ultAWTJcE-N}JUBdkrTjgo+r6c??}#E&ODUyYf(^hFR53 zqf|YuyEjk#LWSik81vykz+$w%$+yC-e^W^ICYd-Vk9fjG<#iW8&z!A!s({KhC-RH} z%r@e*)w02c5sO_Gp~Cm*Cp?Oj2q`N{CSQNb^Vc23mo9nJuyLHXN1YvT*GCFsM>KvZ zA{P}~N$4a<{9CQ=0JEs=IJ@D$F6qRn7=R(aB67&K4ge?t*|Ayrx27A^Cox(k8b)dW zc6!@dOm78@%XUgQ~-&Zyt!zdJ1Aw_IIzq}q*MuCo}W~-$oGI7Fr);X)$t{PhOY@Y*{i;&No1SoXin%({+{ zan=RNKL8PvEd;0dZ9s}4*Ds<)cOBC$WJ$k))Su)z7lW=A$@a1Wn)-!^iYoUZ$Y6l+ z9~`hITW8Guf)NR8CAku3V^EyrVvn>dXExR3{)3iNlP{3hux{yOYv5AT$8&?g=;-5% zkdf&`Bk?oOv0fTRvG%}O{AV$SP2!|~d4V{=7sB>U!m$%)M%&>nhl(MYo0lLQ$k&_w z?D;7H+AA(6HN8`lu9;IoKo6aeyr`Aia-Ef#X481E@#{0kEH5{}I(@Ad_u$m!_XcmM zh{mt-Sg3tfi&qYW5ihS-)feu1EkRx86x@B|F?ZSHV}CF@OO746vf$;vZMI2=)D4 zD6qU8@}@uRcw-N33UW(lDi)fPEIm%`$tXJ2MvP8t*MjJLZOYTuLZ_~j?)Uv11yH&(U!TK+6F=VpT8g^;)j1hVm8k2IHH*nm&XJgwChI!S8 z;XIb&(ixsfYj-9~dS`SI&Std%R_cClC=}ko=`) zg8)wxR_t+DPDVl*M8moDNM(g~QB`ma&WrCr^dX1N(ldMu%`nb8@K-8!@OAXu&+D6< z9>&4N?N$)Zw;Gw8d)%D-Cu*)`7kalk-)5aZqiqO}b77!4>DU6AuWpr0b3nA3EKm2^ z!XCAtPw}8*!Jtp&IFB1pkfuue1rOU%j@u)S_>a*9J;d-4cU*mXsh`8#&$>Ex>9u1Y zu}>vbY*5kOhK#41=r2O~_+dsamA|c)r3uAf6qO*>bXPh50svWa7;&n?I~KLVyID2k z?uAOg&0u4VOz>=LC~Oci#)>5k^4n>td{8FIpB$wN1CNtoMCZ;UDD%++XgjmfSFg47 z#Y5G@5*QwMCMKmi_k%`S_ZUo7l%4baFJ1dkhO(L zSb-yhh~!UWu>zVSlKcEXv8KGr9@SCT%SmyeBB(HX3y38Q9l#!R^|%Uby5zq$VIsjCRS9t#TgXO$03tixL1DU`-LFtpv**FOocz@w(A zyWa?Lm1le%@7F^QVgS(gvbE;?FS4W)TI6sPk`HRzv1ImttO_2yml985|0iaUunydg zgUFTNAA(21m*80mK=9BADh;C4E5;7^)G_UieE^ ze$qUK$Hp)bjim`i-9CYNGeJ>8z~-XsD#{Ctf+y z0(BN)IX-mxd0PwK3bs3|D7=%?$}MFeXH)aAASO_)05FhT1lRF##=xuYSD_+1sZfxQ z6N*|LYQuJ)M1LvJvsg<{Zc19JdP*n}mQ=La_73j8z@oz6qhdqfaC-@W$OwrJlH1I! z@qHCZ2^$ra?Zn&F|86z-diu^$5D= zHsag~Kr3>{9LD*6k?(V`Wq0aGT7Uom0000000bpdj?Y5-!&l>Qf5KbE*gk8DxkvaF zuBZ+`q>`nwZE)Ue2uHD6bf<3vavQgE;{QP%{fdgU5CBq`!xJ(|#jbv?k^^0XQIdiR z^@goRMFD##5PMYe2L8vmK-aHjU#GDu9>n6a_HlwhWJ+$^_eI%0h+DkZRcmcd{pG7o zg@UDkLH`7|i>?O)rWI9cs)aKeKX*ISsH7(-dk#a0)*T7ir;?oujV(6PbV}RJVq&8T zO&pD(SCRjH!L$JczDL%t@u`?#z?W0;)x`OeNIZbxPn`U&*Ji{cdG8bqctR5=K5>1K zT*oaovOVRF@B=qP1@#`^B+V8lqeJ8>E2&zg^?ym5f#o}v>=AE?NJxSf58}kp9TqqP zu0L^#)%Ln!O0Fm5*>ts)!ZL2DNG~6oB=<^hzy>+C+Z)+M*yivCh$Y@HLN2H5t=?&Q zf01+WV1bs_GKSW*XyehudX&n(d$B}jyEq0fM!V>7rNTW&|F)Tw;%?q^_WByN>ittKYU@MJ_rgDZL@cy+_sWK2x z9k>K1HzZri|2esO)b3N6FWI;ru08H*+e2+tNE z0JMe!Buw#>78twTbOO&G>14K>-;F)?L1mFbQP<$0o+fx(na?qJ1+$$*j1JZa2_q?r z{O6pE42iPC6)4hGfVyN9JF#1<9n@EnwgEBr-zv4TXt(OXRR2aTyxDIhsSTv#awye~VhN${6!nhoQ6;{&p&7{pleUmZV@!t+xWR6KwV5Mt60$cSk( zL^AuO=APNYMy{Yyz;kru_3z&ig(WB%rYlwdUEw>Fb`iotx<@d*40qUO)sQga4=B)w zqNIl(Tzu3^3J{BT7GvcNo_5J!%ri%qZUKWSD&eF$3=kWnfZu|2-FazsMhnKH zR?q)j>uIuBie3wKjh$z=LowWH=vmYoUzyvN0In|D*NSCh3t=8O|4EoV8go_@0GMC3 z2|b~k@Du<5!a?j?WxjnQg-8IwE5&oYn}CH8)Hm8IX`}3f5FsBVd|e=Lnt{bLqN(4_ z9`nyF&&7MP0qm0@q{aa5lYD7=@(1#t*La@_ox@V)^Y#j%+RjAHt2uy>m|a5wgD1w4 zmz3pU5=kVINgJV8!b&d*=}TU2=3<8^;a{NTD9F@AYS`&l=_p^A3yAsu5IrD#Qca(4 z@0R&wCWF8kMT!ebQGLHNFqY)lsDQQCrn4g)9t)cDj`1fCvE;5k6z-!$3xDEr<#H+! zdFgC(2f5&2^$WIqnEL2y9KpT6*|gaLFUKrdf^-0?!c>w;B$7r+DZrw6$Gy3k*@SX& z8>-dTbG( z>81}45E7>iN~zxn#laF+(rM=*LV_~eAf;!P6J<|+XV?iuPJxAJK?=f|xulR5OUT=8w%cs~LG6*GE6LmIS%t>=7OZ{UpP|}A zuXX=K0+x&cT?<=g0>1k+5)!}QDx^9mxJX6`(%*685HGeCC|effiQCk29e!{6)(rNUs@oR)`8W>J|k-@B@$%N}I1(Sp@+ zOj^5tF%xsGq7MgY%f*BMt1fT&1q^MitBQ&Q7lY;p)SW{N6F2+VxDMh^ZL|%}eq4@~ zYA&BUG06@In28Pf@&ooBe{+w5*Ab3@GI)NU-3}s94f8k0z~Eb760tLf);;`<*6RxK zgpOi(Gq=dT$8Jf1-X!GpHg&8e*-p^t43x>72V93dMeP^VtSNLdY1(!QB|OrlYwSms zT$F=j7SYNx{~}^>8kgoStNa3Fp+{wknvkp!(7@UC-#T@92QkNQ%;$^r$Ml?*k$W?< zTu^SS;-X)ecoZ7WCqudMMN2U6FPvu8Nxv&7B)n4AD`@bv`aoCVG&KBZC4ktl!9WzsX$ZRZPBs!SXr!|*(^WEO!0%3ok}PAC4BBbmDa z>Wo@_jFFT}E`q~O&sqBrf2Iq|kN^O}LSBd281Q*#FeXFHwJjT7ZBW-SW`dQ1IZlz> z`n)vDnKLl3n~pkvd{s*@&nZ3Uy_p=OEi>ahPS z<)|4e@l_1_6IEkX;Cv(hM_Oj@2=kU$Q%K}6cMy^iNhDY^=AtWJ__>s3|SU zqd6}yoPd#pgs5dki?9e!{}vL?tRidJ{tHrtt6@^Gsrz)Fk>uw6!X^oC1nzDDO+oO|L+So>rW{ z4=!b?YJc-lg}(c52ue*m5>%2&7FbeC_%NY^DtJ#%hP*7J_K;m+|5f$UJYApRn%(rE z4tRke_cZFEI5YvosJ2`5@i|FZ6?m_8glwJMd_fx9zSxN{nZ<^axqRfhCI|zY3%GEP zpCl~irClSYQg*o%wNF2MqjH%?ATl8OkC>qKBD8Cqz}w zHVLTdP?iSIx;R8tp~1XwiFf2q9!l(J*HTb@{vqnT72GX_81c{DqC^_07L5VAIYC9o z?>x470#{iis|X>jMev``5{Fg|3Et&Ixr-p}SF zw7bc*l4asxS@-^8!_-d1{&n@y_@)>o5+tQ&+rNwWJHf7z+|4#SK|!Eh;@=$vVNlaK zK)Wh(M(8)v40inOEomaWqEP^fpM=;2wYz~{*i;u@-MhV?=5pxoINsE8cR@QKGchh< z#Z-2VM@4W@E!_s#bWp>9BiyiiV1iP3P*}obsq4)IrETUK>jG$gM!g)JaNR!?C?et3ofw}){Dv~sUNutKBlYA8x zYY-}LK~`PKCo2xW@UfyywX44p35COgtjkl|ad;(4tC?}S25|mNc^`CAVFwvt^#jd(fFv=e@gs8OrF7o5!t}XShwBkLmq^Bo-O9xlpFMd{3XM(0lkGpuAqJE?U*`)eMLNNvMWM@-UVZk6u{r~ooEPr z6naV^{>X-dA>2NC#P(pwR1(USHvU4u-NAq>d#8?iw1~N1q;}hgS@`wXIP1pbkA0b2 z#ez3q?3t#1l}COzLYcHE6<}&Kj>VxOY=vngfli}%G-9!pKn#2 zf$#BJPg%~X1f<#FJ~5V*DRRV5x@?Y!mj;F?{-CMzpsEp9qQrVsN6rO!IjIBkkX7ii z^JVIj5F8bt=BK?-i2|c8{Q8!IT9pUf54I}nc2N>W$oKoYSO~S1*Rbyz5Y%JF?w&n zV;i70T0$puU>-BUX0CtTDyh;T+?UO=_u33t^)wf3w$GC8*KlLj7{iDn9>=Em1*6l} z!EX$MOjSudOORJT8)`N`d`RSow*#U0t0?s*k_cT!K`uh3jgWy5D0{Bk7DW`j6{?TR zT*1tkLg3tY{7KFv*4VodNve#bQx6}%`iOF0FY6S+06kK=ldNzqjF?s9f0=PZahd(d z_!=i%i0*??3%HCY$~*agEfS)@q2~A+$s0^C-2rqP%>iu?pbuu90WwW?DR;v?R*4tEnru%1z`d z!?UU!-ANRq@x%E)?Ul~rpVY=3dXU2(U7iSVDc1!(k{W-sN_>7dUfq|qXiZ4I1A!y|TA0(=opGTSi&#o23nqC{`~m zuzfM3redV6wl{f?%2`9d-JuD`UK;R$#$M1Zl%{NJQ5n1~A^qm*g~qIn?<*460B9dh zQOYPgphT!wAJ4dFBe(RsUEirGw+Zv5@?#Xq%#%C)487x!aD8$r`#v%O*sAKJQ}j;L zK@S^%ANt8|Eg4-|{Li{Q_Ii}F7N8P+9*H{FX;c$ggceSRzJb+7oryt8JVZdx`_%w0 z!-c4nvW%ulJ_x9_g)H9A@pcY?rG>}P86eS&C<4X&mGYol3!ve7>Fg)ZhjWrlU*!%M z)8s-uhUUT|wj;cl5O8w-x!ckhBhDi9G*&GVE`O~Z0)-zb6xzp21ix7Ox&Ii%XckQA zP>fE0HMDUB&n-mcc9K>u)$607_0UV|M|liryhM8fu2eJK|@R~4B8 z?2cXyNX`T%h488L&-?ZqyqbgXA0d$l;=$S!q(gSs5eV@wTUUhSxnD3^T%+U(u?yxd zfjAH#U4ja>?AC>{l$hAB2?=Q5)*v+sVD(01&0j)DG^7v$ffsIh&GA<#u}d(Ww;;=) zF><6q9Mqxa_Hj673vC}P6*9Xz03+V~275;OT1$eiYZ3Oj1H_J&PiV{X+@RL$$;A;0 zDT;P;pxyP5^zaWzMj3HcRld4FtYhMW~-2WR*egPi*?0(X;#Rmi&++BfWj{oo^CAl++ey3y?GY% zn{MTvVK;o_dJqa)Lmiktn88w<)6)&H`lQQ~sGvetF&)=X#Eyn3bwR0}ZwRafVlJ2| z0OY-kO|egS%yoaAC`(};S#G0sDOI+RR9E8W?G9Eq!?^|5rv_gD%u8JW+Gy^$Ht*&& zfvoL4)g4*!bK6@%GFf5(BOTaVK?A7ox321k3jawn;>qZ;*$F~7()`KsX#&n8O;D$h zBhuM$wfMXBqqw6zi;CioJItoKikQ`kLVogCrFYSj_x7>TD!9+Zd&OYF%CAAG=wqbC zw=-Cpa_+4;*iW*yO>ow?H@)CI46(wR2(2P`NIH4u54Cp{HX!8Es02=~HS4RWWo$a# z?@BEkup@_R#~fu~EGVqa+y6IPizF|+hlP|-DNER4ujIS1e;=3Q_U)hT&|llvH|^@< z6X)vH^<2~E^#l8QUBmY5KkdH1Z&bI{)0px?I=so51ldeA29acN^JHL5XjU`_rbn<} zFV}?e0=l@hxoA~yhNY4yjxTE;P3arNvPmxuk6TjH-(gbgYho!L5RO9dkCE8pO_luRnq%5w?(}ve97@`n&dod1C-3S|el3?FM2e*jnkbAQsXi@8b&n7O!($@$f!j zBI%xk{YRe8`ZNbrFhXPILOHb*6OT?*5LMp8h?2A-Yp<&l_wL2i+Z3Bw*!fn|LS~B} z(|%F|k0EBR1P;)Uo)Y=jO(Fp4!*hos&o1A}c0Ws#ES@=YXlqzeeWvwmE#ZQs6cnLO zDhTtD#hp@`YpDwZb_2RVt*!`1#!daOd6MI>K@R|Y zIF-(@1xl>nDy(H&Jf9Va-M+dsab6%x5UDD%0JQ%wC?H}z+}gYA_-Bw(djnP^@7M+k z7wIXtB(5TVgDL(W+wxvjOxXi# zx7<>03tXhiS%*)5F_$aw#ipxKmh!cmUkkT-&yeSUwL>YVucWgqG>6qNVt7#OMcrd@ zQKJKQEn%*8iCNccXqcbFEP00FJ5|oeN)~d?mg$S6Nr}rN+gU>%X{897mT&B4m+b3kFpCIMX|%6mlTWiQL?tWg8H(L?;ktr@KW|R@tkO+x0q#vaZ>!v zxDD|$A1d$zENTx7hW~b}!jOdZ*T}X?tShRI$jT$*yY#ItfUvhsHeQv9D*nhF`n6`b z$3|9;6%U8IawVoy!nj?!E*-;0vTgJa)goIlq|PU%1wn6+)WAL}1r>!P(uHA!-7>g2 z2}7&jVv=gCaa5-~>&CeIg=%NbSkaT(*lD83I!IeTvyMxgSmE<1p*LpwNTD{3 zkv1K&PlTq6!Gy3KuaiwgQ-FQwCPj}I3wuSM^)JC*koH7i^{_^%I-BRv*)zAj1`sO% zfAv|0wGCSD?cL;a)!LN8W8jC>u|ZZlrPs<;Jd#zT{4)*3?U3^W)<*>Wl{6r7h1TE_ zauWJZ+JtojFKFyMc!qK#Q!Qw|O{A~uWIm0Ug(8rH z#o0S03EG)_OezyPy$UNomvY2uVQ{{V1=x`IT7Z&_PKjTmX6JC9>{q+JO!d5uS-n>4 z#~eSOFp>DKuVe$MMN4cI`>%>?=DtW(lS?2crlt7#co_2h#z}s37t-Xf(5r-l+D3z}b6fvf>4U~SLs+l0V(sj?**ndDak@49gmbpK4CtS0`4x0;2E z(PqP4M~&TDF4MF!l@(f(ol)==XlAwb0A_&|G>2>_G^H_OKK{bIUHqi)|{7LLB>&uZ-sb9#H z2sFHI7_?kBeDqi5b=W7i%DdedLP%%7s=K+@$}g)bk+w-)uzkKDE0^uwV(P zcHJv43%M*G;YZ>Ltd)><~@h31kW`k#J>GQLk9$ouO)eCBNBAQC%*XqEA#iyium8 zfa|@$jz)BY2i&GJIx8(2NX)b*(ZZ2PWb7twp8t5mW<70+$m5DKLre+6z$L6IGc9Q4 z>WyjqV@hVMInW}vv^(-atxbg0DK0==_12|%bdaG0nhTUyU1@c8OdL+gL3hu}Y1uC?+RICRY48O-YwZ4Iz^dTaSd2^CFbs8Z6LQTOuGAj!9 zCa`cAa(Gy!CvPTAZNYeFO|P)leH)d1vLuXW4cai-rWcLSlI;Q!xKzFaW2u*gL+udA zq81m;c=E0&>&cZ6RzS(u?sQMUJuIE^kfqvRObs?^>j>ZT2$jIc8p(mJ>@|t9eQ0QmQ9X zGKedh@A+25`)Lo+5>mA<@68bL(AEcnh;`$^B3;6s3OP+#iw@lS-xpbwCCh~f7-zC= zzP$V!Kf{e;dksSLQ?V2rly8}oUsFWYYSOF$pZ$Q!=_3JT^=BAN&gjsNt5UwRwnRn) zZnWG~W?j|4BefLBe_91YekQeRTo{YM^X|0X+*UFZ$kV-W^rDQRX%SHciMNvNG#KaN zjTPd@9B9RUXmnq4a`5s=xjL=bSZgPg;$hB(%Q@_&DO`}P06*b3&fl~Roz8K>Vlh3DMP>Ns@rlH`+)aFXW?i!{=a|rx0Nwa86 zN>_rA)1{#dSM)Gn2R(a$(|9Ie3iP_w-Y#tPh>%DCS9b(MenM=dZ3ANlZF#AJNXv4d z;<|5Wwyx6DAY}IqYuktd%HNf8QZb&1m1P2$Qqq}+YvlaERm(bl27vp(!LY~-n$820 zKlrQuBYBRRjX9Y=&jYrqkPNoD3R2=p!|sbq2b>zyxz;wbTbIsuC_DOE)`!JJ*b?>y zQNNU~nNq0OqsdszPEix_cN7p^E@$y0*BAoa9T=`bE!ex!>D<)RmCm6d~*bNUO@|i7n_kah`>|W?F&)!lvmiwxW-f%Sxj)TaizjD`%a5MF8OGt8MC6{tJs`)sK>M!BK?i-a1Ea=dRt`KZex` zp8pNO6Iwb2i6x@i7tU-QEfls&*^Fb*Td~`kkK%@dsXJ^+M@|J#6FlJW;O7J%*Sd^Zg*SL?3ht5YSX?%99`0@k%O~;!JcVmke2mc{Svb z5mdZfPqrQvf-p0L9$HEmo;omjOgf1T88kXVb(R6d4)s}!*H#s z9T6&=?5&t5)AE8Rr=%JF8wRR-W`bt|;G#$$VwfzHUgE6!qlKKlLhyxYgAP913mONj zG=R{mKLBKJMYJ<5{C!axaFeQK3%iGY%-=OAQyq{h0}6t(LXT468cKxv;cp!%WLa;%gH`Ouk9FH4hojI*2ItEo z*)VdWUQlM*oNe$Y<=lM8+@TjOsU%p|~5$Ec+^Oy|5RMYHeX%XjGi6QSVQ)WERlO# zL;oEUIeU_z?e$;5xwGrc;8@D5sT4; zT@K{=SV|B+TZ_Xit3~mnygP@cQ6V&$-oQ>k;pQaI;YD#AZk9%C73+>wGHS)^}PKl~51NnyI~h z%|%0XC;_ZBvfGA@WQ$rst}2M*h$~$GeV9dXcKeWAAjdsE6{5|f%j5q`T787uB&uqH z1udiV&eE<3P4o6Ed=oGi=e{2;z_^RMQKd9xc8u}C;$s2tNds$Jds!@WLnTqGWFf6a z2dS-#G21RtcaQ9p;$!7vighp9q*<<(8HcD~?1=7_23vtK`D zR<=YS_Jh*mE2ylm=Wdc0t~GiOq*mdCIOm4^J;m;UdehHrQP@>=-Fv0z%=8SO1xqI5 zE(Qx72dbI8<)B}okFjEJ%l+Oc+5&R@JJMeiMKt(JQ*C-CT!?5CtI;J>!KisjQ$|yp zuLV4SwPz0eN_&NZwn>8R3ua~luTgIce3T%cVA7|WqXt>`6gPVsH&PuiXw+Z87O451UzCb!vvSxH!et7xVVG4~*g~ph9u2Airv#G9NGx>QfZuOau^lw?$??j=7i||7Z}hq%z<(bk{l-L$dl+0 zvuIx-jkH{EJoJHHQ=12id=#!;s(LB5$@(MSQq%R%0`5b zh`Xh`4g(H?v~`)>8O|cf;$^=%DO7DE1Mx=XRlzn42m@KCIlFzvmpI&; z{HuJbU&-TxO$2iWn`<20hKT2+RAjrOIqa`iQoXb2B_*UPd`gw1>P zi9%8%V`yFLlx1XCFQ92h2N9J3)d54`qeQu`Pd+6+5uB-tPt0xW=4#!JZX4F#M7FH( zEaO&c+{%PMk7rGm{11|b%g^o2Mlf!G(0jlIn{?9c6~cJCJr2?`zl(^A(zc2dTS~{~ z6=70IYF~}>8^Na|?%oTcYGNlVUW$SuFa3tn7=HnsR77nj=D$6%;a2HU|b!W)_>Jo;pBa%KjoHA(;m{k~HU72Ci!lg=QnUz%i?_}cKe zWW_@k0T&rlCqCI$>_7ev`_Cpmae-T?E(PUmFY2jLalKY&Plny5g!5>narzf3$QnG)8bhe6U&6)0)E0N#K&k|W8F$aP+yX>ANVhKM)lCt=pVTJo*qjw zn;<^$N`HTcUF+>-pVAXehJHteVsOc# zL19(8LVnK9;k4vgqAM)c5C+_$2OhXt#jTbixT*c2lH>97%bS8a3J3s$aR}16rmp54 zA=#_9TCwca?ogUvpDd&FMXnN~}RKz0(iWQ0WQ!CoBlXa#^TxI1XA_M7(J zMWlP>p9Gkt#JTed6Q*`Fg``m6NiN0=`8Ee`x3*{Zq-qEBkPbI8iOB`dQqP{~PBu~j zDIMUCj~QZVKuhY1j;t-SGejE2o%F})7k1#9+G}IHx;dqee7K37v0=7;cJ}aZaqEI2 zYInZ8-c`;{86>^=RpIn9)>pQm;b_srO!X_yE|Cwc>K@v#<12)(H1m4~*E?LTpNFeG)QX#N=mVw(2 z-D~MWpDil#V;$}QB)i03ecYJj^*SntT3VN+%<1B#Y4ur%f_kop%VdJQFlm}dpl z>~w=h+H$Xk=leE@T0h)9GDu#lt)De$Sv-uXbt4=$&U$(yIr0st`nLk5WR{g~oXm>n z@aW(8X)o~f2mT%6W%ljl`m|5@cLV%8LdWpmFX5wK!?~~F+BoxD#BPFhLOUJt9KMty zv!&rP_GAS`yZIIOJbNIqh7z)&VRg}ML)^f_ejBopvcQDP^y<`3-Y2?*?#HHJU4mYm zTPP(-eYdBk|5{2)=7wn&3;nuyITZ81vxjTz_o?BRr8UuuOlY1j8m+SK3({-f{qf?9 zo0dpPucPP7fnpvO|6QVY4YtKH1tx9bfwC+%Sc+_db>gCL#7oZOn)aNQ7-IGYSMIp+ zOOQD9d{w{}mhixn^DN3aWyL1>{haY+QCsdI<%av^m`k8BTtj@Q@&`nJKnJ&XM-bDf zPPF>Q+2$naMjcZ4M)eE5pq@%Vh>4>`JtfZis)<0&)0%ZdDslT5H1v2=pekGYmGhZvSfo3}lap=OgABF#5Rj4TY z(J^!G^htpj#aH$tPIjoYq+m;{iem;$U{c7L0TvpIWnO|`n!bYMM1dX_r$YZ!z7Do~ zus5|{0*~Z>_D3?@cf}JoG`J~mzG%K;j>F5M*~;p}_0j1*-P2>#3OttS&Z|@rr$8F> zkhw8#PL49!N+ENOmZD)Oq0?c_n1{K+w#m|zwa>(+Vtkhj;U%`-Z9Tva49Z_ijDjX&8X2E*l<_#EhA-Yw3IPG)H&ubUy{L6z zO))n!IYI~Umjy#o7L1Dsh(#>Y*p?8adDx^auhJ4ZPmn8{Y?&KpS)0Y<;)r~MD+G)O z-Ik~*Zhs*mQy(uitRDEgEZL_;5mrqh1{6|nuK#x`9fn-3sq8ZRGWGJ)M8nqiT%b{b zVUFpobu{d35=r1@##zR)9vF?Yym||cKY}M}L&rJh_=^Xo%34QR`({9rl`j^~MkC}G zhh43(x25y`mAdz<137w==5X=`M|U2{!il`KK1~pnxygAbr&)1@FW?q$d|?lrvE8Kc z*FjO;c9s7SBHFtfzpZ5|64|pr{?9SOX<6**nKTsiXXTuxFFbqOUB9+RXV|WT*tq(@v=` zjzrw^Ms+s&>;VvUzpd|IYDN+t7LO9myVBlc&y>Yp@*8F_?>?F@GT~>`zfa5<@y9H( zbUI|3z1OFWN+oH#epjO6TuPYp@K-~y;^(thdHRYtXSy1H?}m*Z0)dOFu3d@nuxW0A zN0%&)k6(hu!d=1`o5|T30jBr&7a#z335|RKrpeaoqTHu^AoVrhtgm`br|9upOx1Zs zrOOR{K-2UR zsDq<60QfI%m-(|?lMOMGjA(pTc^lCo;u*&grU5pE?nFv>_Vr=|Nd&?C;vP$3`~QAo z`Mr1+<4(l#M69&qlF1I8zHpdj4t;Hc6l{QXNl%X1W86c9-Wby3^Sk1sLmkbcR3s!{^& z%3af}@;fEslz_04?rm>j;&949Maf-yn(6n%PZEV?blHnl!KR2t zOt10zV?tu9e+X)+ooj!Afj3{rDJuE%xjE8oURB+WNhE?Et8xumm=5+G0ZR4@6y*$_ z8b&&Fu)*(@WZjLflTnWn?cMc2`3-NpQ;q1RKTZfn*~TXE3r|+&J+2slLTX|q3IYTF zTh=B#1DW0?W&cRt2{*Mb-j%v({oct<7NKQW%OZ+iJyArlx?sKel8J;q=wUyk4kNMD zf_0&U0}2hZvi`C4cAvR(ZOOE^+Ezzc*$FTnOydb0dA+ifynXVh#fD%2VL}9GAF&$X ziq`Ne`JC^R&)+A{Y6_m_F_k^8um@u2UO_gT{Cbd_rln42nc|sVnH|p9_{wrw(vw&i zaJKMTMXIzEJzM2hn+5$@ZL{>>#G-Vie91G#!DE1C#xn9##@BvQ2M9(t)_b+|D$(43 zq~E@yeGGL_b5M4gFp~XQin;2k2&gBdBGo9&Glf9~0!pLyvwHP9M}mEQkx3)D6F`Q+ zZPlh$>IXEM^{dgY%k4k8?ETZ#e3>S+{RM22|19w*;`}A37B{4L1oun8$^SIta*7b9CNc2ZL zQ*=Nock*E%ul5vTf<8mJ|A1U|F+xFNOf6ndW*dK> zHcjA9UvYcw%l075zoLYpJ?=v* z{PLiv%e$E>j4mT=`q%d@sGFuG+b{|0tHiV1Z}sLNH{si-;c2OOJ2OEBb`PTzTO_k% zya8z@dF=2t;rFb~yvR0AjK3s#UBb%Pxu1q=@;{bZXQ+D~7p^e{i1nnYO>Z z#=gj4hBxpS7+`k?O{#-IyhUAw;x7r3zI8=(z#4rSo?gVRU$?dWPSdE&Rb`h;I0=Odmqa;Iz{<8;Xs2BM@W5^1?x zE3jROs*9g<^nd`P9}ewWXk`pqZVN%kG^ZgKVLm7Dl@#0`aGRM{4~JCN$QMZvb)hts zw<6L4sb(4zktM(4334h+xCsK;9~&TEBKX%VU~s)=EiIYsD?NPwbIzRXS`$sWAP~8O zux=Hasv>7+!`!Xe(AWy23fiwat~v=>W_F*;fDLrQc!qeYa59pPKPf{02H#Y;+?RGl z@{WJ$VU0s&lUq>GJbI~+eL&m3$^fQ6u7+$8M$alCA5-8Gh_QBkwLnn_y7n>89rxdb zkO$YpwvHekQr50aKV|Ogn8zRzGg*MA%#-NeV`dNjFhgw(IJ3TG!tS-#2v0s|O^U8? z2MjWV0f#ng*7t}R0sftx6r15FS}@XauZBtr9^I~w+ZK}5>!L4=>;B*At_n?4$27vW zb~NJ$h1~;R+ybsvQkoYeM`e=VId7_I?^6*g7XAcRY(8Ru&w9#qB3_X!)h0BpY8Y>F z$ki%aPCteo1AjUz7@8bTj3mkf#j?&mz*AjXH>_#tMn#I%8fCfYDK#G^2+UMz<+L^* z2z6tjVXpHTipb^LZuD9xpni)0w~KI9^#s+yvlF!47dGzH}Dw5pMb`)8sw^{~|N!SrR+(tk>#y9JY|+kbW8Ca7A? zJ!Dz$yhIjx0kFRI4ST&D1En;1A{c3IX-#^xWWVxU8l7P`E-u0kc{0phkqLfWiS}-nAR7VNc&x&hNfA?>5a- zuo)|rZFR`^7|QPjX=MpU1nkxGX+XAj%E@d6*pRs^IniPO(nT|Chn z3=k08xBH_xEN$zSAm!`IXC@og<_0Xj(jGF8S3O8Ivb5g$_S=kWqIT-Go5>F6x>H5|5ZAQ8**l6C-3_y@*@vUWZ+Vos`L#9eoAi5ZhNPAb@j}e<0G>R?1WBm*K}KF zw_s+d2V^~8@WmgffBnueEN-Er%DPJUFS5g*O{ekX!8W(za!t%ecY{eL&dpKNJLV@U zGmUagk9#0O=H+UD$%Rx*oHRwIHTSMHIw8je&3MuWdDQpVq+!a@`EXdZVdcv9&AQ2a zRVDH~TR6H=dGR@b%|qd2zN_I5O~Iazu||7i%`G-Vv|0)YH_azHQx_eCf8Hw?7IFcs z#Ivwv$}w!%-H$D2U`xUrmnF~b-lXSv2Es{pB67G3V&$9)-tg0#&l|1hwm<&@Us1|s zdI0tFdsLgy+@=X!r-*4n)$mJHin#&G)E+}!_Rk%~$W{L}`SNTJg ze0z@1He43@?Fju$Ap!2cKg#C5@Nl(__Eh1CDlTorN3B=ZsH0zWB9K+(@#v;=LobUR zY0O=CeGB8WW#Jw|W>0ro;C@f?piwKkEMFivH}ef0wi-tjq2`_c6CckKJ&!LQ;I&&e zV2|A^9H)YKHf2qV22uA=-LwV@Ij8te^2FBA0$cmPQo;)CVlz)$rmm(<-lVK}gGJeP zSdI*I{k(i<(Yda^f3ci{-uk{wec*k}FVk@kyHtB)Z(n;HKq3JIPg#y{&dQQwAZj3n zRGEcQ6)l_Ufj!a!Z!OEud8uqfK-5; zx}sP=P!O8CHq&*vvp>2;CN(kXg3821fOCqPAfgKjd7Y)uzVu!bp-x8(7lJay$sNqt zMmwn>Ub;v&bfAqziKK%6R@Jg7M3`u4w2bl^ewYC_l5M!Qxjb8TJU;{fE(*CF-47av zd@a~2i~}UjVcBLjn#C2ZjErCpQ|{PMWbv7hQ7XrG`x9@^Hngxc%z&Hfcm3LnHq%5@;bOSxWP|;?0oWR;_)Ng;6^da1oG;DQNE5VN^TAw z1RM#i&j`be;{xKL9MM~5C(2x>-{aQj;JUT% z2@d3(PpUQXd$XXc<8=0f#9mRkQe30w=qp|jj%dL>N~$4*t--DWJPOaKTEQm0B2TMz z>gx?~t9@}1v}_+A%#0vPG>k5f)a?CyZjGq`;WKzhwdjG3vusytwW8Yi@Z}z@+|h54 zw5XYhkZG|BsF;r6V{~cl)3@76PH}0GpS@ATY4fzXuD$sK^h=8wv(naqYuM9R|0(G= zW*AnafGMOO+^6G>zUQ*~@7HEcVN^SGPr;UM4B)*_%fraJ1D#h9Ih!vadS3EBL5L27=v~_NZ^nB z?3=f{f-&pj>gGMi|}?}3sun@D}A~hWAa<(&)Ayt#vM^oD1K66 z;B&_2J|3!uf4zs%ZT^+%4XO#g>lQ038eG)7p$)Y%Sd;}&;F&V{t#3iMHTJYE^-6V3 z2$ zF4ZP*9ETRGfJMsAB*FE26GfBK*_0(ND~mD=uyRxOV~Ly%Lk{n($&)LLEE&*nxUgM~o^VvIV z@OqGPEzQN%BEKwv!Rp13UO)l-q^dUwMln~obLLYpUN`)u%7hAX)Fxt2Bl{A1z>q#s zKrHbvC2hV;4xFSzQgF?JkpveE44f}P!S45h57(R%Jozav+gZ;aAyQ{nkT%4;^qE!v zaj(Jhbj^Tpe+U%$W1gLq2QG(w{GMy@ZuN0sO5g^C5vJ6W$zqlehG}S)+hFEModWPu`TbO!Ow{tl@ z9pmt+yngt#Vn5_^vZ!OF6^iLB547n*=<>x(2OBcY>En2==oLlf%oD~4q%Xw_i>fpIr6Hf%eg9|> zH=+6?Kzps#aJoafc>gp1e|#QCc)x*f^aLlEHopu0FP3?<@vtL`pEM%{;g#E5rK&~# zka^Yl_~p}XDYd&!ITWN~vR)E#$V=v&n+?6$f6iQr1GEJ==L^$Efsm}#--_!v1u$y0ef1=?3AU)&i zFAC5(EHJ_fLIH5-qa8)hI9sEB5Cbd#U4=g+nKD#A00!4h{2qeuSPFL`!DbV4m^XHW z&o%Bou_=ho+Gv@Q<52t&sl?-(z)# zG)WB(_6DnTJ6x0TdT0@r2!-|tf3JjYz(c%ln8+L7Dj?+A6r`>O8`As;1kI1owev)2 zsj=XPDwD+rqxYi#%MFL+FWsJ+rNb}Mj=Rw)z~c1w1E_U2l`s=GbA;7gePfU&P0;N# zwr$(CZQHhO+qP}n+Oc=EWA51I-S@lral5M`Govf3qdWRXMfRz4{$?#2apkzT_r#{o z%H{HtR2)>sV;hcIwtPQ>pjRtaP6&u8KIOk9S+I$PU`!wl;X~QY-B%h38lTCoO!9@w z*WS=o)4W40)=f`6%TBEz-fF25KrDBD?(k6HEEB>8xKYAbN4CFQ*GT&bO`%%SA0r=D z5tx=9r`&_T2|l%bkYFAk>xjFYptk-EjG239GspH4jvyHM6 zLQE%p!Bb>1`yYLVd%Zd|k}ZIEV}lBic9P=31|V-GR7s!}IMKcpk*+nRyFJQt6#OV0 z3XG@GD0Y4@IyoAIyPL~jUBykvzgjP#+azM)Lw)kGvrS3QB>WMo% z@0Pp!hc-|QiAlG~8l=6z@($1sUPY)X9FkY@OJ)Q^8|;8-IPhY`>nB!Gb)Dq8|3nJhII4 zxSax24Afh0E`78H%twI_G(#S4NH<;7p5MkfTu657|B9Q>1=(X7_?@g6V@#!HNfBIH z&&V9Tn;`aYr#gf43c_OD-VO;8grH2OxPk^*YZdjfEj0*<{SC2!_wT<9I_s1l zb~`8AA)RiG6D@1Q@6JyqCHoS5`=>(7mq7AN1P9QYrNVChzmEy6i}d=-#`-ra9TYw9 zw|ZmEPfk-nC*`xJJkfG<3q^_`e2(Jv=`6X~6)1junr!Lw(MgYU6_i_QzycwxLS#IR z1icQWP`JDnZ}<-=s%$g0XSPue*2qkW_6QAx&N~FCWK!}xhY^aA4lu=w9^vfwuXc2M z;kL=gG(Q;8DMun`?P-!|uOPJk5JK^^B4$_&c>GhZerXj^bA;gU-iX|kWk<@z?_HNM zq?Lhn4?}kI#XxctZvYh>;G--}sY#D1Elzo5Z*0Dao?qalA9k27xQ(w`Li{~OMK=z= zD2}9&eA%$Sn}n9SSGYoE+eD=HVIrY4C*3HDeD7dUNE+0F7&iGx_`J!7cbsU%BeN-m z0do63Vgo!Yqj%AV?&pvEC^!aNwZ;Gz{kXa0$m6F9#sb9A$;^WPr(UpMkD2%7my7!B zSdcDs!YNAgZWhbw{-pWemK1tcl^hkzKf3J5R=J9k)@Nm*3VdIKMq)L`aTk(z%I2PR z5ahMhZ7iAGBXslV^Ne_NrRvjMh@+ZhwRZVntdT0|)Qa=pc(JLB>L(aDKTm3Q? zf7jvaXBAPrK5LiV@8N<;$sovM2s}z-t@T()#Ri5LZtgks#S?E^~$ReAZEiX@a>Tf&u?Zc$=ty~D$mb8^qU9W2M1wrGvq%2uC5 zus(iJDz?D?X*~2*1Cn2H-aoT~DA?ME5)#|JEKCI1_Z98D193czzE&Vca;nlxl$I+QkLy&4lFRwri%cDjx?(x_wYsW71Jp}CI? zlpXJ3_-aiTUTN-!6Dxbs)B$IAO7q9hQ-1=IRZpB?SG00sgsN6h;ynZk_+0Q`lUN7N%*XSKC4ffc7zj=gzER~jM)?tR4K4K$vRFo5bJlp5h<`vn?H>GUf%fX^=0YGi=nFehwu9IZ1^xGmwcf@NpM zskVYM-$CE#ii22kz~P~Sq@mB$zh~Y8^Kb=G>!pH&srTfNLZhI%Wl;CSH{~^dh`=5^ z5@@En2|HXt_I1_)fsVr2Dx`T%JDK7e0H8>*f{la1mQABTr{0r;pdOyJ6a(j~W~ETY zv<8Ny*>jm!I9U;#4xUUXNOBLMi!O@gi7zOjbj8+ee0Dj*Z15TGyy@t}Iod)6NLA?9 zuUCr6TFX0M2_q-$UaeD19{8x4E!N;;Y#5W)JAmb}@I7IpBP?Mpm3$+i6#OEx2!dyq z5Ou0w;Y!Slz28pWFPvMz%gcu#itCoOhdJJ1dk7`{iqCENb{KvI&j}8Ghl*Cg_d&Av zDU2~*dXOS46QszHsQhM1J(N5G-!NiQ(ikrOCBb%U*1OT}yM65td%_ZVXMpplIXpM+ zwMJ4Y^#{Dkv)$7sLk$gV`z7Eqf53RZzdR3MI?s?d_3}L#QZf?1!e$YVnSs2qX)*Vm z6ktsWS&E4uUe&U@YFyZEi&_@2v07*Ke5|&^T&ceEI2#g$f)*bY<_=nE!*sB?kw06$mo&#k(N{Ll9ORv! zXZnmqPmb=*278$+Hnw6EGiNPKKXGHV?2L^q&aM{8T<2~SkuS$k0y#yGPXKkPciGQm z=x}Od7PCFWHBsXtKuZdN?GrT)?t#}g%pLo{1$p4J>@}4D*NVjybA(s~vo6fNI;aPz zojIBGAAIj`QSu-xl&%(?Gh!)e#K72;K0)yyJlcs|_A08zpPq^0%8u9u*c}0Z5F`k% z&OXK7Uau0YWFl+^W_^h1RbBg#vAlBwTPhP9S#Y!*yvP2qclDPf{2562qxWH1@W<^# zzOjIF{?88q7tJ}cL+Qd#0NFK8$QCrBO`!PIV)zdQv=OG>YFmFPQD|sb;&Emy`j zaUOjT0ER_C;79Q82{T*Hy_;bjpgtjij=5501fx=@_2JXm_u1~|;#B!tf^e__0KQ=F zt#!Og^lTu=nCM_Bb+T`roqtM9dJG8kl;mBF!DQ2*f9N?+|51PX+w=B8=4w!kIBna~ z{U62saSe~dKGJ^AX`9Izq>(p7Mtny9qXY9%Xk>(6EM?pCB}h>a-uwg8CvYIwNVB-R zj}d^GNhV^b2s8*FqNe(t>wV4Vf!~v$S4AmCIt2Y8rl1_JqZMVZ*V6IXU}_3sK)}?q z@74G!2q0#B0{~!22^%$t${ptYK)7hz7;o)ZWCsTU08C7tfKT!i3gIk{runyS?2?RI z3GQem$p4{5gXVah8n}z%o<=Zkzxdz0{QpDF|3W?*rN*>&aU_XLD-1&q)LPSASb}M5 zp~i#{;0F2~5MEMMjcc8=_^4a^ri4s2- z3dkeF@m}3ErnSuef0EM?u%5C?wy_o8Xj}0jrPpw-p=mh7K%t2F;?alvx2b~G5eoSr zEypw7;Mj=3V1eNfbSZRPXu6vDfe%KFB1RnWQ#Kzsr&%;)xF}+rTF8X}095_+-i(G+ z+)9@_&NQhi$?uG>*u6Pc3|z;Ls=vh2w)Qr2Rb&%G@1L=QJdtyhO1e}=+eLOC3a zmd~evs=FS@eOR7Fkud|1M_JoKfDvJIHV72N>-~@j08^4m_lhPE)F@V=GC@}hLL`8- zRWA1V=7-$wASEvx?o8Kc7(7UWMnvk*2a~Yi^gI}A%rL4sK^$+Gk7R_Hk|3%!!STn1 zW=vO17M1z74+Pj)ST{inzYkKfAv1rSj|xVI&h&I~>e1FUTfWnoefpVw+Lw!+LAlem zXzi$TCT9J?t4mtw*pO0$p z>g8zd$V~Xp2mBwa@XuQQ3(>7CO`QP%;D7GF4hjJQ^xq%^69-%8|M38b|3YFDQ!{e_ z=zmuLKmd?`{XhF(#(#Mr|N4K^n*1pIC;^!Ni~i4a|GEEj{C_bh1Q5{wYd^{W*nfk7 zfWSaO0YE>x02D$+O-;l9+cXswHGfP2NB|%iBO4=AH#&DVdS-g2pG3faj|POC>Cr;=2g+Oik2|yeQQjzolibI4CL(D+M`K>WuO*lrKw~YsjhsD` z?dh1+dpRuSimKX$0d-jQMY?VfmD4spagIt7V+Xz@uIDXfRJ6v0&Ntm}BTZ_C6^qj! zJysL9*BE8Ul7o?)$g%NM0srGY1RgxAeYCli6;6+F#x-@r5mX{#B+Eg0D_!LdFlqi& z(vu`-8<|1=w9)i0$gQ0Rn7VFn~!#*U- zq@ht<7{w9Lj5Pk#G=Oo42!`DK_T-a4f|AU#q=VRlanI8cVna3`p6%_#?fpmBM5w3F zC*TO}Arkdq(0vtV4n-}B&LO-Rj{Uo-*b;K3@tQ!$BstBac>zE{UwN6UjGNDi*VVeF z)vH33>GQ*VNQS%GuNYr2;z|rFjO#@8a;wBRK>pNT>*IVe`-f}D?m#nyq5x#a4PcSZ z^FCD+ww++jz5F)t**|8c(7Jjf(dKOPQIcZLaE$r>5l|V!9J}(N_c%=^(J`dlz-zj! zN##7)poGckTdOB^+w62>O%`bAs~W={y4Y$(m*n_$F^(ki9c-Wy6k^;RmY!8P_QT~G z_^D_9SV@NN$WF#Gugv?#NKfya`$f81;~)i)QBC;46&hQ2DNE8GRpa{(3Ugx#a~&9K z}@3QvP&O<5`y~ zk2NIPnVCS(?(Qe`E$x>Kr_DuLXF+tMJ!Y+bg|u$`{_^{TjH5Yqwlj-wFhwuqw8~p} z>$>jRhs@M;H7mphKVGsvNK37Yt!v*UZ+fHIwXofw-etRAsfN;U+0D2iqH*IKRq?Kz z`$c?-5RIipD*b|}7B}N+pMlJar06;Mme;wXhb+%&1|> z+WJxON1=*f1?t*K3Jye8lsn)MjW37@y6>{R46s^tSW&7l{6vowCAtiZDMMk96;deN zyT((-E+d1r!wcsk1M@&PC?dkmke(>^TB{V!NQAU3vLOfrObyN#iZR+5;4-pY3DkAz z%a(LzG|Ih`JVF&hgYcgXLqVBnCT5xy-?Y!63 zGKS>j)%*7h!lt@^W@2+xWa!ItUCmF zN}5@_P%usTJi{kFY?n5*q^sq?yp(+?m?>^`i^)R3&hM&6L zU?lsa`R#C(nL|MlN!JV6BlYW^P3>}J6zo}nRkAyD3f--fj#4O34P2o!IDTXuS)+Z- z{JK!D3{x``R594JA;inGj|j17KEmiLJ7dvjSO;}xVKq@S+j|OT;O(l=8$K#m*IFoucPA+r))G5NUhm zEhEzNv%>=5nf~yC!K_*1xLs2U%y_cX%`vyYj!e$4&Qg_4m>Q?`^TH1VSV&JbyKIIn9_I)=&kFWq1tNDFTEouGFnJx z5b9`(+{AboAErkm(i;DYb|woeY3jab3%g}AFG`9q-L&4u(7FUT?g8IXSv(Cuj4cGGU@~Dr$Sbpm}yY*y92}K~?`!5NY_t zt1lI=ZnE_arn@dEoK(YyMpUz7_yu{4?`F{jJ`SN0LcHc^=lP97V29FU!;cnYb=-GM zx&Yqe<(cRqUny4F#doWc10d{pP?02}G8!}}2{x{*D3NZEZPCWk*PVE0fwk^Vld4*x z7F9PWgREP@Q!j(CK6qY@oX+K#xEBoIJz*z+8M}qX_wopWjs$=caY`@dIvqg?kY3Sb z|Iyi|oetsiEmQxy$%q<7`Vb_n#0c9|WUf%GE5~;Q2}5hDnDH)xMuRxF10=y!zmrUBO_B!P*E+LMo);BDK`PX`sT`ohU}$;E=}rn;a}IUG#JG^}eQL z*9Ynpem0m{V$O(ldvWZ=J$?+hp~d*o-Ymrw`urhy^3>hc%3^kstPIn)u-T6S#`N4T zX_{;P8ZVO@`efCR1j4IQsL_SGbHBdWqA15RPf*G0S;nBHeJvf4eqM|O+3O)cYOC@e zpn;YPzT!7DVia;Qp|RgDCFVzN2i#381y1!YTF#xvPk1gWBAPKLVA`=+3$>l!q6o55 zX4ff{-NAt|8!hI%t5l7)Hv!PU`e|)|=)oXf7N{`i3ggUy+3w(PlH3uK0yDG5oia2o zi8`I@H)Oh*)0#*1*GE9IA=QAKy=aEjSMj5PzZ4~4Z8dhtX!rXBO=$ZEEd$9Wc{&>r zDoQAQ_fS77E@4Oxd}n@fSM!7D0f_Y440VOKBZmD`g_7GA5Uah9FWGD|P1)F^s3B4`LA;kQX!DpL*06gI7cCj{A)uHa<3SNT z6TlPFo;F=@wV~7_+wC<(s@ZU$i0M3HNGhx8qso1&D7!Uyq^?Es66S`0B{?|9nZm=( zBq*c=H zKVTSJk6U8#SFV~FN;bXGrKrEO2w4Ju*~QoV+mV z5#mU%b^0-=)bA_Q>G0b{T*au1v{{sI!_E_y5>$QZH0yXE7rte*rKz~;Z?SMO`;}Q10{oU$o z&P+1UC!ElAk*P5z)^unm4oG%KM~HUYcP7<0BK+Ovc(bCJ_kzx=(}h$v zAakCI_ST_QMWGk>@HFXpg`ZnvDg@CncryrnQiv8Fo<$VM`23B|m|$%ArGfBbBD?j{ zPK=R_oMKwv^hIl#C7Ta~K7`qC`%837Y3ypsM}b-z+OzwEU#Vx=PfccBUW9qp+Cuf@cDZ(G{R!m7`bV#J%aTumplny|Cht@B+(?oNPrG_gP1**AqkNh= zLdlZHW+ZE(&tXK+G9C1TPBbDbPMD#L3nlBCi&#>)0K?HC{)?&2K7a=N6Cs~c^)kg* zwKZ~JJ~{$HuA<#6f&n!L{qCVK7hnVKYCEJp;~;XY&%XP&nsu4Cm!+E7EK3A^OMLLh zyO)-c-zQD%9R*jdR{~I=9O02dyfVvDS?1&5HgS~)Io?7pcv|(3Q};}slh_Xvlhwhu2&DqPhbt%mJN;E5x@{68 zK6d1)ckjK{lYg_b_aFb(6LwEr zz3{*==Ru;jg?D}8bZu$lzhdkP2lXK_C7GVW6a;XhKC@gq=qgyP^!8!*AurSpYh~X0^zoIQ z&UJS;{rvR7@7i=ELf@l+B}2Sn2oztmcZNVGTrUo$aF}*sxhS1Cy1;2XHvuT9go##> z9~q($N4uK%$LBnCk->2izI6a1Ey+!Mr5q}*kk$|3hvnLx$-Q=i zfsb(pk3zWd*x4+E55PbCy^gkV1_Ba$gFzJ~uQ@h8{uJ39_?vL~xr&$sz#7TlB#eqj(9o@OyCqN7!=w z%!fQM&FL$=vw%O#%s#2e)13T+y9dY+ziOvr_zW@leY$^ObPj4%n8|Ztu5bp0;$nr; zAijnHs8A$I5ZFZ_zNQ))TISQ#C7cb>M;?4lLMC=u@uV~Z?BkeTqPde&;S=I?1o~jusHLmWbK*4c$XJ zG0Cu7+^rI4Tb5Wid=KgG^l3X%en@ZAmqHur2^1M~G2aN=ZAHVbX?-RdaP$kRaDHC3 z4=vd_7WCk%a-BaEcVrFBO&btk~ZDC+pn@l9>ZBdtGvEXC5 zO=jhB(+f<{4a9WQ-M?B)EH;*8Y`3GE?@NJpnG?b`|Izj0;k0v#QDz(vMpadfv}(J4 z6^t>liBzTOqD@qk_`>vV^5p8Wp%(JU42KtI!8zAaXW5_S+?XS@tPph_$KZ{8+RTFvbSh z&5iL;Ely%o$t@^0^zFg{Q;=^q8Jj8RkncJZnd@zJvegvdMJ(oECzna%nr(HBbIuMh z$Kv-f0+*XYP;?tZWKB7bdwadQ4{@|#L*LLx(cG|v%U096m4(P~cXZtgM7kpK zQIPf4*ea2>9a(qtt?f)+P0Z>eN=9org!#FpnG+QJ;QAWkx6i4+sQ22ABVqFAz~-Y_ zrP;QzY{=inC^Li3)HVwE>Lin+NZMuyB7H?CB1t}#L;;gKgl1-4_O;ShZs&qc^y!zN zF9r(Ma0N>ZbEDf|fMLjjA>79&b$NF($fM$Y&4jNn|70p(?cT3It=6lNJXn1?u+WdA z!M1s)40VUo`=JVQYII?%KXsnN?fc) zud5AAyO=HHR(g4)W&&M!BiZCy2AXm6z4U(XVXrH)ks5&hAQyD998EcD597li`zVhH zm5LUi+rL%*Gta1jSbMY~ax(Uq z_8?HrA=@l7)1d*p)fq06Nb?{&H_wN)0`+J#orn3heXC5u6pBK1j1tRD(Z1$s-IvAz zI3=hTq-J|AArg7;m}r;1YN0XHN2hCyPo?VHk;|ta`V(_Ep$A^e&xaNfro?LNs`wz= zo##1C&FJ4thh&EFf*_abPIbJ)Tne^A3Kz3blpaZkFeI-%CeTmcs4hj#@eP`$I7zWJ z%>aa9e#C+3;XXvcmZ;FKI+3@~$WdXHXd!1n0;=~mbWCaB-RbK>BwrNZ4>o1AgJLOzd_^)A zGwPRS*4ri?s8{bBtdAGzsb|N=_nrtsLzwQI+ zJekIVsQlWYUi3`Wtin@b@M67)p*flya0Z{t!w+9sTV;T7lW_EODReHZ_D5Zs;YKxp zEEQgNRey*to9OtWHQvoTL~y?jF77s3+I4!%|28eWwJXibQ>;4$Gol=-dF~xhOBzyz zaCOkOViyjJ;Fu5SPYvuA-C`+KcXH`4GEaPDh}c?LD>TLjhyU(5gd(p70D3(PTOCf7 zpwZxb2WTBYC)%`PR-wVr$my~gaO*l4cB49tDh;cTs3l#(e?%-@)LF})^}flLLg(lI z+zTLRTYi2q3LadeqUWaKQwN#i28zuVA|2r?%UV3y^4rb-2p&?>nG>`;OykJ5C5fWCs%Bf0D8eS)$|1*#4-9KvBKkL(w_cRLt(k28fg3`6GWYOpf!?WF1-?t10dnKp?neWo6k2c4}IQC?rB_bl(^K4$!oJhm!L#WgT? zOD*n966U7Z>fpk6?(aN>RpvzZkCIVOFIU4jOhHIf?-LV)g7KlU5M+g}*2fIjPJa9V ztFpa=!#l`#>zvHl#CeoS0RCin*1{eeCiGcRf*`^krkUOv6r@svJPw%$pou!{Lr@(Jw0U5WQFL3BJK>td-|lzNNSwm zn$VFJk1db?R|`S));#P6jGuFjlpY$t{Wc#Hs7X_T(F|eUqtSHfs3vL=)!UW&sPt#e z`yP!ViK^b&6OgI;yTiFsWns@#M6i3q`q^N)2%O<1e;8wREu4Cugw*n5D#84oZy@c^ z5!%}qH9N&k;=n)u`wNu|Rt`&GbaNQAVZ_>k{?G!@Ih3OT->@ zUFNH=_kF>V{nPnW#70d6Syy`Q!Ki&{UdQ9W4H%{Zy6hjMQC@@4f^03s;}}n~A>{~& z4UJ&wl7>j%9M}Q&PC027Jg!@@(93qz&}dSmvtm_`n9|{Hc(mmL+2c+JOQ3Bqm(@<0 zL#iSTS|!^{P5ifoD?(-=R4c4UU6K|aSV7^Z2*6AfR3xtP0?j1`D-l2OoLE-+bRd4b z{=2<7Ocetl*7*0>Df(a>Lmy2Ln?z4Vm19EcRK5&y5R@bg6X2pGu5BQNw}l+Mx_aC^ zbawHBFRWLta(CT#1$IvyUjmaT*!nf# z1+>y@FffKajef>@ru+|SH%)gj_a|3%JO>7BdqPG2M0;DBwuqPS0-nFGCjelCOB)#6 zpXXN%+W{5Tchd)l!S#!&qrg_YbhgGJclBPbSA2sxm1{9TQy`wNe7&5X7LC+i2ZAJ1 zws`o+AHN$46^m8)nhA!u^Aqmc_z^fO$$VHpf{ID|mUmfPtJ##Sj$r#PquI%Z9YgxM zVRKE$va#L}TBO}3`(`ZV7x6VE%69qTTsPK^W8?;@#@WYTyvve2!nu3+GZaZ(?n;9s zcvW-sleni}a5NL(CBH8a8emR4ynIk5d8WF4?Rn7|`oa&_e+pLc(PnJwy)__{xc!7b z9r``Ou3n1mira~Nn7&f2%Qnv+PFWU>S)`^0r7E-Zj~o~se9aRaSU+_N6~aDRn{wA% zzBMHrXYDBK*LP(CXuGz5fJ(fj(j!mIeN?q1F9i_SF(#`qoW9`|fnyL>71>daLZh zg&R%z$WbL(#NXbrb+#)6Fqa%U_1r7fXgf-KR&6o^LB)%bba0wh{%;Hb0F_$;Rl(;q z;;k~4imRrsTuW$hnPFny{^AjL5$o#R5PS4Co7C7rV!&_YUZJ|YGaWq;Z5oDQy&u`s!xQJP-5)=8Q|13K0qhIARC3u$ zWbArP3Z2a?$r*k$%-?QQ&(2X+-Qo59%o-s~_=$K|#F+adXezpj{J)T9c4}1revmwFOK)g69H~=evCk&26w+4f#os8meH=}tr%76rT#c=4?lMhdirf->KkrX6WOWMer{_JB_0Tf(_j{V|haqX?< z(1UrdpNZ#S!j54jOcY4f zoQa5U3S++B!~7k*O+0Q0G_3ReyN?c4xO5gB@SGWD3x7If&+g$uu*m%VG`&R5Q{jtS zM6!cU3dz;Ho0u(3aEe%!m^>6uMTXSaPV|`7w#f^7Y)!DG^hph>X}!c<9=c^J{ok!6 zVE>YlcWT*y?XUo~pji!$OBZVEzAqQTAa><)uH|f*xN#?wmSK}IJ^N}_P2=yUQ-}72 zeAjVa4LC0ie65v5?UaXI^15GW@q9 zQ2gs6hH3$5q2?go2v?P!;hwqK%AVU>khwI<-L)2A?EvTX2i@0ZxhQvbIAyH>%8zmk zzDQk=G&}ii1vvgJ$jL4+KVzAC4$^FV60n;Y|^es+|WRr|7KUhLL47}E9(C6 zqdjlje(UK_|D^DD#M{sc!U=1yX=0~X>r1YkS;JVXJUbF_ z7&B?b9xAhum*vKJzyGKpyXCx#HC^D#LF9QqGwQacxU<}|{km-!6spTN9U3-2UmFtL z9Nbo=f|}rN5mWm@Ic`ra-p?G!<_8wo*WEr|2Cy zgrP5PrXg{UNR#*?v?4(MCDT-F7=!*p1N~_`avJAXJ(`wNrja{@iWoN0X_g`H)OyF2 z^Oh;$hU<*Z+i9~5Y4<`Q?KZjOnUf=odlaK$pPMpGJ#LmawQf4$7VRf1%L;4{gPMnq z#Rhcw#OEz;r91f8USEI>;#_c>>2*P<{~5&_d&3h#0772Bhc8VF_a9Ht#!fTVOR#mC z7qTa;=6GcWvD@hTvN7m45&7eoEWSxjZ?f5`N{TOf=VP$^pn-&_d&3zX+Q=vD_7nD= z)a#t63a0z?-I;A8??h`X5jw1>wvCsFoKn7UaU*I`RI0~<&tpH)$3oNErD0qT?&xH{ z%c6)C9EWrN+PYJngWSLA13gP@BQ!CNg9_!HEi4S~_4+zH!donhnNEWU#WBB@m|M`IzdV_)H!hdDf zu*k9rvM)z;EhryR1=TC$(ZX_sO#8-fuSwt_(8{onwKtRCzuY<~DH^(yW?cKFx3x3c zY66-xTMAmv<)5CywXIolb}qx6^R^NtKJw_(c)09dtFAwv8ePwS{b@{!9)Wsl5dQjY z8Fez9oG1$VRRe{Tkd#!o1{CVukK*KAl;&U~j&(4r4>meQi}%LjwCZMPSK_Tz3(jwEAMQdm7=IB=ga)L&1m4JERx*FRlx zy}(Xg`JqZ(pZj?K7$^;hI}c;SR$vJVgGEOEarN4uN&jV7u@U_M)U-qreli-xAoAx2 zm|Pk)u&6Tn)^Ub&@67MK5-Z^^1`-US)`!?sGx6Sd_JtY`MO;-BRLX27>kk&i_74+; zmMqX@1QAno!V{@w7%EtRcDA?T_OzDDIlzoR0mF{NyOpWok2G{QT@+7$+XWOX! zNJib8oA-~MRekv8N#A{S3d8nLX1VL@Wx>2cD zJk+y}hKGhoVwiMskP<&*leiz3se8QG=(m1tY9UXbpGaC#uj8G6^4PTn`-TSGPuKtc zo*<(JAvC|IUvIy49_cg8LNWyE`owS4=-rLbhHb(Upv?RAwAv!WhGI~Duwq-F)1gmSl4~sy@?3#Ua!B{oYm|8abJ!j_Zxbcg zfa>C^QvJb()}HZWsW>iMoFs_~Ps<*wU)QdVLRJNfNr75AH%dK0^rhnn9d6Gd;xUAN z#O7c_wf*gilaFg3>kZN#G&P)JB!eTfgwl@nx0luBbS(%)`nAxZA6VP7))pKo^BWNE z%VqWB+E98!-L84b5UONK1{&@)D(LQ?8kcN*<)yon#p7Pb(%!XX7geia1N6jn7M7~@ zDS9KhK*=7oB-Qho8)sppqyia&7w=Fhpw;W2=WNQOuepkM`KZoxGCem9{!~Dj050(Cf4Mw*u`2w*-yuv=Gal->;cG zD?=z2(nt5l@`VfkO~l{Jx%xtz54UDLBhQtLBIdFjkYPq8QZQmAj`s$~z4iLZ|HNjI zvzBY?*B(t8u?e%Cxxt6^Md0LKet89*(6k?>d9^a&nIdsiCDm$}-cn2$HoAe(oFvsJ zUSb!N9V`CRZNp=EmUGYAaWRc?24ZW_{LY9t&4p#{;xy=7bt;3MsX8kZ@t{BdmSS;^ zy3Do@{tg(OCe?T2&hf;~WwJ%?_Fo9>__e~l>I6e|B$p=xO&JNi#A*B|vv;S|xnpJO zmR+fP?CS>@Y_4%b3Wg;5@i%MHIVzNBwEWEPH>DU}xR&L{kLJ&OS|rb7ZcXn^L?u4v z-eO8hjZY7f61tt8GH*pTiO?&`im(;76NA+JI~G&DYrQsZQu~bl=b1g_YB;jt3`n%` zxzy|=q@muR%1(kc77U2Z>v)+*_&U?q!P}Y?tZ%~*G__`J-Sc2iXsw3ZchJ?=*vAp) zFx=(s>=sLwj~sFG^m8mki_2q1b_b?Dl_o{b!g&?qtnCajEzAvoi*;@z!WLX5)LPN| za0w_PWj(g-DAbms`&e-4G#!{qdDm4fh9qe`C>QPzL)+j+B3Emi?{8UxTI}Ci8Y?IS zaihQNLsLmAM?q4OE}i2aN|W=MIw3~6PI^3O3oHeBfmzl{r%r93vO%5%j`wA6cdxma zl!xUGij8SiV)Cj;>*fj}mUWVm8CRaUw^CDFV)(Whf#5gpI42)DndU#sI%Wuuaojo9 z9=5Jc<*fAoRH-TH4FptBX@D;3|BYHHA!2$QeG{lOo@1UOkqGD)WRfWCm+UMRp(}i$ zlNgG^REZ=mbs}j&9ls#{R>tiWzS4lA_@z%2iu|ucJ?&i3R?NVtl^8BRPG_X#t-Jk% z^s-7TtB<$IcJj$I!Ho9605KxN%U|ZPiQ?g?o0&nrwBn{gvbb)?s-+D(mVVIo_hW=j zpUY|g93O-iS$2Rxk3h~;H9)Fy7_dEqQB-+w3##4C{0d%5!0U;R5=Nz_IGgom_~Gav z_HLcLq8Nto4y}~^@FTAu?+6BSqoo(0l)Y%8%Jq9g3$>PY{3Vlr&Ieg-<}`&Wjmb0r zkhVRdIV~bn(@@P>joq&H)DbH2#r`*^yJpHQlTrDvj>ILwE7fZ~A7cSaeXFX$_)kz$ zLn^Qg-w?yr984^ys$M3J38V{1JV}VffRq|+y7rgB%)`k^i|(F*n=RrEvNC+`0GKE# zJ+iOerkt|TKo%@^`8wbfoWvgp$W<@CT_`(Bs7pyKRgp`N`JgIv@Z{^M%+I4ibxFrf zE2m}FK(7j6TXRG1_H^nNOPv1Bri)gN0~spNp#|Q*g@&FHywvywg>xC>vBvdIO?(^q zBN`TiWR?4hKW^4MTHo*DBSIS(5LG_hnH)y;MfS=Du)ZeNx(cUIY2OwC@f0{k_fUXB z6K}wx)1!ubjQ*3Pao+LK>@S@Nfs%J=&^#&U#hqY=xosD$s;Sswwc7S~c@0p@WS03i zGtBNsNOxoGN1=-e0>K}aXa=CvtVRu=^=+X)`T}SX_c0TMu=J+rMT6K%d5MPTgOSSkRyMmBluu$nc-_1&r zWX7=M`kB^8`hgX(TctnhfyXDl2pk-rT-R!3^;`=2)_75p8b6M)U0hf^Q;aRCnedSv zgA82}7MIGL8Qr0@+Mn9SuVGN*+~PDQ_h7rHM>r>6xu1|_$h)6J&M5i_Nklz(A>6}_ zxYV}F82z7FclBhe*G?^Un05>Psk#ZVz$Efg*H&Vho&sMWMp4Ic$hAoXi$Qv>#F?l! z_R>UCl+wEH_b;*U|KK_Hg_P{8@4yE!C-QFL?T!*E=n)_rS3sbvg!^{k>nwGe%yk`+ zO-qo4l8~}UhmwKki}$+g$s=uggedA({UG55yHjU64j-l;GV#>62CJ{6Zn^}GN4~t5 zWvc*@f#T(q*uEVZipB12HBxicA}x}?29;_r<_eVdvzx*yST_8*J4*ajsX`;cyj)U! zjz^$!7HRneb8}bQuvE=&fpCk!3d-XI*vu|cYwg%{Q09m&5VI}H?#8al5xXk@cH9zMCEU# zIrOSZzSI_Q3`7wDM(sU8MA6j0F$$aZ=qps%$k2Un=JCJ|W$~9kyf$3iOv_nmaS`7J}D|syU>7 z^+jnMf2?xEU^3+JgDnu9a9=EsL=Nux*aED(t}{4;Ef%~^kHE+T$^$)_(S+J`K{WrV zS436PaAZX6+#w>$!=CVoeH({RSG42SgEp@9G}G4iKd2pfJ$HRDAj)8^sE7t2PLj|Q zB^y?9fCcjj{LofgV`nP?9rIu+C~RM(IJv7gNr=rzLxbd}iOxpjO_8h70GF45I%&dJ zK^N^bx#ZYalga-t06sv$zt7$5_o_^O0zsH5(O}DT!)^SkGcY^*>$6n;23p5@Q==y2?5}Q>?DN|^Y|bSKV4YS)PK>X8G8MtH>*-~yXUYJns0R_ zZ@@kYtBs-+3Z&D#?9i67F6!%!#8P)fv*H?FoCU2dSj)dz5$`f29J6YUlXJQ`j}05= zC%`Gq^s2u7JJ>GVi#kkMzp}y*_HPkICEZ5J2gnauO72P??HbvX=e&INeK?xS2#e+H zd>dGOR^jk<@ggKE7a3u2;Svk)3Cc9OdNSxfmM%6JNiwQ6W63nwA#A$oh6_L@awUBD zwN}mIV?%%BzPRWw7~)WkB)5hzG887k#|-4kz$v)~OiM=8QcNmQlH{L}I@D)tv1+U6 zD}z3^NujRNKS(;io{!mwC}S6x+?d{uOGU?5!Yl#_c8oiY2q?Fhu6wQ zO@NZD14GYIx_g5aK6f6LLSbJ7NgNEklH15fwwN}OmO%|FdHC7$e%{v(*?!RIPnuB1 zBeX=>81;+YtzL{hQpqRG{p#q8_u-D4P=s4gisXJeOm|AL)SdFi#kBBF zvvFVf(<&gJ+kao)ef_(iHZ#;r2M>R^Wat{l?wvMZDBt-qVc|UvE~5QF1sPX|?}yiS z6k}l{d0IWj4bm4%-pE!YE^*)-5B@NUjb_khaMc0`F`RjJnpmOam#I^CG02XAgAkk0 zO%?kka2o1u>16d8Ia|G>t+C&O%^k1t{;tBAbregrb1|G#QN7W;*5P&i2OVJjy5MF@ zjz4Z`OuED>(rt&EO}xI-*ZH(5=|SR75~#Oi0I){I57;(F#5Y_M#;PIML0GL>cGFg% z)pi3GSU07ny}e`d&7~prD1NNP#X*?W(vy43$4_N`pc9HY!CIHoS)=A~V~j7?kVG9p>M2~+vJ4{&_l3#U%? z+5JqW6kFfs665*Xdh^bx5_+0em?_WYFUft_9rraBb8Sa6nF!fp&mt137RQl>V~w%+D}@mq}B-D(>pYu0Poo^{Hn z6;8-}ae5bpy_YKb4^RyN3&Sb55=3lYv&9Er<+w9uYD}z1C%~(y%ZHa2ud)LH zl|;l@`Q~p_juWoVmldI*xpi{Ie)>5sHdxEUTjX!O{kp~~gH*Sk$R+=Si5@98%?xzl z2XfkL`^833DBiK#A%6i~r-i^%&{N+?B7vIE_Gy;pgYdei*||}zuptPM>6HmexZQIi zLo+vLF)L>&4VdfPDOqYbbvv4xmT-H9h+@t&Wj|A}n!O+NOf@{_g7Sat-*t&bz2^(Y zR6iv%wA6V;`s`aowwC>}tld3lKmCXh9U>XC+mis+c}GW*bklr)HKxCmOs4hJDG@0% zwDPNGs$P0_;Op&2dA5|Z#sr;y*?x2~sHZkps8tBz3h~OCkv4Il%3}Dk7~KzLUyTD_ zLG(Mk3F*_T-cy7#Ky|dsivI;!_7ISpJd7cbF#8F=^j_MoKY)bV5MdjZpqqF<-p)t{EZ-;}ZcOwVv$4-iDs>6rUiPmGxcICktEK|}vb-czMn z%g(td9Oq(23`AhFa8*$n$~=|9Ii4K^iqA+?p~(03#P~pP?;(+qRk{aC-=`}`A3~9% z5Gf7cODOuQKfX>mMaMF1N(piqtXNBpHcOEqgFy=ESui>B(uW2UVeT=(op+%;NuQU7b|^qHyja9NmFoXrcK6XrFZY{}9a@q@iIH7z zLt!Z|6II2>P0eO(cOEiWDX`wwu(mY)d<0H8q?VSuU9ui_4oG%q7vcDECtrWc=NyMT z4DV8HWF?j>&t^gBZk;_`GuI44PH4Y{gUA{qID+6(aVHe2>^c+b2J$Bc zJR9Noki{Si0N)5D9&PDA{v1Q*0r4x#U^#IYdPk*(^q+}tVxdB) zARu%NcZ&feOoczPO8C!v_a?0G8Hab?CQ8C-#K1@6); zMTG007SNTC=TiLx1Ssn~w76G3c)JwPkbVhMlmKg_`GWrB{g3?^0N6I!6Fy_r|6(Lbc#wVT_R#)a zoLElY5l7nlzEYfm%F25NR59x90fd8$A64>8gfsx^zZEcfslz?A#$iXN)#|qypA`FNvJ-egab2owfv?fH>CFKbz8E7dwhoI)qwL;M`exNa8u zRdN>NL79Y-tFZJiV&xtaz>X=2O1lf3uUHXU`L9Vt^V^elbZK>8n z%u&OriiX0%auFiby(Cyz>K1B;ZoF#8QaRyRP-~{LqL}dBy(J-7p5;S}5)>BY?&Euu z-gm@p{5#VEr*suaYyy37vwynMy1L8Ci%}mtffphX>}D@^3`X+cM4%8$a%%8KmK|K( zCtJX;&w43bjJE-VzT(lHYqIBUdV1~H(A~8tECab%GO`F@CmqdZqY0Sx=TVEdqPokM zTfoq#=K2EjCot4i`cjzx2atC+&yCxX^v#@(GYuSCpcXmja$Na$_q7)<6c};HlMv(L zi-}Z8M-S8<={nzANcUu*`fWW6`w8tlwu4OlZvpodYh1mr?p%w6Ovg}3Q$a1fT?nMi zR|>{b));Q!C`a|+x_s`dWhUj)-U||iCVbqEU?g-~d9}4juEB7kkiXJG+^v0=y%_xP zWS&F}f9d%sL^DdpmgZg+nLn#UAO%X_`o>2`I9jmMTCX6G;U%@LVJe5bMoXA2TcXqR z_`VMq_BGWgBvZ-}#zOd7S^LGig>a13s9$pueK0=IS)d28T-l%}tq&YZ)p2%=L(WX6H=Yt}XRT>8piGNc z5sQJHc`He3Akxg??(CXJ`pCF??4uCkvV-+hxyz~y-~fVJqEtN>4n_^zJ_gwwW~1$+ z76OHKoGwlUH>yg_2IWA{A!vwd%1Y_?!PZY;7D2+LV&6gY%xgBzRqPPv+-~!lsMcy| zZGgaXH^%19N@KI(mIq80yjaS^r^d$T_>Fj-wPFR5H%@}re=8VjAvDinEsBBFxu%|- z%EmBLN>WjlxXtS;;ai{$i-pFFrmr?-xbKg4Gg_nlo^$bAVIg*{wKuU=X+(}UfpL!o zt5iG#l4r7MW_IRBy~vCt-9C`K_;fOy)yD6D{#i7a-t-GP9TaDI`Xm<1a*m~!g*;f& zu*e|$cRKtK@`I0M_z2pZSy(SVIczn=k??~Vp$1;O;7rm4^{w{GW9E1Bbepl>N@DB2 z@6?lT9E+ne2!lTR@9g4b9k$tpjy|}q2_~|Uv7%uc0-zAz9#XM0X@~&|7T*q0w;UH- zf2S~YwX>~sE|_(?gh&on5yd!QTi=V~fGgZxofuJon|eYa*p@FOd&p&xaSgSt4Dnju zJN|M8jeZjFf>EV|qonqweVMqpzQc@mpl42}rxj&EIgyG;3eWC_I$s#ty!$ie$%VP& z$}yv4jZHJLL1STlg-RNz#L%mUL-4zxk5jBsN9WvR1Vz#_uGVkKHCSj74WSR5$mzwY z=fbHPO#sDEkj^ESlt+yb9%ZcJP{OM}1c%>zr1zFq&UWbq^spcxn zEa7$^vzPiKtD!CxuWXcmNbMF{8h}Ltj$(OV{+B49f4%TojxyR7Q&!m!Ra=So!yrlD zyaT7Hd=T-rNfe(6y@Z_Z z%|uRCK`-sLybdOtz$LgU{O!SZWeRPya$NgRT?ec`o+9n=0bR~6jCJI7Z}SUq%>O3{nU5Vj24-Ze{vj51V?&{s9>`NwfUYj=`r(#<);wt9c6p?>o1I3y zsw^=tPeLqlcJYR<5%l#8k@Z!Iu6pQt>Y55@J)jw|=0PYm?+L=&{qnXN+dh4%_=#M~G zWXi0p81)KPtiwnZ`&iaEj;`uiqCchpJJC>Eo6@8bnlo#7{kU{Dt0#rF_M@Zl{~001(BlS?PIYQFf^Dx|76CV_tq3rIRWZ3x!YGYSf8{7bKJTr zSjk2IHELVl1>kgWe)BWroVvjn-@=B&ubDkhau&HO!Wq2wC&He^+eY$Q4{o7uTk${g z%r%N+AI`fB!SbDI8oB0#H86R_8P>95xrF0?_dzOipW-YX5TrY?r=|FB4y+ZReVhF! zI9)Mkf{=0{Yk{<-!4ROry`tO;;jS(kGT$1e9BuKB`{@;sDteF$c)XMX^CC3iGSQ%d z6u>D=XCD7+jm>+Fud~LubrTc{gY`zncs6)D{}l{6cgj)LNFw;YJ13L01!ami-!I>v zbD@WpJM&yk5$SolN1QBzfdl=b^&tbQ;9^O($Y;s)>5k}nZ?;4{!?$wI0djnTY~$oE zR#L^o?TpAG5`8G}bcKaTqLn+G9`jNj>6_iwInS}rvozVLG%e^21A6LQogW)VuuPB5 z)hZE)6f-a7fF$|j3;5s&h40Q8OMcO`i^;;~9TOrI@LFf-T|#N<5s6*Ft>{n&fJDO* z>Z3O}MyiDgRvx}tg!UK^k;QY-Q%c2hdwVy(NvO4zVG$ZdSYfOlt}q%H%1+VARWArS+lg9RZH zb6zOlI&H1{(of_y4t(4cn<<9za^jeurfbFpq(+rT*9$Hy_3nWq{muDGay^WsrhCDb z^Z*sYm6n>c&d1i$c@;1zxVtybAgy(hrA}J3=oN?N4s~^I%H#~t==xr39erjp4oZ>a z_AA8pdG~)WK>=U2TQo!z*EpReIBI^u=Xb)2t^mE{M);GHL0D)_FL^7?8sDY_oY1Ev zyIXv=XvM6T&&hSYzOiW4G8X#dN;MJQxNF z6fNNc6m<=RtclJa!wqx{7Qr$H+Ly11{Vw94s13|>C|7%6{6OBo_;x(vxicfqZOCCN;J7DTi;(f0y zK5>QRV*X8P+kyZJSoy0Wxx*JuBA&8Ws+c;K!NZ=T(iE-A1K=CkrtRzcE6KlI?vJj| zQw}`Z%OyqP^8EY?0#RPR_y8s2WZnwsxr^D1|9e>MiW3SU_4N-eO2k1|rW)jTLF_8E zFUmz@g}1_EubDEF=xygV(U+)c7{%*ovcE0zPCb)t#H=-0KcTWr%fT1fL z54shlk`Z=8Z+j|sGJz17Jiq+FNxL_#np*v;^4#FADvi52D=Iq;$vpC;j!um&_{ z?Er)_-f|ljw^LF^h36ykgb)1XDeR8Et4wrP>*H`G&$7$FgSu)rd|t$)9FHWN3zyU} zPG%F{G)Az4zrL_if!yC8rW@qk+=;8AY$3)c4k0sJ^Ua)c+M#Q?$AZ^f>b9bJHE^Xb zm6B+lUR6G_`)%MS)Qz}Q^6x%84CoU(ZLLNOqiYJ^9k~#sJ%r$p*c9} z!C~;sD;`ic&g-ja2g@1uf)hcehJv@wp&HplAMFv)%tmT;N(*Z=cP@p#a4#KyvVqx( zh?@lg7cUR+XM%u?dFfB*BD{#;kb|=ctt9JixIRrTrEsUD0V7k$6-I~$qanXkLvH-Z zh^-TPa8?6xO;~d6Sei7slf48zsY}y)<`)8qsc8`3&dOLIe^5S(@O*H1;v|YUY>sc@ zP#7!MQ6P(ouaD5KY+NOQ#-v97QBj@g%#3v7|6AMWqu$Y5ag@Y&%Xam9@yUHo_FdWA z7EuHGw$r49J)^Dl2e}Pj6H~)g|4C^LbOx#nk7+2yKYnEUH?FK6<>LWosXF{k)!r6D zLY#U3OVu1$+tqqCXiaq$5Rg>I!ul~m)XZWI9?{IbQ(VH!k>+k&i#Hdh)GY<5zfL|! zuzO}%nConAICXub(i{h|TKXiunpyJNlk z_Z>inR=Po=Lmxn7#uiFCPj_Pxzy1qCjW8IoG40(;L{WqML%|QwT{*q^vC?<`QV@J% zf;T`AE5{}8Ku$>B6PR4z=P-!`^ax5bPQPHSY-RdCd1|_19BPY?R;n}SmrK?vaUuJ$ zxNsGu_);JM36C&X=Hl#%m?>% zqe^kaU-618lQ6717j0H?zLFYvQXgY;M2fkdncD4|SaoCK#sM^{b=7jB1M$cm^5DDv zOHv!F*-xT#zZ5qkoZVqrI6Dv zca-3I3{YzujdsS&ndzKY{Hj@)Ba7rk@pEmPj8albRF-(DP)r6vymaw~wp~?p`91lF zNC6WB9}d%YLB-`MLC}Sto=uI-bM2cGvw1(-*WVP#m^iPUK~gRtbB zaWn(s+GCy0MQ6>06ni$l<(*B_UZER#Euqe#HW&rlO%v3@5u;raF`5t zMx=zmzwjjJUa-Ca??MJyz6kpPTI2YmOn!Z-^aX|FWY^M5afOn(RtH?R2Ku$sB0Y77 zqM%M8;9Uw}ho@rAHrE{C6V7tSa`3QLFNN;JZ`;ZEfZ$>rPnSUB9KqyZ1Sc)-3?Wh^ z3AY$PoGsfeB;$nEcjZwBjLt+*@{CvwWjqLz3VQJf044BLCyv8-1}MS860!cvISEIj zkvog`&E^Yi^(w{wh-NCO)XHXob8b_DR*@(jKf|8GAcD)1ZZPU>dtp@WYmT~_X-5{- zkKPI6w}0iw@|okf%Yg7p=@GtW(fneS}dA!dBG>Rp(ef8cTM4ztimUgu*0zOgve-vs|k zlG|W|ky%UW%xtQcHuKb<1rTI+wQ>aLf3Puu(e#cgs*I~D?(z`%Jl--(g;{>sFpZ2` zxjhwnuT`OML$h!&InKbQK?f0|HfsG$Q@wZg062=bzn3G_z zAJH|}EkS>4v|RW@kiV2iBRJgOBQEwPYL@!Z z(i$?}Qhf*7|2jl=W@bHM0rf=HBrTFzm6l|{Fy4n6>Q#t0Nd;>r19tg;!oBT(Si6&f4{D zo|=id&;1R^-*$Ql`D(*D-63N@8uqgt>o#z7-2)G_SWw^{DvrG_$d38>$|KIa!U=ND z;cOqqa(G8weI=23P0=#*i?i-Tp(AhdZiD`ZyGw>d$jdaN!00PVBYA#!AX9-iZgcPW z5|m#`bV>_0RMJ#N8o{mNRO9KFu=Tb?VsC4VgUjfC;a<)G?CpPVE3fwSeKi}wS$(lu z^^xO;(1dn|2G|Q7$+7=ly3kGiz2zG(&BL)iyNRqHW)@S{UDK4)W98;@j+-1Av($h8 z8roIHZARgJ55qf3e!|`N+y@19Cu#wg1Gl>$-%P%U?Z*JR9Plb>nE@)-`bZ?=0KwA) zCt^^NJci)6w+J#i;h4R;LR-GDJ^&ik#h04rVf~{9XR6_APeJ895?@FDWDh=O#R1lQ{K&ns zjk}I}@YZV#_2Oa;@mZsk(pQ`4+UvPr{c7*~^h-bU(P9P3;(s7$2NzFa|5K1o_jZ>Go-Yv%MfiPOS95r-D;dw5oRxbgW-1 z@xF{Br7KWD?h#*S%q%k9E0E{C)!vm{me_oGG0UKsPA$rPG8k#9wm%)vqx*+^pjpk3l1jnp!c^l>ZVF%+O1NIEFXM4Nd zKfyY5-EN$>Of11UNt8%ev_7=Yurzp?M8C8mh4UPHrUUZ6B&IPvdY~G)d!1q`-Lc_B zyzjG!D;`V#P?Imitr7x&fqCFjzfc_N)K~Jaw|*?`e0oTCz|{VOs#Bx@H=x)HJSu!e z#`cKFayLV?1RE}ReHeixOm&1Np*d)em@Y@f57)}pZ^U@04MT3 zqO`nq*oc9iE{KLg8ovjcdXx12H*5T8^$UAgX4A4WMWK3?6!7bEh`@7j00D$l%mrE0q{Gp{`*3oGHejO5m{RaSaBPDY~1ao3VF-FTI-MADvG5n#d z%x>`@;vAHJUk(}pcX!DL5|z4|LAC{ZX*#{5s}hsCf0YlNIjQJRet@ciw?%wX<&i+a zCzi5Lx8Y`7boll;%NO@8*gR^r{0PV+IwxIP*w3lRxqH^G9?!)P0BFhGXAuvaW?5^_ zfk3>l;Bn?mP*)3HFODi&M&_cpx+&sO;}H4u|9}5aNn7h0&JofO6~|&;IbU8Bo<5XlM78D*$wNiuIdnoPi-mWabmY=GLsth~b ztSFN3z#U9${x)ULU^ZBP;~8dA2rdC?No`xNBn!}b1TYXxlh~-5=J2J6-xJ7g5s8f7 zTclx%2Emg@&%4?Kflk0)hVx2tV(T+Pv+CQH8_z{~au?|5*6c(7?y_V0<))`0uv&pdBo& z{dkI}jO>@-bBV85r{Io8v646qM=5PHy;2a{`Yx~wV3&LnyCxn&7cXQC=%KaW+O&29 zIklHq8@)>Ys~x^5wlOk#4zQ7tRuG(xAw5`wejo4Mbp6W&D$CT)rcv_~k z*Ihv)Jco9wA!@ILEsp89oUndqX;z2YF)Mnasj zGA-UlEM90l)p6O0k}7KKaIExvp`)>O9*mVI915jmyhe~nfw{-iZIRG?iuXak5PVAd zN#}_+Tg5A=rizQ)<-;Y0+605iJ$Gy_O!U2UZNl>|({*yoy|0DPr^R~F(Uv&{rJ_H# za6Rq}xJf)NN@SJXX1k{ltAw5PNSA=3Bo0Kuq>nrPFeTvkQ{Jp&H8k-*P(BU-Gn{)P zvEPh$zB6!L{Le^Y(Cx(zgiw;k=WMg<7S6_3{TgARog<&=1tbQZ7o=-8VBmaqtJXF| z=g^c@MMyq<-O_!z1lS14oDN{hy*CGj2SWw#RTr$dHUn5XA|w!ao7?uAci$sy-oYvi zZG>R~J3ggKdv=O(_EkC+Yximgt|4sqE{?(qALxyFgJnk;&B}%eQx|j7+-tisB1syk zj{vKqE|hr~RJP=Y{%z1#P#q;6N-R5#GYjc;Sua(;3jl|%&k)vK0Vnvines*<}c6BEBLUSOWqbF~o&A5^iOCP1#iK&(?`OK9_Z`PD51jPB%7ZUYj6=1q(Jdk7e!o-e z5zXi5hX~ymcj-q?VQG1LW{Lh$yAJnNXA*al{q@7xRffZf^doVV`b@7&4#b477O{y> zBJIiKF18m^{ZP#J4dCQ?{4mkvI8vU*54nVQWJ9R5%nUOXp^4y~*|r!6ZW-?$P_J1= zH{(K5_l=U50;CHq_-dAWHQ^|~N_O|_?Vzyy=`U6A_v(h651dbyoQwGld7PJ`$r-G5 z+o%Kgt#1bL)Gs_AuSR`3wFVQL$7|U1yv#YzQQgBY4LiO=4IQ=4fG(`~s8pPD17Jci z<%!ADdbXTKP%_3{TF$94gQhyS5~-VyN>2+7$vBu~zmCWKm}G#|j_^fj#w5~!=Sb(e`5ESnyqhB%Eop03z{l-gBOBiqq>(@j@KQ}%L zY5tZt^^?GV#sQ6KOyMN#*cE0JL87e^4_I(`_|NN-{M81w(BdeAI8%MWSsjErnX@EF z$0300Jt%l>pV;L~4_zavuJ++3i46;XE93yt(?pzs=<#{DH2EsK5V2Xt)$UBC*j^Bn zA|^hv+L1*GpXYQ7q`Ge<)7j*PRAYcNaRJ)3_;6DO`VvBLl(u3lCJWu^)EvXk;3#>z zIgv5YM+ilk44J)?M)JnVPaeDyrC-7>0tP=<3~$L)-5>dK^h(pd^j4gfckAfb&-|!W z$#C_WW6U4$VLL=mo#N2kKTj*vqH-jOmu3Vi)mV7ZEkL&sz^}hG#q-Y19+z_c&C=i3 zqNev)C8o%?mP7qn4VCWldT=HPcJ^8dHq*=S))~!0kP;;#QArE8$g{l-e{I6u)%~@~ z)MAU8I)Dz!_dV(joGC3u?;{Jr%Qm( z4}XE30Ddb=Kvv?(2!YsZOFRi0>d5ji!W?J1aFOoGN&TWVQ%EVq^}mCd2?#S>VRlLO zVvG9>%d55;c+_B!IjgKMr*gPc zci2`zcjj5fYha9mD=ODtrEOy{{&gX@F*tmH)MGFI9A<3>bl8c_GR2qFG9Dc~cb=(2 z$#CG^wzzCYB$oSw%i)Rned8P={c((B^Qp1EG77xeTgtpRRt{|M)6FYQWrT8ihxQ8$ zmk8}z8YEQNG`0KBzy3ap-i{w}7&jmiPnU6rb&fK~{OeXixX|sPSkJ4+wn?Z%;X z$BG_rBqb_v3D368j59GL8Pjxt>dk7o7_}C|+l_dRps;zp+%1u<7Rj?euXfHa%?wrq z-E3M%aKdSFOZl?9Bj3ty-$sOf``Q(<%h3N}&iJSWF>4cH;J%E}Mg#BTvVpDZpFt)w z0nVw(Dk&)}C<#*ovxW0Rzh)AcWWpy;z1`NdTS$&1e0v*O#LbFjQ=MO*>7(KEdd*cB ztoAta3wc%<98B%Ndh}+FqeY!F&Zcgmq$I1SZ6LyBS2pnvvxc=Y9qc@{__-!csrxho z2>?dK)+%P58m)d&lj?8NVbr?Nscn|^ST}Y*;?2w2Byt48WBdHM;(c!r`6>Y5-rrQo zk%FmaBzeb~<`H|r>+UA=Zivliar@lCSj#$&Kr$s`^AiC7Eenj-9pvCvQwT9%v}Y6N zNPK*X;8k=-nzjpT{|c{8pnKsYaDk{DwP*KiJN8oa6MvW@GUJ13hwQFvO52rUABSbb z!m=NP^n*yKzV6uJfMbm$=D`iDhpX(MGEg7|**0^_vRWbYoLc=^={ED_AdSwq#d~Z* zEYHU7SEI|&$BXBFv!Ps5!H}>1DT_lxJOHt_fbH;mM`_wgK|A_|Aba;Ct+C*mlwqs2 z`+S&$`GTxrEXbk661s?6hPth+lYM0J_`$?Al{q=?PZjx7;}w1I{$vYq)YnrwM8^Fd z(&{e;VxOc2IR9r1Tz78K!LEYNB1xh$|06eC0Bj@e6M3(BTC5YJ5^jY^d>R{Ic)R+s zQDBzKjr{LTUB3iZn$2)JoEvWT=Y<1#R>VFHW@JIq;FzX&13MdVfNBEPM)%!RtC7P40o3@z6%vZCY}%|ani-E7bZUQ* z6U-TB$juo`2A8}X_iiG!of0K+P`z*&nVuEP@%-kKgWscd$FU}(rm%T+seH0h#Q#>M z`SUorHfe|WsO-vOA3T~R@mYXi*kZOl1vA_Duh1z*f`SI{B!U8L1n8ITDx*qeDF!Mw zlvxmuJzMyBT+6cdh!D^Hv+y3_s+nya))Np!8&H|Xb$PZ;VSrT(7}{*JcdvVrlIEmM z;RT3h^GWGeWjj#5zm%q>$ee^nBrR77amgl2F2oTWBQ~M z&$?WkSm$}vHuuB?CigjG(4^NOI+cw^tqQNmI4U#i>`O?c@`4ZXW6;}sACOPLXoZ=2 zUi{)oi8qG3WYvHbmGc2Ze&_V@?>#jOBLtY%$fC-zA@UhD0oiKC>$F}>4~?r>Cze@b z_p!Id;f~PfjsBD2n(Ql}8=o4SCs%<9{x51AFgsD-NC8^4G6D9TlKQ&Dbg>^nn|Mu+ zN8_FzMGHKu*RW*)Ag)A(NSvPbnK9$|Z9nk6Z?~}9?d$Uk>eQR+w(qN`@7vQRFSlm@ zLqhMjuF3UvX7WNp68d4R=JE)rNqIBYRrc?-NdF)dLNRkTf?o!-(hxn{MElQ#>8co> zg8qIA5sjo+9}9%aC)l{wE`+&ON17UG!4P0ovpbcuK?=e|9N>rcp9Ej71_+zNZ39ex z9w_qj>RZmT*iHCC!JCL6#F{EmnBP%L`X`^XB>QgX#+{VYvA7a;to&uG(dtm!gTCw8 zwg_dl0!vk|WH@#n-Q2OMKj!~ zIYKHs0fZmuzT7083hAJbJ#RR}ejNU$z6ev$)eNn$%6aK`#Okud{sb@1Ecw7a!J>N^ zdfUGdy)e4l0uHmDr+Oe)_0;w3%c4{MyC^P^cHd!)4$dUyU+RURlZ`4Rb8@4NMhXpwto0k^zZaosy!3hIB=zxuSi*rcbPT^Hd^)0O8 zrDmavH%(v{awRN`ok{CN@^N!?!GJNXjN%`dDUib4X7yvvyvmm5ZCw1G9RA{p!|=PV8{@faFxt+2my9)>Rznht$>XZ__elvDB}Q=6B9`ri~pLn@5b-QLZj(37pl zPK$-t3&OzsRT=o_n3)>P!;a_5q=lUJV`G7I*$8ja=mA^Wo3SClmGn*YlMJzdhxy78 zsbu{xt`8dTDieA?Oem4X4{La7Uz((+XwZIKXrSL&FgF#%Fk$LRDaiFE&u+^;O`USq zZAS_n>WD3F`g2+QOc8s;7U{g9z{&#di)4Yp>fi4jZ)R3LbHE~&xCmpjIarmZ{{R;p z6uu9~Va6IPVy<~+SC%vdxgj*^zVz;MxZHzUpnUDvdw6c40rd0dP z=$3t|YajUdFZ5lG7S%{{fx)D`2aHNybkstcpMvO|#U8*oHkQDsq$2uhQKrH(3qDxm z?okI%vE?vfSpQKXM~Pd+-&Q`HLAH`vR*a`;k+E_DAMG#Y!Kru66FXH{D zQul=gs&IE&Rvo0hKcK+^Hhd?8+;ntoZ_YK-RoM$gsk80*zZ?;OTP~SD%KsRW4jb?H zXsaELy)WvnhZ|uNtx%a}U8V9(Gp6XlbUN(z**U%lF0%KC=}wM;SUzf*u{*sux=3Zn z85Q76bO-!EdT|>mvGM7XaoFsk|8D^lcy6Q%$CvF=!7vR%MOE~vf9L%KC_N^}qyvbF z{)naU6rQ9UcNW|Dkwfmz@k$eOVV}SD4PWxIJ&ZTTsyUt-X-X0crK! zdWAbMIm2)66sw|FpS_%n;!2;VcT4wIul0gdL@h@GzDoO0#1 zUtrekVm-9|mgt0!ZjrI7)VGfm#rPLN#Rz%CZNNtsz$g5SeXNb=O*aTBmctdcCbq=j z<=-=%^Ktr#CRt&i&GP2rOr5$SmbZcTN9R!_%`}8gf)VM*{YEQdtz*kGx|!F|*2lvmZn%k7dJs`5`8o;}F*0Pj);SHgEg5x5ck7v|Kdc%r(i}9~Vnm6GR za=-wSuGZLP%Z_#eoUJ?#mh1SToLtD=T=@nTHj4P+9C8YTsxaoyJ}qp7|9_`tb>{5w zeiFANbt{`-a+)`;y<$weI*0vepHJCeBC$4`5MQ?E80AT(LF|(`XtUTQro-2<$+F^L zgtLEbkLT>9jb>JxBBW?HGEEi_OIWW}p=zk)<{KwzS1o=&jE6y@{uBUIVGML?EWx8vrk$H%kBAN5?k!d>_6`C4`noM$nAPDD{5 z5r4R3w;OKd@z~Icy3!)Phe1@E;1nMRSw)TW{jd4Kq`tefG#r%K<__>4vAf;t`9fQb zhHnNEgh)7LfKSW1h6uMY@sYDLqmx=Wuq(Rt!x5YaXAo3}vIv$+sQr4|BVO2ViSltR zMMn9cYeKZb;MgUlV+6mLp4}>)O_hFG|0SM=B3yyfhmyrp1j8Fe#J}jY^p>?M!54gS z-`UOf(fas2{D54)ZIpVe>QbBp(tMpnZ2o>x+E8HDQ`bi$WblhHXX*;4eNe08aLWr58|0YqLMugw!tG6fiknmv;ppydRRutso(Jz@xi~&_d00 zc+t)veoyytm$(oYMXTET_8P)BzKua+i1-F*(p~cH zdWpc{Y0;Kg{g!IIEZswTT2z2M2n#l+JbOJ#V`*&*@#$%g3mI>UE;PAe1$C-nw3X8* ztoqzf!d#Ti=PM7AhiRT?B&R~e7*P%wvZSCBsXfRg(E9_Q6Nz%PR`?jZ!AHM}b$Ue+emwKd;mdS@HRb0LQ_KpA7J_R4B+p z`E?H7pyJpwj~Ao9(4@!FyhR-AN58;lS1EKq%Ep*ih4WxYl}>pjE(*NDk`nY7#<%>f zUN{g*f=i6kI04Q1JpFxL4-FiV`hEgM9lD!!2@jSak5L%_?sa{{+}y9GS_K!xevkwX zQhbNO-q|P_2p{O~FE=Y~(tQ3Ayh(b26yPC0kJ<2^^RPkt(qtdsL^Zw0i5cX8LXQg4 z42jw40A}n}vZuSG#Tzfc=i-pHtFGJv+6G25fQB-)EIq;vSpk!KhKl5WUw>HG#LfLc zw20w!-ZE-ft;rzUI(J{%`Pxd!$4be7HW?O?KGmy8I8R0#c$H@Fm4L7*)hf>@BwA^s z4Om?;{KR;~!w1%p&PDDTju5RP#IVD7xE@ko+89W$I%u6%h~eCHN#^==fw{r72e}3| z=Q0OOo$u~4v2~jODd>lyxFJd-!5^H2LIN$Gq=^z#y<@O2JkX|jY}>YN+qP}vIks)v zwr$(CZEN0dXJ@yjD%HP|AKg_+rPJx__UPf6PifEFo0#05l|!!bSJf$?_J|UYKM`l@ z9-T0(-*hl(**tyV_^h?7b1hkqqkKQx$`B}hx95WXFQZ}F*7%nR$XHy0no)YdENu(I zeC5sf#@{jJNPlL=?>jI;XTt}N^hXx{`?V8?GrmXK9^_Sv9Cn}PY8|AG#KW)LPt9~e zBbnu2kC}B=yy0&8cC684I+^wni>H#5Qj-Z}OBH{+iQ0{G&+9HMLq_~I$h%&5hzIan zyDUX@g7`9!^4Z#%kT>doHzX0N14EG(8&fLd6s##C8cNtK>~nUVLS}Yd2f7GPr)vdl z2W?}o#A{ZwCl-Ho6B3WotB#zW`D^onAs`g^p?oEAy1fq+fx%IU=^8X%;}`^E2HiF>TXD>WoGr__;16CkuGPuL^h7iSvNn`X&E(#XC*a_JQp~a zTGG$Y8(a011vC)~$2zoF$Pn`((w=%8I_33B$lR*q_ax3IUGZOswWU;Uu~|<*>CLXWwV+VL>(x zB0LkFGV?W;mYhu~=q@(02<3(`<&>dej<{w5urBCqzq!+QGWxuN2MJKc^6X5hnw*)%NC34D`PVfMvO# zf=JB3QPk$V?0RGxdODpX1A2r0GQ>xzD*PwI$j}M2y2J?mt2Kg z<8@O%;g!5as*=;NdihG{E+nN6ZSbl5k@hQ08f1QDFy6H~*gl=O!Ofq#T;tT9@Y z0}@E~=h_rxvvtq;)7+^-|8TtEsJXc>7ey3sqLnyNbSg5OU3aKn$WK}hgUe|nbg&6e zCtYYgoJZk-QWXU^Ou7YmID8zJmSqPSvvh9Lj9UktVVEnT57CF2MqtOY*C1rS)R*M? zPg+2i6X?4e(!ls92qQtiP}a*kT&3%i-xb^Fex5bB6%|z828e7Y5&5uCVz;J2#pg%g z!7GdbEWf_w5&hfFFP~l2za_Viuq`4YZF=se?n?bQ58zaD@)yrWdAvqNG_00k;T3Y9VENi1~ISk7s-JNh|R z95R0R`*7`&n}k@EyAp-Kr`R>7Gz@($%ScnPza7D9X9=|)7D(4P+6{f)k3o-ezQ;_J z!j+V6nFFyQ2>hlW2x*~>C;{QX=nb4{G9#$zk+C2#mq_djZHMXWX@KXh$qjS2aPsYp zAo1oRg3X9@{PAR#=m;e>JJHc#U~{q@!lAk$Vy(WOk`kV;pEHa9L&8k%BrfULC@Ul| z9UJKCTV^?U0u?zZniGafP@p<$n0GN5zijiZ%yo06o8r=6toe0|6u3FTe`s*ahp~NF z>|(TF+5?o>H<>z*117b(nU^FH_yaL@GOsobICr zM%m62iXmBsUut8IWG2mSOFB4s5VzDh*i@s%y`*hjhD=ZK@poxzl z&Yz1Ww3YBJJI-_oilUEr$`?;J7Wtv`^Z z$y(&~TkHO#70POT9|=asNl?AZ?mK|pqFJOWkSguoBc0PRG8|5G)wSf#PN@m7zebAr= zB}W_FD5+TLy%yEn8^Q~XU*+8Od~ZHYpQmy7bFzJ=5+WYZFcbp`pG@BP;{!;d<3qj_IYuVGQMB&!w7bu2D|zVWuJB@+k0 z*APBQHa@;Oe3dBb%0Jn=EEv^gqkj~feU>|UHPr-q$7lPaP4pkkCIR|R{ip5XJ-tCY zlk7({>dzA_AJQ7W9h{PlHafN<(ef?BfoUe`YxS<>9LX5|_5h*;Bt6hAKkJ{S9PVMH zlflIWLcTc5;CxZN?>|FmTRWwf^c`=<1v7!5oQQefsqO;1Z<qQJ4ACej75?qfgWaMiX&harE=V zSYd>S)0{+5iPNJEP1qWpgq}0E2gm3^a7<4`hzmy9Cd#dms03SGhzS*h_2~9M_$r7F z|BBT;Eq+JD0)TZ+r{>E$Z-n97$R%CPO-%9Nuww zk86Oz$Ek?h1Htj!Eh`M5rK8WB#AB5S8x<@}vcF)vXVr62J3#}P{Le#LNn)N-L9n!a zUOGKz-&5iKSi+KjKcibIOP7vN3}y48umks0Oo6Nq<64AG8IR9BL4c9yuyF!; z_5lx)md!3FU^{3_Gl&N*MOY{3Vrvvhju+y@`b%l_-1;7u_2$GIZv&_bh+`&GFbH-- zC_h0VhGHjW%>7%WFSBWNx2trV8IJujO(Z41pY5khy^rx_S0v2K#N+6Jly`byd=M@1 zw6xaqK?8yk*n&(rAsz=*pJdl90iW!c;Abpa)GR(ByPqR zcS~{$q4*pXXR&6Fke5@%KVwwHx>h>Nv<{tcu1Drjtpol0_V4Qm$1%A_rtJIoVj4tc zl|%uDonxfqdh`fghRgx@&qrJHb-#yjOro{u;?)YNcwA|s58w9HYsx_KO&8hz00`W& z(zp|lp9UYdX9wHdPX41j_+qhs|G@d><@buOv@*U}fWEt_et&7roz2TXE##f;g+1N+ z-znEgrdzwTbR$Rd{&)?NIDmzQ7B9Q|O+blN!qge>@qK%2!5R$L4CLm4TAx&HY0oej zJ|m;_2)&Dz`3SH<^T>^--a!*}BY=#5bX zHS?;09X)Z$)oNmeEP^T?H7X}#9AvvQ`#~nl$RGOJe3Zu7AjQkhqOr?JHos-2TP#U2 zvAPkON|AoD_3=e|Vtj2cD$7p#WA_LlHS>Q%Q>}~=Q3Q#n)Z{0+Xc-3uzMEc1-qtF- zx0HLx(JR9)vd3$OE3xAxEWq%*fDVON$UZQNbVa_4&b)>bMno zQ{N7#Ob@5|S8T>Rvly&hvCPaGkkn(VZ=)W#$@^IA1ge!YvJI$1Ds~PeYvlZCaefV*fuNbt(5rz#CUxWS4D z=O74>W^55^1Du0jw>x~WD|5vH|IoB!OL$ugs+%K^G?vIvr$qPdt5u}HSD)Q5Jm{~gDM=X8a*n6c*)D-1Rn6~2lL06x zbZnpcIEmP#2$TYKGq5<21iu7K%FqMy#eSfK!=X3paIw+C!iI*oiY=-S&YIBgAapy4 zrZ1Z7R?KBI!DW?LWEwK$QC~7?d>gC;lyy5({u$f=i{21b^(n}QZ3?|-8jnm?EN?KE zr!wt&vWIX1-mFhc5>_Xhk!A;L5ZXD;w&vR94|*9{W4Db^d2G(cWM$c$2{#>hY8rUAe-+4f7FhXi4( zH1FnMG9@FjB*AAp?OAOejgWe!!H{t(8F9m*g-df4gwt6YPp4Fu#Dm?qU?n|=aS0A@ zCi83HJI4v#o3jujk4~bHFH^4i5+Ub*dM@HLFR_j6%E1_XO+*-QwVvO_P$5%B!$IM+rVqI{_@|cJYxOaOs&1X zbNTq zX!bm(>Ilsr=oN>e8w)*s2i4GRD!>Xa=`vI6aF1wc6hUl(Ipzlc{RRO!J4rtl^nLoj z$4wqO^9FqF0~|bIBx4{w{hFl?jew)I8CQSvqPm_K+P;00rjf%#@j{|`5J!ps{zcJOq3?$ z?KA}n#?*JS1cNXQ`j4~iXM|rib+oV?f-HWX1KoTa=tLN z{nXtWHWq;(F(BaR`&uzGaQueGpK9KZzq)+k%f zO3e7TWR0uckRJ9GAl%saZRHSh55&z*WTit%cCRyJx+bszKM@M96`|R<*I5%p*uV41 zV=xo!oPFO_gnyIo+}g5e}o4pVTfdlKAF%@a1; z5*q#Szh9pIg34`uRSn_}Jygey*fd)lM5{ zuvM-q)vDfK{iu_7DUkzKVuJ#2>s_yJ9`)7-wa)=gH5=ccVEJnMI?5!%uu@RvkOT%h zq6yHGxi^8CbMW8i#3Sq>wmWD*Vui-EeQbs1ZKc1=3Icv70$HXh(+klSa6zZ?KNP;I z{FQ;?Fk9ZZc)7Wl(*zweEc5;i?u{~I$%8WQG+_lvjg2Q~g3@*VED`n^tnr3~C3Q|}7gg!b zDaAg*w0>S$`48i1FU1l0J-bT?_?0E$qUP)jLTy7`M(oWbweST^x$59HXP&-M!wXVn zieu_-gh&Hr^AIr5rG?;SqBz3P>NG3uyCKh5GrL1u zbx4l5<(6=frhP2G*lUP7S>n8`>Bt{mpwLt4D}^m9@T$bVi8dp>4kf`kS{`CV6MNOuh}s? zlho;poD@1tRIUk#`@w@z@1VDPu0kVqTC+^rS(tS_qisewM3TyL^#}aE{g=c;LY?RU z?%(0peqk7vNlD*f+zAtBJSAm}bt?nd^bM);FH=iA<(>0}5UfjEP*lO_jevD)WIkR= zoHLdQz3Md%DZk5^+Iw5vrj?T63A#wGNb;rb_a}a z`gXA>=4lAQrx_l^#&GF_e`Jbi70AkBLzsl>{zh7te1T@|sBcd5=fGH5fcB}15>u!g z>yt!4S>C!b;WA+duMekx6u}-h#@JZemAcz-h=nbf+szb-S0~FQt~bYA7WqVgFNd7p zomLR2XT*ZxX~9y4Ofv~{>R1B;bV~qhv2P9$=lQjXZI=J8+uj(PPIDrLTop-kaP7f# zf5Sr_(F0CvSl*Lh(uY-m^7SpT-F7A;n9sfHVOT@spJpu?aMO#W7=e$Ry#GtS0_XS!J1Rv^zQoKLbL|eXf#@fdSwNjZA5Th*aH_7lXb5)OTBG~L7-e-7_%#0+IS@0aSptHQtPUtFqP>t zZLc`P1~ru7YrqYzv9I`jlSNXn4K1Bm0_tx&-?)rZTH)LdB#!sPI&fcz>+g_(=byoK zR2|)4AWTEdSNW`TduTEZ_x94Z=hh{psi|ZNE^FYQPpo8^wlet_<}2h=Jm01Yu{ibu z7!5U|_PbKd4P*?LBjA(SV#40Y7xSWJHB9pn?@do+5`Ju2oWi>RI1JD?H6cEhfE@4p zu2n9l1|lWbsfQd~0iml`TKZn74GsyrA)|w=+*yG0V%xrhhgAjQp-76I%8CbCp?!4!N3@t@c`WMt(jpTnKU2%=pRYHWx+rAR?@&mYd9 ziYQrR)4>V=yA=cen0wcCO!@jxFHbNQS?V8dcX#t3n+xrwrD%S4O)fg3)^muaeXSPB zH_YO_y|I<9sjlv1^Y>-~6(>q$$0K zMi*4>f8U=^v>77mj?38Yq^vO-6mhw%i0AUPB4*dU?5Y zczlh^fkHReSG537O5K zM05*!!ovt)cASuoO%3OSMl9&kz?7Dbst;7p%A>nZmZE|1ZhI%tIOUU+H5Z>=8ACvQ zdUvog4yZJGUPogkFe#BP^4^^2`!OBQL0>_k;4{`@(|9H`M zp^_NWxrblBM#eB2%diU+@VJOYP<{ zeFn5SRC2Ara*Io=U5WqTm(EHN9O7(P0_00vj{Rr->QIA%wkVPy-zaW0q%vJNUr)KF zI6PJQ3wu8dK9Jw~b?CS))DM7jOVK#5>X2KP^R^sLeXng;qrIu;mj1P3PQTECU4103 zoNTnwJZr2{@P=n6gYBt;g-YawhNC;9J$sswRU;8U0GB$brm3@Ius%`(D@=8L2>#81T?~7vmpfZUhlt-2V2`4@GK&i=<7>!m7I3iQkYnOjP%w@n)&(clf*2 z#oLe~!D(Rwu?qey8*?Z>YJcP>RdS@cZ+A^aWx#w0Z-??0S)d3$jfQJWONlHf0pukv z0tD`9)T`EY8Fkq<;r7#WlJHH--?-`t{FjwsyN?}iGiNrkBoAKq5RpZN!TG!W2h~(P zy$F3P-S<5;V^OqG-&@vSkUh_`>`;tI_65W=L*i~Tm*KQb@gO&!IbP0pK-K4vQq+wQ zFL+WBUX)>MCXoksr>CnO+u3daI)+Fp0JDG3V-}F_p^@wHx~{?YT799o(8*X zdow5Qp3!jV(xqkRf%dLm4B>8AIA&%l=s8v`sAd`?D4NU2r7CI@koKS1pUzchSD zj-|b);3S-=pP+pE{UI7Z#og1ULPvx!(zMtgN1!h%{kDn598i@>LRmhXTU6*(IGDCP z+dBAx2l(o}bPfDt;({ra-}TAc6m0DNK#7eQrSsiC^Zdz41F*KJZI8kSA6coBq1+r%|w%6N*6dIs#V-I z9d59tbr)+bMN*4s{mTTyl>$!F*h>rKxM8Cfmx}Wj*mQ-fA-#?F{sD`7o|HQJ_}99| z*w0Ireje3gn66?D2nVpXR^gO}G@tFI=;H5!?CEY<$bI9eW4b+5TZ7oq2)AtcPS(#aBP;q~$MD2f?lV`=bFbQYN~veJK%2)su<5M)2%+JLZ$ z^P$Ch++<6(wP!LuX{8=4oh@xdy0h-Gq82y^5F0dvH~2B;9}-bW9FcDq78=E^e+0iS z(u{`eta2P#On_KX{#=%9IP2%_@4z1uxa6eK`)PYUy+xUBe4G+=Z!t+%sfq(#s5{ zf-t{)rfsnCJZ2j)i3pMxm&r5k4o5kWhd6L8FefprzIsK8uhlko!_V4M`26|kv~KS} z9^egWnwia%*fvvC{aeT(epVwIWRZT9&Ux(T8GCaYoug(2Wg+^32CSCF;qN@JOb%7| z_uaT8-V>}))c?LK0o0zshKgt^npRY!+tx@3c?0Tf<1LB$I&2xq4x;=d2>t51O%i7A z0cbo#!M%vP6yG+Va*F$;&b_0J+|0$VT-9`3CnQFYBz8|M&HAF0wPJvgs%zO)9<>Ru z-dFmm*=S%F;(~h8uO&7i`PytOMSNAw!$EV_Oy?B-u`=&%p zJ;Un%IX)U&Q4*R@aqGp>Rd0Ue=V)_bS~hA?C*vs&Yn&9!OS$qGP!2~J9Q-8MXGuC~ zlkbJOfuvS09i)(dGUnh7UA~=o_NR-@fHr$@S~n?H1$&KIJMZ-ggN-sRr*z(K>Furz z_u7;@k2+t9azFV%2?2|oeKxJNC^L6g-$$hu-zI31IfDaB%*Mzx9#hG^!SJl@ma)|l zj{`}QaNtnOdZ~f)+Lwsdmg^tiOK956v)5y78Ml2KqqewS7bcDoi!rNHs;;Jgwm)@e zd7m1Aalq6EWf$5GUSX!N`TjfqN?zyHyopsWKMR_-kL|5s;G6VUIDfo=Y~4oq zl(;h^Yj1uX6lv34^2yJbhBQb!&#Z8p(7CeOr+8zTLf?}?SaG>uc-}qIvI{xK@1d!o zGA>lC-Q+$dPp=Xu?WKWbj$=HPl**W{9{WGB_It^Q#3MVl)8D)?Sl(TDQ1wIX>{0ltWp3ysal6iG@**wuf=S=pi&iPdI}hhp z7tx-Vyb%G{Ubr81!yl$B`Rh;U99+PQQ$>0nR;btq@8XLexe4`6%MQUPs8O(k={kv+ z)=IN)DH0ofarB34EnDr1U*9Ioe2ARF?NQ<#i#rKE09^?yc@*HZRlhaehLP7#{k}(% zaSionu5NSJY)V1KT!R*1$V7A#WSS0r%{_hT(rgu78VpVjHMj`nTnD-DAM}X(Klg5m z53hk@{f*}<{@dNIZJEicS`b}sm>h$V&Y!RoQ>*G8Q$YfpzrGOCcl|m5g&r%*MHVT4i^5VX)`)sv9Q%9C%h)IOEfw1sI2@p5B1zcY z{eb?End53sN0>cpt5PVl&c*cBjaacoz<3;|MnloZid(`Aqhfec$0*I^V!EDiJsmUk0K5sBLM|kf4%wuOsww>6kcI6_7VJ*-Hz&cr z^!`gk0LsjkNr^w!*I?wA@Xl_6b;Mr0UXo5F;~E<0Dw}?LLnUXBTdRlJJB{adzxIt= zJEQ#eQdO#p}9 z=t2{|h+~oMWZkChkMo090;s;?*dw!|fSg3I3*~4g6rRt0(1rcXcD62EifCPoBn&ZG zX&k+&FGo({_;<2>DNziRidGbj0$h<^sRyvr^uwir;6TWg$}?8a?UGR55&rdyn%H{6 zx9(fqvcX-T&4`X;Lc#J|G~^jade1+1?0^!i{n5&>1r6b{2)r1b6;iZo0}TjG-ZVwh zRKDxGMNBPFE?JmJg=3*(B_?evRlWr zzC#gS)jr=E<8$Ws>`&ym_~zXX15)!H8sjSK%k#?H^e^O9>1Gg}K0h@gJn;txu1hqT zt;DL6Sk>eC4@j>80(nm)u6jzx*-36!gz z*#f6bu1(@nv_GSjf}x)Y;lYCUh=0LCa66=_Q7qs(rLQ^!YR6zakAR0b!EvX3UU#}o zMv?!+Y>V_*mIz6`Jme9)v8U-C`!&#Tw{Y4(H&% z+6h#r`Xv7ZN8Y9^rqRQK2bn@}6Ry{v*No`(n4)xCht;3hpg;6S=&~6-HJCnf_zyYA zq`<-z2V|X%9nco!u=b5BerfG;9VttX9C)ymfQQZVp9CdQaii`J)g3~`1*c}<0uuyP z5LjhMjRjVG=np|26lNlAK>}fU%|jZd{DgfX#nO)%p;4FeYVysqRb3@FYIDVXSfU?K zI{0?-Fil5hL*osy9?c0B^e4*#o}>iKsx!xW>)_3}87kF99K)0gv@S@lX_I!lmmCCE z;}Ow3CN_`!s&-mTUTcz`c<9fiKl@0?8%w#Efr1Vm^6;c|I~LCo;fhm+VVxp(=_2N! z$be^{|BX*S@wK~|^rLs-U_)ed6dzpYM;~re*j5UWajPE;mDd}&mlQ!l z&=#Ij!j0>XxAG;^cy@N)Csv;2XLQO&T{Z`Lzy3#+d5Tpp^TRvWsp@UR_NdC#j)JDz z=Dud4k?K;oV^06l)rNz$Y25JHf@@=Tp@@s{QM&PZ>^d0)bec;|$=SvRrmFuo4v?l? zBIVYVRPjno>`*jMq$swZO=hw6Pf~OAS`*Agk(QpFRWRXBY^1^3&T{B0m-jBq@7vYM zql%X7D8xD>eE+eOtc{z-uyneEUzXvu6$Wp9y*(ZZ={g<30U;f>J zlzh36k5ImS@%*13>8FaDD@*)RXeXyYzab&|DD^GZ8hk$kH?6@pwOy}$*6GLpF|ER~ zlNzFbex0f)Q{BEQ2#^#HFBmCXg38_%z-E8m$8-{cdq1yBOqVAgJM4nWO$w?f7 zD}m~lH^FPq0yvIE&fbwD}Xi(vZow?=>_ z8p(W{0fC<{bU;*)Rrw|Gyh@<{|5vQ~ zgzJOUBJHmNj0))+p@jO(#qnf&6`^imn3Vr-y%EeI7x7BqE zh{hN+;-=scul)M{KIErjnbVhO)&l>}%%fi(c~FSvkvG2jO5!bU5dq=@Z(&357BFB) zaH`q0@fxNR{(7*IgQztvMSbl9!4bdxfrd!}7!tTtMt4s8*K>f1hb{CL`pli{lIz>VR27`>t%y*b7kKlN3p(9mgAY2|542evqh zCzQb8pzVM)0RztJdJP3BX=Txi$`y{3y;LiP<8E__UN_y{e&mXuQ>%0bexsL2F&X*U zQFQ4=?P&dF+Sz%L59OyDdaYj_dx;%}8+pafo?av4`RM9g8KXh2tzNQhYih(d&b|CF zd!Gdk-~r|(FsPch`jzz0ou$_UcSa?`rCfv1BKNqSC!g}PE%`sgHS_x=>zfk(umbS= zo2_>%c%M4Ip#r@x&xBvJviqH?n`hZyytKR_^A6vIKilTMgH_bmOZ*%0pPmMNd!wbx zHjfv)KXBnccNcK*A=7Wxpm$G{KXAW4!)hG$W#}(U{dZUWZx-&?0^i;BySBLK8TOT%_V_P4!3pEAYq&mlt`-%=s+eQ~-CJ|OXGzvoQXW`Z#FtR$?5OIyj*9=OYNwL>``ZC;)v)S@B z__owX`x&g zr>KhtUv`h>*YL$Re85^>(KdZ+;bhh?4@=}xV@u#8UL0GmGLBqgYolJ$Sj!0yp*dN3 zXNGgL2lgYpL%VW_q zF^fpFh}A(3nmB0I9sN?PZy%|Vy@RZIPSmmQ)JXMiI@}T(QN`vXQD~o}GKaR(7B&;n z?J37NDZdDG7Z(c;!2Kk1O?I3PGgJ_~4>v)}B_t3LuQ8_1;TS?iwN9Du!GF-co@ zDpLQju&K!iPzfiPJb(B@{xM$1-$F$=GIDYG!y6aCq+!~qB_=)&ddg*5W4HK|?4lhb zp(RT8$y<;lG!x7c09c6(G%_Vij@~**xw5z~qdFb)6|Y+R-L7LFN1Sg08Yui9D*Gu! zS8Ay#USC44c$Hcv^=ZbC5-l%qXd}{?^@i~DsOXNY_e_}h)bk&d$y{<|-hxD^#xHTQ zwol}1oH~Rma`ru5O^tjNvDVw5UkQaT?l!`U8IG$UbiNTiYcdAVu{fTp1oVcQV zx1ZD@kM)bve#ai0pGo^I6x8Ln=9U+u$v+03eIbUs?zmha?FpW--Oj1~sKT<9nRk&b z1n3Q&oAZKl)!cuM4>N>(SOAk{C=1|7jOm4+%-thV^_|@Ai)LqwM|{mPf>Yo1^L_UP ztb=R*JgGc-)p+(mJA)hj^Oy84=iX?2hD{z})AcD$NuZkS4w2k3Ra9!JL~9_0S^V8~ zsE{4M(|LLOlt}A*hml{ayAe{ zGVMiA6{cv4|Ia8$17p&Wc=}Wc&r7e2ny8hBPLAJb98w2DCP+~|IgI{%joe4Nkik~~ z`iA?8W)wC5vx^)4te|*p2_)X7dGy!K3cr39t!@4Ko}LqDyM0}nj<)NRaiqwwkpv;X zcz{(Ipw-#`SM1OFq`09+dr=P0MuHe5D5k2Tq6Vpw>01mFlf=SXL;>`DmtWw z4GYa_6u()|&jQw>h`iqi_nV#~?5q4>h6oy@siy$9@rDu1GsCYD4!70&9rthUhhke1 zzy4z?H;afi!C#DcUVgu`7J*5_IYsM2CG!DZL_I~|24?;km*Sgn)iV++>V`0N{9OOh zj5M*`txX*ehOCiT+X3RkNsX_w0%28lxmtXt*j_C98@PS!j^f)^er(*ohI>}7EHPu1 ztG@&(C?m2K{v@;vFL%Sr(OJ$ix?`htGr^388Vse;hf)iB;8AI0^62NS;h~95{CmH< zRfI&hJBLAcBjtGcKIZ1m6PXS+qtcDfC=c2~$Ul&Zr0%P`V6zjJj+$3a3ItbFkA%@H zc}hy$1!dJFx6*C>ZsEwTn%+X4hO*ugn#O7>?5u)5l%mCTHJ?h{4-TZ){ayJ`7>d|U z$Z&ILkFVk+OD@!@jp;ZI^%mhXwc_MnxChOzR7oN?TY3sb@@ciSo}BO^mqnfRFogpA zcm6|>Xw)vcn?Q4JQKr3J;C=}W!e0-yRpkM^!?k#O9^IYf=o6=cTCNv=2?*iS5$Bdk zFI8wuwcnxG?FPV+U&)0NPc32j$@hqlLQL!VZF0~L;`;o(wA2)x{JOL~cm1ME@=tD3 z`U-*DL%C;1#{T=lx!AEkTy8}$t%z)i&h(? z4(D++ZYcV?85MuX1@#z!^+E*Hv-pzyje3lTnghM*zx+jup&selATX zgNZ++g>k~$V$a?z#7&PsWlf%NdtbJEb+@nQ*3%sRZK@Ag?ap^ZIZ|SS$R%%y**F97n*OIfh7(TC6Unn3(pD{7o zrr3%>sZ7Ik)1F%xRK(pFb8uY^oBXf{vl^N9cHqfw5&K5LFv^0cEf{Mv=TLzoc>Lb7 z7q**LXD=&=(kvQP(_V7p0;?Ygb{htBu`Gp1(jGOURZK?{-%F^}bF|@>%jJls+t*cB z*MJh1zjyw_&2CTF%rGX!0L0zOrerj_V7st`Rjbu zywAC{G`ktcin2|Unr4aX<`lc=DsDg=@XRP{#|ObhKd(3L_-J{J8G-nHbMp>}>c|t%jyrenIfr>f?=(+z?xX9O`+W{9#U!gLH zEuJR_!4p1gm-{>M*3DvxR1Dz91Pg2n%n-U`4S|sdL&klD*3_?I+!e`nhEtEvMGXOs zz#!2`B!eY>HH3L(bYf|Km>y!?(7{$rmvO59m{Fy?0WvtWj8T^~frxmM%lcIg|EF-8 zm9H>`J%|Kj%B1TSq041f#H?Ilw-v038E@UX5I+<3FlEP-H6-^`9w{HT<`5}cfon$5 zhh4|jgo$r9k~rg0{uRQ3Q;0v%dtta>@m%nTW25L6AgtRdP;x9oN=d1dJ&hHkYuZfCZhgQ6g?HsPudm}d?FRkv{M$X z@0@D|MAPmfz1vaD1q^T^yA%Ft8*2P<|Bf^@AUWujiq$0x*e;R{p>c$x5N2iS{_Zv! znD_`J8QT~0eBx~i>@TVIl8K4|PJN?j%<1s>y`U=k4 z`Qg-fdS(58-Yje#&6{?0t0rzcIoI{egK0c^L4Iyh62+#3h=Sx4PC3lxuyLVBi zuBVsU{_Y_U3+rM24tkQly?^*q&3o^$&piE)c}@6G^m^FaHCk_xGRml?*c`-)Ysgc1TvMieY zd1qgL`m;=@sp>LwJjd^4ZEVrt?6N7l!aILHhDLdmBMsi|k~E(v_t&t1q;|*CMa(L@ z(`F(GravgO$E8Gt?Pe5P5k(zA3oT!T89LnRdm5-8X(XAOiUK#pcq(Srk4W%v z$+7Izgvns-(BDXKbP&tG^dwK^5-E0$dw2kH7vOt>FOvbDH}lF1O_+Uuek*TXF}|Z> zQ1WGw`o9qK53|N1w->*GOzRG|!atWO3I}WLG{G};BQ{vDUPq|K5a=5z-_}MySC3Xc z(lb5OD3&Q|HJMVd^k{Z0i#6rZ*M2yD1b zT++lc~6yZD*mi8pY3TC75|Zf8Vwvh z`=V3M2|w-|LT(D+DkWj6Zv{ll_DgA$;k6S=KCS#|3{g@)poGS8PipGSUts=bA&G;6 z-93oZAn+h=U*2daom2*HI)=5NtJiWrB3hNxXM<(4RviWdPRG65HDzqecc+aP5-d<; zBagC))mC@KtadYIQpeE_I%Ehzupol+0EYA3&1w{w7tXToc3SqNN}4x=GDNoVUZFjQ zdFBqcy;EDfuafluen9;%0D(Y$zo$ePa>(bvI8oNY1xSwKu~SIxnT7`tyNGpr`dT`P zLYdP|^@B#wFphMK%;eqYV&AR{B-Ak>1O2HQyGl%n0VgYzDvT#LyRj&V0It3-(0-vx z5I2cys`P@#tjBTVEm!t*!A`=S3`!9g*OUBpihf5xAiJq+(i_`Sd>^5d#HfaV{ zlN7`?4GvffgxU1IAGr@`mQXNaCC3rygk z0TgCt1LGm+HI<+bscXhax67O-nIaW@v@Ho`X|O*lHwi)i2ojfR8S7OOHl%?uE4+yT zxGh?+BwLw_4U!3^mS# zT|FS~mNI~sKl}KsnY9?WxZH#J&{hQ-CFSb?O)a$fULW%(U~di4zuF0~*lac-{f3#0 z1@O~WBBIst%Bj`IRSy_ynWcJugz0*Nb!y)i{#U8!t#w@yWOEk-wgh}7oWAQV)Z;Rh z@)JU=K+XU*h1aIh4&-;}rmgI>UyXNtxe-#)SQ!p!lEiBey0?%IH4opFLY@LGQ4aC3 zdQI}X6h=K*_9h8Jl-dstORwxyE_K;^9>GNM4Mfs*a#hzU$(>`Rr7kn_VuGRMBRV}f zBVmLAbJoA*$g^-weQPS2!9Gz@1Fep&!~bSxkQ-XDd3X531O|-RpZUesE+DZ9Jl_M( zCxoliSRtL0a-84v$@{I{y7GY-v}>*V!K0AD{8Hl(Y_)4M&x4tKZj*pSZ zJ=y-%>jp;9rTKGqt8~UCuw!mZyubf?-pHQ2<%h-gEyq(g6!+&`Mz(P=fJPh`Np-`KVXbLQ11EBhss_~ z&HJSoP}GQ|j6PEJ_PEoSrX1O@t`n{F#+1IcmsZm1+i#gm?%;1g;}9r!=GtWd^>mvq zy1J^96{ch6N!qS3oy8Bz*n{ucO^>>e)YAY{=KnmazzL&_Mb=$@o?;6c1H4f%LOQn60t~V3u~oIwD*y%Ch%O zF%6gxug2neK(;~UGY8FYxGUSZcc9t~k)+?rV%(1r7L%yueM^GrO?Dn6xHlS=rGf-o z7$7{^?!Rc`Z7D_g6$4w|ADh;`O?q{*Sn^UR}1=MFZF9zDnm;WUaC z{N>fsN4|7`q$i6cPLrL$@*YQ8G5=EA0zttW6wL>~S87SpcarQqGSly`BK*Y_;Tjd(7-o{4U$+i&;afcQzLcU+}dsHh44%)(mxg(O~;!A zmt#INKVWG0A#^1`rnmW`!G#=#FP-i!{xsD}ziE;9>1%i&9j0YFZ^>B_ijcS#w1{5< zxV%65@!d>FldLbgU7Z1|o`_OR78fJJFR(J8)i;=+fiBLM9NQy98*pwLiWH^HA)BM} zlH^P15CArH0DP`M??ZIvoE_AASZXxogi&PUL{UQ%^%KHv}mr%Tk{CsO_{Ay-;^Q6#047MTCnN;xq*!Yc?VWF!hk2GdoW4|jq*jPmcQsKa z++#@MRO?PXlYr8B4mST6v3ufm+8(m?l+1i&KQu&U8~R!A0?SyiwB^#YP>sH`37MpV zSSEf9k!a+!qeRX?_6f6#7ZzrjK6n?;X?5QqG|>ZTXmCgDNgsJ*ps{is=v_okya?Ye zRJoS|WaH{1PA=AeyC%74-4VF9$l#Ak8cN-|uQ!WxrkITanSR$e1P}LMrwz2royY7t zAr1o&S7odY#*e5StFE}MT-R9D76ySVFgBossS1gVUDJj;*Rj>FqzII`ujiU0Vd=4J zAG3Pe9g4#t(G-Cn?Ohcna;2eA@Ht9;*HF!fx!(UeeH;N3MPa(`^7SrXY&m^etD(3` zU{O}Jnw5mf3#_jNr!`P4q`KqKr{=Lmo@AmVohaoLK~DM>+nK#)qq6JaO|G-?Y>sJR={*I7rU zNrrA@rVfd!rD({Is#LoYtX%j7LP?<~g}bdQb8Vb6eH5B_gYacb4c?C?)r#Bb*~vp+ zPO@a46S%__qPf8oGZ71guaHSp7f_$ef#NI(<5b^kc7fy1V$E>7{PXr_QU7ZPl(%la z11qoCb>z^oCO`qiF}hOU3ph0AB|pt8s9uPN5@IL*r5Z4m$Kz;5e8V9@h5>;mZuTkTV}E zvKDwqn3kkA4YJv*?+cv^c8@nE(kD9KBY-^re}NXVsxwE$9_*oKQ(orNWBS+)SAC6Z zapQ0}D~!Yo)b&{5#1c2%;wo>@KOhWrAk-2BG1y6Qs+HiSf;mOp1SbUQ4^~3^Rj39R zrz%rGhp)Ps7!8BVmP^Pgs$zNaCuwifci2El(ztwEe2T?Lsv-6pKU-|f5&vb-;=I09 z=G5Wr-2ye5SUnb@`ghq9e&+O^X0cNaDpY(R;sy=r*O|dskT|{P_;0g^ESDFME-<*n z=R7lmSK=OZ~{*?|uLz^0qgrvg%0I|DY_U?U@MSTOg6ix}F6Qwx_Yc7~_0fU)HN8SMY z=Zn**&gw5#lXqU3QS+(( zb3g_)03-wN9|4{gtCqzw`68(cPbUGcm~83XbnZC9$>NFd!&Xp}nlae{W0t~6^ z|3ZR6fLxJ~bLr=f-d(v0^IKx!6LZzEF6G8itDx=I`~3&FTyWUb=(30Kso{cX6@8>y zNg@!o`~BfK|8pr`sJhYXF_#Osz0PB78H4P1tgtQGk`-$WpokkaO7SK0ju$s~k#T3V z$!)rDVHDat=XG|ngH=P{GxGrKxg|lxhB@WJNxjU|REhKrSr4V1kbRD|-R>@=v0 zCK#tq=ZH$ZiCYgqKg5g1)j4^?+rMj6pttK`ZN=ra#G+e9P-&vKD<&As=fuIomobLL zv=Y!s`hQ=CUSq8x&}-n=uGn~$yHR%Xyp2$$;2Rb3UF~iH`jw2v6V#YFtt6X zFEygf;_ht+h}a_ta98LBoEL5tmHtaHcWtRTRK{}OEWeLu^b=2uBF-!Y%k5gy#sF|rQ2Ptmg=Js1y2m8u(Y@%FJaY+!D`qKT(d7}S4&5nT8@zNu% z30Pcg8H6qu&;j09&4Qo&mB^eu@`tzUW>(&a7lxGQz#eJj4vBa*{W@30DNIX_aa8P2 zXQ)J~EX{Y97*z!Q&s82FgjA@A3zp{QH9}F7=|NTsf2SCfKBBJs|6+5X%S;skG$EAX zDB~q{rD`_pM^o2D!#eX*?u@nJfWjcTqRco=Uf==e!X^A|!J~*%L z#?VElMrvlXfKG^0ZHo=(IY@Kb1jJ99;d7EY*P_Ltij1d-sPP)kO53$KYWw6iH2E*0 zi#hWW>nZ@Ew&08BYmq-g#V=WrL^{!zBp~*>SMBv+x6UdrEk5oOUHEEW8rh__n~^cH z1(hliWj`+Bp4a_`XEbk$q3u|s;!p)%*Io+%8y5iLBv$Zn-tBeUjw!gj3TKYY<6?2y-U-JgMA+j4R5)H%_)N-O53` zEk^?pCjt-~$w0g*Os7bZ4^~LO`2ilMB9juyQPyDe(ZHRVZa%sNtlLPVEx@<1iL9>! zO0M8%4|`qAT*a4Z#@b_#x|>)g?i{bxAxKBO_`vv@_7}xhdx(XC*G?OJz<|IrjoH4{ zYs?^XV&%FLb44z}9X8`Tz#xnnZ?&oU=PVDCGiAb0Iti2dfv~X0_&wkX7cRU_gW1_3 zcKd0E(?CCkbM2}S|7CNjY&p8(bD;Nx`2$~7V=vQ}cAhtX3_1u*()CA5TDyn|bfItk z7W9Q8{&;XO2+Qyzy{Ldu7xWxC{}S-t7|X5Xn;qv{L=k~~-b3O2S{%R_{b4yQJ^}UQfa%b zutEU*U`%)Pq}OiKMqP{9tT~%HcmHsMJ%V7T!AiI|-mJie91uwrz1TeVRu!H#hXy=^ z)d*MgsVq%Gx)yH(g9Bk|rM-$Tsv>{bLd83msPc$VS<#!C8&x1|48F%0#+Mo0A1b2( zggQ-M{}BRg=SlmWGYq{93KB$6_d7wtElKp&q(xo<-ZD4cdkS+@+g1?5)uK}Wui#u za{xc=fDXno7C|FEKWX&8dz^4fFMgOu5p1dU_&BxxWz2G@|2SD{ zaZVH3bq-^>C0LT%8UaW4%Bt@Ami%IY8%0*3ZEDYd{q{XDf{#EZRaArikcw4NlrrVY z$aXQnti;^Cg9y9qrk(JHmc6As5WT>3+ar@;^AHFBSg~kqU~-I*Y*!ew3~Xd0afzw3 zCg1fPxlKW#kok`qgWW$e1^vR_Dh*+Q4pFuI{wJ&n1pS1n9M1z?+yL_%^7=9{ z^n1sdr6NxyCo|Q{PMlCDd=H&|`7MZ6mn@Zm53>iMkTXs z_MnRJEOt5yTl~;<(A~i0S4;w)#EUU}W1KdnwC^%JAUXT$F(Wav;cq5;q?N6mB0iHw z)S*A0#~;tx$qpN8R3D)(bOs(eA{Gj!!aK(}H0LrOMlTRT+86iYg{R^CJJ)_R*~L`y zV$V1cvs5HbtWzW_m((uft{9AuUZW4@#x%IUVq-Z)fu+6$dY!Bg)pkL=DwcI?60Ox1 z{PL^OHGVMX=@Tk@LQ%pQB$?tt9e8_JK#;1z1EuTu$X%UUFqJqX=w0Yq3_P!V8Usqf z?o;reD!EH(GqW(Y#m=`}2=*D)j3(R(Vk|oI!U}_E@@mB0oQ{XUk!Zg^%yN&?NqyJc z2$wR_Gw~&tWTKPod=DtLOr7JB>d)Qg$PuWp98f)gD;Av<|0b@X31Ouips%JP)a{2< z2rySfo+E-;M=I`$Qm509KmMrzJ9!;Y+Ia0PvT2J|wktz^t&M@i+u{B^U=0?wy-|}t zQ|zmi(}&3&W*||^1**w&93RYES-cL~ru)lg@%#b?C;k!4vtWQpio!&ysk0bq<~@t& z3k}V!{^2$`Fz5s36p2`7NsVE3`8A6r9s{+lMpY;>pi-slEDe^AnNJv5}19O1@q!X-UlHR@SXE_LYB zz=0=)+aL?KyXho7K7O>EU16|VSZJ^+b>PDu6)%(HqvzJ3-0R{yZ%+yUN;`J+o7#+* zz8wBwM9TnH%5}(W2mT}r(1)y*n#yRx=QhW@^mL5e4m_ozYXWg*o)EtTtsLL zME0#P;U%RkGT=<0*AnvPZN~I{Z#HB53or)yYdZ|}JOaP(2s%@P{dR+L@rz4;gm)d~ z<+*$VLB&FjFsmf!9RDvyzEvL^`r{i;awb1~`c*c5v|W{%%EPz3RvKP{iLRy>C^LFY zL9h?GHgT4R*=*o4lgp2uI#sQrH#RBF;^%I(`+| ztWvj~o}UBYf4rvCf9~2i+DbzBc~t?BnpoNj$$tD;O2DSbbKdwLn#`HYzp{$ z0(&7c5#FoCKJm{j1|G1@1172>x8PpfZ?4NQ#K&*x_nSFh=$Xy0bY!fO=94dEM(%vb zdJX~2(%D3&tEy+A0XpJ&tj*JewQ}cP# z8f>5d000F$5RZ^-wf_g&Z~nF}n+`}UZ1qR4-G{c*+)`NS&3yeI!;OI^;47`d8=QuQ zY!rlGi3zS<-j&XgnB9p@b`aYfecMlVu<91>n6P%9+dRSs4zTkkdn@6-pm8pBJt=QyNpZDv zPED&~le>f+zXRBk)<}1o{|JO*C^S(25eAz;R+(5ZxWW8C7T@mXWbr|D=Z3i*^m)s) z1J_N?27!l3Sj<^UR$DDfmN!Crm+)6jvSpJ1rfTf><&yZPz?+Dw`YwCa!;+DG7{qbQ z{(>8mTyGJwrI;-Z>hwM8(4Rar+1d|GB+QhB(dOzE;SH<}DC&?v3>jXXp|hxHKBGI> zD`}Oao6xkBF&R&Rog8OQDeM}t7Nef6M8xULWb4iaAY~Iy%cgwo4veLk!e; zXIEe#00rhlt+k0SJ>AZ3a>j$^(lmBN+yYS4CDzsuH+ge*zuejoBn%81j)@bvqaQ2& z)r{VWLfG_YG$cGjbghcMMiSW*1@N9oAyAQ_FxI0dU#3KXuDF^qAQOiULNywsK?||D zq=Rsj(u`4BV%WSN4$_wujuu)3zi0;3yNOT?FDJmz1P7&FrpEsc*jDqhkX8R$5Qqjd z?2e+`Ya|9&h4}SS{bUO^4CI+jybedk??~fw~Et`k`eGzc>v;+ zV0)Iq| zDMElHBBTzh!TV>RXNo4gj>)he2%g6k)4*7BDQlUO=a*r`>v9x#d79UgEjrL z7GmSrSyFA-ALU@7g))Eu_jxDBvJ@+30+R_FLjms&GOXGANa($ESyK|s$n8)l0`#dQ zF}cE6PiQuBV@t76Mj5u+4zPit!}Lqs%~==bDn8Rl$Xs?xH?MxR#Ya+o;7_1I$9+#^ zZR-4b^-T9}a0wP$47s%s^g@Sf7~cTlsgj2%UMjI8*QeCHzREMrf9w$8w${dITZ8XR z`rU<3qNhNlA-z4tt<>rkgOC_4H~S^@(_jmr>q{MP*<>9zIgeJIaO60dCdi~&|7Q;~*|U~o74kA27RYR|@JJk+c&{}u$0WtO0G~&d4lJkz z!k&W&S$HYH@S+u2asNEBYLftxMf&>fq#OI6weC(g{&SVx2p|d5mM1!=pi5xckK=ae z^7v%SGvuA_tLdhrILc2DmIqq}e9*Yi*KAunY9hYjjq@j(Ij+~hdAWC9&v$B9 zx`SEN&r+|<^XDTtt^@~iB{!jDA{Uu8^Wd;k#jfNI6`y2g18$UWNt?<5{EAysy75pN z;l>J8QD~BeRv#JMaFp@%fZzewi zzjo!JiylLOflya6S-AF%8jO!OdmB}lm6^EKvSmN6jW*1jX^v2f?31krJE)!$1KYgE zHrxt$0j7_v{8aA3sL{?>%#7ro8@LBSj1o2t+Xu~@I%ZZ zF9e+U=|eLbqETa4>rz{WyqIOlcRWlW!^9V`-*>NBunDFU{5wx-J+dMgO=gk`TyjZ@ zpgcv(kwyzsZ9{j*g?&HIeD2PypuAfBA%h+=@Btj~f+fJYiAgClswn@1lL@PA`dpEP z_D#PC#(Q!wyhFt&WW<}MAc!C>=Ls?|zL6}E(*=fGHBb{#| zF}M$ZQn!IORs>NHYv3~5@Q2CozR0;nB5@?)=Xbh9&&R*W$G%BaE3=R9zGi|She5eT zwCdTBUqV3?EC8?&E{6fVHR z%J1H4ge-(qLHH@_WS(>QqNqLlwfv^_)|9b^X>+tt*oCN~I@(`(h-y zFA>-0w7S zcd>FVnZ?35piMb6xAnFn=l=NkaNwD?KF(lt()0QSDds#59pFJZc?*3`TEEX3hRbmD zAoKtLf}ZAiFt28-}_2LDxiD#o$#@JlAX&fFR6A!U| zJE4Spui~@^Dy7H{qDZvyOh?QP*<;eWyao~Da&_b|ORc*lykksXUhp-`!eqS9!}i_< z56A$Qj}9eVIkWemxk(bDDZ)Ub#hjSYGSpN2!$G_QJBI^)-)C_%eDg4TnlSy`@B)Eo zX=wdms1!4&uUrbT;9Q`7hc?b^Q}$H-_8z_8)? zmwjPHV6_Q;ReP>B46FIXw_7jUjdzz-iu-}Nn%=iYZyhFQy*z${v(8LH7#a z`7uq7U_x-SLa0I!b=*pwT&+=+G}MZOQJ$O4H?l+JFhQ2mv&smi)#yM`R2}-KXgfrC zCp!kIqUZ3kz!*py^q>H$IwDK;osI2KlOeRniWb=S2^DJJyJgQ&J%Gk|9!AH?=lTeO z6v{6wevI#)yE6BN)hy@lwo1^0AT#-%U`;K5)LaMfFp7Wx00D%AS(bnPJWLd@X18?B z$|vi1Iu8b^|0M52{m}IRh;)`mHN1))kBq1S7S8Y}674`K8DHdQ{^c(7XG4cS!ofYX zu~-{&ik0-@lb@lCt}#hK`tT{B8|E6p@f8y#WgsF52w|Bu~<6jiaP2s>~RnP000+I-dyq7}UH8vkVp)RKBI&D&FFd(1HN9_aQ!}N@BeV!XWpM0h%^-KcDJ(W8#ozCa z+OyRK278FukNconu+H8PoqQqGFAgOF@=EM50|kTUm?Qf!htj(z(`%da%6h%Kz56oI zso4)OD%jxE$-k9&xSO(DJ41G}+>UqGD|krt9+*}bH> z$Hll7D!!#*XBnNr2dxKmMoPpW17CGS_D=@Twv)49{y-9knkOE#;h*=@gglW#e|Jsv z@CBd_F*bY0T`yv*Z@}?$X_5iw*1?vM9;{L0R+-pq>Y zIc~{O6aPa1FY0t(F0n<$Nz4L2?&ASV)heS1c9>eX?`2*~aeWv5Iz6^vaveTHin?7* z)yR^QIhgt_@|Tq6&?kSkhWaCV#YyPX*3itTUEiBh_>IPXnF`~R=B9o=4@6fYH|g?q zC!{v&Ew9rPI*uB@vF;e0W9*I>{ElqR&6JetMjiYcNq?Qchy}mEg<+Qz*js*|ek>AH zxA*=L_#8&$o_6oDULdD4j!8;hejSjvFkEv+ zWZ=H~Mk9ULbe@f^S)@Jqoy5YlTa!cMFoOvQ)e$1S^6(4)Bb}S(3NUIvfB<13BwiUX zHor^`Gtv+_5~~6%sXTcd=}~S=Ss&kjhNCqyOHW&-(=J+RE3{=ok~*Z{7p@utRT^!B zRw&F?8~ANaaaloN|5(F|`forHUDSAS=Z8$}s~3kEimv zz%Y=LYr!!QN5PG3S+gGag14We2$XV}sJ=9vq&H$xfhB0N=75P{U>h#Xnc6wp=gzjg zSMXK;fBz5_nk%MUk+H~*8yjs}kFq}T`xkE5spJiHaK>J8#K;w(7Rev9*X|vBEez39 zI17~2kKP)2WKR}tKpFjDJnWKs^{eNcD2!xtJm}S{m2W?lzK4-m2^15hSoAb zzE$Y{xPuGE2IC6L_;)eAg}FVapoAbDX3VOiaD-@^4Rl|vCs#wMRMt%Z-bg;Ti9wSw z5DX+F$<P#MJ_79J~cG-qDuBGk^DB&w3H>6WzI z;OL4^7GJ^NJY@fYUOZF8!QDvWtdt+lG4PP5d*>~gL&^4Br0NuchEUnBrL*EEJR%~L zIR&zE6MUXq019X&C!mm7gJN@$Cx-8P6b)MbIr6GPl1bFZ}^>fxr0> zRP3HYHwcDh0K!5`;zCrD^maw&^q>H!UY~WUUTGW=?2I&4|2*g?=AHc3ugil)e;M_( z*3I&tkN^V-0PJRZ`EH<=o!q!f919YH6Mlb#G>qgoQ0`j->6FG(G_VIZT2n_-MnOECpuIG!9dhI(F1RTA#{G*ykvpx5TW7Uwqlu1|cLWM}kW_x# zFDeQncp@`E4Lp$LQ|yk`e630aq*URACKk*GPbV&X+I)QYpdW~n)*!CW0R*#}a(!Vu zrvEUH!X?n=Rx#Y5!x!FdNmDv7vz0Z*jQ8GyNnS`_SHR2D_T6+Dtss88w$~Lg{6@Ub z85{FNaDd%algOSF&NBplBP(Gag0MpZ7*-FQ!>zefe)5H-J#ToS6~WJNq{ZWDNz&s$ z6;oD&ofM&!hHr<7J^uxKK2r_HgWGXNd6LzfSV2B_R(tnn8g?+QgKiCb2PG|pelpO3 zpqGLetS=I$k^BmtsP$Hl>Nam4XNpgK?QY}JSEfh{K8L0n1{PYLi1_~;6Ar2f68Ayl zDLdL+E`5_~RjNZoq!803?iQ5YP2$8dVqEt2J%JP#*jYkFAZWAkN@eVx^3%O|a5vAo z!?G;ggfB|%7gr8JBmg1W)^J)2Ur}qlQw~q46O@B!yzfUnl?N#-$PeRrW zhfQEyJV!E=4}Bd)uZn4vwcHS z1b)fBwHO+bO^8myJlN(%YYWXl7JFX}HI6Q$8} zL%zOo4JUdJgaEGV;BiniHJ9c;2pTUakKqfJ41scnl$Wn|as{mKu?M>kFW*yD#?y_O zW2XmE2~tBWz^X7o-t{&5OG8(yMZfl&CH8uy=LrZh^SxtYa@8 zgEi4!OV7S^SLKxY(7e~ZKu0V5Y1X@RW~ESM!M$}{En$vK7lo&=P{*lmSca*znPAIY z^>fB~DeQ)4P5itf_X%KyC%NDAe&`3_%dFAwo({aPfbvZphrXD2alq6K2y86ARm#Er zqAKC3d4eIcXXNyG^hL{`eJX?XS^7lN_RE(UVO+U@h?-ZpFMD~fb20IeVpWy5w@rZ= zPFP_>Y%-==Zs$d6%0zo=RqGqKT|Vz|$LE|!@iOjawmxo;t$%m02(5OK$bPodiBBEV zfFjm(WKXCA*2iGyfCvov!OgZe8IFqYjBs%{@p&7sV4U1uN@6%HB;*B{*GGp_;o&}$(G&VfauOiHA5br z=iA24U%3Yeg*D=fK^Elk6%T!L`Na8p&UuQ(XbDizg5QU;*;xS5F34xjyfuTNC*Br3 zfI^=!{in|1&NSgDV*JS(_*qiClnkwZ?F63j8Vyit`&7vTKWmph>CINnAewwgbk~2ny9xRf*333 zy`w^uZK>D_rnyJ=8HvbV9sZg$*PBSFcA9Q^#c`R9FSA$CSBUF?%K2V5EH%&v*DHdNjy%>y8)@wSVhaRw9X}Y z)BKa|jK!a5#P^y(Q=wmZ%M6Z^DtUG{8UWS4%s6x=0?Xc0;7)*vM3-X+bJ!<$TYx{X z3v9HhHEN!YzyonsSK56fMAM0)t=J0OluPbDk5#=mjBqqp5zDFDDCQ>Hhd;D%@zvIo zhoRY_=}WGcF?LyUv>MNQyS&g%pTCZ7Ba)XA&EjmbWJ01M1a4j>8fXfHX#*}-`lJR6PyeC5=t8;VR~7uw#~d% z<@B%7Ap(d;n+Wi5dT$X8|5OPm7*`vXB){qlt&=5!hfIY}+v*jzu_)-QT6^iVHrZP) zAUad>IVI3Q*n(nK+Sz}1K)_UQf+%T~q<6DZ{w(XYQF6~(viAhAk+KT;F&-*7?bN|` zxW}+xa?f?o2je;nfROz0hH#Bd zhr4?KRIcSNUXh9{ynfiBq47_l-bPx(eWyPH_Ning^dmbNIZO;upnc_?G+@`&KpI}aji8_)R9%3 z&|cQH&@L1XU6RQdwys+CI(RtUP*d_=Yb7;{?=c}szhg;y_{4D-CKzs1F_D&5C5yY; zC5|p1TArC5mVXIJ757raUy!)8W9J4-W^%bVH#jX#mxqoBenvdTF!=5c4Znoo^}-HX zRf$*=x$??f-N)8X_TDM)-rqH>5tVJjH=84Yic6cx#f4tkGf}Q8643X8JHJ;Q)=AXh z0=;;~9~3@`8A4oer~!~{8;4E#_^mvmCGvZYe{eFCdq+6C`Pvd~Sas{Uvk?S&Ivwqb zhZJ@=$8cPsjUr|k;S`3=Y0t;G0$y^Gjx?iHOEk^95GHcXGG>ZAoG0tqQRWGCu`o#X zAqh3xFo7SRmZd{uDFlk9Rr(fOk9-FwFTD01^xzDOM|6o0`UZX7TE-@P^lXVdRXa>3 z^b;Nmu=E^<5RT$W`lUCr*zEze8U$0@S|w@6*+I|7Y4ogq8U)H;#;JEL(sM{e>j~qf z)Bk%Xq5}@tVE(uyKHKdy^M5U7R(NkWAqR&+9nLb{J}Gd~Sn&(V{xpn7{yf$ryMi6{ z1#WT)t@jN$+(DXrl7uc{>w14eaSyruedQ{+T;^egjWy)J``Ufw(pfHk&RDH$U*h_u zw~axErowe8w#N7-nB6;b3F0MYc0XvtS07PrUq0sUx8c?kJecECB^L%`Q_v z#<40Q3Onhjgt`I?`S_U&^TTyVXUqARKMibt^&TR$c>-vq?2BYSqzQ$NdUDK&;CEda zNj3Yd^MVZiPDr#{I4$j*z`(eZL%%A!_6Jjnr5oR92tE@{{q(ouqQo2nUI8l{L%^11 zZ2qYtz;6b54i+}DM;{B09z|j2x9w$yw9-EOo;%Gn5V%pgJ6_@=QcUM6KzbYyO0vq4+OZ`<@7eJbMX(JFx@^+8fyS*X3u2vw~&VQz)H@ZWx2| zhk2UJ)d9yI3sX{sz8O(=^`(BbH!mw>;!aHj@KC5Beq39ueOFy@$lud9bAHXqh!A#f z0|G<2cETO-itj-ew(_0%9!zd@fum;kW7U50u^M^Z;bs(%%xdhBApXY|z#XPIsZ{c8CE^5g5@Oc%oCb2w@}! zqTu^Wd|CME!Hv!*;@#MGv`l@ujK;09orEj*B2`U`($2W}S=y)b|0X5d+`^N*>o&9X z_MSB#0lX6jYEN4nIHxG>go;|~d@P|LMkJ@SF3O5#6><#VJWeAh{-YUd`wGPW4p}wa zCBT=tYNsph=yEx=)QZ+?EC7+Yt^n#&P{sN#)K-;eno4%?8qB~QLxW5*O~+?icjl5(N`=%WAJ^TpPxXqU!grvT)2y8?q)-H(Yacl&KaC`hLuA(L3ZJg(?b{M zf1|vb)=QvKr;}M?Sqp5ip$#1yZe2NYstl8PcKUH$dZuR%qzLHxhdB>7)RU3OoMxr2 z`frR}ZmWTB4Z|4|=$H?nB+G?$mxa+_K5tU?_skcDFtHMY7tJe#M@{wA+x-TCE0?5P ziZ1L-hZROWC7kCpeTJAQuhQ=2pp2d0hIO>q={DefmA#8;?RHPUr^gKxf-!XNa2jc_ zPgl42N7{faN`Z+~p9mh6x~V@+xKgDa)~mx0h93697b5{+_9DEl2k}(+$l?!GNkqBt z99H(!sj*hWft9Di1@qSO-@wc1M=W;2et*0Gp#UCe4cK=pC~ol{E{9?-WTM3G`5&R| z6)WBCMl3Xyie&x*3yx|}2vgBNOyat(hf%yx){I;y9SyQrKa7w1goblw}uTnc)= zD1%DoPpkH;b~%G;_Cmk))96fXH!Fs0h&Kdg&%AXVQwuz^I^`CL?EAA%dk4a%Rjmcw zyMF(J$fMs`2+hTrB-%=(V=%Ft0O%gkUadU4hhA-P7v6K)9*kM$2EhE-EhIG5k7tOb zqi5-8S2KfeSpjXR@f{19Zz5x{^aS_NBm}9g+C|KV;x3Y)RVS=0OV^SnijrY*WBUTD zalgOGvyz!!v)fs*zcgN?z0mR1UO{ zr)+J&NS$xgCj#tvt?YO9-E68hK(tF7-4)hS8&k zn5!Uzj5x4jmWCK4!`yNcKlF>XLys&EV_JB% zw@`UkS=i}m%hHYiQ`lgda_6BKOtA|PGyJ@2rLwky3_mM<7CO1HIwG2ei7dKm6}P(jvq--bGT_ zo8D01!u8L`%av6VP!Gxy&^l~WTI|)$oV`)j=60%QShyVF!1>%`)K_4whx&x{wQFW+ z`33P`gVM|3ZL5d*K#k;n5^Gr^Sa00UlqPq`S>$0UL#TVmW9agtbVdW0ZyfH#Z|7^g zKT@QU*u>kHY%g5xShE60%*56dnYC}-fF#|I;lv0TpW#v6Md4mQyqW7^3!3xi^-Hh2 z3$=LjMxcslXz!@Y=qS?&?dYflUEhvsGuGD&5X!%vx{iT7r??5~ZLQ*W&*ZLjHZ5i3Ubj!fF@9Z$=y5!;*1B9>?MXQ?lmXnJTU!7{WA}u%V*2&870gY)}hs zC;_rzT5u*sgWz^+1;1e|RRqX9upjA{xeqSmlZeC_)bWINjGpi%NC z5eq7n1ggEOa&k&SmBgrbUPp}5V!)V(M&yyD@T%)}8M~nO+6S=_kV&ojMegk=?S__@LFRfZ4V+vB4Y4 zgTS3pP%0+OwFJbP{%=wpXLB@y-Rbl0K^+J27E_|tA`|3Y}G*pc0ftT`u*!(ei^r+G0P z0j6tM$~r0&_JSi7;9NF#L+m28Uz$KHxarYP3FvMPA1X0!7!Qg@_XU3mxB47e%khuF zgy&;E-6UsKqCHHeqT4tPLBR1GC8g5XFY2ej!jR>E&=t#Xggm>BknFz|;n%7RG-5aZ z0b{Bi)H3%SG4}nxjjg>VCgpaV$$eyd9X&q4C6+%()D0i}h(r+LLu!Ju<((adAK7TO zwyGMuSNpsEzF>WoW3_>t#{_f>H|y43oHOKKM9E}@S29n*TTK6FN9i>ayY^TDZ)Uj3 zccm6JTX{j0lDsrxV~pvfzfaOnQ0DEa6)Y%};(Q84&V8Qpt#CD`1>xB?cwT3?+-ggD zkrybcaTLzs*%#5#_i?f!$gqgeEdIUSWup%D|98Cv5d?$u>}+Y=PSkvRkYdKRS0OL3 z_Z=oi+dfK$D-Ie$PnhMPu9mnCp0OI~nuEMUwh*0o@Q)JUkBZOeHxY{oVg^89??kCl z`e9UdQ!CLUaH$`M%t8}JDi{?;#)1hh7{D)4Zl|XV6JWLd+;*!9GotxJwl(lcQ;Fr8;}$spJX4O|r`4q)-ZKB(0cDv$C?W+wDiqVGQz2+PQ5$72kyQoMbT_etd&Lp?sB?lyYY@ zmQA3QnzG%;=-*P00z@6qzi*+3?dwtw&~SH7{k?^Mx2t$NSw4P{PoLYQ`Tg-vpP+gr z@=&x9!5nt;^ZNR)q1tT@>;F~R{{3Bc!?rWz+!N&WQ9e&xv*g!6_>4`y3eI)74$idxe}0$Hz*f+O z15$@;dM8JCa`2OMC$Kf!)g_P$&;Z_@cc5ON8Hip8K7j~Ay@v`oeci~3Y(eo88@y00YbkDRBd z?zF`rFzQ&tf@dA>KFsSXto&5RqIG%Od-Il}S6ra4tQ4af4BElfL@-h+isG^SO={La zj_s8amy&`7cX0e9qyv@)pfbH3(tcgU8DhXTdFu|b!KCo>h8%QWb}~<_;9m4rtx*mr z7;&`|63Lw`*_tAW=4PWcP)cTmT#1bVRRo*93HeU z(BACgZ2P89Y!ku03Wo+E+~FC(4>6Q59a6fOUit~YyQ|53FLXwWlV?Pl7Ar%UQH_1%u@xIvlel(Jz0`9i zW3Y>oOglSGaJt3Nl~C7ld6ux4*&ZRsM&=Y}#Y&O~{XT=aPpZ^Mih2p$hsqmw&Uj;@ z1$lUGrxM`Oul&?nhY8mn53ujXn>SIU+y89xS`d1`W=?Fr)wU%O$UqX-8i`P6FapbTe*a8(MHw7n0a(2; zX8s*MDVP4`W1wuODTovx(C!cYw!x)kx3PLd)uw}_Gc&m7V=q0;hT5o8vFya@0+cLf zT?Agz-CWPPX zimb{hg6Z%^h#S%frpJp6zUsl=9im)4{G%vsp^Z+9SiLyZILNEWX@)(OwqZ&cpEZIo z6m{uL0`-^r86>b-{vB(TO&)9&o5fEn3~S~V5c_@y>-B_l5ed{!XP~^EoY|d>)`wgW ztM9Vi3vecoa0SiiCj0lX-&X_{HH_v2i}xLUc_Qq~r9hb?{xsV{+-LxiMOVh}+XLyi z=WV8oOIt{BhJ7SHNZsx&gKoG+ho1GD<}Fm!vZ%F$?}Gk*$e4pzdnfV$SZ_@>fzTQ# zrFgWf=t1tz8&1TgU26YZM>pPp0#PJ-V? zhyg1m?Jxl*5@M54N2J!WOmrBtu}00)wX!_And(5$E)Li@fZ=}P0yoi%gQT|0IEbq* z6SVCr*~K-yDJ=qQUmu~VGHkvj*5QB8@}dC3FcslY%s!FbF&v4nVq$1N3{sG)lIBTt z0}aH?Qi#U^4@R0(T|R}|TX8YEOB@7fYKdME3&@67Ksd1PeU31+m5chr;j#p~%W_-Z z%{FO#7To4_`h;7EeQ~mR*F}l0xj(A~Au(t6931C6aaX(fw1ImK<>??kS%9p_`at6C z2x-)<-Mu;c*mkO0z~zs(z(x3hJwd%QR{g6ZppdHCe98}C)ebXNh3g3t9Q)8l!R<;?FxbL9ZcB{I+6WdQT5`CTJOLzd0Pc#*R& zc1}D)(74)ST6>N&ZPx2)E3GW<-^_9q#ZKbcC#&ij9Xb$G zV>32OTL;~cwQR4I zFi`~NpQkvu|Dj#TdDFm{jPS_AIoYt;nhygY>xegsc?FDB>bAklNO09U=ymQ7{@*C;dVR@v zKeE9_&}lXEUTV~PycIA^o%V1?TDx1${N3A&stg&*-0ZvHsx)fc#_&@KCW}UVm}1g< zUr8J9Imj3u#Kn_YEFoTeefTRH-n>-B>XsD0^6c=f4$42jh-wSmN=MimMhz)I*||f&PnSe)Qie zIR(%AZb%y3xrPd87Y`}pQ3gi}EF5K^(|5}*~RzpmUnKrTAQ<$WH0(UXrX4Rj6TX5|i;eJkq(A2h3 z`~-@ii?kdd?ULZab`<|`Oako4L-+W!p=0gxsyc)7M%M_brbnF(Rqr0`6+9VkIYv$^ z371SMfMiS(?9c?ai(2ff^L_9YS*2D0lP$K6LuWoRdlm@Sl8XCwjEnPQ;wOU`uT}+} zEhJ1ThAxmACV4D@2-T=z1fB`=Ln?SVLatcB+K*|9q0AN!q`bvPm!3``RQE;aUOFG? zzGR%j`|HD2YgR2T%2f;>!@cYQy?I5!vtj{Q=!|iy!uoVj%itIPCB~V1T~6_D9%9Oyl<-@FLzMI&hc0(1JgkRZN8PceSWdzwMXy}Y z5vN>$ei?(YTi&iIsFGzZP!BvNpX&jV=Qs4~RN7W~t{~7KO}wH|XvPGEc3DJIj&z>k zb_?$Yj#4K+{EJQb1#qg9<3akJe{tg}c9l7-JHYcPv1CO#I7+)g z7q8kM#*73gB3p~fiw`jWRMf__N$d^aENO>5L!R+0z5^Ak-wEtio&E)nqD2Xl4S?;t>rIsUG!BiSr%xDrm$OdbInuz{u zCcJo>o)hBgc}6t_41o^*_bXf`3}<55pBZZRvAw?y1h%;t3sOONpijsEr;hZ3eM|)7Yz$uzuKXz*1fY zF4G5lSr0BjwO|yTD$%Z=&%iO>I{fjOuKzZR8F4OP#S$c42-@N%)v_1Yb*ej?7VpU_ zRf$oETN~r9BHZPyC)NbSD|q%i=dbp_&-3H8m*nvk!kxSH?Kb2y{FIb=i#nwI zSfFC$86@e^QZPOKMMnhp=@>Iw;+AvJouthNMMf#vim5f#?dI}TN9FqG>ZX}E0l;HV zkzLv%`Fc(ylcd|jNZXtJr|;lUG#mPV({i6wHIcRFK4{6Dn>BPwr|H)3JL*2u!%Gnr zcsUxXNYTqvcKTlDbHerE4pPGxbn+u{Q|ciU-~$Rwq2w`<LREHF8&Do9B z2|F#}_lrX#1iZrEI=ja1D1)yWWQG(p^3BM#FoKDcz+PM_okeA|q*xg&snx&;;O7Y$ zdC9fN8y>enS?41Sp6$j%>eUW0+9F2b&k9F8IktBNa(w>be>{OtkK&#MoMl&inabta z<}V~`&yh*=qC4TYCr&rb);H(K*QBa}rBY~IhC>8sM>SXy9S5|hJ2`~7?xFfzXXApm zW{1a;3||=>F@cKcoV-C6A5aP+4FNpX?5F4^ni}-0=?Odl*W@C(tgD)WI~?v~=#hn% zVjL*3i!HprYH#f2dMQn_NzQAff-8dXN$_drd&(|f66_%$CxIKuhN0I7nU5Kj6&LIRmep7w1PFdro7KIZi(ak1Pg?1!hqR->c?Fbg(V;_UJvO%?8~+@ zzJ?m_h5ZUVu|Tix{OEUO3b$~x><<a;&u0PMB30++{l2Qkle8G7|I@?c-%t{EKb zW*Of&h9-evlVR&6f;D#*16ef~Q+T|fuF==+Ca22}JFTqiUZNEPVB{8QR-Pb62t$X~ zv@jzG-F#T!_h&~hk8wSMBdEIKLVDv9rDWSor3|c7X$BgPbH9R(vV%%0uemqY;E{P+--1$mJp2_iBsafNyeWo;8t!c}+Q%kI zM!5#=H?PwAY&m_VOCZN!8bJ~2F$=lXJQ;!_%1q+?DL zmC9bUc2kzHiY=Lc8UgPLW8qqm&@CLtJwzM_h`cf|E9C666BtxXckC}fvnW3!AVc9{j{p(4k{N1Vll zHkLCR7M)s=F4XnWWSAnd3*O4wF~~DOIEvvT5Xp>X-^Byh*|qnb1i2NBvksZu`Z?X* zh%IYC1#S=9i%>S(W0e5;+wm9(g|UiS*hHjK!OI%R2LeHI=^mOB9KvmTwjZ~@?r3nI zm40ya?iJeHFJ2FrQW>c>y3?^I^V&@*4&{!@4z_G%HLHV8jEVZ17Dy${hHWd(*{703 zgh%s$Y9*%0Kl4`vjov__cVIWU6^W}{nn=sGfw~QD{W3-64p?B3 z4*8x3EgMxwDH7#Xzhq%P>tZ}r=I@|?7)$jAYGi4(!~mQ3&U}Z278@Q znmWzVArzyTZxJ3AYIpjd$EdX=j89&dtHOe27^QSDgxd(^Esz|5- z1ovrKfQ3I3xSoY9Mi{6zQO;_r=lcH>^;oG(vgOs3rT5>yP1_w)bxV+qiDKl_$aQDQ ztlgRqj&zf_NZA+W_2Cm^8pN32=O>vJ>fzn#ft-c3>Db1RBQ|$Z>~PE2Rp>a7!_uGb z&5JmQip;*BicyO5tC85J+9U0*i<5=uL3+bmbk1BuN-((kF6&ZxLf~ti_w~Er)KpUm z4?zBd0D{P1jeRkN|1E!;`F)EjZ`#71C=J4N0d4+XhtqyIW3V$B7~He(6<$QL0sgcP z(=}C8=zYXv_T@}%$;j=hcf{4O{&ahNbr>EjV~#3r?choI@Ll3v97Y2f`NG|x_qP%S zC>v$O-B_7Cp3Lsk<$p{dYfQRE#(!7c(3PdQaI#EA7e5UXWhKNoQ>#EYa|1*-?O_XWXEX}>ZQ*jj3h0>-5ykR=zc=m+TsN^I;1lOfWK4pj#iS^&><$9$ z$X_YWT#;hZ2-FT<K~3@ zsfC5k!KX73R037yH0Yxxqa$pms2nvcixl#RF0~qY)I-LOkQ1DL6v z=J(?lR2Asl|p7GF_p*Ol596w2JHHwAsgXg z_PrR8Ztsy3(T$}ZHr}J3ybwQf`tDj^Sv9cG717x_eZJ6WzdKsP#FOgpJucxw-?db6I>hoNa3V1aQT0~I zA}(^*L8Xr_EN=UIv!AeAQ1wHzfloszt|a!WGbNp`Ie^8@ksKC`HGPIug3n-HN!AuK zDStcY%o+Yjmzo9&QqvBV)qG)PdjBDwxtBRM4<8}1F4Y*_vyqhhch_Nqu50FFV;%~l z*)3ADw%vNBJbm99gS0b%iQi3lk^Roa>7!K0Oa*}{S^fDHdV|b!a~CcgNu@tUOO{;V z-^h=hnd#MgM@}~NS)xrS)Qu!SA{uDE|6Bc=Sr$|qfar0FM(*Ci9Rdm?)h6G5G({nI z$0{?QA*3%q`T=^1^;?UJFR<{(OD0o~MD*BR*w|jU!eaWGo}@)hT9V8kYT=PE;^s?d z*W2AHK0NoVAnD@lS!PNDk8dI5)V;(<=&RSeUz2FbUgSmV&>LtwdLF9N_?2;)#Y&tk zv>-9-j84evHde#bo#V;wJG1_9UbuIR)0wH$m?93SKiz4;p?^U~}HoK)gI zjJE*ht9>vU6`t?auvQ)V>h%LH@T=UT^6ao6S2AqL?4Dix%>ZP?qkVxlqLILS#Kyia zg>|C>w)*a7HuIc8HZ)%5klwiUyy`_GsYjEoOn}WrmFNNWc7jVPsv^g|!R({8E_n%M z-2r`#-v+Tn=I|Kf8#P!5gB3SP!a4@Q41RGx<0sbx-KCVx;N!Wull@;1u9pT%ObMF%#A@$n3oMJ^o~DsnZ#0 zhH>(AQ|U#jZS`*&h0E-ccA00o@)bQPUhyT8E*NEXy(6CzT1?utbq{&9`M*o^PYaJi zdQCV=)e~)LDF~SXi4jRdKC?uswU|TQIs!l@M$id?UMkhOR{Cte9P zKB|ofoeg9b?N3Dc97K;oO`M309+Ew>3iojPl=AK*Sn+2oe9OWyTjD=3<2XEJ?t`SL zrzz=ikPbMMLw}KESF0q|n`d)-rP3h7&?s^ltkx_|@A) zku>_~gIn!f_eFLoU_?dd=Ew&Dy2d|jp^y8^>&0*kQO0WhyDsslI}z>Sw-@a(Sv~h# zQy>D+Z5WOyo!fA0Dbq8lAAQ~FZuXH*J?Kjum9H7l<{ty2h|6ztYb`x)@RPhlr1ydmj`_*{2j$^!J_CEA)GFyM7f%~F=hHApP zZ`vjg&xN6u^cu1kXm^u2{^wgcU-4%1XDYGdMdKI6#U2alt$bt9b!bY^tfcKO(n8xG z3!4VRU7@woBN3(`UD=4uhQEU--j6e(55it1e7bE34h5{0`o zZDa;1$XKsck3jw|^qo~9({rupctfzF6HO|m?d?tGRWn>9Cj^k-OE6&_ z+k+35ajO}bn3Y8R1dB-wz3}iISeEppBpjfi{VDT6@$dnid7~W#ne*jJQ zP(mYcqA~Ot>wa1keSYW-V(8ElV8QqhLkSCoTK3cD8H%v+)2ItN#R3w^SH`0FZYu!1 z%!&NDIXo1`7*+_mqP=?BhPg{%L9R*NNN*=x>seOHN`+isG4ehA#!Kt$Y`m@{`tI&-* z{RInt=VuTxw5SPn3xNOULR>eXG z71B740g5(OAVcBhLB+6}hnLVx*VIE=_4ykXdJIKB{KpmAwvftN4go*?Ar;HDg7l6RCt@zD z(tFYIznF-HZv~PjFeg08L^nmcjqTyo>}Kx$ZNOO6NXxU%lULRcE)O9)xl;Ur@XsBR zx1QXuTK7h&72%`R{|@H`36OFQ)P_#1I$i7|V0Bu)g2RFXH@N+-v`(@K3so(o;eg(L z8m0wy9D{t%Y}KwOCg;KI#fdZN&*WoGTE09pVA60(R5vt)`7LeoTkloG%mVk6v+!wA z2*f(vRRco&3f^5s1`AYSNP873(l8MfceJpUf92u%y`AoX>*RY1Q3}uw_PN@fY;$qq z`Ifv&&wa;PdA?%6WR2F>C+Jqpkr!`0rdZ^yv}$MtMLPLTQzN8x0dsHml#jxX3G+4N zI!<d#pj4cjvlCt=)7f%bMxpRihfZnc^hqrh4P$!@*oJjnokD2LJ zPah}+_zP6;;>W~_=>&z{x@*jyQI#+lBeS)3>v$v4sed6ic?}HI<*>}k)Ri=M_KvVU zJ`vUNvj7S8yk7o-XvOE1=ms3@_EEfvdVfJ3*BfC38-Td$pE6#hgZBjSGFF;dyeg|X zY(kyG57+My{8wdG2r$wfzCXoKCl)Z)RQS#eCDY-DzS|^y$%!i_dD==3u1u#}K}jv% zKwF19+{j9XGPHnTasZ=*ysbp=?I?(t2$9HCmK=3GZZz7y!n7D*?9VMM*<4S=X)i4z*jdfpNlN9B+z zuJnJimx*bJ9wmah?RYV#PB2|m^~|Mtjvj=Oj&%eTa^BGcx2+wDUpTUFANher>|hs8 z+)+)6LnwH!ekGiKUQni@>A~K#Qe_uIUZ`G^F<5jy0Dej5NfS)#)XuqXQ@L4-tKy*5H%TiB`kUqf)iAAg6Oh$|sKk|Cr%TRI9V ztPWhBHva5YEI05`TCK(2tq1`}e?hyx*?&U z0!Gs=#9hSj^M7hI9D|QXO8xkXrZM{$rV&E*KyC`D368VCk=6dT5p6Ct4D;PPP&)r; ze(lzmp*hD1qQ2ILYX%ua1ry@0$Zjos?<7Sy(Q4DW#&nGETl_G+Cv~N6;3%gcvyv&+Q_JGmQX-j`0-OwW0sB!L(0{+ip{wpTV zk^)%57oEU81lB1XfRZn6jRJlE%?5laFC~vC0Q~Yb(1JQ*Ddx<}&XU5NqQgCvRDq|u!F@SC6FAuj z%Je^=PJ&Wm++P-4qZK}rDWJAGwFDYm@1Ngq7Er%SYO$uCR4iziD@le+*~7-T&Zl~r zeHpu#CPzPD*u|-SuuXMz`{ORM@9Slw`|e|aWXs^QD%p%v7^7gSXM|3SGB;Q&)4{XI zvJu`}$|%L251a88K({c+xW6OCYMi8{Go~h!G2}J@ewDJEJyIfn3%nbxQN0s@XN-nb zsjpBR)`yOM4=L>gHC@YUc5zm>!ue|g0F^<@q z&wGT$WeIF|$jA7X_H2PLM5()t<%0=M`f@oAKJet;XqGzBWJak?E+uXF=<7Urk^WxN z+YX&;*5PR|DRiY!Q;zo=hd`Aj&;`sa;=>hZOro8~g2@4uF5>{9L8~OTdd)^&N0S)4 zBj;hRVhidzEO<#~KmSA;JvA81=gky?ZNR6uk&abg6lGRLLE15@7`WNYUKV?~@3ST7 z+pp}++jVr9pqqJuD!foH*Xgz6T-6NR2NM222lAxxM?72gC)jU72S`Q9)DXU+kmcw5 ze)%_2F#l0Ui9n?Cs50IG>phbg>Fnciqv@~diV|N~+s9_5rYCZ5e-S$16ukU3K{=JJ zV%S(Yq^r=OE0N9b9N9>)#DeI30Ooo7Kl7TRTXC?lu)UbR6UFSQQJQCNHAapd% zyo-GbV&rxUX`v14>61aL+4!$nYXBj6QNG}Z&{Hl7<>r`JU~?a9KICc4{2qfW5j|u( z(;c*BCTwR2U+7<_oRNaoSfOt=_&qjd>^*7vEx-xLSvS_?OtL16>H~fw zS&azqOEg=%i#_cgthO}h72;o3l`-}Bp~?W8`02Gqn3}0~DKfeuyyTqF)GfCKRSpJx zP>#!N?Cov#>GG8y*iPYzyfv@4^9Uw|eS56M)_=Kt|F(_xFL{Tt1w=x)MYQ?(jK4B^R4%>;#Zcj6Sh%6+O)1=jC#^OV)GQd9G?ek zOw%M}teBHH1pSd?w_BV+MOuqssgPNX#{4uIagd{%q!H)JGj_D&s=Ef`E4pP$YbYj* ztaBatW@GzdbsCfEcbhlHHxplJ1EgKL>csG14IxKK$G>Kh*&?y$9^-~6yl-6xoOq#; zFrPsmV0?Ru$4pfi%IjC>8O@1L@Xu4xO7jxLp-eYwwJ(;I_@vYLAz+(?hYdM+H82ve zx-!3X))RdR*^ledFZNQ)6z+Pi!N7s5@<;b|JGC6mh8G_q9T|a;4v8|WRkn2TG!EFH zf3!bIDSr^nm5iqf*`G_iMTGZ_xHp<+4`d2-58GY@O})&Vk2CLgD=E9A+MsdO;G2Rj zjE{qi28f*z%_!8*xSIZFcG5}Vo7Hkd_!*6_AM3~db98%XngjyQ% zc~uJO%MT+Klt9~9;B0l!Mk*XpE)I0^6D1E%nOnuQ`fsDvT*8ar2?Fp>>=hW}$gj^f z2HfEqLZ%H5?&aJumH$6vC)QNY9>b?<8(rx3y20um@j%&z-gD986enaydE;BR4f+Na z`QM=!64>J|fFa;x(pc`P)pc-(4jR+=N{=Yr;h1x?e(@CFR!&*+j(Y6|f|D^Po<|8y zbahJa;zA@s$nY~FL{UfVt{aX2ZsQhW*M8HH??djo4E!DHq_`pyNxET=?q;nIN~tHY z&cjsVEZdH_~kznAQcg z(X1M8u9bfA_o!tO`L&~`0FM>B%g7;er=xXB77$IjI#>ksZA2Q4NyJtwg*q(WUL)_@ zt*c(8NWmKZKPd1JZ3+O^{i0;3Kpsvjr;zEq=MT9Dh0|vhP(3|C3|@!Kbpqn`ndOn`qeVtQB&+Zj4WLtJzXM#< z_<0LX1LS8>TBpfN-?%F-wEk`F@z)9M%vo57B}=AO{2oM>*?CKr`S0@~TH*>Z&{T}xdvwnJ}{zdT^Gtcp?0XAMV( zqB1aK-}x`8p-ADlwoRI!F`oe>>cPQRAjiERtJ2toJ26%eh)1u-D8%J~zgFw~ap3e~ z?^Q@CpaEG2&VFK(gb#SD9ERSaVw5{H7den%XH~5OV{JZLcLH_b1y7*}U9z)p31Kk@GEDdaV^J zm?tbD9TQ_Eq@U42Pm{ctp!}>q3M%3+!{ME_58J_yHN2>_77XS6?23#%QPXvf8@fEo zk}}LCJU4sot7pWnJqbNheNw?iLW&uAVY(07vI<|My^H!s?xhAYvAaDfR;Ny-m0;fw z<^tK<;cZN^SJR2%s*qH9Q><>liQURH-~x;pwkMF#ajfIiIlC8}5{h%wI#Z{MP6f+y zjq_ItlSoRb1v0v|&n$cZ+*kaMdE|0B#k4*JqDZBhgQRI9zq=5mBI{1u+ zNw-69pQD$GZNl&d_V&E_SC&2z9of$JjX$`c5V&$MY)(~h9k z@bOz1mC!zJ#k1NxO<+Z(UDF6BSd#x1YVAB=26(KUdf`$UbC1a4l=$yrw_Q&%kkjgWAvW5U z*v6MeKr+scrsA65V6b2VPz{k;!`_L;bI$-EQ~iRi51;=9QfC>k`0VYuI_EYKfZtP~ zpS(Pmj|~X;9{HJ*=@+F~Di&_87sXh08T8#XWPbJ^<8UXS-+li~(kTI6EG= zuI$fA<;QAhrsd2Ni~AVie9tE~`u*N-gt(}^RG{>_jnJW6?B#THhi3!(B#QiByhx)A z7<3G7LN~olRm%uC{EE3h${BX|dhBx2q^ItK^_G7X6Dr@3`pX0L=>o2`O`Hwa?3w{$ z+o<9^=eXJTethVK!a+Y*M@f{%N8)wDLY6smSfZ1Mg3~#n5)WZ%33T9Hi~(}#nN_`7 zueCWXo1P4XbDGM*pPGnVHkmD|zEY73ihVcDJz5H0{4raOqpC@#+PiKEv1TFbeHasr zLCdna)0`Cqyu8cAA8EC3=jPV_gpV8hDyB8za<4`C_)ES9!cx_4klC^L*GTkG{Vszk zE*y7TrRUHXU6Qn4&sNX>Jx}(7Jz!fZPxG-#uKuu)%UevxUZ7^gbK3u z_5Er!3V`1SAo3qXe&8{xD~8V4jl6Qe?sxQ6vb0W7-OQE0)t-?byl4@9`a$b#QR$lh zO5Zed523rvI(_NiG@gFowk}S3GV!y@N=sa`y}Gbw9u9ydSkye>d3Q4_VAbaLG0wI6 zw{$EQIj4cb;wsnoL}NYtY?I+HhewX>n`USlR!a|Ct+GDw9#WV`=?pUr$p{vgr3K#= z1}OAIL|W*vta<2a2<5;VrNj?;$vMlzlYQHe@TyU$+_@L6{L*ILnw^uBaE|Dzqek2s z3+texBm$1hINVc4zV|A+3R~)~F6FqmIH*Wp<5cUe@>c%N^96DU&O)%5JFH(hjVE4W z`56rNxJCrW1brE`YQ48WN91o?Q<*cee=3phy1qA*@}zjK|9O#AzmhR+k=Uj%mnK?9 zY`?}RV<{OA8)X2T$65!Ij1Z{ zXcXyEj+^zfsCP{(KarBJjY6d!r5PX&j~FkvbHMb;6*Z02F3Cn(tWExfWQzR48hG7) zeiwb5I|>fJ<*Qq2o*S2T=!JfI7Sy+mO7Q)zF)*dHW|jG;qA%v`tNvhsV@%x!i!9L0 zY!Xl4irW)@=-90=AM&bCSIKyb7k(eJ9Fcg)0&7)}erF9YjdYg~1k}?=q2|R%kvfiL zq>Q?>06{;1QToODcK)EhmVicVUOd-EFbpw73wwyHuH%{3E=SQi6lDQ38JH9v8g_;N zUimszcQT4Dak#wHcYLGw&E3hIYj9va4YrI6QqBARi=IPE zKwt8rkXn*{7ST^C6bi+=xHYx*Z=1ksfhXa(W4Z7t9}s8F*-oowtQfySlS$2t#k36ZFaUpJmGP@x zg^5U7RpvXjQiWsk)Cj`iqE}%iqUyPP$p_Mps-ON@1y@EQt_uS?m$ul>D)_;ri=s*venAu z$nO;YwR)q+GcMm{Av2_;U)pwDwT9G%yw{fpXc^f{SA}_O?xt3u%CT1G~b@p>{&EI zjSZ3+u_r{B!ZO5WC){74MzW5-i!BGxn(|6C^2*h3vJX)7S1AySsO2}vn|;v$O+d20q=3Qc=iH{R>Uj+N0f$-`Q=N|ZZHFyyK)IU=n%DzRnYHCX zZ$|#7DQ!8o+?M9Qy%g>_?U8WrM6sg%GhwJAG&TgOr^?y5R>apymR$*nU76HNrp2`< zEOyDfKQUF=X;I4H3Gas_H0WzP)&lE~z|8f=T+$-}PDy{1KeX8dHe~>MM|_n-od%{J zpk-7gPU2+e;X*pt-L%x1A4K2(Zv>CFZKAfQ^mOjq)zl6#-%oU4>x|fE%$?U77b?xFN8By( zYSMQ*2!}bxYKuxTY_@Iw&ihv|O8O3#eKs6gNI>mCMhOT2fAh6M=OzGdWZS{_CO{f< z4(G6BO0RP){kx9^^of0G0|O(^{`qIBsbuOxN%H3>q}@6FHjjTPESgG$F&H7QO)(aU z#~hT@b8s&wW-#U^VPv2;0j4==#5*e;1?J8jlBav z4|2k>B#BvQ6lnOX)`dxER!R>Zdj1ovmX=!D8pPoGtaad_2X#i#uIu#q>Ud@dw_-W& z{k(MUn^DOh)3=gE-xUSSd1i5eklqX1SB0}SbW3~H`AI9(u0^y-F-ABLx_Z!Oo(rK^ zmRZ|Ve%hGBg0nFTeZ8K3Twt03^!tM){a}o3pUbr#MOJuT^M#)@Xn#`>5(G0YsvfWV9V)G-wk;^=y`vu)T7}o*~j03s5O5G4Qci(s(pic zynq05<^$*VF3igAZNHncz_0JWApJX^=tJb2HPT73%wF(s{HyEP?AHGu?ILg=KL+Hz zUe2nh8B5c)tFEXbv`sy1UKp-Ubm6*h(Phl*PgsQ30;Xa8KhJ#FsiRb1QbAC)9LNg2 z5AXrOnhu6^UsVIFlU*GaU7r55dx9dk3B-`TLaG4n$t8Z-T9K+Mqvz#b$XRO4zeIV9 ztQlUOL+^2Vl9+Oc=|PbicKJ#AlpAM}1PcmEd2nj3%~{YY>F4*X-+}i-!rkDv<#yF) zpM0SIKQD8?@a$;i3wW{y^_W>wyP&X`jei#I3&i0cZzZPT z0x?C+U8(VUK)vUZyPdn%>s-G%>ZQzW&A`|2$?1WB=pbWJADwjVAO9J;zws;46j$1v zZnBI=r!|VEcL$gR;=Vj8(gjc{SAibmiisi;j_B;iYyOl3wLKJ!fsA&{c)ss`BA-A>U!BceshN7GolAG8*(`=ub;KYEG;@+jAjFQMrY zksGIoP0>iIM#W~i1|87P1!#LWNX#@oX#*n{Pcr^YuM*O&LQ6iuZ_{w@;2gdP+xUfO zR`Z}Bx9c-C;&W63@y2MYO-T4wx}{hofeq){3jq!rVqZEaaWL}PoS`aRE3o| zXy=!Yced+M_d=B_b>LN)3TOaonu6?fkY?O^b`@eM^T9s=8kf`TiHOBd;)RW*kj!qq z*9=A(+v2$EOTLx`7rb@t)6JZ6@$<)uxl{VH6>}xSsZm4l@Va?%fYCmsJ>9q|E`>D) z;`k(~4oa8Qdd~fUsza+u(RsV$J>JF=u{RC3TxaV}*dND*C+Q*pus>)#l=UQ^dLN4o zn*bm2*qsC(3{w{(d8c?(q3{V4&D?OTUK9x(_l4m5z7g!i8|sm9^$ae&C6M>;K4AZP z(jnnJOF4xU(5_jcKN+m21O3yt;pRWvb|GpUg41yhUe2H``L~>zB6-`cF5E>YPXPcOvpX?Sx_#d+0t@%K9yMXS*k&?;WhS9BCH+9522!ls zybh&7hG^731?0rwt!~GBv8D&FwuVJufyHI$+lS*i-rh2);a!OPMxxmDE`GI$ftE!% z2%na?$fHG_zrN&dlh2YFs3DByzIlz!{=j5*`ujf2M|cyGBKsk@*(}`{MAU`&C|tjy z6koN&($DHLu+?enKOGpseKT%y!_e;BBN0J@PW8fsoza}g3DF`CPhCcH-fp-1RR&5s9+7W z95^=awMWT>BasL1<#>aw;(Q554j?t`HP2w^-w>pvFb!$B8~;jc%u=?7AP*wDNjriK zzCHAeF`+dT5$v!nxA69j@fJP?BF+q( zeSL~@($NM_z@8arR>?swTxwg+kIgB{fTlRuFY0mX%`5?tpq~NWVu+KqtpWX8DiNbH zGb41^M>S{oZ5Q4v;4=dCLvUajhu_;(q0E!h*o>?CXnY!qe{B14RmTe)1x0zsKR5#r z{V6~hvaq5c{O1|$$5zGQv3{OKtam?`FkLyy+8RSy!b4`@xX0_M=mxXAb!^{XVW<(X z4#ICm20L0E(ffTGRJ!1madR7bx_^=(iQse~`e&w7aolzRavKR>bn%gjZ}2mV6|4j| zf11F6_4O%r3}pBfOm}K-#l9?A1I!%Jm@X*bRpCVerGT9b&21_toaEj`bm7UYc#L?K zgdd0sZx`)5J8s{)_6TJZVLBaz0{g6(%jc-P#b`tt?K87*nDO02QjZh-V3RELdj zGkQB)72KnR^ZK|KE1ee#GQ#zHh}+urXyAoLC%1Jvyt~8A+Bq7i9tqb&6fw15L+o`> zP_3ZmH>IS`W{F&fXQKG*xSa;C9cS-CfIGN>$J=<#pB+#N*ckhnnKO*kz#89Lh3 zkt7luS%WenjD z^B*4o!u_!>zrdg@?mIwP7SPKlu)0FpiTXX1{hCi%8#C7c`^vluS7cDyvFhbBiim~qwj1;Oq^3-1>GLOfvFzn&bpMPPqR z(`7?8wb()P3WD?B7e4mD8ku@LZC^Po1cvtu47;5Z%t;;acSTEF@P;~uoh|ppreVI zfWo$WOBH*ZSo2t{wBz%kk^e5I7cgD82QG%b;bDaAawux6I7!k36ykVManBm4KCg6% zWK!#AVPdYYwnsJ`tMA(Sg*vF*dB^BcSe8ylE)-%H{n=Y_tMY@`bUnQB6?Ex{ncGid zfwG@9G#51PsTgM+xq$vABWw7j zPdvdqc>h%A<8_y;9$%J9cYk)=m;n>*9xp{-1F|ANccMlNTVclNOLT8YSRcN-ddlfF|j`T-6K!5~brh_Pf&rUdQ+tPIex4lOQR&YI z)#wiC>LhQ3tepIN7SDD^noG;Boz8@bG1uC-QJ>%Quoy#P
d#whV1d6<|OI503` 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 uKdzlONo40tOYP=-8uF8~ej2t$qd#l)Zy6y + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.jwz.xscreensaver.${EXECUTABLE_NAME} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 5.17 + CFBundleSignature + ???? + CFBundleVersion + 5.17 + LSMinimumSystemVersion + 10.4 + NSMainNibFile + SaverRunner + NSPrincipalClass + XScreenSaver${EXECUTABLE_NAME}View + + diff --git a/OSX/XScreenSaverConfigSheet.h b/OSX/XScreenSaverConfigSheet.h new file mode 100644 index 00000000..452c2672 --- /dev/null +++ b/OSX/XScreenSaverConfigSheet.h @@ -0,0 +1,77 @@ +/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* XScreenSaver uses XML files to describe the user interface for configuring + the various screen savers. These files live in .../hacks/config/ and + say relatively high level things like: "there should be a checkbox + labelled "Leave Trails", and when it is checked, add the option '-trails' + to the command line when launching the program." + + This code reads that XML and constructs a Cocoa interface from it. + The Cocoa controls are hooked up to NSUserDefaultsController to save + those settings into the MacOS preferences system. The Cocoa preferences + names are the same as the resource names specified in the screenhack's + 'options' array (we use that array to map the command line switches + specified in the XML to the resource names to use). + */ + +#ifdef USE_IPHONE +# import +# import +# define NSView UIView +# define NSUserDefaultsController NSUserDefaults +#else +# import +#endif + +#import "jwxyz.h" + +#import + +#undef USE_PICKER_VIEW + +@interface XScreenSaverConfigSheet : +# ifdef USE_IPHONE + UITableViewController +# else + NSWindow +# endif +{ + NSString *saver_name; + NSUserDefaultsController *userDefaultsController; + NSDictionary *defaultOptions; + const XrmOptionDescRec *opts; + id xml_root, xml_parsing; + +# ifdef USE_IPHONE + UITextField *active_text_field; + NSMutableArray *controls; + NSMutableArray *pref_ctls; // UIControl objects, with index = c.tag + NSMutableArray *pref_keys; // ...and their corresponding resources +# ifdef USE_PICKER_VIEW + NSMutableArray *picker_values; +# endif +# endif + +} + +- (id)initWithXMLFile: (NSString *) xml_file + options: (const XrmOptionDescRec *) opts + controller: (NSUserDefaultsController *) prefs + defaults: (NSDictionary *) defs; + +@end diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m new file mode 100644 index 00000000..e179dd0b --- /dev/null +++ b/OSX/XScreenSaverConfigSheet.m @@ -0,0 +1,3226 @@ +/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* XScreenSaver uses XML files to describe the user interface for configuring + the various screen savers. These files live in .../hacks/config/ and + say relatively high level things like: "there should be a checkbox + labelled "Leave Trails", and when it is checked, add the option '-trails' + to the command line when launching the program." + + This code reads that XML and constructs a Cocoa interface from it. + The Cocoa controls are hooked up to NSUserDefaultsController to save + those settings into the MacOS preferences system. The Cocoa preferences + names are the same as the resource names specified in the screenhack's + 'options' array (we use that array to map the command line switches + specified in the XML to the resource names to use). + */ + +#import "XScreenSaverConfigSheet.h" + +#import "jwxyz.h" +#import "InvertedSlider.h" + +#ifdef USE_IPHONE +# define NSView UIView +# define NSRect CGRect +# define NSSize CGSize +# define NSTextField UITextField +# define NSButton UIButton +# define NSFont UIFont +# define NSStepper UIStepper +# define NSMenuItem UIMenuItem +# define NSText UILabel +# define minValue minimumValue +# define maxValue maximumValue +# define setMinValue setMinimumValue +# define setMaxValue setMaximumValue +# define LABEL UILabel +#else +# define LABEL NSTextField +#endif // USE_IPHONE + +#undef LABEL_ABOVE_SLIDER + + +#pragma mark XML Parser + +/* I used to use the "NSXMLDocument" XML parser, but that doesn't exist + on iOS. The "NSXMLParser" parser exists on both OSX and iOS, so I + converted to use that. However, to avoid having to re-write all of + the old code, I faked out a halfassed implementation of the + "NSXMLNode" class that "NSXMLDocument" used to return. + */ + +#define NSXMLNode SimpleXMLNode +#define NSXMLElement SimpleXMLNode +#define NSXMLCommentKind SimpleXMLCommentKind +#define NSXMLElementKind SimpleXMLElementKind +#define NSXMLAttributeKind SimpleXMLAttributeKind +#define NSXMLTextKind SimpleXMLTextKind + +typedef enum { SimpleXMLCommentKind, + SimpleXMLElementKind, + SimpleXMLAttributeKind, + SimpleXMLTextKind, +} SimpleXMLKind; + +@interface SimpleXMLNode : NSObject +{ + SimpleXMLKind kind; + NSString *name; + SimpleXMLNode *parent; + NSMutableArray *children; + NSMutableArray *attributes; + id object; +} + +@property(nonatomic) SimpleXMLKind kind; +@property(nonatomic, retain) NSString *name; +@property(nonatomic, retain) SimpleXMLNode *parent; +@property(nonatomic, retain) NSMutableArray *children; +@property(nonatomic, retain) NSMutableArray *attributes; +@property(nonatomic, retain, getter=objectValue, setter=setObjectValue:) + id object; + +@end + +@implementation SimpleXMLNode + +@synthesize kind; +@synthesize name; +//@synthesize parent; +@synthesize children; +@synthesize attributes; +@synthesize object; + +- (id) init +{ + self = [super init]; + attributes = [NSMutableArray arrayWithCapacity:10]; + return self; +} + + +- (id) initWithName:(NSString *)n +{ + self = [self init]; + [self setKind:NSXMLElementKind]; + [self setName:n]; + return self; +} + + +- (void) setAttributesAsDictionary:(NSDictionary *)dict +{ + for (NSString *key in dict) { + NSObject *val = [dict objectForKey:key]; + SimpleXMLNode *n = [[SimpleXMLNode alloc] init]; + [n setKind:SimpleXMLAttributeKind]; + [n setName:key]; + [n setObjectValue:val]; + [attributes addObject:n]; + } +} + +- (SimpleXMLNode *) parent { return parent; } + +- (void) setParent:(SimpleXMLNode *)p +{ + NSAssert (!parent, @"parent already set"); + if (!p) return; + parent = p; + NSMutableArray *kids = [p children]; + if (!kids) { + kids = [NSMutableArray arrayWithCapacity:10]; + [p setChildren:kids]; + } + [kids addObject:self]; +} +@end + + +#pragma mark Implementing radio buttons + +/* The UIPickerView is a hideous and uncustomizable piece of shit. + I can't believe Apple actually released that thing on the world. + Let's fake up some radio buttons instead. + */ + +#if defined(USE_IPHONE) && !defined(USE_PICKER_VIEW) + +@interface RadioButton : UILabel +{ + int index; + NSArray *items; +} + +@property(nonatomic) int index; +@property(nonatomic, retain) NSArray *items; + +@end + +@implementation RadioButton + +@synthesize index; +@synthesize items; + +- (id) initWithIndex:(int)_index items:_items +{ + self = [super initWithFrame:CGRectZero]; + index = _index; + items = [_items retain]; + + [self setText: [[items objectAtIndex:index] objectAtIndex:0]]; + [self setBackgroundColor:[UIColor clearColor]]; + [self sizeToFit]; + + return self; +} + +@end + + +# endif // !USE_PICKER_VIEW + + + +@interface XScreenSaverConfigSheet (Private) + +- (void)traverseChildren:(NSXMLNode *)node on:(NSView *)parent; + +# ifndef USE_IPHONE +- (void) placeChild: (NSView *)c on:(NSView *)p right:(BOOL)r; +- (void) placeChild: (NSView *)c on:(NSView *)p; +static NSView *last_child (NSView *parent); +static void layout_group (NSView *group, BOOL horiz_p); +# else // USE_IPHONE +- (void) placeChild: (NSObject *)c on:(NSView *)p right:(BOOL)r; +- (void) placeChild: (NSObject *)c on:(NSView *)p; +- (void) placeSeparator; +- (void) bindResource:(NSObject *)ctl key:(NSString *)k reload:(BOOL)r; +- (void) refreshTableView; +# endif // USE_IPHONE + +@end + + +@implementation XScreenSaverConfigSheet + +# define LEFT_MARGIN 20 // left edge of window +# define COLUMN_SPACING 10 // gap between e.g. labels and text fields +# define LEFT_LABEL_WIDTH 70 // width of all left labels +# define LINE_SPACING 10 // leading between each line + +# define FONT_SIZE 17 // Magic hardcoded UITableView font size. + +#pragma mark Talking to the resource database + + +/* Normally we read resources by looking up "KEY" in the database + "org.jwz.xscreensaver.SAVERNAME". But in the all-in-one iPhone + app, everything is stored in the database "org.jwz.xscreensaver" + instead, so transform keys to "SAVERNAME.KEY". + + NOTE: This is duplicated in PrefsReader.m, cause I suck. +*/ +- (NSString *) makeKey:(NSString *)key +{ +# ifdef USE_IPHONE + NSString *prefix = [saver_name stringByAppendingString:@"."]; + if (! [key hasPrefix:prefix]) // Don't double up! + key = [prefix stringByAppendingString:key]; +# endif + return key; +} + + +- (NSString *) makeCKey:(const char *)key +{ + return [self makeKey:[NSString stringWithCString:key + encoding:NSUTF8StringEncoding]]; +} + + +/* Given a command-line option, returns the corresponding resource name. + Any arguments in the switch string are ignored (e.g., "-foo x"). + */ +- (NSString *) switchToResource:(NSString *)cmdline_switch + opts:(const XrmOptionDescRec *)opts_array + valRet:(NSString **)val_ret +{ + char buf[255]; + char *tail = 0; + NSAssert(cmdline_switch, @"cmdline switch is null"); + if (! [cmdline_switch getCString:buf maxLength:sizeof(buf) + encoding:NSUTF8StringEncoding]) { + NSAssert1(0, @"unable to convert %@", cmdline_switch); + return 0; + } + char *s = strpbrk(buf, " \t\r\n"); + if (s && *s) { + *s = 0; + tail = s+1; + while (*tail && (*tail == ' ' || *tail == '\t')) + tail++; + } + + while (opts_array[0].option) { + if (!strcmp (opts_array[0].option, buf)) { + const char *ret = 0; + + if (opts_array[0].argKind == XrmoptionNoArg) { + if (tail && *tail) + NSAssert1 (0, @"expected no args to switch: \"%@\"", + cmdline_switch); + ret = opts_array[0].value; + } else { + if (!tail || !*tail) + NSAssert1 (0, @"expected args to switch: \"%@\"", + cmdline_switch); + ret = tail; + } + + if (val_ret) + *val_ret = (ret + ? [NSString stringWithCString:ret + encoding:NSUTF8StringEncoding] + : 0); + + const char *res = opts_array[0].specifier; + while (*res && (*res == '.' || *res == '*')) + res++; + return [self makeCKey:res]; + } + opts_array++; + } + + NSAssert1 (0, @"\"%@\" not present in options", cmdline_switch); + return 0; +} + + +#ifdef USE_IPHONE + +// Called when a slider is bonked. +// +- (void)sliderAction:(UISlider*)sender +{ + if ([active_text_field canResignFirstResponder]) + [active_text_field resignFirstResponder]; + NSString *pref_key = [pref_keys objectAtIndex: [sender tag]]; + double v = [sender value]; + if (v == (int) v) + [userDefaultsController setInteger:v forKey:pref_key]; + else + [userDefaultsController setDouble:v forKey:pref_key]; +} + +// Called when a checkbox/switch is bonked. +// +- (void)switchAction:(UISwitch*)sender +{ + if ([active_text_field canResignFirstResponder]) + [active_text_field resignFirstResponder]; + NSString *pref_key = [pref_keys objectAtIndex: [sender tag]]; + NSString *v = ([sender isOn] ? @"true" : @"false"); + [userDefaultsController setObject:v forKey:pref_key]; +} + +# ifdef USE_PICKER_VIEW +// Called when a picker is bonked. +// +- (void)pickerView:(UIPickerView *)pv + didSelectRow:(NSInteger)row + inComponent:(NSInteger)column +{ + if ([active_text_field canResignFirstResponder]) + [active_text_field resignFirstResponder]; + + NSAssert (column == 0, @"internal error"); + NSArray *a = [picker_values objectAtIndex: [pv tag]]; + if (! a) return; // Too early? + a = [a objectAtIndex:row]; + NSAssert (a, @"missing row"); + +//NSString *label = [a objectAtIndex:0]; + NSString *pref_key = [a objectAtIndex:1]; + NSObject *pref_val = [a objectAtIndex:2]; + [userDefaultsController setObject:pref_val forKey:pref_key]; +} +# else // !USE_PICKER_VIEW + +// Called when a RadioButton is bonked. +// +- (void)radioAction:(RadioButton*)sender +{ + if ([active_text_field canResignFirstResponder]) + [active_text_field resignFirstResponder]; + + NSArray *item = [[sender items] objectAtIndex: [sender index]]; + NSString *pref_key = [item objectAtIndex:1]; + NSObject *pref_val = [item objectAtIndex:2]; + [userDefaultsController setObject:pref_val forKey:pref_key]; +} + +- (BOOL)textFieldShouldBeginEditing:(UITextField *)tf +{ + active_text_field = tf; + return YES; +} + +- (void)textFieldDidEndEditing:(UITextField *)tf +{ + NSString *pref_key = [pref_keys objectAtIndex: [tf tag]]; + NSString *txt = [tf text]; + [userDefaultsController setObject:txt forKey:pref_key]; +} + +- (BOOL)textFieldShouldReturn:(UITextField *)tf +{ + active_text_field = nil; + [tf resignFirstResponder]; + return YES; +} + +# endif // !USE_PICKER_VIEW + +#endif // USE_IPHONE + + +# ifndef USE_IPHONE + +- (void) okAction:(NSObject *)arg +{ + [userDefaultsController commitEditing]; + [userDefaultsController save:self]; + [NSApp endSheet:self returnCode:NSOKButton]; + [self close]; +} + +- (void) cancelAction:(NSObject *)arg +{ + [userDefaultsController revert:self]; + [NSApp endSheet:self returnCode:NSCancelButton]; + [self close]; +} +# endif // !USE_IPHONE + + +- (void) resetAction:(NSObject *)arg +{ +# ifndef USE_IPHONE + [userDefaultsController revertToInitialValues:self]; +# else // USE_IPHONE + + for (NSString *key in defaultOptions) { + NSObject *val = [defaultOptions objectForKey:key]; + [userDefaultsController setObject:val forKey:key]; + } + + for (UIControl *ctl in pref_ctls) { + NSString *pref_key = [pref_keys objectAtIndex: ctl.tag]; + [self bindResource:ctl key:pref_key reload:YES]; + } + + [self refreshTableView]; +# endif // USE_IPHONE +} + + +/* Connects a control (checkbox, etc) to the corresponding preferences key. + */ +- (void) bindResource:(NSObject *)control key:(NSString *)pref_key + reload:(BOOL)reload_p +{ +# ifndef USE_IPHONE + NSString *bindto = ([control isKindOfClass:[NSPopUpButton class]] + ? @"selectedObject" + : ([control isKindOfClass:[NSMatrix class]] + ? @"selectedIndex" + : @"value")); + [control bind:bindto + toObject:userDefaultsController + withKeyPath:[@"values." stringByAppendingString: pref_key] + options:nil]; +# else // USE_IPHONE + SEL sel; + NSObject *val = [userDefaultsController objectForKey:pref_key]; + NSString *sval = 0; + double dval = 0; + + if ([val isKindOfClass:[NSString class]]) { + sval = (NSString *) val; + if (NSOrderedSame == [sval caseInsensitiveCompare:@"true"] || + NSOrderedSame == [sval caseInsensitiveCompare:@"yes"] || + NSOrderedSame == [sval caseInsensitiveCompare:@"1"]) + dval = 1; + else + dval = [sval doubleValue]; + } else if ([val isKindOfClass:[NSNumber class]]) { + // NSBoolean (__NSCFBoolean) is really NSNumber. + dval = [(NSNumber *) val doubleValue]; + sval = [(NSNumber *) val stringValue]; + } + + if ([control isKindOfClass:[UISlider class]]) { + sel = @selector(sliderAction:); + [(UISlider *) control setValue: dval]; + } else if ([control isKindOfClass:[UISwitch class]]) { + sel = @selector(switchAction:); + [(UISwitch *) control setOn: ((int) dval != 0)]; +# ifdef USE_PICKER_VIEW + } else if ([control isKindOfClass:[UIPickerView class]]) { + sel = 0; + [(UIPickerView *) control selectRow:((int)dval) inComponent:0 + animated:NO]; +# else // !USE_PICKER_VIEW + } else if ([control isKindOfClass:[RadioButton class]]) { + sel = 0; // radioAction: sent from didSelectRowAtIndexPath. + } else if ([control isKindOfClass:[UITextField class]]) { + sel = 0; // #### + [(UITextField *) control setText: sval]; +# endif // !USE_PICKER_VIEW + } else { + NSAssert (0, @"unknown class"); + } + + // NSLog(@"\"%@\" = \"%@\" [%@, %.1f]", pref_key, val, [val class], dval); + + if (!reload_p) { + if (! pref_keys) { + pref_keys = [[NSMutableArray arrayWithCapacity:10] retain]; + pref_ctls = [[NSMutableArray arrayWithCapacity:10] retain]; + } + + [pref_keys addObject: [self makeKey:pref_key]]; + [pref_ctls addObject: control]; + ((UIControl *) control).tag = [pref_keys count] - 1; + + if (sel) { + [(UIControl *) control addTarget:self action:sel + forControlEvents:UIControlEventValueChanged]; + } + } + +# endif // USE_IPHONE + +# if 0 + NSObject *def = [[userDefaultsController defaults] objectForKey:pref_key]; + NSString *s = [NSString stringWithFormat:@"bind: \"%@\"", pref_key]; + s = [s stringByPaddingToLength:18 withString:@" " startingAtIndex:0]; + s = [NSString stringWithFormat:@"%@ = \"%@\"", s, def]; + s = [s stringByPaddingToLength:28 withString:@" " startingAtIndex:0]; + NSLog (@"%@ %@/%@", s, [def class], [control class]); +# endif +} + + +- (void) bindResource:(NSObject *)control key:(NSString *)pref_key +{ + [self bindResource:(NSObject *)control key:(NSString *)pref_key reload:NO]; +} + + + +- (void) bindSwitch:(NSObject *)control + cmdline:(NSString *)cmd +{ + [self bindResource:control + key:[self switchToResource:cmd opts:opts valRet:0]]; +} + + +#pragma mark Text-manipulating utilities + + +static NSString * +unwrap (NSString *text) +{ + // Unwrap lines: delete \n but do not delete \n\n. + // + NSArray *lines = [text componentsSeparatedByString:@"\n"]; + int nlines = [lines count]; + BOOL eolp = YES; + int i; + + text = @"\n"; // start with one blank line + + // skip trailing blank lines in file + for (i = nlines-1; i > 0; i--) { + NSString *s = (NSString *) [lines objectAtIndex:i]; + if ([s length] > 0) + break; + nlines--; + } + + // skip leading blank lines in file + for (i = 0; i < nlines; i++) { + NSString *s = (NSString *) [lines objectAtIndex:i]; + if ([s length] > 0) + break; + } + + // unwrap + Bool any = NO; + for (; i < nlines; i++) { + NSString *s = (NSString *) [lines objectAtIndex:i]; + if ([s length] == 0) { + text = [text stringByAppendingString:@"\n\n"]; + eolp = YES; + } else if ([s characterAtIndex:0] == ' ' || + [s hasPrefix:@"Copyright "] || + [s hasPrefix:@"http://"]) { + // don't unwrap if the following line begins with whitespace, + // or with the word "Copyright", or if it begins with a URL. + if (any && !eolp) + text = [text stringByAppendingString:@"\n"]; + text = [text stringByAppendingString:s]; + any = YES; + eolp = NO; + } else { + if (!eolp) + text = [text stringByAppendingString:@" "]; + text = [text stringByAppendingString:s]; + eolp = NO; + any = YES; + } + } + + return text; +} + + +# ifndef USE_IPHONE +/* Makes the text up to the first comma be bold. + */ +static void +boldify (NSText *nstext) +{ + NSString *text = [nstext string]; + NSRange r = [text rangeOfString:@"," options:0]; + r.length = r.location+1; + + r.location = 0; + + NSFont *font = [nstext font]; + font = [NSFont boldSystemFontOfSize:[font pointSize]]; + [nstext setFont:font range:r]; +} +# endif // !USE_IPHONE + + +/* Creates a human-readable anchor to put on a URL. + */ +static char * +anchorize (const char *url) +{ + const char *wiki = "http://en.wikipedia.org/wiki/"; + const char *math = "http://mathworld.wolfram.com/"; + if (!strncmp (wiki, url, strlen(wiki))) { + char *anchor = (char *) malloc (strlen(url) * 3 + 10); + strcpy (anchor, "Wikipedia: \""); + const char *in = url + strlen(wiki); + char *out = anchor + strlen(anchor); + while (*in) { + if (*in == '_') { + *out++ = ' '; + } else if (*in == '#') { + *out++ = ':'; + *out++ = ' '; + } else if (*in == '%') { + char hex[3]; + hex[0] = in[1]; + hex[1] = in[2]; + hex[2] = 0; + int n = 0; + sscanf (hex, "%x", &n); + *out++ = (char) n; + in += 2; + } else { + *out++ = *in; + } + in++; + } + *out++ = '"'; + *out = 0; + return anchor; + + } else if (!strncmp (math, url, strlen(math))) { + char *anchor = (char *) malloc (strlen(url) * 3 + 10); + strcpy (anchor, "MathWorld: \""); + const char *start = url + strlen(wiki); + const char *in = start; + char *out = anchor + strlen(anchor); + while (*in) { + if (*in == '_') { + *out++ = ' '; + } else if (in != start && *in >= 'A' && *in <= 'Z') { + *out++ = ' '; + *out++ = *in; + } else if (!strncmp (in, ".htm", 4)) { + break; + } else { + *out++ = *in; + } + in++; + } + *out++ = '"'; + *out = 0; + return anchor; + + } else { + return strdup (url); + } +} + + +/* Converts any http: URLs in the given text field to clickable links. + */ +static void +hreffify (NSText *nstext) +{ +# ifndef USE_IPHONE + NSString *text = [nstext string]; + [nstext setRichText:YES]; +# else + NSString *text = [nstext text]; +# endif + + int L = [text length]; + NSRange start; // range is start-of-search to end-of-string + start.location = 0; + start.length = L; + while (start.location < L) { + + // Find the beginning of a URL... + // + NSRange r2 = [text rangeOfString:@"http://" options:0 range:start]; + if (r2.location == NSNotFound) + break; + + // Next time around, start searching after this. + start.location = r2.location + r2.length; + start.length = L - start.location; + + // Find the end of a URL (whitespace or EOF)... + // + NSRange r3 = [text rangeOfCharacterFromSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet] + options:0 range:start]; + if (r3.location == NSNotFound) // EOF + r3.location = L, r3.length = 0; + + // Next time around, start searching after this. + start.location = r3.location; + start.length = L - start.location; + + // Set r2 to the start/length of this URL. + r2.length = start.location - r2.location; + + // Extract the URL. + NSString *nsurl = [text substringWithRange:r2]; + const char *url = [nsurl UTF8String]; + + // If this is a Wikipedia URL, make the linked text be prettier. + // + char *anchor = anchorize(url); + +# ifndef USE_IPHONE + + // Construct the RTF corresponding to anchor + // + const char *fmt = "{\\field{\\*\\fldinst{HYPERLINK \"%s\"}}%s}"; + char *rtf = malloc (strlen (fmt) + strlen(url) + strlen(anchor) + 10); + sprintf (rtf, fmt, url, anchor); + + NSData *rtfdata = [NSData dataWithBytesNoCopy:rtf length:strlen(rtf)]; + [nstext replaceCharactersInRange:r2 withRTF:rtfdata]; + +# else // !USE_IPHONE + // *anchor = 0; // Omit Wikipedia anchor + text = [text stringByReplacingCharactersInRange:r2 + withString:[NSString stringWithCString:anchor + encoding:NSUTF8StringEncoding]]; + // text = [text stringByReplacingOccurrencesOfString:@"\n\n\n" + // withString:@"\n\n"]; +# endif // !USE_IPHONE + + free (anchor); + + int L2 = [text length]; // might have changed + start.location -= (L - L2); + L = L2; + } + +# ifdef USE_IPHONE + [nstext setText:text]; + [nstext sizeToFit]; +# endif +} + + +#pragma mark Creating controls from XML + + +/* Parse the attributes of an XML tag into a dictionary. + For input, the dictionary should have as attributes the keys, each + with @"" as their value. + On output, the dictionary will set the keys to the values specified, + and keys that were not specified will not be present in the dictionary. + Warnings are printed if there are duplicate or unknown attributes. + */ +- (void) parseAttrs:(NSMutableDictionary *)dict node:(NSXMLNode *)node +{ + NSArray *attrs = [(NSXMLElement *) node attributes]; + int n = [attrs count]; + int i; + + // For each key in the dictionary, fill in the dict with the corresponding + // value. The value @"" is assumed to mean "un-set". Issue a warning if + // an attribute is specified twice. + // + for (i = 0; i < n; i++) { + NSXMLNode *attr = [attrs objectAtIndex:i]; + NSString *key = [attr name]; + NSString *val = [attr objectValue]; + NSString *old = [dict objectForKey:key]; + + if (! old) { + NSAssert2 (0, @"unknown attribute \"%@\" in \"%@\"", key, [node name]); + } else if ([old length] != 0) { + NSAssert3 (0, @"duplicate %@: \"%@\", \"%@\"", key, old, val); + } else { + [dict setValue:val forKey:key]; + } + } + + // Remove from the dictionary any keys whose value is still @"", + // meaning there was no such attribute specified. + // + NSArray *keys = [dict allKeys]; + n = [keys count]; + for (i = 0; i < n; i++) { + NSString *key = [keys objectAtIndex:i]; + NSString *val = [dict objectForKey:key]; + if ([val length] == 0) + [dict removeObjectForKey:key]; + } +} + + +/* Handle the options on the top level tag. + */ +- (NSString *) parseXScreenSaverTag:(NSXMLNode *)node +{ + NSMutableDictionary *dict = + [NSMutableDictionary dictionaryWithObjectsAndKeys: + @"", @"name", + @"", @"_label", + @"", @"gl", + nil]; + [self parseAttrs:dict node:node]; + NSString *name = [dict objectForKey:@"name"]; + NSString *label = [dict objectForKey:@"_label"]; + + NSAssert1 (label, @"no _label in %@", [node name]); + NSAssert1 (name, @"no name in \"%@\"", label); + return label; +} + + +/* Creates a label: an un-editable NSTextField displaying the given text. + */ +- (LABEL *) makeLabel:(NSString *)text +{ + NSRect rect; + rect.origin.x = rect.origin.y = 0; + rect.size.width = rect.size.height = 10; +# ifndef USE_IPHONE + NSTextField *lab = [[NSTextField alloc] initWithFrame:rect]; + [lab setSelectable:NO]; + [lab setEditable:NO]; + [lab setBezeled:NO]; + [lab setDrawsBackground:NO]; + [lab setStringValue:text]; + [lab sizeToFit]; +# else // USE_IPHONE + UILabel *lab = [[UILabel alloc] initWithFrame:rect]; + [lab setText: [text stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]]; + [lab setBackgroundColor:[UIColor clearColor]]; + [lab setNumberOfLines:0]; // unlimited + // [lab setLineBreakMode:UILineBreakModeWordWrap]; + [lab setLineBreakMode:UILineBreakModeHeadTruncation]; + [lab setAutoresizingMask: (UIViewAutoresizingFlexibleWidth | + UIViewAutoresizingFlexibleHeight)]; +# endif // USE_IPHONE + return lab; +} + + +/* Creates the checkbox (NSButton) described by the given XML node. + */ +- (void) makeCheckbox:(NSXMLNode *)node on:(NSView *)parent +{ + NSMutableDictionary *dict = + [NSMutableDictionary dictionaryWithObjectsAndKeys: + @"", @"id", + @"", @"_label", + @"", @"arg-set", + @"", @"arg-unset", + nil]; + [self parseAttrs:dict node:node]; + NSString *label = [dict objectForKey:@"_label"]; + NSString *arg_set = [dict objectForKey:@"arg-set"]; + NSString *arg_unset = [dict objectForKey:@"arg-unset"]; + + if (!label) { + NSAssert1 (0, @"no _label in %@", [node name]); + return; + } + if (!arg_set && !arg_unset) { + NSAssert1 (0, @"neither arg-set nor arg-unset provided in \"%@\"", + label); + } + if (arg_set && arg_unset) { + NSAssert1 (0, @"only one of arg-set and arg-unset may be used in \"%@\"", + label); + } + + // sanity-check the choice of argument names. + // + if (arg_set && ([arg_set hasPrefix:@"-no-"] || + [arg_set hasPrefix:@"--no-"])) + NSLog (@"arg-set should not be a \"no\" option in \"%@\": %@", + label, arg_set); + if (arg_unset && (![arg_unset hasPrefix:@"-no-"] && + ![arg_unset hasPrefix:@"--no-"])) + NSLog(@"arg-unset should be a \"no\" option in \"%@\": %@", + label, arg_unset); + + NSRect rect; + rect.origin.x = rect.origin.y = 0; + rect.size.width = rect.size.height = 10; + +# ifndef USE_IPHONE + + NSButton *button = [[NSButton alloc] initWithFrame:rect]; + [button setButtonType:NSSwitchButton]; + [button setTitle:label]; + [button sizeToFit]; + [self placeChild:button on:parent]; + +# else // USE_IPHONE + + LABEL *lab = [self makeLabel:label]; + [self placeChild:lab on:parent]; + UISwitch *button = [[UISwitch alloc] initWithFrame:rect]; + [self placeChild:button on:parent right:YES]; + [lab release]; + +# endif // USE_IPHONE + + [self bindSwitch:button cmdline:(arg_set ? arg_set : arg_unset)]; + [button release]; +} + + +/* Creates the number selection control described by the given XML node. + If "type=slider", it's an NSSlider. + If "type=spinbutton", it's a text field with up/down arrows next to it. +*/ +- (void) makeNumberSelector:(NSXMLNode *)node on:(NSView *)parent +{ + NSMutableDictionary *dict = + [NSMutableDictionary dictionaryWithObjectsAndKeys: + @"", @"id", + @"", @"_label", + @"", @"_low-label", + @"", @"_high-label", + @"", @"type", + @"", @"arg", + @"", @"low", + @"", @"high", + @"", @"default", + @"", @"convert", + nil]; + [self parseAttrs:dict node:node]; + NSString *label = [dict objectForKey:@"_label"]; + NSString *low_label = [dict objectForKey:@"_low-label"]; + NSString *high_label = [dict objectForKey:@"_high-label"]; + NSString *type = [dict objectForKey:@"type"]; + NSString *arg = [dict objectForKey:@"arg"]; + NSString *low = [dict objectForKey:@"low"]; + NSString *high = [dict objectForKey:@"high"]; + NSString *def = [dict objectForKey:@"default"]; + NSString *cvt = [dict objectForKey:@"convert"]; + + NSAssert1 (arg, @"no arg in %@", label); + NSAssert1 (type, @"no type in %@", label); + + if (! low) { + NSAssert1 (0, @"no low in %@", [node name]); + return; + } + if (! high) { + NSAssert1 (0, @"no high in %@", [node name]); + return; + } + if (! def) { + NSAssert1 (0, @"no default in %@", [node name]); + return; + } + if (cvt && ![cvt isEqualToString:@"invert"]) { + NSAssert1 (0, @"if provided, \"convert\" must be \"invert\" in %@", + label); + } + + // If either the min or max field contains a decimal point, then this + // option may have a floating point value; otherwise, it is constrained + // to be an integer. + // + NSCharacterSet *dot = + [NSCharacterSet characterSetWithCharactersInString:@"."]; + BOOL float_p = ([low rangeOfCharacterFromSet:dot].location != NSNotFound || + [high rangeOfCharacterFromSet:dot].location != NSNotFound); + + if ([type isEqualToString:@"slider"] +# ifdef USE_IPHONE // On iPhone, we use sliders for all numeric values. + || [type isEqualToString:@"spinbutton"] +# endif + ) { + + NSRect rect; + rect.origin.x = rect.origin.y = 0; + rect.size.width = 150; + rect.size.height = 23; // apparent min height for slider with ticks... + NSSlider *slider; + slider = [[InvertedSlider alloc] initWithFrame:rect + inverted: !!cvt + integers: !float_p]; + [slider setMaxValue:[high doubleValue]]; + [slider setMinValue:[low doubleValue]]; + + int range = [slider maxValue] - [slider minValue] + 1; + int range2 = range; + int max_ticks = 21; + while (range2 > max_ticks) + range2 /= 10; + + // If we have elided ticks, leave it at the max number of ticks. + if (range != range2 && range2 < max_ticks) + range2 = max_ticks; + + // If it's a float, always display the max number of ticks. + if (float_p && range2 < max_ticks) + range2 = max_ticks; + +# ifndef USE_IPHONE + [slider setNumberOfTickMarks:range2]; + + [slider setAllowsTickMarkValuesOnly: + (range == range2 && // we are showing the actual number of ticks + !float_p)]; // and we want integer results +# endif // !USE_IPHONE + + // #### Note: when the slider's range is large enough that we aren't + // showing all possible ticks, the slider's value is not constrained + // to be an integer, even though it should be... + // Maybe we need to use a value converter or something? + + LABEL *lab; + if (label) { + lab = [self makeLabel:label]; + [self placeChild:lab on:parent]; +# ifdef USE_IPHONE + if (low_label) { + CGFloat s = [NSFont systemFontSize] + 4; + [lab setFont:[NSFont boldSystemFontOfSize:s]]; + } +# endif + [lab release]; + } + + if (low_label) { + lab = [self makeLabel:low_label]; + [lab setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; +# ifndef USE_IPHONE + [lab setAlignment:1]; // right aligned + rect = [lab frame]; + if (rect.size.width < LEFT_LABEL_WIDTH) + rect.size.width = LEFT_LABEL_WIDTH; // make all left labels same size + rect.size.height = [slider frame].size.height; + [lab setFrame:rect]; + [self placeChild:lab on:parent]; +# else // USE_IPHONE + [lab setTextAlignment: UITextAlignmentRight]; + [self placeChild:lab on:parent right:(label ? YES : NO)]; +# endif // USE_IPHONE + + [lab release]; + } + +# ifndef USE_IPHONE + [self placeChild:slider on:parent right:(low_label ? YES : NO)]; +# else // USE_IPHONE + [self placeChild:slider on:parent right:(label || low_label ? YES : NO)]; +# endif // USE_IPHONE + + if (low_label) { + // Make left label be same height as slider. + rect = [lab frame]; + rect.size.height = [slider frame].size.height; + [lab setFrame:rect]; + } + + if (! low_label) { + rect = [slider frame]; + if (rect.origin.x < LEFT_LABEL_WIDTH) + rect.origin.x = LEFT_LABEL_WIDTH; // make unlabelled sliders line up too + [slider setFrame:rect]; + } + + if (high_label) { + lab = [self makeLabel:high_label]; + [lab setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + rect = [lab frame]; + + // Make right label be same height as slider. + rect.size.height = [slider frame].size.height; + [lab setFrame:rect]; + [self placeChild:lab on:parent right:YES]; + [lab release]; + } + + [self bindSwitch:slider cmdline:arg]; + [slider release]; + +#ifndef USE_IPHONE // On iPhone, we use sliders for all numeric values. + + } else if ([type isEqualToString:@"spinbutton"]) { + + if (! label) { + NSAssert1 (0, @"no _label in spinbutton %@", [node name]); + return; + } + NSAssert1 (!low_label, + @"low-label not allowed in spinbutton \"%@\"", [node name]); + NSAssert1 (!high_label, + @"high-label not allowed in spinbutton \"%@\"", [node name]); + NSAssert1 (!cvt, @"convert not allowed in spinbutton \"%@\"", + [node name]); + + NSRect rect; + rect.origin.x = rect.origin.y = 0; + rect.size.width = rect.size.height = 10; + + NSTextField *txt = [[NSTextField alloc] initWithFrame:rect]; + [txt setStringValue:@"0000.0"]; + [txt sizeToFit]; + [txt setStringValue:@""]; + + if (label) { + LABEL *lab = [self makeLabel:label]; + //[lab setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]]; + [lab setAlignment:1]; // right aligned + rect = [lab frame]; + if (rect.size.width < LEFT_LABEL_WIDTH) + rect.size.width = LEFT_LABEL_WIDTH; // make all left labels same size + rect.size.height = [txt frame].size.height; + [lab setFrame:rect]; + [self placeChild:lab on:parent]; + [lab release]; + } + + [self placeChild:txt on:parent right:(label ? YES : NO)]; + + if (! label) { + rect = [txt frame]; + if (rect.origin.x < LEFT_LABEL_WIDTH) + rect.origin.x = LEFT_LABEL_WIDTH; // make unlabelled spinbtns line up + [txt setFrame:rect]; + } + + rect.size.width = rect.size.height = 10; + NSStepper *step = [[NSStepper alloc] initWithFrame:rect]; + [step sizeToFit]; + [self placeChild:step on:parent right:YES]; + rect = [step frame]; + rect.origin.x -= COLUMN_SPACING; // this one goes close + rect.origin.y += ([txt frame].size.height - rect.size.height) / 2; + [step setFrame:rect]; + + [step setMinValue:[low doubleValue]]; + [step setMaxValue:[high doubleValue]]; + [step setAutorepeat:YES]; + [step setValueWraps:NO]; + + double range = [high doubleValue] - [low doubleValue]; + if (range < 1.0) + [step setIncrement:range / 10.0]; + else if (range >= 500) + [step setIncrement:range / 100.0]; + else + [step setIncrement:1.0]; + + NSNumberFormatter *fmt = [[[NSNumberFormatter alloc] init] autorelease]; + [fmt setFormatterBehavior:NSNumberFormatterBehavior10_4]; + [fmt setNumberStyle:NSNumberFormatterDecimalStyle]; + [fmt setMinimum:[NSNumber numberWithDouble:[low doubleValue]]]; + [fmt setMaximum:[NSNumber numberWithDouble:[high doubleValue]]]; + [fmt setMinimumFractionDigits: (float_p ? 1 : 0)]; + [fmt setMaximumFractionDigits: (float_p ? 2 : 0)]; + + [fmt setGeneratesDecimalNumbers:float_p]; + [[txt cell] setFormatter:fmt]; + + [self bindSwitch:step cmdline:arg]; + [self bindSwitch:txt cmdline:arg]; + + [step release]; + [txt release]; + +# endif // USE_IPHONE + + } else { + NSAssert2 (0, @"unknown type \"%@\" in \"%@\"", type, label); + } +} + + +# ifndef USE_IPHONE +static void +set_menu_item_object (NSMenuItem *item, NSObject *obj) +{ + /* If the object associated with this menu item looks like a boolean, + store an NSNumber instead of an NSString, since that's what + will be in the preferences (due to similar logic in PrefsReader). + */ + if ([obj isKindOfClass:[NSString class]]) { + NSString *string = (NSString *) obj; + if (NSOrderedSame == [string caseInsensitiveCompare:@"true"] || + NSOrderedSame == [string caseInsensitiveCompare:@"yes"]) + obj = [NSNumber numberWithBool:YES]; + else if (NSOrderedSame == [string caseInsensitiveCompare:@"false"] || + NSOrderedSame == [string caseInsensitiveCompare:@"no"]) + obj = [NSNumber numberWithBool:NO]; + else + obj = string; + } + + [item setRepresentedObject:obj]; + //NSLog (@"menu item \"%@\" = \"%@\" %@", [item title], obj, [obj class]); +} +# endif // !USE_IPHONE + + +/* Creates the popup menu described by the given XML node (and its children). +*/ +- (void) makeOptionMenu:(NSXMLNode *)node on:(NSView *)parent +{ + NSArray *children = [node children]; + int i, count = [children count]; + + if (count <= 0) { + NSAssert1 (0, @"no menu items in \"%@\"", [node name]); + return; + } + + // get the "id" attribute off the + //