From 4f3c8b650abe8ba6b468a2bc1fe6d8ee3591cd6c Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 5 Feb 2011 06:38:33 +0100 Subject: [PATCH] Adding upstream version 3.31. --- NEWS | 11 + README.menu | 78 +- com32/include/colortbl.h | 9 + com32/include/dmi/dmi_processor.h | 3 + com32/include/sys/pci.h | 32 + com32/include/unistd.h | 1 + com32/lib/Makefile | 12 +- com32/lib/libcom32.a | Bin 1328742 -> 1349286 bytes com32/lib/memcpy.S | 36 + com32/lib/memcpy.c | 29 - com32/lib/sys/{vesacon_write.c => ansi.c} | 324 +++----- com32/lib/sys/ansi.h | 64 ++ com32/lib/sys/ansicon_write.c | 848 ++++++--------------- com32/lib/sys/colortable.c | 2 +- com32/lib/sys/file.h | 6 + com32/lib/sys/isatty.c | 1 + com32/lib/sys/opendev.c | 14 +- com32/lib/sys/screensize.c | 23 + com32/lib/sys/vesa/.alphatbl.o.d | 3 + com32/lib/sys/vesa/.background.o.d | 2 +- com32/lib/sys/vesa/.drawtxt.o.d | 3 +- com32/lib/sys/vesa/.initvesa.o.d | 3 +- com32/lib/sys/vesa/alphatbl.o | Bin 0 -> 6788 bytes com32/lib/sys/vesa/alphatbl.pl | 54 ++ com32/lib/sys/vesa/background.c | 115 ++- com32/lib/sys/vesa/background.o | Bin 22720 -> 25400 bytes com32/lib/sys/vesa/drawtxt.c | 226 ++++-- com32/lib/sys/vesa/drawtxt.o | Bin 12116 -> 18552 bytes com32/{include/colortbl.h => lib/sys/vesa/fill.h} | 48 +- .../colortbl.h => lib/sys/vesa/fmtpixel.h} | 58 +- com32/lib/sys/vesa/initvesa.c | 126 ++- com32/lib/sys/vesa/initvesa.o | Bin 10012 -> 10148 bytes com32/lib/sys/vesa/video.h | 36 +- com32/lib/sys/vesacon_write.c | 720 +++++------------ com32/lib/sys/vesaserial_write.c | 2 + com32/lib/sys/xserial_write.c | 2 + com32/libutil/libutil_com.a | Bin 20076 -> 20076 bytes com32/libutil/libutil_lnx.a | Bin 90972 -> 90780 bytes com32/modules/Makefile | 7 +- com32/modules/chain.c32 | Bin 3464 -> 3464 bytes com32/modules/cpuidtest.c32 | Bin 9988 -> 9988 bytes com32/modules/dmitest.c32 | Bin 21004 -> 21004 bytes com32/modules/ethersel.c32 | Bin 5412 -> 5412 bytes com32/modules/mboot.c32 | Bin 46464 -> 46764 bytes com32/modules/menu.c32 | Bin 27800 -> 28484 bytes com32/modules/menu.h | 2 +- com32/modules/menumain.c | 57 +- com32/modules/pci.c | 191 +++++ com32/modules/pcitest.c | 70 ++ com32/modules/pcitest.c32 | Bin 0 -> 10276 bytes com32/modules/readconfig.c | 159 ++-- com32/modules/vesamenu.c | 2 +- com32/modules/vesamenu.c32 | Bin 107588 -> 115104 bytes com32/samples/Makefile | 2 +- com32/samples/cat.c32 | Bin 5516 -> 5516 bytes com32/samples/fancyhello.c32 | Bin 7972 -> 8272 bytes com32/samples/fancyhello.lnx | Bin 13696 -> 13648 bytes com32/samples/hello.c32 | Bin 4748 -> 4748 bytes com32/samples/keytest.c32 | Bin 8868 -> 9168 bytes com32/samples/keytest.lnx | Bin 20814 -> 20774 bytes com32/samples/resolv.c32 | Bin 4104 -> 4104 bytes com32/samples/vesa.c | 31 - com32/samples/vesa.c32 | Bin 85496 -> 0 bytes com32/samples/vesainfo.c | 83 ++ com32/samples/vesainfo.c32 | Bin 0 -> 4616 bytes dos/syslinux.com | Bin 16916 -> 16916 bytes extlinux.bin | Bin 10384 -> 10384 bytes extlinux.bss | Bin 512 -> 512 bytes extlinux.sys | Bin 9872 -> 9872 bytes extlinux/extlinux | Bin 23297 -> 23297 bytes gethostip | Bin 6577 -> 6577 bytes isolinux-debug.bin | Bin 11424 -> 11424 bytes isolinux.bin | Bin 10764 -> 10764 bytes ldlinux.bin | Bin 10288 -> 10288 bytes ldlinux.bss | Bin 512 -> 512 bytes ldlinux.sys | Bin 9776 -> 9776 bytes memdisk/memdisk | Bin 19132 -> 19132 bytes mtools/syslinux | Bin 22497 -> 22497 bytes pxelinux.0 | Bin 13316 -> 13320 bytes sample/m16-640x640-syslinux.jpg | Bin 0 -> 46191 bytes sample/syslinux_splash.jpg | Bin 0 -> 56299 bytes syslinux.spec | 75 +- unix/syslinux | Bin 26657 -> 26657 bytes unix/syslinux-nomtools | Bin 26657 -> 26657 bytes version | 2 +- version.gen | 4 +- version.h | 4 +- win32/hello.exe | Bin 10752 -> 10752 bytes win32/syslinux.exe | Bin 29184 -> 29184 bytes 89 files changed, 1850 insertions(+), 1730 deletions(-) create mode 100644 com32/lib/memcpy.S delete mode 100644 com32/lib/memcpy.c copy com32/lib/sys/{vesacon_write.c => ansi.c} (51%) create mode 100644 com32/lib/sys/ansi.h rewrite com32/lib/sys/ansicon_write.c (71%) create mode 100644 com32/lib/sys/screensize.c create mode 100644 com32/lib/sys/vesa/.alphatbl.o.d create mode 100644 com32/lib/sys/vesa/alphatbl.o create mode 100644 com32/lib/sys/vesa/alphatbl.pl rewrite com32/lib/sys/vesa/background.o (88%) rewrite com32/lib/sys/vesa/drawtxt.o (99%) copy com32/{include/colortbl.h => lib/sys/vesa/fill.h} (64%) copy com32/{include/colortbl.h => lib/sys/vesa/fmtpixel.h} (58%) rewrite com32/lib/sys/vesa/initvesa.o (98%) rewrite com32/lib/sys/vesacon_write.c (74%) create mode 100644 com32/modules/pci.c create mode 100644 com32/modules/pcitest.c create mode 100755 com32/modules/pcitest.c32 rewrite com32/samples/fancyhello.c32 (65%) rewrite com32/samples/keytest.c32 (67%) delete mode 100644 com32/samples/vesa.c delete mode 100755 com32/samples/vesa.c32 create mode 100644 com32/samples/vesainfo.c create mode 100755 com32/samples/vesainfo.c32 create mode 100644 sample/m16-640x640-syslinux.jpg create mode 100644 sample/syslinux_splash.jpg diff --git a/NEWS b/NEWS index 95c41113..d8a8a643 100644 --- a/NEWS +++ b/NEWS @@ -2,10 +2,21 @@ Starting with 1.47, changes marked with SYSLINUX/PXELINUX/ISOLINUX apply to that specific program only; other changes apply to all of them. +Changes in 3.31: + * The simple menu system (menu.c32 and vesamenu.c32) now + support loading more than one configuration file at a time, + using MENU INCLUDE or by specifying multiple filenames. + * The MENU COLOR statement can now control the shadowing mode. + Changes in 3.30: * libcom32 extended to support graphics mode and graphical console. * vesamenu.c32, new graphical version of the Simple Menu System, see README.menu. + * New com32 modules by Erwan Velu do selection based on CPUID + or PCI devices present. + * RPM spec: add syslinux-tftpboot module; move syslinux by + default to the /usr/share/syslinux directory. + * RPM spec: extlinux is now a separate package. Changes in 3.20: * EXTLINUX: New options --install (-i) and --update (-U), to diff --git a/README.menu b/README.menu index 2209ba1b..6f0fd83c 100644 --- a/README.menu +++ b/README.menu @@ -113,7 +113,15 @@ MENU BACKGROUND filename be 640x480 pixels and either in PNG or JPEG format. -MENU COLOR element ansi foreground background +MENU INCLUDE filename + + Include the contents of the configuration file filename at + this point. Keep in mind that the included data is only seen + by the menu system; the core syslinux code does not parse this + command, so any labels defined in it are unavailable. + + +MENU COLOR element ansi foreground background shadow Sets the color of element "element" to the specified color sequence: @@ -178,25 +186,36 @@ MENU COLOR element ansi foreground background represents fully transparent, and #ffffffff represents opaque white. + + "shadow" controls the handling of the graphical console text + shadow. Permitted values are "none" (no shadowing), "std" or + "standard" (standard shadowing - foreground pixels are + raised), "all" (both background and foreground raised), and + "rev" or "reverse" (background pixels are raised.) + + + If any field is set to "*" or omitted (at the end of the line) + then that field is left unchanged. + + The current defaults are: - timeout_msg - screen 0;37;40 #80ffffff #00000000 - border 0;30;44 #40000000 #00000000 - title 1;36;44 #c00090f0 #00000000 - unsel 0;37;44 #90ffffff #00000000 - hotkey 1;37;44 #ffffffff #00000000 - sel 0;7;37;40 #cf101010 #20ff8000 - hotsel 1;7;37;40 #ff353535 #20ff8000 - scrollbar 0;30;44 #40000000 #00000000 - tabmsg 0;31;40 #90ffff00 #00000000 - cmdmark 1;36;40 #c000ffff #00000000 - cmdline 0;37;40 #c0ffffff #00000000 - pwdborder 0;30;47 #80ffffff #20ffffff - pwdheader 0;31;47 #80ff8080 #20ffffff - pwdentry 0;30;47 #80ffffff #20ffffff - timeout_msg 0;37;40 #80ffffff #00000000 - timeout 1;37;40 #c0ffffff #00000000 + menu color screen 37;40 #80ffffff #00000000 std + menu color border 30;44 #40000000 #00000000 std + menu color title 1;36;44 #c00090f0 #00000000 std + menu color unsel 37;44 #90ffffff #00000000 std + menu color hotkey 1;37;44 #ffffffff #00000000 std + menu color sel 7;37;40 #e0000000 #20ff8000 all + menu color hotsel 1;7;37;40 #e0400000 #20ff8000 all + menu color scrollbar 30;44 #40000000 #00000000 std + menu color tabmsg 31;40 #90ffff00 #00000000 std + menu color cmdmark 1;36;40 #c000ffff #00000000 std + menu color cmdline 37;40 #c0ffffff #00000000 std + menu color pwdborder 30;47 #80ffffff #20ffffff std + menu color pwdheader 31;47 #80ff8080 #20ffffff std + menu color pwdentry 30;47 #80ffffff #20ffffff std + menu color timeout_msg 37;40 #80ffffff #00000000 std + menu color timeout 1;37;40 #c0ffffff #00000000 std MENU WIDTH 80 @@ -228,6 +247,10 @@ link; you probably want to set your baudrate to 38400 or higher if possible. It requires a Linux/VT220/ANSI-compatible terminal on the other end. + + +++ USING AN ALTERNATE CONFIGURATION FILE +++ + + It is also possible to load a secondary configuration file, to get to another menu. To do that, invoke menu.c32 with the name of the secondary configuration file. @@ -236,3 +259,22 @@ LABEL othermenu MENU LABEL Another Menu KERNEL menu.c32 APPEND othermenu.conf + +If you specify more than one file, they will all be read, in the order +specified. The dummy filename ~ (tilde) is replaced with the filename +of the main configuration file. + +# The file graphics.conf contains common color and layout commands for +# all menus. +LABEL othermenu + MENU LABEL Another Menu + KERNEL vesamenu.c32 + APPEND graphics.conf othermenu.conf + +# Return to the main menu +LABEL mainmenu + MENU LABEL Return to Main Menu + KERNEL vesamenu.c32 + APPEND graphics.conf ~ + +See also the MENU INCLUDE directive above. diff --git a/com32/include/colortbl.h b/com32/include/colortbl.h index 83a13432..ac3f340d 100644 --- a/com32/include/colortbl.h +++ b/com32/include/colortbl.h @@ -31,11 +31,20 @@ /* Attribute/color table used by ansicon and vesacon to abstract out the color selection. */ +/* Note: vesacon relies on the encoding of these numbers */ +enum color_table_shadow { + SHADOW_NONE = 0, + SHADOW_ALL = 1, + SHADOW_NORMAL = 2, + SHADOW_REVERSE = 3, +}; + struct color_table { const char *name; /* Attribute name (used for customization) */ const char *ansi; /* ANSI attribute */ unsigned int argb_fg; /* ARGB for foreground */ unsigned int argb_bg; /* ARGB for background */ + enum color_table_shadow shadow; /* Shadow mode */ }; extern struct color_table *console_color_table; diff --git a/com32/include/dmi/dmi_processor.h b/com32/include/dmi/dmi_processor.h index 4473d935..34177202 100644 --- a/com32/include/dmi/dmi_processor.h +++ b/com32/include/dmi/dmi_processor.h @@ -78,6 +78,7 @@ bool pae; bool mce; bool cx8; bool apic; +bool null_10; bool sep; bool mtrr; bool pge; @@ -87,6 +88,7 @@ bool pat; bool pse_36; bool psn; bool clfsh; +bool null_20; bool ds; bool acpi; bool mmx; @@ -96,6 +98,7 @@ bool sse2; bool ss; bool htt; bool tm; +bool null_30; bool pbe; } __attribute__((__packed__)) s_cpu_flags; diff --git a/com32/include/sys/pci.h b/com32/include/sys/pci.h index f1c1eb55..b3099584 100644 --- a/com32/include/sys/pci.h +++ b/com32/include/sys/pci.h @@ -4,8 +4,39 @@ #include #include +#define MAX_VENDOR_NAME_SIZE 255 +#define MAX_PRODUCT_NAME_SIZE 255 +#define MAX_PCI_DEVICES 32 +#define MAX_PCI_BUSES 255 + typedef uint32_t pciaddr_t; +typedef struct { + char vendor_name[MAX_VENDOR_NAME_SIZE]; + uint16_t vendor; + char product_name[MAX_PRODUCT_NAME_SIZE]; + uint16_t product; + uint16_t sub_vendor; + uint16_t sub_product; + uint8_t revision; +} s_pci_device; + +typedef struct { + uint16_t id; + s_pci_device *pci_device[MAX_PCI_DEVICES]; + uint8_t pci_device_count; +} s_pci_bus; + +typedef struct { + s_pci_device pci_device[MAX_PCI_DEVICES]; + uint8_t count; +} s_pci_device_list; + +typedef struct { + s_pci_bus pci_bus[MAX_PCI_BUSES]; + uint8_t count; +} s_pci_bus_list; + static inline pciaddr_t pci_mkaddr(uint32_t bus, uint32_t dev, uint32_t func, uint32_t reg) { @@ -30,4 +61,5 @@ void pci_writeb(uint8_t, pciaddr_t); void pci_writew(uint16_t, pciaddr_t); void pci_writel(uint32_t, pciaddr_t); +extern int pci_scan(s_pci_bus_list *pci_bus_list, s_pci_device_list *pci_device_list); #endif /* _SYS_PCI_H */ diff --git a/com32/include/unistd.h b/com32/include/unistd.h index 84120d38..d0b8309c 100644 --- a/com32/include/unistd.h +++ b/com32/include/unistd.h @@ -20,6 +20,7 @@ __extern ssize_t write(int, const void *, size_t); __extern int isatty(int); +__extern int getscreensize(int, int *, int *); /* Standard file descriptor numbers. */ #define STDIN_FILENO 0 diff --git a/com32/lib/Makefile b/com32/lib/Makefile index d84b7c60..a6355c9f 100644 --- a/com32/lib/Makefile +++ b/com32/lib/Makefile @@ -28,7 +28,7 @@ LIBOBJS = \ sys/fileinfo.o sys/opendev.o sys/read.o sys/write.o sys/ftell.o \ sys/close.o sys/open.o sys/fileread.o sys/fileclose.o \ sys/isatty.o sys/fstat.o sys/openconsole.o sys/line_input.o \ - sys/colortable.o \ + sys/colortable.o sys/screensize.o \ \ sys/stdcon_read.o sys/stdcon_write.o sys/rawcon_read.o \ sys/rawcon_write.o sys/err_read.o sys/err_write.o \ @@ -36,10 +36,13 @@ LIBOBJS = \ \ sys/xserial_write.o \ \ + sys/ansi.o \ + \ sys/ansicon_write.o sys/ansiserial_write.o \ \ sys/vesacon_write.o sys/vesaserial_write.o \ sys/vesa/initvesa.o sys/vesa/drawtxt.o sys/vesa/background.o \ + sys/vesa/alphatbl.o \ \ pci/cfgtype.o \ pci/readb.o pci/readw.o pci/readl.o pci/readbios.o \ @@ -75,7 +78,7 @@ libcom32.a : $(LIBOBJS) $(RANLIB) $@ tidy: - rm -f *.o .*.d */*.o */.*.d lib/sys/vesa/alphatbl.c + rm -f *.o .*.d */*.o */.*.d sys/vesa/alphatbl.c clean: tidy rm -f *.a @@ -93,7 +96,10 @@ install: all sys/vesa/drawtxt.o: sys/vesa/drawtxt.c $(CC) $(CFLAGS) -O3 -c -o $@ $< +sys/vesa/alphatbl.c: sys/vesa/alphatbl.pl + $(PERL) $< > $@ + jpeg/jidctflt.o: jpeg/jidctflt.c $(CC) $(CFLAGS) -O3 -c -o $@ $< --include .*.d */.*.d +-include .*.d */.*.d */*/.*.d diff --git a/com32/lib/libcom32.a b/com32/lib/libcom32.a index 23081b854f885d1da30aa2b173bbb3f24b969937..317d94f96e8da10634133f61fa3d2ed00c9fecac 100644 GIT binary patch delta 208062 zcwWqX33wF6)@W6A_snD=8InLkSQ3($3?z^c0)%}>mPi7!Zwae_ki-xrA`(PFKxAv+ za9JawA|fDBS`h&e0f7sMii!$|8-fCI(aS}YcTQDLG6U-U-}~?T-^)jLb#?d5)H!wb zbE^1uUa#k0?!B;PY4h}qrj46s#>S?_(x2}+Hnvft=1tUfULa$lfU(qmjAceM*6tKz z-8VAUXE9^L#xOQ^8e>K07@P7uW7F3#Huqb`mSVduov}?tjBW4D*zR?e$3A@bn1iv> zPrESo?J&mvv7fQuLl_TgapzHE|D8utcXc%H$#~nNjCUW#_`Qo6AG(9_5qRYP!g$F^ z#vk9t_|sDuU-l5=&t7HxWjw6CjK7V)_4jS8l%Kl9_&4(zzakjFae@hb1`{FUnTT$| zMEou$QXXQW=`<$Vo@AmM-oN(}6GMJyVjSL^w2X;q9hjJn$Kvfwte(rnrgKbe4`X7F zqw+X@iV6H3@y$jiE;nT2Un`iVU1eHGeks$U4lyl$F4NMgGp+earse&@wEHhGZE|m> z&A{uYdom3+GtHX9w4L*rwjbX=yq9Um@!gN`y;C=s_8s=GwqV+CCz&3wj_Hx7n4Z|B z@@QZmjnmc9ei+kx#4&w9DZV%wFG|9gK0BZ3%Xct+!wjas(VOYVTQL3GT}=PiMrH&= zGowZkGZJPoqv;rRv>U{XoL$Tqaf%rarK@8uzPCD#880_v##R9xPI$m7EN}W4*Fz2xw z%=uLqb6)AfTv{}9RgYt?dLhi!w1~Mnb*Vi1*HK5YK7{M#cis&ogQ?4$otbri?3z$M@Q&m5)y?uGvgM^Ken6-TLW=YQnbFva&M zz5T}j@KO5jUijl9IOW2B<|zGlFZ{((CHa^C_E9P?X2t!#I!f=j88Um;f9nXXHKOtu zoPOuAYMIYby6mWOH{tu6;_bt2gcq{OZqx6q%`W|5cNB{ijHUGbR zl>YS#7svl^9pP=dv+yC)Soow%EPS4Wg>OH~!oQrwBD66qB4!wi=surCJh+)fJl2p! z%t{|VqM-bAc_AXV@WJAdV}}>9+}z>$lg8za%O6*4?g&Y% zqWU8X@^cFcCz;=eJPyt;9PW@24;PP~lv_BuD7SE2$!J)y#gS$%35|Bsi*#o~?wEq2 ziNlNG@_I)Ugl=^NLc=c{LFU=ez_d{X*(ZhYe zP~D(M^a_MN?5tT{;(n;M#!^$wpBgkUYd7rbl$LRmrf{WN)o61>GY@ZPZfRIra|T08 zxGtV_r#3FXnCXUi4SU=n4w&6i~Z9&NL#-xby_$ zpp!8dl)6N`nV(+9kDH;5v-tos7teX-md4rUu*Sh=U`8i%Gq!^=V)^^#BN_30pt&|9 zNz4+Ew@W1QS>|QzZFN9a5cal~w{0SX?|^GS-5|Xlk2RlawuW~y>t{CPlgkHY8XUrx z^CWkp)R6@f8>gpE7&n5A8CjfPzUYlc+&tYPL456m>0u%fj^3+B!LBgjHtV;HGB>BY z%_%KBsMNXwqQk9q6OB(p;+j~L=Ib9N@0i(BQG(XE1Ee1xcF2DbK?#(-C>@6D^VPDT4mKl2shK)e&+?mjBOWXZY`=Wu4zz~ zphcKNx)+*9`b6FT4B;CO=A^kesIWhnt_|;$%)y?^5H0ALOLV1YPBB`}nkb@YPO(aU zPG3aLhja?&jhXs$+pPg+cHg}adQ1;An{~*P$m5NmZf_$3l5g@Tb76;x<~=_Km*3kl zhQnu>Mx;5dX99l}3fgIpm>~nR_)c^1z-%!pU@>CpLT3-3U}o=3GFx=XfgAtQY=mv= z;^9xgmI#q#BnrkpmFT)9AZ@NQ337LdB$1*)-m4-g-B)?D`4#BGafQ5x7qwuugUsKVsgWoh^}N2JWn7 zp36pDNgSr<YS*2$hvY*Jt+qWdz;_cnT!o4k$!2KSa(}h-|G8*+U_6 zltSbK3Xv;)5IIaCvc>I)Tvndl*Tv!awA-*&(r=t3v}XO|Y*|8hdcBg+_DDh-TR~`r zHld}MJqIP28wc97wqlUSyfM&b&Lo84Gf8bi12+h2?E==I%pA8A& z4uvPk-NZYh7-&4~U|nn$Tsilh=5^@!mC1Q7>;WGp+086ky*T!nR+yjubEv9EXyo+c$L^m`9Uqi8Jje}&mRhKOR~LFTI$K4Fqj z?x!b)Si>ZR5a3851DK=`(k3pa{x$Wg5bqf4>3MH6Z(L+1VU-80_hRdBvO5&d{pkmt z`bPTj7W(KW`Ae)PU9(JR-;u|Z9~~E>#C?#DxHmr=zlI12de(J1%TL~4vyz%%`&r?E zo;f@UHn-DSna@wmGBN`g+hZPU8E;1Cd&G4wq6G_-a(_pDj&KJ;UW7=KGuK@p^B=Lyy%O%rp8%#!18jJ`QaC3~F zXr7+Z92IrcBX6K~|NfEd-XAJ4^B>JZ@&4wclf|nBq!s9i#&u~4(S9xt*vOvhVd zDp$XX?Q!fQh`&xtGKLt8g__xgy`Wtw&oT45rkU4EXL^URY`QDj+*affqjdAi_G;!A z)87~+$*w(~0xG9p6#G)2-in@tb|#u4a^YTb9M62oQF5e95Je$5K1Mg4j+g1?^70#x zb>!w#2mJ}C)#Iy)fUM0KTC`0(!)7M%1jU^jXO{64v&XD#=sra#k-c}82UbvL5O%_z z%rRHYvW3yyCq3qcS++2mk2LeOq?sZ`Giw#itd%q)ZlYmQ%#(D4w>rwBAYQ(0PO>j+ zMw`Q%)#G2ATi%T_+dlPi3rRK|@RUQKwPqDEyAnf>S7NA&eEt%hyO-z8Ya-wuyTg;9 za0@rgU+0Iw6EBA*1y-V=Jm-2-ZnjyNz}HK-VSaLivX|h}94*B>y)cV!GLsi&i>yH6 znRSaiqL1R4tBZ2XDT{0jj9=_A4=u7WFivA^w#2|s5(A=+u80L&X)8^2Nn2@NfZ49e zKGXd`_wvO{YF1F|vipQG`$QiHoQ)UN%R`n8<^xU;Owo9XW42;OJS_CXL*LsesIwMV1{OQfc+L1SRGjns{6JZ9h; zg;d8-9iigp*(c+~2t!(+3k-!-Y$aBI2#{F483@PEYSooUI#KpyrA=^UXcTnn%j-j( zd1$Q+`xok%9qV=`)ghn=0h0+Mz44?ar_ot&O4z+e;jp^7`q`+~B&kK{a6CICr8(cE zGhrOHWVVg98g}ab%zmr|$9yuAJO&}uYln#_R&Pb+h~l@&rFn!8wYy2E0jF7RsRU9X>k zONTWZo+)oc-DdZ!GxzRD5Tjg*>OtPty8v^JEhz$o++)Ht}e(~s3WZx^DAb^?pwYJFACowm|i#g@0rU- zL$A|XxcT#*3{-dR-_C$br?rUkxo`L3Xqlhco6N_-$NRN-{-K%r4ysQ$b{5@Uk6DVH zYY_7#cDkC!-bpgfqiov)sUPF38_Hw$b@Aga-k2$7Cz#U?+qlg?;xUgNwsHF<;`V9D5c!HBRw{;AsqDt<(q48U*F`G*wCrfm zoic=vGA|zcG_*E>MMm970`ea7{hwp_GV`aOtMUG3!25~r-ckaPJxDI8YiN1f_ov!+ za>@rWrg;00$={szVS-2qfUOPmDQ2CIvQQP@|4}wFKb-v@S@PSD5^Tm#Kk3W(8&CQ$ zKK~FxcZo>2gtCGcC`eZ+NLSsViV0MW!{!IMtNg?#@fG@b_j_n6H#c7?LOLpMd#W2R zJw_0bEJ&8DfPY%Bl$Oio)JjKGbCbT-)hug4oTgrTf=M@PC*i@+MoNCt$fFWY?KvhL zt6%6-!OiF!4k>z(vL=+oh~boXjB;##huWOSo2j37MA!2P&ST5X&qoNtre8#)OSi1f zQ1>Q}LtixzTI#$#OfS@u%%{(U8Zy>pJ(Ho;`E z>WZzcuGrctClD4cLPN4J$YxCH9n3D{Fi1O**ZRMpuF`mq5ZT%dx1jxqYCXWNVFSdCGNt*Eg~I1(32=~>_j|sB;a?58mgx| zWb`50-15B(8U6L|6GQ9Kr z9BXs&no9{{Ul5ed(a_bsRE8w|)a7h(Q`!XLibv>Gq)pKKN{)Hzvdzhdu6WG)S8SW$ zL&S2X!g8=fV!63PVHsPA<>i6WCfE>EDJNmqV%=4K_39RWyIpRk4~sB=zqT(liLgYh zO#u|qS90}o$<;k2S4#`3lB;veTmSMjH+$coWVXB>c_&kQr4})Dip|uCH?oWjWV{Vh zv#+?}sj#zQSGe#ov|IdIX=uZ)bHc~c{uC#FwbW^YMz815)`CX_imOw#Tx@-(ix6Nt62Vu!DG*aj3(29DfknbKZeFE#%|Uzu;l0r}M>?Y@1}`H1W$a_}0O* z%&>DF806$0*xW!5HuKNbf{oZSx8dy@PV~j5?8I42c*YBu3u zyLF>8iQC*cJ;<6KsX3Hnv{nT2m;Cv&X;Z0VbF2ly{0diy-HNARg4r#RCcU}J_|h(k zJJD9+PTJyVgilj=Uo26m%WokQoL8-gWQKFq8gI~jH{B+G$ha=M^a+%xb(!Iy-*kVE zeTp(TB%;Hp`#K)Zdmtv1CpSGpcO3!xWo!e9eS?0ZJ0bL*q0wi8pQ0NUQY7)KZf(L~->TdvfO3Tzx(e(js}H(G`EEHM-lT zbt#hnDtuM}AEM#jI`0Jm!K_>`seJn%)P0z1wU#)HX1CXQg@8hyXv(uw{9_~X#CHm_Ol5&A?N zUx&?9Jfu=A)*bST>e3gHV}-Bh!Q$FH(WS;%rIWR%Hb2jyPoD4-sPIAzpKEqXOR-*v z)ij>rOgZb*MPD<3saG0U#T#A~9rx{}6M+tax&ohR_Fa3CF7XAeX+=4<&`uo`1;Iyf`1 znGOA^SqLv=@X35D#5BR)>rl`Hzy1jh$6JKPAzZtg;Cvl&skGA}2yKd<%2sGb4YP8a z@(y~%+#P>6Aj-^ZR-aF`F1Fx{_-!${DrU@%0BF#f_k|uyv`BNsLmt@Gny=zt!{9c2 zvS{T{QL~l^?&B(Iw#$y1U9_WS7wxFoO&K*if(&2XFKPzM+ws+vD`E- z1UN=b3dD3pX>{~%6hHNcaMZC~kw@xu#qJdB8cT8RX2QxLJYGcWuxAKQ6nER<9Bkb~ zc_J@?E!_}}C04;K5z67)?);zLv7;Lu$($5*?0NLFS2&BEM)JAoDjE_I}}BF1szGJI9(3D(FR+eX2`RLg|Hyjum7Br za}LZo^!E4S=0BdBB*r}V%U)j0*XIs12@ z4Ns|Yb?XX_?5*5wi5vA9X!Ie{FS*`L%%4(g@S3puL(Re_6uoW=_C%S}_PXI{m`Fi# zev({q^#AuJ8KfC(-+T%A=Hhoo@vTJs06FKcD(5_toOAvO6ktb`Abk$y#gKPUOTQ~n zjg`?*!YIR00fV}rXDLu{PHP6U#`Ew>0Y08bap`?PQ7W=d{s!T&ZjR@Dc<9|U!xTQG zAdhGVRiEZj4yjvb!lM&-WbJu$9YUTWQMxl9J0$hU`EV?SS0B~8!Ngb{w&o%Ucb&|S zsbm=iH+nE-=#q&ZN1zTp=ZXx-naFkPrxN5?>G8|pMkr!^V!=bBncd#b z(YByE`Uu}={D20>YzQ60<6*~C6iT}m;feTyLSAU?KFV`o7G0fq6i+Ad%J^A$r4^r| zIO7Gy880Z-{={bOPh3{vEPzXd{fZ}j>32$T_dYWhO00L(6@WO^8&0hCs2m69) zRUOD{*&wa?2h!KkE-1f_E<{2{Nw)|`JOp-AGYUc%qoP70uoczj#flPaMfG*%)Q?kB zzf4X2GBx!F?WsTLvdR{UNDgO~@RPoJN~C9~xgTQPTFP4r-vlm&NMQcokQHNHe^OWi z^;aO4J@Cj1!ZKBsK$mn8W$rrc7RzOM33OPA6nkie*Y4l35?_yAY1{qAwTc z^9mz6RB;lo;jbw#%{KfGNU{|&qVE#QwG}E(qA$VbBRqmdps^HwE#p0F5C@=~l*JPG z*V=A_m%@l=_+b7h?0N=g_g?F>XZRZ&zIt7&@R?RW%b&FJ*P}dDa_;1FXyzS+U!UU# z9MXN1At$)-JP|fp?9k!`PLE?D+U=prZeOdU z-4R>b9Z}LQAO+Py4gy>q+BW4eVrtN`mz>K0y(hP|_eBoEN6SZivSt7| zp`}sFQHTSZ!KC2}Q*vY?09k5Xj!1#9rku)pLSIGp_!>f!#cPoFdeC@S^L$m8HS9GW z?kD)keStdd43#W`6We)tvP=$;TFWCuP+CCvW{X-W%t*~>KJ#pNj6;^xm~^Vl5JlUq zbD(w3LeE$xg`|D}_f;MWZ@qy7PQ2=`8m%L5pr%pOBHl!)NSP5b9m)`t%Wp~%(RL>` z6JWtkloS<(Nzm{uUQwAe2a&TvM!(}#OgKkLi5zI#QM;E%%RsQzb2oQZpu*0ODB;it z*6!i2DSBvwr_O&$4^%Y6o5Q1T^YfKy68LN{PE%!`WHrS8S|tz)pQ*a8GUp@mTySM8 zPo%UD?BB<;93`j<$J*r3;$0*MG;Ad~%zc;VkYPK08)^ZuAHg`?*>FK(OCuJh>_@UV z^{$sJPH{<6L>8hq8oo_X7?#>123vPi6#NmAG|=*u@xmA8Pjzu?<3S!;5%oz;)jEoW z4k+8=jJE0=;^jOvi{LC}ws7eTXAdLGPlDeL^V$i|(6dNsYp%8D+_jAERi}Usk&$a9 zv^m0S^Cw}*5q=M!4;!hOVqHJN|H0wb<~z-!RBPlhq8Z6E`;Vhc&aus-7VmRAd5u>k z#(*Hk&Qg34PQ6c(wi%L3{S$aKp01{xKxCbxtE+S`JyY|Df9jC-jAk25Ym^8%Y>SY? zw!!3)Ayp$Y$eSRsqCY}W=O=?jV^#RE)!KcM-^WY8B#>Qy;QFs-z7|B7a{Y-}(1JM1 zqy-`UZkJZbqy-^MWt8jxHdC%Y3HM6Zzs_H|{tcw-UoYO@^=Fm62EL6}QlAeSD51*fIq zDl-V5PzGT#g=B0lJ$i;j{TXiQqDHCVo zhz;~oIn{V-(Ds9oE7~WPqkTM*zdfe%;pc!d*gSMKn_`9GCjzYFX?h5^ zwh7VFPtV)BO}npT=2PEzdanIqaZIPMfhikzuL1C{9`E^#1$swy`i z3L;?lD?A3q2MCYo6kz5xPJ|tFofTki#p}R8ydDy;I3p1T(dDQBGbba_2*ZJ2qoQzu zGOsKnkvCR#n~gQ|3ik4#M-cW<7aor>_Q9S~-ojk*QVr{=V3FuMd|5GU-q;jrzOil~ zj1Ljxm61ZG$bB?F-EXIn&dlFPaXN?&@CR#zio5tgt8J+0CT)^Il#jWCRR{y(n)Czq z^P6OPBtbqUt-RH}GKHned#O}K)%T)|>m+M?cTjR#nIJ6{LyT1nF;+5!IpWn6Yh5)F zr=g-gS`gFkMZ3OAlxV{pWQ_7P(5RuP?jRQv{qTu3L~ULGPt_20xCt9; zh-dDaDZvfVDVwQsmXjs%x+y|Q{i-Z%u2mQOtlNQPWyc z3#ms@^o80;3iBYejyPbfLUueTmF@3!Xo`cVPN!!KUQP&-&d-_{k%MyYa*W7E@@X3@ zlKD&0+c~OB>He!twZGa_J3s{{##*U$#Temli#3x|erbCIT#XmY0;MrVHdr?}{W-dJ z9bjXEXvJGw-zA6!wh=xvQB?CfAl~{EIg@733>W;8B=+z!a|=3cr#(34C|PFIupUlh zEKXxG%%~@_cp4n5hojGgnEE(+wH)AG<*Qw_4XLZPua@JK2{c}4p^+Wu6N9T(6^9Rx z)eWo!1CTdb~(a5ny zR@oFD%~e=5WWP4b{QV&}OlyRw{~C@p!og=jOgc7wpdejLrsAAf^#38GF-?>U3bAAS z14&}4iVqa10I67IgNH2z2*h!Ra;A?v?GS0xCgOmv^TgB005UIJb3?zTVxJ>IQD?6j zsH2)T6H}s9sK}*LNnHS?o9qfs)|7NBY;7oX>-%P60EbCg=o{>4F8&~TiWc)e^q6+H zM2J>FXe(^iLvAZE8A4hKJ4}Gu$OFTuE5ih&jpj<=p!+nw-WoBK2XjblEB@(EVvS|! zFEI;E;wkOKCPiaZ{?q}|+9QoU2wmHYJf2~_*dAF|&C9}n2$x2|P6}%InFBpLiWob{ zaq=2MQm2s^1vfe&O--O62g;AmH~~MnRP1*bbx^>_*l$P|oID+JyC87Eu%!!8o|>G0 z+0pAnB|Z{moWrVfFVEz#xvMzi50I>4fz$E$>leBSD=y+M2#>TXuLAFM7p-|qi}w(9 zIZVhBjfv>|;98S~62Nxg?-2=bDG8C?y{GUhw^>{%x1ydR$MHI9i$Z2Dyc`b~d!nE_ zH6j>JeTl|Kn{51+G$}6UW}}`Pc1zecp~yiF?5aGsT;W}U^O@v1^hhP#E^Bvvk;|?6 zy+u%EVgC)$kw0OT-YepGH>nONXg%ysP-U#PyCgkM*YwxQZVl^oD)^Cb-JI3lWN~Dss&XC@}3oIL8PD*V*_M$4a^uI%8U}U2g{_m>^=}t)@GUJ zS~^XOg%#ABPrakqyD$*3(T1Z;gj}%lX6!VryhFK#;76gv;vf~YW1cOF;*|DjhB$*`V zH*8t+tu1T5wPj6|9k`3~reos9h>yMVd~1xT!ByN&*amn%dx075usyIZ4QMx{#oeCUC0^WB^u-&5-wxfDo)dRbN zAT~=MWleuTRISuQd7F3#RAiq`61xo*$EN_UwX;|_gacJc{>b4Fx|}EbYD;nvM1)Pn ze_+9$D?zSEfYL9~z#a6k_@f0aaN}WNuV{IwT-1e0Q>X-&y8E$9nYo#gv^y)(E>fgj zq&$V=N~ek|E-S4rx(a5oShQJxjD|us;~5_0k$`6dZaS zXL30eGpS@nn~BK(v}R&S zgc2lI$ zH%v69Ae|vS+8MBDji}Cd!-h2|^7_O6HK%Y2x6SX0$Ogx56pj$Pc z5vjJOAGQuPeZz~0h&z)YH`XD4|3c4-p2bs_AMmu7u9neN*m`^#@*`f&T~AgSUO9FN zs`sHd4?my~c}*em8r=F(+zWA8`Uo?v>pE-W^Wr`q;{2&)k+eWrx2&syrba^cV(k|frm~s>;Iuw*k zOL2F(NJd*x2GA}#rG|)71Z6Hp4?}bDl;!nP$j8d6 zz-omJMFh#)z^2zlYGfC>4j`9PmhQQ9s_he{*45WV6>mOd2PzD7tnbJJHsY}3O|(ARyrdNxy&;Meta8k`mSK?MYp=!x46_>qa1*YuBp(3jUoAbBTTDk^B%86|rh&~{4%zYY~=C_zH2P7*FSjQv>P>dQmfYy9eaDXgBcR39TQ#XV8e-}-I?~`8QA_+oIqWh5MCi8X+sjy)uQBh5YEhhz4kKH|mR930#NW7q*4d8|Iq>G&}Cy^rF}!{jyKY>{&fT4lQ_ud{kRv zKpFr(hXCZ>lKBLiZU!|0<@BGSDs~MUlREh;?*aD#aDsz zC$T$_(xIG?(GQOQguI;%=YJCEHKdpdpqg`4K#9UsuJmjVjjxJtV8lN}$J^tR(%U?F z4P{h`OD-&chK;<=c=w-0iCBoD>q|77qTtw3ZoW8$Cazhx@7 zJ4V>c%*6&3>iWp`&pxt4T^V)?qL0gVG_H$J{Vj56w*U>gQ8ek%@YW4cI*L>=&trB; z%_P5>Kci-ToSb<9jQMQrK#LJkF;7<{K%r+Y)qN1(z|>!W-5Sq9*{`B@ybO`bwF*?s ztagvk4TnxO{7wo!iH+9TUnzv+ThWcSkEwQcIN%UfE$w#^=R+^%sSzGCKfMq14AeYJ zg_dBX;m;l?iNCZb8i^NnRd}wi8lPejPUea=;pATKQ)>ZoWu#9U7{HkQALPbHV z6$P#KTcKo?3T;@We$HFhfzr?kS~n;(w7z$f`jyLE{5i;8BKxJnBU5;sq3{@@@HpHD zkDo%YLu*p&pg+DG`es5DtymE6!0?*dIcV$DwnJN&7IkOVtDj5j=*w5by3p1Ix5O%# z7NgPH>Xm_7wp_4f&fO3T(PUB6f-UnD_QuDeMLs_W(cAq+G_-?IS+01|V@wv_HTWYG ziWVpoE%4vwfYvFba4R-MYv50OX2w{1#p~t-El81{EWjelkmNVt4{bjww5jDh@+*?Rdku!?GHsXlasx+?dUcvcaSM-q{^A|v!fLHxRuUr0VV!eysW z&*6RA(LqK^N)YxR{|j2Huw%rl*48-fx!d9i3N;%DHCt+}yb~Gc6f&+e7=M?RQuPwO zkwMW0rItLYf|RtT@~tQ=^aA7s|;E-LZx#Z?rWr_bJJSUNV_UGf%wDaRq;^X zSX*WNO>&u}yVFgy1QBHi?9gE91JjynSx9|{n48?nNGjGXJ zV5TPPOzdKYMml2=$`|XbqIE@fw64gG)*TO!@dD#YAY(~Z=wn(Cx6)f^D=Q{MCTisZ zV;Iv8)p=qoZKFzb=Hf|eOTyY;R%1a(Yt0cwWj8)KZK(^2b>{#prM1@Wj#@0yR;zK_ z!tSRPiY~pZ+gltR5J#k4Q6EOMCkd5pFXh|Zo=R?V)KWh9y}g!$1e)DJBLZF9K}&|P zZrmo&5JjLZ6@j)?thrqJJsYeA9kuGd{%LisdGjXleic#Qy4+d25)gTivYHXd=ejTW zQ{k6vtqXq{TIXm@ob%`%=X3CIj#ejxinXS5<~o2kf93F84niIZmvglAC=Wj3O{hvK z_%p&(Q(B}JjE+U~UfM`r1gm>#k$fq<)=OJ~AIa&h^+Y>vZEr2DPAYxUqMsIv?vIG4 z-s|+?8c6EZAG3b!t=(G%=H_YrPtfi>PIf@%nJ`Z<-s@Cu$o@rN}C?Nkfdeoub}Q6h%uP?eYp$1nn)a_(49` zWeCd9sayuRnIZwm&5}HwI(ghKr$g#sxqPpZ6sxdEb>aL*euUm3ed3&973FJ>b6?jm z`6gPFBMP-F>w2Nq$mZHMMTontD9YPu>%cKdqphWqCn3Ymmhy7lBxKlya{m&zItdwe z*lc_4IE*hwQr$e;UOevj2Th)`?XRh-in?}OwyvF@p027Y7JBPe=02ni_GMOzPN^iz zC@Zx@tHYC}nNLeatX=1j zK2;k9;dPvT!HNBkBEX$s?Hnx$T1?ZtwQ$q45@Sf9H{Wz>8sgxlL`VHnywroBtQxA1 zM@kV*5%w~ItMsInT1H?TMDOE8=>a^TQuS+WRIIU4anp`<)(Z5g#R{9D-RqB!=5`6? za%;=uT6G&AL=-Zh+52{U+;ay$_R^i<5I9py?zG#sjyyw z|Go|W`!@J#N_3+h-91km;curOq(ws2;jsnUPbwNfiKw9}j4ex*TEg0eS`+sGN$ZTS4eOuj@i^y7{o#I)rb}i0%&!tGiXk7=xjkQ`QvaIC- zfLOS?6jhfFZI@{j8CD*Xr}*1XUzl z`kQvKat**xZ*HZf4>aW3xq3s7l}NkySdXvNUgFSu0Z(zrmCOusTJe-Smw%jEqwOOX zXDyQCwE(!XR_iHl20*(q?IF0dRIXP1<o{F!wEdVR{Tq$Bxk~oMII(eWb^Wr>ntnyd`#2Q@F-9_9QYx zF+8#hS!!QR?+V%JR*T)*7Vj#{=5RJGq62LFfEN3FqB$UIpEiIO(6X^u*mMwmp=0~x z#-r`uZo(NY8M97*s`cTpqH%;rEM}0`9>4Zf$M> z{Zy=2k=D;O>6qvNDy*{beeHc-fjzmFuaR_2mcvUQXt_LJF1dp`A8M@?+MveQS~Y9e zhln-)1g)hL(;4jfNK}Ul`!zS8Cs)&5wO7-*{W3ypwm&r>Kqp`}0-+&A!lv{qb)Fz^`9uebo>4`Vaip1Q>8m8}5f&nErv* z2C9FhjrJmT!B;k7yIBptre6ueFB5pgJX`K3_))|mq z@Ab(}cet$WGm3*4JFl{~4X@x}hXmVeOQ|y|*j`(D1qWITF+ZVhm_-2)k=leT*dk}{Y|S6M`sJS`TKSU#Qv;pueu$fkde#x zY<7e1e%4y?kF11WG(+48kmtHq-DtV+7(RVj;zj5$vpB#pe_&o=~iKLV3z*%GhgX^Wya1e0WjW zHjUt?L$W-RmR-Rsx3uqT(vBc@i9OQG(QaSXBF7hZ9bNe76w!Vq$yjF2m#TsrOY zAl$MZ?HMNBBFdMEst+#69&?~lh7Ec6|uQUa=$LLv( zc{0f**WJ~RMbsUs0$Ug8=o-W#f2C>4 zYNjXgp``O7tIB$1pQj~gR7Aq5X1bfd3K#K3v7AHBTt{{D=v!{|Kw4(vt>Xq1hO3n; zZD<3GG+5YHPq(6*>o0Ksv1c@a$3D=SLv%}h9KTNueQTo#9agr~(|xw}gNCj2uLA}c zYLY_WSUQh^7OizpK%v3p{>C8?(-`l~AB1>a*ILg+*YLB}dNMkd&Ng~HpAN}wbXp8e zP{H^%IQ}RJN|y{?6-E3H&CuY@5QFawD;|;cVdLwfY>n_YKgYUYW@`7 zL>8>@EGx9VzLnoi#4LR$T8<Y^7xTq9oH z>U1}v)z&{%mH zff#kc;2wHB6rFKK!LlB@8&;fgrof3FdV%hu z_6u?uh{GZO9|YRA5m8fUJ(Qz6dBCKHC#4pTn>c#XoyFZJdZ8p!j_byI^?it$f<8Kh z4t7(M2cdoS$&_LahBkpB7}oUFGa;lecIQ*~QeQoSUsUxg&%cEeaOyrPy?cwNK-f^8 zAeO80S7W)$XK&?g*3tfYxF2!J)w=u>D|sNwwBb}t#;I0=lE^YjUzx8+Q<79g+=VRh zFk~`I50yykqR>doHg&h$0#1heoO&$XsVdhNE`t4o@OPd7J{VG_osYZnM^lLzOGefEFme-^3 zpGtp+erL5Gq8F=Op!`Vobxq*Lz4hLlfP9hXz5FLeZyu+gc0$RRgc z(@AC+!4%3dXji9)t7AVx^EgJ(#AQkbif4|)@bp-{X6Z7z*^(C7(~46H_KH?xWG~o3 zBqds_o|`#ob1P2uVJ^AN70D_WNjMgulUWr=H{!ADX(t*4jVmZ*BIkV}e=MkgdcB0~ z=|SU|7+OVMyGnx!m>98%QUUR0(>V*)19Td+lYUihCntXlf1)2j^%;v+zcwHqx zrx69{F8n~q1iTD=60f4#i9U{j^i6#m+ryKY>waVH0ZA6>PrXta(K@<4K#e`vL6(yk zsCpp|+LccXQXh0XWb$Y5lWKTDBOV;X#E>Pj7losEnyzRR+~Ix>uc=>^E^f7DHsyrT zjJQOegNk&;@Wz?;`1)|!RpZ02`j`MBOu2u+E1KSL`l1*XA=zE~99E9kUodXry&vH2 z`}IcAMFo>5u`%N&jLsdGKc;}?=2l$WCB9Ms!2SAS*O=iGCX5(9@_sno)aYDmWWj_< zY{Z0uk@ruyFP)7V{ZQ`2;rERjDRa%%(FuA8uh{Hfe8(VfrxC|%Lfe;7&*k6E-Hv(a zOO*3249Y&$Sx~6)atIs@o`XEfX2)+B?b60 zI7Z#|0p`tVNwl@jS#B(Q0PVsD;GYlZsinIKr)Wt1-EJd=YVWe!#&+A@ZnN!nsNLRg zxAX1xdAohhZr`!nAMKVFjqqTVbL9>OGmG?yN-=cB*+E1F(MEx#2j-ldx#vN>(VmOi zQ|t;exRciHBWbpozt<_%v;4(pX%?Pd7{|Wan2{V zPT&CQ&uKaHm*U1x^`pB{>SnR~@#{ekx}SO|0*Cd@R^y^EXOey~l!^`6ob%^z-nw<` z@xR}ia~>W@HCjRI4&eci|C&CiQlwV#6RA))4^_v%I)ulShS05Us3{`@nI=0`abBV_ z>`u4vw!y6sc{RLJn7x2N2>M+nWeGdN)Sukpj&MvXE5%mX6O`ttl*g3jKzU4M$0(0U zRqCZmAj`S|r`I{jW74)$JwsIhs*+`gE>*KFrip@VF-;6<1QU-r$zWQFM}+XW>fsH| zE2Ui&kIc^R(;5Vmc-Fk)Ihe$=)~mYg>A~ZeHngt1b_EwO%||*LI*l}denZOUz-Yp!p^wML zd719gM2LC{i1vO!ly>lg!YiCzB&xMeZs7w&XFnjisGi$JI~{0ut5HUxO@*;GlAmOa_alJra>=n)~+Du35H_aXpEgRDMtDeh6 z!7$A$n_XX0&nuf<8T2iK)SGS>eVaB|*6+th1e0vmhOCr>jbiRi0)L;VLV8^&kCha#~=~Q;#6M0Vw+VjAxBXCJonI7l2;q?J-t?sFh!Pf zgbZqx)}v2Rp1j(aQH&>3?~v>jGM+*xB*j{NEqzl1dRT2V;|=M8>XRcWP{Q-1;D`#Q z=~iiC9`!cOP6mw=JM#Y|Xi`gd+^ccKWP{cqkYlQ|D7lfv=%+PFCvVfMY%vUfL+=9X zOZ4GkyYG8&Y>)GedVDib3*6LK3mi~pK9gC)%s&v!kH7-Kdx#?p_Oy(s0na?FNAp9l z^I<){v>)^NBk{&rFRE2utuAS;#ddYMmnn?lrT2ZRxKKM3^rdF6yv*@FZI8!6dFx*9 zE%MV=s<&uXwy1CaWdhzflPA^jY2QBXKKAN88tN$&`}I7Ls@Nn66{ zDSAzqaK*@gv`6$R4)qo^nru{qm{od6rJj7?5j{gMpohHdhR+PBd$o(`!=Mo{eiVRC39YS|wA-k))s= zZMNSc-st4^?uHRKP49!Qv^l+HoFfwN3}S|R5w`_GAwdv1Nt`khuz|du*EwQ zjSUX^?B&k!VqO@;o)bw1-bm$(UyKu>F0*WBBAoussgnAlfy=x?3EkhFc3S@)lm{QH z;7LND44(7~w3k~2Lc5Myk{&|E+M#dj2|A9TquNuNs3l5^gwu=Bfo(BEUlm}{)Zh!d z;LHsDJ3bSRJ&szP@`a>jzqH$ATkAHr+q>k`S zOS|3qX!la4YwAXTralmE_oM87oZU~e+ctLF(SF{~?hm&6!!`9o_u2hoyM4@V*VwJp zW&%EcLT_DZRTSxwqLJJOhvMdGC0aG-^_bG?S_U+U$m5eCy-O8L@%no!Mv zI*2leXTNM!i!?M++qa)&0P z3x-C{ugj1-?Q)kOMt8U=XsFT7Xu>Hs{dPIEB=vQME=9fCRK%f+7wILr`?plVV>uK) zsYkS>8g9M0bfr;U(PO2-ACQ( zKI&Hg6Lm|!e}}rIY<84U&qbTR>+RKmnM)48w1eOHJ9@`Y=8o>CZuQQ7Q=u^-O^lFCGA|HZuLADNosw#cPN5a_Wadt2Js3_HmX~Kn*O{* z8$k-R9({_!9TD`~ydEi8stKwlV>$J@d5c4;lYUJmoXw)oMpCJiQ>PE3itJ^p$S4|S z42z`o6Z+`(N<+%X09yd$y|LnTwAHd!S=a&xsgk%1@fQL2g2nkdLU_$wh%o} zkE`uf8qyaVHF^@8WGe}&a)xg-TB67GV1Ds`MPKax$q0Aft{>omr;H8e*$?KbSYy$A zJwZf;sO1a0=Iec+!yIP>D_vEG237?kMO zLn&dwKZG-lIm+&8+|4IK_Cj>aTyB}Z5VIYm9)#Pi5*Vaeo>j`Bhf6Al5_=U;iCQqn zKY;~{@blNJ*fn3f7VBO4|7+>5DWP4Th1t?O(w53~?S87=HnH#bh679V?zahQnU@wB z0kpjg8U#yq2lv3_rTSa{VL6>*lY9qmvqLENm(x#6!75hp+vW6B?klI2AEgmXqMRmu zY|Ck~uTW0sF(s$f*V%IV2WHD@$qAKmdYmn%<^MzQCvuv6qd$|=w1Dk@R8CW2>YZ|0 z4*&l|PRsFE$Z6WT_CF-2CvjgnO~!nsoR&f93OT)w`O4`%%vVmk{u6SVR&rFzY3;A& zw2YHf%4sjrR?6vE<|n6VC0{kUazx2#s(-DN)AIi`i2RoQg`B2DW`&%lvRT0vDmi`E z3Vo#c{N`BLxI*7-i|L^&^+6S4IuJfusSo&{6w`7StW#?=d$&q=i284XLf-Th)lVx? zT{gvtH!38x@q>;&4&*v{yf_<*LX{_R1NMZYj6E;KwK!-%>>^%W%4?D5Fk_F9Bv8tiMG6+Xv^y(QeN{PtYa}oD7Ut+(_8)jBCgZ_>*CsOSDOW! z(%|BHJ*?t?r+U_?AxjdXK5;1mRR)EJMY0Iil`QRH&*@uwk_2bWEycH?#CKJW9l9GP zgIWd>zOQtTXowvZ{Ynb%79JZ!qTQDC(C7mrx>XK@5f&o%8Tna3 zwdukTw5-`>$TTV~WG30CRpF39aQ=r4gL+KmKYpO-WQ|XL{Cp8mxXnk1VBJK!B7X zfqEQX2hoi<<`+3TCn{Bh)+<_gRfIP5F5y)X+K9J=S4C9O19cjf3t#3P zMF4fZ5Qh_|gaqm|q(D6uJE2eDrF*SVu`?%m30mK7_VDDErTtRu0a^5{zv{W1WNT{! z)X;;S(v=&idLhm>)ElJUbUSGsfi`%p9A2q6c=nv^M&T$(MpxY~)P}5KbU_&nMRDOY z6)r8$Ny=3l?j6?*UfI*}E6x)j&tNwq5UG|HTZ+5nJZRNW!ZMLSxADCkHXL<94lyz1 zMtBg@Fr4j%Mlo8-;E+26WmQ+p#rHQXH_i3vu;!+N1QNUgN7W#q6u7WbbmPh zqP`vW86plEzG%2$^G3af<3Ww~hlRgy)Vsz0c`k*GDIPsx!tMLPK%~P_Cy2e9V;){RZxjGurmDY$3hhZa=i!t9D!6S0)pg*lh#*eluG} z_pLvt3XzGgywO{U9~E*3T1&s3Eo{sUPB(Z@B5zOo{#Fpk=atb$xbRFPFEqqZWeAd3(yvI;fnTPm^&(v0@Y zDhOZmx&0qy6-1s(?o3pXRiFw0@rPN31P#7;U5_3nP361j4U$nZCy+!4kP(fdhZy(J zGb&AD|BJmh0gs|c|Hr#~x_Ty=NoI0Q0!c_nLJ}ZA!hK4@eaRIB6(s}+hXRQt;ZSsf z0U;m=MlE+mL0Nab#bW^lHF$tGc&*p2;;{wmREWknHf8SVQlar;yU-Lt6Y*d`#;AcH#?&jC6H8XkF zhs`@Z=Q)&MeCGVhYQEQ@x8{!BW>%z7ydN)IX{GTScbjhi$(dz->BnX(e&Z!(k)?QN z{?l%=RrGISk_#)?4Ix>^=Z}~tVg?HN4)?)V| z7c&#YF^94*g(0_~urkcLvM()>XG@afQ1+!@yach`hLfF)7d>ru7iGLW&rH&z_@z&q zRr$rfTh8}d-EH=PnOL7lK1j{o` z6nI_}Ki`N-i7eke7{_{-QWy3j*GJ_HHw+8SAhmZR5{22Xk3)3`<81aH=TIFIYd6gt zAai`>vt~{J)xgd}RuZjbC4V&KHKLWQq* ztYgf9qQLW{_<=js@Ou~V+3sZ>j3fha#OAW1>ef=9l8vca}pC`=lyU$x7Tm#GsxCBp*7gYwxjys9ImtW3<%6(|<^a8bm(v~XM|Ur9wTd}UMW6MJ=fq>&zt@>*qc)Cfg)p*mbO>s1{^w zKRj>d1r~{;_lZ+6Ma$3}L$e-7OWF9E5w0SqFTU;ZxRw->i{4z#u#d6mbsK3(UVyt$ zhK2306{3sgpLWt*<4lkQU3b3B6k(FmqYSMb76E33{x~1~g83HDebM}y9THW(<82O@ z12U@0YvwL2Ur-_VYspD#)pIKs)ntN}$eHN+kIWMO-~n@Sh_jBH#j?5gOP0hJ95e?9 zr=5Ebnr%)u?YP6H9lrGkv(?UJFPW=!1c-at+-4kNa$aFSiiLO;Kfc?MtzXZ-c*V>! z=KH0)pFW=teAUdeYQ(JW)A+$0E1O>>3fM{%@Gtg=GxqRzMTv1%G_ln8Fl;8@W0m;W8oJWEa&;i|YNJ~BD zpvX#?_Z(jEmJS*2z-7q2M5Vd7qq|_HF*O>z!@K5CqmRKadRI(hZoc|mF^SFO-@j{K z*s-mgo-WrEwa5YK84*W>3oNcNawrk5E_}lwvk;cihs+5+2x8P$$#SYW%roCJd!>iZ z9F{$EK+s?f7{}|LHIw4d3cIHnF~ zdv^)?Qc^{C_ylr1=6y3g5I#j%LnAtCPZ39O?DSJaJNaBsIz`wsgf+?imFSKYl%~7) z2p&tbg5q>Hm~R<1#B)?G*1ZC`pg7$<8a1b?=cT3yD}0Jjwuydd zRqPqUn(oH-Jy!XcU|*KYtje8oijeA=Q%@1RmxHwkD$@Cl(_O^v*P4*xf{yx%A0CC1x~AN({fn~Bn;()5LWEf$&| zDB($pAB%xEqWHo41!2wfOZiD+G(U7M3Cs1jc$csOr6@=&n zUxsl+5?(_Zk=ttv#CH^H3z&eLYHb0(Ke4t*LWx>i6ya>Al+2iFZ6S4GPGc?q{%fkIn0eEjMH9K;4639tBRj+%wAPM zn(MSz6+_XSy{hPd+?X>J`4C^U7&22c&I>Lw%0U>^A|uPNWlHeZW1&UHUvw!`a!ZMe zy~sd#48vYzAfS{jQgTbPz=%bLVNVq>oi|!8GG=N@q7WW#XQIeFnx2T94#aPi{fX0CC4ydv=BF1~TA znWx7q0>45`7)6S}->>W&-zED-fs(-Y_ex3m7~jtEpBu6I&K)|t@;^@8cM@WehIe5f z;j^Zq!EY#x*ZxKoKP9}GZ}FRjJk@0Jic9WUNRhu~P`YqWRIRw z#J*yTo?;|2UV3dpJO1z$rf*Ddd|$F1#bzm}=FMe%dx<00@F>%~EBU}S;@BOG7gy`KMjDxU>}Qf`&G9Ol z_OW2R{-{LR>y`5FVRCqXSUJ4IIUZ(ty<9KJ6p%G|2ta`!=dO}yrQEHt&4*n zjb|fm8WuE;F7MSLHA=k-ElHR(l)fo}y?dtpK>|67ge3tZWP zvW=y;uNcDtKToMCl0r{K*|1HfplpagXGT!A8*zrEZ0wi=Zb%^;yh@M?MeT0Jai;@p zp37-?5E{dwj5;3Ro03@D08Gq`PEaa}56O~WWoK!gfe#711~gxZR=%}D6tdpLq*_=? zv!H#RbvsB#&_2(C+X(9?9U-$_7Ni%f|E-EPS#ZZ<160nZIR^)D8`29CuB|SZDoMSV z7G;hEeL_K34Fr`b$5S@mC%G@>c*-V}NLm5MQ+ECsnRdA=H8!K!2ohBIo#IBExT+)q z@>=2w*Xn|VF)1Su1u0g0b(19#H#sQcCI<&^5>pTx($5IH$)OQ9IgD=7f)xxKuKJm% zIlCL-cN}mbAH3zhhIBkdkD^R`3bA*JI$r3;Q;OLn>ryloq`(&9@v$HQwjRc@AOW_T za4blGrLisx5?~9yO^gU|z-P5W)v5bb|D@w7JMR^lgX8J*BISV1gKqh-u{-i{NCK0PU~9>OhJDsjJ(PprDKz=9cwZA>I;Xcon|U*Bs*Fz|NR@Mgg-Oz|FIS#0 zQJV4P%diO(M0=p`$r%{PAgR7wRKr`7g8pS_$#4N;6^r<|6!t`8;(9-i{YdbsU0bmN z_eN1QRs7GcuHo-(cBJz54%5Rowql)r!P_;$Hsj@1?7q{wyv|!#Ra;XA7ar;InxD$9 z(2c}czCDdy9A=?+pXl^PqSytoK@&Zrgz>HEEZ6u{l5EXVB>Nj>v5{l(;x^*oAgO)i z9Uc??AEi6emAwYP82R6eJS;Z$DWW|@=^rm5{o_Ssn|Dyz<{gD?-i3y~oe$0u94M3^ zpr{^0;bg*Dgo_C42saRJCcK021;W1*enV&wXWN#rz@aF1p~BW$36bvERH2^mPyDJU z&2GF+HuKt49N|;-UcBhD_zt>>z)!9Crfl}tHc&a>91Uj4a$mzx@P#ilzAlFiO^5HH zZpocGa&HyC1$b)~$ih#wouB2fm-NOVg?aF>iasH@U++8?jCgukKFeXdqDaHcpUr1m zjl)rVetR}nzYW_9cjO-9_QJ7-PXSAci`zq>b zSO`TGB#A&HR zy30IY2U{;!ymEUArwl!WuuS;)Rj34qvX;SPc1X!ao(c0DBNQtE>bOLfZ`BAi?NA9X z^07rMH2?=;(+-tzC7QBBC1CC_e_N=85=|*m-4RCTZly>Kg-S5PLnWBMEmQ*5Dk-eJ zx*a=I0@T)~9V($Ma(1W$gzGl#PzmxLL!lDnP1>On5bw$SpNC2?Cs`MwrHD`orX4B) z6RH^sm4I*0v_mDV!$CV#0xYb|h)@Y;M5qL_WvB#jEhh_=uvgRUPzmOA3p0dS-Yr1= z!~KW!t6`xM5-tGokzr%=7_z3pKs{T==SD#hEg5u2_)B?r*v<8J0QHlNYO(Rx;jI0eWFGmBr)lT}5| zYSP${&+o<3OetG=alTo@3!f0ANvuWs7*~2#OqVnIut`R-vZ?`FQx&wT@oL)BD$EOf zf~I#(5Y)7`i>!Oy<$KPM=tyWb_j?{^aDD z4~QDq@Jf-j_KO$l&pJQY*PCT5kK#=|#MuM##SAeaR!<7VhyyMh z5HAnB!43J2D-s_3gWy{3a0r?rclDN}#>jTSZBcn>>JGf`h9d?AnhBrnW({!=Ixxi9 zGCHC}d~|ZtOQS&LOcuaW$LMsg%(@ul?M7#n^Dr1u7+pwopjqZNk#a(|?}AH*Zb?Ci z>5PKa9eNeLPj;7z-Q8uk;7Q6HDDyxzqC2HmpE5wO%w(MBxd%nk+l3Cq@HZzU%3!okeqBL=a!VWlHVhK!q1HgV|Wp%Y7oYSI8fd^wei%4*7Ih_9`B zZuzXrCEBct+2ytKYs$h7Y2^#6=V|IV*Y7gh^FIw@z8Gq7?6`?%mW&Y>>)eY*?JR0&KY+C`-qb3$7&PU0H}vwP&W)Q!JioXBSnL3E}oti(7xLRtaK zzb3wA2+QLy#v29tEscSG*%nlpK3#s(G4OLh%nTn!jc-}5ry7RA3lBN`@iIc1rq*rv z8)NW|Lj|Wg*+4WlfBd`_7up`h4~gT}jp9}7s&mgUmZcxyU4{t~@S}?T`6CaATvU}) zwH()&(IdmCa`A)1*iCxk&dTAUYCzd^D<=lv5W;bUQwS>vs|i;SUPX92;da9Pgf9}} z71zZ}@h;^*1;%RKwC|`uatMOtN!KOuQ$2H0Ma4o0e>zuo$;`|wD(Vp_eUN)elop>v z{7~BP3M3Fo^O_L9Wj!pqwEA7LLM_F9!CCcBA8(FdcX_6$)8JTlc@9u7YMRP#o@4ap z>4|LSX<5Fmzn$gd1OJ?m?2C-Wa=wEH3LXAH4(=bOeNr8PK9ZOgU!!2#FxN$jX@4hY zYbC5;4n!JpF$Y}7b(eu?ktDhWH*Yu{F#K~l4MfmVLR!h+LEeB+SQkK~VAz6+SAe#l zLYfrWf{MFP)8_i>P-=618NkzXeY9w|xxV(A6#NE$b%d%%P9i#CT&3l7B-;>S@I@_M%<*$^-2HF({p`v%cte~0>&f@%0^pMOcAnzf(j`Y zu>}=U{$vX(;DBOFiY=JG*plL35g^L}W>^oL$oA2jXGh4&K~uJ%0)b79FhNC#>yv9y z_$}#{EvG0Zl!6L|(oFH6geG-{6DETI`O&D#>l2c}AgWhrqG%uIq=1*SWz40b8eXGT zDiBwSP=@u9H zya&tR_qJkI4){nFcI4NE2@A5ADLw>p45N)R`HG(6_|yJ`WbS>Nxp`AhF|k&*7R&r_ zUbMsMf{I1-wL4^Jo9Ud<;iUURTKc{Ym6vyLDoI z)~2-(yp+)!GMUC!L$D?zpI6_?vI9!A8?;2kb|GTwh2gH4df~i8zWjL3V(OiZ<4y<|L&kF|&weO(BRu;-yZ)1&{qJc~ z!lL?L64C#VXTKCF2Itz-diKly+ge!&um4S+{W7$Rt(KJ$Vr;D}g6D)h`>|3AdG^aW z(bmesxiRF~k6?2Df@i-}v)i8iGHmThwX!g$LGW(9qwUxqd`YD+r2|HxMhgm4Iza4) zf92TUp&eB0kbd|j%Uytef-8qOMH(A^h76=BozYFX7)e0@czxLG+%=XpIX?bI=j~rK z+wJ^nEIUtUGaRs+E*;ORZC`%rqm=r~zWjyJwC1W^Si=JoSli#E)ZKZ}IyNvUKQ3iC zMw6Exy28qZ^mvj{q(muCiT=-^3F@F&SG=KLx5tsi@|bO{a$B4GB_SKv&-iwFaRespH-EO1*Bgd0v8 zhFUDSnDL@0w3G?CjEv_pzScm)r3tyXq7Tw@h|R4y*?Jw{SjGD4Z}a=kXRD1)IgFpY0e_7M?B^ZTs@0#nZ}aOf;}btkg(b@dj~DCZ$hq*${B71?z5@7G`2JQ zU8Sg^Ti$zrc*ve`rMihpC*;{UnYJ zSG`QsyfT0ZI2+juAF@74)jeikk&gG6=#j@9E`Ag41XWGk=O7=Xhr+448y*5SRd<6K zv#Gip4)3OIU=A{8+6Lxh!>PJkT6|8G+g{l|Nc$X$syknI4AC?^=p^W9VIGLFhYu3W zVQi}I9vMN^J*FYv=!9oQp?|SR_23UoXC0$)tB|*(&3%)mvZ(jpV-ezkYOUaLGuZ+~ps$|E(mi1Pt7|0V zwS>Pk$Lh$p9%W8`XeP@&naMbaHQ&30CA2BCPg^vvra}_~QFS`A!jy2TT`NAn-h%$O zq~42X3+nxD)y0SLig*uk@}pg0LcU0k zGvjRnex4w^y%hofCO$~Ojcc4x4g2{Ss}p?2co&)52oi3X338h-quM12xZz2VJB3+| zf*<*c$oHyfMZWJRlSF~iJ7~Tj+lA6Qh;0^q?J2{h-*N%FO;6c5`a)Kw>)ZJcS3@~W z1lL1!aWdg7!bOC2gc}Gq6W&31i12elkEt-3%o0-xGfYK?J1Oj|^{0XoI$<>B$5Vb9 z;an=eobp%kOBRF(xbpK6aJ-}L26LXWvv46R(bJWTJTW{@OHwdAi(kbn9{UO#%9|^h zKX7LYntqX{{-h2Hex-85lWfhV>7Oc^e(VIA-lS+cEHVU5U#3Z#{(Ok0%Q&Pi88?M! zdK|e0eaKf;v7!2>Amo1IGmU$rtV*LV5%lXXVwpKzWaBZWG%s=~8+I()6w4mlQ{2Mc z{I3_WUg^J&Al2K6)V(T6^>$vkNRVn&0k9m z$wL)MZYN1HLj5Elv`6AgL5jRHf+F7p^T!ZL#%viP$x!lzNV1G@Ws~GF5hPi;g+`L( zmx3f2V--P>F~p$A|G-)0`N6&nZ$Xk{KvQ1>N#2at{vG~iHS4Z-=dm>`t>2q?4LSwA zcUsHnZ=KNrP-UrGxkdc9h6-LU#N?%=VfPAsWQ@rxYS^nm-nob`tYvQ}-z%;VFaFEQ z7L_jvu7S19eEMQ`{1j9;f#0-*^*bG(oPH{bt5q(ln6tBXDO;r*L*n@M5vIR!T2~(* zb#aj3iqs_IULv^X#lch-1lM@j;v2Jc<<4J|peXK2C(m4C<(UaVVv8+4HiCg(nP9WZ zuR_PDNmiLPxG=-rc@Gl=n8@s-L}oWDGRxi(RUB$V#`lQI#<~@i6{vhL1(hx4R~=&6 zg0&8$MkhnqbI;Dg%h=DlzMJ=|69iVqjg1K@2g?a72`?pFNBBF!KN0?!u$k}}VT!3R zn+R(jVMk!JV80ZO(ne6hnRLPw%AZI13ka7HUP;F{QT|54JGghn2^_Nwamf8sSvq&W z%)IhU;1Rd$LI+9bq{dJa>r#NL)2_+@~!Jki{G|bd}0S0#LC`|Q7FakM5`tL%MTtfJ0VQD$vduPJ%5RH z4nOsO#yT(4jca^->s>6DZ|Imv^!xJ$M**L`p5+@G$w3F4==W0OVa%~YFWW8;!S;ZXxN)%eqAK#=%xe*)AGd~!ww$`29;7sAs^F+y>c*QkO z2;-Uu6FsjYuDMEa&HVj&>}mebjclvnl5g0=ru?^X$z6XnmwXxFI=;Ixj96!`GE=yx z%GE*t1D|pYJ9Pls#|9<%Gf!s!9?}~78LzxHp*2F$vV;>v*8M3GA#|}a7A_%}(cSAUVU)_i0Sa9$!Ci(MG!P4C(iLt(uA6RYW8P|Ii9iF9R&wN80 zrf9Ifly|v@gJiAps2#w69WtA>-f)a$GdhKH?uweXYyv41%bXMC_CO zeC{?jA%eo{Jz)N$-}S#lVkcrOK#4M1kk}g)iM`_l5_@F?iJhTI5-X#oxa79&L}EYG zB#A{@kk}i;Nvt%a1Bu<&g2XOUBv$`Dzk4)mn|^XSdVNbeIzao+(otxYPNbtS7BuG5Gi!58s<;CGoy5nu#H@ z8K=mm79x6l(`+l1ANU*rIX z^|zAKpmbQ$)T5`Mso#gwRQPBr8v2*{Rwn#3gWRokoA`EI6e9|hm2LOhF{1vUNbAmU z(%M9%^-ZQk6i*XvJtl_pLE>reb}F9sEuyY(IhBm!8k@Z8Pwwscoi#N#2f84`zjY7$&`uSxOuw#Okk9kBC4w3%we*RXu=`&Ki za^qn^d}UDV4l_jAC9E;?Nk5Mr=kyu*Ubz>sv6=Cv6qjhx%d145?O{-%$jyl7In`#w z*AZP6h|P$N91kye4A+Z+&EO>LAU$a3Cy%i|{I}3mcNkseg^!2vs-U6R+gV=57ubSu*7SNsMQ=TUie9X!Xe4VYH}P{Bu-hjp3P*(yYkGY+6&19njiRE6 z^BG1(;VKXFwa$FYXx8NvtmzdkNhR#T{*$D#SyQC4vldP&Hz0R9*7S-9k_a9AzfKav zDdI&D6mfMVYlA8Sm&mwplFi6T_HQ>2?0cU94@8Y#!OqD*243*@eH%corsw z%*#$kG1FU8Os%YJVeS0+B;svBKH>dyYVuhVNj|qJ@|hSSpVCZ0lFu|EpCiJ_XAY6i z`C;TU5Jo<`6Zzaq=_zI47|FbUHHVyQGc` zwBlFl$Z|AENMU*zsUw4Br=Y1&Jd=*hA{`mrph!n{d67bS#nM_T$sYY1%QrTWlI*UKlI((zl8oQ8$4P>Oa5dSpbD5Zs_BhhQ)nu*b ziNbG1VYr%%#R^8Er?Pl>QYp!dA!PCJJgLZLg{jCUlZvdKRAlu^MFtXo0Gl0HL&Jh}U?l580S-b1_HHuD#`MGPAsV`-g0R zew=^)AxjIqCtjWAS^agmWr|a!&H0h%#gF&Vro;UB@#9Ax6PfnGEfmhOT{#Nk|V#a*Cr zhtrS(c|IJER6nF#B6VRB>L=ce-*x91W^)vJ`uWetj}Kn!SlLwj<*o&&`ZrOau8zOq zW9xrD?p^hrC~P=9bz0f^PtXDWeW}s9@t(J``6E-=oIs=>x>xz3Yii@OPse4<`(?t?(ZA3hr<2WP{S@a@s!^mx5kJkwUGk!z2zozINu>)tUl_eDg_yJvk=FPeiSYS&InBqhABw~Zab44u?Uk>VHyM}q zVy`vB`y{TT`Fe>8XJV#yb#Q}wa&_!wDDn-ho~uCR#7u%?oeE{hKrxlvgly+RO-&_O zoVdC?CZ`LZ=*Iv9TY@1gReX{s@ZBQ{yNdrrXTCI(v230IKKYi-6TolNvUvhXWvqVj zG^JJ>h|}Fa-=VHMS2Sl0P&uC#|1?H^koZYJD&Y~)YywRmFXF;z1%X1s!kmLx7!Z&{`pJD*=)lCRE=O8tn)_75f*F%1`+Q> za*%7l*dzWqI&9fogEW>6;~G|pT5*VpoU+%1)H?v~Kz^Ol zgVWLjJ@83DG|@(|Cp~d6V=x2V=;b{J?}8Vxn04y|Nf?1{A#YIhy#E^xkNRmaSP?;>XqX zPTZvKG4au7!8*d#4VAPh&hj(*%SvZqbHRZ!IU!gdUa$lBTc5M^4mYbtv08aTC9_X#AH&s;xBY_U^o3Aj z*C{JvYz&!tOpMQ7$rLUnu8>c^!EDnhNa*n=-JipQaVW+y6tM$QL-;daucq9uY8^nS@ExT|Z*x&=dq#Lctvvnm$Mt5FtN z5phF)b;RVCzGUgSv&w7At27mUIVhAkF^0*`ufAkG6_;uZ)Ef`=&0?R5r@Iu9&x{(K z7ia0Y45Fej+&$mQwvgPZyxHJC`XBn5el>k8cT-T&1pX+UIwN+t?^0|IO(1v?d2O2p_W;HJe#*a0 z_5MQm7S%sY_#NSoz<@ZxVyeK+R0Bzr?@0L~!d`>}2**;rsf4qby5L;G#ZaSs{ zqw6XEI|ebgDA+;;_wyTmV59viM2z|i^CBO=!Af!T?A5a|V^p3oH(mOw1QHwet$Ar( zv9H0*S$CPIVR?>koxfpHj=64{*>GNtYwd7-&5#`Lx-RvB?##QoL2$9_hIc=nvkKIz z?wDsuYTdDDZ~Y3HbJYxAa#r0j-Mb3!a&zapV_xq{)LfEScPz%ca-@Y?vEEhSKALCN z9ZRhVEUr5isJ-+^kvOz}I2PjCk#-{8@X5-Ty(?2i>dYfa$RDmh5W7FEx9cTCFhHZ*&8JTYZmO^$hd zvN`meBg^FZ?U!WM9n1IDUnq0g-jy?CqMdgYUZx|HWNvDWyYARb@2bZ{QFABJ0|U(9 zx*<8f{l$=1Yx|2K>CqbY*Y7X>@gea%wW6l4?>v$$&b}F6eS@gFPCT1Y6UDD*)Wo7^ zie6r~JjZoBSu~QezgR~7**7F7Su6VN>~oL2E3UJyta#PiHD<$G&Fo>^@cNR2{iBwo ztQ+3{!bz)(qrHJ0&#a#meXv1fj^KN!JJzo@{rK?y=vDpF{$B3}d^MtDUX0cTSz}Z(!xKvJRM%BY%>|=XzHbiIKsGj`ps6LPyzb@5TU0;zsTDaCx~~|HMZffcgMlf$qjEdd{1u--k@{N4)l4&yB_+G^`mt>^NEv-UOt|D zM@*J<`U3pco9dQriMHSD8@p$hB5mob0cE(su-t$2yFt zeMWO%bTLzOv8F$|*IPC_CLq2jbZvsF*PPsNcx99L@YT^A?*#9TCUH70C!WIbgl4}g zre^JKh}ZpN9p4MypKF@xe@Lux*Z>@T{3HAE1r0C6U9Rh&b9{>H$e$6r zdEJ=b7uO#v@~%dV#N#>Z5%h5XpiHNP9Qj!e!rDndqROQxkbzW=G^z?<@s6xkX_Pl# zCaUAC=2~%rOw1Rj$iz%)u=(8mg95V6<_Xkl^9X9UdEh#8Jxtyj24yyPv-_i(%ns#c z-2_qhkcPTB%}&v292+biu&>{_{kN}!|-B7uDUb(eusBg_ZzA?OBdC~h*2&n zCV|q#h7#9>2SakA{Uwt6K0FnRVWQ&?7iyt2RvpdeVDVy5i4-S&@$iCB9qNd@xKZ?( zq|5RPivL-Dcg@l3y5}69?7=r9DYy87yrc0k;mk|lUpJyqoYQf~6SA5Qg=0pq9uPwd=w0s%lHbnE16$j z=u6<6-}kt9Wk)?JFxAo`L`fZ-GNWaKL&M7TsQ5P!+{%t*Y$9q495PKao5>(@EL;5O z4BwBzAmVXo)|~yes}Id)y^vCaUxug z*+qt@%Jyk46Lv09@Sl=4NV;WQp#YE8U@}~r%q?lKmjXHEk%kIQLd z>2)`*V|W7WJ$VC5^Yi|r81fB86uOdGC5B0_C}7%L;$k*|*Rc4Fmfv{$+QPDDd8I^c$l>|)IW-&P!oLBbn+T`Yv; z#_XABbaq~fx?Nr~)QHSSJB8mGQa)!op%68S5CRFWKs|C@RnFs-yNh(okvX3h`z+o| zFMhqaVv8T~iX0S&qVT+2Caxd*tvn%A4UbEnFDkqZ-Bhd$y%a3^5$EJMBF~|wV@0ub ziTL?R-c(N~M3F`>H7J@B?hwJ8DL*5lH$7%|O|@q9xkTNP8}a%2u8^4k-fGp`)uJG3 zinzQF;$0o|Umq#I$t3zF<7(z<`Uo6-Qk2I*`Z5BygN+yCMWgyC+32RT6RK-8eKaly z)o>!ZsgK#maO}K9bW=Z5<)#Oc#G9&*#S7ubA_=7ZCGnrIuv)Y?72U^9gqj~rDt6bi z1ieV8D%A9waSZD+KU5mnkLm~UpCnq_E{DrM-&942eUc!GccA!pCJwDORdE+=QI)V% z)A!)mPI>GmQ-wvrraVdF(BrDLhfGy8o?3ev#fRh>2TfIs!0ovH0d)p;k3tbxFW%TIaBRTmt0*TMm0sp(cj}}3Q92^$@4%e zQND{&F*f^5F4y!%Wbu1AFP<26-yhLCNA# zT&06x&OyyqGERAW9clvR0L2h*4>qfd>VQ`WXSMzcuMpT^eTbgoRAk+#G36UH7;n%j zwB#`YR@j&8)S_@+BE*GyETlv3a}RuaCU`A(4(s5y?~-shC|y zi=?i*03q-UVE}-igc3?21v`g22h>a1yy3Q9qWcpKOINHuLaV?pei&S;ZEHU5k z<)5+iz|)$3_ng`}wO6~&Fvcc6^6eWBJuuo4{ox~zJi5to&TL0s|J`$4;(d=Ydg!&T zwyxq$u5(>&9nm%4)VgZV8Swg^bM_c_>i)-ST_v@y+-qxHtz2aTT-Oa49QYWO1OKYhg}}d2Iq*}5st^23r3-*RsdORmXDSC`$2E}-=}d7M%;6OXmVtVS{i~f<9v%RRXT3O28Yb zA>b`k2Y3(F0X|4|fDcn0;8RowxR1(#nCehp<7G2+e*n^VU7L(g1luKwB<^0inQD{I zHfdiuZSs=>UbkfO9RWY7WDK6CQzpYdI>f8hwTXazGC2WIA}=)om%3Rc?*MnSSEccR zrpO*lz~oen-7bp#0;O}B&n&lvs0zQ+;iP*4Mny6_Lu~Y9SDhVzj zPYzNkMscJ{V(z{|B@ssAA(aFK-jnHx7*T0(p_KyiWpW}0_iR-PSgA@exPMSd4DLOu z0$`6S4UO|ejO`n8Y$tvs;3JtV1$-fsfr;NSMVLhm4Eg;sSqgYem14Hut4aY+s8T$W z4^%QZPKXI79kaFZF#_ULGI%uILBZg(@ihV#t7HHd+F?c1LhM$nWhx1nt&%4> zXP$#Z=n<`hKdg`J272aKV~!^h*ypfsJ?ws8J>^X{i26HE*^L*(sDEXi>L}ikFXVet ziueB`_5O#Ab=UygZ(pz`eG;nT1XMin>j<8cA+mYu+I=lG--;y8*%#TPk>HNbwocXI z%G34?lS!&G;smH54Vfwvb+I>FSsD19vZ~q|X_)mKvy0{}oL8gq584?iBZ5nE{LPwI z4Yk;;2*qD8GXISE^A=thrT|o`B&~XG<)WI*c?%nl#v})77YT-6M*p8xF>`TESxsfx z%&P9)dMWK;nc4xhrmUiRrmWSqYNi%$IyS#@;haqQ16jb#c?)M%EY%j*%vn@kHFw_3 zYHeXv`Jx5YDmJpbkIJfQdjkT|otZTi5qBsqB~j`OTWBb2Di$qJ@q=p@hWBA+?V{?+ zMJ>k;`b@<}Hm;~oNs!u6(Ry{|+?j-YbEcKakFNEY-9){bWtw2<%c!wM6^kntRadBM z(y*zMi%92b@4b*7sqL&4L$F8;e1%qCTT?lcPnd56Ri1(JnwmwL8WHgjme93C!!yPB z2d(hrwhh(giz{Z8iAPhhs9bcTdgh|a`SZ(at3tOvPZ?yl+}uHqf$A{ry`X8s2M_L> znLm8&&bJ?Ov>~l&2dC7UPRiD_rF_e5mTgRTO0}uL>pGjc)^zcf%~dMXr(JkMmCE#a zal&B-4E?M;uco!v`E;kAWjvTCy|CGIA8faOfX;PK9ySu=TM;W1Y}6hVL~eO|P0LiF zjrNGr>n&yIH>s5!+GuloW$4$?N*Vh7p}h)ibbBjo3L!%q%}Y~ue%GaudrO+M^Rvdc z)wDX%r95XAJD8z8uo+W= zn@1!$Rp{%I&^IT;R-fATUx zIG~6VbDex^Mq)>v(Z!jncDE2WQcO6Ea17x@!t)6$2&)NK5MD)iBjHZMM+u)Ie4g+X zg#m1PA`AXb_$lFcgvSYGoC6;`#}vj9CKIL;<`bStID@c?@G?T_eGXOe@2TK6!X1P` zrTM3X|0Kk|1i&1^u7nc^&m){gxQMWha08*-&y&rR4GoGL2jP(eOnPg6B8kn)2GClj7aIEU(8MEP36 z%c=ZI%5NmxM))T}u~-PmijPu3aQEof2;U_9h#EXf`ELlpJEJ_7Fomh|G{OQZ?@IZe zghQx&Bnzm5GwDE3>pq9_7ZNU`@_NdzCcKu)w-MeB#5+Xa=u4D;gX;g4@H49KDzsFE zL`$8}p7K2?Kalbh3D4hId7-0=&U2Sr*S7-C5AR@ThtTSF%0JlX?Ul(t_#tddZRq*+ zUcBvOcl$sgRzzB8Lzvcra2}5-(4p*sdZV=A@pU6|>X#;JHO}3lRBQItFZF4)O4r`( zSa)`2{l#foji=#_`a{n84_r~tHSDdwI7O>*)PL!!zu0HgI_kf6?S0Q&^K{f3-W^R- zpV&BiKbwW#S%+^596x^imUBc#luegi*b0@^h+9Bnwx-A=+=z>wdAL}>E^*h|5omWd zPA+ZO*YJvWN74)vE7bV4Yao*J?x;iDp*}}zo!%XL`@B)pX&(dSH`XK};N_Zh$kQ8+ z-jb%;l#3nN=+tSl*{Rc>5Dh=Kt|rG*^vvPkiIRN`#3*V_`iJNdE_TbCvW>$Z{4DzZ zhU)tv+z(o8YSCcBxBJ+wI9R{5P>kBH%uF$A*6f>MgE@QK)`03qUBtbKVHcfvrQt=< zFkDwO>+n)s3+^6k(ld2=2e7__lJk}{mGIpHqKA9ZBYUuMifHUW{Q#*ptTBt8X-;qW zOT%-`vECh%j|X;PxRss6Fc?ZSHymqtdg`a}}y0wP) z9xld(vVy1AEzfDCE%WY|8*kx+BUfU;us~bcByJqT-)xE(pm-ZD>D|d7qX=xnGY)lv z+Gp~CN3_3>RfxPpJpq^_2YcWP))0e`IeQxhcI~8`w4231YippgOIOM9`pvjZLw#nk zAeSjJnbTdQk2CeU*FRY>^$Eo!AZ#0AXigXS2QBhXupXb58o5C`^v%jcwbrtVqLhuf zrnQorHOI6Lw-D!bpIEKCMcR9(pUkklO}HVsSh(=G=Z!@E_UP!0v~Xo#cBHRsj`Y|H zwCf(GPR#8dQ6=w$a4iR-f@>3{2mDrLl+T%srVc=7w&6QvxVmgf*99oObl?G#4 zu^i=C2^q|RiQUBvgy1)oNjW@Sb(irL8c-(X(lyj+$PF5mNjYphTuvqf{JT=E`I;;3 za$I|f=1NDQHA8dpcU@Mp{;;$<58N-#b!9-B7zJzE0$1DUIn|mgs|vly)}m*NOt#7x z(G?<-qcUdnERkuaGFEiOta+L%PnoN`L_LwqS2<5~#f&P=)n4U%?uDYyt_~`f7#*mX zu~c()RM`~KjK~$JTv~L+Op)uPa+%Q;b23b&6Rf$@jG8iZ0T zT`=0@{{ncduheq_@_E)FC^)}W1H>T5*Ea`PJ4AS-FT3j&s1H4tq-{N@kBm?v{_Iz;y z)-Q%LDSD~q4EU$1YeX;8oRrqJSg0WCM5fN!Dq1X5ovm>l^aMIaXKL^%!KBlfHi!lV z8)!Jw2hpIwtkcJC5?$OY0J1L@ZZyB4@*S5r8w5r`Qq<6oc)st5V+nXt9#d)=P09I%s^K}w21JD; zsNlDPO^T9ekxA*=;uLB*&BFd;;s@3hiO!w@`KCF0g}-URoau%oqO&(W-{_iZ&Dp0x z-BYxn4bHw-(JgsQ)!A!BJ^>@x>M2|v#_;-LNfYn~^AV%QYz@bTT1g|M)H&7TBrD>8 zjvIr9rc6^#5Uruyz6|#TyO1>THt2O|4)VP;@uKJ}kb`%wmOj|2$xTJ|SM=$c@?68! z(89}T0Y-;yI-pChDj$qudHsxg#d&K$H6GA0=i~K&`nB~^O}`(l!)~$lGRlC($=m{z zS!`|G_HtbGK{NwDf-ET6|BTmCU2KQCn7rEroRg6tSZElX=}+lD;`xsfY1pCQicg>h zoR)A!nZf>rt)c#Z0)vBX1+#HWPvVx0O>~ic>LN{YAV#@pi>ftKeS6aR4LmM8umCng%`WTB?tfR5!Mw=9^$^UPjaL^;v1 z>}8>hsV;XT4TbpCa{S_T&~HV24*gw8u;E^V6%2g6F*J>PZRkB@E|$!aV5F(7$@IF(@-oAc7+efD~-jK&KB7= zI9Z<{w-MYlM)i6;y)Ec*^1`K@mxijXRGvLfQXUuudF|hxpEt~GX+i|ulb58BGuC}#v=G5*fIJbD!;@UY| zc5m9<$uX^_)>ZFV;Oakb)0R24n^4qu_B2=5*Oqm0ym#5g3!dHNO050ZRlob@O)g(j z?G{(Umb)Ll`<}UmQ`2?+Xrh%87K7r^B+J(xY+y;O3r0P*qIJ6XAFL_m6#npyoy`LY z390&6e!Rh*+!-%vQCJNO>}b_eNvx;dafPATyVE_d^F!6qZ5W>6SG>}1bq;`57-8EH z;=(;Ne5vCBWin}NEg-{F4nPwCXRC_Aqj(${vZxf#zCa~G$EK-du;O%0i3N4>e(=j5 zO~?s=ZisFKZ(H8ygQ|7Fdonp0E|x#2WO&8u{ zb9h3+?0G%>tL#%R(e0Hn`*s1JBn(^MPN1ood%by~`u>lT!d6s=fo{d0Jos@R+Ir_(7cq z_*s<(Tg5BQR4+}SOQl^dB3IDwhu4+c7;57Ia)ZIpkii;O(gp3634-?h-U@1(5L{ci zUxC(#%9J-*+ox%{Cv*7z|qrP?V>xf0q& zGqg+O;(68cu!nSLhtH4(NCp0u`V(xubH=csZYkK0kj6x+VHRnXvuDF#E2v-!9S`q2 z??2b-nyqv$RpoOk!qq7!_k;6vju@aaJD@^Q&$1fQ8Bs^eYL-=1@a36STRvnKYtzNn z-G%9$!u4&o!b!C(1E9wRuLf1pycxAM75vP3R)$?{tChm_P9`ezN9I{+sidK^w=WI% zzk6? zlZEexKi^f)G721x#n1YA-{L4A`z9MPAyT{P*>Tey_FF3dGWob}da{M$6oZfNW%~IA zBTbLBRLqpGL^am+^YeF#qdZnY4rIK1Pd7cw8toO+zs^%iqOy!3?YXPF-X=QOWR*|F z5*pTB_jMT4UQI9f2gfTWaJh3kwl>p4ebCnUc;=gy{|u1!sIc-`;{1(teoWZ;ffnai z#X;lFGn-6*Y2Z2{p4mh9$KTT8+$l+oNB8*S5vd{k(m%H6Rib*| z`>1*$l`lzBJ8=a6bo$?;MK)W|s&Q*~fBaJ|iqB~!wQKAgu@-xcmpyG{#}v0w3JR>w zG8^w5o@zB^f;(*-Up1W{930g(0Do|BHKuHgX>Bz%-AeI~C;^i`T~qTt@?dO=wctF; z@gpWRmTI`<(k?aHdq0&#vuEE2Eduug&jvUGH_i6 zOY~$19trv1Qv(o!~YywoLepi&_JE4z%T0Nz9{e()xcwee(;m9voPVn zzX@|j4?1p!JqR3^p>Dy@(DAGm$2(IV!xks{(Vy}uGVkWC+FKn0HqkfBKH*Wqp9!UzS~~3?l1}@Fq>~^(U>)HG z!p($t5FR4@oKWr`k`7m(fJ(Hcf=t3(!UDpsgaZg?5H2BHMc7DqGvU32j}Sgb_%)#( zU@GAyOegF^IGpeT!bOC2gc}Gq6W&2Mz*0Dru#~Wza4TWpP9(%I-%Hp8Y^`a}Qia#3 z{7u5Y(eY-&V}wqpLTQYdu1ry+hMTYx9q&rV&j3QLK7tCyQN>ciDRjat!ixwOQ~f&1 zucG`_l)s7ccc=?!4^h5}+I^DnX<1)9|JUfm_X&>@8ZLDrB7mWx6v}6~R0G+B-Ce4F zA38pi>W`!RWU6;A;WVm09~cmci>Y7@;h*Tl2dJS(DgO*L@B-mWRR3MV&k4V#`aec~>UH9+wxt*7I^qwqKh+{$h$7TWkI?%R~$=No!j_n&rW z`>wxYXZr{>Xm#G#A~{J7@V!b1aN_E({S&%BPM7LCAF?a1oj zk53g@eFK`OaKQ^u1vX{>$#B6CRLO9`Jd?B3fb8kuU{7I&cd8ibvZr>yU>VN*e;zP6 zU`}#@F9<~phBaC!U@%_8P{3e_(Lw=(VayQ<7>tG6Zx0yUFEU~sAE6+lLrjO zj-V6yMJp_S4;dl26Yd(RN%-B7Th^h;K*?YnCe2{n5lF?TvJ?R-IyE?0up$46uS_`q+wEyr{S%Jqh!Nm8zbF}ZmepmJ!|%U zh8am3B4vui_N*`~B+q^(r#tcA+(VYHYO3+<56E@A$Q^HP6}lhUBxttQ99>-N+y${v za~oMownC;%<`lzJNR1Ym3dz5*gwr*(Fs~E;bHzXC;MrREAOEq`@c-ucl|iGTconuX zf#NoY;#np|2D0>HZIc`x$TB4u$g&mejRtzu^vBna(LIqiO2M#|t@!fvxM;x{WSq=E zDN|V_8Lvg921GVH(#j~OW#GzoC(O5RiHBpz5m5q=KDrv8m+`{GWLH{F;PH~#5yC-= z`FDY%rPFl0@Fk5gHbz?fvC@#~C9r0t4rOajv%XFJug0=b!M$e0A75}bLD1?0h& z)+Ern+14a(kXUC2+^{qzfu|P^kuiy{%ArZ}1Y;7I&N;i>;7~&Wy5lU|<4{9^MY*%+ zMTZ&+Y4+0f#ehSN1!CYhyL}>aJ}qt|W`TJ8#^X{ge#A4rP8>?WgYuZTe%u~;LZ}*^ zlRRHkfH`^Gi*}2mT)`7K0qO z8)I(_c`^JJheq7uFuFze1E@J%^)gXQM3m^T8%9>$u*ZBsr2QTfJ@S}=w*(}df!>{C zk;NR0r$QEUU~@wjbNhg{#T=shg)HV^m=>~_yB^)ME#}}U+R|bU7Ys;~ISeAGRti2T zSj=JUPqdiBs~2uDCoPj;x1lVPW{U&*f|FV%&6m#tf2r9JSHPH6-yjAkpcc`?G%`&> z<@Klx`l?J+)?@H$L^e&j%&f;P-6;Ok=Zo&>SD`(GX5C1`+ulhgDjAcUq)T6^gMXMp z{ek68Jw8Ne1_D~f#iH66G}WMk#h4vdZ4IiyKSs-h_yrr>=$GkWNDx5+G#chb%W=mD z(FXG(nZfR2(!6Ln=m1pvZPDDNXwKLqT5IPbacE$PUMKKY@sF)p|)G7#4(5yaEK8@Qn#TOU`jqnJJaA%RrlG-PIG}-24 zwMTALSTx;i*yeNt?O=}S$RkQhcMuR|o0AP&o&HB1L2Ilm$)FF#RaHR_!sABu#A~kW z?T+E-Hkna}lX8{_jP8#UbX|_Mp*;Z;ouPcgRIBuYlbYzvtXx=KIln?>7SEeiQ7MuP z?UCuu7n(lTkv4mptJ`ZApWDST>+MH=5^d0^ z4XPQyR+*d(xb?(}Yh}>{fHXqXO1Ib*?Ox!aLGfv5ff^HuyEJt(K>2ZnS(2dg1L{Hm z(1tKelBx1c{JrA}8j>uos4fo~k~|errgV598M4e%Zfouyb@7$6t^A=urXPROZ&x`o zs}n01Rm{;M+6t*4$-!BA*z&lySSw4(C>q=NQh31}%U2rehP>jug;ljRWwR<4+cJ(5 z-JT=FA<7PAe#OE$HFLx4PZFn{()GDKXqnQ&07aR=g!HfQSB|)?&ND;yF5Gv}OifXK z!of-*4J%(T*J{NpJ13-ZU%F}X-2cbin}A1EWc|Z;>w9m~-MO7TAqfdd0|7!HEV8cx zvdJ!>q9KrlKuBWJ5m1H(14sx_7|_eO04nZ`xDBA<7;r%y7jPSOTo5-9R1{Pkm;CEj zb#8Yj;{ScW?|HuG`SL*j>QtTDms_{)Ij4$UF_2A3wD&L2lcPcsHTKk(%>=ISTv*8! zp8r$=<$P+-;^S&vWnC?c5Gq8d{H;E&+WpJ*K6ZS2qqB1!^ucP~OcftqxfXQ9_u;C# zfPLUQSL%f%snbUHSqP)F9Y3utM2BQg?8Cd+syDAd-U5M>n}x3P0AV3|YlbB4v;Wmg z&QYr6u)N8X_91zb9kTc==lltI6M2Wd`_9;8yL6o9(_!A@BQq>&vJSB|A!<^?=5Q2= znlxv(7ByM!4U3utUu5f2mh?Z1nr!h3Wj*K5*>$uPJvp8&4%z=F(UVazd~aZPXx0*2 z$)0TV+0Bb}E_>orX6Kw=_~cvPd4*5r=A2*n#A46lMm5YQ)Bm=@C$}V=SNP;mf)GAA zln@d=*_9d=K1t=mCwc6Nwy=%x3H~&mm=Hd}pCe3yhX59J@o0Yj;=&=J+(OHry|PC4+q*y1 zlQ!r1qV3%^dV6<-KnY)7f>`Q8#rjjJ61)K5GhG)#91$pKqL-C){`rmbJxTa1AwCNz z*>r8HDuhTNn{kT5e=4B>E=|lvG|Y&}9Z4crB~5pR*@WmlMC1}!Yz>?TY)>janXnJd zFpEC_Y4rI|y}6IxS5=kT^kwiigNhBnZL_!itBqWhULJ~#lWtF{Rzhq&LErz z{V!fp^7xIAtLHOJC7ez;k8mO3Qo^-_TL|wYe3l3>&8U&QbZ`M*#25rv;3{Dn|51b?(4Xp89H zgab)7VJP8b!55S+C5E{aP)t}y2?Z&9E%~n}yn(`RCA^Pt58_oy3j6N($VG)9Mw1%Y88q$HDd!0#?Ag+xlL0njrU@XxSiJna~9>87Uv4A`(h+!qs ztBK|!1abDp*W$D7p??W~9=ESX;yQu%o5J(gJuP{4;5R?Z`9oa^e54r3H>k(s?cy z=EV=+!_Le9zmg%~9BJc#AOQdTgw#Whhz%)<|4l%G@Zgi z1x9~<^{||Lnh|oJ$a{$QNOslYm{hwu#nsDBxK5wgA$+>UUtj1*D_`DpY1yENld84X z=|AW&Y12!!SJmr7>{|xw{X?P&gY2HG^|b$mXu<%#({pxc&V5ECt5Dd=Q@lt1KM`M; zv__vrcVj-eR`)9vB*@?wf(!u}MtOvttmPI2H~EE_PiUJ@_u=G(&)-8EzqIhUFy9@T87SkC0~AK++6PkTk;+B+Y=E zm8-clgYsF7y)jqeHyE$9zgVyD6LJlm?RyGMpZ!9kzQpHjY@PP9hiuTl`~Qi=L$CjZ z#Dl=$K=vqn!2Y&L&(!$?Daqb=nX9XP!40A3M1i>Brl3!Me#6btcJ^>rbW*VX)a=qj zqx>ex1FUHdMDN3A>J#^}R2wt!v}<|{=g>_v{CU4Vfp__af1i2qkUDeZ=w669MVbuj zH&$uGD1V=ZcMlxb;Og0MBy5|cw0^mN%4BN|Y>2KJG;{Ry5iAo-k`p8GIj?lpwOWh3 zBzhm_*NL7gc9<-*;r+0fLgVz9hQkMr`wkq{ti5l@hgl9O$eiu**>5h72+?w0AbE0W zLxq20!|70|PCKPSC0dm%NJWEi_4+aXb))<_>t|-Ko8ix1KPHP&9oElGTR$nav~fj3 zY2%e~)?U3MzQYZ{kG19*38nvKrDCmloI6{N%GMgZ%&z=7tFFV!|7w8+EB~w4Rjyp_ z@8GK|V~}mu&1H}y1ty)Gwesg+ieMWDwy}b3gkT#e*m|5SSoyQBE)QJ!;K~MBYu^4+fm%?%%)d7z$oXURX*Kby5`Ib&vFbw?Vx zA(H-GcRMqi)4p~m0g)!x@saDV8crrm;2k7HY{hQp2JG`9vhc!Ms~p1 zhl7rjf8i06dBcpdI80or0LC7b3tnOoLyg3Wnu{!F@Z5(W^F_^5nzrsh#k4dbUv!8U zYE5%p)X8)%PINMzb(XnDdNiw)^_9uWa`@LXr4Mp$$mPuD_j0KA;*eA9HA-U?IL?0!(O)?Iw6honUU$VveVX1ir^b4N}eslXAWDTwFdGX;Eq+9^X0MPQk9c9DN>gg;BD z3oZeH!QiegN~l{~iJZJXY{6_LlGELh5aM#j{NYWqIfum)Uz&s$M;MQbVh&}8Vjt=0 ziVr>{V`Hn~tG{MpTdyp{5^ic|7--x)g#txB#n2AGClHB4oY7lsTuIp=Sgb&=THvgX-OP%n9R|cO=(Kaz?c0IP zy2Z{<)kXyQw||nfQF8?)ByH3#g7Uc`<)C&IR6;ZaZPadp5`s2ro}h%FjoMvMLeNId z7nI+<7DebOs9Z@aL{SQY5WMlgF2GRI+uLkuV1!jI_J%-=iXQ5fFF1Gh({lef5-o!yS zjzH9vl((eSv%XO4@!c~Hwsw5zGeysFZ)e5O{Z0|_=+is$BPLcvTzjW?TE;Wh-G2qu z`8ggI?Y@8|py!IP7&pEx>s^paP|1mNe~V-Eay5!GT;ggfDa|(@<_Txic4c{I28|D)-e6tc+%?qr&Gm_ zff@h~$W!3VS0Ct96M9?vAVKMFSX9;r|6LOOf(?>BWEu4f?qb!4PN#l>lD9rwP;qXU zFV{y*7jFUyTu4D5If9x1_l4^h3M$zx$#%?EyK|2?cBJkM88N-X>Oc!>0?i~mlFR1qJ9VqZbL1nu4AkB*fmF0%DOMQ}{I=Gi2hslDHh&D_>CTZ7}{IV_eDnG*@qaKZcah z7ZWN076Ft5NUf<-;#V%AgQPB#(JX3GS4`HWs8$lh)r3<@hV7nvFf9kmYD#UOMv@1i z@TpQF&dP9rtd`1PRZ|KJ*_sqAfj=ua%vSsI*iXB(@$7f{=!+z^D3Wt7XH5KyF0P;h4JYy?3xwC!fj}>7$ zF9>?gtD(CRdl=kCPf${?rxtw^&AS%Uti6<6W{_3XDYBeW4B?Z>C|*i!&3tku?LzQm z)Fqu2WGWm|BF^V<=pdgKwanlaExyCcb~;*0{vIurQH-!Nb+~_{y_DIEBQUOOXUIGn z{+wrGR?XGyS;xI`6yBkPG1u$j{Cow95F=+h?wl_ucd zT>dKzQP^Cx8%lBjC5w~0{M8fz9hb6zu3)Wa4nK}FrCc`9g4`%S=a%KpSFs|%EM3=9 z46RMK1v}#svC9>nL^l|kP%nlIjx6U5M+@d-qSARm9yG7zo@idj2UqgQy?8&64?il8 z^avdqhGINs;?hhnbAYQIV@W|IL*0xUyp30a0PTWl_Rhad&WhEOTHhTpq6J zlKT~fIfe3%v|h63J)tGpzT5R!yW(=)ZTH-+L?z(+5RMnby)~uf6&3jl?8@8qH2bm_ zb$5^lITzU!my|L$Pn6C>)++M*>VH<4`DF{=EvwtUegA$l+w5p2D!Hk3mu}zw!_#c} zH+z|dN~dJ}8<2ED>G$JP9!k7yCNFUd@ z;9<#$VMcVXe5DudzfypF-v#StZGoiCc|TG2#ksk_xsYqe>hLrSQD_C+?(zEA@} zQcuL^C1H7&MrMu|XK@2W$hZ*J04@t07Mj9P5p#b-l=$=!{?N)LU!XuKyo4>6k4?$` zcBh__@tqmTTUu2aC|podUbY}0sZkRD^g1{(Dw3tTd}&DqW2{+R6yW-m;UJvo)fQHl z)CeYtEe7@@yY*C+&35~v1S83gx=T;Van@`6VFg4B+@gwl(Vu6 z(&RB?rc3-=u>7!|V83ve-d<(X+5YG*eWE>br=AcsW%iiDkrz$t)yKYUr#`eDR)X`F z+1|BNzudO&)=PYdGjVj`w2MX-Tu|8eg1&a`-TIJdN@+yzUiR+0^@~#fw0iarck2sG zu;T&o5;qsEAQ1u*>B#f$9qEE!>VQXxKGcrZ(|v$wIyZtr2BMx^NyFs+Jo=c zX9&@o!zvfOd5*0Z$L-0_$vKLq*>e-*PKv4FngIrO&&RD!IyNyIqQu$hu5307nEyZA z+4??EB z?`eD3P9-O5Luc`UDrxiU`!kiw1l-adwZ)0JIrHgcduU(TRBlMHv#PbEf&9z76qaPU zCqZb0JAX3$f0EGo`&gJ!dA5zWr=2*3WtcU`Oxpa~(>{GidlsPB)rVNMc4XPr_Z$2u z_9J`8K6iGsBMW#~wO0;tCCRz=qHna!B1jHoA)X2`i|<>;L}Y@hT+IG!^dI46ZRo#H zeEfjEsZIF(_P5n~@^nF}(mQRE|F8}F**4+WNb=;H<9N6fej?h7ck6vSis?=_8vNN< zwr|<3_uRb2YS+nGFdWIW^Ur(x^lp7pP)PK!&d*_p?}FH?;WmREpc91rqmn4DYJ@-3 zIN;B9ewcrrBItg=BuSd22)+`~$&z#v(GL>+4?>(G$|(!z06T^CnIaNAP4qcp#47>5 zjN;NrrJeZRj|8tGyawTEbOTSaxJL?NBGCST);5kGl=k+~A+F2p8$Qx|2DxyTmu^n* zlJOC*uz>J#2d_yFOfgw2Gn5q?1U72!ETuOe_h;Uabslkfq;hY9x(?k7A% z_!i;Egx?ZI=>jJcmJ!wvt^)>{V>@{~K==>BX2P!slMI15gnbC76IKu|BfOFD4#K|! zS?@nW_zwdTJyB!{g5ePgc$@G;!cPc)B0lJC0%Hi12|E(zn}WX=;Slm4LpYgmhDl}* zW)tH=!b(DJ5P~hi^%TJ-|62*~CI2S~5168+uMz$S$d;0$M1KurGx&R=TTHfB!W7q{ zghwopEe%OTLslP4K`zmKfox5hLi80twzOPB^!30@R?y8Y7xb`i_(#N7t<%q{$y)!u zeS7iGS~Gg%vsOxQSF|KGywEVw@4o})^!k2s{dKBRv*>)2L_lfkP2RE9D*0c#_pgRS%TK?QGP#5dCHn*Yh9s+ zgL@<{A3kt2=yGLE;o0_=e`cu%nzTKX@2JsI)5bfI=?wo|#!%ci(cfnrnReECmD zSnBBwKQ_+s7h8MO14muVch34PCRHSFz_ZrsBdpHMn=y=#o3xdTx2LsdRK4#$rA{e$ zqyDJ;)4MEq#+sL`b&oLCf`bQ+>Fc)mSBfNx>zfr;xQfOZ{{Af6!9nmgZ16*7g(WqY z)nGx>YX1&Vhw6qGPYh>k?^tU!6jfF(XN9-cL1l);AKVznQW(xWCo#`|$UK3u4Idu( zIt5=Beb%04YcK3;u%6oe>OWf;cKOEIbI97eg*@N3_5`1`_O2%KIEz1=GdMmk$OjL6 z<+1i)cOxD6(hR2?<~VTR1moDmIgYWwhy+hJ1^P-20e{wk3V#+_ILq3z3PDi^qyEhr z%|H34;NkV6ZB`w_@0x>wr~}_BtG*mIY#8cTjc;pgxIy&5x(+A8@L&TDX9cYG)h*O? zY#gYg{OJQ$bJALk&sFuK{DZYd;d8jyKk4vJo)dFU?#LFBmDajF5Q}Dma?Q5iTUuCl z71kc5O|Q@KR}5gI%36&}fLK7q|E1s8t>zi@6g6VmS16*(8m9ctzhn(=T&YF#o~3SU z2u@@n8(CtbPK;r$CeLt8BUscq@$|1;qrG8Z{Xz9a9M^(}TRWk1_t^Ru&ka8@oV!`k z7levFd;Mx&^mS~!514_XLpj&lGm;m3qQ7TT!YW3wf?I3;ft^FaOQQ6wKYC8|Pj0*n zn)jm`r+HWdk7c!3pq#k=x0aRz->MDg>W^l!{%QE{s$)m779WNuBcyXJE%ISjjq1_{ zwc-8xgUX2_R-J|;-6r}y2Yyx>m-_>_E#=oUcek*~$C_gH0Jbm$76chNhZTPgD`}rV zpO%UKDfm*@5*W3LEeTRIZ}X)xTNq9(X6+HZDT@{O#1fYF`icHYCq}XAGsfZ_5})S~ z5tBk`)a_sO9F{l!t&efdB`!YqPp)16w=BHWn{)h=(0(UA{5_PupJi3>(uuLKDd1Tn zNwm1Jv`%#W1%85N&)F007(KoIlz9i%n8rkGhzA_L+SlmCA+}hR2E4b#RsWoM`Lp$> zJYC-Fa(GI^yT=>;+tPyPcTiXwIOIY^;X*{7rE4s?>YwxR_#4?cI~Q%;evq|qm%~eA zUs#FKw!E;i1K`<)9}Ak>c(L(Qe=23+B(ZuIyiw46+{bdRe=hymOJ>bvm3A zJl55@jTQbW>)Be$27<4V8-ZZGm)CTuJfOm#8=S~GBDYCvV5>8mX?aasM$+2sVT-1T zfqHuV48L#PTMY*u$!d6w^|+_uy@u2H?8@5SvjgQB67*D)^!=2J9doh#nSI?X8;w8~yB2AKLCE(Kxe_-1DLqUrD`*fwN zee_|Yqy60)t^FuVa`Uh7(ZYs?TbAW`I6VCGx0~(YE&h=+rnN;4%NzQh-#^;^cUQT0 z*U;zv1f16=MtKU0B<1#KZA+wQYte=RM>L|BEnggy z6zuH^=fo226V8}zrz0xIqF&&ZArsLL2|9lLU9Ac_Afg(K9M~sBvVquETw^e6tRUwb z(pI`cy1;VIMuiB)m!=rDm*KtjLl)V@TRvCZ&=q_{S6r$P8&+U5)O2ZhO(S^<{w`{2 zxT=BVDc)phD~48q>*`3L0>&RTLwQu<0u`ef=t7|4A@(x>i5WTi=PLaF#0!T6K4hEaWykaL7)X-Ow@`;drZ(S2JeG;<8~aDrn-vS5#O^0k@Y& z)kE4OCKW0h>rf5F%rRlg!gRzGOx$&7I${duES84ZX%?@9ZpMJ>+?7+&W;e80t_X`U zaqMk&5vjzP)huz-ky0>mAY$eT&J+{2EX`ndL8hBfjWY8Em1U-awI_a+9KQ)w5VHV+ z7+g%j4OghbA4={4k#vg`^D`^NaIAo`+0TUOA=8mkFmo_=27m!F(huUIV$%^*F!6QP zbi@?Q>ku|LUKV|YkBH_FQ9h6PB`WQRDVVTeVLD<8CO$5hBLtOT;w;h}If9x1_GwK= zO2KS`%8EHkkSW%@>T1axEvQuUF_hF1T`;+zk0ZKZ;!0A}5nV9x;n;LU7ffg|nU3g! z$?fboq6_9PNYfErFuNGo;W@GkCZ77HBfDTuMWT-Af{Dp!I-(0E4rxqBbistot?7s^ zm^g+r9nl3oYt5Nl-YF;7+zD!ypz_S`7-!IQWEVu2UuN;ZUXmMJp+1$_YyjcTjP!j~ ziW#d3RR~2judvF>CG*O8yoV%fF(V2GC?vXIU?f6aP;up15%LPG{@F@|z=Gtui7{5n zTwX!{meowsPxHx_%iL^*)G@<+M;H@y8RXtFBC4^tKBpI)vGW{P9Q3_~Gd{4mn!dS8 zzF3xA6Z@}pmj`10tFc_hAP=)R?hBMY57Q^Mba8+=QSOBJ>ZMmp${_K5$%o4}@ey0@ zCL@j-%Rk_Eg*%piz~|1mWE8vW3LXWP7anKzl!wSjTju2*T!I}oFEE@^A}{bz6gcq` zth2+ob0W^ShI3~rk{H3A{E{C&tP`I=Mtn>s@@qT!cuvBtx(Uh8^ZiEB;RqtZaY!lO znXLYhMUrv3EX`T=ms(S`M3N`=mV{71>int-BB49mt^_6GvT9M?C$|flt7a+-# z@P$m>bar9l^C0Ub3ez4L+#+m{)15){@8VO?5aU2D*Bx>Z$ao|>6(mea zXDrYh5|*Pg?sGXL?#;;HhoXFbU~pypOL0gTp~~PA;hek!>I&`4C3!kZpT-)Z{X!y! zFd~D?esgje$PFP9lPm)UW#k#Zn&PxK1EO(){1_xZ-{d6plQNFV4w=Kq#LrN|ORBNM z%}4|1OjutXjUcWa$;otnxyr1lD759#MHz3ZoWuk{lKfr<0KQy<im4McDC7N+Cm$>Pov;4c&^klPM$n#8*^5mD`7$?iPTK6pbKbQ>y`2GPChH6s5p`ju>YxucLr&}qDJa6 zhx&|%6%eK3fIW4YLv~^e+{zq(g#$*3pE7X5)Dw+c&G`0#SCz9q zWOUXW_&J0hm?iGugeM+%F)0oQBkb2#ZN@9x1?b)`P zWrRB5h#!^A;I+6XN>ox%&oQb$%ra&0r?otF0Pki{LH^JX70%=p=DpF0Ip$;O?0Ej( zaKghy6_uS5(HD=g_jKGi4e>U4fhpc$jxnyT{P|^w_V0wZCSDvv6mHtU=drFv@xlz` z-zMF{%^&Dq9&I2Wd@(Xc-=GorGQz?dOwoOEyxbAy$p%Ez!ZI@y@8H5Ftyy1s=Jmthih-9als;9-}x1+Tcz8j)u>eQaZk~J04@< z@lRLSgC~mnO&t$x8;1lTRc7>>9mD+PC=Ks=L-5JcoX5Y2%0r%JedQX+AEWXR+}rLN z%vVZzNRLPYl8LS%)glhJ=Qxy0*vamLF_G^k)Br;uGwK?)D<;T!zKjuqb$mttSmwZ< z{X-^$YxwKDaBj_tc=>CQhJ1lsE{wGh7=4!UxI0@B4~B0oX$Y=$ca7>JSd#GNA9wR9 z!p4#OON>{t7e1lIv=Pv2UtCkPB(O9<@_CB`T#7)5L#Qln<8OP=hpUG*sa zWi>5ePEywdKQrrURiC*_{Z3LA%VymWO;LYXu}zcJ8)W7?b-dbv!Q3Y&)J;@l%zSgg zd*&vyN1?e^-5oT?Gv?qWW_}O#nr%H;lux8>`_1|t@BaIxx;hqgS8$usC7$_zEp1bO zU$IfWRo?Z!`uE^F>MPPN^-5OECA-w#8`WLG@6~si&(dA$Br{80Wag`$UFyt$IgFL+ z`w8ZMW_)fAF&D7pOTVhCQ$k6@!SE~o5>n83jD^ss2RUZkOrOb2n z>UuM;?9H+_Fa47JzrRfF^UjX5W$H*4R?pI5{~^3MZ}tN9&K2f1^`vaZu{`Y+i4axX zE0@mMUVqv4O=`DoLThx>V!1;QdxJ>1#W69>iS@3v+V$!hC07!E;K9?B@m(0>t5?cm z(nrT+jm-B|$M`NpTulnyM2H;)Y+9rcjokv=7sjNIjL90GuZ@dI_fr^qG^^4plI^+J zlWIv$Zg@Nmm+g(Cw05x-F$tlR_=;{9{t}(+!m1gxZ&c(7c1&!vCkh2rr9g9{9rIOG za*&IrNHdSKF@3wroqJTV~l&`-BJ{VR(WobIz&6;@Gr#qovh6}NJQA8H2L-D^2bF7QxSQp~BPj-@>h4Ah{ z-X^npGw3Uv!x@YePHcJ?2xqwYXQ9obdHaQ=AkT*Ly&*E+8$$WQD(q&3d)~MR4lXkz zO$h=i>Ww_=9$vaB&M4siaB!&>X$pW+zcG|Lnzp;lJ)0N7F`bX9X#jB}X6V*<4hK~5F4Oe|*WYsr@3ik>Xka=!d6fp=s z0DF)RP=|6NZwW<~!~9z#Iktv4o(LDMk}54d0GHyOe)(lp3(#fSm1P<7_VG$bk{x2NTXrpL7D;V}|1Fq{nVPRLEo zNK>B)g@)vZQLBjcu1VCt?Se;3+vl1y)@DY==c0SkEGIs5hNI6y^iPE|96dBk`QyWd zb_r-eyxrqEP!oe-Z8kU^74L3mldr6ZGo5a9${PfI*Qq z&4~<8=Hb%-6g)dJIF|=c#p~P>y;Tn*)GuOie1->K@=Q1(sWoemduskL!*GY8J)`&Y z_@O7j>_6uC8%t&k_nJA0!DXUmfT#6VgJ&iq|Eaec5VffP?Ru+@LMaaDqP>9!h1&!^ zE8HI7bHeQd9un>ZAj}IfcM1@@0Qg6y{f5X6(AN;-zdx}?6c(HxbIxfWQ=+UH0R6dh zS~$-1KgO8~=*Jl^=@*JKH5@0TCGZ)(9Sq{ZQ&urJWVC7why`9KG7N`?Ci`g?dI9&E z6;3+TxSc{7Pl0;UD&ag7VicJKTX9aiB*Zx_%o)m%lcG&Ej>2sMONHAL$?Fvv0ZLl8 zFG8c?6=V-JhQ+O$5_`6C$_TiSG6F85jDQuw?E`+GrE?iCuoLA>yO z*1B*IN#w7z;l`{CB^K&BaD3jH>oEyMz~4ajo`fT|Hb(GzwDN+u^)yG`y0leLO$pwg z3Iioe0}{@_!Xd&89}ca~XHid5J(9isLp@2opE*|6=!u)Z?~xL8zI@_u2W@_wQ^g%@ z`R3*>=nrET7n-d$#JyqvlmFyMzleMy{C%wgDoW?sJ>Jk$W2TQCF>3Ox!fB&tj-EDs zv_0pDo|Z@!X2SX^+}6y>BYM}w)(z*F5Pa;2-qZd#!HA9yx0(IP5j{DxuDZBzX#o-_ zoL5&`T2dp0W#5^n{nHV>i#_dx5oc$;p(l)h;TcB*<_{_vQlx%NpbAGlNPby?M3opZ zaiTr_4ZXh~He96nwcwanR#PM`V0~E&XVnt;anm^VH*e_e?6^1els;{2BeqqfsjDQj zIQTA2_jxX}hrOxyNI0)S#l1kA*{Uq zK_lhx2YQQO}lu+ zL_7a2{bCjRFU#K2hv>Xld)jZmrH{I#ZEJ;_MAQ|vM(rim1-S9Lc9B%Pq^hR4P#7pe zp}Bcnr!rNnl}qe?Z|j4(K2M_PdrF*`mfC-LTThSSz28$Rt*KhfYGrSITlZfcRv?mU zs;g=xM?*-O&wIY8x@cZ`MR}kcCUp7OA|u6Z)sbK(3HP?bT5zH03;V0L^{ipe9o@V- z$f30C>Y@tK_$6i1yrRlQq6Pm%d85NSdY^Wjd;Wrw#b86h!WvZb-qCZ~J23-Qb@LZU zWxUnqS5+@7D`Nj+R;Pticgo?vvo?|e0p?t z)X|HC89Guu%FUFdtd}&}_TjJO&ah$TlUk`B*3aUe%)&y@cu!Lr3+{5ra2HRti4oz>rqKy6l*ILc6s~hS zf5Yv`Ke@`eDwKSc?e1b^%G>OZtM$y_0V({47Hq4c^i>;LiD(SaX>I5}vJ^TVf+5@s z9}34+A>#PwnGf{539Y7i zP1_}m9v5PLaaMPl=FZ9+UIcF4t#@!oY8SSApkGzgdZqo-<>*gMj|4E+$Ma2uo;#D;CO{R-X#1K*pV!vvKCmWi-gt@;$}MV-9)&Z{O=*$MgETy zzDDW%o9Ls2U*Kg5j_)br?-al-pfWnn5OjOOT*7?9352tVe?HNRh^{62TEex2H&FPN zAbH$LcpnA)gYYTxf0^jRM1M&5Dfxdxc$WN=Oi^R5^rMm?REC315q=?I={O3QN;r!G z3JI$zp++FB`_#-5t+vqK-QdJ z5q<-V69+Ruk1jA)7yM~NXAzxG=op3`OE``AW)WRPbSbBULfQZxb;J-PdNt8E5WSh` z+ljuD=v_oVLiAHaHxvCb(XSKz9?@R_gUoS;JkAk=VhEaF&z(fqbH|ZVC8M*5?nrbG zqWcg%l;{hIzL@A~L|;J&11{aUd1UffLb#T2BSpN4=nDJ6qK)8bNI>N2ML^fppP7(G}z*B@T6TU|H9`PL`JV~fV ziTb1ya@9$NF5700f&6D<-RNjQb@O2YY+z+$3rAo_2Fcai_YlkY!w-9b6 ze2y|a3}mbN+eCjt^cO^bPxMbjt1*HO;-)TmBmmiSCza@q#L$)K3n+XL(HBwpM4}4` zD+rent|i<|xP$OnfkEjwdEnw_U@qaKlBglK8_!-K9J}$ui5^9C1<}<+FDH5>(OZeW zjp$~gpW}2o-KxPnP7{ME3)&;!{JCD>=uvMzeMPEW6lHZ$29Mdh{BvDbg3xGMb;@Lu zrs4JS=9Mg}e7LF48kUTs1f2+l=!OKpwc7={VU%BMn&UT5PH2p2c(?vHIS^G7Q~#S% zcfrY+26xki+R5$!^<<|5C)9=)p>%mdX?VF5T9@)+_`xlmlMk0Rs7=8OmHHR7hG!?& zx3tvlZkpjY8#TYmvgq<=!+YH1>8j^YIIjJ)QE1Bf>$z^6T4xlroWMqEO>^BW>^NYsaY#%IjJ=+ z_nQspL@{1qDVg=Jx14xZ;wpxo2E7sYNsrN*3ePo-F&j=ayw5oYumoYeNkn^gO|!MS z10x%LZup)Ox7G#uXXuIkbe3xtm2}l|e-;LUb^T{72S%l%y4LmYNL-hcOM)==lqckH z)tP?+T95fBMEVO|Od?o!;p1+@X-=Iq3clty%}V=VTZ#p3&xj%@-ezvMW#MFU@Fe zayP{>xtsb&le-buPq$KoV~YV4>oUUnVD=*uqT}tADT=0M=1cY+-OU6!i(ljr)xk-` zE-*b=c3Gj7kQ7Z`u`HENjuu;Iu8g-hx3%_Nmq_isuB~b zv{hv5>152>7Uyie?C&aLQ@E;HgpOQ7bwgHY+;DK#5 z(*`;Ae+NhN5)J`p5SnU3TWiw|`-9@zu}tSXl2BYr;!Bz&amn28+3qnT4jw{@=RpVojoetUio(BHZ*kw+iykN%TMW@T>s+Edr#>dg1CC7fAkFR zP&UM(FTvrPk|TLPU=N+>nG29^j^=%hr5Qb|mQ$v8AFD$2rGnGreU-(JzD#iXyzjFX zh`wBKCd4eREt8_Jc$Rafc=H%WU->zw(!Ca_x!Xr^)+}!=t5bB*%bfCi(^<8m=WXIt zuJ;Cn6%XZ9p7*Z^D-l`r^u7>_nlyf`w+qIw_SK@NSzn{&j%tSc`;-_WIClWV%v-#ySBM7WBrisplWz0yy`dy2Xx7CM8x(>`E)rlG#h z`p)Y`PU=fI81}~Gg}YPh~>G;a+`6Wxzm`2~cz`%x>8 zLzoyLtd*Zf@x1-0mG`o7V8#e4K~l%ClA5tWm{sx}Wk1F2f9y;?7WMY5?V{Rg7$JIB zHlU-@G>FsckFYpV=^Co1?`D;WYR_9me~1+{s*{Fl=umBlD${V!fWDVCLDWJGLrEVG zo<-Vl6>X`pUwt+64n|dK)3_JxIq6v6qpG!H?gIfCejBom*PE!TG>i$8>sl(4W8u`l zWOFQPm9~ZRBWWGNHc_j!d$d;QK-DuX%xd!VEl=tY+<`^_>@yTBafux)y;@iX0u=&Cw)eo@+8j(S;R-PoL>o= z$S6~>(6C09Li0aiQOPpN=t%i$7OedmorpB8eQfL-xe7Pgjf}o!L(J%@G$W&UWK^JJ z>&OUs#KS~XRVdT5}*u%cp(}FN!Ys^(3 z5TtKM3l=H2@I0V*n)q9^kgH0OjV8q^X5D7o$j!7Plam;T8;R7c+fmw0M4A>Xvl)LS z(qrKZn87xp8c3gYAIL4rxgZZtu*M>-o2WCBEFAS4H&chCSlG@PHj$|oKJyrVBeI=! z9pc_XWSaF)l;c(+)2(~aTib}tuwF((Z6~t572Jo&JBZG-mZ9D5P*897B(QMkXFQ~M z-5_%fD|dY@-_oi0mUe_n?x*yQIH`Ga%zlsk~oo#>6Sbvv#AH8RL!i)=yZ%;>ISMyNSk zWvd1qkguYqYR+x4rDI_9AbN*vO+j&c68}!wf_*llK;6aZ`(!H{>G$HbRdaU9)?d&^ zy@~$2Yz05ZnD5V9N6mRywonpdh>G=B8eT{l?w74*#2-a; zvuxEO{uoN{IoYa50WP8pUzDv);Gd{Mm0rzxMGji)(Eb-wgu}A+DKeN%5#Exm!>I9P z>MBmZD_c;UG%hFlsB9fXjjp5u9G5M;+Z%;MpOUSoG0;lYb(}seTYpFT3)OT^pAE{^ ze0Wrn$2qpPv!%wUBKlX^T8;TsP4r5|+KC!nMf7ULDn%F75WP;ZaD9MLOY{cC!b_(S zAbO)>oxw=2BicUlqn;4_6q^}MPeoHKRd--5ioyiAM$L0$ErON(_*>Y|>v+{SK2gO| zbWC-YBEHyssya&%UoSqRF>Z?0lptGa7NSA}w6Q$cZ~cg2G?2(#>uvPGAi>QR9-K-VL$&saV&O?aS|f?CYcQR}jsn{}~MSD~V>)A4h^lA<=C5^Kmj)3(fYk z$ge0!9&EaophWYCX45?d1(;7Xo9@`h8pTv&Hr-!FPm~bNraN{YMkx_^zyRYvqH zvh^z3a{)n)#Bkm}oZL`E#{W!*i8S zcm80l;@e(6-T8yHn&|Ik>mv;AtF#)vzMYl%1|?|JXkxwjS+*+B0<}c{SGLAu7zc>{ zMYiygWYiJOmInwa8dnqjn=Izu5~6>X#pGK`bc<}gh!$B!G+Rzy##eXa8uD1Bi0OGP z(bp*!WG;>6MAs|UHRzJR5Y5&f=)@cKRKvB3wGtIrN8xNenuI1^uhBC|5s%glS~YJm zwjTY3?^bUhk6RS$R*c%sT6F^Gor>k>dlhF;DOOh$=q6`SDHdK0jla<#eOM8jhFdAa z#}#We3Va*U`xFZ|6&iO?m+xo!;j6oGr!%M&s}sh+UCy9lHN=G8sof$5m16Bd0q!RH z6~)5YmT?c!hZV8actCrbSLiLp!c}F)Lqxx)h`q;Sl>Sl03i8dzw65s7o9#;t(9oPe^G?TRSP#@ z7_Sh$k0ppP@Tx}J0@a#@0=!0avudqJ3x4QyDXRb~_z}^;7gezhJEn~heX3e}QNk~1 z6dzVCTor44N%Rqx0b1a=vu>!?Ht?UI`0uI~MAMD0i2gvej-tRPi9X80F{VxlI+*jB zYTbnwpJAMykx7y?1LrWFJnuP{mZ$r0!R5s@ zv7Y=1oYJJEpBdxNI3`o9953G1EI*~^^|29UbxaqWUfh*zb&5&i`zzhMjm5D#f6BK= z(cX91V6<|1U`~wpmT26nC6bBr?qq0n6Uiib7qB+6@&sp!_Z`+ER(C&-A7aGx4K~yrj(tcH8jnD&o2et+A4o4#W)2Y-;*(k9Fyq5w>@qUhi4Rq>o zA2JvuDBXJo^&9*quY&2#WW(DUA~N@QGZAm7;PiQ+f^7{?rwR=QH6kd;1aAduJ2IB) z7sJ*O>q0>#d#56cQG!Z|fh8zww4hSG_@r))5mYp%JHVM zF=9;>l;7KpEq2y4L3Q+En$ah?4X@#5!Qzhx4SZ=Z@1#)vz z3O8Sr;==(z$`}@+N~ukZ2_|Kf?))TNZ6~ZQ!JWpH#PTo<+X<^nxr{kIqk3r&W|vSb zNlJYHl9|k@c9i*2+pe&%R8swrVv^dQV1e?ZEN^wPoJXP6k~#^=GiNPx<_TwI*vX<# z;?Xl@AH+1e$vkEJ!B+`r!K~Zcv0~#}?;IY+nnOAx3!VTDOpDz3!W6m`?7>KtwZpb%sec=2i~7b9(T)9LD*Rgh>XLHc{xe}B0omx6c;Vsw67 z&{PKUd-lI$NllF;KaR6>$@dV8k2SUvPMJTJrOr#!Bkx5^HQ>p`=BKvVQXQtGDQsYU*Zd90fKFj8#I=1sK__oc-io$$n7M?vp7re`P9f zTOTrr#r~96t|f}Ct{5LZjxqm#BAK(YoUv4re?Yl2mN|~%kXLcoZ&@#LcHxEp5oO9) zB*{NvrbwyL>5_B^1NJH2#c~?Ah4Cb~g6%3wDw&%Pi_|+9;~rG zn-N9CXa<98F@y%X@OuglB61fMt@Z4Wym^q&a~O$T@NOqRk2dUr*E-?MK)(lH;KlwM zDtzc(q>zJxzPOh;d-9?1MFDG>L5%dl4=K|(2j3w^BO#(wzhN|PYm~e286rxbi_&Ls z`(>#~5GU`EmLW+KFj_BS4IE@caV#%FB?>kUfnB)F>;yQaIE1ARWzI(Ipa(|I%mGNc zK>y6%BpR zDp5R{Ul@4-Z-X59OO{H%v#c05rt#s!o;GrSe8$edjd|qX&3*S_&J21{TQqR2Qy9#%f%{P zijgLF`<>C<&Y&>;{>y?f#JE&>y4!Fy1mQD?l%%W z*uQ+%YR@`*7O)VxN!pQEO(H*JMIC$uz(FHftJC=$fbOX z8{Hk6#o#34z}G9equi~4d;4Z(Vp`LnG^Am_vPB}MPcepw9JiM};D?RCLwa6I3VenI z&&9&X3!iQBFxba)4Z#A#h#R~x^3soo`2N8X!16#VAqV!@9kw|N23&6E$@|`pZ7hG-3vzVJV9*MSFHhB&E^@?b>y*A27Om1zY zr8ZDpUd5b>J@G|7HPT9p+~1R8zZhk7wttB-Age@|s_j-}b(cLp+UODdeZ`aezgS>y z(G<0E{JTBo^iZQ`D>?C+JZM(AIYfO{esb9l>Voli?l@CdSA9%P`E0+Ys!y+YN0ZeT zWHakavx9n9@E!G=73OSnn0lK$e$&%0F^*Ni!HlCtdU8$O8Z+^8b9eoj`m?Ir9ISda zs)2m}a3HGZgKgX^q}z(LW{BMJK)b$mK~ViW6j52=or?XOi135z5Q9u`iR!>vI6%#Bs$2VSIEST;0XqFDxm1Xruh!9jBzk3S7XTBfz?*>LDo zgl^!WQ~ww`6QS4h&|s)Xn?u3V5zMdCk*4F7|De`tG&~>fiH}2ZrXbEztyNF_hlPA9 zQUsh5jHg1)KfM-a5dWCb51}TQ4)C<@-!DT+O~aKy3tQ)TlS<)l~!v=M~LgR8~_}S6OV&eaV++B3mc{+n-q86#MXckKt{t z_dfN6x1%pYSGjItRb`p&YxE?#xI(b~%}c&idq|@vu1opiqOuZ4_Zy9KbyazBwNzHL zcyW=mu)2h`R(Vl-}n z3rgo#RMnP9<&}ZLWrbx>`i@lgNAt`pN9$Jy7N85utL>v-c{?W7*3CoVTdRuOStq?+ z;wq}j%I6nV6xPl!suU{z_NFX%f(E5a`@0REVf&gqBRr9M-S&4U zz40@}$Pu|-U0z&LB?cN^@1ZYUR#Q}7DTzMgTK(+*GD)yI9a32P2Ssi>_6ARly*AtM z*=v9F#`wxBi%XV53zSBlef!tmWUY)<`evVzY9G77(=RHds%{_1btl*pZuE3oIIk)Y zs9Ib&ud1fFq(Lj%jIOQaf@C2)dy=M+LQy|5sx+bxx{G8Rj<)fh);BBBzL8+j$_GW+2ToYA!j)>8I&J*;G_?Mz-oEzGGv0KA_YPZkHg55BiXSs>;^?qJgc?2oZ$0Df<%ZUA zq39_)_ATEatB#G7{w#eU8|L<=?e1h(={zhPnQ!QcRwW{^*+QkUH@)Rc<5#uXZ`|aG z%l~s*7aftxZ(a^0mMj zZCH+36P90H#HQQcn>}6ahu-#C-fFCC7+L|O(sHw>k3m)x?C*-=lE*nlGI&`qn)yHx zwmkS6SSqnOz{mF0+;f>@%%M%s+w!Aq$OYc<w;^++i^R><{ws+|z>{>wK z?u$%e*J2&p!cXztyq`IXb0z5)ew%KNJkR#M7uVkY=X}+46?T;*)4qJ5E625fIUlxz z_}p`Jo+J&o3m?>T^ptLrbkt>=FUZ--xt{jfjz%XXYyQpe$0gY@kI6n|RDqrK7%NEb ze0vH!ADUzOl;Q$=W3G~9KhVkW>8A?VTWq|2YL1z$bRTW|t}r_(myH(YDS(W2`NvDr zVY{%ik)xlzn7w|go2OLYX?M*vQj`ZJyZK6UZEOMU+1O5u8&sHJ-?%*{)2=LxPqAMs zG*e=?h4*#bLc^nW=ecI4-Stk7Pd;XU`G%P}B3f?E(xDCAy$wCI4L!-8Rm76~W=D)K zxS>th&NlQ@ZRkU7=ug_v$7SbbUeu3v#G&xi*0dsJ+7EU$GK0O^@bzy)4{JkT+=iat zhOTQvH?^VfYg>-}cFU7irhLSH{Zn72{G09WW(;(Rrwks|d*^mD3T3P94cILo=qX8U zmtAo~Fg745e>#0X%`=|B&C^+Nk%p;(p32Olcd?8`%6+OaDXIT3;%(_e4#Q(lD-A9 zSE^rlxIKKDF@EpJ9>!QturJQ;ST77B96@*y;WWa9gnuP`nD8XwPe4}vUkHtM!auH^ zppyvO0X>qGD=;W^C&od9;|XUFq_|9@a7u zLhoIgG!f|~p*JBErHEXbfQkwP8AKFNP{aZ#dO;Bp5qPAkC%exL6@-}8DU=bq{HoHH|LXTa=nT0l6PQ}*#cdIgl5;<3@vr^*n_aB294mpV_C z!KjcJ;^i;uJXL1npH3?%;$x!Oh@rdYD9&B*Zv42WNMF4rVyi2aW*j*;-W&Kr%7qMC zD0ufv5hoAk6QVTaeWf(u8vJjI%#;?aaGMqdP1&oQR4yq7Nhb|RcQTGFBrlQ=$PdJ(HEBYeIr z^)>a38n1QI=4#uuKeU>zajutLKe=+<6Wv?g|G3-gi}la-s>U?q10%&V!L!ekZca5n zF>87kdw=oXWxZ*o`@M358eQ$1YH#E`RK2i9!`zs>U-CZ6-%|65S~F{ptaDdgf6IEc>Q`!z z*f6q@x3S*D-BfR8Hjii#-!ijRUh8JJ-O*-f+v)8dZ@;<2;oC2EjOyH=OJUcAcWmqS z-JMByb?q^~=excB>D{F7jDEZNdj@tZc)IYXK~0A&9(sOQ^ARgY{xz!am>qXl9QR1k z>5BF%$5rE`*tll%eXsR=y3{ygRTvc^}PzZrjqo!j}{ zk3S^+-09-%U*7!f_dja=chZ%ufBUaplT%VsQd85?()diQz#$_eBQrCzB8N(qDrIq~%psdYl`2)L z0;+My;ZU7J4L~l3JV1WFKR-XeCZHCeHlPlmE}))(`hW%k8VYCxXe^+KfTj*K6VO~h z3kO;{&`LmS2X1qqjR1d}wi4Po&|X3Z2X2?pQ9>sPoh5XU&{e`6LFg8QJ0)}v!d*e= z!NHGzJ$eSAR|)hELZ1@oTLS$`pnnMrD1m_`P*4Jer7)-z1`qZRmN29ghK9hfQW#ze zBSK(gDU1q%(IGG<1nv%jv17;j#|B|sC=`Xj_)wS-3KK(NQYhRL3ipArt@K||R6asz+EiMmBu7l$8u=F~3{5n{69k8tW^f@YMD2bP4!Nf3CV7R^I^D+yI`r0X%yHSbH7#`QN%5z;ic(=Whh-Zv-#g2sYdR z{2MmBcq4e}hVb$Y;guW0#v8(>a^RPE^9|wE8^dcihAlUS*KZ7O2=KpA9s)Oktv7~k zH-R^A0&kTCf9cQdH-Wcr0y}O7@7xS_UJrf;y?Zm*byIlnX0ZFF@c#ASmw3-jVed_0 z-_7AaH-!(%f2#M!WXxMFK-Q}Zvg&~-(TGlzP>el^Dpr2 zjlm!Mapqs(?5*M4zrgvMfIs--yMKf4{{?>dH~8^J;14B!`ZxIb-{8W(!NqdmFYj>i z;-!CuU;Y(-{a5(S0sn6|hu{Al{`gn;^VZQTA@_SIc;oJ+3JB<<+V>aq7fec;^-dx9|qvBsJE& zn^u(_IZNWidkG2UF6%Bi?;guiQq)=`zc{^ToFPxYC$Yod(e7;Z10?sghZCE2R)TlIkIUQ%RrZ#6@56mdP2eBTE z7pF~&@@JuDro5Ngl=m{5@?K_B-pg#tdznpnFS9A{Wj38JQ-J46{IJC0y1_7c?J}p| z1-2E%4b1-y9yT22F;T(I+w!}&bs7{mKUbBs3rudR|3&@Nd4m&_0Z$~;Wg-!ZCMn%( z9i)i8Ruo)w_FC^(#9k|Ic-EY~*3Yun)BD+2L>BDP(hL1aBhT@~rO0zd@zfBsxI z?z{K95l3<73V(c6N!_@9OjY!gi0Mu;#whOOp-619;!c61F-UQz{(xv6{KuxQIRo(( z54Mb31Zh>#b|LLFg=f~s5K^r9tA3SEHLT@8#1m1)0!Wy*FTM>)h-%9UTS=^s(h(~MzbtR73iXQZ! zY3SlfG0(D#t@O_laMK}47J*@byi($%t%0vw>q|*z9}=re7D_)z&WOQ-Y7K)*ev-7Q_;~1N`76x{=(KA(T+&z=Vu*cf#G3;D>JtZy3L&i-Q zI$Ys?gOsAdBXi~WtTC7^+ONk|X>nKgE~O8?zz|6h77Uz|@u(rrY>lcVu*@MY9}BDsFOz*cSA3QG-E;p2#^tkdm!CVRD>YYBU7 zpte{TJg{Fn>J{nsD0XoZ$zn}A>8r_6_GKr%3rS|Vo%PAIVjN44H?r8F&U#nUouzf* zUj5j(E_yYxk3HE%&m^7LJ6-h3bXu6OGa%Dgcvro$$B0yv0^T@r?AlN@jf@Bk?5aOW zXzf}oe5xMDqPppU-Z<;Pnan(i7fbwv#H%D;C-I9CZpwUg&sHAra5XNTQ*&f3=HX^CsMMC`FrVc{&>W$DhC!t**PP4T?u6b z$dEIF^GXRL7^w(G(2SHY0?ath2-=YnMzC8EQ~yIm*0mlOJ=V|=k2^$GbzPXGV+2#k zbwhIa-A`hSxp995ahrlC;8PUN6N0nExWIP2s%N@z7v4p7=zU%tqZXUhThDRz<4*6e zq&<347)+{(Xj~U*!R)*B3VtvLyANmj4f&4({ue%3G$zWmi2p^PFz^#x+voe5IMNwp z8#qNqp5iDfNJpPRQMve_&U2t}!v%CCD$>QHMqU-ZctsFJZ4Xx38{W~8>70&gFXasAKZp%@6eDoO$ZjYiZt_=r_`(6c@PWk)sTAsq z&kK+deBOd@mXlGC78(8KWHd~s1ou4%TUn;mNF+5^dczB&jAVyo6j6&ft{=gtit{Fo z;!*KM9Q{ZvdxdCL;GceaW8!+2C)JNN8=&Xg0|#<$HIQ>FVQtD<4AkT7mhHRT zDVP`x*#@zQ<)kXfXBE0}MiTdco)(K3!mEV)fW0w$g5KFZZp@Iu!wSLll1NQ<>4cuY zY@+Vb1Zz9Z6K9`v&?8=3vMrG~oT)}3=S=6r+3E+?EcVJIeL8(sb&RcG46}(AA8C|9 zy>7NBL%t!jDRRm7EPC9{ns?A*i+6CBt&zoDw`aNWepw`0@EVREF-32}-WjU@z-GLs8GbR%EO{9+4#*|mAn_)N-;j8_#J@=_9)sX`ki>$w@i94G z;(LHSe8@?>RJt#BuwQ%#i-^z50GnihEfT*c@m`5PmiU;&KS+E*Vh?q2n8XPZr%0Sd zoqXyDnoo!Z(xZ#ScS_t>;(-$5l1UVFoWwJv`)r99OZ>RRYb0JL@hdXpwQ|4C9WiK6^ZLe+(6=%s*}zglDD|ytF zN_oVIJ_=X;Lgi5(rK~&}E0cnI0g@^wk1pQL<&h}0Bagl-`6&tyVKWX+6@163!>>V3 zg;PdkC*&HWW6&Q`9%+)d!yP6VTpo$AL0W|U$_bmH`W>YU9!n9pV&uIjBAAHc!@ZL5 zg^y6JDuw!vk@5&WZ^Kv0qaYnBj~4F zo+t5QU_OK&m-q=_&KIAPc&l{Z?%+nsyE5W_8Q`c4a9rYZ5(h=kpAugo?DQjgtiQTs z*!dDSk+_A#;xRIwZf{BVmw2MYlO^^`JV)XM)G1f7#Lr0g=OljJ!G2|%ba-Fl|496i z%=jxwpON^I#J@}Yj|>+k1%glFY7*y4++N~N689Fk6|a$W7$!x~J(8X(ak0cq;+G}f zEb*I=Kpn~npPEAW{OAau02e+@sUJ5^QZdP$JIKZMf`Yqb6=5K#G*|xj#Ssk1$}Wx; zD7Ri5b-vl^=%$OKB;+9%M_BCNYH?JNG?oIWbaCXKfhMZLs?5~${dfQiLS``kieus={oP{I9Cgsm8bMM#ubghYCz7=w>k-d76s#a(y% zab*L%1RKh7njuIBTeFKy25#>nT;tpa z0xm_i2< zGRPlX?{G zyjm4{nXkw#5+7LmnBJTe;uR6hKIJ(7qhdeCO)>LI ztV+1tz^J2++;~P2(qS6QJ*GD#&#;2ZS}a+?W*yUu$Ps2N(Qj*;i6D9ZL1=6><9-M& zA6h5fFUp}oo~c6ESfsgdA|L?$Bo6DU1ePw*HxPEmQavG}^b5VA;KUC`)Yf4!mdVJrjox!He9SRpcKg zHA7U)Hx+!dsw1Cdw2lllFL|}#N2WjdrmB4-QHaO`wgfKiC%r;Bp$8<57$rV6uKpJ zv$|}-YQB=i9!OKgc{(e6G%^W8si4w`#UT8e!Pzd^Sp|s$LK5z*WP^11omIGXM!1O3 zm24_?S{Xirg(BgLtOW05bV1Ao#Zetl9==pAji^My=`{a~6~#VI9I#}4k(BUqJZ^?cU)tez2=_N?BXxF!juVc%N4=8aaT>MeAGcs603-m0vE zP<+SeY}WNTJ>}*brEfmZHQVFt%jflH=_IKi;4F8FScj5J?C^Td7)FRS=oU9S@+zO} zMUIAWk&SzS`$ZYW>APcD=V%&1XG%4pwxcF2kZMAA0}s#&w(*gpCS3D4Y=dL50_`XD zgoS}?8}vs1M|wguQOf8EBY|l-eZeE%#ufNsiRHHFprFF=|K7GJyYPs{UI^FRBkFC7$ZRs)aMomy}S(d07#R^IN5a zagIXU85;ItB;&+<yi&sT)lFCXDmPGK|yx8Xu_rU`cY$AYF!YeklXPLoB8w=M2)JoD+{KV`RWxZ0l8s#BIWn zm@0}7@3F%dK4Q{kg!(p+%nv>o3*|UxPZ=3rP~bS{42gV?^o7r9_*M$>6`T{UXrc0) zbFafMhrPl1r4J7_VK9JIikoqq?Y%?qL|IsMd2)s0~2>ZM~SJXDVsqdppB|lB(>#dp2ky8w3q3iW5_Ql`2 zQS9EHjuR*FR9533?$CofMC+{R1->M!7s6JzNVeL`VXNCETb;t$>KuoyUUArJwzK*o z*@0DW>kt1Qv(Z9{XG{DbFdsjUNG!JYICp$nV!5jFU$?A!TPCnq20S9&gIjywNF3bS z3ofsMTYKWeaq3)52V6zs;8tHNiN%xT;9q^D!vKlJ+vL0eVx z#;n;c-40c>6N(G#Rbh2|=!t<%yZG|^Ivv~Dl2;V4K4HFq`5V-+aY|4sDt0PDR6u@6 zQ6cW2G&FD$DJq1suEmiOQGq=>E)noJW;q>O`lO4z%IMf*6o?9(+6Q%P9B158$KG=N z4&59_JP5_wVvYBNDAw4n3cn303-R!sa%;s}nDK-t)}YHP)^HOxY1b*%7o<<26c44| zLOc}8@{|(~aDstYtSF`<9=4VIEPE#8DAw3&D>)NNi^Nu2$(c|bw%TIEi=>WXjld;` zLg`N6AT0uCJ7J+%V^a+7;!LPQs1?E$>05Fplo9F+#rlHu*#TcJ9zxm%iZvp`3(M@X z<_~vCU-*c#o>23L2y{7I(L!a!L)(4&e^{GmNOU0UKl)VSnO*yW$JCWpce*8~|P94vlaCM5~1ei{(;SbTrta)qF)Rg~gas z9sGMoSj5S#x;W<)h;m!ploH-J275NrShUnsRBme3 zWgphksiQbSDh9PeZ))V}Xf6lRH}Y zTA%Y-*apcRE%XZKrqi7rt+mdM)=Fnb>m#wF)vBUWW=9KmUdkOUp}e^@KJ-dC$pMg=-JGCf>V7sHTw&_D>J{) zE%wmEY6`pZge}ZG>|ChYB#`k{=r$K0 z0r4!|t5v1Z2Fp3G#s?z4(Z3~TS2Qf<&Sdt_w|aII1PA>GCd6v2=tFH=purivlg2JZ z8`W8}k7?yl#uB*tonD==&P&y3*7OH`w`;kD8=1m~kxW+gM?IU42xCXuk}Nh2L{S(^ zZ^wxbe$>0tnVjgyiIzWcp9Nv8h!d`1Zk%O3*^e`sN;=!gooF}RsVBz~{W(3?%Qm$K zwgN@-D6i-N*-$XoEXUz#59y=0iGje--Ijs~QgP&NaB@v{F3!T^SKRf^$K@m6>MZ^YX1njg)9AaP(GD4`@ z@wmeISx!cZloLcr7Auhtuui}0P1}gYXG@VXxCFj}_`M|MrbxK~38vf(DR(5nl$#^v zfdnZBKKxxjON;5dWricmx!1^HUtiXbzVVm-l$?mKUePPMEZ+BdtjlgbF8{frujZ=R zs;hbz(ve-bs!yifBViaE%Vzwo7m&H^%fGqTLYDiFUX5-c>`24#4EltJ?X1Ix-5$A9 z#BoGjK4SaXTpecP_L5ApJ&<-yAElKH#YL(SPii|S2}2@TbC($#_+B*J}yi18O>dX3#iZv>dqwKL*W3PK|A}kSD-s|2B zHY3i+ru~vxUT40*I}~ShB|}(RyfK+BO=js`xZ93+9$;lME8>I;4_u`RBWOCp$98fj z`nb=jD#sCB^(<16ZA>sK)46dh{hGckFgDRha?8rrWQ)>`1X??~ zY2EC%*`j>o6|$8zt7-g9a#)R8Mh6nbrq(jD==U_Rrk1gTkgo#;b&Ssm+02^OGv<@k zfj#w%d6erzof;bb2xS`@8iU9R7S_lZ%~P7%$Y{u^Escyh8)9tpa!TGB(LhN$kTr zWj$-whj+?OE<<-3xKEGO=*ydYW~b7d^w^BPyki!y!+m+jT<$C`$Q#hls85wHB^Tp0 zCf(T&{ftbavGD%91M=%TtLl6<5aiXyY(ak`i&%k;{f(xPB|XwS%GHuLM!h0q7x9Wk zGfs;e5vENrDo0_fO|rOq#lX`Rv!)Y_xpDVO4mGw6hg!fsn_!F!2OCifg}l$KXoaz! z6OCc?ABDX$(P&L(1++s(wgIYFP+oe8>M z$_tJ$K}iAYGTo@`UL6Kw_`s%sHb*vaiYSz` zL{t=N?3GVFiLC#VhE4XfF;5!xB5*k!EfEU86P9|+lTh^%Ph~s*+Zs!|S^H4%KGfxO z_-(vtwZ4u_(X3?l$CE}CdQ@W-RvOt6pCIUe|fP@gPxVV{0=a%yuF)x59N!&2gyK)?DO2*P+^383_4+Lv^%@ zmOW)8`LR8t6+3Rdtd0o3w7E#RpM@*(w8x#&7jTt?Q_Gx?L#*52#~f;ebq#*Y9cqk) z4GnFDLls$@P})@vHOYD%IjnQ2Db{x>$bOTP#dPaDJU4^Fv&2>o3p`~s>WHUQwCyw9 zaQ!XX!cAA&j&tb$%tf&lRC(~-=vkZs|40qwwM5$H&^g?GlaBfA8-sJitb3iVMv5qN2J>m`t99ddbfD+Phi?-PMn zR=2R{qy5}QWWTz)Wg+kdhg@6T+Je$ttXEk?USHi>1@B8vIbN!6T}E1$tBBB>s`HgE zS!JX*9FE=?DPDut{?uRxJ9vcR%D_~jJ-MGN69YH=o{8MGVr@jmB9rPgf%RQwWRvD> z?kb}Od5XQZ%BbG*FSK6!13ZKmjr0P_tF^bp`f0V(58Nx2r;E3fE$wz|8Dexybvq;a zl*Tev8#OJwF0OT}3fDcXU^UODEqidaF(elzbQ&RGd9hazh_r~C#<3EY29+r8cFdtT zY=x)_-LJCbHAVvutQRaY&H9WDSYssRT;k!${Z(Afv%XvY@f?sHD8dGde}tm}iYjev#9UA}8#iBzH#OpG8{OGfBPx z{|kbKC3(7dmFc32Qa=xWk@qFx|30Uc_-vCq;AtIlQZ@p2ex1|DIZhZ2kIzISB=esM z#ALp;Mi(^VptVM3_VY+CQ56wMrf9M_6`?EQ0$vg?GRpj&vX|EyLww@G%nssP$RChm zF3VVFG_N`e(V7sE2%h)8llNFncd!c@5~PR6=@aI%h3kwejhiFWX1I}4sltP%^BOi6 z6f9z^JcvwM5VR1V27A4VQWeH;@pp5!#3lNrbw<2TBF;4#IeNZjJm{NcRXiQ zxkEhXF_B_OKFzfd9`|d+tqSKSoMLX_t%jF__Zq=sE)&J{@~%qw4t>HzxMrZwv;EH* z3B=FNJZGd6i@BdSveM%)oQAm&XdX{2O%!{COEA>M{i=M#IzBJ7*`d#KmE)R=J^H+H zJ73tJD2aPjLtMiO#{EZg;tomsh^4PLsv%OR^+t8NU1ihP^PwYR?Gmxl!|=`==)D?P zPE*jr(srMq`-P#_RycRSC?ki6SZ~GiCCQ!qZ(3Ne)(1qbSAf2XLL3y~-s5zIiCq67 zIlOg~#Wxj4B81nENV$3?p0bzayL~+9c}FE16&(x$Ml27UOwOsA2hmf-7M`8N2l31pgi`@A!9P> z%IY2FR4+FFuyH4;#!epQ8tFiG?Jyq?3vYKc(uJ(c5u-Ah&L#t`46Hh0#6}18tm5?M zaax1gb!xH;ce}EmzxJ(>9Qg*+7zhE)QLwJ4%tt(RDt`qhH-T-YiboNNTN9#AC-b;d zP?LI+-Az38NhEuYcq)-@>;Um(rhEnEtVB=pKr!pRP3lRLm_vHQtk%}oLWbSHpTiB zqkUR)L1~to{pj{2ReelIMyI|Jigzq0llY%SZ@2IU6zw?H?Zj@+@^w#Bt1`%L58!`Z z;6B}xLiqae3B!}Y*NEEauX<%pJ-?<<6WN+yUp-l#nVS!4{%4RoY`9x1YxK0fTp4mKvz zQ!O!o%wE!D8HV%!weIK2H~C&=nd=d3cq-SfwI0UPxin5Yy&J8ow8OVJn+Y;re zn6M7sZBjwj$0mmJDZ}cu!@rB9I^N>6Xb3Hu9WicaAByIDDzGCq{MH(WlKk z6?wW>ntAZq_U+9*t4M41Lvv3TnmmDBY_FxVpU1cjHmHTCtE=J!Y&Pa5MO9=cTksIS zO<;MSXj!aVOHVevI)TmPg!^zeMLFhXFMXnA(C2!yBixOC+}l|ra-9CDR@oZhs5Usa z$t>R3Hp!h+$Ymud?pjn3IMT{ z5mxG&uFhw__V)CnR~2?gAI~uI2;17n(}bfx`gqdlp9+iX>&c=&D}iQxJ*H}kXKa*l zMTO(pr3F^i>le{`26%ePMf5Z0Nku+BdKP&0k}WK)kT;jb#uf4cMYD6DhOl~rIJJds z9K@;Z?AjntH5x`(zoBXdUF>EvhpJh0hulQw_z0(6n{aC|YgCtHlIDR6gFS6Dw^MVr z@iQwytzWOM*x)%D@Q?5eN@({ic$k4b0lA?{MCA)g*T;Btldq5Q>4jV$e+?~L*P7$E zTpu@QRc3pVxS+8=^;D%Nh*7O1z+yalFiWxW!AxOv6N$;#9VxHOmt1`bzl)dhaW)zSU1y= zhY6r)vhZU2eT2l0bbLheYnY8@rf;UA3lenkzMXoRNuFdT)x!^ z?}Iw;_8sIdx(^?P8oqA)x5tO8Q%oPsoxS2sM$0#vyNCJW`ET2Y^U-i0PL?8kIN0(< zcGPd{tVH_$B&_dTPecC+9ympz{~)J&Sgl0ixwRtxV||i#hqW7{u^WnsCbUu9JA+I6 zci`9Ep$rShPTE}#WmyN&dp#T~!Ws&{p4|l%ZA}5y%b^;@TPqN>PfI~2TQCIB`nHrk zfiHTrehyX9f?1K)-=VUt-mJ?5o+_l6O?|+VR1LNp+AznjxrHx(v=OKYL@TbR&_+5` zJF7E$hesfz*h$3u7JlQLc>OGVj;<9sRDsn9)g8}7ydhQut1!>gnSRd)**wnpW7yO4 zJcHBz3sq|dDvB!);{U*a@K5Eu`+1O`vh?|$s$?0veZD6vLU_IaPkhe9J!j4LbmoKi z$b3&cSERn1?`e{XJjpDvvcLk74;}nW`rR$~a-j7Bk4dt`mr+MGycoEFm#%{NLh2I@ zoBR7Xt)wP%ZN3qk^q{AmPlT;akjgp;o+x(kLC=G+_@a`$MM#!7vwsswRsNW;F%Nl0 zlSb_LL!LBVqRS6?22>XbRG>)UVW`7jg3h4GY!FvEQ--3%nKYWC6r0U?m~;7O1MfZT z`6@H;^F~iB!H#EK=#?D7C!_GBk$7@R{lils&}uX1GVEl1R~(!D8t3G#+4HY)4wb{k zZSi1F{hckGCoN_5Ugy+wHve@_<*;j@YO^kH@VH*h;ZVEVI~?j#dxt}D3=T!UWpM#6 zPg)0>1w0Q0txIaLBkz0S)x7%ki?2PDP4WZLdpyg+hdzJ-4>JYHp4vL>=?hxIo*s7C z6O3&od+J67d&2!HLH2}=nbPe$57=GF_T7hsg@5X)Lho~!Rtr4m0j4Eh#w=l4_`s@^ zY2lme(w#gA?9!dQEVk-X&dG+C;bbixPS(E+C%cHsm2k3lf|I4v5KdMZ0R$&=*q7#G zcOCN#pgRbA{g|hof0bZhc*;8hUx|Z(4H66tcUTeMyNK>EuF6M~ph5IiKeX{`Hsw{)JMaH8-*o$301RZKa{CYHS%+^$iVWRe#V@RuykGD#NMp z6mu!3^05w|ajtTV4f~8UrP^!}r@}MJFr|j;V;i=BoEU%yNWYrjnX_|^^ zLSn=p1DS^QhOuS*WORS}a+hPqlF){EPI3)4jx{*xsU9;4VY&L4T8RE_|11xcHi_ML zlFz1W_UuW|D0+$y=2M>J2$YKag;K%bD`N|5bjp)cbw6Ciw82s-1K(Jae~@(oXH$vd zrPpiN@T|CzEk5O`M)Cr0pYpsJ7kKwK&tSr$QuVUBOy(aRQ!YVUUgn&l7aM+=bBYL- z`(Mrt6z2ag=M4t?6VxKs_AgHDWbgdNseLT`3g;9HRfkht$a6SFa=ybUI2N43V#luV zx*Z5yyW;u7DB%=4UyX_<4Pc#2j6gG&InGUbvW;GIU3gE-^GX{r?iXv;FgDmSmy&+$ zvSp4VquGcs^KMcY_%zI{VR80O{~JP(`NvJBUIgNAaw->Epq$Q3&!lI=y&Alsubskwmy zx1L?9V%GQ1A=fEz;UWAFa$E90vGw3f6a4Qv1^iDJ{4be;|2;^-|Il2fuNDRW`%3UX z45TpMQ-c2;Qo#Qj3jQ}&3E_X!*(+7eM)A=O{}X%grTW_y!bmkU#t)-`QiToH1*Hlb z-hC?Ng1yUdLA+E{$^~H^TFM0z%5cG5G?WX1tCZ?%TVeEAs<17htm^}wM7E=vX_H8H zu$r0F&MLzp&mnq=+6I%JQnl@~GHesqA(gVt-wDghF%zqeEW;wPh%aT4djyLNDsxTQ zJvnA)I!-8amEGN;UNQDdj+sH8VKLRsYFw{uQQd45f%=h7VvsN1?oT+z7FIWtI9pkd zFdf;^>SjH9k+85DW>z&};3e9kBkzu69QKiZ(39}dU@DFUiAHdInpP<=poZB=XIw!_ z2-tPa)Elt5YW2*sl22qcFe}o$WaoOa6%9;jaL0d5akopxIkUqz8aCv7qgT3f4*F0- z&Nm9u+00jYB-)4*Md>WP5%-zah%=894NZ9#8pBtf`Kogk+9uXH3!ND2a1V}!v4WAr za}mZ0G@i4dBCY$ft=?Vi(fbV}@M;tDVXcHqt{z3=Nqu(58Fv-F+MnOj9A^53O=Z5} zd^bve;>=2SI7u5zaFSPeujmdZX=V#f0)13>ILRL2qHXYC8akXL$_Uk~+9ACXy=oN? z=Pq|FdZEA@PhMp+kC>IZe#P^u@9u8>#ItsnaGP&UPL*(*<$U0}OZ2Swkz$FS^&&5s zyX3@lkHS7I3`^`WG=jSh_>bgAP>|du{0JY}x(i>ClVT$u3+_Sp$T?y1WwX14M^)nW za+mO^WgNPkBx%n@uy@15qrGcvnA3kvY*k~Y!^4yPB8@ZTEfGm`(l{$gw|#|oo_bD_ zhNAVxX771&mM0mtmUq;?Fx=Dl6N$z%lj_ehZ^ag=UMO3#i@}mPsa_If7R^-cUwEO^ zU!=FDXoEoiO7O5;l!v#HP1u@<@K~p;|H#r%C)H~uMHi_kG+1<~q$;5$MGx@duTr`R z!>ef||E_&FTDQYkO7t3QrtG#4P^`>w` zb`#OYeW)ty;YUJ!>Bojs5nEx8-f5=!uc3ho=>3@5v-u2F3+V-s{xSYPrW>C-SP{n) z^$}{q~NqQl% zVdA7FOL`Hp@ld6jBI%{XzJ?#wRm?Iqb2+ge0bN5yP1Vem#GZ!I=1O`su`8m<^PKSh z%(cXR5hco3?-L2EC-!JWs3~fzX1+x1c=*?n^vlE^hlZ{%8b{6CMC_CBZ=#ARoVkVA z;poJs>c_%=E3u)Ws;y)Jw-fsw-I;uGK zQZo+_y9>IblMH`^*#AX~_mbg{5<3yDPDGQ9Qoj@#{6_4v=+m*1zD(@n7~JC|eU;c9QGg;z&!jfY zJ=O7&o=feYP=E=X&W6JRYGdzAohSn=q;>-&FiFyjs9lf6_cGJP#sb-qKA?d;c)^qtyaq1AS@&mwSl?N6uYiQOG(-=#TogHQIyFENMQwagw4Aku~O%`!wjG zlID~9Bq}gW(tL8CMT-oVG@sl@&~qa=E#?NF-OEs;kum_E-4CFJM~NXNW_K@E(3gu} zAr{AKM}u=%$i;C&p%rsj$i*T_|3Yj(=J&}kh1fr0n%yJmtHf^?BIkRh!{5Z2N|Po14{_$w6iHtrHqm1sj zd4SqmP{QYAfFsn=A2w)fMU9S9+d_h`NcuDCC={>B3{F!=qu3%_;9F{ch4=yOchLeD zsr?%=+^VI-fc}lzhtPs=YE@$J;3~E8k+!;B>nP}%svXJF2k^1_ zHpcinGT()&eGui|Dd|P3{W>c8u58(*s(k`2woB5>Rl7UlzbCoKO4a@bJ-=Jht5q92 z`|A6WUaQ(Zgx@3S^=d0S4-xjto_a~O-$zCF1$&N1Ku_+M5w@syWfbs$q_?W}CCbP^ zGu8hNX3yur9#U-&()}Vhxm8C~`dagd4mqIOsi??VIV6v$c3o8ToTNWgZ5Uds=Yw-y zwQ--K`kjn_T(wVPQhqP#Q>x#NMuYz#9ZswE&j|3Nq`y_|dy(Nq&5`WqRY!OEL$>6P zsx9p9{}Pgb_b@L2DtbkG+38^}Eis3#$%eVC+7FNkq_H z&Lo_z*-hbZNP4bj&qe_}lAfp8tB_!{%PG(T%~3THT~ZU!>_YTR6`B4b%^rvfRh8ju zFV*awXtHY3VYz1Cj~eB(VUe+OIePsnmraH#Bb`nXvqIG$p88X@`t({ zE^KU}8Am3ud4*IofOtHTSfjbgcj%p7tT>o#RfXT@@d-?7~@oDzgG zoRA5BdRddfW*T{d^&f1;I}z85i1_eZN%|5I+p&e*(=R;V5}q@Jrya)~Ch*QA?^A-| zmaaILR^by`C#~Hg_}e0Q69liy`5`&v1kX{N=L3$E1V1Q(i|?hA2`uZ#MM}`V^>O~x z)G2iQ3?y_F30{>}mkLM0O!r3!J%s8L$JtlnnaNjsT`(TKfPiC>JL(HtSU(pz2!7^^= zf9c|V5kcZ;tin>(VyGES7PB5h&4y$*TRhZ^?<5kOAQHrN@^Mpqf*#F_{w}98n;^+a z^hz?eXPTox6`Le*rwmwNy-9E@?B_(3Je_yuA4AQ086wH{1WCfKIZj-t+Me9QoxcG6 zDPdiPnJ>0|54)-j30cUe%O3vM&>ifD`XX{4cQA5&5gAtRala!{1JPo)rI8X z2lL_}T9I+G>S}~OjP6#dzlI8);_ID=rp3%8cock0D6If)pkAa(ZNC{=0^X zJ^dz=%R9qFnlyj3yz}44pwqhRLbF+;%-Hxy^k>q?A->qUsgc7ra^L>==ANXH)KXt4 z&NY^Sji$$!cgA2R6>`fvzk#m}GTM}P-o!FSo7Ks~tm|lAjzWxstY^vxn!{#r-~K(& zX4yx|``!umSmj)K=O5u*^`GlX&3}<aEKAzRuFdn6bHY;hQ_Y zysx+hCvQP{=bnKfW6U#g?CoBW7JGZX-7E0tT(hMx?}-RC@0mKZZ~}XGjkkJW)I9S_ zggohHCcb1|#mv3#A%hjAd6f97@zLdGHeGvf$XAVDEH|f+msrmy%*mu9JN$&%1@G;w zFsqRP?DiFACV7L6TVYnF-`wdKj(@}6;iP+gFV5^;Y~~I%gBXGEC(W~IrRVm~y5iNk zdG(7|&CCuod&_(^x~`AcoQ{huIfu$|&Y{A!l5?o8eB5a|=e{N9P}gi$`3M)OFR`{q z%-Q4|`{0Oq8(GaFJ~Z#7&pKx{Z1#s{?TS?}INd5v5~xePWQdcOCOC-DRqV?fy4sbU z_|RMv_G1M05;VN>q-kuyM?9srT(3@vjIlHL=+K-43iT)7vX9Ms?a3(h=VTO5Li;L$ zMeOuN)5A7f@v-@)uRr{LA>x!98}t*|(4%Hg(x1J3)T~MuN3zp(Bcj>gM@2%L@nNw^kZ5qH#hxk#WC)Agq=BN=A?zelc-M7itJ6u!mC~uJ{Gwyc>OFdzx`F5jN zMd~4;r12%^1FZ829%U_?al&jx+OSHIZF8Y4#@7 z0(YGG&IBzanYAbo9gjHCbc6bi~E%bc-wvUpfwEwNIPle3y~zJ2Dtw>E*L6r%jl- zf6GyeKJeY6?Q)8!+I!H9A$C?Bz4&`@|QRc-BlN2(|c}IWMdL6K=L>j)Zxv;(4dA~P@ky>oR_vS*L<+bn4brq5z{~pB=AziGb zQS0P&3l!cUS3V3%0ifVZmXGlh0TU=J7)v8~+HuHaAX9sTY;jLl1AH~#Z!2AW?^$&Pg(w?HlJ!tMHh!m03F|8z4^AVr_a*Hne9(kvEOkBD;u38pe7RdAmdwq14Z5 z1A-#pk4Uzyh!2(mb{v7Lv&%)^alZBFx)6^32AeWoG{}0OFWK?&JpX@?UkKyA-`P(q zVce9(Pw;jjb=Zgr-i=)D#ZUA;MvB?`iQbL$njPpp$$N!Fw~ylUCtTd_euom%61xut zY{b3Z@uVj^0n|Crak6(WA=xZ?s`o5ez^+X7ZXyTROVhjyNII)?pLZKa7w+?Jjadzz zyNxtcMPdohgF7d(?bE$=c#(gZ?p?`8|6})ilYM6}X}=@5lmSb%#L8^@{ocoUNxRMP zjwLhLyED8o}qxZ;W zIxZainX`d&+HhPOS$8^5w7H>t@!jX#7l?^P=Dzb;S@bpfxYOixPt<7=_!=8EF+tqE& zf`J1&{XWTHiEntj(&V|0aoCbKyxFwkTvo&hca8RnvLwne4cpnzF%A2vpJN)vF-*hU za|;zEPh&-UNe0;xcroBTQNod7Q|hW)r)I61;^Uvjfx{=fMKwBNui#OzmOWO92Hryx z8u*tHB^vlPuVB{rwm~xMx&~ad%&<~Rutw}*kCj9!u>8WXsN#VjAi~V9+ zDgNvTAs8-&3Bk}v6@p=Ym=Fw3MO3`2qq)3zhG(kfSXm9{%%s%H>JE-etgI}^m{KDv zl)BW&swOPLN{p=bYl<(_%IZ59U9m;Uk+D7QMzIn#w4N5rryxzzaM!4YJL!Tlsv!>^ zw7MG03l_Ax!i^hrxb`%{Lox-euDNy|H8m+hAE$`_BMd`GUMH0>M8L`sUlVG=AC#9{-J$eM*!tUiy}7 z5G1vCfN`CXq-NIzZ#*kWx1Hi<`C(QnO^sxmhlm_Ugjp$+JI@cZswaHzK^|9$ljz?v znqu!@2g9tKl!u|D6Y97ciq;)Go6<*k9@-feYg?%WbFdE`CUh=D%s~vBN;z%os98Au zMF>yB#(tz4L7x`BmZB9vDEO#`C00+2;Yd16m)sl2qpeix@WBxNN{! z`(1V}+{)=Fg!T&ANJ+K}J@}*~lkJ{pl&2+`V&esCb(JJj?cWi2wItK*o@`)*l|z1D z3nQ$Q8lstY(OuHcW+n3Zn9h=_OC?CFujpA3wY9yU9ph2`8&S_cWSX2h>A2fhc^=BPQUb>tWSGL5e+f0yC?6pWaPLk8@ECh~M`)m^n zL9YMYjl>dEhvxdv9`stGq!$o-7|t1zB)yQ>ucBzll3qj{Yn~KIFD3RicFJd^)vSeJ zxhm=>PR_BhsphE_ggUU6XCn?$RAESjlXI_&Rgbh%{n*`9>q|{*6R|g-yiHVWAd3U@ z_Qd5}B#O{RRwvy>?Cw5!JZ!PJaeC>>U+Q{^F6MG(t+g56B`=oVCN3{=vWgZ|I zb`CNORrQcTh^qG&`!UkWExd$Y9VqkRdQ@xB!_?Y>zDVrlLjRJQ-fzTi0Xjr8tiX9; zsAjmooM!kTn;vB~bFIUqVVf&PCP(A=RMWIWXn-lIxHIT+b}`C|F%SBrHHwRcM_W0$ z?}8bfk>kVTjO??LG@X%sPLf_lTf|01TlI*-o{6>^)$k(u2HJ06)tMFTb?E(ulFYV~ z(Rz)v6C!SoeT;cyxaesH*Y?u2zFi9=u7l=e(AeIFDSEpko7go`(Jq=ZmYdtSNki=_ z$=3EW@V!Hl?QDDi8)EjdVDv(obgA1%^0h`_%PyB>OHyp}2^ zBOlc9Xx<5$GdKRr2Q?cMXXX0$f~DLmo&V;+(2J8L{SUFl_?#l?Ys7vHWu7W&KK8{3 zohIp7)EU6{NqRQ5HKadX(sQVN4UKlcr03EMyB*3sN0xgYwQHf$3uJ%=)IQE?##^}+ zKEk9g){=wkm~=FD$R5{HHk$|YdoZY0Y7U3nN^N`~tFDnvxSiU#_C|ds*hkbJfZ{(J z>?3M-Ll>--n_>HSHYol&Ngtp#zQ<5QHp_(k*r3gln`M3*58$e=NQcj;BT+(j%l4ys zA-iQ~;2+Q$1`RD9L%^-tAVL2|?Ra$Ko7z}GU#9j<6zDDODM4SQb{8bHU0W>ZnSRwS zL?uVw_CF$j=T^9v-Pfp{N zs(lA4uv^l#SF83*Xp;A(!&=q;0R;-#>Z^etAzOV!EvdDu13W6Mpiiih-Cn%si9)JS!*0*OiJMjDc|L@D^6K1QYySnFTPkQtdD4ciJThA5@K}QO!@zyg95IFQ8qg9Qb3^xPUoFY)2boAh8LWUI;$GEJfZ$0IjuCX_zEL+ zS^M1{Ssob7gh~So9=Rux;PKiNUQvy5OnI-@S!$Yb7b=MM+AC$AX26|^8sot8HRE>7 zBz z1?qZRN_f3yq+qDZ9712v4Cocr#tyteGvGl=ZQ{V2G@}L>XEO)htQl}optg1@-l`e! zETZ1z5V~EfVe~-PwQ~|+Qt>i!{HY#@$4+wuB&0c@iGHaS$e^TjUpt}E;B;TUwHH-g zR@-qWYvmx54j;BMtZTsJ(V%hE&Z61$-+QeB@jm^U?&~7PQL_wRp4X3NQ@`RsM${AB zRFOtYGJN$#4|*4m_vuoGuVac2ipQD)q`{T|y8Ze5m!3)egT9i)dm*9U6({C$8XUmfe%Q?A*%JXm=m#I05PE_|b z&bo*OY^j0<;7V@Rud$WzEr4IA#@XE5wbVb`H`&g8PQE=@C7j!aJ+U(PSv$8c$2ZH) zog0g{)8fLpZTN*anfrwtnR{Q3?@(fEQ2Jqv*v-{q^O>c~-hMgP7gYYJLI-nwjjXl6 za6ASW&KnX#VxF&4Qe*xtzKua6Ydp$yg`jv(_tMNf-e0{=oAP8Whx2?*0y1lo><=(c zG=~pVonvT zhi?Pum*7oMr@jKpx5kJK(ERfF`QpQ47K*``6#;Hw!&qBG;S;86AO13mMl`X&mo!>t z-h{l5@XSvigU*$%BsT#>h-mQ|_}6a?);flxsn?{)x6D)PSDdiCZbMqF*D-xw2Wn+m zjFh3on<(h#by9m2oh|Tn7Q?7f4POR7`quC@t11nG1_)ePD&W7Ls>&JuQVm~v;wG3D z^atv4`2Mcy!|_)k9k1a_Dv}hB1jQfoyY!jpf|2MVZ<5E8al1#1M!DJy)ILF(HGK)i z3!!?s94lVnT5#CeD=FMd|Hy^1o#7g9FpNEU&9CXUn!e`kHlxsx7-4dOGR{<-94<6i zcI~TxU#=qIgG|FAz>@C4a>|@#IBO=Is_CoUZaz4|L(!t4E%LS>VU4O>CtF=P{w$I zy|Xbv(9tcU#eA-M8TWEVYPk9qvic8G!_~Kt)hDNgt8XEzZ;&Rd&nof-(`EH-Wc9Ce za-r=0wlZ7cRvJ{~%c=;WP~w> zT_`I|-D&y3JHv31B;yw^T;D3oMi)*&51jErKrfu-`mKYyv(lNO$3KNLZ&7G*ZC_57 ztnY1E-}36=`relHy#{y_9j@)m7Wv8sR@O#&9iFcQcH~2vw0~#2>QC0YOR?g=c zm69E9)e#l7e48Dv<%o(}u4T(wx)l4$(o@jKUrOX{rD%h>(+z8>VNfq-R8Kn4YPUo_V?9UY;r| zUdM1&b2NFnI?+QdN_dssOG8S0)yvu-*Fi;v&E2x_+OEj{N@3_4||+`Tc9;cNR`2#K%%AJdvv{#L0vM z7alPAdm08lronZ5#r1F`AwH2wSup4oN8~xxJzO^HXjCP9Djx%_)Zm01+F8e!U{9d? zWqbD)gxh<+Z10Z+vb}%R@zwABfHVVCL|>k?op@p$s1fd~hO%s@n&GkyW!c+nhKHe{ ztau^AS@%i zZd-^(4dGH^C2~D31kn7(Gjn)h7!?ViI#h{@1W=t}Sm8Ei*Yh&h^IvRqA-qb634GaVI18g4qq+VO~>o`GBPDY>nS&l%Cf#$lA+mPFV2;Ly+7-6Z09*Z0^wpb;7vXNnC5|gmJZ#xZbWK z>A0uNSDf}PdaRQ?2h|>c z>jvq8Rlap%C>5^ubyZqkp`j~{JbHSyubb#Vf2{V+5HHZUHNF|j)_86 z@vPTiu<&~5%XPkw8de%CZ2H2NqSP&w%CVNAKNyM~vz!?xuAeH${SoCDdL~ABM6Fbg zb@EB&*w1REa%`te(N081lw&S485<0Tsw#x$A@uM%X=nJg3 zC>07J#j9?PmZ~zGmMGEcL{+NF>}ILwVoChu>tpqW{1#DcZHS^)rDh8K_KxMFr9b(6 z`g2@5Y(F=Pp8v_$Q`zO0_H+6Wo?v17xp9|>e3@1+c(uJ3P>cqBB|w91)#SELp$!f`)<-8>;+-+GiNFF2~BCfxr0tRu%4XC87=b zF`8!o;!CT5y4Gbsm;`Wzqa8{x{z0oF%A$4vA9FM@$;Nj)XBBe56a%5GlqVdpnlTuS zil~(8fVD(aO4ER9jndAB(~Z7pYec8?9Zz*7qEmVVO@B)H4^p!;rHP5MQ8^&N0%Lp( z?Z~y#idz7VT=ABj{H|1;;pqJpP#aM_o%7QRXM7zyKY$L4XqT`7RU+D@*U^ZGb_q7Q zE@R2DC>zl(O`v9Hed*QjM^lnjP$#uWxTmkAIPiR7{G-$Cv%coTl0a@PM@{m$Fg9X@ zYCCG7Rl=AA>@GD?De}A2MA7I4mzroO^4E2=F&l(2kW$aFjMD(wnn|UIJXSBDPMoal zj-&DCe6{N=MhiQu;~gcB(Hc#3>3BMTdY6u;1s&kxq6wWj=PT|}6EwM0IbO^kmnuiY z7`Rk9PvN~wl>;9q%47$guNZ&C(D+|jsvS;?fAuxcVb-b4RB>vowW5!H^);<6C*2Ru z5X9J1GNR9s(<-9R=}V1%^QG1r3@Uz6%j3X(!L~Hm!7G2LxLBC*F@GB~G~5v86r+Of z`OR0PT#KPsfAggc{0hx)tVJbwX==CUD}v+Wc}9{%&LZDm(ryVn&48pOsDSu^%ZBupc`DOlnbEBrApaDPcb%Y3feMO zcCpl$jG&J>d6;A}E@NEDWhOZ~i1Wf`GcH{UT)HTewUV$d1(zEYmo5cY%9N=N{Eskh zr|!S|iY+-cT)LEYwCs0Zu#RLcE|rO#BQBN6kLUuI$|RM(p19+7KZ{-z%MnyC# z0Rvv;6_-k78tnpIxbmX7G$)^c4wvRcvcHJt#K^%2x)dkp@ZP03*@S88Qk;B@_aUuw zSaH$~bZ*tAIf@e+@~1CLc`J(M{pqXS9jZFFG4dG@<5GI`#$xWs25Vjen}gA(m;ld8&1Yr3Q7aEV^*f zw_0y0zgpT79KTPcb(ff*JrGSL^{hOWuKMtUQvdeli{Lfjf$Bo~pZ$3jq~G8t#3062rM@{olUa3Yj@CoLPqn;dIC&^#%6Gt=uR} z!?~oPq4ZzgLbT-^{oT2m+qseofu%X@d*r|5i72!Hi8oi?Fr4n`C`%^Ek{wYp9+|6d zLgsr>!(f3R=6l^W468)#1!_anG?k-lm5NpE93$-ulhQR`84AyOW0HBwX595`Sj&gUvtreQvUU|$nlDp45t?(&_kc;6WF?dNm#&2-nEJ-3 z|7msEDj1y~YL%p$j&1y?R6R#LPK#6Zy-`~`cs!TeEh`4fjpg>Fw(P}kAila}{mf?Cm8lD#p$ zb5-cu;d(XkIb9j9r&es>BHl_X%;nq|Z$wsw7dNkkCGUsfXCD8VaI(b|+=&_;qs*n) z$T>!taH1ME%7k-(uu2)%mJYanEywm_}4(}V))5H%m6Cy8&V_XxeFc!BO2p;wJv z=XdNf$J4qIdOE*-2ahM|>k)ct(oAl<`m=xyZ?x8&{}14Paw{@M>PbN;z|`LaXoA@M zI6n919Z)fzq_!iunwx3TNWE%Gli2G`Gq=fH9^+eDJyI`9$DUdhik%wc(WEt#qClIf z&8DA5>KQ{1K+4dSHjc>r95y+IV%Me_HF*Z8ex;!l*kX*0JV>gkY?NlR1z%k8~ zMD}dKcic`8Os2C6~ZB*w0QwKXFn;!o(F7RE+Ux|3k{tPCuT43B|(>s2S%hnlM@~%#`lrRyh5dV5B0~ zqYjv8Zi(^ju?Feh`&`X$f9j|!~Z-Nt#}zNzu*krP-8nx zIW9W*M;LHqtzL85ImUqES@ozkINsQb9u}&dx!f>er4grAlfyAh3cYHgdQFP{GYuG> zt4R(x+c<;F$?AY>VcGi+AWKoNg=Oy|3~n_CW@%~<3ZyzPOH)y3Y?=eJH1#IBG2MYz z2%|8HUb$VborR!=YKht=EQ?ELNOjb^!m{{ux^lZ7tdQ%cqtJqosS@a-1HdXU#%_LUUNuE5r!v%1a^=BpcT zpl@$+3a~Wa4DIjh6kuuoR@y#RFCO+G$_;VqVF6759;Nn{Fbin-w5wxP>0uuNSwFxN z9hk-ZCxCX61GAXl2}`crfmzJ|oH~!wTZo3VWSpKEqk+?FS|i##j`{cbfMcOKo=%L@ zi;8nV{EyD~SFvaAPYxJs&)icE80XOzP~-7>1CdQr#_LULPeFe+lGa_Y(1e_+Hg>=Q zqXs&oiS~;uTV!;lug2@?6+O|19i7yM#%CDWn>D+FrbbgtpiU0h%&3i-+*PyZYD;4= zsOjc_Z4Eg3R=Yc32V)7idPK69M&7-&3$jyqF7CqIy|qHKN1rF-XBcglX#Xsju}id{ zgW2P<(98s>E(=ZRl*nbFDcQ?F%^v)9!sai79GEBVMC7j+>?H84#o?hk#DO;m<1PFc zs#Q+k1E_GA1M~D<0fL4*Fi+n{f$%m5j#y~gE#~R_Ukt!V2j=NJorn4sb(E99^S3?b z(P#%g$m<1TGsb~=`bxKvw>vOT-(nCnR$CH2Z@7=%ov0VLk{olAwoPW^=_^@gxdZ<$ zjCvTS$=ZnU`NCc3=qZ}LD*hJ6N~$|aFRn-fnme52tGpU9o--WyUt!3ZI@5u#3F9nQ z#hnh!vtG{CyBzo)#h%Ku9C)5$Ko_IVcHn#Md&KG-2ZpWYFKFJq4&4hB<5l$cA}7Nl z#h6S=xn7(F^|89#v0+@V81>NYE5gI77)jKFvsL^C^s6+Rmu*#yF?j!!)0x{9<8JiQ z)8Wxl4A?BG&xA)yF-Bo9)@x%VQ`n~%(vTmc7n~yp!-rwqrfrt+CB=wB z%l@N%FX1bSu?>i}J8s2btNAbn=wwf_EHvk!mzR3wJp164mI1_d6Z1<+s@Wr>8egH^KRNT}uxb<{ z|0xIlST%;A9jC*~N;Td^{-2%lu+@wK-M=^qU#mtl^z0c2KB>w(>grhs{y{aaprg(^ z1fO=?h+S|x>a1$SApbv-=So}6)>uiGwT9ut72M6b&Q?=Fg2!u9cttg~qJY=yEH%v- zjtZi^_DY$j83WJ*F%CRmGtOf!S8?D4njybz30|9^MVkGAtLC*oSW7hH9pJ0s;MX43 zjEVI7R9-{yb*a|z4hfrTjsjfQyC7_;xep^%=Fs_qX1s|N+}MFPXoj>JZ{on4G-E&7 z)y#o6YsM_FnAT3cTQ#E>^55jpxn0XOdZTCCISDulf`1?NPt{7mCKE<^nnio2>0^{j zCKXTD^Yr;3>9Q&hgUV?5biKAXNz1152Cpr>GhNRYhv+BHCytVS2R{~2=^c8_!fKG( zAAR1D1>sgyJT}ph1#uxt&_qWTe1q=4Lr)Vw&~ta_Eg9#jJM>|RlW-O=JX#*>z^y#~ zr4-ZP8Tzy|8C3A@Xp~RC-6JZZ(HJ<@3SKnm*BN>@F^5{r)Ke4&`_I&SG5D$j?w_f* z#nZf#H}GpAF+UU~O1bDN9#4d~OMy+lSQ_Q!)*=XH2F$U=x+ttL*kXFJUP$qHwnNST zlsrB{K`6@*tg^Z+yar{lMXipVuULyojC)_zOA`PB6TG-qr%iY2eOlH;&wLL|nS&Ys zBL2%o98d8x_JW*ha^AlD7nC`x%1Sd4qZvWSgL%~cF1@u#pa<^KgI4=EbhCz%8@c~8 z*3q`R^jg-VI5T-tu7+ORoQ&J((p`Gc!!=%_{!xtX^qh65U z=lPM+m4?jGn+8ij?B~+LiV+nqiI$+05SRH1>(I72dV1C&9NB&Cm7?CVz8Sh+3Es^= zGirP3(j0vx_vYZc_257`J9LSoKX+YUj|G0eWe!9yA}sfPJdiJ?TjqPG8K`+x9w)C7!B?mRuSRsa}i^ zW2h!E;4fvjN5Y?S(QLr}DiQ`a=#yachME8`}Eq? zaNHyMN{M_3Ol_|w+JliXiq_nxCnmznlh~<<^_=!O|7}i_>vjKqdfP z{MR{MzROvlmnPyKkyxz=1S9Roe_z<|CN9u3l*>L^xGGyVy98x38kCnZAhCeB5Pxm+fdyCpYMlJMX{JvVU|=HcX6k;duo^WQV}yL}7w zc8w08>5s*N9Pa1EwK23v(qqIv&U!r0UiG~-FY#ngV0UfczOp)g|PHfY(U zyE71>Tlix@?SbkZPulSE@-SR97i5?*a*MR=-io5lSYeiYr!JdcQIsALjD}p(^OdFV+y3;H z(yIVZAE0B`c&~mebnTixw#>0utWP^{_NOR~!tOlYC^Ozl>ir>f6`5A0I%yD=T8wgD ztyCv9*QGkCy;iAC+AdSHO)(L5QX2S2r8;ROz1ziDDt1x#uEtGb1yNU{r!vrld0`3- z9p=}lN;ji4CmKsLNSUlP=`m%@7N9a_yr%_XMqd`553{gz8dm2rZ3kGfLX=I9-^i@xzoKrjZGCJ!` zfqtm+JG2e2JvNF7+1ATwX9j_IxguR|WSd4jnYS86BA1%oYTPV3(V|<88RqwB;iu9k z1&$D#lfO5=+)e#^8%2W-;-#?7>$A&^^{6J|pJ@WnC#s)2$J_7)t0Xz#Y-2XYGFgK1 zbQ=LcloSV^FAS5u?`;ebFH)O6MzMI3ruH$`W{pRMw>V~Ghk1vJLVX=C0Y`*UhwAk; zhSb4noib6iuTNeQ#UULWc-&R^pLB z{~2sdvT&tQ*`fU|`(lY|2x>BfQQS-8@aRG-hj8_0P@T(4B?jai&}4jxlZ#(X@ArQEnZ_2R&5^KCl2we3m-gZoo0;q}z?X zVhA-DYmDLryk@M?R^-$7V~w}?v3i`*N|exvaYnA_NZ#>`elZ;#Z{#K{MI&~{zMUc2 zVN;%-Ma-}!aK2YU^(Pot@@&s_=U(xTrU{S4w)|fmBRv%Q=uxA&qoS|=q>-bXpH3Z~ zG~P!D(3RXL9cai(V+JqN&jBr>{8bDsqP43G#0>py6?2D07M-pWS6vAX|6d)|bslaz zs_Q&F?5IvmqZ6x*{HXbp5bX)}-iPVodT}i&bDY-<6|FVu6jt(4L>=b#%P4u9LeK9v z%9K8z@`P08ac{=hd~{|NPdFxejLk~yk@7?^h4wpw)GM~rk7eesb|Aks-W%#0K+Rn_C-9x&2T`09Nljz~tjUB#A% zm&__!b(k3`ob|dxi%p{5A2X!^TJTdw|nT8&kQ)Od*w3& zj_ZzpW~^2I)amY{Onn)xKFTkn=;~2sG~+>>E22&;)%u*v^rJzaGoNcsPkqiUT}a=2 z&LsDvxMRj9N187?CTyNDdk>RvQ%N zbR*+v*nrp!OLoshZC{wxCDW&0GOJriJ-?EK+>6JT^aekMZ9?G(w8OUkQZW?Nu|%sU zdEUc{fpZUasRJ_)#C1Y-xmGXC1Mfgxu1Fg&daR7Ju|Y8&rZ!)5ZI9E`uZ^zVS0ndx z+MqCVl;iV~_PBGxZ?wZ^X`=&wp%{>pCOH;fvb?o{aq9iYU>Z>V0Ft1Kz#gFlT*$>YZRd8%6J( zU}zS-67=VXo;+#%ZdLl+eC+?jo7<#P{{$*2jN41ydRnhgYW3(kbnZ3(FI4`NwUoYY z=uM;r7mXZIL@!@7_D0RFi=!<&^yib8i~^-?bKAq)FPDsNO6TU3nH-Zy?=<$BH2iN) zncduW@%H84oOgb6+r`^y7B6=jwu`q7g|>^gFA8n5BYw*0pXJPthT73T57(iR0V47F zrL$uMb$L_7gaTKLV*NVCrj|7yqSH`)!W3!RA<6 zwB%SvZI0E;=2#=hYxtkipK)=lA@qjf@5z%c+V3wFU8$+xKSOV8b1WH*@p0Pe_g7^` zbJXvD(W-d^i&{tzn|_$S9X0(m#ZeNLKZ8HunU=q)c#j5I{w(nmRapLVPCReHg^igjN46b#PiD;^l!Ys zC^+VN?$qac?lhY^Civ6E(=AI2J}M!-n!kc;e6X4% z<83^AbdDbi&;5*4e@0dvn*~({`}x^sK`p{8XekX!<%YgMb5gnRetIR<-_?54<}{V@ zb>@?v#+i0gtu&eUmNfq)>(v|h#)ot$jZu`*RXhaMO7{n|mfXM|f;X^-Av7V~-&ORX zx6}Qv@`y~x@INFP($x%xmWP-i+s>CByL3)O!9k z|2x+RG1quTwcS7FHT36*0_xPzzc*@bsmIgM=L80BW?Z7QSl0IK}hZ7-<=TkCDvvyIy8hiL6I#N?o=z~!hJej9m4&8Kcx@#FBKbU z!%$vm^Xd1Y%n9a3#J`3)X}09I+Ftk{+6%v>E&1JKFZ?3fK8zRs376z|n8pt0h2N0g z8SbwhPdswk9PK8#FF{-a^)32ixPL}=JzEM~1XggwmIA+$ncjmG*qA5UGxXqX%o$Q{ zkOI3>`w>iV3OzW2Il~>abp&&UbozV*ubS^EVI*^g1ynYYIYT-V7C!OU^jjNu9W0DU-y8NQo z4boY6${5Q-w80X)_o1q=!xUSpi_&9$*krrw&o*97h zub*a2@Ml;%ZxF+7vc<4MTMYXs%m9LPbOJMge$;y+SJ#LZ;Bg0S;fE5^>C{AK05P^4 z);P=ndfp(1JwthuxIyLAZW0$BOLt6S2Jo3Jhm8m`fE+rCOe5$59vvvL+&?LB<_0@cb{J`)2r$@#cN-O#gqyo=~?t84YhO*4^cA zE5^}}cllcgFXhhSxu#IJS^f^9Dm^jFKTC|KsOa_TOAwDP`^XpRU1~>l}1st4H2ohO?bQZ}|6$ zG^*I_N4SQMHuEGJNR!@V=m_n2(?5fIwZRsK#?!(r{zCB>y|Klgt+XB;xj#E;w9Q}m zS$ThU1$7Pi^P{w>9?w>$pun&Is~V%H3_>xf-5dEIu+$LM%n^QQD>rrWL=3pZld z+?QI^GgB3Eyw85eQw=uErsI8<>Y3>cV8+5saEUIN;75vNf^~Jt1nt(TJ;42J@3SYl zSCZ8j-wHazm>W;PhP=|zY#lVV($Q=`Y_}^-oaL@NV&XiRT9%sCdP7O3Ip)mWV0Y)3 zGj|Z4%DcJ0b5ClHIrAgf{yFB%7Z{`F_?U&;B+apA{yUa7m70wb8Zd3)OT6%N7^7(q z(A82io5vxmzFAeN@3pV=E~BpX&6>*SfQ*U}*NI0UR)M*4G-XY-()fL-zL}nm2u8{& zQR&*BS4>*pz|3sej&UX^i2Mw!{gl>GcGaH+JnqZAwNO{& za_=wEbftlrVYIZrM=}7&>ju?18k@jk27k+bH7kA;2T1ixoJEyLlfH}zlXUmv~O0wGjc=*`$Ngzv6kB5(4Ph;$= zIq)K3Jb(hJ4!lGdqd{7l13xT`8JJh;4!lAb6Y1H;W^q<;P~p1YI}62J_j|vgzZ#pt z3i#$#TwY)|g3M;}j;u7woQ7H8@&a2E)VaLC?!hu}d4YWq)wsOCjskv{7ufa4-&wsI zVz;y@ZiWh7H-urp>%Jj;h~8{s77s&o4aMaJ_8SbU%M0uV6mwl2&H(JXIy`{6mHX;& z7tBf5)#1D8rlw{KrK3&{eHk09w;8Ng)ApeCGu3kL4edYpeV2MA79WZq`2PUz6R+cp zKIL20$fILT&7xxI>pXIUSkCpx4PrUhT^?bJs9rO(f!Idlnwd>1icmu%Em=xaIYt#M z`o<1eV0;IPBbSB0l>?*w>PTW$klfkv53dx=Oqb^V)TlxE;-EZU%={#dLL<6(cT|;xa29f`N3I6-zeb za{Ma!jO(Ux1LSwzG_FRMxtgr+fYx=>SYG0F-861VO+t=*t#nrX`u7>*DcIifd^i&QW1YvsfIZ0SvX4 z6U60`buT8W%O$IvBCh+zat68X7q^O`S_iC*EJTn~T%K2DzB(JY4Q+>NrXOTR^EmCKK+jz#P8qdJHV07)AIdHw*7wmwn+u&VAW; zD)PH7`~D+!3=X_b4H!Mqc$bIMOp0s6jeC>|+n6oHGc=B&Ve5d!<*!t-c-QUUEoglzJxgLEMu*>!6=QQpnGgx{b zl3f>=FQaz%1?D@E;ZOCqc(CS0*mEwYcWyGrC@cI_=ZDxly%#FJtd8ZmsKwHNc4lps zx*lj}7AgBAtYX^GqD5))D(Gsi2)jejZdcf+s~zbZxA0*1jDPtq&E_6lq|@)Xh6QyDWg zMdHa-oLZAUL%#P=xTzwLXN)^vlgfM*Fk2EQfv~M2kg43Au}x*hTwGPY2ZuGC6@ff6 z-T69I=DP*?-bQn8Rpd?Tx$b}9g%iE)^4q*+Pkbn83>%^&2lL8zMQM<}(ESt=$_ zw@zl61vR|mz3^9lo57MCC-d76JDGL)Av&A+iFIJB(J3C%m3ojJ?m z&SoK39qMcrFhM6fbGhRbe~a0QAGh9OHsi-~`|LKad+s?Xqlx^S7zP#wupw(b0qpJ`CYobtC^m81Vx(2~&eKN-kz4=0ejd0;dkA@yBnIm(rcR`TP46z1Z7q z%>#KBkWOiRFu_7S`o=x5?U%-`Rv$3xntzd1*2p0^ zGl$>$2eUjsg=!6!dD{=>c|U>52b*mZaR*!!#)^bGyc%11Jejp+i}nxZPMS`?3^tqA z#`Z|$#o8m_OTq4_5;Rk$g1_a*wv*g8A!QKt8e;b2LEJdRY%933KZf#{PNAB^%)9yV z;xMxhKg4kP=r`OC=snZ$%4_=kpda->%!tsf}cYjWWZm#^}+Nbv>R~ZhO5} z$b`4A$+t`KHmwDx4v}wY!U!`t@4x7=iHbPSX-~HHcs6scWVwRJO9repVfYhzd4w4p zff#pUg7gMi!O3ZLIsc>lSN$olw|VlQKy=S|FQyWDsfnCzP%MaS4Ce?%tl|>q`S0x} z;hKianvUBw)gEbPRLGic3xD*ocL5wJPXw~>245N_e|z$*QU(wJN^}*#Ij0RX7w&BP z3)~rK?*#};ZE*|CdqM!m0LLvraS|YIyNNCU6Lzf2EAhf5S|CG_^Tl zW-E_fmKHivA?%6#d+)M5QjU7>GPZ0qbe~e4yWqqLGv7PkD?H8U)ll3Up?6N2h4m{B zlFwJQQfSwkQ8kp7Eoj}V(bYm-60Mw=C>S#rb({R*~|vK@D@Qj$$Rv%e7`$o6)j}L%cr?ip}G<+o@NcRTNx} zw~-UGRj4F#V)h)Z&9l;#gK_ju9#b2n<9XH){#Z84w~EChG$G$wD+Z8WUl9})y%NbdJx~<5nK%GAnS+%*&_*zU* zD{8}!;lD#1d%*F=wL~#~M~}Kf15d$wmp8BsRO<2uwi}hXyn+1=Db?i-?2|Y;Qp>8X z{9}+-+v?K&BJ#VucF8evdF^@-@|nwP*PnRrlI$m8d|ZX?73SlDBlmjhUpv3;xp?_p*c-Ih;knnMHnSY4IOTWwE3pYS`S;8xocP(d+&Km5`YP?zS?6VR;Y zwtkGC@C4*N#-FW+mtSj^?H$9PkGDhqd(=1)`lp{Y%Zf0w_tYet0)k$e$?x`2@}2zdahiE2^Eq5Tbo05_>4iJ3VxG?Q#hq4b zWk(#P-(?}3ZNIyiGc&0R@8Y$yk{ZlnPB)2eon`e?&KaRiv#e%9G^Af=Tfx9Vo1<06 zqx#O_Xj^XJXfIKhITqs9emIA#WZc*0Fk_oXweM!4Yti7ltzgzGH!!XtHsh*{_mn|v zI2#K*@1Rgu`t@$BYv3mRdhYa>L0v1D{dc5^6&B*wF0Ei@gAhz^W;2+Kxr}2wHOFHi zO`Oa1U%i2+th|Azd_f!MGEX^9|IX!psY@I0VV<&)n$KgNaw#tK+dQk2qWtR%HNDSj zCB(g;4Rbozw;2OJWjNN8yxq@K>~O4}P{p&>CxPo3Lc@9`4W0WNE4NzTsQu4#pSQ*U z=R}yozcy1C6JZMfv6;e-2vaD5Qa4(g8XeJ+d$C`wv^~C`KHbjjB93~$&Ftb;TJ<*X zV&>BMx2+zzr8cKnXLE`UHm7K5bBZ#XQ~W26M!&i{A9%F8+*cpce01ou#Q=m{}Zjn8hpaGP78IJ+oLy>U+#AYEa30%ntU& z(d_q_S^RlDvnVBHH}AAg&@H=pPjvixUa{kPUU8fr-_3iXzvC#hn`!JyM|U$n*iB`7 zc-p^7qxM)Z-idmjSIV=L_ddUyP74^ae!O8%w1T$0&qempPw(@d=ryXjm)lx{M(<@# z!E`>l*LpPwn^~o~w%<`EA(Exi+5tp?CIyffUh|514@*xPgHjaTv(* z8yLt!8n~YsNDcaWzaSim za)3EV{tX<2H=TnHa%Yv&?1S7d$+YSqbC8r9I7mxMJH$1wq0V^RPO}d&0atF|AP?Ta zLAKELL%c3`kncn0APKbnLuLuDQ0I@BgZvT~y84k-Pf>pJQQc3hXT{T@W1m=6g!nY{ z-KW;Sf&a_y;-$^|10O1)}G24i29(f*b5dYe%I&c%Nw&ij zJsPc$NTc}2ApoZ{MPkt25RNY25J!9R@1UpB& zoeAbSmN*$OtcmJj?6iH{cgDSjsL_X!3sG9V(uhWV(>7C-s#vc&-@c%>%QjQ&s7XF& zcZ}K)?9{fYRodx%&6r$vI#Z$}Zu6V{ z0jA|x=-g*U80#D;w;c-|tkSTB&QRocEOdUQ-_io<@pt0)L=6Uo(Nfo_ZKGg%ATbXC z9KzN*Lu_lELKMG8Ybo>oj=X1RKzbk_dj=TpC?z_rN)MzP-(syf+KrLN* zt9D{NKSGm&fvRzEOd|#DyQ)Y*yO#7!95L%j2O^hQ&-0+OM1l8ot$P$@y=x^joDt=i z_{dr#F`w@ObrBOE#Kdx$_>A_^km**2zS=hNk)N+3>Y5n{R(u9|EMnKw89KX&T@TLt zm1PbXW5AsP1CKapzmROX@}mbgzb^m&-$`+_(ijMr#9jXVzk)84lnNV8F;ekSj5zqm z{a=^OPyw15u^B1=>WIydlt3dkL$y#gVl&hi6+fj&oo#leu?1x}Dt27v0@avUMLPJe zcnB;$Vnk$njjoI>{hV!f8~$|v1TbPmG!8xRosuTsb}*7r=&S?wFkV2ezZ~15fkrVh zM@)_2zDT(k?uZe#Aw|U2s0?k3*c!o~gKL)%MB&IT0S-QtNC@gR=(R`)>KYiIWVJE^ zbq~}OjzC>8Ul>bJ+!ccQZ=iLBpq50qLQsE)mbgMtk46`|f)4zNid{hmazL#s=)ipB zcZ`xMVBPULC~{dPRYd_;)PWXwU(bPG5rzy@?=n~V4)0w-t5a?;SK5gNxXhIh7{)PI zs*v_dh^peYSCW2KUG_>+@`^;QHp(y@E^{S#&2yV8ok5rPS8K@%c~evbd;=W#B*P$Z zFbJsNgww*9i59sGo2HF&3bUraBpxCHs<*vKfXu zBG+d42h7ljWz`{|ida_ZK5CQ~D6F_2gh!%lBjA}UD#LlO9G5B8Hc;y_rGkx_J1T>P zUUIo^?1KC*8>>Ax*jPowSD@R-N)D0B$VxJOmyuO85W0-4K0%vZ!L{X>x`JyDLV1_< zRR`pESzlEwMFv-N?bblximrVCu*)v%8VGjTWwpZ4y6m#n-(Z&|zk;sgS!re%kwsMF zye@^23i-uy2_y28trGEzg@S$|Y2E`~w z1+Ews@_W3}sc^GmAndH-iu!#PEpSEsMi^VSwc2j9*k!HuELN4vT5UM;JFzP&;7W1? zD0GR5^3(1*28Zh<_c6Hq*1L|u<;UK2489-lT~WU;qe55IZ-jnU?5N*)()7(jf-CGd zf>kS(VZT-5XIl2BFIchc2Gh4Wpxb5owpm&|M@-+~S<7wu_Am0gOy6WkpNQ$3bW`ZI ze0vr7BPaE(4LEFZAJuO}LtR2KE*-dqVktBqbl|P3v7aXY#qDSSG_K&^V*$I2>Es^9 zWlT33Gsb01SBiGJjOm7ANw|#Zp5PyDW4bXQD-wgF!hn--cMy(Q$lx-w+lLBWW_EH{ z;WD!u4+30fcHPlYuHfH|z!Y3&cH7XvN;A6()p!dCUBSO$F5@<{`wH(}W_D$OUBSPP z0HG`Rx7-A{?C&~YU|jZhuc1LTo&5DzXa+n7DuqtMvBZQ((81Rce`t@F`Q1qu0wOPWP97EkdwsOU5 zRJ)i3xjj{A*?cQ2Z84&ZAcT(iO9+uT1m_fg%6N~7?Pz&%ptR~57$VG91T1*!;j27N zt2TtbE)JxMNpz_=kZ;LCf5^~__?P-Qm6Qak=ECQpxa^fKDZASRQ)SkFWY(s3*0Ci4 z+$VXoB#_(Y3GP}^JxYe9fX&-%cd0BH`&NZ2E2RO<*Xn?<%uwdYDpkiAM8aW zMuELF15$awikWeA(sv_$`1cKCDsL^7hFr0|< zk@}v$5tQ@B$MT!8%R-EH|C5*LDMhMO4T2nvuNEig+=4NU+ji?(a z5*4(pZXl(i0)(}eLhqj{MknnL(Axr-@76?HPG84=FzT=|&z7Mp!B1>@XUou)aP?`^ zJ4f<>RT@w=PvL|k7_@Xv01YmUZL36;s_kgYxPGt1l`3(;L8px?P2#HU1+FiEYcm-oEt{VkB^#(!;}q!=?1(BZ zF_uPN9F0j#F{N_0)hi9WSau3D{;Y_hJWpX-h!F5L;iqKpLUnBS?kS1hc!ekuh ze0^lTYxbSlIONM`(!2PO4{!VuL#sI1w4c&A1x_Bs8codQJPmj@PLB)Iy;_bPf*$k2 z>Q=_Iw517UffVae7`MElL2%y=%)b+r1&RZ0;#KG!ier)lZrJv-s7oR2$wi;3?#+~;F^`_ z@qAQ?Z#3}1^OcQnH1M@Ic_!9+i?SL9vIjg1N{Ym6F7-j8WFB_GLKNIkS+G!sy5+`r zYD)K^gTT}>#6d1{iT{RK;R@4G?m>W`)7plCbkUpMZWyRjQC;pR#A(}s4{(&!#HQnY zaoLpw*9OX7VFV*dQZfC3$Z{oJ!ZvVAY^j}u4R{G0MJu7$_O7G~d~mkL_LoVu?KFAC z*{=C@l-sCrlI z@2;dmYz*Fw^=3wr(7VcevB|EaCcw2jwooS3veV>E?LD#0UDSz*9Oe8hx->5EzUW3f#s{E>^iK%P5bJ2+1cqYhb3luz>%;)OBdwhn=qZxvRGqkN zC4TJx>Kv)%Slc;L%dwTtk;c$NlLGls9q#aWp7Y-59O>)wK(iW^3Wm%l1MnIEC8g4| z8JVrLtYs>3T>)IdraC-w<*`78A3azI-7trZ5SqEsA6wEv5!P)t2j}kRB7W2k%E1 z)Nw7ps^do7SHzNfRV1$qgC zTD=~aq8r=`;w6DCO~Gi|`FdcjSWQFU2n^;7JKhL%R&;Mj-y8@j;uqSpC2(0xq+Ovv zsrZmCgaVtz>-6$go(640*>43Vr_xW)M_o7XmVaE7L!l#qt)aI*3uuZnxjql%c(ryO z56_xW-fYS^7FZ`%(2ipPxFz#{!T2`NLOhnxwJ!p=BH#5(o?S%Gd>P1A>Nb_L>%a}O zYe-Xjb`9Yj)mQfH%Apot@$CAujmKjsc0jDCuLE%rTbPH{m?WjF!SdIp)KIop#hgkE zO*t3HjMhhBG@nHkQECdU{WDO9XZ**12D0-nqtXPWBua*jtGCsjHc=rIs1HRCrcKmd zO8qO)zkLBxo0mIzUIo;`hBWz=R$7j-CsEYLc($5qPogM!1-Z2inNdAy`(J^M;!BFU z5NIqcYIPxyUXjHw#ViEan$Lgyn!!1cN7Q8}=LAYz;Ma5F>sNy7IdgpDO7MM@ZBYq| zL4mdrU~pha1Q;0T5&?z=3JA};B{U?kIsyz1JQD#11YRWX#Xx7Vi+WrP3|IaVp)D5! zb*j*Vr?gmVBI0{2S9V=*3%W$azbNd9a|M`$uT1)_w>Mkt4xNaKzgu%AO2g%uEfdxHjY=siPOG6z z)2Spoet0O>7e7;pJ1H=`c%VKJ^q>*nSovJg2S$8q^5crlU!pLL)OwqpNzjw781che z;R4CyYO|;-7^3Dy&P!}>E7?p`s$?_6of(4TSGCn7XNEjPYy9!kl-~p;nDMuWK{VWq zuOT|p5;K0e7)zN}{ClE2^n(@O#!Hiv;+rnl-n#yaaIH^#gV6U$@&Bi;dylHBN&^6X z_de%dE*Fdo-zC(N=4+GMR6mb69bS`NOmCKIa0L@3+7G?Q`zoI>QWh zK{zB@U!>~YZe-=QaHwVTF((41@_&Tlxe}Wj8zUfz9m3CPAG?I9kreJI7pAqUZaf`H zD2Xn7o;ubRDynbc-d43Adlp+-RS$n7(D)?LH!$|R>S4urFbX{UObEsS55*(p?0Icv zG(2tfiFjsuTGhw($^3dBjRHPLamWNZCj+nx8r)ZgZRnY<#GJ@6FbHCCm4mqt z#(X*?@_T@#>Cj{iqy^nHbI@l{e2ZO%!{4Z5o$r#vb>|^EcwhEkr2c5^ko|(eln*Cx z=U{R=gB^n*mDL#>*A0%oeT<<`ZQOa)O}QgI*l6wQ5XiK3A>gzPwlHP5d8^=2ZEg;n zu{#us%Sbukoj5cPa#&w{CJ(ZMf@Fn#YL8iccjAFOi1Wy+xq6L#UC#l=jH4C0NjNiW zYy-0KQ0N+Lq=Y?{chj(!;s#YjI`s<)V-6V__70BEm4X*fjE6iHgLg_H19K)o6jhAT z&yd{>`K@Q>>n~=AeK{_oo%ojtupHziA!UBTFNOFnM`sz_=kpYF{sF4+U_NBfq;o4D z(%Auwn+Rv9_svA`vT}@`1Z~v2JBfN9VbWx{LA{VEFqqaz6Q;mgmY|)U0*wxAnhDuG zsWqa`HA`UOY^j`xwe?mvzBZdOO~p|~AU_$UvPe&^tFjU3Ev6hRPcd@rY%z_2RVjLo z*>dRo?j;55Th#=9JQ~l@KHd>+uu`kD?#A~Yp)|`+#G`+*nQ69q4lMKQAv{c9Rj!=!j}x;6}=0;?<@R`6pllGa&ncL%uo6-|5axW zaw^@K-MFfhlCDSs7qC;(HkrL6HLF6-_k{FnL1oayxI@8?d`RQpbM!BV519kcUWO$6 zxg5S=4z2xJh+wqur=`R^0tYQ4wOLx@GWghmA5}nZZwdO4HfJsDGZQpn9npPl(k)&G zwfwt8bgrk@cLL|G*As4^Y*g%APj>T7yVqVKyAsnbxtm>sX?NMQyKLIk7SVN>WqlT z(%;jO*>y0DzZ!2aej<--jyD+hhFB~mCZj9VV9X0O7^#(v+!9%R65PBt3gb3(Rl16L z81~B~d$bYcr@rb-i${aexrwTiRsut`nQucTw{4c9^U>@B4sW^aTZ+yB`Y2ylh%l_*gb~Uw+tw_2tJtWBFl^?va__?x)P0jtey!`CsCG zjeJ|MT_fMyzsgL*cjkN0$V$<105moSj~{@CnV%MR5UhSieXKYRnZ2do813$HSkDa0 zx&wZRe6tH1^3_m0djcBhTw%>W^|`V|Hc=Sc1oHEymNZfJy%}k+JS^^peK-9U?F zp~*JaX|TQOG}x%svo9Yzn<@LQlWGw&*^Zn9zaF(QD=X8yjXtOa?%HizB-T9abAhm) zz=;S31E#kDsZ((MS3Yj%LO?P%8IWN^t z{Rl7HZ5t)_RGg)V92#$16pB96U)or(x`w)RRmUKJUx^(NsWAHolMCwx~G z<+R=(Xcao)b5@bWJ~UQ1$E;%c|8vAiexkX%Vkl0ri;svf!e2;A9OMwgSs5;Lh?~?a z3=kvORjdpUYsnP?#chX7(|%a$5;48w*15!IW|gcC7m55K6W0+T!f^F$doTt>h-I|+ z*O}`gL=qohGXE$$LrmsLk@PE-7|h!u#Wa4#WDbdOy6?lFI6}SNaPtTeF|y&;CstIRSFc+uEW6lTVwoq>T)E{IMyg+W{*}3W`-zc!~kY#ea$)ca5Y_%9~?XUnQ&tMeWQVR>5 zZLwgMM?|s(+QS~v%H-)WOUL*^ifQUS7KW3P#q_GYG!H%+t@>-BDPk1Eg3XG+n9KB( z)v2O^RyE!MLQaTlWD|ug1H>|1JwOCvN-=d84-`pwR(4lX*S3!a$^#5{6te_=SjD5o z%*}7AMi{AeK0^H{e{7g2TZi`Ox5@)dtM-a<%=~}FvEu_JoMqs(@01kW`!5ABGhIBv z7UJ|P^td5iWU}!e zGesqjew)5$kqo#+Cot_)`6e7YjrWI(+>m-nq1q*jzkX3<7Zzj*_W-HS22PIug?yw%@T{mHM!U3R14{Aoa%Vm27it**}`StpbwJZW7^1U zu}9JW_|+8c^Z1kV$}Ec)ESy*V)Y1jogj})4OrN$sX8$)>&hu*OSo`h@0id6oM1uwPO6Zm8H>T`BCue2Ma)J~&5`yKvg OhSkGrv?b%j_xyhV0e-9i delta 188666 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 zν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 JDm4C({vU`Yo)Q26 diff --git a/com32/lib/memcpy.S b/com32/lib/memcpy.S new file mode 100644 index 00000000..ed8e20e3 --- /dev/null +++ b/com32/lib/memcpy.S @@ -0,0 +1,36 @@ +# +# memcpy.S +# + + .text + .globl memcpy + .type memcpy, @function +memcpy: + pushl %esi + pushl %edi +#ifdef REGPARM + movl %edx, %esi +#else + movl 12(%esp), %eax + movl 16(%esp), %esi + movl 20(%esp), %ecx +#endif + movl %eax, %edi + movl %ecx, %edx + + shrl $2, %ecx + cld + rep ; movsl + + jnc 1f # The shrl had carry out if odd word count + movsw +1: + testb $1, %dl + jz 2f + movsb +2: + popl %edi + popl %esi + ret + + .size memcpy, .-memcpy diff --git a/com32/lib/memcpy.c b/com32/lib/memcpy.c deleted file mode 100644 index b9171c30..00000000 --- a/com32/lib/memcpy.c +++ /dev/null @@ -1,29 +0,0 @@ -/* - * memcpy.c - */ - -#include -#include - -void *memcpy(void *dst, const void *src, size_t n) -{ - const char *p = src; - char *q = dst; -#if defined(__i386__) - size_t nl = n >> 2; - asm volatile("cld ; rep ; movsl ; movl %3,%0 ; rep ; movsb" - : "+c" (nl), "+S" (p), "+D" (q) - : "r" (n & 3)); -#elif defined(__x86_64__) - size_t nq = n >> 3; - asm volatile("cld ; rep ; movsq ; movl %3,%%ecx ; rep ; movsb" - : "+c" (nq), "+S" (p), "+D" (q) - : "r" ((uint32_t)(n & 7))); -#else - while ( n-- ) { - *q++ = *p++; - } -#endif - - return dst; -} diff --git a/com32/lib/sys/vesacon_write.c b/com32/lib/sys/ansi.c similarity index 51% copy from com32/lib/sys/vesacon_write.c copy to com32/lib/sys/ansi.c index e0d47f3f..64e7f34f 100644 --- a/com32/lib/sys/vesacon_write.c +++ b/com32/lib/sys/ansi.c @@ -26,60 +26,19 @@ * ----------------------------------------------------------------------- */ /* - * vesacon_write.c + * ansi.c * - * Write to the screen using ANSI control codes (about as capable as - * DOS' ANSI.SYS.) + * ANSI character code engine */ -#include #include -#include -#include #include -#include -#include "file.h" -#include "vesa/video.h" - -struct curxy { - uint8_t x, y; -} __attribute__((packed)); - -enum ansi_state { - st_init, /* Normal (no ESC seen) */ - st_esc, /* ESC seen */ - st_csi, /* CSI seen */ - st_soh, /* SOH seen */ - st_sohc, /* SOH # seen */ - st_sohc1, /* SOH # digit seen */ -}; - -#define MAX_PARMS 16 - -struct term_state { - int disabled; - int attr; /* Current display attribute */ - int vtgraphics; /* VT graphics on/off */ - int intensity; - int underline; - int blink; - int reverse; - int fg; - int bg; - int autocr; - struct curxy saved_xy; - uint16_t cursor_type; - enum ansi_state state; - int pvt; /* Private code? */ - int nparms; /* Number of parameters seen */ - int parms[MAX_PARMS]; - struct curxy xy; -}; +#include "ansi.h" static const struct term_state default_state = { - .disabled = 0, - .attr = 0, /* First color table entry */ + .xy = { 0, 0 }, + .cindex = 0, /* First color table entry */ .vtgraphics = 0, .intensity = 1, .underline = 0, @@ -89,85 +48,40 @@ static const struct term_state default_state = .bg = 0, .autocr = 0, .saved_xy = { 0, 0 }, - .cursor_type = 0x0607, + .cursor = 1, .state = st_init, .pvt = 0, .nparms = 0, .xy = { 0, 0 }, }; -static struct term_state st; - /* DEC VT graphics to codepage 437 table (characters 0x60-0x7F only) */ static const char decvt_to_cp437[] = - { 0004, 0261, 0007, 0007, 0007, 0007, 0370, 0361, 0007, 0007, 0331, 0277, 0332, 0300, 0305, 0304, - 0304, 0304, 0137, 0137, 0303, 0264, 0301, 0302, 0263, 0363, 0362, 0343, 0330, 0234, 0007, 00 }; - -/* Reference counter to the screen, to keep track of if we need reinitialization. */ -static int vesacon_counter = 0; - -/* Common setup */ -int __vesacon_open(struct file_info *fp) -{ - static com32sys_t ireg; /* Auto-initalized to all zero */ - com32sys_t oreg; - - (void)fp; - - if (!vesacon_counter) { - /* Initial state */ - memcpy(&st, &default_state, sizeof st); - - /* Are we disabled? */ - ireg.eax.w[0] = 0x000b; - __intcall(0x22, &ireg, &oreg); - - if ( (signed char)oreg.ebx.b[1] < 0 ) { - st.disabled = 1; - } else { - /* Switch mode */ - if (__vesacon_init()) - return EIO; - } - } - - vesacon_counter++; - return 0; -} - -int __vesacon_close(struct file_info *fp) -{ - (void)fp; - - vesacon_counter--; - return 0; -} - -/* Erase a region of the screen */ -static void vesacon_erase(int x0, int y0, int x1, int y1) + { + 0004, 0261, 0007, 0007, 0007, 0007, 0370, 0361, + 0007, 0007, 0331, 0277, 0332, 0300, 0305, 0304, + 0304, 0304, 0137, 0137, 0303, 0264, 0301, 0302, + 0263, 0363, 0362, 0343, 0330, 0234, 0007, 00 + }; + +void __ansi_init(const struct term_info *ti) { - __vesacon_erase(x0, y0, x1, y1, st.attr, - st.reverse ? SHADOW_ALL : SHADOW_NORMAL); + memcpy(ti->ts, &default_state, sizeof default_state); } -/* Show or hide the cursor */ -static void showcursor(int yes) +void __ansi_putchar(const struct term_info *ti, uint8_t ch) { - (void)yes; - /* Do something here */ -} - -static void vesacon_putchar(int ch) -{ - const int rows = __vesacon_text_rows; - const int cols = TEXT_PIXEL_COLS/FONT_WIDTH; - struct curxy xy = st.xy; + const struct ansi_ops *op = ti->op; + struct term_state *st = ti->ts; + const int rows = ti->rows; + const int cols = ti->cols; + struct curxy xy = st->xy; - switch ( st.state ) { + switch ( st->state ) { case st_init: switch ( ch ) { case 1: - st.state = st_soh; + st->state = st_soh; break; case '\b': if ( xy.x > 0 ) xy.x--; @@ -176,14 +90,14 @@ static void vesacon_putchar(int ch) { int nsp = 8 - (xy.x & 7); while ( nsp-- ) - vesacon_putchar(' '); + __ansi_putchar(ti, ' '); } return; /* Cursor already updated */ case '\n': case '\v': case '\f': xy.y++; - if ( st.autocr ) + if ( st->autocr ) xy.x = 0; break; case '\r': @@ -193,22 +107,21 @@ static void vesacon_putchar(int ch) /* Ignore delete */ break; case 14: - st.vtgraphics = 1; + st->vtgraphics = 1; break; case 15: - st.vtgraphics = 0; + st->vtgraphics = 0; break; case 27: - st.state = st_esc; + st->state = st_esc; break; default: /* Print character */ if ( ch >= 32 ) { - if ( st.vtgraphics && (ch & 0xe0) == 0x60 ) + if ( st->vtgraphics && (ch & 0xe0) == 0x60 ) ch = decvt_to_cp437[ch - 0x60]; - __vesacon_write_char(xy.x, xy.y, ch, st.attr, - st.reverse ? SHADOW_ALL : SHADOW_NORMAL); + op->write_char(xy.x, xy.y, ch, st); xy.x++; } break; @@ -225,37 +138,37 @@ static void vesacon_putchar(int ch) compatibility with Linux sequence to set charset */ break; case '[': - st.state = st_csi; - st.nparms = st.pvt = 0; - memset(st.parms, 0, sizeof st.parms); + st->state = st_csi; + st->nparms = st->pvt = 0; + memset(st->parms, 0, sizeof st->parms); break; case 'c': /* Reset terminal */ memcpy(&st, &default_state, sizeof st); - vesacon_erase(0, 0, cols-1, rows-1); - xy.x = xy.y = 1; - st.state = st_init; + op->erase(st, 0, 0, cols-1, rows-1); + xy.x = xy.y = 0; + st->state = st_init; break; default: /* Ignore sequence */ - st.state = st_init; + st->state = st_init; break; } break; case st_csi: { - int p0 = st.parms[0] ? st.parms[0] : 1; + int p0 = st->parms[0] ? st->parms[0] : 1; if ( ch >= '0' && ch <= '9' ) { - st.parms[st.nparms] = st.parms[st.nparms]*10 + (ch-'0'); + st->parms[st->nparms] = st->parms[st->nparms]*10 + (ch-'0'); } else if ( ch == ';' ) { - st.nparms++; - if ( st.nparms >= MAX_PARMS ) - st.nparms = MAX_PARMS-1; + st->nparms++; + if ( st->nparms >= ANSI_MAX_PARMS ) + st->nparms = ANSI_MAX_PARMS-1; break; } else if ( ch == '?' ) { - st.pvt = 1; + st->pvt = 1; } else { switch ( ch ) { case 'A': @@ -299,15 +212,15 @@ static void vesacon_putchar(int ch) case 'G': case '\'': { - int x = st.parms[0] - 1; + int x = st->parms[0] - 1; xy.x = (x >= cols) ? cols-1 : (x < 0) ? 0 : x; } break; case 'H': case 'f': { - int y = st.parms[0] - 1; - int x = st.parms[1] - 1; + int y = st->parms[0] - 1; + int x = st->parms[1] - 1; xy.x = (x >= cols) ? cols-1 : (x < 0) ? 0 : x; xy.y = (y >= rows) ? rows-1 : (y < 0) ? 0 : y; @@ -315,22 +228,22 @@ static void vesacon_putchar(int ch) break; case 'J': { - switch ( st.parms[0] ) { + switch ( st->parms[0] ) { case 0: - vesacon_erase(xy.x, xy.y, cols-1, xy.y); + op->erase(st, xy.x, xy.y, cols-1, xy.y); if ( xy.y < rows-1 ) - vesacon_erase(0, xy.y+1, cols-1, rows-1); + op->erase(st, 0, xy.y+1, cols-1, rows-1); break; case 1: if ( xy.y > 0 ) - vesacon_erase(0, 0, cols-1, xy.y-1); + op->erase(st, 0, 0, cols-1, xy.y-1); if ( xy.y > 0 ) - vesacon_erase(0, xy.y, xy.x-1, xy.y); + op->erase(st, 0, xy.y, xy.x-1, xy.y); break; case 2: - vesacon_erase(0, 0, cols-1, rows-1); + op->erase(st, 0, 0, cols-1, rows-1); break; default: @@ -341,18 +254,18 @@ static void vesacon_putchar(int ch) break; case 'K': { - switch ( st.parms[0] ) { + switch ( st->parms[0] ) { case 0: - vesacon_erase(xy.x, xy.y, cols-1, xy.y); + op->erase(st, xy.x, xy.y, cols-1, xy.y); break; case 1: if ( xy.x > 0 ) - vesacon_erase(0, xy.y, xy.x-1, xy.y); + op->erase(st, 0, xy.y, xy.x-1, xy.y); break; case 2: - vesacon_erase(0, xy.y, cols-1, xy.y); + op->erase(st, 0, xy.y, cols-1, xy.y); break; default: @@ -365,12 +278,13 @@ static void vesacon_putchar(int ch) case 'l': { int set = (ch == 'h'); - switch ( st.parms[0] ) { + switch ( st->parms[0] ) { case 20: - st.autocr = set; + st->autocr = set; break; case 25: - showcursor(set); + st->cursor = set; + op->showcursor(st); break; default: /* Ignore */ @@ -383,61 +297,61 @@ static void vesacon_putchar(int ch) static const int ansi2pc[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; int i; - for ( i = 0 ; i <= st.nparms ; i++ ) { - int a = st.parms[i]; + for ( i = 0 ; i <= st->nparms ; i++ ) { + int a = st->parms[i]; switch ( a ) { case 0: - st.fg = 7; - st.bg = 0; - st.intensity = 1; - st.underline = 0; - st.blink = 0; - st.reverse = 0; + st->fg = 7; + st->bg = 0; + st->intensity = 1; + st->underline = 0; + st->blink = 0; + st->reverse = 0; break; case 1: - st.intensity = 2; + st->intensity = 2; break; case 2: - st.intensity = 0; + st->intensity = 0; break; case 4: - st.underline = 1; + st->underline = 1; break; case 5: - st.blink = 1; + st->blink = 1; break; case 7: - st.reverse = 1; + st->reverse = 1; break; case 21: case 22: - st.intensity = 1; + st->intensity = 1; break; case 24: - st.underline = 0; + st->underline = 0; break; case 25: - st.blink = 0; + st->blink = 0; break; case 27: - st.reverse = 0; + st->reverse = 0; break; case 30 ... 37: - st.fg = ansi2pc[a-30]; + st->fg = ansi2pc[a-30]; break; case 38: - st.fg = 7; - st.underline = 1; + st->fg = 7; + st->underline = 1; break; case 39: - st.fg = 7; - st.underline = 0; + st->fg = 7; + st->underline = 0; break; case 40 ... 47: - st.bg = ansi2pc[a-40]; + st->bg = ansi2pc[a-40]; break; case 49: - st.bg = 7; + st->bg = 7; break; default: /* Do nothing */ @@ -447,34 +361,34 @@ static void vesacon_putchar(int ch) } break; case 's': - st.saved_xy = xy; + st->saved_xy = xy; break; case 'u': - xy = st.saved_xy; + xy = st->saved_xy; break; default: /* Includes CAN and SUB */ break; /* Drop unknown sequence */ } - st.state = st_init; + st->state = st_init; } } break; case st_soh: if ( ch == '#' ) - st.state = st_sohc; + st->state = st_sohc; else - st.state = st_init; + st->state = st_init; break; case st_sohc: { int n = (unsigned char)ch - '0'; if (n < 10) { - st.parms[0] = n*10; - st.state = st_sohc1; + st->parms[0] = n*10; + st->state = st_sohc1; } else { - st.state = st_init; + st->state = st_init; } } break; @@ -485,22 +399,24 @@ static void vesacon_putchar(int ch) const char *p; if (n < 10) { - st.parms[0] += n; - if (st.parms[0] < console_color_table_size) { + st->parms[0] += n; + if (st->parms[0] < console_color_table_size) { /* Set the color table index */ - st.attr = st.parms[0]; + st->cindex = st->parms[0]; /* See if there are any other attributes we care about */ - p = console_color_table[st.parms[0]].ansi; - st.state = st_esc; - vesacon_putchar('['); + p = console_color_table[st->parms[0]].ansi; + st->state = st_esc; + __ansi_putchar(ti, '['); + __ansi_putchar(ti, '0'); + __ansi_putchar(ti, ';'); while (*p) - vesacon_putchar(*p++); - vesacon_putchar('m'); + __ansi_putchar(ti, *p++); + __ansi_putchar(ti, 'm'); } } - st.state = st_init; + st->state = st_init; } break; } @@ -512,38 +428,10 @@ static void vesacon_putchar(int ch) } while ( xy.y >= rows ) { xy.y--; - __vesacon_scroll_up(1, st.attr, st.reverse ? SHADOW_ALL : SHADOW_NORMAL); + op->scroll_up(st); } /* Update cursor position */ - /* vesacon_set_cursor(xy.x, xy.y); */ - st.xy = xy; + op->set_cursor(xy.x, xy.y, st->cursor); + st->xy = xy; } - - -ssize_t __vesacon_write(struct file_info *fp, const void *buf, size_t count) -{ - const unsigned char *bufp = buf; - size_t n = 0; - - (void)fp; - - if ( st.disabled ) - return n; /* Nothing to do */ - - while ( count-- ) { - vesacon_putchar(*bufp++); - n++; - } - - return n; -} - -const struct output_dev dev_vesacon_w = { - .dev_magic = __DEV_MAGIC, - .flags = __DEV_TTY | __DEV_OUTPUT, - .fileflags = O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, - .write = __vesacon_write, - .close = __vesacon_close, - .open = __vesacon_open, -}; diff --git a/com32/lib/sys/ansi.h b/com32/lib/sys/ansi.h new file mode 100644 index 00000000..ec2c58cb --- /dev/null +++ b/com32/lib/sys/ansi.h @@ -0,0 +1,64 @@ +/* + * ansi.h + */ + +#ifndef COM32_LIB_SYS_ANSI_H +#define COM32_LIB_SYS_ANSI_H + +#include + +#define ANSI_MAX_PARMS 16 + +enum ansi_state { + st_init, + st_esc, + st_csi, + st_soh, + st_sohc, + st_sohc1, +}; + +struct curxy { + uint8_t x, y; +} __attribute__((packed)); + +struct term_state { + struct curxy xy; + int attr; /* Current display attribute */ + int cindex; /* SOH color index */ + int vtgraphics; /* VT graphics on/off */ + int intensity; + int underline; + int blink; + int reverse; + int fg; + int bg; + int autocr; + struct curxy saved_xy; + int cursor; + enum ansi_state state; + int pvt; /* Private code? */ + int nparms; /* Number of parameters seen */ + int parms[ANSI_MAX_PARMS]; +}; + + +struct ansi_ops { + void (*erase)(const struct term_state *st, int x0, int y0, int x1, int y1); + void (*write_char)(int x, int y, uint8_t ch, const struct term_state *st); + void (*showcursor)(const struct term_state *st); + void (*scroll_up)(const struct term_state *st); + void (*set_cursor)(int x, int y, int visible); +}; + +struct term_info { + int rows, cols; /* Screen size */ + int disabled; + struct term_state *ts; + const struct ansi_ops *op; +}; + +void __ansi_init(const struct term_info *ti); +void __ansi_putchar(const struct term_info *ti, uint8_t ch); + +#endif /* COM32_LIB_SYS_ANSI_H */ diff --git a/com32/lib/sys/ansicon_write.c b/com32/lib/sys/ansicon_write.c dissimilarity index 71% index 594a01fa..c500adbc 100644 --- a/com32/lib/sys/ansicon_write.c +++ b/com32/lib/sys/ansicon_write.c @@ -1,601 +1,247 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004 H. Peter Anvin - All Rights Reserved - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall - * be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * ----------------------------------------------------------------------- */ - -/* - * ansicon_write.c - * - * Write to the screen using ANSI control codes (about as capable as - * DOS' ANSI.SYS.) - */ - -#include -#include -#include -#include -#include -#include -#include "file.h" - -struct curxy { - uint8_t x, y; -} __attribute__((packed)); -#define BIOS_CURXY ((struct curxy *)0x450) /* Array for each page */ -#define BIOS_ROWS (*(uint8_t *)0x484) /* Minus one; if zero use 24 (= 25 lines) */ -#define BIOS_COLS (*(uint16_t *)0x44A) -#define BIOS_PAGE (*(uint8_t *)0x462) - -enum ansi_state { - st_init, /* Normal (no ESC seen) */ - st_esc, /* ESC seen */ - st_csi, /* CSI seen */ - st_soh, /* SOH seen */ - st_sohc, /* SOH # seen */ - st_sohc1, /* SOH # digit seen */ -}; - -#define MAX_PARMS 16 - -struct term_state { - int disabled; - int attr; /* Current display attribute */ - int vtgraphics; /* VT graphics on/off */ - int intensity; - int underline; - int blink; - int reverse; - int fg; - int bg; - int autocr; - struct curxy saved_xy; - uint16_t cursor_type; - enum ansi_state state; - int pvt; /* Private code? */ - int nparms; /* Number of parameters seen */ - int parms[MAX_PARMS]; -}; - -static const struct term_state default_state = -{ - .disabled = 0, - .attr = 0x07, /* Grey on black */ - .vtgraphics = 0, - .intensity = 1, - .underline = 0, - .blink = 0, - .reverse = 0, - .fg = 7, - .bg = 0, - .autocr = 0, - .saved_xy = { 0, 0 }, - .cursor_type = 0x0607, - .state = st_init, - .pvt = 0, - .nparms = 0, -}; - -static struct term_state st; - -/* DEC VT graphics to codepage 437 table (characters 0x60-0x7F only) */ -static const char decvt_to_cp437[] = - { 0004, 0261, 0007, 0007, 0007, 0007, 0370, 0361, 0007, 0007, 0331, 0277, 0332, 0300, 0305, 0304, - 0304, 0304, 0137, 0137, 0303, 0264, 0301, 0302, 0263, 0363, 0362, 0343, 0330, 0234, 0007, 00 }; - -/* Reference counter to the screen, to keep track of if we need reinitialization. */ -static int ansicon_counter = 0; - -/* Common setup */ -int __ansicon_open(struct file_info *fp) -{ - static com32sys_t ireg; /* Auto-initalized to all zero */ - com32sys_t oreg; - - (void)fp; - - if (!ansicon_counter) { - /* Initial state */ - memcpy(&st, &default_state, sizeof st); - - /* Are we disabled? */ - ireg.eax.w[0] = 0x000b; - __intcall(0x22, &ireg, &oreg); - - if ( (signed char)oreg.ebx.b[1] < 0 ) { - st.disabled = 1; - } else { - /* Force text mode */ - ireg.eax.w[0] = 0x0005; - __intcall(0x22, &ireg, NULL); - - /* Get cursor shape */ - ireg.eax.b[1] = 0x03; - ireg.ebx.b[1] = BIOS_PAGE; - __intcall(0x10, &ireg, &oreg); - st.cursor_type = oreg.ecx.w[0]; - } - } - - ansicon_counter++; - return 0; -} - -int __ansicon_close(struct file_info *fp) -{ - (void)fp; - - ansicon_counter--; - return 0; -} - -/* Erase a region of the screen */ -static void ansicon_erase(int x0, int y0, int x1, int y1) -{ - static com32sys_t ireg; - - ireg.eax.w[0] = 0x0600; /* Clear window */ - ireg.ebx.b[1] = st.attr; /* Fill with current attribute */ - ireg.ecx.b[0] = x0; - ireg.ecx.b[1] = y0; - ireg.edx.b[0] = x1; - ireg.edx.b[1] = y1; - __intcall(0x10, &ireg, NULL); -} - -/* Show or hide the cursor */ -static void showcursor(int yes) -{ - static com32sys_t ireg; - - ireg.eax.b[1] = 0x01; - ireg.ecx.w[0] = yes ? st.cursor_type : 0x2020; - __intcall(0x10, &ireg, NULL); -} - -static void ansicon_putchar(int ch) -{ - static com32sys_t ireg; - const int rows = BIOS_ROWS ? BIOS_ROWS+1 : 25; - const int cols = BIOS_COLS; - const int page = BIOS_PAGE; - struct curxy xy = BIOS_CURXY[page]; - - switch ( st.state ) { - case st_init: - switch ( ch ) { - case 1: - st.state = st_soh; - break; - case '\b': - if ( xy.x > 0 ) xy.x--; - break; - case '\t': - { - int nsp = 8 - (xy.x & 7); - while ( nsp-- ) - ansicon_putchar(' '); - } - return; /* Cursor already updated */ - case '\n': - case '\v': - case '\f': - xy.y++; - if ( st.autocr ) - xy.x = 0; - break; - case '\r': - xy.x = 0; - break; - case 127: - /* Ignore delete */ - break; - case 14: - st.vtgraphics = 1; - break; - case 15: - st.vtgraphics = 0; - break; - case 27: - st.state = st_esc; - break; - default: - /* Print character */ - if ( ch >= 32 ) { - if ( st.vtgraphics && (ch & 0xe0) == 0x60 ) - ch = decvt_to_cp437[ch - 0x60]; - - ireg.eax.b[1] = 0x09; - ireg.eax.b[0] = ch; - ireg.ebx.b[1] = page; - ireg.ebx.b[0] = st.attr; - ireg.ecx.w[0] = 1; - __intcall(0x10, &ireg, NULL); - xy.x++; - } - break; - } - break; - - case st_esc: - switch ( ch ) { - case '%': - case '(': - case ')': - case '#': - /* Ignore this plus the subsequent character, allows - compatibility with Linux sequence to set charset */ - break; - case '[': - st.state = st_csi; - st.nparms = st.pvt = 0; - memset(st.parms, 0, sizeof st.parms); - break; - case 'c': - /* Reset terminal */ - memcpy(&st, &default_state, sizeof st); - ansicon_erase(0, 0, cols-1, rows-1); - xy.x = xy.y = 1; - break; - default: - /* Ignore sequence */ - st.state = st_init; - break; - } - break; - - case st_csi: - { - int p0 = st.parms[0] ? st.parms[0] : 1; - - if ( ch >= '0' && ch <= '9' ) { - st.parms[st.nparms] = st.parms[st.nparms]*10 + (ch-'0'); - } else if ( ch == ';' ) { - st.nparms++; - if ( st.nparms >= MAX_PARMS ) - st.nparms = MAX_PARMS-1; - break; - } else if ( ch == '?' ) { - st.pvt = 1; - } else { - switch ( ch ) { - case 'A': - { - int y = xy.y - p0; - xy.y = (y < 0) ? 0 : y; - } - break; - case 'B': - { - int y = xy.y + p0; - xy.y = (y >= rows) ? rows-1 : y; - } - break; - case 'C': - { - int x = xy.x + p0; - xy.x = (x >= cols) ? cols-1 : x; - } - break; - case 'D': - { - int x = xy.x - p0; - xy.x = (x < 0) ? 0 : x; - } - break; - case 'E': - { - int y = xy.y + p0; - xy.y = (y >= rows) ? rows-1 : y; - xy.x = 0; - } - break; - case 'F': - { - int y = xy.y - p0; - xy.y = (y < 0) ? 0 : y; - xy.x = 0; - } - break; - case 'G': - case '\'': - { - int x = st.parms[0] - 1; - xy.x = (x >= cols) ? cols-1 : (x < 0) ? 0 : x; - } - break; - case 'H': - case 'f': - { - int y = st.parms[0] - 1; - int x = st.parms[1] - 1; - - xy.x = (x >= cols) ? cols-1 : (x < 0) ? 0 : x; - xy.y = (y >= rows) ? rows-1 : (y < 0) ? 0 : y; - } - break; - case 'J': - { - switch ( st.parms[0] ) { - case 0: - ansicon_erase(xy.x, xy.y, cols-1, xy.y); - if ( xy.y < rows-1 ) - ansicon_erase(0, xy.y+1, cols-1, rows-1); - break; - - case 1: - if ( xy.y > 0 ) - ansicon_erase(0, 0, cols-1, xy.y-1); - if ( xy.y > 0 ) - ansicon_erase(0, xy.y, xy.x-1, xy.y); - break; - - case 2: - ansicon_erase(0, 0, cols-1, rows-1); - break; - - default: - /* Ignore */ - break; - } - } - break; - case 'K': - { - switch ( st.parms[0] ) { - case 0: - ansicon_erase(xy.x, xy.y, cols-1, xy.y); - break; - - case 1: - if ( xy.x > 0 ) - ansicon_erase(0, xy.y, xy.x-1, xy.y); - break; - - case 2: - ansicon_erase(0, xy.y, cols-1, xy.y); - break; - - default: - /* Ignore */ - break; - } - } - break; - case 'h': - case 'l': - { - int set = (ch == 'h'); - switch ( st.parms[0] ) { - case 20: - st.autocr = set; - break; - case 25: - showcursor(set); - break; - default: - /* Ignore */ - break; - } - } - break; - case 'm': - { - static const int ansi2pc[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; - - int i; - for ( i = 0 ; i <= st.nparms ; i++ ) { - int a = st.parms[i]; - switch ( a ) { - case 0: - st.fg = 7; - st.bg = 0; - st.intensity = 1; - st.underline = 0; - st.blink = 0; - st.reverse = 0; - break; - case 1: - st.intensity = 2; - break; - case 2: - st.intensity = 0; - break; - case 4: - st.underline = 1; - break; - case 5: - st.blink = 1; - break; - case 7: - st.reverse = 1; - break; - case 21: - case 22: - st.intensity = 1; - break; - case 24: - st.underline = 0; - break; - case 25: - st.blink = 0; - break; - case 27: - st.reverse = 0; - break; - case 30 ... 37: - st.fg = ansi2pc[a-30]; - break; - case 38: - st.fg = 7; - st.underline = 1; - break; - case 39: - st.fg = 7; - st.underline = 0; - break; - case 40 ... 47: - st.bg = ansi2pc[a-40]; - break; - case 49: - st.bg = 7; - break; - default: - /* Do nothing */ - break; - } - } - - /* Turn into an attribute code */ - { - int bg = st.bg; - int fg; - - if ( st.underline ) - fg = 0x01; - else if ( st.intensity == 0 ) - fg = 0x08; - else - fg = st.fg; - - if ( st.reverse ) { - bg = fg & 0x07; - fg &= 0x08; - fg |= st.bg; - } - - if ( st.blink ) - bg ^= 0x08; - - if ( st.intensity == 2 ) - fg ^= 0x08; - - st.attr = (bg << 4) | fg; - } - } - break; - case 's': - st.saved_xy = xy; - break; - case 'u': - xy = st.saved_xy; - break; - default: /* Includes CAN and SUB */ - break; /* Drop unknown sequence */ - } - st.state = st_init; - } - } - break; - - case st_soh: - if ( ch == '#' ) - st.state = st_sohc; - else - st.state = st_init; - break; - - case st_sohc: - { - int n = (unsigned char)ch - '0'; - if (n < 10) { - st.parms[0] = n*10; - st.state = st_sohc1; - } else { - st.state = st_init; - } - } - break; - - case st_sohc1: - { - int n = (unsigned char)ch - '0'; - const char *p; - - if (n < 10) { - st.parms[0] += n; - /* Emulate the appropriate CSI m sequence */ - if (st.parms[0] < console_color_table_size) { - st.state = st_csi; - for (p = console_color_table[st.parms[0]].ansi; *p; p++) - ansicon_putchar(*p); - ansicon_putchar('m'); - } - } - - st.state = st_init; - } - break; - } - - /* If we fell off the end of the screen, adjust */ - if ( xy.x >= cols ) { - xy.x = 0; - xy.y++; - } - while ( xy.y >= rows ) { - xy.y--; - ireg.eax.w[0] = 0x0601; - ireg.ebx.b[1] = st.attr; - ireg.ecx.w[0] = 0; - ireg.edx.b[1] = rows-1; - ireg.edx.b[0] = cols-1; - __intcall(0x10, &ireg, NULL); /* Scroll */ - } - - /* Update cursor position */ - ireg.eax.b[1] = 0x02; - ireg.ebx.b[1] = page; - ireg.edx.b[1] = xy.y; - ireg.edx.b[0] = xy.x; - __intcall(0x10, &ireg, NULL); -} - - -ssize_t __ansicon_write(struct file_info *fp, const void *buf, size_t count) -{ - const unsigned char *bufp = buf; - size_t n = 0; - - (void)fp; - - if ( st.disabled ) - return n; /* Nothing to do */ - - while ( count-- ) { - ansicon_putchar(*bufp++); - n++; - } - - return n; -} - -const struct output_dev dev_ansicon_w = { - .dev_magic = __DEV_MAGIC, - .flags = __DEV_TTY | __DEV_OUTPUT, - .fileflags = O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, - .write = __ansicon_write, - .close = __ansicon_close, - .open = __ansicon_open, -}; +/* ----------------------------------------------------------------------- * + * + * Copyright 2004-2006 H. Peter Anvin - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- */ + +/* + * ansicon_write.c + * + * Write to the screen using ANSI control codes (about as capable as + * DOS' ANSI.SYS.) + */ + +#include +#include +#include +#include +#include +#include +#include "file.h" +#include "ansi.h" + +static void ansicon_erase(const struct term_state *, int, int, int, int); +static void ansicon_write_char(int, int, uint8_t, const struct term_state *); +static void ansicon_showcursor(const struct term_state *); +static void ansicon_scroll_up(const struct term_state *); +static void ansicon_set_cursor(int, int, int); + +static struct term_state ts; +struct ansi_ops __ansicon_ops = { + .erase = ansicon_erase, + .write_char = ansicon_write_char, + .showcursor = ansicon_showcursor, + .set_cursor = ansicon_set_cursor, + .scroll_up = ansicon_scroll_up, +}; + +static struct term_info ti = + { + .disabled = 0, + .ts = &ts, + .op = &__ansicon_ops + }; + +#define BIOS_CURXY ((struct curxy *)0x450) /* Array for each page */ +#define BIOS_ROWS (*(uint8_t *)0x484) /* Minus one; if zero use 24 (= 25 lines) */ +#define BIOS_COLS (*(uint16_t *)0x44A) +#define BIOS_PAGE (*(uint8_t *)0x462) + +/* Reference counter to the screen, to keep track of if we need + reinitialization. */ +static int ansicon_counter = 0; + +static uint16_t cursor_type; /* Saved cursor pattern */ + +/* Common setup */ +int __ansicon_open(struct file_info *fp) +{ + static com32sys_t ireg; /* Auto-initalized to all zero */ + com32sys_t oreg; + + if (!ansicon_counter) { + /* Are we disabled? */ + ireg.eax.w[0] = 0x000b; + __intcall(0x22, &ireg, &oreg); + + if ( (signed char)oreg.ebx.b[1] < 0 ) { + ti.disabled = 1; + } else { + /* Initial state */ + ti.rows = BIOS_ROWS ? BIOS_ROWS+1 : 25; + ti.cols = BIOS_COLS; + __ansi_init(&ti); + + /* Force text mode */ + ireg.eax.w[0] = 0x0005; + __intcall(0x22, &ireg, NULL); + + /* Get cursor shape and position */ + ireg.eax.b[1] = 0x03; + ireg.ebx.b[1] = BIOS_PAGE; + __intcall(0x10, &ireg, &oreg); + cursor_type = oreg.ecx.w[0]; + ti.ts->xy.x = oreg.edx.b[0]; + ti.ts->xy.y = oreg.edx.b[1]; + } + } + + fp->o.rows = ti.rows; + fp->o.cols = ti.cols; + + ansicon_counter++; + return 0; +} + +int __ansicon_close(struct file_info *fp) +{ + (void)fp; + + ansicon_counter--; + return 0; +} + +/* Turn ANSI attributes into VGA attributes */ +static uint8_t ansicon_attribute(const struct term_state *st) +{ + int bg = st->bg; + int fg; + + if ( st->underline ) + fg = 0x01; + else if ( st->intensity == 0 ) + fg = 0x08; + else + fg = st->fg; + + if ( st->reverse ) { + bg = fg & 0x07; + fg &= 0x08; + fg |= st->bg; + } + + if ( st->blink ) + bg ^= 0x08; + + if ( st->intensity == 2 ) + fg ^= 0x08; + + return (bg << 4) | fg; +} + +/* Erase a region of the screen */ +static void ansicon_erase(const struct term_state *st, + int x0, int y0, int x1, int y1) +{ + static com32sys_t ireg; + + ireg.eax.w[0] = 0x0600; /* Clear window */ + ireg.ebx.b[1] = ansicon_attribute(st); + ireg.ecx.b[0] = x0; + ireg.ecx.b[1] = y0; + ireg.edx.b[0] = x1; + ireg.edx.b[1] = y1; + __intcall(0x10, &ireg, NULL); +} + +/* Show or hide the cursor */ +static void ansicon_showcursor(const struct term_state *st) +{ + static com32sys_t ireg; + + ireg.eax.b[1] = 0x01; + ireg.ecx.w[0] = st->cursor ? cursor_type : 0x2020; + __intcall(0x10, &ireg, NULL); +} + +static void ansicon_set_cursor(int x, int y, int visible) +{ + const int page = BIOS_PAGE; + struct curxy xy = BIOS_CURXY[page]; + static com32sys_t ireg; + + (void)visible; + + if (xy.x != x || xy.y != y) { + ireg.eax.b[1] = 0x02; + ireg.ebx.b[1] = page; + ireg.edx.b[1] = y; + ireg.edx.b[0] = x; + __intcall(0x10, &ireg, NULL); + } +} + +static void ansicon_write_char(int x, int y, uint8_t ch, + const struct term_state *st) +{ + static com32sys_t ireg; + + ansicon_set_cursor(x, y, 0); + + ireg.eax.b[1] = 0x09; + ireg.eax.b[0] = ch; + ireg.ebx.b[1] = BIOS_PAGE; + ireg.ebx.b[0] = ansicon_attribute(st); + ireg.ecx.w[0] = 1; + __intcall(0x10, &ireg, NULL); +} + +static void ansicon_scroll_up(const struct term_state *st) +{ + static com32sys_t ireg; + + ireg.eax.w[0] = 0x0601; + ireg.ebx.b[1] = ansicon_attribute(st); + ireg.ecx.w[0] = 0; + ireg.edx.b[1] = ti.rows-1; + ireg.edx.b[0] = ti.cols-1; + __intcall(0x10, &ireg, NULL); /* Scroll */ +} + +ssize_t __ansicon_write(struct file_info *fp, const void *buf, size_t count) +{ + const unsigned char *bufp = buf; + size_t n = 0; + + (void)fp; + + if ( ti.disabled ) + return n; /* Nothing to do */ + + while ( count-- ) { + __ansi_putchar(&ti, *bufp++); + n++; + } + + return n; +} + +const struct output_dev dev_ansicon_w = { + .dev_magic = __DEV_MAGIC, + .flags = __DEV_TTY | __DEV_OUTPUT, + .fileflags = O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, + .write = __ansicon_write, + .close = __ansicon_close, + .open = __ansicon_open, +}; diff --git a/com32/lib/sys/colortable.c b/com32/lib/sys/colortable.c index aa1ed6ed..5f7e8022 100644 --- a/com32/lib/sys/colortable.c +++ b/com32/lib/sys/colortable.c @@ -1,7 +1,7 @@ #include static struct color_table default_color_table[] = { - {"default", "0", 0xffffffff, 0x00000000 } + {"default", "0", 0xffffffff, 0x00000000, SHADOW_NORMAL } }; struct color_table *console_color_table = &default_color_table; diff --git a/com32/lib/sys/file.h b/com32/lib/sys/file.h index 84ce7be5..61386086 100644 --- a/com32/lib/sys/file.h +++ b/com32/lib/sys/file.h @@ -68,6 +68,7 @@ struct output_dev { ssize_t (*write)(struct file_info *, const void *, size_t); int (*close)(struct file_info *); int (*open)(struct file_info *); + const struct output_dev *fallback; /* Fallback option for certain consoles */ }; /* File structure */ @@ -90,6 +91,11 @@ struct file_info { char *datap; /* Current data pointer */ char buf[MAXBLOCK]; } i; + + /* Output file data */ + struct { + int rows, cols; /* Rows and columns */ + } o; }; extern struct file_info __file_info[NFILES]; diff --git a/com32/lib/sys/isatty.c b/com32/lib/sys/isatty.c index c0a14db3..837a90a6 100644 --- a/com32/lib/sys/isatty.c +++ b/com32/lib/sys/isatty.c @@ -48,5 +48,6 @@ int isatty(int fd) return -1; } + /* __DEV_TTY == 1 */ return (fp->iop->flags & __DEV_TTY); } diff --git a/com32/lib/sys/opendev.c b/com32/lib/sys/opendev.c index 5928b366..a61da0ca 100644 --- a/com32/lib/sys/opendev.c +++ b/com32/lib/sys/opendev.c @@ -61,10 +61,9 @@ int opendev(const struct input_dev *idev, return -1; } + /* The file structure is already zeroed */ fp->iop = &dev_error_r; fp->oop = &dev_error_w; - fp->i.offset = 0; - fp->i.nbytes = 0; fp->i.datap = fp->i.buf; if (idev) { @@ -75,12 +74,21 @@ int opendev(const struct input_dev *idev, fp->iop = idev; } - if (odev) { + while (odev) { if (odev->open && (e = odev->open(fp))) { + if (e == EAGAIN) { + if (odev->fallback) { + odev = odev->fallback; + continue; + } else { + e = EIO; + } + } errno = e; goto puke; } fp->oop = odev; + break; } return fd; diff --git a/com32/lib/sys/screensize.c b/com32/lib/sys/screensize.c new file mode 100644 index 00000000..5a0d5aeb --- /dev/null +++ b/com32/lib/sys/screensize.c @@ -0,0 +1,23 @@ +#include +#include +#include "file.h" + +int getscreensize(int fd, int *rows, int *cols) +{ + struct file_info *fp = &__file_info[fd]; + + if ( fd >= NFILES || !fp->iop ) { + errno = EBADF; + return -1; + } + + *rows = fp->o.rows; + *cols = fp->o.cols; + + if (!rows || !cols) { + errno = ENOTTY; + return -1; + } + + return 0; +} diff --git a/com32/lib/sys/vesa/.alphatbl.o.d b/com32/lib/sys/vesa/.alphatbl.o.d new file mode 100644 index 00000000..a0ef172f --- /dev/null +++ b/com32/lib/sys/vesa/.alphatbl.o.d @@ -0,0 +1,3 @@ +sys/vesa/alphatbl.o: sys/vesa/alphatbl.c ../include/inttypes.h \ + ../include/klibc/extern.h ../include/stdint.h ../include/stddef.h \ + ../include/bitsize/stddef.h diff --git a/com32/lib/sys/vesa/.background.o.d b/com32/lib/sys/vesa/.background.o.d index 966c5875..778a29f4 100644 --- a/com32/lib/sys/vesa/.background.o.d +++ b/com32/lib/sys/vesa/.background.o.d @@ -16,4 +16,4 @@ sys/vesa/background.o: sys/vesa/background.c ../include/stdio.h \ ../include/string.h ../include/tinyjpeg.h ../include/com32.h \ ../include/unistd.h ../include/stdlib.h ../include/sys/stat.h \ ../include/minmax.h sys/vesa/vesa.h ../include/inttypes.h \ - sys/vesa/video.h + sys/vesa/video.h ../include/colortbl.h sys/vesa/fmtpixel.h diff --git a/com32/lib/sys/vesa/.drawtxt.o.d b/com32/lib/sys/vesa/.drawtxt.o.d index 0c9c3cca..c97b1b46 100644 --- a/com32/lib/sys/vesa/.drawtxt.o.d +++ b/com32/lib/sys/vesa/.drawtxt.o.d @@ -1,4 +1,5 @@ sys/vesa/drawtxt.o: sys/vesa/drawtxt.c ../include/inttypes.h \ ../include/klibc/extern.h ../include/stdint.h ../include/stddef.h \ ../include/bitsize/stddef.h ../include/colortbl.h sys/vesa/vesa.h \ - ../include/com32.h ../include/klibc/compiler.h sys/vesa/video.h + ../include/com32.h ../include/klibc/compiler.h sys/vesa/video.h \ + sys/vesa/fmtpixel.h sys/vesa/fill.h diff --git a/com32/lib/sys/vesa/.initvesa.o.d b/com32/lib/sys/vesa/.initvesa.o.d index 174e48cd..f1dbadad 100644 --- a/com32/lib/sys/vesa/.initvesa.o.d +++ b/com32/lib/sys/vesa/.initvesa.o.d @@ -5,4 +5,5 @@ sys/vesa/initvesa.o: sys/vesa/initvesa.c ../include/inttypes.h \ ../include/unistd.h ../include/sys/types.h ../include/stdio.h \ ../include/stdarg.h \ /usr/lib/gcc/x86_64-redhat-linux/4.1.1/include/stdarg.h \ - ../include/sys/fpu.h sys/vesa/vesa.h sys/vesa/video.h + ../include/sys/fpu.h sys/vesa/vesa.h sys/vesa/video.h \ + ../include/colortbl.h sys/vesa/fill.h diff --git a/com32/lib/sys/vesa/alphatbl.o b/com32/lib/sys/vesa/alphatbl.o new file mode 100644 index 0000000000000000000000000000000000000000..9eba68237d623a10c69f69eb31ffecf428de7974 GIT binary patch literal 6788 zcwUX!3s_WD9suxj=M4kHzyR`;;V}p*GcY_9R8&w9MZ*VLYdOup@FE2whGr(( zijRCOtFdaimAQzOqPghyV97Nzdu-WexvsfpB3qVWvgh2#aPOV_;OBSF|DJRH_ndR@ zMZVAD>Z!#A7={4~2BcuH1;G6fB4*%q5(oqufCXY&MG&kF8l76IiPQifNdQufTAix~ zKngEa#HB10_U5R^sf%;~$l)?NbfJg^MLH84R%UpHC;CZz0Z=6Zl;DFW$N}&r6Xa9^ zcpnxCz7-jLmtY~kwMl%|p?QJQuU z>d~M|DTzh%D|~4-|#U7UfsUk*ejY z9#ynYy-&A~-nY^B6JN8sMct<^_3QN0`)}~?^IxPnrx_pcdO)mpr&bfVAy68$CJ5-B z*2#jO3)Y702{D8o4V^sf<6#wH{bAd}M@Mu=R75JGUXCh`?u*_td`irnm>2aWv9h=m zadq({6RsufHtvE-FR%dd1c3{F{|HRQ_%F$TFW!N>(_0F+<2_HWb^Ikw`|GWdU@OW z9p;_i?%KYms1@6La$jRx_Wt_^&c4)qX#OjP*X|zfInvg?qGQ1uW8MlsG0=Ja)Wy?X zUF~NNzSH{Nj_$2JE$6nM-+iI&;^9jtKRx&Pl`nq29Qd{In^{*EU)y=T>&EvtBY&9L z+tk3 zNX4X?q*hr#>0ESfx(2!>3`^;jF*GtPXIR0ol4%vg zQ%tKF)-XNI)Wo!wWgXKqEbCdGW!k{@9Lq+QX0}Z%o7tXc`#swhFD-0ay=-IK?q!FU z7rgBBw#&UX3gWH?j-r{kb+X)_>JWldC#p7)rr}_MqPZysve9rRv z8=rT0z02!8Uhnhj=J$7AJ^Vi4caGmb_?;K+im-14eJkv$h<^*aCgMNBu8a6i#0@e36>(F{_hN2|`9aKW zF}toUW^p?$HPsHgwH_R03=*Aa7^UGe)HofLdb~nMXs#+}y<6Yla8*}2?B#eD zqd^^7nP>-9ylWTED%I!fGmL4*G`%@BH7hmKoT*Qm1E-p1brbz5Y00!5FqY!obpsq7 zYoTqdtO_n>s&dxaO;vSP6Wk-bqhXn;-dV{2_qR)mZDc+F*3o6S0cAa@&`=fwA1`wgRKg<${-XTSKJ< z{!6~zz62QIHp!l9M}?CbMGpDv~z>7S#~)Mgzb&i$-}XXl-gNmz8$}5I_Cw zyc}43X#JPM0XPI>04#Dqtc&(F9Wdux4jVIQZE9>jc}*R`UV)9?z`;B{8Et?$-vu22 z#k4jxhK``=`&$`7>?eTir}kG*-jhn^MFj&8L0f=4Mh2?@bKR^E08(geYHU3#uPg*G zP-E!PsBcE)y}*%2e<#R+F!)|z)WYHqi044p=$YvAZ4W2DC565xI(okh+!>&cNm+ME zSqJ1&#)_yd19VdSCxPBpvf3(EoBqX6Tg__wv)X>}4@rXFsR|g#>)rsO4Tka?RNyx^ z`g@AO$3W{~O5$B(67)X-L<~dG7l3Fo#*#6Sj45OsN5(ud&LrbJGFr%3LB?7#t|MbJ U8F!%wUqc7kK7*o$+$XI550>lI&j0`b literal 0 HcwPel00001 diff --git a/com32/lib/sys/vesa/alphatbl.pl b/com32/lib/sys/vesa/alphatbl.pl new file mode 100644 index 00000000..dd716482 --- /dev/null +++ b/com32/lib/sys/vesa/alphatbl.pl @@ -0,0 +1,54 @@ +#!/usr/bin/perl +# +# Produce gamma-correction tables for alpha blending, assuming sRGB space. +# + +sub srgb_to_linear($) +{ + my($s) = @_; + + if ($s <= 10) { + return $s/(255*12.92); + } else { + return (($s+14.025)/269.025)**2.4; + } +} + +sub linear_to_srgb($) +{ + my($l) = @_; + my $s; + + if ($l <= 0.00304) { + $s = 12.92*$l; + } else { + $s = 1.055*$l**(1.0/2.4) - 0.055; + } + + return int($s*255+0.5); +} + +# Header +print "#include \n\n"; + +# +# Table 1: convert 8-bit sRGB values to 16-bit linear values +# + +print "const uint16_t __vesacon_srgb_to_linear[256] = {\n"; +for ($i = 0; $i <= 255; $i++) { + printf "\t%5d,\n", int(srgb_to_linear($i)*65535+0.5); +} +print "};\n\n"; + +# +# Table 2: convert linear values in the range [0, 65535*255], +# shifted right by 12 bits, to sRGB +# + +print "const uint8_t __vesacon_linear_to_srgb[4080] = {\n"; +for ($i = 0; $i <= 4079; $i++) { + printf "\t%3d,\n", linear_to_srgb(($i+0.5)/4079.937744); +} +print "};\n\n"; + diff --git a/com32/lib/sys/vesa/background.c b/com32/lib/sys/vesa/background.c index bfdc9f40..ed0ab24d 100644 --- a/com32/lib/sys/vesa/background.c +++ b/com32/lib/sys/vesa/background.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------- * - * + * * Copyright 2006 H. Peter Anvin - All Rights Reserved * * Permission is hereby granted, free of charge, to any person @@ -10,10 +10,10 @@ * sell copies of the Software, and to permit persons to whom * the Software is furnished to do so, subject to the following * conditions: - * + * * The above copyright notice and this permission notice shall * be included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -35,6 +35,7 @@ #include #include "vesa.h" #include "video.h" +#include "fmtpixel.h" static size_t filesize(FILE *fp) { @@ -45,11 +46,46 @@ static size_t filesize(FILE *fp) return st.st_size; } -/* FIX THIS: we need to redraw any text on the screen... */ +/*** FIX: This really should be alpha-blended with color index 0 */ + +/* For best performance, "start" should be a multiple of 4, to assure + aligned dwords. */ +static void draw_background_line(int line, int start, int npixels) +{ + uint8_t line_buf[VIDEO_X_SIZE*4], *lbp; + uint32_t *bgptr = &__vesacon_background[line][start]; + unsigned int bytes_per_pixel = __vesacon_bytes_per_pixel; + enum vesa_pixel_format pixel_format = __vesacon_pixel_format; + uint8_t *fbptr = (uint8_t *)__vesa_info.mi.lfb_ptr + + (line*VIDEO_X_SIZE+start)*bytes_per_pixel; + + lbp = line_buf; + while (npixels--) + lbp = format_pixel(lbp, *bgptr++, pixel_format); + + memcpy(fbptr, line_buf, lbp-line_buf); +} + +/* This draws the border, then redraws the text area */ static void draw_background(void) { - memcpy(__vesa_info.mi.lfb_ptr, __vesacon_background, - sizeof __vesacon_background); + int i; + const int bottom_border = VIDEO_BORDER + + (TEXT_PIXEL_ROWS % __vesacon_font_height); + const int right_border = VIDEO_BORDER + (TEXT_PIXEL_COLS % FONT_WIDTH); + + for (i = 0; i < VIDEO_BORDER; i++) + draw_background_line(i, 0, VIDEO_X_SIZE); + + for (i = VIDEO_BORDER; i < VIDEO_Y_SIZE-bottom_border; i++) { + draw_background_line(i, 0, VIDEO_BORDER); + draw_background_line(i, VIDEO_X_SIZE-right_border, right_border); + } + + for (i = VIDEO_Y_SIZE-bottom_border; i < VIDEO_Y_SIZE; i++) + draw_background_line(i, 0, VIDEO_X_SIZE); + + __vesacon_redraw_text(); } static int read_png_file(FILE *fp) @@ -85,12 +121,12 @@ static int read_png_file(FILE *fp) /* Set the appropriate set of transformations. We need to end up with 32-bit BGRA format, no more, no less. */ - + switch (info_ptr->color_type) { case PNG_COLOR_TYPE_GRAY_ALPHA: png_set_gray_to_rgb(png_ptr); /* fall through */ - + case PNG_COLOR_TYPE_RGB_ALPHA: break; @@ -104,7 +140,7 @@ static int read_png_file(FILE *fp) else png_set_add_alpha(png_ptr, ~0, PNG_FILLER_AFTER); break; - + case PNG_COLOR_TYPE_PALETTE: png_set_palette_to_rgb(png_ptr); break; @@ -129,11 +165,11 @@ static int read_png_file(FILE *fp) png_set_background(png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); #endif - + /* Whew! Now we should get the stuff we want... */ for (i = 0; i < (int)info_ptr->height; i++) row_pointers[i] = (void *)__vesacon_background[i]; - + passes = png_set_interlace_handling(png_ptr); for (i = 0; i < passes; i++) @@ -201,33 +237,54 @@ static int read_jpeg_file(FILE *fp, uint8_t *header, int len) free(jpeg_file); return rv; -} +} + +/* Simple grey Gaussian hole, enough to look interesting */ +static void default_background(void) +{ + int x, y, dx, dy, dy2; + uint8_t *bgptr = (uint8_t *)&__vesacon_background; + uint8_t k; + + for (y = 0, dy = -VIDEO_Y_SIZE/2; y < VIDEO_Y_SIZE; y++, dy++) { + dy2 = dy*dy; + for (x = 0, dx = -VIDEO_X_SIZE/2; x < VIDEO_X_SIZE; x++, dx++) { + k = __vesacon_linear_to_srgb[500+((dx*dx+dy2) >> 6)]; + bgptr[0] = k; /* Blue */ + bgptr[1] = k; /* Green */ + bgptr[2] = k; /* Red */ + bgptr += 4; /* Dummy alpha */ + } + } +} int vesacon_load_background(const char *filename) { - FILE *fp; + FILE *fp = NULL; uint8_t header[8]; int rv = 1; + if (__vesacon_pixel_format == PXF_NONE) + return 0; /* Not in graphics mode */ + if (!filename) { - draw_background(); - return 0; + default_background(); + } else { + fp = fopen(filename, "r"); + + if (!fp) + goto err; + + if (fread(header, 1, 8, fp) != 8) + goto err; + + if (!png_sig_cmp(header, 0, 8)) { + rv = read_png_file(fp); + } else if (!jpeg_sig_cmp(header, 8)) { + rv = read_jpeg_file(fp, header, 8); + } } - fp = fopen(filename, "r"); - - if (!fp) - goto err; - - if (fread(header, 1, 8, fp) != 8) - goto err; - - if (!png_sig_cmp(header, 0, 8)) { - rv = read_png_file(fp); - } else if (!jpeg_sig_cmp(header, 8)) { - rv = read_jpeg_file(fp, header, 8); - } - /* This actually displays the stuff */ draw_background(); diff --git a/com32/lib/sys/vesa/background.o b/com32/lib/sys/vesa/background.o dissimilarity index 88% index 622c0c76cac7fe72100247ddfe9248f8cf61db2d..4a2c293adcd5d53829359c7c89a4fb024c60c761 100644 GIT binary patch literal 25400 zcwUWs34D~*)&6~#$xN2X4G@qeY$ogw2!tKk7eNFB6xnHgs$kSJ9!prndQ zv8{EhR@(ZtRs5@;A}&R6uUac=Y1J0R1qAB?DvFTrJolb=Hucwke!t9fpL@?e_uO;O zJ@>xv1g@Mlf3{&5!uc_TCDKfYNwYOptIvU=o9H5{cI~|&8~QEL&YYy zmRc#QUZ{F)2Z{&3Yj1CF+fV@^U7lItxi*vUW_JF@T}__WzqB8^js|XBTVV^iAwtEC zugMLy21{?;l~giwsp48a;I*X{s)^}Nk25M)Ji4D`cdj$DYp-2eVQWr>pHA;K$xIGj zleb}4vg_ehldR;0lkBDdiz>0h=VmfTb&1H(M79-YbvfM;gC|>GY}d6#KcGmL=aVJV zx=t!-%2rb{$-O44Q`N4WaP8s3wxt_9Q`hen1!M(vo;b~3dn8k^?b)ig4)@r+RC!#@ znxxtz~E~UASV;jpr`IihF3l zw!emV!Kucpo2xg%oNI@v&(4FXvaPg2Zg+vxa@(6Ps_+~>>)PVBeXS>rWPZH3^`zM} z=5TRa;pQ3k;b8#laQ~+cS#8g^?(hB7A+znp+V$`4cN?#w4rOuNc(u08+C0N-eb#Q< zv#_!Q*<+}B zv;>oTMQ;Cm=dM#!dR1=UZG86B@w}g|J4P$EX~S0GQebE>38t_Ab}F?sy|#W2yuSXM zPf3y7a52?QJN)3zyi~+LL&FsO84G_1@kcHwYI{n>X4^g`(R$pIWPv;A^HDTay~d5y zxw!4%!8@qj_S~U7YG1duqNrVN{7R^zcc0vNn2O{Ad-JSzC;aTH_QUqIYb!i$$9etL zp89M1p*>idnPfvAeU`M%wm18ZZ=UUGJJj}1B{`lHj&L?v+n$ZPI(*VTEFj;xco5Y@*SUwXYwRj*fi?dr;$y^(X#Ktydh0WG22-wE0}^d+Ukse8x%N_(dar4;_9tcAOE=2n+(?UF%B z#c6hyL0t#ZkY!#Wx>c%r)M6%msI9vzWt|W`Tp1oJE2Nd^S)I|`3*Dy_Wh>}iDY(jo zst!g+V=5WgCwnMWO?$L&dN`Bl>D8$LP3lyhL8-N(I!m};0n-j-Sbya%n)-muft+Cm zy0R1vs?M0#;GRa6vS)eW`DFhPm#CuJp#aDZD>Tq3L}j&V7@nyg6CUB1L2*mJVq}I_ zT$ytnax?^BhQE zVj)#PWKw~$`3xmV4xOAaSCX5O_QRASM7(&fH*FE@X<@5NM;CQ;&|aZN;|n@^dUhlM z57ioZR!?fkD;i6mW*N=gcH7}dQrIplLDH67L=CQ?9Z1xwri#K7en|Rks_pEGnM50*(K0LrvZ_5VwuR~!aor4*!RyD@{YH41#u&m|_zi^c$?%rZtJfq;bA1}1r&>iid1-*N$P65 zik>0(GxCtf<9(aX15f@~ZJ9R?V+zKy-=9TW;aK+jT(s$EBfmcb>%3#x?~hPWd5SeF z71nGr)YIWr8m44FeFW*Z!+9#K^Lmjt^Sj%Kw!Fbe<2~$)sU`3KQJ4HO8Zk{7Y@bh{v7<`xkaVG4CVVt@-Qio0L2>=lzvr@;BJOQ#H_> z*MhlRWA9KkP|@idDlVk>wA}wNO5>rRaR1YQLF8Mxixj)xVrt0IG#U5XOiht@C-rx~ zV>}7PTPbeb|1vtjt2T6Yiczr~QRIHlkZWm|x(_&t^*HYvm?mk`<9xu>*5iE0G*5m@ z*111o>JfP-Fzi9&G?MD{27N4|p)(%>1vbpjzSRu{XE~Qv5pvZKWm`Bt& zMI!HhjN8FnPR)7Em{>=1ry2)CbSj{cU-Dp_-ll|C-F-~n_ob^sEyCT8hqYy27}=kx zNA94gcMmj6EFR}miZ1sEa~Hh>R!(CIp0Jb=JO`P=K^yo zEB-qaU+5^7qscn=3Z89=D7lJyfv6oyi**Ogy2KnvkoRl&)NkIR#)V+#lQjEPG+bB1 zz1fsOT1fW|=6+tk!wAe9ncDJp%wP*sj~t8j`x(2sY;;$N8@c`1y#Fvxkt#eVAWGhtMzj4 zHoK@r8YdT{?_To_HT_9)6Qb;0vs$T|DaT{Y-ZNvW^-QTw-y=*H%fG>sUvfxZB&XAX z;r@#0C9*p-f6Z0}r59GUv)k+C*_ghtG;NT-M>H6g7LLhNXf3p6E1HyN!safPo^P|f z0Gdx@x>i0)=xO(4^S!`YulPPgmV;l&e7_-gV?HZ*{DX${LBEgr5ko$K7^}55DgK!u?}h%AR+-|* z3>g5AFh5R79*!+b7fzQL5WSf4oaO{V-A>`O4e&Xjmx;7&5X z(UeCKJQ+0W9M~)Uz)8uk&*JT6E3rc;!)5prO!^c(8pg%u*m(c zr4!P7mXnZF$~j;;2}z}m_c_=-I;niXG+!r%51AI|#PAW*LXp=UyX>Gfl7`D02}K`U z4=5{OKwcws9kre=#Is;2odIO$Op|KlA$Y0Ueuho@1Wp=b_bUbMD!V|_Sf*vN7zU5C z2U3+@Plx@J?OvUA`soT))0tLF0W;>Z@Hlx2 zdu5)jXE#YM#MV8F=^64LnCn7Y`)#WH6s}mrbf!EH)SJYk^Ic0&Pi24=GDGNLe`+UqP3#b^m#7^z{V;IlRoOXQ(_S7(^UEdYs z2bj~Y$Fdeq?Rs^vM%67??Rs^x#+ZL$$bVt2FSX+; z%TX3kmzKD#v(7h$Y{2{z%)d3{JOpr(`3XbLg#ISxlqI@jJytV6Y3NP2hWRN&@49B@ z?S_0F{%B!NSw-!;%b2e>^|rj6`BkR81);i@d8;We!+QLLIc1?vm|rW;?`l)7gZ-Ph zowCvb`1hwapF*ZSTd%WY%3qX~eu8+op7|}NycPCrwPU5=+e}%ZE-FqunQ}1f`MDEM zro?lj`&S&F_nZ38a4V1ZkSRC7-rJb(Fy*K4&t1IUkJEUt|2IxNnX*6D|86IqXnxqp z+w5C(Jel%gjQ?BaFPRcAC*8ke{;H`j8h^0gQ1f}+lvS|jKIZ>0_08i!*1zA>SC5By z{_mS|7VLe*zFy7$GgB^se|FdpD}KzBvmw9J-mUm?Q=Wo7kJ+Cq{vG)n>;1U>f#T~d z*^2dk!pRSoTn+grnQyY>+lcQ!Gr!J~b!gwk{6kL`8}3=2mX7G*Y8i3`~va!ytAH`TnGRCh2LRGd@HczGK~KU^IewwDg5`2vz}x>=JzirKUn$-_MSakucsv+fqfrx z{Jv_*$&mku`QJ!C=6}%17nZyO@`t$pK1+_qd_QLXwk7w&-owoIQ#<162=n(Xc{lv~ z8QXi%(zl|o*uO_CxgG7_s)K~$!IDp4eNWi4JA)siBN+Z~XMY{Hi#!RRoKSLk|3tandPVhl9eqAX z_rVKWk@r59K-dt;i(?4GKB>ela&jSVESZL8j57$aD@j~^W=W?v6 z*IumTmeXfGmeYU|EsHz7$a@Ta9ALL7u`3~lRW=X`T1@-M2eE8E4`PIwvu&~ zrn)N%Yd7gGX+?*k=_Iujuc?ZLdXLj+MZ>0QDX)hTLQ&;eirJ#eHzfECULl&Y+>7T| zS;6|eCA8IKzcMZ9y^i|H{utdX&-30vUF3iR>b6+meUmn+9H`rhy|>_dl0jNaNAEU5 zIYeve;;pCUmP55zu(N&1y2m-pXd8cBSab-NMX4+wLJOs>g)B6ETpWsaL9+)suvpnxnIAGFV zHA#=RH)RHShBmLr+Z+8RYsnJt0GKzmjHf&aY?@}J-Uhg1dIxquG38%5L$lMo=U{}H znsqI%iN%DRrCB#`GbCqg*4=v#*c{Dzc-z3v)U3?=2MPl@SF@hp2cUDFX1%=YG28i? z_4eLFfg{h>tdI90@{e4gSzqtpDahqQ%})33#T*uCR_^UaAtcYytin5l&Iq|!vwmI# zmRzD)e=pwM%cYtP@ID1C=N(eM9_THEmSvg^^&WyP%e9yEyK#BJr>bqFD1lIFJq_9> zASLaYwJ(b<1G@=v2i|g6^5WvUu#hXJtK|{JjYNFibhy~!w6jU@K0F?}Ms>XhU)gs( zmwaY)Ey3%RuCqH}XLZ|5LVv_-ykYA53#)r985ibIlzV)M`k{#F?zN3cDq`rep0VcD z!c_4hM7KXs)d(tD{Z#6(y8C>!!m79&TfWyJYBV08p{<3+P;QM0YXP)VF+s(lx)@0p zsrv%ey|+<9+s_zcD9!jmt(mm@+}@pxCNCQosU~uUIBIB-zO^x7T!{XS#7=({QWql& znOkC~yC{N;6-cnwmLoAd@d?8Rx*4)~_BVpiZEg81R=%D>*a$)Y!}MDb7Dg?|>mc#f z!l(oLf`0pj;&EX-gfA>a$$iuv3AR60>)(bL(A-0a*Pv>Qfj<=ZHC6W~95{=dYmA1D zHJ~VHisNSB&4xp7r_$+P!VzPkiVR;>(NIH^9E)&yj9SYZDa4F%ZPfY-(LukU2^r(@ zO+)!HOn3s8?On7~V1^UXZ!m&m6xq^*P@6g=Npwh!v(gf&mbS zYHIEI6rTu<;qOuPlhAU^FnTr%<4aiGv&AU{Q&quqUCT%=4pO#%1(SNN62{liFS-?! z3Gp0a^)a=+MvtLz)=o%uZwN)Gs3M}yE|Wg~jht3%$G2J$6CB)ktZ= z81ylmyBnPcS@6}KuatA3=xGGuAUrP{&%lF&@TjbdJ+bJ|Dx-ge=|1;+C@6=S&p$%N z5h@HmtRlZmBwB(xDCVzqN}eMQJ`x3RZRU1mk}h{8sgQk$!(zPwM0iNuX+sVcoEHTNxsr@g6J6KfpX&`QZn`! zS#d)T6*+Vs8RPKh9hJ9HMdfelWBh&eftO+9cTiyi3cIQB8x&rq!Y&l{QQ;8wyqM6l zmk>xbLy1m?%expu-a*X1hL7j)@i@YC!Xy$zL^hI8D+GHOLrxJNaul|V{g#>$T_a#s znK5Jpm521hM-Td#_y#rOJK^!uh;^iCjGs@1Iuw>sVIvAPRCpSNMk;(ph010sjK7LL z%E*o5H&bCL6(-$Gg~3>L*l{atd3wk`qQh=re#U!c$V>BSz`>XtCjAoR{`!M+6B9;| z-w`$m8Wm19`WnNW^7s?fa2*V=$@BP1q*5X##N<8%he-n84I2H7AyulnWLfWwbHy#D zd`HQlxH^dNFgoJ)Hf0(P@fw^zhB4(hofoc2YMU8TE+lZBfxJTGdg|z!JXW=o{4e#d zG*kIc!Ih?%vX!=!YwGPvd&%D38JXl$DW;qU9xRjq0W*90;vNCgGBKd`DU9&L&QD+5qW zXIw1Y9BQbn2TLS_;V2bNU5q4kd387#il!ujp;{`_lEor*y4@cS)F(p8m5njtwrU7O zBelBmGO~k9>B>aX58bq2$(C3s!NqW-Wo0bHN-bSPkLJSc`n-h_`QEW%kp~W&Hd6-?peR-gJagID|SBq zVZG-j+q5F{_6@&ixK*&+Ebn9+6PJZOXIOiToh@Hl_49sn=h3F7*n3vj_aC<{>xnDg zv<>T7!_(&@PhacqE8n#KbA@NQXNq;3F>lKgFObCgD<_deyV$w0X``p}2cGS%M_Z3s zg`P=P(T!HJ(t78L<({c;T>bY`AHT8HddXN$U2eW&9(B3Tc;1@qnPe8wLRVFetQ;re z6rwb{cKR`dvDQ;$+ndM%MI!x!)G&_AxC7ud(X?XEwBn-K#W%}E#ka{;>uPgurM-%% zuTofN8B{mD(w;;7l1fp*eR16VQ8<046_-paE}dO`TWPE7YWo^%qv^;YQ?53%YwH+{2@gS?Bq9eGC=o_l)ynO^;=%UklxuLHhG|cY^UQop) zPU|xIy+{qRuJwUzdlSRPex?BQ0rOTy2+@Ro= z(oBVUrZO?Js)w01O;in6Rp$V1SH)#c>oB6Xnpt*AqPLk@&ge|^4pnuoQw3d1_29TH zU6XAGBIYhr&lUI^UG@O)*5xALHeD_O{$7_$fjF0`JT6n;-}De2Df;n3hl)icRqVF-^rY3C`BVdP|?lRQw~s{kpiqcC1*2bL>l9#6e{%gO<4oN?ln? zg>Q*Es_u)?wZ+a_=5*^hXuVFgp7Z_I^U!*YowdBXQmsqSdb?^}f|qx@?X1vvCcO;* zPW4%YKFxO4GQ34C2ed}O5iNKm<@+Ux9~|e)lmnIkin7=Cqm-t_Arf4fJ><`+<(JyK zxMTcL7vb*}+PhGGTo-Nio-xb2g?4J8>l17S%CMmemmS$|Y1v?gY%oJM=*SL8%U@zl)rH*Q6YK-tD#%Sxbsi-c-eouB`RnnAU%0 zhR!pcb`(ri`jD^4vP4Re$hQlOzys9z2WYkwB zF7r1uL<3@tKOPBFuiA*vv%%F(-Q+?_8##=f1+$xdH4RN6(dcj1Dj|oP9Qihp2-Eyk z@5{)vkiSv)UjvgxEZ}eOMPmNAzcHcewWrY(Q9etg9V+5=HL$TR?r))wP$)w6q1sxJ zfRco7O*ojW&vGR>HXaR-32MQ_%3vtKvrYPI8bTRsRW(NV8)Ef-K@WIQL*YkSPZi=pIiYfm^BeYBj5e+r^64BZutqSQ4trnO0*q5}-{-%bk zjoIvr*4EMuT_mGPa!j;I#|62fPA$jkkS|2zVUC!KdX#8{>qGuz6G`}Dp?G7M3<-*8 z%zr7ZtC}dP)jrXYnW&G(lYN>ZiEv#c6jYO;-%z}P<`)!;me2N0pR;({sF9*+K24UR zM6H@$^yMRHAHaspSoA4l{K1A$PJKg&h733Q>q5R*gFh0|VX- ztBgXhV~%7Nc|Spp)XPh&lG=TGyRc1FdUgGcq0H#j0j9TbeJEU4PwS?_omK@iz(bF( zF_f&21_eAz>U}=mlp^IJWlVa5>Oe(w1?rn3tMqaN8ls7i@)bw8PB&@~#}Q-n=tny{ zMsZF_BpjpQqr{t`r8di0y(1D$HEP`u6#=zvl$X_RBQc7EC{|C|*Q|T$#craEPoY{D zR{Ja9j|h(VjD3im-jomx;Ydg*zoqvS&r^A)A+$Qwkjk)56Q>R3`&bhu=n$O{D0E{@ zNzMt_dMbZv6Ga4Zf#61BR9Qz)TDwO*#p*n*Hgh-vd&8td?a&$`0uvBg+}TgQgbLmH zvwVx^OsAAMddz5%kt9`y%$z>#=PcChTT>rS@&w?zgcBHzJbfo;W<)_usKrwY<)ieO zj!O#tcnhBlkyVlCnuuOvijH8Y83s7%KNwEdla2)KN8w-X59=*ohj96^^EsT#UOD+q zdxJIscA!opYA!l~t5m0so^WKfk2lsDwIdRG8K4Ne&qskOTG%5sO|`W!5K&hXO(vs_ zzM5z}NF%7ZI6G7i0cB3Jc6x1`I#f9+Wn{IeMbrz*q?8OX3vn5Zpw%a^ILJehq)xI~ z35qwb^Lk}?*87nJXP+Ox@#r`t*HOGj1O6mZgF2OQgV2-so>RS>SOOZOX**laDYSI@MXM>@(nbrY+V$ETqU5@>V z;RPR3YFDakOm;X)E*Rxm3Cf9e6rj;sRD^PZ)EP|qJ9V;UIYlQTeJlq3Nk4|H@kdtC zp^4juueK=?P!+jLkl}sWM^PHA!QX=LR*6sLd}R?$G#Ex;gtV@#EtBxkDv89ZaLlJC zBC@Vym`(cFCmnR;MFK6UY?YB@vo8W_vvOoRPw0Doi^>qY`=-D z-IF@7(q6!*D#!Yh$#{AQo%kr{24N90VOUR^!zmmH#Bd*}#TOSDhH{cce5bD*I@>$v zp_;wElsBue_W4#e#?-VaT~VzvC#h~sG(r$pVVq0sew>jFn6g?^Clu!_IJeJ?KGl^~ zl~sL4juBu_D4ZhWWIsy`U1J!UfvfU3@)r<~07}2!sQPHvo1zAvnLfqtR=0FmLBlzVfct7Z97<$g-<;l@-%<-w z6V^`>=&8?+jIEy&0q|Gq;=(t474qu(f-IBiJm)OUy!ED%9F{|+@uhPYoIh{TtU12f zXD@Z`tE)*BGCNe0V2zWY`8gr$T0>=eAgXK8;l#O=6BXZ6`Qe09Djq?|rtoS!N2zmC zox*%C(-D)E2)=&-pe&DTFw&elfl{04`02Qg;>#e6mK}xNC*;{IFV8wm1(QIf+L!Ha27Xt4oD1Sx>U{(T3pn)ZwZYDD}*zcb&SKs@$d5L4}9P+I68w zD6V!4%`tsLR>6rIR4UjgGQ#8)9fCjbOoy$5>jCe`RE|{FgalnZ{J7E7)TsvsEJym- zcb=iuDUFn*GGNnOnh9l>aFB*;OkEao9vM>4T)LBgwOTR}j%Gbu@uqN`%+KihsrUy{ zdisrkeoRIPEA_s)3$^bv?tl8h3b(Tb3m43yOG8slL*@~V(}zwyiZfi!z8}xzI2FQ~ z4_xs0sF6NgAyt;r2@C#FivMs6hT^M3!K|Ql_G&HNf0Ia2$TLoYN?TYPCH1^P zl|Licvg%dG@cL+DXn1|hk1y0{CQZ%5#HBs%p6U+G;rEgp6b{&KX}X zuf7bcxvF?XLRL@QS&7S8Bc&qd+>M<}HZYccpCSI9R5Fte$1U$oAWbt36a(}gysL6ocaTT zjC#n8%y@6=v`x>EyTYU29_Py8i}lQTY+5YDq7pq1_`sRRVv(&cI8cZa85K@(fymak zuSWNWKA@v-1@{@ra=yX3-uW^3_fnBPZavA}pTQl!;IFPS$K6lkP8E9GLXjT#3X!d^ zD>;6DhOeEr%{g+%$?@|uxYO1qvd8TcNYA%eq{qEWWb2z*MY0*(X~UnWW$GIk(BDTx zAJEZvzsS}XBz>DQxYPC|mq#!^LUPkOWy|6B1(B_9*ev?Z;7;3XIdT`w5?Mb^TL+Pj zWk>G4ACLo@8TA$Ogm{%Y;?H(qCgzKI!zY>gj-5^X2jV{WC$rubpSNeWSvkF|tP#L7 zzQ|BKdsAAeEaC9X2nH`m#Q^?Bz@+i;{fqOxzxloK3v;+PhZpDYk{sSKhi5Fb;+=DN zsi;bo1@$(>SsCrnUX#OHa`?I&eq9c~BZohb!*}KI*K>Gg%zz)y;RP8k1n--}hvo3e zIebA559IJGa`<&Qd|M8GEQddr!{5!}_`?W%yNgc z^GxcEKUZhoPW2yC@$HHfh4}?>DCtW-Av!hcw%!nK#7mXb^HTbyGD)bXIl65-m+d;L z(~l93L~`+hC6LhHcsaHHU@)g9;~lI6i4{X#YU2JXjSAkcGpAlCAu@5F!fiKR9gqdT-uzjanq z;BT2~)z_T*1zh@(5NnubF@HQk)6`FYsoJ_w?t>)UlJSLKR(r4wJc+)v4GcP3`V*R^`p#r_)^|K$4A@18Yk_o8xDD7<=UTIy z5W9ihg*XJHi|f~nMMyXJ^HE?=(hKZG_a-3S73Tx{=$vSh5lz6;g;+~ylv8d8uMk50 zhd*@DeIH0h7Mi*pe`;wApt}o@?u&ha^ssRwp-K0+|Kaw>S^h2HP&)T5J>RZ`CS5`% z04s%91{_ZF1dgEbfpma9&+Tsj$vFpsql9P&(ghy>7$5pa;cqNP3vm{3j1cFbeykA7 z!N&hu3!u^UdnhS<7UQN8UKgz z5yod3-(~!S@f$|`b4FkX#-5CW7)LYCVLYEP#&{KD8{@5v_cHEbe2ej8#%~$%pJ)Kf z82d5KU|h`TXS|egJ>#z!?_qp|@ma<<89!t^#fblwM2*WhgmEI{9L9?oYZ;puH!yBx zyqj@5<1>t}Fdkt%!C085@ifL^jAIyQF)n2cFt#$@!1!Cn?Tk+{zRdVG<6*{c8S~v5 zyD|=79K$$^aVcYfG0wQ2@kYj9Gv3Ge1mjDLZ!vz%_zffe^&s#x#{P_>8D}ysVXR@i zlyM#74UBg%-plv|#lF^&5u_xm&#xoetX1tiOk?|*tn;CCsyqEC_#+Mo2 zVf=*gB%`;0$7dYIcn0Iyj2AODGX8{dGvn=y_cA`g_%h==jGr(T7i#Rx*q3oE<5b3l zj4K!$8P_si%Xll}?-?Iue1UN<<9m#sGvc5DO2%G{!x$$qp2c_pW0gJ9$-AmXchDLjOC0o z7?&^x7!!=Gj9VG+W_*xw5940O1B^!*Ey?3DmNSlGoWZz+F~FE$Y-QZacsJvNjC&aO zG9F+&%4n7F_>AR@qZnr}E@2EXCKy{8w=&+%_#opR#=VRO7>_bq9e8}ka>h}NGZ>dJ z1{f2Jt&Ce4?`C|EaS!8O#siE;8Lf^yK4UrKD8?C#OBe%;3C32&t&DdwKFGL-aWCTm z#-of@Cmx@%oN*N648|pl0mcMlE8|wiyBQy3+{3t+@c`pdMypg~DPw=exr~=G-oW?> z;~vHj8NXoc-C5%t#t7rj8Fw(g!g!ofbkQgodolKBtY)0UxQKBDV*}%5jGGvL!MKg_ z0mfa7uQ0yN_^~toX&MJGj%J*}cn+hFv61m|#x}-ZGX9qFLB^*T-(ft=_zk1GtH#cZ z<&0H~Qy9-?ypS=>xQ1~f<5tGI7`HP%!T1+OyPL*gjH4MRGEQTh!?>7nCF9Q+?`J&B z_%)F3z9$&n-F1D(?wWUD><*+eVIbo$mYc{pk8vrtpU=FWG0yc@GHzzPne{)&ayywn z$+(;4p5ykvF@KZ!e&!!A|CISL=H4EfckH2g8S}o(hcb@g`iacv_0Z!lU<`13J@W>} zn^^u8#*Y|}G2-7{0sAvfVw}!+Hsf-}0Aqx)mGOGUml%&Sx_W9XVeH2^lW|c`ZRb+P zTf5G@0?!O&KXVfE%FLL`{#CuTcev%GInAt>#gS9s%Y~3sOqj=!kqeqW!SX%=jT|T`gu+ht(V0Qkx-R*(S=Z}7LB@NuUs>T*_ zZJdhhUXg2?43=KEJELS~QpH9+;Kqs?)x`9{fIBKzJn%NjK6t5_U%PQ`jjcHqem1$! z1T%Boa{t=hncfGNOt3N+PO#gOG;nJzq`vgrenno$7W!2-hAg*)Vr)VB(r5L@~{RI-fkrUUkSTxZ&x#HxBmO zG*@|CSxr($m)dpDs^%#RPCUHoow_$VAJ!|^?mO6>oV!WOVhOdDeQTb?0$sRh&*oc> zBR@VMc6SqM3Ll|;-g)yIIuBLR@|7NV6VvvqevCsN&}i)sQJ9#>1W zVV`R2{5l}l)lt&}sH}U1t4Ueeh64v~{0>HZ^c6K-x~e8{RId9_7rX3}>)wQxcQ;Kv z>U!U<`|_Z@F;io2_*9Skj0&ljj(+q{@I3qvvRrqQmWWAtEM-(vyx}IW>rlk0&96Qm3kx2mM?tf^qLB|hQun= z!m}*Zmt&!*zT8{Cv4_YJGGO3_ul2I~9);9_pM6i|-l}}Cifm!YgZosKYyCkVH646% z!>653R$aI#xNr}(8C{KXe>eIbRMx%3D(hD!gjpl3vXYWhON6j`Qt_mclS^iH7s96c zfUfs-r}_z{Likz02Z16fN~kda0PoVnFuD&ZMX}f?042Ich|=y7k^eSFNHTm~jG&FaEEcnuJ(CWtft;W2Gx7a8SLs4VhH^cLkrDwCq2xUH?8CPlU$u@ zT~Km9^&IXKb);{EuAk@EwIfT2&LjESdTK_;QT0l0bg_cE{)Sh{m=Xg-h_OnX%&5=J z{IpU8nmDUJMJ9HEu+^D!qos)W6@qvnk*gdMIEzw{;kO5p5UQv3N$< zKI@vUR3&FqgKrqAF|0SJBJfQJl7FL_7y)aQO*P-4uk{X!-~SYiw<$ILle$oiZOo@C z|0r~Ij2o$3WLu-CrRbdB3bfxt-(8-=#J12^vHEIpzl1fO1}d8Uni743zDo{4v^Xm( zN*|%Q?V`cQ7tM7dWPQ;*)R@)6SwYSznh!l@we4IeiJg~LEa04nDV(n*OPyx&LD2|Cd;9R%YrP^=j4oFngs`rB-+0}{_t zg>?spX+EU7sHJ(N9Ls9j6ac2rlvo6x)rAg&E)wlllswv{d8c`N z3RbbmdX^eW9E@bWjAGdckqr-XE;-rul|DrpN`2V+0q1L)iLc8zJu~M@ieX>zIQILE zq|#S1j{UwAZ93Y>?>oVqaqRaONU^U>vkGC|M^5r}eVK+Sf1AD{^snoD71sV)`08sT z+WhoC;qPZJq!#}*G+BS84deVjC9nDiD4+PT0sMn)Sm9qmbM`mehah93e6fwN^#6fu z@Gr3^TJWTe4(CH8ZqHFQUxVBSok=^QYA&YlZdfJ%9$F#)QX4T6u%}}F&4_o~e;V|! zv9DJ0(CqI{M)}v;x2qax_FoANSJ?Nf8mQ=ggo-x#!m|HrRHUL2VgJp*gvhtDigvF3 z22(>mM)LNXOikh6k0pA`cod2^k~8eT8(p!aHgtARQt?ufD7N1<$sOIa6Es$Acd>kaN19M2;;sV9B>U$ag#&9_0J1C2EkPSxb~wVY-%#HIXFE ztR<(=MzKv3+06ePEuw9ib9`_hM(qA;`uYp4SGiqkN-Mmx4tFzn(_#mt4!Ya6-%NW z!XCuK+VXT{hrvt((t+_q&2o#!xfMPgZSKZ6mtmFa%wzo+2SapE(bvuNufkry_MC5` z4)#1ok!oLHPGrU1FwTXpV!0H07qPYFqFm{=c!$zr?S*}d&7s(wK?GvRyk3n9!5-g{ zvMJ<|-iE!&l<(5y?4O%&^ZNY?BW-4C%ZV_53)6sn3}O2Vrls-?OnR&7v(-H0pFywY z<*bm4(f5~3d&;Y@xYzKcd&{@6zQ1DHNA@5c_H|7A%2#0F^-TN8GhyHjOe^KHP<0d2 z{_RO9_Ed{BUhaSid(GFB`4i+p(09ywrRsEvwX@$fld5%w905NcVme1|!%F>& zL-Hc&K=@0hi)9Ln_7%@6A_v0WqwMw;IT&FkEKOVG6&TmBv~W_+LEjQ9T zfczL`t5tocA?IMeW0~J&$Z_!Uc;yJl>xSc@(iW%lbX8an&yv@&v5KSuFpuA*Wz| z3t0YDLmq~|FR<1qzR!?@q3=TGZyWMq%x@8of54ENVNa0xAw#Z#e3P|a@lOqTJN$LA zRjK$FhI|D2y(ydEpEUC;>10Cx z4D-#D9^s#M=2x4d94ntqMMc8=e-N&X&4g3(iNPnyW-Ce_IAU{t;R6i?}|nBfWbpbF65@?_+UaZD@a zCb)3CJ=D_qrU7TqiS`WDS|k67fH;ZiP}v9Zb}|c(kQSEXRC_=VoqjfAj+2?z%Ohx= z$-?91EEs!+t*x6N>oEN@nVup~fvxA*+HVu(JDB8brl-p^ym~Iv8S(~rwZT59Zq~CT zUQ5_>?Rp&*hCBfK=h=GKP!^~GpRX>%Dhu3;nViR*vcO8TFJMkt;1eXB^O;i?7z=&@ zbIJm0$uF|scC&ywgcdTVEPzL6dl7TW0ySt4GN&w{Vq~$M-Su~%J;a=L{XY1ykvZ-9 z{b&y}r(Iu#{t>p9cKv5Uy@!PP_gOSeO>(wCg9qz8G`b^>MiO zVijd-*ViI0TY3EVjEZn7EbKPswCmNm8nRv(6Di-i7(5ng836k7B(t%)gr!3JE_Ag`pouN0~a^~L~de^OB ze$t}}^#9D}Q^?e3>y>s=`HQmB$JkX@F~8oFA7OpA+Q|y=Tj{YHS?p>zo=n*l^ZBJ4 zPo`{x{_8kC?=khA;RYUWmnmO?J=>VyZ_3Xw|66#yA2#K;h?ifx@np)+p?`-PPc(nz zgj?mp&lAkAwPX$Y z@8Nv2&62|~{*%nNTM~-wrFEqO2E z_XCdKmn}I4_J7FyFP2PT{~U1hg(W*M{zu$@ANd#a{h0Zimi!R%2bsTZ$xG0Fi1~Y# z^ueE>@_Y|i`d0KM`}dF~Lm2L8(bu;dEZ|BXGZ2lyBC@P~Lm%KrMAj%3&;e0qN0 zTJmY=^Z9tc+p<=@B=PC}dYLT`pgq8Rtu4<0@520YTYd|D6+S(m^|rpn^!4#A!>tkjT3cQMdq(@TJ=<*g2aH$eYg6`Yx8+UXV|-UDek)d+ z_z7&!9kzTC`cGnhr!99t|H;hnvE_8k?-b^{Z2hn@ndf)EEf*kPOy&7JY|CSiZ>KTe zO%G&OpyCT_Uf*Xr>qMmWyNA3yO$Mt~lXb4Zs2_q0x z53&k!jy*@oEuil%SWW{7{l(-ThI@ zdgU!q-p9+2ik^S%EyP3Ee1d2uI3ayy;A2k^gC5cmOCNZ_0GgfHu)cDo1|HVGYdve?#d460mn_zte1mj za8B2(cUfaHDV(XA^>KEf-!#qoI(P-@OxLWR(-ZEPp;@Klqi}F$YS!P0V%BG9Ho*BF zi!n>HfzEo2ca~;V4qhfZXKQwhGnoRzIY+Z&olhvVoY|UHJHs*Fxti5Df5munG#li+ ziNI*kY_QV~opUuC;yi;zod1#X^-!lP{BoXVBb=`&>YN4IOZwfobHP7V+Za&}q3n7Z zv`s+Dk9uog6g`Lb5#n~dc(a^^Wz8|+ESjvAN0hY@3HH(9VvAl=NpLxhU=C8d+Ugw) zHVL!lC)kaB)>5OfmDa^P#~8t_NnxIix5ZRUQ*neY#&bpLezxk~*Z4cR*!bMwANmC< z&5Ye|Twfu6PQ)0mnkcfwVMB{lHYJ5I4&B>`_1{RIH%>%;Ft;T8KM#vfLh7@&97+zD zLDM!)2HgZ%Je3<0q1)Q>X>vdZa>gX+$1k-5W5SpW@+wGbnJ}h+A^xkPsgy7_u<)k!kP<0pn+sp%Wl)9`%_7N&P=G)_fjaIe1o zgxHK`vy0|mjyfpj-xJCw5{Dk< zy_$*R6`L_st-PN65KMkhIwOo>eJGrUh+gYRY$@XGByaef2)Q9*=(m;B^JN(EXVnZ3 z;)jUAH1M#=u;`@-(PcyjLjTL?hkN+|<)FWyKVnEN*elS`&vZ@s__z{kMfl4n@+Olf1SYH~3 z_4rTExXUWNGZ5Rd&m7*m!DTHB1kgpM;Geb_dwfBp0_+pw-O0##cB$5{8Re%;!#IitIN^N^R-t&pv2bp<1mywSDN$r!$0+Y&0rTQJAgCHub~&g9f*tu*cvQ6b`#B!eiJVftZ~Q(Cu3eB;EEI^e>~@ z=e$O3`wdk*z^bU|3f@ZeHB~i#AHnCk=(hfZ=#8ps_U#1Es$zrNdLI3|NDb2P6M{>1 z@!71#259^&zYo0F#nfH`7VB~VSfb0Nz*1c<2TEP803zj5x!$X+gP;%vY+UF&LkfCTrNNI|o=+FKTEwLuoE$!wVm`PE#$ zic=WMZs)!vJ5UWcKW6IWO~v05+^viAEUk=+QOljt{H56$&0oeNP!T!uDqY+{aJ`kc zVt*rr?<%DYfP>oNgQly$A*a8=oi-J7N*i1Qs2kuqD{uWi$SR$4KD8{e^89@@wOpf3 z!Wr;eU4)VI^fWQ#GF`+tTkz%Djb>0COw zaDxp7k;v&32*%>EOfYxM2;5%Ww$?-_;%&pHGONpW)o1^b2p^o|m?!49wxAws>DC`) zIXBRD@WyaIjj`rnDzQA+*xn?A`kCMDwSZHnN03ocK^GSMK;uJ*KQ zT^>rsW7NV@8iYVf681j;|UzCmN}m5z6TL zk#)mFCXorX2GMtUEFKJHXjV{?o;_&WNVgP;*+Wgni9zq4W~bmWV`iqD`&s z=@w;9wj;TK=EU9OU@-{JDxD04qrr^OV+RvW z+5t4$()MUP+@V}4P!|uiMcu_rwua)~V5mDGDS#cpW}0SPtO%+}Ywrb@M`O(`nY2hH z6KQ?H391ExTUOAJO?1sty4sX)RDCQQP6pMG-iQ^-aI|}3PjPo-uZJ{=(#G>dbcZ`& zB*CjI)Jjt)Ex%lev1)a-%%no`bZ}XSOiBybJ9Z3tERhV6i-dbU9hG;#R9%`9qf@Y73@tEYP=*_uw%l!T`o#1&Pf!xXg1*otUtuthDH&=IW`p*0b2 zu2Ns^@pP;?PMZ|5l#4x2*yU}U_L*^QNisnlP=mD)p>$hN?^*x-a{GP0;y&6ZX@8w1D(YJu8k(ahXv3n$VPYwhV&kRA72AjwcVEqE_LTt|m@Y#q;no>VCwNMv~|LRNYu)NbJE z>ExwSHdZ}>e3w>xT6u5o%(KrwWA@bP!D(mB4NjguXA;Tb`3BwzWuncLi$YP#4cH-S z4O>;pK+N!J(dm|0(w?NHRT~>?nvUt^3AaSqh1kDI)sz&GSf+)RN{6t@BJm~h#PT>N zQ3O^r5~D~;glW;W(vINr7D~GM1VQSetOFxjX$R|Wt+8}Q&m2j&HM%U?D%!9HQSuh8 zP%s%ywZ&+@k-W@B^KNfc)_IdkTWEz)X;SS{wPfv-Uj+^?kpzt=L#a?3t$PGhNQRne z8QbGwY-#VJF_M+6HE zjsNjZ(L#D@CQ7|~G-;)*5f+a}>Y@x7Rso_@u-f&?J=#WP9$S}xWa^_Xo85SO;qa%m zieN8c^ShgqA~8m%qjzo7BDX8`A<7%CHPIYX`yw2QyNj4%*(>A3 zGPV2EisnzwJ@E^U=Ugtsrp($$!KwA}#-pValWE&G3CjGjh|qJ!@(1;Hi{lD~?XIp+ z7?l&Qj#IBwkVCasl*tA2RA~pU$@f%{^t!o%N2Gx~p&rw<-Xo7<8Cd{6Bip?BKGuc+ z<%3)8dzGG$d@wQO%O7SD3S!P7>hui;n?m}y%|)GF1f34lQpGXh3?g19#F##ZR`3C> za~5=P{!@{vyJt_jmS}s5ER2QSAjn=D-PDn$>x@49)b$4TlXn^^{M*`A1YJeJObf}h zBw8bM?P<$iR`rFDgwi_H7mU^sr&9*JtlD&DMjSNbgmsf0IY%ch_$(We*ju>HiS&|K z(!I(lt+W#&ILc!gKFczkK$7ja5m9Dni8W=ElXL(k-DHEqQlD^?jdHj2oC~vuvC2xg z0BdnxlZ4J9?rEp9CSMy>AoCKac+_Q;_X^@Ox9yU+-NUmYyMNk~Ds`&OKue9Vp~kSf z_lR&P8ETBR#xgP9p?dHnTpNmbYO*JUaPMRVhd%NjET)4YmUNGLeFnvwbGJQj7j^5v zRWaF`aqksr70B-L#PmHv2WH0)(qQ&3<=)e@1IN2_j>X-3PWFnc4)Nw_Jemr%>REY& z^vz^cOQJ10swEl1YsuDFynV%}RJ1i3N=LI5BgfW`9X*n^?hk9~N2!;EqbRWQpXJoL zd$whrC(Elgb&qqMl@xjRIDPHY87@W}GMG&eZ1RsiHRv!=Nkc`=3U%h`(9H7dKCA__Iy9jCVO=ddk&xMag02Hy_q|Evh(8% zx@|c}U-m#<4D_H2g`l!BYv1v7e;kKmE`CR2C zwdY!3yH1^TKb%Wa=tnHIi*$!&bn{0-$gWe;dj%_;Je(I=)~xSjo&={Hp{_5;v+9X9 zFJkC0PPS+GdEb35&%Y1AB7Me0QlaJE+Y_aYXlfa`LOm!n<);mG7P~nJCk$nCwOu?X zOeE2cNBQj2r+R4CX-TEbWJ^cd<(|Is){`*V@#W3oE`g z;esOc-cm~SHH6c@ezTBwe@kW)t-BG$^eIzLsv0`|?0Lif?{_hxHr>%idI>WrjV*48 zl31(by1K@jquKHE8L1bwlttTcMXHS_GSOPHek8?sc!~J`{tOg&PpW@Yzz46t zy)W%Augb&SHvExH*Ei!7Ax3(*+xALB{^@8h<06}eb; z<=*`fIiM$e#Y76+OD+BLd3T}hh28LpSKscbLahIhxG(&8>uvGbQE!`7(906}o6hpQ zz}MVY!2QDevGO7qyf_;J_-)jr@$ln-`+KMPgYioWxKqH(3V3+|_bja9-3xe+0$w3T zWXpnj8)BNL9oiQb@Js>!Nddp2fL~X@?<(LA74Sb7@V5&1;R5dSxDdRufDbL;Cl>IT z1$G)+#wxy;r!NBI#n zTLWV}FR%0J^PkRs>~(flJQ5A7-?Q*zntn-t427aW=@@?-ZC2=ehS@{ki-1XBPa!q} z>2Tc!q(kRkU>_l#0QRN*2Bgd0SB#~|b*xR!A%;||8V8J}W&iSZEQH;n4fa0z=c zj$}N6aVq0n#xP?ip2fJ3v5oN(#!ZYjGTz1b2;+;4Z!vzt_#LBD%;PhTWIToOEXIY5 zZH$*NZeqNV@h-+k7+++3i}4f2vJ#Cw7>{8b$2gJk9L7bAZH%iJH!|M9_+N|0%3qp>?4m zKjUFWOY*pk)r?~qr!Y1!h8fe0os3%M*L^>YJA3O#<7f37#kSF zjA_PB#;uGy7}1@^xPx&g;~vJnjQbf6 zGg{qve8y_Vv5Zp~8yLfkX~s^*t&BSucQWo_+{?J1@i3#+oyTXaW*o~ng|UG#%$R2E zWZcTQgK;P09>%?l`xy^2S``{A7zZ=XWL(PlbH@7^_b`6I_&MXi9vY`J#uT%~;2H8sk}v7c#~emou(o+{$-#VcVI0#}>z~PTvzgCjT+H=tjO!V1X8Z%=LyS)|{)O>P#t#|4Wi0BaaVldg z<3`47`swknXS}JOp6?EBzl-@pjJvu1Ip+Hq4{`rb87nF^_GTOdq})A=abBhFw}`Qs zG0E7$cm?BT#+z8*uNi;OcrWAAjL$J1Wc(+i(_hbjAmizby$z9jPA$=YtPMVt`3U9_ U<}J)K%vUg1&%yp2mUI380!0>uFaQ7m diff --git a/com32/lib/sys/vesa/drawtxt.c b/com32/lib/sys/vesa/drawtxt.c index 820fc40e..a4efb86e 100644 --- a/com32/lib/sys/vesa/drawtxt.c +++ b/com32/lib/sys/vesa/drawtxt.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------- * - * + * * Copyright 2006 H. Peter Anvin - All Rights Reserved * * Permission is hereby granted, free of charge, to any person @@ -10,10 +10,10 @@ * sell copies of the Software, and to permit persons to whom * the Software is furnished to do so, subject to the following * conditions: - * + * * The above copyright notice and this permission notice shall * be included in all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -29,20 +29,32 @@ #include #include "vesa.h" #include "video.h" +#include "fmtpixel.h" +#include "fill.h" /* - * Linear alpha blending. Useless for anything that's actually - * depends on color accuracy (because of gamma), but it's fine for - * what we want. - * - * This algorithm is exactly equivalent to (alpha*fg+(255-alpha)*bg)/255 - * for all 8-bit values, but is substantially faster. + * Visible cursor information */ +static uint8_t cursor_pattern[FONT_MAX_HEIGHT]; +static struct vesa_char *cursor_pointer = NULL; +static int cursor_x, cursor_y; + +static inline void *copy_dword(void *dst, void *src, size_t dword_count) +{ + asm volatile("cld; rep; movsl" + : "+D" (dst), "+S" (src), "+c" (dword_count)); + return dst; /* Updated destination pointer */ +} + static inline __attribute__((always_inline)) uint8_t alpha_val(uint8_t fg, uint8_t bg, uint8_t alpha) { - unsigned int tmp = 1 + alpha*fg + (255-alpha)*bg; - return (tmp + (tmp >> 8)) >> 8; + unsigned int tmp; + + tmp = __vesacon_srgb_to_linear[fg] * alpha; + tmp += __vesacon_srgb_to_linear[bg] * (255-alpha); + + return __vesacon_linear_to_srgb[tmp >> 12]; } static uint32_t alpha_pixel(uint32_t fg, uint32_t bg) @@ -65,15 +77,39 @@ static void vesacon_update_characters(int row, int col, int nrows, int ncols) { const int height = __vesacon_font_height; const int width = FONT_WIDTH; - uint32_t *bgrowptr, *bgptr, *fbrowptr, *fbptr, bgval, fgval; + uint32_t *bgrowptr, *bgptr, bgval, fgval; uint32_t fgcolor = 0, bgcolor = 0, color; uint8_t chbits = 0, chxbits = 0, chsbits = 0; int i, j, pixrow, pixsrow; struct vesa_char *rowptr, *rowsptr, *cptr, *csptr; - + unsigned int bytes_per_pixel = __vesacon_bytes_per_pixel; + unsigned long pixel_offset, bytes_per_row; + uint8_t row_buffer[VIDEO_X_SIZE*4], *rowbufptr; + uint8_t *fbrowptr; + uint8_t sha; + bgrowptr = &__vesacon_background[row*height+VIDEO_BORDER][col*width+VIDEO_BORDER]; - fbrowptr = ((uint32_t *)__vesa_info.mi.lfb_ptr)+ - ((row*height+VIDEO_BORDER)*VIDEO_X_SIZE)+(col*width+VIDEO_BORDER); + + pixel_offset = ((row*height+VIDEO_BORDER)*VIDEO_X_SIZE)+ + (col*width+VIDEO_BORDER); + + switch (__vesacon_pixel_format) { + case PXF_BGR24: + bytes_per_pixel = 3; + break; + case PXF_BGRA32: + bytes_per_pixel = 4; + break; + case PXF_LE_RGB16_565: + bytes_per_pixel = 2; + break; + default: + bytes_per_pixel = 0; + break; + } + + bytes_per_row = bytes_per_pixel*VIDEO_X_SIZE; + fbrowptr = ((uint8_t *)__vesa_info.mi.lfb_ptr)+pixel_offset*bytes_per_pixel; /* Note that we keep a 1-character guard area around the real text area... */ rowptr = &__vesacon_text_display[(row+1)*(TEXT_PIXEL_COLS/FONT_WIDTH+2)+(col+1)]; @@ -83,36 +119,50 @@ static void vesacon_update_characters(int row, int col, int nrows, int ncols) for (i = height*nrows; i >= 0; i--) { bgptr = bgrowptr; - fbptr = fbrowptr; + rowbufptr = row_buffer; cptr = rowptr; csptr = rowsptr; chsbits = __vesacon_graphics_font[csptr->ch][pixsrow]; - chsbits &= (csptr->sha & 0x02) ? 0xff : 0x00; - chsbits ^= (csptr->sha & 0x01) ? 0xff : 0x00; - chsbits <<= 6; + if (__unlikely(csptr == cursor_pointer)) + chsbits |= cursor_pattern[pixsrow]; + sha = console_color_table[csptr->attr].shadow; + chsbits &= (sha & 0x02) ? 0xff : 0x00; + chsbits ^= (sha & 0x01) ? 0xff : 0x00; + chsbits <<= (width-2); csptr++; - - for (j = width*ncols; j >= 0; j--) { + + /* Draw two pixels beyond the end of the line. One for the shadow, + and one to make sure we have a whole dword of data for the copy + operation at the end. Note that this code depends on the fact that + all characters begin on dword boundaries in the frame buffer. */ + + for (j = width*ncols+1; j >= 0; j--) { chbits <<= 1; chsbits <<= 1; chxbits <<= 1; - switch (j % FONT_WIDTH) { - case 0: + switch (j % width) { + case 1: chbits = __vesacon_graphics_font[cptr->ch][pixrow]; + if (__unlikely(cptr == cursor_pointer)) + chbits |= cursor_pattern[pixrow]; + sha = console_color_table[cptr->attr].shadow; chxbits = chbits; - chxbits &= (cptr->sha & 0x02) ? 0xff : 0x00; - chxbits ^= (cptr->sha & 0x01) ? 0xff : 0x00; + chxbits &= (sha & 0x02) ? 0xff : 0x00; + chxbits ^= (sha & 0x01) ? 0xff : 0x00; fgcolor = console_color_table[cptr->attr].argb_fg; bgcolor = console_color_table[cptr->attr].argb_bg; cptr++; break; - case FONT_WIDTH-1: + case 0: chsbits = __vesacon_graphics_font[csptr->ch][pixsrow]; - chsbits &= (csptr->sha & 0x02) ? 0xff : 0x00; - chsbits ^= (csptr->sha & 0x01) ? 0xff : 0x00; + if (__unlikely(csptr == cursor_pointer)) + chsbits |= cursor_pattern[pixsrow]; + sha = console_color_table[csptr->attr].shadow; + chsbits &= (sha & 0x02) ? 0xff : 0x00; + chsbits ^= (sha & 0x01) ? 0xff : 0x00; csptr++; break; default: @@ -134,12 +184,17 @@ static void vesacon_update_characters(int row, int col, int nrows, int ncols) color >>= 2; color &= 0x3f3f3f; } - - *fbptr++ = color; + + rowbufptr = format_pixel(rowbufptr, color, __vesacon_pixel_format); } + /* Copy to frame buffer */ + /* Note that the dword_count is rounded down, not up. That's because + the row_buffer includes a spillover pixel. */ + copy_dword(fbrowptr, row_buffer, (rowbufptr-row_buffer) >> 2); + bgrowptr += VIDEO_X_SIZE; - fbrowptr += VIDEO_X_SIZE; + fbrowptr += bytes_per_row; if (++pixrow == height) { rowptr += TEXT_PIXEL_COLS/FONT_WIDTH+2; @@ -152,21 +207,40 @@ static void vesacon_update_characters(int row, int col, int nrows, int ncols) } } -/* Fill a number of characters... */ -static inline struct vesa_char *vesacon_fill(struct vesa_char *ptr, - struct vesa_char fill, - unsigned int count) +/* Bounding box for changed text. The (x1, y1) coordinates are +1! */ +static unsigned int upd_x0 = -1U, upd_x1, upd_y0 = -1U, upd_y1; + +/* Update the range already touched by various variables */ +void __vesacon_doit(void) { - asm volatile("cld; rep; stosl" - : "+D" (ptr), "+c" (count) - : "a" (fill) - : "memory"); + if (upd_x1 > upd_x0 && upd_y1 > upd_y0) { + vesacon_update_characters(upd_y0, upd_x0, upd_y1-upd_y0, upd_x1-upd_x0); + upd_x0 = upd_y0 = -1U; + upd_x1 = upd_y1 = 0; + } +} - return ptr; +/* Mark a range for update; note argument sequence is the same as + vesacon_update_characters() */ +static inline void vesacon_touch(int row, int col, int rows, int cols) +{ + unsigned int y0 = row; + unsigned int x0 = col; + unsigned int y1 = y0+rows; + unsigned int x1 = x0+cols; + + if (y0 < upd_y0) + upd_y0 = y0; + if (y1 > upd_y1) + upd_y1 = y1; + if (x0 < upd_x0) + upd_x0 = x0; + if (x1 > upd_x1) + upd_x1 = x1; } /* Erase a region of the screen */ -void __vesacon_erase(int x0, int y0, int x1, int y1, uint8_t attr, int rev) +void __vesacon_erase(int x0, int y0, int x1, int y1, uint8_t attr) { int y; struct vesa_char *ptr = &__vesacon_text_display @@ -174,7 +248,6 @@ void __vesacon_erase(int x0, int y0, int x1, int y1, uint8_t attr, int rev) struct vesa_char fill = { .ch = ' ', .attr = attr, - .sha = rev }; int ncols = x1-x0+1; @@ -183,11 +256,11 @@ void __vesacon_erase(int x0, int y0, int x1, int y1, uint8_t attr, int rev) ptr += TEXT_PIXEL_COLS/FONT_WIDTH+2; } - vesacon_update_characters(y0, x0, y1-y0+1, ncols); + vesacon_touch(y0, x0, y1-y0+1, ncols); } /* Scroll the screen up */ -void __vesacon_scroll_up(int nrows, uint8_t attr, int rev) +void __vesacon_scroll_up(int nrows, uint8_t attr) { struct vesa_char *fromptr = &__vesacon_text_display [(nrows+1)*(TEXT_PIXEL_COLS/FONT_WIDTH+2)]; @@ -197,52 +270,63 @@ void __vesacon_scroll_up(int nrows, uint8_t attr, int rev) struct vesa_char fill = { .ch = ' ', .attr = attr, - .sha = rev, }; - asm volatile("cld ; rep ; movsl" - : "+D" (toptr), "+S" (fromptr), "+c" (dword_count)); + toptr = copy_dword(toptr, fromptr, dword_count); dword_count = nrows*(TEXT_PIXEL_COLS/FONT_WIDTH+2); - /* Danger, Will Robinson: this is wrong if rev != SHADOW_NORMAL */ vesacon_fill(toptr, fill, dword_count); - - vesacon_update_characters(0, 0, __vesacon_text_rows, - TEXT_PIXEL_COLS/FONT_WIDTH); + + vesacon_touch(0, 0, __vesacon_text_rows, TEXT_PIXEL_COLS/FONT_WIDTH); } -/* Draw text at a specific area of the screen */ -void __vesacon_write_at(int x, int y, const char *str, - uint8_t attr, int rev) +/* Draw one character text at a specific area of the screen */ +void __vesacon_write_char(int x, int y, uint8_t ch, uint8_t attr) { - int n = 0; struct vesa_char *ptr = &__vesacon_text_display [(y+1)*(TEXT_PIXEL_COLS/FONT_WIDTH+2)+(x+1)]; - while (*str) { - ptr->ch = *str; - ptr->attr = attr; - ptr->sha = rev; - - n++; - str++; - ptr++; - } + ptr->ch = ch; + ptr->attr = attr; - vesacon_update_characters(y, x, 1, n); + vesacon_touch(y, x, 1, 1); } -/* Draw one character text at a specific area of the screen */ -void __vesacon_write_char(int x, int y, char ch, uint8_t attr, int rev) +void __vesacon_set_cursor(int x, int y, int visible) { struct vesa_char *ptr = &__vesacon_text_display [(y+1)*(TEXT_PIXEL_COLS/FONT_WIDTH+2)+(x+1)]; - ptr->ch = ch; - ptr->attr = attr; - ptr->sha = rev; + if (cursor_pointer) + vesacon_touch(cursor_y, cursor_x, 1, 1); + + if (!visible) { + /* Invisible cursor */ + cursor_pointer = NULL; + } else { + cursor_pointer = ptr; + vesacon_touch(y, x, 1, 1); + } + + cursor_x = x; + cursor_y = y; +} + +void __vesacon_init_cursor(int font_height) +{ + int r0 = font_height - (font_height < 10 ? 2 : 3); + + if (r0 < 0) + r0 = 0; - vesacon_update_characters(y, x, 1, 1); + /* cursor_pattern is assumed to be all zero */ + cursor_pattern[r0] = 0xff; + cursor_pattern[r0+1] = 0xff; } +void __vesacon_redraw_text(void) +{ + vesacon_update_characters(0, 0, __vesacon_text_rows, + TEXT_PIXEL_COLS/FONT_WIDTH); +} diff --git a/com32/lib/sys/vesa/drawtxt.o b/com32/lib/sys/vesa/drawtxt.o dissimilarity index 99% index 9e9def6285ed5c8fc032febac6cb78478d4d808a..c9855974c4bf38259de614183c38eb2ce667bf80 100644 GIT binary patch literal 18552 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
itYi4MWl%^u1LH_%O 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 +#include "video.h" + +/* Format a pixel and return the advanced pointer. + THIS FUNCTION IS ALLOWED TO WRITE BEYOND THE END OF THE PIXEL. */ + +static inline __attribute__((always_inline)) + void *format_pixel(void *ptr, uint32_t bgra, enum vesa_pixel_format fmt) +{ + switch (fmt) { + case PXF_BGRA32: + *(uint32_t *)ptr = bgra; + ptr = (uint32_t *)ptr + 1; + break; + + case PXF_BGR24: + *(uint32_t *)ptr = bgra; + ptr = (uint8_t *)ptr + 3; + break; + + case PXF_LE_RGB16_565: + { + uint16_t pxv = + ((bgra >> 3) & 0x1f) + + ((bgra >> (2+8-5)) & (0x3f << 5)) + + ((bgra >> (3+16-11)) & (0x1f << 11)); -/* Attribute/color table used by ansicon and vesacon to abstract - out the color selection. */ + *(uint16_t *)ptr = pxv; + ptr = (uint16_t *)ptr + 1; + } + break; -struct color_table { - const char *name; /* Attribute name (used for customization) */ - const char *ansi; /* ANSI attribute */ - unsigned int argb_fg; /* ARGB for foreground */ - unsigned int argb_bg; /* ARGB for background */ -}; + case PXF_NONE: /* Shuts up gcc */ + break; + } -extern struct color_table *console_color_table; -extern int console_color_table_size; + return ptr; +} -#endif /* _COLORTBL_H */ +#endif /* LIB_SYS_VESA_FMTPIXEL_H */ diff --git a/com32/lib/sys/vesa/initvesa.c b/com32/lib/sys/vesa/initvesa.c index 82c99406..35084449 100644 --- a/com32/lib/sys/vesa/initvesa.c +++ b/com32/lib/sys/vesa/initvesa.c @@ -41,20 +41,24 @@ #include #include "vesa.h" #include "video.h" +#include "fill.h" struct vesa_info __vesa_info; struct vesa_char *__vesacon_text_display; int __vesacon_font_height, __vesacon_text_rows; +enum vesa_pixel_format __vesacon_pixel_format = PXF_NONE; +unsigned int __vesacon_bytes_per_pixel; uint8_t __vesacon_graphics_font[FONT_MAX_CHARS][FONT_MAX_HEIGHT]; uint32_t __vesacon_background[VIDEO_Y_SIZE][VIDEO_X_SIZE]; ssize_t __serial_write(void *fp, const void *buf, size_t count); -static void debug(const char *str, ...) +static inline void debug(const char *str, ...) { +#if 0 va_list va; char buf[65536]; size_t len; @@ -66,7 +70,10 @@ static void debug(const char *str, ...) if (len >= sizeof buf) len = sizeof buf - 1; - //__serial_write(NULL, buf, len); + __serial_write(NULL, buf, len); +#else + (void)str; +#endif } static void unpack_font(uint8_t *dst, uint8_t *src, int height) @@ -86,9 +93,10 @@ static int vesacon_set_mode(void) { com32sys_t rm; uint8_t *rom_font; - uint16_t mode, *mode_ptr; + uint16_t mode, bestmode, *mode_ptr; struct vesa_general_info *gi; struct vesa_mode_info *mi; + enum vesa_pixel_format pxf, bestpxf; /* Allocate space in the bounce buffer for these structures */ gi = &((struct vesa_info *)__com32.cs_bounce)->gi; @@ -112,13 +120,15 @@ static int vesacon_set_mode(void) return 3; /* VESA 2.0 not supported */ } + /* Copy general info */ + memcpy(&__vesa_info.gi, gi, sizeof *gi); + /* Search for a 640x480 32-bit linear frame buffer mode */ mode_ptr = GET_PTR(gi->video_mode_ptr); + bestmode = 0; + bestpxf = PXF_NONE; - for(;;) { - if ((mode = *mode_ptr++) == 0xFFFF) - return 4; /* No mode found */ - + while ((mode = *mode_ptr++) != 0xFFFF) { debug("Found mode: 0x%04x\r\n", mode); rm.eax.w[0] = 0x4F01; /* Get SVGA mode information */ @@ -138,42 +148,89 @@ static int vesacon_set_mode(void) /* Must be an LFB color graphics mode supported by the hardware */ if ( (mi->mode_attr & 0x0099) != 0x0099 ) continue; + /* Must be 640x480, 32 bpp */ - if ( mi->h_res != VIDEO_X_SIZE || mi->v_res != VIDEO_Y_SIZE || - mi->bpp != 32 ) + if ( mi->h_res != VIDEO_X_SIZE || mi->v_res != VIDEO_Y_SIZE ) continue; + /* Must either be a packed-pixel mode or a direct color mode (depending on VESA version ) */ - if ( mi->memory_layout != 4 && /* Packed pixel */ - (mi->memory_layout != 6 || mi->rpos != 16 || - mi->gpos != 8 || mi->bpos != 0) ) - continue; - - /* Hey, looks like we found something we can live with */ - break; + pxf = PXF_NONE; /* Not usable */ + + if (mi->bpp == 32 && + (mi->memory_layout == 4 || + (mi->memory_layout == 6 && mi->rpos == 16 && mi->gpos == 8 && + mi->bpos == 0))) + pxf = PXF_BGRA32; + else if (mi->bpp == 24 && + (mi->memory_layout == 4 || + (mi->memory_layout == 6 && mi->rpos == 16 && mi->gpos == 8 && + mi->bpos == 0))) + pxf = PXF_BGR24; + else if (mi->bpp == 16 && + (mi->memory_layout == 4 || + (mi->memory_layout == 6 && mi->rpos == 11 && mi->gpos == 5 && + mi->bpos == 0))) + pxf = PXF_LE_RGB16_565; + + if (pxf < bestpxf) { + debug("Best mode so far, pxf = %d\n", pxf); + + /* Best mode so far... */ + bestmode = mode; + bestpxf = pxf; + + /* Copy mode info */ + memcpy(&__vesa_info.mi, mi, sizeof *mi); + } } - /* Download the BIOS-provided font */ - rm.eax.w[0] = 0x1130; /* Get Font Information */ - rm.ebx.w[0] = 0x0600; /* Get 8x16 ROM font */ - __intcall(0x10, &rm, &rm); - rom_font = MK_PTR(rm.es, rm.ebp.w[0]); - __vesacon_font_height = 16; - unpack_font((uint8_t *)__vesacon_graphics_font, rom_font, 16); + if (bestpxf == PXF_NONE) + return 4; /* No mode found */ + + mi = &__vesa_info.mi; + mode = bestmode; + __vesacon_bytes_per_pixel = mi->bpp >> 3; + + /* Download the SYSLINUX- or BIOS-provided font */ + rm.eax.w[0] = 0x0018; /* Query custom font */ + __intcall(0x22, &rm, &rm); + if (!(rm.eflags.l & EFLAGS_CF) && rm.eax.b[0]) { + __vesacon_font_height = rm.eax.b[0]; + rom_font = MK_PTR(rm.es, rm.ebx.w[0]); + } else { + rm.eax.w[0] = 0x1130; /* Get Font Information */ + rm.ebx.w[0] = 0x0600; /* Get 8x16 ROM font */ + __intcall(0x10, &rm, &rm); + rom_font = MK_PTR(rm.es, rm.ebp.w[0]); + __vesacon_font_height = 16; + } + unpack_font((uint8_t *)__vesacon_graphics_font, rom_font, + __vesacon_font_height); __vesacon_text_rows = (VIDEO_Y_SIZE-2*VIDEO_BORDER)/__vesacon_font_height; + __vesacon_init_cursor(__vesacon_font_height); /* Now set video mode */ rm.eax.w[0] = 0x4F02; /* Set SVGA video mode */ rm.ebx.w[0] = mode | 0x4000; /* Clear video RAM, use linear fb */ __intcall(0x10, &rm, &rm); - if ( rm.eax.w[0] != 0x004F ) { - rm.eax.w[0] = 0x0003; /* Set regular text mode */ - __intcall(0x10, &rm, NULL); + if ( rm.eax.w[0] != 0x004F ) return 9; /* Failed to set mode */ - } - /* Copy established state out of the bounce buffer */ - memcpy(&__vesa_info, __com32.cs_bounce, sizeof __vesa_info); + /* Tell syslinux we changed video mode */ + rm.eax.w[0] = 0x0017; /* Report video mode change */ + /* In theory this should be: + + rm.ebx.w[0] = (mi->mode_attr & 4) ? 0x0007 : 0x000f; + + However, that would assume all systems that claim to handle text + output in VESA modes actually do that... */ + rm.ebx.w[0] = 0x000f; + rm.ecx.w[0] = VIDEO_X_SIZE; + rm.edx.w[0] = VIDEO_Y_SIZE; + __intcall(0x22, &rm, NULL); + + __vesacon_pixel_format = bestpxf; return 0; } @@ -183,6 +240,10 @@ static int init_text_display(void) { size_t nchars; struct vesa_char *ptr; + struct vesa_char def_char = { + .ch = ' ', + .attr = 0, + }; nchars = (TEXT_PIXEL_ROWS/__vesacon_font_height+2)* (TEXT_PIXEL_COLS/FONT_WIDTH+2); @@ -192,11 +253,8 @@ static int init_text_display(void) if (!ptr) return -1; - /* I really which C had a memset() for larger-than-bytes objects... */ - asm volatile("cld; rep; stosl" - : "+D" (ptr), "+c" (nchars) - : "a" (' '+(0 << 8)+(SHADOW_NORMAL << 16)) - : "memory"); + + vesacon_fill(ptr, def_char, nchars); return 0; } diff --git a/com32/lib/sys/vesa/initvesa.o b/com32/lib/sys/vesa/initvesa.o dissimilarity index 98% index ce3c2653b1dae26b9cd330028320b981504183d8..6ea72f9332c1c90eb76af72541b673b352c87dae 100644 GIT binary patch literal 10148 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 literal 10012 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 + #define FONT_MAX_CHARS 256 #define FONT_MAX_HEIGHT 32 #define FONT_WIDTH 8 @@ -39,33 +41,41 @@ #define TEXT_PIXEL_ROWS (VIDEO_Y_SIZE-2*VIDEO_BORDER) #define TEXT_PIXEL_COLS (VIDEO_X_SIZE-2*VIDEO_BORDER) -#define SHADOW_NONE 0 -#define SHADOW_ALL 1 -#define SHADOW_NORMAL 2 -#define SHADOW_REVERSE 3 - struct vesa_char { uint8_t ch; /* Character */ - uint8_t attr; /* PC-style graphics attribute */ - uint8_t sha; /* Shadow attributes */ - uint8_t pad; /* Currently unused */ + uint8_t attr; /* Color table index */ +}; + +/* Pixel formats in order of decreasing preference; PXF_NONE should be last */ +/* BGR24 is preferred over BGRA32 since the I/O overhead is smaller. */ +enum vesa_pixel_format { + PXF_BGR24, /* 24-bit BGR */ + PXF_BGRA32, /* 32-bit BGRA */ + PXF_LE_RGB16_565, /* 16-bit littleendian 5:6:5 RGB */ + PXF_NONE }; extern struct vesa_char *__vesacon_text_display; extern int __vesacon_font_height, __vesacon_text_rows; +extern enum vesa_pixel_format __vesacon_pixel_format; +extern unsigned int __vesacon_bytes_per_pixel; extern uint8_t __vesacon_graphics_font[FONT_MAX_CHARS][FONT_MAX_HEIGHT]; extern uint32_t __vesacon_background[VIDEO_Y_SIZE][VIDEO_X_SIZE]; extern uint32_t __vesacon_shadowfb[VIDEO_Y_SIZE][VIDEO_X_SIZE]; -extern unsigned char __vesacon_alpha_tbl[256][4]; +extern const uint16_t __vesacon_srgb_to_linear[256]; +extern const uint8_t __vesacon_linear_to_srgb[4080]; int __vesacon_init_background(void); int vesacon_load_background(const char *); int __vesacon_init(void); -void __vesacon_erase(int, int, int, int, uint8_t, int); -void __vesacon_scroll_up(int, uint8_t, int); -void __vesacon_write_at(int, int, const char *, uint8_t, int); -void __vesacon_write_char(int, int, char, uint8_t, int); +void __vesacon_init_cursor(int); +void __vesacon_erase(int, int, int, int, uint8_t); +void __vesacon_scroll_up(int, uint8_t); +void __vesacon_write_char(int, int, uint8_t, uint8_t); +void __vesacon_redraw_text(void); +void __vesacon_doit(void); +void __vesacon_set_cursor(int, int, int); #endif /* LIB_SYS_VESA_VIDEO_H */ diff --git a/com32/lib/sys/vesacon_write.c b/com32/lib/sys/vesacon_write.c dissimilarity index 74% index e0d47f3f..87f70666 100644 --- a/com32/lib/sys/vesacon_write.c +++ b/com32/lib/sys/vesacon_write.c @@ -1,549 +1,171 @@ -/* ----------------------------------------------------------------------- * - * - * Copyright 2004-2006 H. Peter Anvin - All Rights Reserved - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall - * be included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * ----------------------------------------------------------------------- */ - -/* - * vesacon_write.c - * - * Write to the screen using ANSI control codes (about as capable as - * DOS' ANSI.SYS.) - */ - -#include -#include -#include -#include -#include -#include -#include "file.h" -#include "vesa/video.h" - -struct curxy { - uint8_t x, y; -} __attribute__((packed)); - -enum ansi_state { - st_init, /* Normal (no ESC seen) */ - st_esc, /* ESC seen */ - st_csi, /* CSI seen */ - st_soh, /* SOH seen */ - st_sohc, /* SOH # seen */ - st_sohc1, /* SOH # digit seen */ -}; - -#define MAX_PARMS 16 - -struct term_state { - int disabled; - int attr; /* Current display attribute */ - int vtgraphics; /* VT graphics on/off */ - int intensity; - int underline; - int blink; - int reverse; - int fg; - int bg; - int autocr; - struct curxy saved_xy; - uint16_t cursor_type; - enum ansi_state state; - int pvt; /* Private code? */ - int nparms; /* Number of parameters seen */ - int parms[MAX_PARMS]; - struct curxy xy; -}; - -static const struct term_state default_state = -{ - .disabled = 0, - .attr = 0, /* First color table entry */ - .vtgraphics = 0, - .intensity = 1, - .underline = 0, - .blink = 0, - .reverse = 0, - .fg = 7, - .bg = 0, - .autocr = 0, - .saved_xy = { 0, 0 }, - .cursor_type = 0x0607, - .state = st_init, - .pvt = 0, - .nparms = 0, - .xy = { 0, 0 }, -}; - -static struct term_state st; - -/* DEC VT graphics to codepage 437 table (characters 0x60-0x7F only) */ -static const char decvt_to_cp437[] = - { 0004, 0261, 0007, 0007, 0007, 0007, 0370, 0361, 0007, 0007, 0331, 0277, 0332, 0300, 0305, 0304, - 0304, 0304, 0137, 0137, 0303, 0264, 0301, 0302, 0263, 0363, 0362, 0343, 0330, 0234, 0007, 00 }; - -/* Reference counter to the screen, to keep track of if we need reinitialization. */ -static int vesacon_counter = 0; - -/* Common setup */ -int __vesacon_open(struct file_info *fp) -{ - static com32sys_t ireg; /* Auto-initalized to all zero */ - com32sys_t oreg; - - (void)fp; - - if (!vesacon_counter) { - /* Initial state */ - memcpy(&st, &default_state, sizeof st); - - /* Are we disabled? */ - ireg.eax.w[0] = 0x000b; - __intcall(0x22, &ireg, &oreg); - - if ( (signed char)oreg.ebx.b[1] < 0 ) { - st.disabled = 1; - } else { - /* Switch mode */ - if (__vesacon_init()) - return EIO; - } - } - - vesacon_counter++; - return 0; -} - -int __vesacon_close(struct file_info *fp) -{ - (void)fp; - - vesacon_counter--; - return 0; -} - -/* Erase a region of the screen */ -static void vesacon_erase(int x0, int y0, int x1, int y1) -{ - __vesacon_erase(x0, y0, x1, y1, st.attr, - st.reverse ? SHADOW_ALL : SHADOW_NORMAL); -} - -/* Show or hide the cursor */ -static void showcursor(int yes) -{ - (void)yes; - /* Do something here */ -} - -static void vesacon_putchar(int ch) -{ - const int rows = __vesacon_text_rows; - const int cols = TEXT_PIXEL_COLS/FONT_WIDTH; - struct curxy xy = st.xy; - - switch ( st.state ) { - case st_init: - switch ( ch ) { - case 1: - st.state = st_soh; - break; - case '\b': - if ( xy.x > 0 ) xy.x--; - break; - case '\t': - { - int nsp = 8 - (xy.x & 7); - while ( nsp-- ) - vesacon_putchar(' '); - } - return; /* Cursor already updated */ - case '\n': - case '\v': - case '\f': - xy.y++; - if ( st.autocr ) - xy.x = 0; - break; - case '\r': - xy.x = 0; - break; - case 127: - /* Ignore delete */ - break; - case 14: - st.vtgraphics = 1; - break; - case 15: - st.vtgraphics = 0; - break; - case 27: - st.state = st_esc; - break; - default: - /* Print character */ - if ( ch >= 32 ) { - if ( st.vtgraphics && (ch & 0xe0) == 0x60 ) - ch = decvt_to_cp437[ch - 0x60]; - - __vesacon_write_char(xy.x, xy.y, ch, st.attr, - st.reverse ? SHADOW_ALL : SHADOW_NORMAL); - xy.x++; - } - break; - } - break; - - case st_esc: - switch ( ch ) { - case '%': - case '(': - case ')': - case '#': - /* Ignore this plus the subsequent character, allows - compatibility with Linux sequence to set charset */ - break; - case '[': - st.state = st_csi; - st.nparms = st.pvt = 0; - memset(st.parms, 0, sizeof st.parms); - break; - case 'c': - /* Reset terminal */ - memcpy(&st, &default_state, sizeof st); - vesacon_erase(0, 0, cols-1, rows-1); - xy.x = xy.y = 1; - st.state = st_init; - break; - default: - /* Ignore sequence */ - st.state = st_init; - break; - } - break; - - case st_csi: - { - int p0 = st.parms[0] ? st.parms[0] : 1; - - if ( ch >= '0' && ch <= '9' ) { - st.parms[st.nparms] = st.parms[st.nparms]*10 + (ch-'0'); - } else if ( ch == ';' ) { - st.nparms++; - if ( st.nparms >= MAX_PARMS ) - st.nparms = MAX_PARMS-1; - break; - } else if ( ch == '?' ) { - st.pvt = 1; - } else { - switch ( ch ) { - case 'A': - { - int y = xy.y - p0; - xy.y = (y < 0) ? 0 : y; - } - break; - case 'B': - { - int y = xy.y + p0; - xy.y = (y >= rows) ? rows-1 : y; - } - break; - case 'C': - { - int x = xy.x + p0; - xy.x = (x >= cols) ? cols-1 : x; - } - break; - case 'D': - { - int x = xy.x - p0; - xy.x = (x < 0) ? 0 : x; - } - break; - case 'E': - { - int y = xy.y + p0; - xy.y = (y >= rows) ? rows-1 : y; - xy.x = 0; - } - break; - case 'F': - { - int y = xy.y - p0; - xy.y = (y < 0) ? 0 : y; - xy.x = 0; - } - break; - case 'G': - case '\'': - { - int x = st.parms[0] - 1; - xy.x = (x >= cols) ? cols-1 : (x < 0) ? 0 : x; - } - break; - case 'H': - case 'f': - { - int y = st.parms[0] - 1; - int x = st.parms[1] - 1; - - xy.x = (x >= cols) ? cols-1 : (x < 0) ? 0 : x; - xy.y = (y >= rows) ? rows-1 : (y < 0) ? 0 : y; - } - break; - case 'J': - { - switch ( st.parms[0] ) { - case 0: - vesacon_erase(xy.x, xy.y, cols-1, xy.y); - if ( xy.y < rows-1 ) - vesacon_erase(0, xy.y+1, cols-1, rows-1); - break; - - case 1: - if ( xy.y > 0 ) - vesacon_erase(0, 0, cols-1, xy.y-1); - if ( xy.y > 0 ) - vesacon_erase(0, xy.y, xy.x-1, xy.y); - break; - - case 2: - vesacon_erase(0, 0, cols-1, rows-1); - break; - - default: - /* Ignore */ - break; - } - } - break; - case 'K': - { - switch ( st.parms[0] ) { - case 0: - vesacon_erase(xy.x, xy.y, cols-1, xy.y); - break; - - case 1: - if ( xy.x > 0 ) - vesacon_erase(0, xy.y, xy.x-1, xy.y); - break; - - case 2: - vesacon_erase(0, xy.y, cols-1, xy.y); - break; - - default: - /* Ignore */ - break; - } - } - break; - case 'h': - case 'l': - { - int set = (ch == 'h'); - switch ( st.parms[0] ) { - case 20: - st.autocr = set; - break; - case 25: - showcursor(set); - break; - default: - /* Ignore */ - break; - } - } - break; - case 'm': - { - static const int ansi2pc[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; - - int i; - for ( i = 0 ; i <= st.nparms ; i++ ) { - int a = st.parms[i]; - switch ( a ) { - case 0: - st.fg = 7; - st.bg = 0; - st.intensity = 1; - st.underline = 0; - st.blink = 0; - st.reverse = 0; - break; - case 1: - st.intensity = 2; - break; - case 2: - st.intensity = 0; - break; - case 4: - st.underline = 1; - break; - case 5: - st.blink = 1; - break; - case 7: - st.reverse = 1; - break; - case 21: - case 22: - st.intensity = 1; - break; - case 24: - st.underline = 0; - break; - case 25: - st.blink = 0; - break; - case 27: - st.reverse = 0; - break; - case 30 ... 37: - st.fg = ansi2pc[a-30]; - break; - case 38: - st.fg = 7; - st.underline = 1; - break; - case 39: - st.fg = 7; - st.underline = 0; - break; - case 40 ... 47: - st.bg = ansi2pc[a-40]; - break; - case 49: - st.bg = 7; - break; - default: - /* Do nothing */ - break; - } - } - } - break; - case 's': - st.saved_xy = xy; - break; - case 'u': - xy = st.saved_xy; - break; - default: /* Includes CAN and SUB */ - break; /* Drop unknown sequence */ - } - st.state = st_init; - } - } - break; - - case st_soh: - if ( ch == '#' ) - st.state = st_sohc; - else - st.state = st_init; - break; - - case st_sohc: - { - int n = (unsigned char)ch - '0'; - if (n < 10) { - st.parms[0] = n*10; - st.state = st_sohc1; - } else { - st.state = st_init; - } - } - break; - - case st_sohc1: - { - int n = (unsigned char)ch - '0'; - const char *p; - - if (n < 10) { - st.parms[0] += n; - if (st.parms[0] < console_color_table_size) { - /* Set the color table index */ - st.attr = st.parms[0]; - - /* See if there are any other attributes we care about */ - p = console_color_table[st.parms[0]].ansi; - st.state = st_esc; - vesacon_putchar('['); - while (*p) - vesacon_putchar(*p++); - vesacon_putchar('m'); - } - } - - st.state = st_init; - } - break; - } - - /* If we fell off the end of the screen, adjust */ - if ( xy.x >= cols ) { - xy.x = 0; - xy.y++; - } - while ( xy.y >= rows ) { - xy.y--; - __vesacon_scroll_up(1, st.attr, st.reverse ? SHADOW_ALL : SHADOW_NORMAL); - } - - /* Update cursor position */ - /* vesacon_set_cursor(xy.x, xy.y); */ - st.xy = xy; -} - - -ssize_t __vesacon_write(struct file_info *fp, const void *buf, size_t count) -{ - const unsigned char *bufp = buf; - size_t n = 0; - - (void)fp; - - if ( st.disabled ) - return n; /* Nothing to do */ - - while ( count-- ) { - vesacon_putchar(*bufp++); - n++; - } - - return n; -} - -const struct output_dev dev_vesacon_w = { - .dev_magic = __DEV_MAGIC, - .flags = __DEV_TTY | __DEV_OUTPUT, - .fileflags = O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, - .write = __vesacon_write, - .close = __vesacon_close, - .open = __vesacon_open, -}; +/* ----------------------------------------------------------------------- * + * + * Copyright 2004-2006 H. Peter Anvin - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall + * be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * ----------------------------------------------------------------------- */ + +/* + * vesacon_write.c + * + * Write to the screen using ANSI control codes (about as capable as + * DOS' ANSI.SYS.) + */ + +#include +#include +#include +#include +#include +#include +#include +#include "ansi.h" +#include "file.h" +#include "vesa/video.h" + +static void vesacon_erase(const struct term_state *, int, int, int, int); +static void vesacon_write_char(int, int, uint8_t, const struct term_state *); +static void vesacon_showcursor(const struct term_state *); +static void vesacon_scroll_up(const struct term_state *); + +static struct term_state ts; +static struct ansi_ops op = { + .erase = vesacon_erase, + .write_char = vesacon_write_char, + .showcursor = vesacon_showcursor, + .set_cursor = __vesacon_set_cursor, /* in drawtxt.c */ + .scroll_up = vesacon_scroll_up, +}; + +static struct term_info ti = + { + .cols = TEXT_PIXEL_COLS/FONT_WIDTH, + .disabled = 0, + .ts = &ts, + .op = &op + }; + +/* Reference counter to the screen, to keep track of if we need reinitialization. */ +static int vesacon_counter = 0; + +/* Common setup */ +int __vesacon_open(struct file_info *fp) +{ + static com32sys_t ireg; /* Auto-initalized to all zero */ + com32sys_t oreg; + + (void)fp; + + if (!vesacon_counter) { + /* Are we disabled? */ + ireg.eax.w[0] = 0x000b; + __intcall(0x22, &ireg, &oreg); + + if ( (signed char)oreg.ebx.b[1] < 0 ) { + ti.disabled = 1; + } else { + /* Switch mode */ + if (__vesacon_init()) { + vesacon_counter = -1; + return EAGAIN; + } + + /* Initial state */ + __ansi_init(&ti); + ti.rows = __vesacon_text_rows; + } + } else if (vesacon_counter == -1) { + return EAGAIN; + } + + fp->o.rows = ti.rows; + fp->o.cols = ti.cols; + + vesacon_counter++; + return 0; +} + +int __vesacon_close(struct file_info *fp) +{ + (void)fp; + + vesacon_counter--; + return 0; +} + +/* Erase a region of the screen */ +static void vesacon_erase(const struct term_state *st, + int x0, int y0, int x1, int y1) +{ + __vesacon_erase(x0, y0, x1, y1, st->cindex); +} + +/* Draw text on the screen */ +static void vesacon_write_char(int x, int y, uint8_t ch, + const struct term_state *st) +{ + __vesacon_write_char(x, y, ch, st->cindex); +} + +/* Show or hide the cursor */ +static void vesacon_showcursor(const struct term_state *st) +{ + __vesacon_set_cursor(st->xy.x, st->xy.y, st->cursor); +} + +static void vesacon_scroll_up(const struct term_state *st) +{ + __vesacon_scroll_up(1, st->cindex); +} + +ssize_t __vesacon_write(struct file_info *fp, const void *buf, size_t count) +{ + const unsigned char *bufp = buf; + size_t n = 0; + + (void)fp; + + if ( ti.disabled ) + return n; /* Nothing to do */ + + /* This only updates the shadow text buffer... */ + while ( count-- ) { + __ansi_putchar(&ti, *bufp++); + n++; + } + + /* This actually draws it */ + __vesacon_doit(); + + return n; +} + +const struct output_dev dev_vesacon_w = { + .dev_magic = __DEV_MAGIC, + .flags = __DEV_TTY | __DEV_OUTPUT, + .fileflags = O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, + .write = __vesacon_write, + .close = __vesacon_close, + .open = __vesacon_open, + .fallback = &dev_ansicon_w, +}; diff --git a/com32/lib/sys/vesaserial_write.c b/com32/lib/sys/vesaserial_write.c index fa434c3b..e9696cb2 100644 --- a/com32/lib/sys/vesaserial_write.c +++ b/com32/lib/sys/vesaserial_write.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "file.h" extern int __vesacon_open(void); @@ -55,4 +56,5 @@ const struct output_dev dev_vesaserial_w = { .write = __vesaserial_write, .close = __vesacon_close, .open = __vesacon_open, + .fallback = &dev_ansiserial_w, }; diff --git a/com32/lib/sys/xserial_write.c b/com32/lib/sys/xserial_write.c index 6b3fbaf9..f119083a 100644 --- a/com32/lib/sys/xserial_write.c +++ b/com32/lib/sys/xserial_write.c @@ -98,6 +98,8 @@ ssize_t __xserial_write(struct file_info *fp, const void *buf, size_t count) if (ncolor < console_color_table_size) { emit('\033'); emit('['); + emit('0'); + emit(';'); for (p = console_color_table[ncolor].ansi; *p; p++) emit(*p); emit('m'); diff --git a/com32/libutil/libutil_com.a b/com32/libutil/libutil_com.a index c8ab2841dd248e9923733af605e172c9c2a11649..275a011d126e74320abbe7e15daed4a1d0801314 100644 GIT binary patch delta 146 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 N2aA{hgMx|#0{~6hqGkX9 delta 444 zcwXy}?vNJP@!#jH;vd5U`#WR>7 zAuYi0!fNtnW;>Dpj0_B&$2sq}ekRk)lb^HRWK`IEkS&R+ z{%Y%iQWnDlubI0YSX$o#nU{dfP?m28nM*i0FMPkydZL8?I4g_10D~9<1H;QUAYu4z zw*rvgY|T*0)?CfPP$K2l{7<2Tqw%nU0|UeB=Md!*K$Wkfjx+xOdg8b;sFW* zDUcjPud_m@^W-UN40QBe&`Ffem8w!&@aoRHdk)CYGCCaEU*_|tQ^8qdyM*9G90R|X&{zZTR s7=8?EP{cUEVkuI{Vmu5^Yz#mT2~2k6Rom>yW6#JTASS?|pe(@v07I0Q2mk;8 diff --git a/com32/modules/cpuidtest.c32 b/com32/modules/cpuidtest.c32 index f1d006953f1644ce76ec893158364e0ee2876389..2d5b16a7f726360c40b6df91b2dc0e2d55f62cf2 100755 GIT binary patch delta 303 zcwTGqYw;7<@!#jH;vd5U`&rBd7Y!r|aVN{>2FEWu)WAj0gUyNecS`U=67#?`d z-0i^9`VGju1Z0Lyz9=SH-@(AZVEA@-15j(THA5*|b2SS?iIi*eUxgBm#={y83=FTI zA7@PgN=pD$zK%K0tf3>oaNL>221xZfD|9-`wEiy<><$-by;Q={dE@^jpj}#>)~(-4 zjJv}?f)WtH5`pF)+@%8DWgrl+wuWyi@;8e$@j$zL{xM@2K*0EVR^mYdnYr{ doLwrLlO(eUyNc`TMv}77#?`d z-0i^9`WDE%1Z0Lzz9=SH-^ReeVEAo!15j(THA5*|b2SS?iIiLOKZO#G#={B@3=FTI zA7@PgN=pD$zK%N1tfC{paNL>20!;A$1%VVuj-l6Cq0?EW^?!+Acep_7r4o+L8~-l> zZIpeF8jyA1Cd&Fr9myAYd{htnL?;UW6Mu667tj3j$o@O z;w<29Ryv`l<76@>m551A+SJ5oAl3;&9B88{(Ukm*CMMDN>Jkf6htLYyo_imNt<0Rq z_kHi&bMJTWeP{P})4knP>WSWW);s0vd&lswM0y{2v{PD0pY1Ftp$~WNaS1i)uq(k$ z<<8SGje?JQ=|wP5nf7qJ4=NDoKYH6l4jquwNzH;pa%! zd7;bTh2sblRecnu1(^=Qkr*#M1Vu42ZQ-~I!iZOJY=v_%8N#@S5BM9Th#B-S_{D76 z3{QwIVTXq=)enb7S#al+XwcMaq7P4KiT3jGRoe%w$KgY1vJ+USEai&Bw&;5ku`gsXAycf4XxM71Xlb3z~ws=|igN^UQ(@>3MlS&HVB_wW6gefar zk53mqvhr8Q;0Fd-ct#~pK@*Y^mCT2JB!WsVfj&W|Cty*6kA|Qo!A18#bApGK!V3wq zkeSSrM7V-UpF??~m!5=$i86hbfa34CG>Be^>0cOexs7ju+5Z7OW=Shjb_4tDKj@}A|&*&k|hulc-OXZpknuEiykLi zUn`NGB77(zCr+!wgK6t)H218&2c@sUW44*k;?Vjo#$QI%v0rY560=vBFu{{%o9lv! zkBALjQjU#BqrF;Y;bqLm+4`W%?4aFn5}!f%#O!cAIhVa{3bSKa_JEpQ2BxHCc*{$Y za_M8xk|fh2IF#h4G4M6w&mi7XKo3BPMW#*glqHAW11};@gF(dC;U?n0KYBzlzPe}BxEbMgk7nzD(#P;p?@=!G%e^3)rl)`8<8tU&TPE|5hQHSE98PTtp zAm5%#KZPy!db~9k>`U>U8&ejPSmJI~aDK;=+dpH6KBecn7Ikq(|BmUGRXrB<(P>pr z#H*s5f!!&78ixLq6(!~RTQxV#~LL&*&3O_s-Q^Fr#bnawvKza(L-gsB_$n zCwJK4rfo2U$|G>ivCxsLBjo9rJ|#AAiH0q0mmiWyNBf`II4Ag=R=cRXRn;)1R=vR9 zjzX=|NrRjzBC5+HNzhF+H9UY z^uNhNw~|?73l6E{;HJBQj>Be8vh!1s-C1L66&mR^vI|>PA(3#AY*5~T7d>h9yy{<1 zU6TS|j)jKQ;$}IAHvkX4s8+Y4o&pa2HIU+H2~kH=g}WRj=Y~fe{@)O>#-yL^ZT7N z3wAF$M&CTTZ1Eb3XR~w359I-NKDu-woM>Bhp-Z+m)P@zxG%nMPSoJH638Qs z+CY;?8dBB-rc)bqy9cuT==SQM=01FlKLI52lfjrEHl4vjaeu7@H9mW3b||lHq9G?- zDYczzu!TO3o@?uCkOGtOjZ%241!uc*L=(}3wulkqK~@HD*h;JvI2#Qq8>^~+I#5{= znDp#QeylGGj{91Io7Eh`iKu`EXZRI0Y3 zRv1`%5ynalM-SwTI(OyYg&7!^F;?VCq!ptF@yJZ{--cPd_J6#4=KpiIX=gCrUnY@J zjB$+rV8kz%h##W_;~|WCjBU#$GbzuP$VQAhjLjI^!BxI^!{kbd%>G@yp&@r;(_O!6 tPE&PC*w4wEx9Pf69qKx+i-ot>Fz^}{=qg_Ym&=`oo&t%~JZj^a{{;fBQH%fp delta 2573 zcwS{y3sh9c8J@ZOU>6qm?n8E2_6ZlkM+^%MrbSLb9tnoDC?TdAAEYg%#wHTS-fuCyW^|c0aQPsUC0;_fy+p*Rme|O1+ga{8sEiHJY`~Y4?GKUkv;DoQ@ zQiKZ*{;C_kW0HiuD%k|}NGep41t*ZqP{{}w<0aY$^W%ebH>`>GP=IIReRLV@i=piN<5?erR}2X4oJe51ZKXC_aiv-c^2(}D7UL?_*rxo8=-;OL zx4~B;`nOK`w&Rv!4)$=R zNID9!QFgm=SOacMV^^KEBmZ8M{tZ5>(|XoINcDckk0NT>D>XogH6RF9SZ8&56btVW zBM&Lz>7TW@xdWkKY z)Lp|>V~Bvi5Sgqc9m7{Kv=G%g5B|+Xg9HiF-2lKUPo04 zz^Eh95{V-udRIE$ch%>aiWiCVKXdOz)qHH3PF9qHXf!IHXest9nW|_&asH&3r+8pt zVm7@5PbXI6S92~g6Tfq_Yj%l0cDjQ522XDKlx?~})%B=rC-oalA2o742KA8%RiA;M ziZTdWU3v7kaKiQ7l9k5knm?S(`H1Bd8K-OJPwHPY{f?V8XHV*S{5X`EP?!{;SD`9t z5$@cfBrk1+epH@-%SrQ+78wY6R@0@#gobF?-gt4jNLrfy#QLQ}(CtVR4bxRk<7(A& z?Cls-x*c=~Ho7zD8}O=o79Nlfv8{wLY`+ISj|cCuT+jV<0A$ZBdI%1Cd{l-3kAv2L z;#r+{MaMQMz2Um9Zedjz7kZ$oTQM~^u?vl3Lukm{+_YheYB^<>QfS!Ryr&+vdl%2) z$^G9u zce*c&q2W=vUoB2gH1A>MLl?Nj2B1C7``8en&&|!hW)q79<$-R+J~e4ID>P=VGcY3F zoYTPMoaXr-pr64e|3SQcyn!^_rQ*OZ=w5g`;Go;!Okfuc!`kFBymsD7UQFkLKBX2< zMtw>}+OmhrLnB(bNB&5Dhs{R_4Qu3X`Lpq>FUcQXZIcI=uUNIZXD38ba_~f@NqcGQ z(O$`Gq#?L)M=SM1-TZdib#(5XMU-BInvAsxXYd$ngIy6#I8WR7CBjn(E8t2-;+7^{ zqu|$Xt-*5>${}_7P`#Gax{5^FsINf#9Dm?R zB=}(ONK1iVE^s$SYc1hrV&kb=gFF~Lg(JJ>TiM}N=jcNIXY;c2~v{!o5`K1+v)*IiVhUv6x>0CDBQ*O5Q03KFah`RB)1nH z;S4tj1?>gr2TyC1&bM|%#! zI4FiPV2Y{^OH`R5?6C zh`C&`eqyngois02ETcOpsfhd~w%rnainuM^mR#x>O;;sBS!!3AE20di8`6*(?=-#Z zO^M3Qt|V2j_plp$D_BjdGR2#I=e-VFF^mHYFE6wea{-D6-5zb$ QodDE(e7Af3mWY@918M%#@Bjb+ delta 593 zcwSXeU279T6rH=-CaVUs$+oeEqMNiqlLs*su@Z#fil7L_k6MVdMexC5A2&~eHLNQP zK}eiGU@<~P(87YIh;?Hs30frvTY@i^`p`%$7E)@#*mz?p=se6l+;cf+&Yes!6BM(} zGw;2Pkol^|FOsRRfwb6b%k+pOu`!W8wQ6ne7D;wLQ{XI^j6n!qvp3*}8CHWKD6-Ss zQJ7`7xn3w4&pDZcPez4*%K2W}2#MuWsnogij%Q}H*^xzcZN{FDPETx#vqv^B{ATZL zX^`2VaKK8?sTyTzVK=zgV<8H%(GbQ#QBZ0M2qE+{U8x?n5~7>&zDcMCTLia7bRnUw zLwwI9R~7$bIIFR+-2)IYe(k7pFwK7K4DB1ZbV2*h(>$H0Z)q`C<+Mc$&CxH7`a}A$ zo}rc4<)PtxiiI717&opsZo=3c`tl*OW=TePeHmdHVL!i?v#7$h($A7!R2_x3Sq$n% z>u-1P3a!0ZXax_GxK+Es6V-E4+mKZuk(VQc)Rs2KJ8`lWD_BNx0|kY@^|#ouiKWGn zyNXPeXqVnpoyh@FFRKErG|TuL4-MApQvE zUf({d)Dc3Ln diff --git a/com32/modules/mboot.c32 b/com32/modules/mboot.c32 index da9b043975e2e896904e449c056211c0ad4baa15..33a1f45939ba15c7fad034ed26575bc5f71ce13b 100755 GIT binary patch delta 8977 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 UAUxNNABD*L2mn8RlWqn73x_YvV*mgE delta 8652 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 Wwt!oOu*8oqf-GPGz~6LH{(k`1JZSX* diff --git a/com32/modules/menu.c32 b/com32/modules/menu.c32 index 9926af064c7d432fc21192e25b7770931efaa812..6a7ad4006d315b1883873d0fa44046ae2159234c 100755 GIT binary patch delta 11746 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 delta 11140 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 free((void *)cp->ansi); - cp->name = dp->name; + *cp = *dp; cp->ansi = strdup(dp->ansi); - cp->argb_fg = dp->argb_fg; - cp->argb_bg = dp->argb_bg; cp++; dp++; @@ -845,15 +843,28 @@ execute(const char *cmdline) int menu_main(int argc, char *argv[]) { const char *cmdline; + int rows, cols; + int i; (void)argc; install_default_color_table(); - fputs("\1#00", stdout); + if (getscreensize(1, &rows, &cols)) { + /* Unknown screen size? */ + rows = 24; + cols = 80; + } + + WIDTH = cols; + parse_configs(argv+1); - parse_config(argv[1]); + /* If anyone has specified negative parameters, consider them + relative to the bottom row of the screen. */ + for (i = 0; mparm[i].name; i++) + if (mparm[i].value < 0) + mparm[i].value = max(mparm[i].value+rows, 0); - if (draw_background && menu_background) + if (draw_background) draw_background(menu_background); if ( !nentries ) { diff --git a/com32/modules/pci.c b/com32/modules/pci.c new file mode 100644 index 00000000..48fba303 --- /dev/null +++ b/com32/modules/pci.c @@ -0,0 +1,191 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2006 Erwan Velu - All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * pci.c + * + * A module to extract pci informations + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef DEBUG +# define dprintf printf +#else +# define dprintf(...) ((void)0) +#endif + +#define MAX_LINE 512 +static char * +skipspace(char *p) +{ + while ( *p && *p <= ' ' ) + p++; + + return p; +} + +void remove_eol(char *string) +{ + int j = strlen(string); + int i = 0; + for(i = 0; i < j; i++) if(string[i] == '\n') string[i] = 0; +} + +int hex_to_int(char *hexa) +{ + int i; + sscanf(hexa,"%x",&i); + return i; +} + +void get_name_from_pci_ids(s_pci_device *pci_device) +{ + char line[MAX_LINE]; + char *vendor=NULL; + char vendor_id[5]; + char *product=NULL; + char product_id[5]; + char sub_product_id[5]; + char sub_vendor_id[5]; + FILE *f; + + f=fopen("pci.ids","r"); + if (!f) + return; + + strcpy(pci_device->vendor_name,"Unknown"); + strcpy(pci_device->product_name,"Unknown"); + strcpy(vendor_id,"0000"); + strcpy(product_id,"0000"); + strcpy(sub_product_id,"0000"); + strcpy(sub_vendor_id,"0000"); + + + while ( fgets(line, sizeof line, f) ) { + if ((line[0] == '#') || (line[0] == ' ') || (line[0] == 'C') || (line[0] == 10)) + continue; + if (line[0] != '\t') { + strncpy(vendor_id,line,4); + vendor_id[4]=0; + vendor=strdup(skipspace(strstr(line," "))); + remove_eol(vendor); + strcpy(product_id,"0000"); + strcpy(sub_product_id,"0000"); + strcpy(sub_vendor_id,"0000"); + if (strstr(vendor_id,"ffff")) break; + if (hex_to_int(vendor_id)==pci_device->vendor) strcpy(pci_device->vendor_name,vendor); + } else if ((line[0] == '\t') && (line[1] != '\t')) { + product=strdup(skipspace(strstr(line," "))); + remove_eol(product); + strncpy(product_id,&line[1],4); + product_id[4]=0; + strcpy(sub_product_id,"0000"); + strcpy(sub_vendor_id,"0000"); + if ((hex_to_int(vendor_id)==pci_device->vendor) && (hex_to_int(product_id)==pci_device->product)) strcpy(pci_device->product_name,product); + } else if ((line[0] == '\t') && (line[1] == '\t')) { + product=skipspace(strstr(line," ")); + product=strdup(skipspace(strstr(product," "))); + remove_eol(product); + strncpy(sub_vendor_id,&line[2],4); + sub_vendor_id[4]=0; + strncpy(sub_product_id,&line[7],4); + sub_product_id[4]=0; + if ((hex_to_int(vendor_id)==pci_device->vendor) && (hex_to_int(product_id)==pci_device->product) && (hex_to_int(sub_product_id)==pci_device->sub_product) && (hex_to_int(sub_vendor_id)==pci_device->sub_vendor)) strcpy(pci_device->product_name,product); + } + } + fclose(f); +} + +int pci_scan(s_pci_bus_list *pci_bus_list, s_pci_device_list *pci_device_list) +{ + unsigned int bus, dev, func, maxfunc; + uint32_t did, sid; + uint8_t hdrtype, rid; + pciaddr_t a; + int cfgtype; + + pci_device_list->count=0; + +#ifdef DEBUG + outl(~0, 0xcf8); + printf("Poking at port CF8 = %#08x\n", inl(0xcf8)); + outl(0, 0xcf8); +#endif + + cfgtype = pci_set_config_type(PCI_CFG_AUTO); + (void)cfgtype; + + dprintf("PCI configuration type %d\n", cfgtype); + printf("Scanning PCI Buses\n"); + + for ( bus = 0 ; bus <= 0xff ; bus++ ) { + + dprintf("Probing bus 0x%02x... \n", bus); + + pci_bus_list->pci_bus[bus].id=bus; + pci_bus_list->pci_bus[bus].pci_device_count=0; + pci_bus_list->count=0;; + + for ( dev = 0 ; dev <= 0x1f ; dev++ ) { + maxfunc = 0; + for ( func = 0 ; func <= maxfunc ; func++ ) { + a = pci_mkaddr(bus, dev, func, 0); + + did = pci_readl(a); + + if ( did == 0xffffffff || did == 0xffff0000 || + did == 0x0000ffff || did == 0x00000000 ) + continue; + + hdrtype = pci_readb(a + 0x0e); + + if ( hdrtype & 0x80 ) + maxfunc = 7; /* Multifunction device */ + +// if ( hdrtype & 0x7f ) +// continue; /* Ignore bridge devices */ + + rid = pci_readb(a + 0x08); + sid = pci_readl(a + 0x2c); + s_pci_device *pci_device = &pci_device_list->pci_device[pci_device_list->count]; + pci_device->product=did>>16; + pci_device->sub_product=sid>>16; + pci_device->vendor=(did<<16)>>16; + pci_device->sub_vendor=(sid<<16)>>16; + pci_device->revision=rid; + pci_device_list->count++; + get_name_from_pci_ids(pci_device); + dprintf("Scanning: BUS %02x DID %08x (%04x:%04x) SID %08x RID %02x\n", bus, did, did>>16, (did<<16)>>16 , sid, rid); + /* Adding the detected pci device to the bus*/ + pci_bus_list->pci_bus[bus].pci_device[pci_bus_list->pci_bus[bus].pci_device_count]=pci_device; + pci_bus_list->pci_bus[bus].pci_device_count++; + } + } + } + + /* Detecting pci buses that have pci devices connected*/ + for (bus=0;bus<=0xff;bus++) { + + if (pci_bus_list->pci_bus[bus].pci_device_count>0) { + pci_bus_list->count++; + } + } + return 0; +} diff --git a/com32/modules/pcitest.c b/com32/modules/pcitest.c new file mode 100644 index 00000000..2b0b6be2 --- /dev/null +++ b/com32/modules/pcitest.c @@ -0,0 +1,70 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2006 Erwan Velu - All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 53 Temple Place Ste 330, + * Boston MA 02111-1307, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +/* + * pcitest.c + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef DEBUG +# define dprintf printf +#else +# define dprintf(...) ((void)0) +#endif + +char display_line; +#define moreprintf(...) do { display_line++; if (display_line == 24) { char tempbuf[10]; display_line=0; printf("Press enter to continue\n"); fgets(tempbuf, sizeof tempbuf, stdin);} printf ( __VA_ARGS__); } while (0); + +void display_pci_devices(s_pci_device_list *pci_device_list) { + int pci_dev; + for (pci_dev=0; pci_devcount;pci_dev++) { + s_pci_device *pci_device = &pci_device_list->pci_device[pci_dev]; + printf("PCI: Vendor=%04x Product=%04x Sub_vendor=%04x Sub_Product=%04x Release=%02x\n",pci_device->vendor,pci_device->product,pci_device->sub_vendor,pci_device->sub_product,pci_device->revision); + } + printf("PCI: %d devices found\n",pci_device_list->count); +} + +void display_pci_bus(s_pci_bus_list *pci_bus_list, bool display_pci_devices) { + int bus; + for (bus=0; buscount;bus++) { + s_pci_bus pci_bus = pci_bus_list->pci_bus[bus]; + printf("\nPCI BUS No %d:\n",pci_bus.id); + if (display_pci_devices) { + int pci_dev; + for (pci_dev=0;pci_devcount); +} + +int main(int argc, char *argv[]) +{ + s_pci_device_list pci_device_list; + s_pci_bus_list pci_bus_list; + openconsole(&dev_null_r, &dev_stdcon_w); + pci_scan(&pci_bus_list,&pci_device_list); +// display_pci_devices(&pci_device_list); + display_pci_bus(&pci_bus_list,true); + return 1; +} diff --git a/com32/modules/pcitest.c32 b/com32/modules/pcitest.c32 new file mode 100755 index 0000000000000000000000000000000000000000..609747ff49f92199f705452e74bb154f88ecbff9 GIT binary patch literal 10276 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

ie=(B?yZBM_b0V$ipAhMNH26V3 z=@y%`wS^ANFF|hhN z;@+Ve)0iaa$;MNXppBejeCO3%^${vStrIpnncu2xcT(ZpUMl%z0S@i+4t|3zNoAGx}^PeSQF*Tw5}Ou5dUlEh~$kp2?gNyw3_Yam$eLlnyUV7I|? z(@?od9NWq|bXRHdea5Aj-U;&Ld_r1z>Al{Pd2_w@t?_0ro0ukKS5M5YzG+N$?u43& z^t0%4>%p;U020e&RWCj{gZS{Ko+JiE|2vox2M6fAff_K*YZ`=!-v__~ZMFCwIw} zPtN5h4j9Xy8?W)$^fewD{Y!>_ga6gfwHOoc`1e|TIqyV6AX~fnx|rjywDpAV c|KDx@x1O$>6~Q+-lb^xqp`v5piv<$?3#-3O#Q*>R literal 0 HcwPel00001 diff --git a/com32/modules/readconfig.c b/com32/modules/readconfig.c index 0a779568..a0a78420 100644 --- a/com32/modules/readconfig.c +++ b/com32/modules/readconfig.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #ifdef __COM32__ # include @@ -275,31 +276,34 @@ dup_word(char **p) static int my_isxdigit(char c) { - unsigned char uc = c | 0x20; + unsigned int uc = c; - return (uc-'0') < 10 || (uc-'a') < 6; + return (uc-'0') < 10 || + ((uc|0x20)-'a') < 6; } static unsigned int hexval(char c) { unsigned char uc = c | 0x20; + unsigned int v; + + v = uc-'0'; + if (v < 10) + return v; - if (uc & 0x40) - return uc-'a'+10; - else - return uc-'0'; + return uc-'a'+10; } -static unsigned int hexval2(char *p) +static unsigned int hexval2(const char *p) { return (hexval(p[0]) << 4)+hexval(p[1]); } -static unsigned int parse_argb(char **p) +static uint32_t parse_argb(char **p) { char *sp = *p; char *ep; - unsigned int argb; + uint32_t argb; size_t len, dl; if (*sp == '#') @@ -316,27 +320,27 @@ static unsigned int parse_argb(char **p) switch(len) { case 3: /* #rgb */ argb = - 0xff000000 | - (hexval(sp[0])*0x11 << 16)| - (hexval(sp[1])*0x11 << 8) | - (hexval(sp[2])*0x11 << 0); + 0xff000000 + + (hexval(sp[0])*0x11 << 16) + + (hexval(sp[1])*0x11 << 8) + + (hexval(sp[2])*0x11); break; case 4: /* #argb */ argb = - (hexval(sp[0])*0x11 << 24)| - (hexval(sp[1])*0x11 << 16)| - (hexval(sp[2])*0x11 << 8) | - (hexval(sp[3])*0x11 << 0); + (hexval(sp[0])*0x11 << 24) + + (hexval(sp[1])*0x11 << 16) + + (hexval(sp[2])*0x11 << 8) + + (hexval(sp[3])*0x11); break; case 6: /* #rrggbb */ case 9: /* #rrrgggbbb */ case 12: /* #rrrrggggbbbb */ dl = len/3; argb = - 0xff000000 | - (hexval2(sp+0) << 16) | - (hexval2(sp+dl) << 8)| - (hexval2(sp+dl*2) << 0); + 0xff000000 + + (hexval2(sp+0) << 16) + + (hexval2(sp+dl) << 8) + + hexval2(sp+dl*2); break; case 8: /* #aarrggbb */ /* 12 is indistinguishable from #rrrrggggbbbb, @@ -344,35 +348,33 @@ static unsigned int parse_argb(char **p) case 16: /* #aaaarrrrggggbbbb */ dl = len/4; argb = - (hexval2(sp+0) << 24) | - (hexval2(sp+dl) << 16) | - (hexval2(sp+dl*2) << 8)| - (hexval2(sp+dl*3) << 0); + (hexval2(sp+0) << 24) + + (hexval2(sp+dl) << 16) + + (hexval2(sp+dl*2) << 8) + + hexval2(sp+dl*3); break; default: - argb = 0; + argb = 0xffff0000; /* Bright red (error indication) */ break; } return argb; } -void parse_config(const char *filename) -{ - char line[MAX_LINE], *p, *ep; - FILE *f; - char *append = NULL; - unsigned int ipappend = 0; - static struct labeldata ld; +/* + * Parser state. This is global so that including multiple + * files work as expected, which is that everything works the + * same way as if the files had been concatenated together. + */ +static char *append = NULL; +static unsigned int ipappend = 0; +static struct labeldata ld; - get_ipappend(); +static int parse_one_config(const char *filename); - if ( !filename ) - filename = get_config(); - - f = fopen(filename, "r"); - if ( !f ) - return; +static void parse_config_file(FILE *f) +{ + char line[MAX_LINE], *p, *ep, ch; while ( fgets(line, sizeof line, f) ) { p = strchr(line, '\r'); @@ -407,8 +409,13 @@ void parse_config(const char *filename) if ( looking_at(p, "passwd") ) { menu_master_passwd = strdup(skipspace(p+6)); } + } else if ( (ep = looking_at(p, "include")) ) { + p = skipspace(ep); + parse_one_config(p); } else if ( (ep = looking_at(p, "background")) ) { p = skipspace(ep); + if (menu_background) + free(menu_background); menu_background = dup_word(&p); } else if ((ep = looking_at(p, "color")) || (ep = looking_at(p, "colour"))) { @@ -420,20 +427,44 @@ void parse_config(const char *filename) if ( (ep = looking_at(p, cptr->name)) ) { p = skipspace(ep); if (*p) { - free(cptr->ansi); - cptr->ansi = dup_word(&p); + if (looking_at(p, "*")) { + p++; + } else { + free((void *)cptr->ansi); + cptr->ansi = dup_word(&p); + } - p = skipspace(ep); + p = skipspace(p); if (*p) { - cptr->argb_fg = parse_argb(&p); - p = skipspace(ep); + if (looking_at(p, "*")) + p++; + else + cptr->argb_fg = parse_argb(&p); + + p = skipspace(p); if (*p) { - cptr->argb_bg = parse_argb(&p); + if (looking_at(p, "*")) + p++; + else + cptr->argb_bg = parse_argb(&p); + + /* Parse a shadow mode */ + p = skipspace(p); + ch = *p | 0x20; + if (ch == 'n') /* none */ + cptr->shadow = SHADOW_NONE; + else if (ch == 's') /* std, standard */ + cptr->shadow = SHADOW_NORMAL; + else if (ch == 'a') /* all */ + cptr->shadow = SHADOW_ALL; + else if (ch == 'r') /* rev, reverse */ + cptr->shadow = SHADOW_REVERSE; } } } break; } + cptr++; } } else { /* Unknown, check for layout parameters */ @@ -484,10 +515,44 @@ void parse_config(const char *filename) ld.append = strdup(skipspace(p+9)); } } +} - record(&ld, append); +static int parse_one_config(const char *filename) +{ + FILE *f; + + if (!strcmp(filename, "~")) + filename = get_config(); + + f = fopen(filename, "r"); + if ( !f ) + return -1; + + parse_config_file(f); fclose(f); + return 0; +} + +void parse_configs(char **argv) +{ + const char *filename; + + get_ipappend(); + + if ( !*argv ) { + parse_one_config("~"); + } else { + while ( (filename = *argv++) ) + parse_one_config(filename); + } + + /* On final EOF process the last label statement */ + + record(&ld, append); + + /* Common postprocessing */ + if ( ontimeout ) ontimeout = unlabel(ontimeout); if ( onerror ) diff --git a/com32/modules/vesamenu.c b/com32/modules/vesamenu.c index 8d386d00..88fe78d5 100644 --- a/com32/modules/vesamenu.c +++ b/com32/modules/vesamenu.c @@ -34,7 +34,7 @@ int vesacon_load_background(const char *); int main(int argc, char *argv[]) { openconsole(&dev_rawcon_r, &dev_vesaserial_w); - fputs("\033[0m\033[20h", stdout); + fputs("\033[0m\033[20h\033[25l", stdout); draw_background = vesacon_load_background; diff --git a/com32/modules/vesamenu.c32 b/com32/modules/vesamenu.c32 index 3cc21d9f3ed152ed5b0bb6d90b750a63752b2d99..da669f2afbe2cbafcea71210d5a3610277f465fa 100755 GIT binary patch delta 32227 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 Bt*rn6 delta 24580 zcwU`+3t&vg_y3)n-DDFRcb9}9VZ#O?B=M?kf?amqG?6FcD))l>1N5zTEfNE zR*TYBUudIwEY(C1T5aP|LaS1J-L>?Kw#0M)=gi$~BH!=t_1DhcGiN??=FFLyGmkqr zJIy}FPI~LgT&drLK8mjRGWnpEDfb!~$%Nmpbg+MYWHaa$UuN4k>HO@(geU%E9-vLGV0kHhQG|;nljxnwN(Qqqdy9Y2GE3wAgX%T zwsI}gLb)A&jashsVi^I{l<703IezQNFf`Q~xV?O%6cK(pm0|cQuJi)MNN+(pe>}QE zItcu^;kDKf3huwXT!khu@seXX?U_+MazBeYVWF9DsdYE*Gu8v?i8e9OXd8{AFxaovc@*Sa_fl6{@7&6`tDm$h3j%V=@`b79y&;F zE%OZ(f1JO_tM%6YD9joH!Zvut^`$n+dLK>lDOmgvN|==C)X1V1p=$5OFia9P(V03l zlHl?R42PJsC}OH|es;@A&$@=mmtuua6>UwY2mW`0ZX@zBK+J>nj3L$>R|Cn6p^rIk zFVvYahFkqHgB?3z+206W@(8Nn>c0oLSsHBa8L?VFvZ?~S_k7(`7M@(h^H8i?sOMXM&p`@xn-(smt| zTP+TA{2t@(31Eqau7JHtx-{T_lwq!5)3QdOl$}pW5x!8g7%9;F{qyN?b4%fGhgb3^ zM}UwER)3UWOY};!C6KhN+*cuza+8+NpL_k@!?bZ(=_olqMtIiexq*w3{so$QOr~>B z7L9#RV=+&b-EwZSCDp}Ug{;d8posf&d1tQef(~5k6ViGISlf{fgFEJlq2~#2X4l?w zL8VGG6`;4t&PkQ?0<(XQFRL-*s#OVizqWSs!4<5V#!_3$KZ{RIK*53a3<| zY;L(w>Dyjmj@wx-`1y8dy%XRd#~6AAl4ELed~As>lxDfPT>F&7 znB%KjBcrDh8T|2KE8?SXItL>w=D3NYZY8{C1sh!vb9{9evO$b`7cG7xTTm`!_(gVK z3U+-N{*!{B@zP~48GiK4gT(Q!{>QMBZ9&6d?Js=fXJ~=(lNg`bzqm(>G~z?;FdcEM^ek~I0g%f&17NtyXs4%Z6h8gQTXK``)!y(HFB`7jNqw~W=XCQ)v#hPyZREC-6*c>Umr|G6c zIz^s#4o9FbdyJ!iv%Le)6PWF$W<(rJJFGAE-O7V5O&t(a*6(4P(M=E5L@r9dy36Fao(tb2kM zNdXa={4Mh_9Xi}9I(J3zC#)gM?ZUKHL-e~K-L71rMSbS?rsIps(FZWmr=rjD_0rlX z;mcM-Oq~Xy=ZOF*Rj^vQ5dDMIJo_MyBZE@9*8{qVId>&UG0z01)tnEsqyu?8MOn=S zG%<_P>nNQKw7E)?_mF{xGJaaEWIok0n7dl307}C&ER-~$on*?!GEx*$YwXE^xT><8 zHMH3EF&)bW)^*k#mrG}*Hgc{&%=HXpqH84Q04euxFmaW8CQ8QC@(ApcmLCjlq4JBM z&3EmQrJa*rfSB`ibj6hERYgTbP7*J~1`JhK?2R`l%+kavvlJz)3Fv03v<}Q2+QmqQ z^ADUPv5+;N)S0Ch2X9;U7q8{dgx|L%JT}++FY|HfEt|pn!esU%g9{ZOsSteOyjpGL zFB}c`s}^GV5wR!b$6i&piG-$nbZLyzE!q<&%pf00bN-NnIk0*Z#**PqC_gKUaO=?X+D1F%qA@_d+ge5BLB@vZf}C43jC_pc0xqEGOb z_y^MSJvOxoMjzarU}d1gtlU4(O#@g%Q_9FnjmHO z5I$@Z{v56va|ba-pK_#}%JQ)`EiMNXY2(MamMF4n=&YtnlNgvCs-S?7T32yR9TqJz$nh~R#;4~Q1G|;2fQR*2p0-FMX?3lgu|UedZ2t*?&2gGO!GkX zQ7h*{aHtCF@`hZ~!UZo~bmx{(X}%g)JJxa7a2LAMWlp_hL_(6@2os*ubupouc{kK7 zw$xl0bg&!ZnDRO->#MTP=+0*JgU(tS!a$1op>DPE5UyId(!gHm_U+J54_4ckQ6u&C|f^R z9iel$CEe^IuK>CH#on@!8tM)I9KOJ_`^#Q*2i7)UuVT@88N5zFil3Zf`L`5c&VB&B z7?~yjUV_deJr5i#=oa9tG91>-(%=Rl;0~g@7({V~jvkCs3Idk20E*dt9%tDlN{Frk22n75@!6mS{wem+uM^EP9nqY1q zX151Z+kkN@8ZoyKW4hl=cW=ow4a+{*70Rx`vdfy}smDC29=SygayK`@kQ~5tZ!XtI z@KkoM^*vKBw~4+nH{w15w#1@r+<`c}o5^EfDou$_r1={3?^bqvgjnjqWJ1@*;lJj-Id@s;^#!d~wLXkN}X8Ik<#kTz#yKO|H zSZf^4SFi#tWIRe(+e+;aQ3W~}CD%O(w^f|b68?Jz^ z`CYRN;a(Kb9YqdT0bpM*1Zfa-SJ0bmzHwxQIlHMqAjab zR#R)sS>rE``bkIW7mVd(z>rJn5lMyD4;lyU$ZtttatE zH|21UM)kU5slJvBQ0dJsZY>-;nuzL$qWa3BdN=9% zTFg=lOR#yci>&aK{m_}$@7>>xyB^2XCL$tpOd#XdKU7AdM~1)jEwH3_QO4y~<*h)# zy`OCXtwEakEbbfpBnzynCQaE*k8uL=w8)`sB6l#V_WD1~My0Q`48?v6J#RPeejI1P z|9JAGV4k_n^Qfg{%+sPHItUyAI~tqRo=z>JG^!%LV3JkG^Zb#eAHq0fN{so5ICGQ0de$q+kxYRZci$Fi=b7WyG z?-ujS?nXXCQ9Pat7()yuAO?61*hr9XwSL)x&; za^b}xR`Rm&*N|#0?spS3)d>N$Ncl?#gs+FDtKZ?E4eDJ+?XKKeLXY?!COojHj z`s-c(%wK!>+R3<+DJtHP5J@x-aQ9UW?c@t9);p3Y{FJzo4c$~cIcXyy{=$u9gYQYO ze(wD+V-KO{FrB~;>(Bm}TU;@$56kNEgujO`Wc%d_b4RRJ&(8z9t6-rLH8rpJ)`$;T zwlY`PKI#%XB2QSBT1kqEV@9WwAqHGh9aC4O9l-;g$ z>bD?S?`7>@e?a(Z%p$1g;IZvn&|P6C{%3n`o-k`{TWo>9ieR6HnIUU^CsUi3Ds=HM z;~dxt-OsuWe=R>4VOGcP=nEz{pL98u{4H0y3U)g*ODj2xlIF-%{5#wW!Bw*S;FoHt z{9;50Sj{`-b-cHEwStlJ2`$os=OFt$7zb9;)-*Nj-BeKISv<}u$Lz4xyd^EV?Q+pQ z7j9Bv{W=gf`XA%T`og_<;BBc`KH2J@1E#TN==<$j4usSPQs{own*oNfE-g6HZQHxa z`tHQ2nrqI{tC@xhuvmewUC#b5ox@V|j_#Z#TujSkA#3!wMJ(vLXI#GyRI>Ola2l@$ z#oSxU^7pLi!Tfz#I=?3THEuR*unUvMcV#EMC*+N9Ya09>jsjxrcz~4#Lr*HlLg=w# zXPUwq6;TyVFR+`uo0QvhDj%Tdzp>@$qaKyFz;Rdc*GJNS#GyX)fenJcIWeS@? zABBCgEEK)T>W3~@ZjQb?W9W7l59Zh9My_kK_S()fDlGB8-d2I+?60h@tEJOUL2Uc0#@!o#Ijr53&5l-rIRbVE^NO@){@S)ST6zJuN+ErNU zR6h@+ybiGTT%5X>wrI?ip;t)l`w7_@VVb@}VIMxhogjq`6?SE`Hf0A>2idZLT@MO6 zJ2%Kgk6`}FB_)OdSKWX)HpC-enhDDU-02i11P#_0Jz^42jApRUGEb(ldbF{W0hZ-r+&-RZBm@LJO9G2CP1AUZjT-coVvHi6M+UBUMs!!Ho3fJJ=&soFy8P%2m|g z0=u5jlb4pz!%T0XGdkh82WimODi>$@LneJ|ISU>i@Yitq+P9k;P7!_AsjwRK3g~WC z*JU?mRGGhZIZ7D1I#TgI_znbCn6~NlHdsbF_{&lZs1XC=4q+qKy&(@SF8^bQns6^E zIX2Uovmh5Zwp4u(%xb})r?&uOCPyEP&AjYIpn|Z~mra8K7=XqBSO9G_z_t|VhE2mj z9|69mfu9I`YoKBiJ#q@&2o|{O>;#+B&%kU>q$B__T;B@S0`pYg(At_`67B_n*{+Zr~q(P3D)?!7dD*nC=dzZU;9osjl}_Cc-95@;%gq+!7eglD3d#YABm=`{p-3x)2XRiwS z*a8c>4WQJx9~64?F~yas`k*VyC|+1FCx@-G2sh`9MbSg%-u6SNbMh5scV38jaXcp4 zUK~Zm{&@Nlh%LVM;%|iQxJEejQfD^dl5q2-_=qKZK` zKTOVnMr~_NS6N4?rSEHnNiToScB~aN^R}^uHNuDU#<9^Cg~#)BEO$}plpVs}x*!b6 z-o>ql+|DWdC2%QvDgJ`+XZ9HO;2L4b{I=}H?}dr;JF&HEgyr*}Z~qv8j%hF|=?TbG zz1kYk&Z^c+gT5F3oFtCkp0X?v|u@r`e zYqiVOX{p+-FA#oM7#^A-Cw&4*mYd5t^J8N0Ge1@ul;+3YtJU^b3WTsly<>S9H62he zSLq0(*k#rznWbk8YWoi|YoN^Pj;tpI!umyLTLqkfs;;?#<3erXuS}gI`+>>AwKVJyU!}Xvni;b z0_pLs+{AaE3S(dEF#P$3RJ+|wJ%Fu(?y@y7y@o$=h!2EnJ~ybrzdpgbs|R#L2K{~nK&D32sFQ$N351B7-0n4g&-FoQBJ{z#?#xJe}Q*PmVV#9jjmt zscP5?oZ!FbzmpTB+53c_EPdI(*9ooH%nUz(#b75@!QAgu=3XO4HN<{840SGGsd$A^ zZNI<^+t>7L7kaqqINk5>CWd?>)UD|h{LP^T8@b0u{UN$6RNL?ILWi{pnF|46O-T!1 z^D8=@lvH{PKx(;BUJLg$ubv8vZu9Ci#^`H4f*ABz{)Kcj>1F~7Mx}X7vd$R_Qd?V} zn{7F3RNA`~3J2G2XHV}F#utp4{x_^+EiOY_u4K(45MWhXJXJhZj6T&cpfPDPCS7-i z0Jmki3+shO-c?LRxH*_}Loq!x%eD(o3jXk&@*$YY&;CrI@F%~Z^=i=1$=MIW!_gfV zbhbiaVPOQD`+@LwVTY8~WzC$|kTTk$E&2PfJO-f`PJ^^}pK@ItnnAd)1y^B*RJT?C zD5a_BqZAE@H|@>5%TXER3n13f8z#1=8fH(aFxT4C^o`rJQ=zdBH}_AIWeM7bA~xYz zIr5~Lq<%7LfHft4FERR1GdNr29(e*7FQaBJ3!TSZO!*WrB5hXG+%bw3H0x9*x1)2E zJYCxB=)*>PN^?89s%EGq)L(c|Zcq1CGt^r+fQbj?c6G}r%G3xO1r6c&;c)}Z?d--i z6ZSbe^Upmfx3lZn4E6pOfZE_exxJmT87kp0V`3aHd0=jTclGn9VNNVE$%AtHyYgnJ zUFcv#JSexr6PlsE1P9`{_oxAN%_J8&zZonPJd5Lu2j=#9!<(U&ppX5?gL1pQ&}OL7 z&^H|x56bQO9v-BqL=S8Vw)hMW%?#Uk+ggP~MeQ{&0L!ViFTjV=o?{h$E1J`LgOwg5 zs?())pTWWk_fD6kVG|fUQ^-P&b^mHzML1LBcq=xJ>6Tf_D%Xv!1E=+%~X3_G8wZ@Ds9Z#KJnkPmaxovVPe?@*2N2v<>BlBTk+)b zK+@E^qFamcDgEGyS${VmD5K2bc$}t>g@eV13tb9J~!@Ze3TnM^zd_D z)HFXIPzSgii*9$!^CdvCi zDnwXzaXS0mdg0;**{NIw;oGHR*zlE_MOcgHu)|cJ3L1_8=d{#MCSoM2l%lDz+ zf&^l|#udKy{stlSk61Qgn!x|@9$T4N94*~q*`4;{E>3U4j+$89^Tq>& zG$$BVXIkq-4LuRAr61#lz794+A59Jp?U!%3c8vdaCMpJ_FqBU3v-o8~!5yt-}G_LLY13 zodIGOxmKH>Sy0ytCqbsWCaji)N&VSf#=Qd+}8XWgP$|^?=gKrXZ!myOfBi ztW#J6@l~{Ssz%}TMV%CoMz5V1Z!^fDPxHyYHUIvmHj?G;D%wfEs zR0U%y-5j?ZBBb39_s*HCOl&$=5;7YY=`cTOq!&3l72#=C!_n}^uGi^ zYp+`PHOH-kUnRFT-y5$n1MSjV;-MRuU20PYv&)aO;k$FQOJx{unrU_s&SFPX3^2Pm zE*~}$j48nE@;7n$YrPTHlC!*t>Dgvi2QEL4W;Jn^wP@hZcu7QwWuP@3t-W#ipMRFi z?*r6mhZn{rbDhs2JaP@Ma{9>^a0i18MwuVFjJF)!ym3&)_SBRZu~XZbKLq=JRFf#=FrM<6gU*eVo`(T!zphBm){kl zrbM$VnahU-C}Zkkb|rH8+koUY;21T#x^el}D3QQfBgVjgD;w?w>p%%6z9>EJ+wEy0D^{l385j>jw>=u^OP2i|nDjdShV4i+4NARh{H zsu~cn0ea5%3Oa}yi|H)KXW=`J3dbyXnC}xqtoc4`$hMr~EVMdzxRT3Mxpdk`V7XlN zkgl8+BWA=@akkg6xO9@{$j8)M`4wFL0y>}8+LByN`jriG@z=SMuSTZxmm$9DAs&R7 z97zCf+6A4%P>D{cL=-B~#ck6wREhBv_$)EI7#rHgxpEZ_0ing>yQ!LSSHS9${gVOFxWqHJ%cOT-7Bk= z3q3r8n{tkm({VsLc6#9W&#}>iq<#7|8bwDzUx+xDHcEEB+(hDZ8AR#vR)r-CM(%FZ z%bDC%zl9BXdpGCOoI#K?9&=(noPKhB5R(`iXrg0p{e7529ETZf?t(xbSiGaazW{CY zK7(!9A9>bZl!KS@(T-ifj+J%nZgds&o)rIpD>>S97DT(su0)A?yu{y!7IXu~TLZVz z`XA*f5gUj%n^q0x1JOZNUQ_Inr#)8D=!NOz=u{-(G&t|R%hhxioN~XZ+v26cqnCC` zaSm#5$EWU{F;}u&36(B?STzkyFvf)a`zQ>yRTl~ZFS#p@^P5u=9GF1$4f zbPI<6*<{zDLY+||`zZPXxE-@XU9Fti(54#cS%$t0^eLlORJoM$WbVEPkat4?K-*@$ z8Xo*+*xA9OZoG9JW!Nz)olkJN@{Xy1ta87gj*_-d1v4Et;a!+Ayc$B!mGI^`Ea!_^ zptG1Qpzqt@74VxI`8_tQprpS(s`h#=aabRGF(1K<e zAIK_Ad=_ul%Q_j~<4h$f`ZQ?A&iJFlpAPubE{!Wq3BaFL@Z+796^5nZ#|97!d!4~W zl0FWfoCR-i&&^xiDwpLf=`tNq2g{w|KYyH4Gsv~%g5VDCol-yDe=BXPvMF-GuC@S86&{A?>~nW3NUxP@hzmcq>E!{xt8=q-duhAWsz=*^A*Yb${1 zfY}?EQ;?ah@6J0a9YKfixIO%90O=~PYq*lL-2QXC1S1xndAto4j8bkjx*27^&e(j#bua_^&Vm z^ZPfxCw;595-`-gnnI{)-nCqGi$@K<=@4W zY`xyG^9eoofC~0@zRuqrVLn+O?|2@UYImWaEVp9Ny&C&PRPP%DqHZImA@!(;J;h>n}REWY?VK2xY7#WlLhAw=y(TsgqO!y{Si$Um|E}w z=3~L~p4W4=4)^@lsrukTs1m(l=Z{4fw#h$h7;aO1X@Yhml1-5ZuIz5X<^mkYV0|wj zhXGlzy&wf1355aC`Dcw+LH8i}rptA{ehU3)csndIVMXv8Jz+S`*H{hEz&YR_0ye=S zhFq__#(D+P+P;CZ3ks>HxKof$_y+~)tO+mIphUM=Dsv>rbk`sPKcPf_1I-tY^BUA6 zxj><}Qkh&yj($W>=-IYK1llSf2J|x};)u5?c)3Rg+cv*Oi~Jh)q9s!0ZyIO{w4zj~ z))$<97A$#@zYVs`JBrp%ikYepSXBq51%)S5=Mj*=8}#we*unA#V$&QSJ-{=l1`~tr zf8a`9+rC8%ZbAC8b%(`qEl68@zTAR@ht!>hRa`%P-ibO`w0wz`b`2re=f-M-;|{J|0pTozbxrL7bL#vPkc@P*HVK2m!+7ib$n%|LzDNj zi?$dop`TnrKTiq${Adw<``PL$#9l2)&zPnF5Z7;uCmnWJHx=f`Udt*iHw|t12Zd}j zY}P6&|5Wwuhdp6qOEQA3J1zdu65IBCQx$7u6;FFqto=8OtI^`;o7$pAw#8|WEoz(F zLW8#Wj|KTPmLzWENTBKeDmv)D6#d`SA^5+ngI{AwVx)$&8UMeM{h!*eMs6Or>iwwd z*gWS&QA2vRZ<;PQpC|oC4e1Q+vsFtDvD2*L7h2M-P3|H*^`+|=e6eKosZP=_UsU=) zOI~BSoe?fq`Q8rb?D%?VlV}Yf!^yMaxd38ekM$HM2a?c$T|Hf{@F#}0)}#pQ1a|aukDqsN%ZRb(E-RLk741u?NhQDLOty?`-WgJtF)ey>3w} z9qS=ZZbSC7GexmQTT;n>xJCT7Es1RPBdiV`r&=)ks=pFX0nxA#6>|QkiE5~ zv>=Fl%(A{)#Q`12F}C+G@lgj-q}jO*>XwpWDflEl`DVr)m!6`wD3B$Hb$+6u+{s_24BRh<}AxV7}Vj^s39 z3%81I=|};)XRFvPlni4lwwAsUO7;={H81Uf_*!tbX_+xh}G+M(LbosuWl!O4uoZc%bAS3qqld+Dbsh9 zUJoZ_-rjdWFXtd}Q50z>Rz`t$y|7iRiy|*WX<}+LxiIplUGyc6sTh_IwNs|MkAwND z>i9HlZpm(j?aHBtNOSo-{N7C(!5YJ?{g>n0;5%Nz9tN-bPt6zS^&#Qfc;wc2nRg;r zVbkZAzT1Z!AfuP<2l?jic$QY78A76xBAex2fVr)5?)~pUZdjDsk^^B-grBi)#UnRK%{CSKgowJKr0uxx z_sE~B89ULNGHv$Ik7R&Sqr}f-iK*}5>v=kWJ|}oQ2fQ1*VF{{;wXVn48a>BMb(gY5 zEEq~Au$SKvuMQ=_nd;rpfnZ-e7@p&$YJy8IHCWCMB&>oGEH{kp z{?cx$!JK!SD*rVjrpJ@cUH^E8)-;nJ#7F3zy~k%+cGH)PtZN$Mc(Pb9(Z+_!AHK6%n`k&4#u#5>}ziDW@E z-i>m0ZF(8%fNX%lP*uE6#aSN0YR7&|=C;};<|mO*-yh_tv{T%dL}Iy3XnMPU>EmNmZn_=$^u0Judv z#A(UonS@-oq_%iB7WidvgCcHO3qh7GRj+uNI3e)2@yb82-|g&jWxC<~+v4}hBqGXp z4=DG}PH4H|@p}~pZ}UkNKRn(xfxuAu*V}mQ9j}MjI|B?jb9RW)!$@q{a5);f1K)n? z71U>iD==o>iis(Z5`&(d04y+7Uz<*8*_t7P@13p)*f+r z3P}nZ_m;aNA$IM%TDp4Do-9 zO01Pe+;_Pgzhf&uNAQ9WmW1C4_}D*sSNwQ58SeYNoa2q{;-ldtY|;aiSQFDvzc}Cu z)bG--SL?3SzP;23iMN-vyHab{y+<=Vi=wcn_`V71bmfk4<{PRj!FqgCh=Dqe-vZsB zU*8Z{jv)HzKJU>!>jnBb2hb{v0**6){+*#Pt3rP_-dAA=w!a|bs^1j98$p8n!`^i3 z?Pp*9p7{3&lE7|$Pkd%1nbh$;8Tt4PEXnZ&RCTG^UL!N5H^hA-!67BSAv+lZzT+NC z?*f`$hkpEk!pz5lsG0WwDv6)Eg>jOk+*rn-ik+%gEdAT*O`mP;n`NP^Xh}FaUl%(+ zOL}%}p>s35Uq??Dgr2fN=3m>ydC!t|34!m^ydh|-2wLyn@4K5W1e%T*+S*fO$nUSa zJxSYIN^ab#g_r>GS!V;o;Yte5M>71}k#v0%7h%54l%U!8rRF2WrmVynnR?w}J=$4KK@s!STRE_N_G@?^w39 zSIb$x+v-uZ4mi%9RMmPp@$D^cqxXP0(3+?UQ>gHbvclNjuKkcAa@${3@lBL*%ocI$STe(RiX7dxS$u-2i{)s)&EoTEB!jhnD3+y>b#2_$ z87aW3=d9!8W0&iaGH1Uyc^sL>o@ynQk0V{!M;h^`aU^c=Zdt?{!BdaJA9_rFUQV2_ z2~6$+lMh$1VDcL>cjzW@;&>9xl8?l~@no5)TT740JRfmhY&2NNM>JR7CQm^Ffa46K z1&xst(>BtAx>|>;_7X#us=0Dnzm0CExZoyO3Rf`ZCn)7rlybFPA?Bu&ZevA^ z1>GGEeWQadcVL>!6^E~jm$tOKoBVVU4mz}lmU<V0B682mJ+{AMHR>pc?ega@0yU z{KdQJq;p7_tN{-im`BA2LGM%BPszMlMPmO95&Zu+!Pn+v3hE_iWDBi$ zBlm743$^MgCq3C9Zp(nBP8vj=C+ul5_gs;9F$4A@=h}-yCy;R8xiUL!gScn{3GlVa zQPl=<{RGl8s2rlw^$k$QLw_jr>yPP(yR<<(Gl8sQXYLngJV%UdPFwN9bFcvWNzVMi zda%PFs_;E5+jlQ&#eG5(m)pdS6G;cQ`zK=TMA#d}eIibqNXD?A`--1TBwZpW$*?mv zkdZ`XEdGREIX)y`Iqpb>70M`ao#;YgyFU?wGf8*0>=Q91lcf5dmy;h_#Wyp_@v(KV zMxW8xfAVgq@M!C)F7%I_qvJZy4BB#E;|!`opVoCBh5S({?w>^N`c9Oi5-;wXOxm=K zg{TAn0*>Xbv9*1noOp;Af0#@BZBYSTAM$20an44dC<)Ymx#nZwfd}`&x0&6cXkmtOfsfZJ$^(g+xV8#mGHbKtTcI zYfb1uaZudrufN`IsgGR?9nyJiUX33BuC5g$r@|l&+b?EJC5KFeYgp~9p(~OgAY*`> z)Nm+@`#1R_|7XzGY{H)R@Wb9(#{I1#bcaMGBmcoasPTG=`SrcVR6VA$a_T}k^?i_F zUPuswf6YK*5#l97#%vUKP9s5@9~JbkX}XKv(~GE@WB&ANENW0u zb2V$c8jA}4k45eCYBb1$4YZ{60*HGGI=8{o6lPCTNOPJ9{&d5C5}edT@CGWljhCaN zm$-Zena+l85^HBb*C^UAKAu7P;4^wA!Ao-D+?gaR81LEPE9Xnf&Dfzv@bwng3ie*@ zB_$xQ&mB$!;e}OTXYBTqjtW= zvE|1nE_ibLD;+;w5zDek4m;w2IAA`>)TaXG(&<|NG8o1*5g7mV z(y3bij02^g%_oak%o4VcB>#JsuYdXt<21`PcNW`1@(XF*VM^5e4paI>Wit&_R_V6I z2A)x|{rWM6mkil+nCRHP12ATMWyzduM#l7GvKAQT z%~^qoG#VBAjGS3i8^N|wv0|i=bPtdvJ;N+qHalz1tl4uG15kX?NS-mhwL;76fq-vz z!AeZ;m0ITG74)n-9)Ixf4%s2xDq<=yeiZ1FG9F(YGBrS7l;e1c#~cItDg=#2^Bt4x z(m60Mg#P{eyD#Z&T4i~ zXT31*#l;JZugqp%SdhJ7G5s|z7B?;;pXR2K|GY`I5c21`Y2?o{$<{*t0ym9(gGsg=@|U}5yn?dIBwJC5UpAUevKcXf zH_2v1dV@(eBhp(;vKf(n(0KsjMoPbLlC6jZe`1oYi1eo>*@{SiZj!BtbUDx_ zy<594OtMKa;iySADe_OaY2<%xlFf_!@7y%<&zodZBfr*7BmYVh`e&2e1c>>~O#`1} zuAAicz=S_drDs=?rNqQ!XqeFu_Ck0JVZ;OtlLOB;++j@<8pGmd@htaqdJ|p|giX(B zm;(?#hj0YKcMud4HH<%mju0Xs#7)$+W&)>Zm`)ISKho-^+1U#sbQ2dW&Ym6W@5iK|)7H&jFni7*UDWchsD8_ViP0Ie42H#S zR)j8V#^O0kbaA?{ezPNVOPfZXU$_v-K0s#ATCu=rz}ReE_psR!^#5>>HyY&Wmdr6k z=z?EauuM05@vLPpz4D@NmO&TRWuYH49wy@zpiHTACpk_`ExT%&G2OJx6$qodgN-0K zA@mQ|G8-T`AS~{oW%fg0dukbf2-OgJM`)Ry5Qg{CGM_|hnFUeM_dyUIt0%X5Y9pP z3Bnx+E_d2riqD5mH{Td)jO$i$-dZ@cZj6SRtR<4m`(5uXi{r*CRixzj^m$qY8s##Ow=@R8Y3eS f+n!N}7$asG8d+te$ z8k3uNjDX};9vvY0h{u+3$7BUwF)j@U1_r}RogZFYo$SCXA+5o}z|eWP^*}{bH}4jp zA>AP=CJQ$J880qPF6IpYYCXbxl=1%LF20x2yi5!Xtp`diHZZ;j`}_a@P9T?|^A^yk zFN~A>_$3%`OGiUNy0e$JP@Xl+U$2(6Qe983Z^U`9bw58t; zF_thciH|!xSy`||>>AKbEQSYOGj}_%w0;9JF9Dfhlh+DL+H`HPGb$jN{~;&)cyLODzfs*`Pnl{pz;U~{anGvnkr eA{NX7$^w%GMLj38h{jBA5M^c8l3-v2DgXdy&cV|F delta 552 zcwXz#?$H+5@!#jH;vd5U`+HOc7}7$as44d+te$ z3X_|7jDX};9vvY0h{u+3%VY&!F)jrM1_r}RogZF2ob13WA#K9Kz|eWP^*}{bH}4jp zA>AP=CJQ$J887ZlF6IpYYCXbxl=1cCF20x2l1vN?tp`diHZZ;j`}_a@P9T?|^A^x3 z2Byh<{1S}MCNJj?WsI5pmp_P6b#j1!2&2H{Q~^D!k3e;X|6e;Cb5RN9?u}7l=`B$) z=)BqaX@??E=EWf((NLqJ!BC1dsdHwu2>mH!A1W@JcsN>9AR0J4~JF}bt zQ#?RHAO(_R=yg`;be3uTUn1BYF3@_ZgroDu|4Trdr8=!!-eJ!FLDBCMdyqEAu24d*L&||23oP}#N@+5IZO{! uCL0PXZ%z<)V4S=}#DrN!Szz)*5#7luqA`;{h$u{M5M^c8lwe>4>Hq*jcG9T; diff --git a/com32/samples/fancyhello.c32 b/com32/samples/fancyhello.c32 dissimilarity index 65% index 858c2b9a5305572236fe4c09330af95c4454e551..2f6ada2567054c2e06c3cd4c251edab6af569f6e 100755 GIT binary patch delta 4265 zcwUtke{dAldGBs7xsZdmg(O5tO0ynMO%`7^(B4$g{okDe0S?YP~!t2p+h<7CzzAPc98LNj8|IeoFy z&fA^6#d}59ET_{`5^Hil;VdYLz31NIeE_7JocB50N?dS|6{*)SY{#xE)RTTw8BR^y&un0 z%ehd7`ZUkUH_lV9_+-!49@NGB)+WyfN^@z#wHvHR%;l9h%+a|%I=4Wx+3yk(@od%Ch0)gG@1Mbh*ytVG|Al2 z$h?tfdn3Asx#K1L4tqo>%d$Wx2G%sSP_J4<`w@`olxVj`d%>epT2te*(b<}t0%5I%SFjhH-FewgjzND~X7e&* zIY?#6P2bmL(JLKMlD`M_`rL7uVfdeMJO7!l$EHOaXdBqksc%24O5Z8_g|B-r^h!K~0>4;fKKcVlNV@PMC)rIa( z{t5zHbB{V?g-n{Fhan9x^a`}oV%nqLh3UW%?QM{Wp@UU6M^AS90O*>8DK!<232zc_ z;5I<5h{Lt=42ClT4ujmw?79Kdg@*(Pbl{oLP3OZ_2Zq>I;%erIcsGl;G9v$Q3ga*j z)-F2&W$1&n254&XHJ|_|_*y#9v26`v!H#JdZvntU8?1Bez;meT3vk>H9|J`IEw`QS zYHu;*W_$V;;YAudb>l6HpLuN}9LCKYR%e`j*t8$})j>xGQk-uG?rWD&4()3_rUwL& zqHpoiO`@RZQD|fOGM+9KJ#9e;Tu(&5RaHveWE;)kI6YWuiCSPLUXwVoKixY4GDG< z!BT88MiIdDRAhieCIEDwk&Ejjlq{>`={=^m8!{8q`c6pt8q9?=Mnwknz^kCDs!W3f z7<7Z6FWe~9%OZTthOv(rhZtPS@cZ1T(nRu`JpibRmy>fz=P}w}Gzh!u#TB89wzfFf zN;;2_&IXZClXUhhhN|POMt}&0;7Sgn&s?p z>Jg$H0F+q*8ek8`dPoFjqhg6b1x_@fCIXlDVX{c^^KTgAfq6#&o)Q#Db%@RUMey~` zUnCuo2J}s$#~Kep@|8rO6xsW##PM){H!U�q5w;1KJ6hr=OedZZtSLr@ta=UA`Wy zSlzHKFbd3yHjL`002_OFRI)r&Xay@!D|LMZAsdx|cgULv&Su`*%n;Qi z@^c5=LF+2RsVWlr6azjvoT?;|mjEQ&@X`sVrjp3_446Z-JJ179hEw;D$a{?BbCmW+ zw!Ml(BybFPG*v?)Jr2aRkjUTI=6s?JL6R7w82T}J>bf!E)Ec6FzOANb~M7%Bp zLPYxri3xn96UNt0Y`Tyl)BBBgxHRnOFRv2$P3|`MR%5Cge*kJ~Kucy@o=pqepbl#2 z7lt~#F}>fMcRh0+Q1CTM>r#=JBz?jLrxZtV(rKd>_@Z+yCd>=xc&h0k;|@S-@eMz~ zv+P{7-qM3r)r=sktyc8hOOKi!*aaE%P&q_=(-?LHo?u)7GibjyKPYGy>d*MzleSY+<9uRU@UR6%;u{{ zSj;;?N7)A|$`z>IY$mrBDhf4QXp@=aX)+Rr!XMsT2wfPs@i>TrHO|bl(P^n8YCyIt z-#V~hFo9l(t3x?*wmNhJ(T)Mu^w8imBLNT%`q50iLbMipj5h(J*S;K3Qxe&B1Z=j% zXcH8BqSBX%^;jvgvaA#wY|61$`Sw(RlM%BCKwrqeZT12;%q>9A9w8y%V89ySVZbA4 ziRO~DOmkscs#%?uYu>H%(Q2&uN}qY#h(5N&$=BA5b{x?9ZdH(2G&4bK+?)#m7Rr}Y zkZ17`#$JPvd!#j3LQl0WE;jZf;{K9W@TUHFF^f1lZ!$RV;GmNROAYMdknQRBULHIL zX)s{7t5P@G&dd##+U62vgmk3?=xV{sa{}e|!*CIu<5}H*?Y)Hvzr*xW{3N&U`LSwJ8x-&=VrJ~j7 z#iC)Y8%l`OU^OA@=6~wde%8zxm4G<7fC=2at@&zi4trn1%R&!$_k~eaY`_LK?DqD? z#qcUg(D&f)?&b5Zu64G&df{D%>~`#0zN{y<@TT0oD<&*;WVhZdaL-I;$q?%)kj8!c zy_>6qtE>TV={+DWi+y!dj>4sXQ;Gzxc#6RF!8kQT;I6=!dW*pQFkRq8fc-Guf>8#e zG7ZA z;BnVC0=lBGu4)3fYj!^80T)Fk3EW>{B*9h1lLYSi-wJpIdD3sUiu7Czbz2Gpk{$mn IvHv&!0SAAoZvX%Q delta 3982 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 delta 1023 zcwU8(T}TvB6vywKnRTW~+fO%bR(EvOW{KII+|8CK*H1L4tV}Q;l+`xcTvut=u$M}D zEt1YdKKc+rP?Ri`(FYWg5fssbM3zB9Z~0mfLHF#;g9_QeaL)h#Kj#kjH}B709-h)@ z?`$w!(rKvmhS6X|jHs#|Po7dc6FD^++8r|VNRW_@*4BNh)^VgKXqx{XhMAIA%4YfG zwzo6^U3PEteM$(G_&0fB8dDfnnnCGRydoG%H)V(<8_uvHjd!PR0`);ST4X< zS84HFVL?2@(l{*GqmCcU;NA2(js?o37TD@I>DO7zE0%dw`i(O_OZG~=aK+I_7hu^D zuahD z@)xuop~D4;Jdfwh-7P3d?uO^i_NoI+QH2h&C?+=HEy=7^@!7TrHLihJ5l_f4?)jKk zv>3yKZXp_elO>}WbUkjP|H1KAvWQi65=*-obh s$8)K4zP_S?&!1MmiL?g}YJ2G)nAGB&=!chDBb^2sjMG@YIcP8b3j-p;`Tzg` diff --git a/com32/samples/hello.c32 b/com32/samples/hello.c32 index 3970d8b0cae32f830aeb13e0014c2bd35fca6aaa..8bdd7cd73384de9b6d73193494d338300f76f10c 100755 GIT binary patch delta 328 zcwXyK?NJrj@!#jH;vd5U`+JlG73tr<$$nyXnDN~Bzy z|03d41Bps>-T(=f2sHoTE*0o569GEw=?2!gA`57I z^V$EMFQVh(V-JS~H~)~Y7t1`LF?k=K5u?WBk9;~nQjXtN0%U);8%uWp57@>JU<(Cy xYD_NXFA({o2r}${hziT=_1-&~foAUdv-vy!TgJ%`1REx&2r06wOE543g#o5PfL;Iq delta 332 zcwXyK?NJrj@!#jH;vd5U`+JlG73tr<$$nyXnDN~GMH z|0$GkG#*xPU|@Lt9HLwTsPc8xappgY0u0BUSp<|o6c11kNP*-SdYu(IodaZA|Cb1M zhYPe`D&gq7@&6LgIZ~b0t#3<|yF-x$Sv#{?Uh^*oncVr|MGjDZ^SS?>AEM*pV-HW5 z5Ek70L%v=t^MJzSeSAiY3X?zb=>SPNep?BU{oQUX-2psc(>{Pr6WFORxtPB|~JLP2Kfl^LPHYjFVpo)=V}KVws#Gq{yx&!N3TV0svWwes}-? diff --git a/com32/samples/keytest.c32 b/com32/samples/keytest.c32 dissimilarity index 67% index f72c70fe3d1e7e2ef7d8055ca3d556aa7498597e..7258c4b3f5ad3e79546aff2bd618da5ebff1c5f5 100755 GIT binary patch delta 4934 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 delta 4661 zcwUuP3vg7`89saWZg%tXu9jfHP&Ubi5QDpHz>363NMeW~+K^y{5HMQJ1i@)4yQpLE zf_GPQvaE(Kj#}+B58Bb%v2?I;6BRaW$U_lBeBraf>bRFnYA}EaP;USK+?x>Tj5FPt zbMN;*&VT;W(U(K-F4pVT}P73wxZ4hI#)Pa3NL9q)%`?yT@$JcG}pt; z&0RGMtt3^MWbHOhZnv$ao`HmK_w0|A?)2TFLf_49~Se)o2T@=db7Lo%?q4IUM(zGuR(f z&-FWlOU;iZ7$5<~(pO|(IO^QjWBv=rRXT(9ai4IXJNK=O-(*;<@l^jKp8OeMkR#2_ z&3D}St4ir4PY<=+2B|j|*^U0|y*a@X3BQGOsuO3&gCB9vrN_H$3xhinudW7ptXb+= zfSsZ1_*`-3#;`4)kig#XVk_}Khfm*U9-+?^0u&20Nd2l}qN8f1W!;7d>vEOW#l(87 z;V0dLrxX7zUKLLW{e*r`$JcGROWp}wuBs3^!sTkxVHjKLNr+(1w2yx13wwB1STXwZ zdEW@YA%J)AXS!iH4czt>@{Q~Tb4=icHWDbb(ZUp;>b}x{r`0#)w$Nkh5TrAk=K4n5 z>Ha&WD@}A0uL$j!2px@L80m;gN8#(%MM65GeyXW^%s z;ZyS|Zx>!Sm4b;D*?FNO=^liu?G`$CbXe%vyNXA~UMh!|l(!j@FbPj)nh9w|tlE7o zP$!a_AYLP>aYCR8Yf81aE5sT}H3+^geb=&Xnm7qTJ2R^W1_ zbYAt0%E^#qv6Ls?3o(e`+X6l0dKR^0v0glPPl>EJDyGI{)vNv-7w5d3#B@YY0xLolrLWk$|`G zu~xnry7?0^m~X(%)3+5<7a9U924Rgn^mBg_4!DVb20h{eMN0;$hGi2=S5^I?c%K6(JpD2& znM}d^B?HR^AC|cCprjTHUbZtl-6LYO=b61u@P3EUfasNiceep`wSu>Y8A}CU33Qgv zFzEqzrg(*;ap+b>l%^&2E7BzRqWZ2 z&{S>bSJE%!--FT@Wpjd-+4c06m!85!ii;L|LS>1!1`1WJvTit!8=cV6e`_WE6y!{htJcaNa6hg= zr4SRDi-|Zek=Jy3k1{8!09h4EDvf%>PzRGXh^oXQk?%9F3JBkSPF2^);#PL?!r9*) zmL_Jv3YwTD_-a6_#I@t*Ag>18Yx)M)C!BHSkj)0RnA+C+!C2cqtZl5}sa5;#4{+4j zFlnvOrE!<=&x zn(|}|<8dag(M4tJrNGMl(*kbLdDNFZPJeU)4BbE0;5IWkn5imW`m{fH^{De- z$252X;dH0NbaxMP?IP}xvV?snU{UEudmWzqICJVj7-io!j=(Ro-2x7BT50B3wUH0V%S;1 zP7VF2fQt|;hqm?Ffx?%xRcm#4>GUW)1Iy{lzy_7=7O;D4`@41$aj-*J8t1HK7X%R_ z(CGhkhl?*>Ib;(=(Q%|1Z({FBdHHNEc-MfEOh2OUz~^-otI-J5{mNo?xWYcr4?W=W zeR6@6hZh#2o!gh6FA~-te32c5cmlV60w9!z=?6}$>h=b>i9C|fXUd-}!(!dp#BPdH z&NblNYsvuG*n$_7wpmyOdN{_$&8OL}WUFn*WviOBTa?t3yM*TYujV;u_r(@KA;Lw;u{V^TmD*VEsv1r0``(F-?Ml{F{jYh=ZIW!s( zpK)k3B0lfXXhdvqG8!2+J2e(@;6$g!BH}BZ8jFaNoEnRWX8{)NdUkW18l`ARb83{L zex8m|pY7D>MZHtUs9)^Vs7Cz~9iu*P8eZyMq|~X+2O4g7?)%-`E`xbz zDmYwg4c?i0owzK`N*+tMk`%j@9Gq_@A4405R+woe4?%kZ+B}d?!uuH=@6q4?Z`+%x zHN+gWH#4mw6Z)qG{2=qE+gH%WpUfrw=pRll{R|}d$FvNC zIXIA(!I@)%r_w5eqba6fQF==3z4z7L?b+-m3xn&^uMTcc=WXF7$!vq!t^aYXfp;A= Jxb~b#5Mm@+gN53pB>XIC zgCuB|7Y!u-v>b`6frz9MV~AEZY4Jf~jM68|ivf&LO7H~}F!8~}NYHa;F3^(r?2DVs zo%@}8?wLFHemgU#;mm0mT?*CDmlfi8EqR=~NbPYAl7=^bzRO%I+NwvTi7_lAb#=PxBZgE0VCv+(jdu=EB7Y9>tMsToC z{RVi{ek}b5J;KcC(!;9CxD?7B9#nS$CmQpWV;pUTuW71ukAOPCyao>Oa@|o-ip8}O--l+LwP|KJ%X`TR8WbT6H9-jv_#Y^q>7A4)UK&Vc9F>S}cCvGq& ztrD%nobq49uxdD#?pZ8*yoyq$j3l(dPLP&upMD0Vmr@hjl-&M_FrTTZ*>o!nV! z`mmUa{eN)(-N9|H++<30@VYN>H`&A8S?=204IQAPtf%WK(P+KP;q+}?AV^V>@yWDo zrmRoOn)L2I)meY@z3Hk)5i7=-&0JTw(WteJ!?_#Y;1iaM`!Xr`0N=`_#chETna5!T z{+O|27g?Ise^UF1JRIL*@Gm-!b=d^8U@qIT%Cl-WRqf+auhVeg@{BJzKH0u9L3a0OSNSKE2JRDRbJet){D=XGh&ev1U)AM)N*HgB_jk$Wt zhxC-|p=!+0Q*O|#^^_YmYdz&A&00_Ske+hBo*y>ld_Co4nDvxX{`(o>8vfk0x$7C) z_260-KD36q$LWf|@^F>EFL}MS;n$c7KAH7H1N#jqj`$)P3-0jX3pm`|5_yTc2U#KB zwT0_&qPa8Q&B0fBa;$&QfD!&H$g$5V@d^)AIJ@7Z1+oV5H?T3+2?uaTE1vyPL<6<;;st0sKaMA^5+;$;TpuD!#C84%h$Je&#S#p|7I@C_!O?tqW*Icitpd(<}I N57eq!V%^I6e*m?SE@uD$ delta 2030 zcwX(4QD|FL7=X`z&P{W?>1r};lQc_uliOykG|6oet6d$nTeoI|Rvjp^ini+lEo@zC zs;vx@O>monv)xe`d#Xc*KFG2KR&_5^slsGM6r^l0go#f&*ziU0!SmmHwzY-s)fWTz z-1GhCKmR@VoGSy(y?v#oIDLR-q8vy8N5by^uKYqajk?>BNIQ${w~k+c$-HbVNh zZ{K3H_7A?$<^ZYs%NTdjoATzG9hW0?P)>HuVV4cdhPz$7hJS>363f)M$7I6Svb)TZ zybEj9!akg65?(LEnh!p(k#ixIBJJ>_@P@)LB9fu7w;K~0RYH#M5ksM{Zx;q5aE@Yd znAcG8ZfKLSL82B{rKk9LOlpOKjWfKSib_+m{24~m@Quu6<_X|cna);(6c&e-OJi!5R9^ahQ|P5fQ(a3{=*o^X%?6??;{;IjBL+@;$mcU?Bq z!iqHfe{lcZ!3~!E@}y|62iN@v4m1v6w+^Er?7H8O-KX)QP5L5c7`Ih{EG9)A()3+O zF^9PRn|*hvR!`tq^Ri7|y$`7c>r&I_(YlxEA{vVDXd@jplK=esOwV?o#};<5Hl+p06N>NJ)*CWl?WJoUg6w!UWN6`E-e zG}BgUMvutK+J_iHMxHPOQ% z)A5iss$BH&gc%+{4_O4hzwe<$1FqRP#!L9Ln0i`)qn>QFo@|w#cTGo6mWEp^^<-=G zWPNa&tk9F~P^|Q1I~6NES-)bXCtIT@Tdn8E&2dLhcFBW!vIXb;i07)f**utgTkd+z zRutadExX^!%L@t5cldots;%`@kx~w6b;bN70juPQNFMzM2j3G@E$!Y@*quRzaMw0Y zib_jwat4EM;pB$VF#;w0E3moqW&h_mP{!<0O)d~M@P8$m;=S;R7>Nhvx9o7d>qXnT zAMRPFTya#Rj%w6VjUIPw(Q%nBHa;;$G#6Fosdw!`h!vn9GyB%0szX6$-fXpzKZwHx6I5;nSztDQ3g#S3J4bV(61_p+g z9YDhH?QRDkzuB6hl&!g%g`q^swfV0?2}k2$4F?8>*Uur!C4eel#~f#_09tw6nWYCv z^*SqbI?J^FFA?kx7ihgy!qIsn;Qu9{1GGA=TfdbUcZY#QB|2|_1WN>(e{h!ybeD+$ zo%M7B>uc7|VwTtZi$P|0zIed}G`{)l|IQcDaq+Q-!-AWC$k)qc-q4slkJnZLWM{V< hOLqVd*p?4qO9XamZ2ruf%Q!iPf59XHR%TTR1_0h5dIw!`h!vn9GyB%0s-vXJJfXq;qZwHx6I5;nSztDQ3g#S3J4bV(61_p+g zZ9u~C+inLSzuB6hl&!g%g`q^st@)oq2}k2$1qTL(*Uur!C4eelM;&J_0a|(7nWY0v z@c;#Z6iAMt*IA*{IY6fMe~DmsxIpWr5{}Lr|1SZZBh_i$`nE*5I}}-vwKJRLHUDCe z$(NH Y{>+=pI5~xX&g2dJERzISnN=hh00YN%k^lez diff --git a/com32/samples/vesa.c b/com32/samples/vesa.c deleted file mode 100644 index 159a55d7..00000000 --- a/com32/samples/vesa.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include "../lib/sys/vesa/video.h" - -int __vesacon_init(void); -void vesacon_write_at(int row, int col, const char *str, uint8_t attr, int rev); - -int main(void) -{ - int row, col; - int attr; - char attr_buf[16]; - - __vesacon_init(); - vesacon_load_background("stacy.png"); - - row = col = 0; - - for (attr = 0; attr < 256; attr++) { - snprintf(attr_buf, sizeof attr_buf, " [%02X] ", attr); - __vesacon_write_at(row, col, attr_buf, attr, attr & 3); - row++; - if (row >= 29) { - row = 0; - col += 8; - } - } - - while (1) - asm volatile("hlt"); -} diff --git a/com32/samples/vesa.c32 b/com32/samples/vesa.c32 deleted file mode 100755 index 39f4e5e318af64685f914eb09363668d9baea4b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcwPel00001 literal 85496 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�Wd5OJqyq5<^3w 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 z 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 diff --git a/com32/samples/vesainfo.c b/com32/samples/vesainfo.c new file mode 100644 index 00000000..a1f00299 --- /dev/null +++ b/com32/samples/vesainfo.c @@ -0,0 +1,83 @@ +/* + * vesainfo.c + * + * Dump information about what VESA graphics modes are supported. + */ + +#include +#include +#include +#include +#include +#include "../lib/sys/vesa/vesa.h" + +/* Wait for a keypress */ +static void wait_key(void) +{ + char ch; + while (fread(&ch, 1, 1, stdin) == 0) + ; +} + +static void print_modes(void) +{ + static com32sys_t rm; + struct vesa_general_info *gi; + struct vesa_mode_info *mi; + uint16_t mode, *mode_ptr; + int lines; + + /* Allocate space in the bounce buffer for these structures */ + gi = &((struct vesa_info *)__com32.cs_bounce)->gi; + mi = &((struct vesa_info *)__com32.cs_bounce)->mi; + + gi->signature = VBE2_MAGIC; /* Get VBE2 extended data */ + rm.eax.w[0] = 0x4F00; /* Get SVGA general information */ + rm.edi.w[0] = OFFS(gi); + rm.es = SEG(gi); + __intcall(0x10, &rm, &rm); + + if ( rm.eax.w[0] != 0x004F ) { + printf("No VESA BIOS detected\n"); + return; + } else if ( gi->signature != VESA_MAGIC ) { + printf("VESA information structure has bad magic, trying anyway...\n"); + } + + printf("VBE version %d.%d\n" + "Mode attrib h_res v_res bpp layout rpos gpos bpos\n", + (gi->version >> 8) & 0xff, gi->version & 0xff); + + lines = 1; + + mode_ptr = GET_PTR(gi->video_mode_ptr); + + while ((mode = *mode_ptr++) != 0xFFFF) { + if (++lines >= 23) { + wait_key(); + lines = 0; + } + + rm.eax.w[0] = 0x4F01; /* Get SVGA mode information */ + rm.ecx.w[0] = mode; + rm.edi.w[0] = OFFS(mi); + rm.es = SEG(mi); + __intcall(0x10, &rm, &rm); + + /* Must be a supported mode */ + if ( rm.eax.w[0] != 0x004f ) + continue; + + printf("0x%04x 0x%04x %5u %5u %3u %6u %4u %4u %4u\n", + mode, mi->mode_attr, mi->h_res, mi->v_res, mi->bpp, + mi->memory_layout, mi->rpos, mi->gpos, mi->bpos); + } +} + +int main(void) +{ + openconsole(&dev_rawcon_r, &dev_stdcon_w); + + print_modes(); + return 0; +} diff --git a/com32/samples/vesainfo.c32 b/com32/samples/vesainfo.c32 new file mode 100755 index 0000000000000000000000000000000000000000..663ae55e4b6055b1e3c3bb470a0c4dbf0d88b05a GIT binary patch literal 4616 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 literal 0 HcwPel00001 diff --git a/dos/syslinux.com b/dos/syslinux.com index fa4742019fbb64e6fb5b9bb41d404cde65c211ac..8835b5d6945ab19c16afff868ac69fdc1186add5 100755 GIT binary patch delta 98 zcwU>*!Z@Xcaf62>%l;k9syF*cN-(l;Z<27Gyiifu*jIsR9Ep xmlVT4rcHJr#gjKm{hz!+oOAOA>3Lj?@|*qDQl-FpH}7z;VPxR}nexL?1^^XXAH4to delta 98 zcwU>*!Z@Xcaf62>%eF?Rs?9!<5{xVlpeWTufq|Dx xihjDO{!iW@&bfJm^gJ#`xy}A+sZwCQn|Cs93RK IG+r%f02ve!eEZM*8|W4krJ5)(@N!8pF#KcMWCxPotifc<%_z4y IjaN$=00D;(s{jB1 diff --git a/extlinux.bss b/extlinux.bss index fc026dcc6fd5c25c40bba124e98ebebb3430469a..daf1d985c60b6442527349a360af957908983a3a 100644 GIT binary patch delta 15 XcwTE@X<(V~f@S}XWz`$sh%f>GG}i{t delta 15 WcwTE@X<(V~f@NEyQ`N>dB8&hqu?8vt diff --git a/extlinux.sys b/extlinux.sys index cba66f47229ea287007f0b9b61c26fdf974dbc17..07ebd5205044aa684341f0336d0707d22180a124 100644 GIT binary patch delta 56 zcwU>}JHc0jm&-LG#K+SwG(y2x&)87G$iTo%*T7QO$W(!WmrIJ_AJZng{X3RbZ`82m MW|ZHY#;qj{0G|pD^#A|> delta 56 zcwU>}JHc0jm&-LG#K+SwG(y2x&)5J==oS>EnkX>va!D~T{A1c=x2@5sYNLiNH>2F< IG;S?v0HpE`$N&HU diff --git a/extlinux/extlinux b/extlinux/extlinux index 46ae88ab23d588e89a7c668dd35d2cdaece8152e..a3fbe66dc5da05a709ec1f58c1ae932c4468c7f9 100755 GIT binary patch delta 96 zcwTGV#@M)xaYLpYqv7T(IXh04{X3RbZ(gG=!N|h1Ny2sVMMjCq4>b6s3>AzF49s*5 vEOm`c6&QHAq!|7&ZL$L^=Fqg|W|ZITW}+tz(evN`$YlP2rJElHC~yG)-M=3_ delta 211 zcwTGV#@M)xaYLpYqrv7ZIXh04ZH-PS)f^v6a-vjR@9LoAdxT#kw79KqJZel17k%CPD>XFbE5Wj)wOaf-1bW3I-z;qzK^^x{S0VR_^0T&fSf#}=;iRkF` z0_em7Sm^Ts9tXZxlWPGr3Uq_$k^$*m0=|@!ssWt=F_TCFoE2n(=uQBL(CAqK=r#d3 z7II5<4ZeVr`2ry!u7c0KRL3=r;g}(C9?~=pq0yz>e6Czz?z}z=QkzzLk>{ z1b_@NATls8HZ3qYEiyH;p9CNSv%m-V0Rf`3xd|-+0lTy33h4v^yR*>`y#W><1II=b nGXRWE5R6_V$3_H(fX7AvqO+tC>Inh6vyU4C0|BD5lO7EY@v@Lb delta 340 zcwPZi0jvI?S)f^v6a+eD!sU@5AdxT#kw79Kp@8Vk1750KRI2=r;g}(C9?~=pq0yz>e6Czz?z}z=QkzzLb*` z1b_=LATusAFfDL$Wi+#(1Rw*mzX$mN0im!3~v(XQ|0Tvzu$3_%0 m0E|u$j9w(iMg)d{$3_65v!oH~2?4sZj~fF60im;#9t{o#U6B6( diff --git a/isolinux.bin b/isolinux.bin index ebe4310f9f1f4e027dbd7c5603afaeacc419434b..3f9c9802242ad9d44015b017a39bd732b3de6acc 100644 GIT binary patch delta 247 zcwPbb00{q#RE$)R6afm&P5_9|=ve{i zHUT&ma!Yj$zKWCU0U;r{fan+ih|uUG0q6h$z9)g`3IOZUzWIRY0s!m&P*%RalPvWg%P5_9|=ve{i zHUT&ma!Yj$zKN6T0U;r`fan+ih|uUG0q6h$z9xa_3IOZUzW9LX0s!m&P*%RZlPvs9ZM*8|W4krJ5)(@N!8pF#KcMWCxO-Y{>L~q5|h; Q1Lk>LjB=aL^Cn6G0HEp=Z~y=R diff --git a/ldlinux.bss b/ldlinux.bss index cfcffb5838a472fd78fbc3d58bdca8fa96132255..0a4023f01f1d7e4d2b6edaad40e83415036f025a 100644 GIT binary patch delta 15 XcwTE@X<(V~f@S}XWz`$sh%f>GG}i{t delta 15 WcwTE@X<(V~f@NEyQ`N>dB8&hqu?8vt diff --git a/ldlinux.sys b/ldlinux.sys index 5023ba9a4814f49c8e6abce32cbb1edda27b9e13..41780da306ca379c760064f969cf62eb7f0f5e5d 100644 GIT binary patch delta 63 zcwXD!v%yD$mn%3j*vHc^G(y2x&)87G$iTo%*T7QO$W(!WmrIJ_AJZng{X3RbPc-~L T(SdWb0pmO_M)}R>xf7)TH`x;A delta 63 zcwXD!v%yD$mn%3j*vHc^G(y2x&)5J==oS>EnkX>va!D~T{A1c=x2@5sYNFx)i4L5b Q4H)NfG0JT|&z&d*06dKnxc~qF diff --git a/memdisk/memdisk b/memdisk/memdisk index 906900971a29a66ac9077609897ca21eeb0d90a0..c1aa1d38ccf1b39a8ea96c9d0fd979ac4de9e767 100644 GIT binary patch delta 51 vcwXBxm2uBh#tqf1JcbHJ1_oxj29~-;rkmSYQ}j?pz8jZ|G08JeWb^?5eLW4Z delta 51 vcwXBxm2uBh#tqf1JO&EJdd3F21x2YQ44d0oQ}j?pz8jZ|G08DcWb^?5l?o1_ diff --git a/mtools/syslinux b/mtools/syslinux index 2d305fa0cf1a7cf8b690561d0ea560d26677ebe6..3f5ebc85ba221d33d7b38d3132051f33f694e700 100755 GIT binary patch delta 112 zcwT$Bp7G&&#tj>o8TW7A$Q-V~vVX_2>dibV5{xX|no8DDMQ$Q-V~vaQjnYBP_D1S8ACxPLB_FEUC@c2MP$GEgwqGd9pI zC`vU^VBqDFVqo~kw8;*ncygiY|H%&+IX4%m&EsN}+stp6Dis6L%i!+pY^9*#?iZ@5 zV4`QJXP{tYU|?ooY+$0G5tN#u;E`AY5!W@=WFSHD=8ZmrjFWs0OXE|s-&ctX0AFZ6 AKmY&$ diff --git a/pxelinux.0 b/pxelinux.0 index 3265c0eff2c0f5b82f5f2d7a7c674b16d13f98b9..713589a9bedfc68ecdd7e850392043ed29552fb2 100644 GIT binary patch delta 1157 zcwTK&eN0u=71uT#?b3$iGht4QPSqNjgbclD<5rSQd7)>aj zS@W80a50+bk~PJ|fXAS(Q4sBekWk}4ek>--f{{eByoDuOWNBJJ>IKyJ$L=5J+;h*z z@8oyR9qPE$arK}!2*I4IutD@+mIS}B{)R0!n0pH;Q>K*72A;IR1oD>24ZCk2m^|sB zS7BX(pj%`U7XR zBmw)*SNTkffukQ#eU)t1LK9 z)qDkBmTWxcaDpBcP8OMRTQ3kiBg)2bN1;Bk6I_a{zB1Nuph z8RbSZlP8StvY-WHR(=pRx1!&Cs(h$b_G`UqN}YBsPDDG3Tu(~(jHS5G12YIu5g>*0 zzRcz*YETx8&a))60?Le$1fJuY!~;!BLL1{E+zzB#V1yJ4tKj8HNMYP`K%k%#LU$qD z1=06mHXp4|^xyMG0`_i@+hDF5DJMAnfD;eeSq=SgJxdhR!4T1+mX?qo0uGME9NH8+F^2(hqHc(4 zv#anlJ)Zrhp^Me=z_(0xLmrab=xlbaW(=M^l$sBZ(e3QhctvW-(c!}kwB$cf(ZQ2& zFZ>HGI=HYOL_WOR!xeKW9-?2HE10}(K6>ufj;C`ss0;Q|A5PCsCpULH;n6>Yv~RQB zBj*<50-LLTn4$t9`2FRZm*=Bp;J2qoxQnW2CGC4`1iPq^+hk-lLnaNIkXKW)a*-je z&#-Ce%kir2~cr`%m`ucy7X c&gndLvc47}BpIw9WA#TMAT0_@Qsv9s-zBT~c>n+a delta 1153 zcwTK&Z%kWN6uAeG)7LnV*asn@#xMSv8e%Y#NS3!iG6R$_nAA&AgUyHWuRc{j)T?{+!3?!lzqm#u7mD3T%JxU&t$5FRB! ziY7x@-Z-jLr_7#45}5;a%uK?s@b%J@^)o^v(<15v;t-f1CBi%ec@kM*+B8A9uo)sM zL|Y&}1mgv0Ww`6U7z?{vL1}~u2T~7l#%>Spaj_i6-orTMG{sWRR$gjcSHzN7LI?mt zVOKZw7hZ;hAOh0u$lk$HUjijS$1GLFK?wbv5KJ*WYG{aDgs__<3AaAQzJ%L^ILRPV zeNGj=Ne||+5xZZ3KeBtDw1;i|O^i}bd&lHpzJfiu5s-!!M4T3{#i(ei9p@>9AJ9{nRo(-xaO za%Or>V0|_AQdB7Pe={&UFc~ig(UlqFE@d z5^>{BD6g6i<*>LbzmutH6T@&Jif!NP@XWoxwuV-Qhep___!N_ejQQJZ5E=DsE2F-! zb?e2E^n5(Cvs(bQXlFMMs+F$hJ8c1YbUzcqB|w=>&7%bl>oP>WzU$Kuh-5hCJNL&y z$?5gI?z3(n;)~~dQlO^CaM$<<0ZMN_cZ;^A)`P=-#KvPYv b$8+My;TqXu{|IZZfq?YrWBK;}*SWs|n1S}% diff --git a/sample/m16-640x640-syslinux.jpg b/sample/m16-640x640-syslinux.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3516bea279c7c30e376589d81db7d6f5bfb8e6a9 GIT binary patch literal 46191 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 RM<`q(WPy9dkbfg1|JmNrB&GlW literal 0 HcwPel00001 diff --git a/sample/syslinux_splash.jpg b/sample/syslinux_splash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..655ddbe3ac419b2fc0c45b9d5495eedccf3bd09a GIT binary patch literal 56299 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 @@ -27,6 +27,7 @@ Requires: mtools, libc.so.6()(64bit) %package devel Summary: Development environment for SYSLINUX add-on modules Group: Development/Libraries +Requires: syslinux %description SYSLINUX is a suite of bootloaders, currently supporting DOS FAT @@ -39,6 +40,24 @@ The SYSLINUX boot loader contains an API, called COM32, for writing sophisticated add-on modules. This package contains the libraries necessary to compile such modules. +%package extlinux +Summary: The EXTLINUX bootloader, for booting the local system. +Group: System/Boot +Requires: syslinux + +%description extlinux +The EXTLINUX bootloader, for booting the local system, as well as all +the SYSLINUX/PXELINUX modules in /boot. + +%package tftpboot +Summary: SYSLINUX modules in /tftpboot, available for network booting +Group: Applications/Internet +Requires: syslinux + +%description tftpboot +All the SYSLINUX/PXELINUX modules directly available for network +booting in the /tftpboot directory. + %prep %setup -q -n syslinux-%{VERSION} @@ -51,15 +70,19 @@ make -C sample tidy rm -rf %{buildroot} mkdir -p %{buildroot}%{_bindir} mkdir -p %{buildroot}%{_sbindir} -mkdir -p %{buildroot}%{_libdir}/syslinux +mkdir -p %{buildroot}%{_datadir}/syslinux mkdir -p %{buildroot}%{_includedir} -mkdir -p %{buildroot}/boot +mkdir -p %{buildroot}/boot %{buildroot}/tftpboot/pxelinux.cfg make install-all \ INSTALLROOT=%{buildroot} BINDIR=%{_bindir} SBINDIR=%{_sbindir} \ - LIBDIR=%{_libdir} INCDIR=%{_includedir} + LIBDIR=%{_datadir} INCDIR=%{_includedir} make -C sample tidy -cp mkdiskimage sys2ansi.pl keytab-lilo.pl %{buildroot}%{_libdir}/syslinux -cp %{buildroot}%{_libdir}/syslinux/*.c32 %{buildroot}/boot +cp mkdiskimage sys2ansi.pl keytab-lilo.pl %{buildroot}%{_datadir}/syslinux +cp %{buildroot}%{_datadir}/syslinux/*.c32 %{buildroot}/boot +cp %{buildroot}%{_datadir}/syslinux/memdisk %{buildroot}/boot +cp %{buildroot}%{_datadir}/syslinux/*.c32 %{buildroot}/tftpboot +cp %{buildroot}%{_datadir}/syslinux/pxelinux.0 %{buildroot}/tftpboot +cp %{buildroot}%{_datadir}/syslinux/memdisk %{buildroot}/tftpboot %clean rm -rf %{buildroot} @@ -69,24 +92,29 @@ rm -rf %{buildroot} %doc NEWS README* *.doc memdisk/*.doc COPYING %doc sample %{_bindir}/syslinux -%{_sbindir}/extlinux %{_bindir}/ppmtolss16 %{_bindir}/lss16toppm %{_bindir}/gethostip -%{_libdir}/syslinux/*.com -%{_libdir}/syslinux/*.exe -%{_libdir}/syslinux/*.c32 -%{_libdir}/syslinux/*.bin -%{_libdir}/syslinux/*.0 -%{_libdir}/syslinux/memdisk -%{_libdir}/syslinux/*.pl -%{_libdir}/syslinux/mkdiskimage -/boot/*.c32 +%{_datadir}/syslinux/*.com +%{_datadir}/syslinux/*.exe +%{_datadir}/syslinux/*.c32 +%{_datadir}/syslinux/*.bin +%{_datadir}/syslinux/*.0 +%{_datadir}/syslinux/memdisk +%{_datadir}/syslinux/*.pl +%{_datadir}/syslinux/mkdiskimage %files devel -%{_libdir}/syslinux/com32 +%{_datadir}/syslinux/com32 -%post +%files extlinux +%{_sbindir}/extlinux +/boot + +%files tftpboot +/tftpboot + +%post extlinux # If we have a /boot/extlinux.conf file, assume extlinux is our bootloader # and update it. if [ -f /boot/extlinux.conf ]; then extlinux --update /boot; fi @@ -94,6 +122,11 @@ if [ -f /boot/extlinux.conf ]; then extlinux --update /boot; fi %postun %changelog +* Mon Sep 19 2006 H. Peter Anvin +- Add a syslinux-tftpboot module. +- Factor extlinux into its own package. +- Move to %{_datadir} (/usr/share). + * Wed Sep 21 2005 H. Peter Anvin - If /boot/extlinux.conf exist, run extlinux --update. diff --git a/unix/syslinux b/unix/syslinux index 1c38281caa5c519d70b2ead0365584b9f66312ec..cbdd6fb528727ce66991f405241ac2baec6fa736 100755 GIT binary patch delta 102 zcwSq0fpOsl#tj}OEcB*-Amf-7i#A!9>qc&p^S*z`)GF p*uX?VBPcaR!6UH*BCcz!$v}eQ%^za~87Di$9G1qX=zpvd7XbYRIB*-Amf-7i#A!9>qc&p^S*z`)GF p*uX?VBPcaR!6UH*BCcz!$v}eQ%^za~87Di$9G1qX=zpvd7XbYRI